Merge remote-tracking branch 'upstream/master' into lazyloader

This commit is contained in:
MrTimscampi 2020-05-01 14:43:51 +02:00
commit c07dd26fdc
155 changed files with 2714 additions and 1058 deletions

View file

@ -8,9 +8,8 @@
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://docs.jellyfin.org/general/server/plugins/index.html">${Help}</a>
</div>
<p id="tagline" style="font-style: italic;"></p>
<p id="pPreviewImage"></p>
<p id="overview"></p>
<p id="overview" style="font-style: italic;"></p>
<p id="description"></p>
</div>
<div class="verticalSection">
@ -28,7 +27,6 @@
</button>
<div class="fieldDescription">${ServerRestartNeededAfterPluginInstall}</div>
</div>
<p id="nonServerMsg"></p>
</form>
</div>
</div>
@ -37,9 +35,6 @@
<div is="emby-collapse" title="${HeaderDeveloperInfo}">
<div class="collapseContent">
<p id="developer"></p>
<p id="pViewWebsite" style="display: none;">
<a is="emby-linkbutton" class="button-link" href="#" target="_blank">${ButtonViewWebsite}</a>
</p>
</div>
</div>

View file

@ -1,4 +1,4 @@
define(["dialogHelper", "datetime", "emby-select", "paper-icon-button-light", "formDialogStyle"], function (dialogHelper, datetime) {
define(["dialogHelper", "datetime", "globalize", "emby-select", "paper-icon-button-light", "formDialogStyle"], function (dialogHelper, datetime, globalize) {
"use strict";
function getDisplayTime(hours) {
@ -38,7 +38,7 @@ define(["dialogHelper", "datetime", "emby-select", "paper-icon-button-light", "f
};
if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) {
return void alert(Globalize.translate("ErrorMessageStartHourGreaterThanEnd"));
return void alert(globalize.translate("ErrorMessageStartHourGreaterThanEnd"));
}
context.submitted = true;
@ -60,7 +60,7 @@ define(["dialogHelper", "datetime", "emby-select", "paper-icon-button-light", "f
});
dlg.classList.add("formDialog");
var html = "";
html += Globalize.translateDocument(template);
html += globalize.translateDocument(template);
dlg.innerHTML = html;
populateHours(dlg);
loadSchedule(dlg, options.schedule);

View file

@ -1,4 +1,4 @@
define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], function (appSettings, browser, events, htmlMediaHelper, webSettings) {
define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "globalize"], function (appSettings, browser, events, htmlMediaHelper, webSettings, globalize) {
"use strict";
function getBaseProfileOptions(item) {
@ -46,20 +46,9 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], f
if (window.NativeShell) {
profile = window.NativeShell.AppHost.getDeviceProfile(profileBuilder);
} else {
profile = profileBuilder(getBaseProfileOptions(item));
if (item && !options.isRetry && "allcomplexformats" !== appSettings.get("subtitleburnin")) {
if (!browser.orsay && !browser.tizen) {
profile.SubtitleProfiles.push({
Format: "ass",
Method: "External"
});
profile.SubtitleProfiles.push({
Format: "ssa",
Method: "External"
});
}
}
var builderOpts = getBaseProfileOptions(item);
builderOpts.enableSsaRender = (item && !options.isRetry && "allcomplexformats" !== appSettings.get("subtitleburnin"));
profile = profileBuilder(builderOpts);
}
resolve(profile);
@ -328,10 +317,10 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], f
require(["actionsheet"], function (actionsheet) {
exitPromise = actionsheet.show({
title: Globalize.translate("MessageConfirmAppExit"),
title: globalize.translate("MessageConfirmAppExit"),
items: [
{id: "yes", name: Globalize.translate("Yes")},
{id: "no", name: Globalize.translate("No")}
{id: "yes", name: globalize.translate("Yes")},
{id: "no", name: globalize.translate("No")}
]
}).then(function (value) {
if (value === "yes") {
@ -346,7 +335,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], f
var deviceId;
var deviceName;
var appName = "Jellyfin Web";
var appVersion = "10.5.0";
var appVersion = "10.6.0";
var appHost = {
getWindowState: function () {

View file

@ -1,4 +1,4 @@
define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle', 'emby-button'], function(loading, dialogHelper, dom) {
define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-input', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle', 'emby-button'], function(loading, dialogHelper, dom, globalize) {
'use strict';
function getSystemInfo() {
@ -53,7 +53,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-
}
if (!path) {
html += getItem("lnkPath lnkDirectory", "", "Network", Globalize.translate("ButtonNetwork"));
html += getItem("lnkPath lnkDirectory", "", "Network", globalize.translate("ButtonNetwork"));
}
page.querySelector(".results").innerHTML = html;
@ -89,16 +89,16 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-
var instruction = options.instruction ? options.instruction + "<br/><br/>" : "";
html += '<div class="infoBanner" style="margin-bottom:1.5em;">';
html += instruction;
html += Globalize.translate("MessageDirectoryPickerInstruction", "<b>\\\\server</b>", "<b>\\\\192.168.1.101</b>");
html += globalize.translate("MessageDirectoryPickerInstruction", "<b>\\\\server</b>", "<b>\\\\192.168.1.101</b>");
if ("bsd" === systemInfo.OperatingSystem.toLowerCase()) {
html += "<br/>";
html += "<br/>";
html += Globalize.translate("MessageDirectoryPickerBSDInstruction");
html += globalize.translate("MessageDirectoryPickerBSDInstruction");
html += "<br/>";
} else if ("linux" === systemInfo.OperatingSystem.toLowerCase()) {
html += "<br/>";
html += "<br/>";
html += Globalize.translate("MessageDirectoryPickerLinuxInstruction");
html += globalize.translate("MessageDirectoryPickerLinuxInstruction");
html += "<br/>";
}
html += "</div>";
@ -113,10 +113,10 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-
labelKey = "LabelPath";
}
var readOnlyAttribute = options.pathReadOnly ? " readonly" : "";
html += '<input is="emby-input" id="txtDirectoryPickerPath" type="text" required="required" ' + readOnlyAttribute + ' label="' + Globalize.translate(labelKey) + '"/>';
html += '<input is="emby-input" id="txtDirectoryPickerPath" type="text" required="required" ' + readOnlyAttribute + ' label="' + globalize.translate(labelKey) + '"/>';
html += "</div>";
if (!readOnlyAttribute) {
html += '<button type="button" is="paper-icon-button-light" class="btnRefreshDirectories emby-input-iconbutton" title="' + Globalize.translate("ButtonRefresh") + '"><i class="material-icons">search</i></button>';
html += '<button type="button" is="paper-icon-button-light" class="btnRefreshDirectories emby-input-iconbutton" title="' + globalize.translate("ButtonRefresh") + '"><i class="material-icons">search</i></button>';
}
html += "</div>";
if (!readOnlyAttribute) {
@ -124,14 +124,14 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-
}
if (options.enableNetworkSharePath) {
html += '<div class="inputContainer" style="margin-top:2em;">';
html += '<input is="emby-input" id="txtNetworkPath" type="text" label="' + Globalize.translate("LabelOptionalNetworkPath") + '"/>';
html += '<input is="emby-input" id="txtNetworkPath" type="text" label="' + globalize.translate("LabelOptionalNetworkPath") + '"/>';
html += '<div class="fieldDescription">';
html += Globalize.translate("LabelOptionalNetworkPathHelp");
html += globalize.translate("LabelOptionalNetworkPathHelp");
html += "</div>";
html += "</div>";
}
html += '<div class="formDialogFooter">';
html += '<button is="emby-button" type="submit" class="raised button-submit block formDialogFooterItem">' + Globalize.translate("ButtonOk") + "</button>";
html += '<button is="emby-button" type="submit" class="raised button-submit block formDialogFooterItem">' + globalize.translate("ButtonOk") + "</button>";
html += "</div>";
html += "</form>";
html += "</div>";
@ -164,14 +164,14 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-
}).catch(function(response) {
if (response) {
if (response.status === 404) {
alertText(Globalize.translate("PathNotFound"));
alertText(globalize.translate("PathNotFound"));
return Promise.reject();
}
if (response.status === 500) {
if (validateWriteable) {
alertText(Globalize.translate("WriteAccessRequired"));
alertText(globalize.translate("WriteAccessRequired"));
} else {
alertText(Globalize.translate("PathNotFound"));
alertText(globalize.translate("PathNotFound"));
}
return Promise.reject();
}
@ -266,7 +266,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-
html += '<div class="formDialogHeader">';
html += '<button is="paper-icon-button-light" class="btnCloseDialog autoSize" tabindex="-1"><i class="material-icons arrow_back"></i></button>';
html += '<h3 class="formDialogHeaderTitle">';
html += options.header || Globalize.translate("HeaderSelectPath");
html += options.header || globalize.translate("HeaderSelectPath");
html += "</h3>";
html += "</div>";
html += getEditorHtml(options, systemInfo);

View file

@ -24,9 +24,6 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow
}
function renderFilters(context, result, query) {
if (result.Tags) {
result.Tags.length = Math.min(result.Tags.length, 50);
}
renderOptions(context, ".genreFilters", "chkGenreFilter", result.Genres, function (i) {
var delimeter = "|";
return (delimeter + (query.Genres || "") + delimeter).indexOf(delimeter + i + delimeter) != -1;

View file

@ -64,13 +64,13 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la
} else {
var noLibDescription;
if (user['Policy'] && user['Policy']['IsAdministrator']) {
noLibDescription = Globalize.translate("NoCreatedLibraries", '<a id="button-createLibrary" class="button-link">', '</a>');
noLibDescription = globalize.translate("NoCreatedLibraries", '<br><a id="button-createLibrary" class="button-link">', '</a>');
} else {
noLibDescription = Globalize.translate("AskAdminToCreateLibrary");
noLibDescription = globalize.translate("AskAdminToCreateLibrary");
}
html += '<div class="centerMessage padded-left padded-right">';
html += '<h2>' + Globalize.translate("MessageNothingHere") + '</h2>';
html += '<h2>' + globalize.translate("MessageNothingHere") + '</h2>';
html += '<p>' + noLibDescription + '</p>';
html += '</div>';
elem.innerHTML = html;
@ -243,9 +243,9 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la
return function (items) {
var cardLayout = false;
var shape;
if (itemType === 'Channel' || viewType === 'movies' || viewType === 'books') {
if (itemType === 'Channel' || viewType === 'movies' || viewType === 'books' || viewType === 'tvshows') {
shape = getPortraitShape();
} else if (viewType === 'music') {
} else if (viewType === 'music' || viewType === 'homevideos') {
shape = getSquareShape();
} else {
shape = getThumbShape();

View file

@ -795,7 +795,9 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
dlg.parentNode.removeChild(dlg);
}
screenfull.exit();
if (screenfull.isEnabled) {
screenfull.exit();
}
};
function onEnded() {

View file

@ -218,7 +218,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
if (item.Type === "Program" && options.record !== false) {
if (item.TimerId) {
commands.push({
name: Globalize.translate("ManageRecording"),
name: globalize.translate("ManageRecording"),
id: "record",
icon: "fiber_manual_record"
});
@ -228,7 +228,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
if (item.Type === "Program" && options.record !== false) {
if (!item.TimerId) {
commands.push({
name: Globalize.translate("Record"),
name: globalize.translate("Record"),
id: "record",
icon: "fiber_manual_record"
});
@ -283,7 +283,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
if (options.openAlbum !== false && item.AlbumId && item.MediaType !== "Photo") {
commands.push({
name: Globalize.translate("ViewAlbum"),
name: globalize.translate("ViewAlbum"),
id: "album",
icon: "album"
});
@ -291,7 +291,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
if (options.openArtist !== false && item.ArtistItems && item.ArtistItems.length) {
commands.push({
name: Globalize.translate("ViewArtist"),
name: globalize.translate("ViewArtist"),
id: "artist",
icon: "person"
});

View file

@ -166,6 +166,7 @@ define(['dom', 'browser', 'events', 'emby-tabs', 'emby-button'], function (dom,
}).join('') + '</div></div>';
tabsContainerElem.innerHTML = tabsHtml;
window.CustomElements.upgradeSubtree(tabsContainerElem);
document.body.classList.add('withSectionTabs');
tabOwnerView = view;

View file

@ -1,4 +1,4 @@
define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionseditor/libraryoptionseditor", "emby-toggle", "emby-input", "emby-select", "paper-icon-button-light", "listViewStyle", "formDialogStyle", "emby-button", "flexStyles"], function (loading, dialogHelper, dom, $, libraryoptionseditor) {
define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionseditor/libraryoptionseditor", "globalize", "emby-toggle", "emby-input", "emby-select", "paper-icon-button-light", "listViewStyle", "formDialogStyle", "emby-button", "flexStyles"], function (loading, dialogHelper, dom, $, libraryoptionseditor, globalize) {
"use strict";
function onAddLibrary() {
@ -9,7 +9,7 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed
if (pathInfos.length == 0) {
require(["alert"], function (alert) {
alert({
text: Globalize.translate("PleaseAddAtLeastOneFolder"),
text: globalize.translate("PleaseAddAtLeastOneFolder"),
type: "error"
});
});
@ -36,7 +36,7 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed
dialogHelper.close(dlg);
}, function () {
require(["toast"], function (toast) {
toast(Globalize.translate("ErrorAddingMediaPathToVirtualFolder"));
toast(globalize.translate("ErrorAddingMediaPathToVirtualFolder"));
});
isCreating = false;
@ -196,7 +196,7 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed
dlg.classList.add("background-theme-a");
dlg.classList.add("dlg-librarycreator");
dlg.classList.add("formDialog");
dlg.innerHTML = Globalize.translateDocument(template);
dlg.innerHTML = globalize.translateDocument(template);
initEditor(dlg, options.collectionTypeOptions);
dlg.addEventListener("close", onDialogClosed);
dialogHelper.open(dlg);

View file

@ -1,4 +1,4 @@
define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionseditor/libraryoptionseditor", "emby-button", "listViewStyle", "paper-icon-button-light", "formDialogStyle", "emby-toggle", "flexStyles"], function (jQuery, loading, dialogHelper, dom, libraryoptionseditor) {
define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionseditor/libraryoptionseditor", "globalize", "emby-button", "listViewStyle", "paper-icon-button-light", "formDialogStyle", "emby-toggle", "flexStyles"], function (jQuery, loading, dialogHelper, dom, libraryoptionseditor, globalize) {
"use strict";
function onEditLibrary() {
@ -31,7 +31,7 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed
refreshLibraryFromServer(page);
}, function () {
require(["toast"], function (toast) {
toast(Globalize.translate("ErrorAddingMediaPathToVirtualFolder"));
toast(globalize.translate("ErrorAddingMediaPathToVirtualFolder"));
});
});
}
@ -46,7 +46,7 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed
refreshLibraryFromServer(page);
}, function () {
require(["toast"], function (toast) {
toast(Globalize.translate("ErrorAddingMediaPathToVirtualFolder"));
toast(globalize.translate("ErrorAddingMediaPathToVirtualFolder"));
});
});
}
@ -57,9 +57,9 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed
require(["confirm"], function (confirm) {
confirm({
title: Globalize.translate("HeaderRemoveMediaLocation"),
text: Globalize.translate("MessageConfirmRemoveMediaLocation"),
confirmText: Globalize.translate("ButtonDelete"),
title: globalize.translate("HeaderRemoveMediaLocation"),
text: globalize.translate("MessageConfirmRemoveMediaLocation"),
confirmText: globalize.translate("ButtonDelete"),
primary: "delete"
}).then(function () {
var refreshAfterChange = currentOptions.refresh;
@ -68,7 +68,7 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed
refreshLibraryFromServer(dom.parentWithClass(button, "dlg-libraryeditor"));
}, function () {
require(["toast"], function (toast) {
toast(Globalize.translate("DefaultErrorMessage"));
toast(globalize.translate("DefaultErrorMessage"));
});
});
});
@ -213,7 +213,7 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed
dlg.classList.add("ui-body-a");
dlg.classList.add("background-theme-a");
dlg.classList.add("formDialog");
dlg.innerHTML = Globalize.translateDocument(template);
dlg.innerHTML = globalize.translateDocument(template);
dlg.querySelector(".formDialogHeaderTitle").innerHTML = options.library.Name;
initEditor(dlg, options);
dlg.addEventListener("close", onDialogClosed);

View file

@ -212,7 +212,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo
if (user.Policy.EnableContentDownloading && appHost.supports("filedownload")) {
menuItems.push({
name: Globalize.translate("ButtonDownload"),
name: globalize.translate("ButtonDownload"),
id: "download",
icon: "file_download"
});

View file

@ -5,7 +5,8 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
document.removeEventListener('click', onOneDocumentClick);
document.removeEventListener('keydown', onOneDocumentClick);
if (window.Notification) {
// don't request notification permissions if they're already granted or denied
if (window.Notification && window.Notification.permission === "default") {
/* eslint-disable-next-line compat/compat */
Notification.requestPermission();
}

View file

@ -20,9 +20,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function bindToFullscreenChange(player) {
screenfull.on('change', function () {
events.trigger(player, 'fullscreenchange');
});
if (screenfull.isEnabled) {
screenfull.on('change', function () {
events.trigger(player, 'fullscreenchange');
});
}
}
function triggerPlayerChange(playbackManagerInstance, newPlayer, newTarget, previousPlayer, previousTargetInfo) {

View file

@ -1,24 +0,0 @@
if (typeof Object.assign != 'function') {
(function () {
Object.assign = function (target) {
'use strict';
if (target === undefined || target === null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var output = Object(target);
for (var index = 1; index < arguments.length; index++) {
var source = arguments[index];
if (source !== undefined && source !== null) {
for (var nextKey in source) {
// eslint-disable-next-line no-prototype-builtins
if (source.hasOwnProperty(nextKey)) {
output[nextKey] = source[nextKey];
}
}
}
}
return output;
};
})();
}

View file

@ -672,18 +672,6 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
playbackManager.setVolume(this.value, currentPlayer);
}
var contextmenuHtml = '<button id="toggleContextMenu" is="paper-icon-button-light" class="btnToggleContextMenu" title=' + globalize.translate('ButtonToggleContextMenu') + '><i class="material-icons more_vert"></i></button>';
var volumecontrolHtml = '<div class="volumecontrol flex align-items-center flex-wrap-wrap justify-content-center">';
volumecontrolHtml += '<button is="paper-icon-button-light" class="buttonMute autoSize" title=' + globalize.translate('Mute') + '><i class="xlargePaperIconButton material-icons"></i></button>';
volumecontrolHtml += '<div class="sliderContainer nowPlayingVolumeSliderContainer"><input is="emby-slider" type="range" step="1" min="0" max="100" value="0" class="nowPlayingVolumeSlider"/></div>';
volumecontrolHtml += '</div>';
if (!layoutManager.mobile) {
context.querySelector(".nowPlayingSecondaryButtons").innerHTML += volumecontrolHtml;
context.querySelector(".playlistSectionButton").innerHTML += contextmenuHtml;
} else {
context.querySelector(".playlistSectionButton").innerHTML += volumecontrolHtml + contextmenuHtml;
}
context.querySelector(".nowPlayingVolumeSlider").addEventListener("change", setVolume);
context.querySelector(".nowPlayingVolumeSlider").addEventListener("mousemove", setVolume);
context.querySelector(".nowPlayingVolumeSlider").addEventListener("touchmove", setVolume);
@ -767,6 +755,18 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
}
function init(ownerView, context) {
let contextmenuHtml = `<button id="toggleContextMenu" is="paper-icon-button-light" class="btnToggleContextMenu" title=${globalize.translate('ButtonToggleContextMenu')}><i class="material-icons more_vert"></i></button>`;
let volumecontrolHtml = '<div class="volumecontrol flex align-items-center flex-wrap-wrap justify-content-center">';
volumecontrolHtml += `<button is="paper-icon-button-light" class="buttonMute autoSize" title=${globalize.translate('Mute')}><i class="xlargePaperIconButton material-icons"></i></button>`;
volumecontrolHtml += '<div class="sliderContainer nowPlayingVolumeSliderContainer"><input is="emby-slider" type="range" step="1" min="0" max="100" value="0" class="nowPlayingVolumeSlider"/></div>';
volumecontrolHtml += '</div>';
if (!layoutManager.mobile) {
context.querySelector('.nowPlayingSecondaryButtons').innerHTML += volumecontrolHtml;
context.querySelector('.playlistSectionButton').innerHTML += contextmenuHtml;
} else {
context.querySelector('.playlistSectionButton').innerHTML += volumecontrolHtml + contextmenuHtml;
}
bindEvents(context);
context.querySelector(".sendMessageForm").addEventListener("submit", onMessageSubmit);
context.querySelector(".typeTextForm").addEventListener("submit", onSendStringSubmit);

View file

@ -397,7 +397,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings',
var items = [];
items.push({
name: Globalize.translate('Download'),
name: globalize.translate('Download'),
id: 'download'
});

View file

@ -1,4 +1,4 @@
define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "emby-select", "emby-button", "flexStyles"], function ($, loading) {
define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emby-input", "emby-select", "emby-button", "flexStyles"], function ($, loading, globalize) {
"use strict";
return function (page, providerId, options) {
@ -69,7 +69,7 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
$(page.querySelector(".txtZipCode")).trigger("change");
}, function () { // ApiClient.getJSON() error handler
Dashboard.alert({
message: Globalize.translate("ErrorGettingTvLineups")
message: globalize.translate("ErrorGettingTvLineups")
});
});
loading.hide();
@ -130,7 +130,7 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
reload();
}, function () {
Dashboard.alert({ // ApiClient.ajax() error handler
message: Globalize.translate("ErrorSavingTvProvider")
message: globalize.translate("ErrorSavingTvProvider")
});
});
});
@ -141,7 +141,7 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
if (!selectedListingsId) {
return void Dashboard.alert({
message: Globalize.translate("ErrorPleaseSelectLineup")
message: globalize.translate("ErrorPleaseSelectLineup")
});
}
@ -178,7 +178,7 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
}, function () {
loading.hide();
Dashboard.alert({
message: Globalize.translate("ErrorAddingListingsToSchedulesDirect")
message: globalize.translate("ErrorAddingListingsToSchedulesDirect")
});
});
});
@ -210,7 +210,7 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
loading.hide();
}, function (result) {
Dashboard.alert({
message: Globalize.translate("ErrorGettingTvLineups")
message: globalize.translate("ErrorGettingTvLineups")
});
refreshListings("");
loading.hide();
@ -290,7 +290,7 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
page.querySelector(".selectTunersSection").classList.remove("hide");
}
});
$(".createAccountHelp", page).html(Globalize.translate("MessageCreateAccountAt", '<a is="emby-linkbutton" class="button-link" href="http://www.schedulesdirect.org" target="_blank">http://www.schedulesdirect.org</a>'));
$(".createAccountHelp", page).html(globalize.translate("MessageCreateAccountAt", '<a is="emby-linkbutton" class="button-link" href="http://www.schedulesdirect.org" target="_blank">http://www.schedulesdirect.org</a>'));
reload();
};
};

View file

@ -1,4 +1,4 @@
define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "paper-icon-button-light"], function ($, loading) {
define(["jQuery", "loading", "globalize", "emby-checkbox", "emby-input", "listViewStyle", "paper-icon-button-light"], function ($, loading, globalize) {
"use strict";
return function (page, providerId, options) {
@ -92,7 +92,7 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa
}, function () {
loading.hide();
Dashboard.alert({
message: Globalize.translate("ErrorAddingXmlTvFile")
message: globalize.translate("ErrorAddingXmlTvFile")
});
});
});

View file

@ -1,4 +1,4 @@
define(["appSettings", "loading", "browser", "emby-button"], function(appSettings, loading, browser) {
define(["appSettings", "loading", "browser", "globalize", "emby-button"], function(appSettings, loading, browser, globalize) {
"use strict";
function handleConnectionResult(page, result) {
@ -17,13 +17,13 @@ define(["appSettings", "loading", "browser", "emby-button"], function(appSetting
break;
case "ServerUpdateNeeded":
Dashboard.alert({
message: Globalize.translate("ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
message: globalize.translate("ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
});
break;
case "Unavailable":
Dashboard.alert({
message: Globalize.translate("MessageUnableToConnectToServer"),
title: Globalize.translate("HeaderConnectionFailure")
message: globalize.translate("MessageUnableToConnectToServer"),
title: globalize.translate("HeaderConnectionFailure")
});
}
}

View file

@ -1,23 +1,23 @@
define([], function () {
define(["globalize"], function (globalize) {
"use strict";
function processForgotPasswordResult(result) {
if ("ContactAdmin" == result.Action) {
return void Dashboard.alert({
message: Globalize.translate("MessageContactAdminToResetPassword"),
title: Globalize.translate("HeaderForgotPassword")
message: globalize.translate("MessageContactAdminToResetPassword"),
title: globalize.translate("HeaderForgotPassword")
});
}
if ("InNetworkRequired" == result.Action) {
return void Dashboard.alert({
message: Globalize.translate("MessageForgotPasswordInNetworkRequired"),
title: Globalize.translate("HeaderForgotPassword")
message: globalize.translate("MessageForgotPasswordInNetworkRequired"),
title: globalize.translate("HeaderForgotPassword")
});
}
if ("PinCode" == result.Action) {
var msg = Globalize.translate("MessageForgotPasswordFileCreated");
var msg = globalize.translate("MessageForgotPasswordFileCreated");
msg += "<br/>";
msg += "<br/>";
msg += "Enter PIN here to finish Password Reset<br/>";
@ -26,7 +26,7 @@ define([], function () {
msg += "<br/>";
return void Dashboard.alert({
message: msg,
title: Globalize.translate("HeaderForgotPassword"),
title: globalize.translate("HeaderForgotPassword"),
callback: function () {
Dashboard.navigate("forgotpasswordpin.html");
}

View file

@ -1,15 +1,15 @@
define([], function () {
define(["globalize"], function (globalize) {
"use strict";
function processForgotPasswordResult(result) {
if (result.Success) {
var msg = Globalize.translate("MessagePasswordResetForUsers");
var msg = globalize.translate("MessagePasswordResetForUsers");
msg += "<br/>";
msg += "<br/>";
msg += result.UsersReset.join("<br/>");
return void Dashboard.alert({
message: msg,
title: Globalize.translate("HeaderPasswordReset"),
title: globalize.translate("HeaderPasswordReset"),
callback: function () {
window.location.href = "index.html";
}
@ -17,8 +17,8 @@ define([], function () {
}
Dashboard.alert({
message: Globalize.translate("MessageInvalidForgotPasswordPin"),
title: Globalize.translate("HeaderPasswordReset")
message: globalize.translate("MessageInvalidForgotPasswordPin"),
title: globalize.translate("HeaderPasswordReset")
});
}

View file

@ -1,4 +1,4 @@
define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layoutManager", "browser", "cardStyle", "emby-checkbox"], function (appHost, appSettings, dom, connectionManager, loading, layoutManager, browser) {
define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layoutManager", "browser", "globalize", "cardStyle", "emby-checkbox"], function (appHost, appSettings, dom, connectionManager, loading, layoutManager, browser, globalize) {
"use strict";
var enableFocusTransform = !browser.slow && !browser.edge;
@ -28,12 +28,12 @@ define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layout
if (UnauthorizedOrForbidden.includes(response.status)) {
require(["toast"], function (toast) {
const messageKey = response.status === 401 ? "MessageInvalidUser" : "MessageUnauthorizedUser";
toast(Globalize.translate(messageKey));
toast(globalize.translate(messageKey));
});
} else {
Dashboard.alert({
message: Globalize.translate("MessageUnableToConnectToServer"),
title: Globalize.translate("HeaderConnectionFailure")
message: globalize.translate("MessageUnableToConnectToServer"),
title: globalize.translate("HeaderConnectionFailure")
});
}
});

View file

@ -1,4 +1,4 @@
define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-input", "emby-checkbox", "listViewStyle", "emby-button"], function ($, loading) {
define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-button", "emby-input", "emby-checkbox", "listViewStyle", "emby-button"], function ($, loading, globalize) {
"use strict";
function loadProfile(page) {
@ -258,14 +258,14 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueContainer", profile.Container || allText) + "</p>";
html += "<p>" + globalize.translate("ValueContainer", profile.Container || allText) + "</p>";
if ("Video" == profile.Type) {
html += "<p>" + Globalize.translate("ValueVideoCodec", profile.VideoCodec || allText) + "</p>";
html += "<p>" + Globalize.translate("ValueAudioCodec", profile.AudioCodec || allText) + "</p>";
html += "<p>" + globalize.translate("ValueVideoCodec", profile.VideoCodec || allText) + "</p>";
html += "<p>" + globalize.translate("ValueAudioCodec", profile.AudioCodec || allText) + "</p>";
} else {
if ("Audio" == profile.Type) {
html += "<p>" + Globalize.translate("ValueCodec", profile.AudioCodec || allText) + "</p>";
html += "<p>" + globalize.translate("ValueCodec", profile.AudioCodec || allText) + "</p>";
}
}
@ -319,14 +319,14 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>Protocol: " + (profile.Protocol || "Http") + "</p>";
html += "<p>" + Globalize.translate("ValueContainer", profile.Container || allText) + "</p>";
html += "<p>" + globalize.translate("ValueContainer", profile.Container || allText) + "</p>";
if ("Video" == profile.Type) {
html += "<p>" + Globalize.translate("ValueVideoCodec", profile.VideoCodec || allText) + "</p>";
html += "<p>" + Globalize.translate("ValueAudioCodec", profile.AudioCodec || allText) + "</p>";
html += "<p>" + globalize.translate("ValueVideoCodec", profile.VideoCodec || allText) + "</p>";
html += "<p>" + globalize.translate("ValueAudioCodec", profile.AudioCodec || allText) + "</p>";
} else {
if ("Audio" == profile.Type) {
html += "<p>" + Globalize.translate("ValueCodec", profile.AudioCodec || allText) + "</p>";
html += "<p>" + globalize.translate("ValueCodec", profile.AudioCodec || allText) + "</p>";
}
}
@ -404,11 +404,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueContainer", profile.Container || allText) + "</p>";
html += "<p>" + globalize.translate("ValueContainer", profile.Container || allText) + "</p>";
if (profile.Conditions && profile.Conditions.length) {
html += "<p>";
html += Globalize.translate("ValueConditions", profile.Conditions.map(function (c) {
html += globalize.translate("ValueConditions", profile.Conditions.map(function (c) {
return c.Property;
}).join(", "));
html += "</p>";
@ -476,11 +476,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueCodec", profile.Codec || allText) + "</p>";
html += "<p>" + globalize.translate("ValueCodec", profile.Codec || allText) + "</p>";
if (profile.Conditions && profile.Conditions.length) {
html += "<p>";
html += Globalize.translate("ValueConditions", profile.Conditions.map(function (c) {
html += globalize.translate("ValueConditions", profile.Conditions.map(function (c) {
return c.Property;
}).join(", "));
html += "</p>";
@ -547,20 +547,20 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueContainer", profile.Container || allText) + "</p>";
html += "<p>" + globalize.translate("ValueContainer", profile.Container || allText) + "</p>";
if ("Video" == profile.Type) {
html += "<p>" + Globalize.translate("ValueVideoCodec", profile.VideoCodec || allText) + "</p>";
html += "<p>" + Globalize.translate("ValueAudioCodec", profile.AudioCodec || allText) + "</p>";
html += "<p>" + globalize.translate("ValueVideoCodec", profile.VideoCodec || allText) + "</p>";
html += "<p>" + globalize.translate("ValueAudioCodec", profile.AudioCodec || allText) + "</p>";
} else {
if ("Audio" == profile.Type) {
html += "<p>" + Globalize.translate("ValueCodec", profile.AudioCodec || allText) + "</p>";
html += "<p>" + globalize.translate("ValueCodec", profile.AudioCodec || allText) + "</p>";
}
}
if (profile.Conditions && profile.Conditions.length) {
html += "<p>";
html += Globalize.translate("ValueConditions", profile.Conditions.map(function (c) {
html += globalize.translate("ValueConditions", profile.Conditions.map(function (c) {
return c.Property;
}).join(", "));
html += "</p>";
@ -690,7 +690,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
var currentProfile;
var currentSubProfile;
var isSubProfileNew;
var allText = Globalize.translate("LabelAll");
var allText = globalize.translate("LabelAll");
$(document).on("pageinit", "#dlnaProfilePage", function () {
var page = this;

View file

@ -1,4 +1,4 @@
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function ($, loading, libraryMenu, globalize) {
"use strict";
function loadPage(page, config, users) {
@ -34,10 +34,10 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading,
function getTabs() {
return [{
href: "dlnasettings.html",
name: Globalize.translate("TabSettings")
name: globalize.translate("TabSettings")
}, {
href: "dlnaprofiles.html",
name: Globalize.translate("TabProfiles")
name: globalize.translate("TabProfiles")
}];
}

View file

@ -116,13 +116,13 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo
function getTabs() {
return [{
href: "encodingsettings.html",
name: Globalize.translate("Transcoding")
name: globalize.translate("Transcoding")
}, {
href: "playbackconfiguration.html",
name: Globalize.translate("TabResumeSettings")
name: globalize.translate("TabResumeSettings")
}, {
href: "streamingsettings.html",
name: Globalize.translate("TabStreaming")
name: globalize.translate("TabStreaming")
}];
}

View file

@ -1,4 +1,4 @@
define(["jQuery", "loading", "fnchecked", "emby-checkbox", "emby-textarea", "emby-input", "emby-select", "emby-button"], function ($, loading) {
define(["jQuery", "loading", "globalize", "fnchecked", "emby-checkbox", "emby-textarea", "emby-input", "emby-select", "emby-button"], function ($, loading, globalize) {
"use strict";
function loadPage(page, config, languageOptions, systemInfo) {
@ -58,7 +58,7 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox", "emby-textarea", "emb
});
}, function () {
require(["alert"], function (alert) {
alert(Globalize.translate("DefaultErrorMessage"));
alert(globalize.translate("DefaultErrorMessage"));
});
Dashboard.processServerConfigurationUpdateResult();
@ -83,8 +83,8 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox", "emby-textarea", "emb
picker.close();
},
validateWriteable: true,
header: Globalize.translate("HeaderSelectServerCachePath"),
instruction: Globalize.translate("HeaderSelectServerCachePathHelp")
header: globalize.translate("HeaderSelectServerCachePath"),
instruction: globalize.translate("HeaderSelectServerCachePathHelp")
});
});
});
@ -106,8 +106,8 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox", "emby-textarea", "emb
picker.close();
},
validateWriteable: true,
header: Globalize.translate("HeaderSelectMetadataPath"),
instruction: Globalize.translate("HeaderSelectMetadataPathHelp"),
header: globalize.translate("HeaderSelectMetadataPath"),
instruction: globalize.translate("HeaderSelectMetadataPathHelp"),
enableNetworkSharePath: true
});
});

View file

@ -4,16 +4,16 @@ define(["globalize", "loading", "libraryMenu", "emby-checkbox", "emby-button", "
function getTabs() {
return [{
href: "library.html",
name: Globalize.translate("HeaderLibraries")
name: globalize.translate("HeaderLibraries")
}, {
href: "librarydisplay.html",
name: Globalize.translate("TabDisplay")
name: globalize.translate("TabDisplay")
}, {
href: "metadataimages.html",
name: Globalize.translate("TabMetadata")
name: globalize.translate("TabMetadata")
}, {
href: "metadatanfo.html",
name: Globalize.translate("TabNfoSettings")
name: globalize.translate("TabNfoSettings")
}];
}

View file

@ -1,4 +1,4 @@
define(["jQuery", "dom", "loading", "libraryMenu", "listViewStyle"], function($, dom, loading, libraryMenu) {
define(["jQuery", "dom", "loading", "libraryMenu", "globalize", "listViewStyle"], function($, dom, loading, libraryMenu, globalize) {
"use strict";
function populateLanguages(select) {
@ -43,16 +43,16 @@ define(["jQuery", "dom", "loading", "libraryMenu", "listViewStyle"], function($,
function getTabs() {
return [{
href: "library.html",
name: Globalize.translate("HeaderLibraries")
name: globalize.translate("HeaderLibraries")
}, {
href: "librarydisplay.html",
name: Globalize.translate("TabDisplay")
name: globalize.translate("TabDisplay")
}, {
href: "metadataimages.html",
name: Globalize.translate("TabMetadata")
name: globalize.translate("TabMetadata")
}, {
href: "metadatanfo.html",
name: Globalize.translate("TabNfoSettings")
name: globalize.translate("TabNfoSettings")
}];
}

View file

@ -1,8 +1,8 @@
define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) {
define(["jQuery", "loading", "libraryMenu", "globalize"], function ($, loading, libraryMenu, globalize) {
"use strict";
function loadPage(page, config, users) {
var html = '<option value="" selected="selected">' + Globalize.translate("OptionNone") + "</option>";
var html = '<option value="" selected="selected">' + globalize.translate("OptionNone") + "</option>";
html += users.map(function (user) {
return '<option value="' + user.Id + '">' + user.Name + "</option>";
}).join("");
@ -33,7 +33,7 @@ define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu)
function showConfirmMessage(config) {
var msg = [];
msg.push(Globalize.translate("MetadataSettingChangeHelp"));
msg.push(globalize.translate("MetadataSettingChangeHelp"));
require(["alert"], function (alert) {
alert({
@ -45,16 +45,16 @@ define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu)
function getTabs() {
return [{
href: "library.html",
name: Globalize.translate("HeaderLibraries")
name: globalize.translate("HeaderLibraries")
}, {
href: "librarydisplay.html",
name: Globalize.translate("TabDisplay")
name: globalize.translate("TabDisplay")
}, {
href: "metadataimages.html",
name: Globalize.translate("TabMetadata")
name: globalize.translate("TabMetadata")
}, {
href: "metadatanfo.html",
name: Globalize.translate("TabNfoSettings")
name: globalize.translate("TabNfoSettings")
}];
}

View file

@ -1,4 +1,4 @@
define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) {
define(["jQuery", "loading", "libraryMenu", "globalize"], function ($, loading, libraryMenu, globalize) {
"use strict";
function loadPage(page, config) {
@ -25,13 +25,13 @@ define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu)
function getTabs() {
return [{
href: "encodingsettings.html",
name: Globalize.translate("Transcoding")
name: globalize.translate("Transcoding")
}, {
href: "playbackconfiguration.html",
name: Globalize.translate("TabResumeSettings")
name: globalize.translate("TabResumeSettings")
}, {
href: "streamingsettings.html",
name: Globalize.translate("TabStreaming")
name: globalize.translate("TabStreaming")
}];
}

View file

@ -7,8 +7,8 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
for (var i = 0; i < length; i++) {
var version = packageInfo.versions[i];
html += '<h2 style="margin:.5em 0;">' + version.versionStr + " (" + version.classification + ")</h2>";
html += '<div style="margin-bottom:1.5em;">' + version.description + "</div>";
html += '<h2 style="margin:.5em 0;">' + version.version + "</h2>";
html += '<div style="margin-bottom:1.5em;">' + version.changelog + "</div>";
}
$("#revisionHistory", page).html(html);
@ -19,7 +19,7 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
for (var i = 0; i < packageInfo.versions.length; i++) {
var version = packageInfo.versions[i];
html += '<option value="' + version.versionStr + "|" + version.classification + '">' + version.versionStr + " (" + version.classification + ")</option>";
html += '<option value="' + version.version + '">' + version.version + "</option>";
}
var selectmenu = $("#selectVersion", page).html(html);
@ -28,16 +28,9 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
$("#pCurrentVersion", page).hide().html("");
}
var packageVersion = packageInfo.versions.filter(function (current) {
return "Release" == current.classification;
})[0];
packageVersion = packageVersion || packageInfo.versions.filter(function (current) {
return "Beta" == current.classification;
})[0];
var packageVersion = packageInfo.versions[0];
if (packageVersion) {
var val = packageVersion.versionStr + "|" + packageVersion.classification;
selectmenu.val(val);
selectmenu.val(packageVersion.version);
}
}
@ -45,44 +38,23 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
var installedPlugin = installedPlugins.filter(function (ip) {
return ip.Name == pkg.name;
})[0];
populateVersions(pkg, page, installedPlugin);
populateHistory(pkg, page);
$(".pluginName", page).html(pkg.name);
$("#btnInstallDiv", page).removeClass("hide");
$("#pSelectVersion", page).removeClass("hide");
if ("Server" == pkg.targetSystem) {
$("#btnInstallDiv", page).removeClass("hide");
$("#nonServerMsg", page).hide();
$("#pSelectVersion", page).removeClass("hide");
if (pkg.overview) {
$("#overview", page).show().html(pkg.overview);
} else {
$("#btnInstallDiv", page).addClass("hide");
$("#pSelectVersion", page).addClass("hide");
var msg = globalize.translate("MessageInstallPluginFromApp");
$("#nonServerMsg", page).html(msg).show();
$("#overview", page).hide();
}
if (pkg.shortDescription) {
$("#tagline", page).show().html(pkg.shortDescription);
} else {
$("#tagline", page).hide();
}
$("#overview", page).html(pkg.overview || "");
$("#description", page).html(pkg.description);
$("#developer", page).html(pkg.owner);
if (pkg.richDescUrl) {
$("#pViewWebsite", page).show();
$("#pViewWebsite a", page).attr("href", pkg.richDescUrl);
} else {
$("#pViewWebsite", page).hide();
}
if (pkg.previewImage || pkg.thumbImage) {
var img = pkg.previewImage ? pkg.previewImage : pkg.thumbImage;
$("#pPreviewImage", page).show().html("<img class='pluginPreviewImg' src='" + img + "' style='max-width: 100%;' />");
} else {
$("#pPreviewImage", page).hide().html("");
}
if (installedPlugin) {
var currentVersionText = globalize.translate("MessageYouHaveVersionInstalled", "<strong>" + installedPlugin.Version + "</strong>");
$("#pCurrentVersion", page).show().html(currentVersionText);

View file

@ -98,21 +98,14 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-button", "emby
html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + href + '"' + target + ">";
if (plugin.thumbImage) {
html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.thumbImage + "');\">";
html += "</div>";
} else {
html += '<i class="cardImageIcon material-icons">folder</i>';
}
html += '<i class="cardImageIcon material-icons">folder</i>';
html += "</a>";
html += "</div>";
html += '<div class="cardFooter">';
html += "<div class='cardText'>";
html += plugin.name;
html += "</div>";
var installedPlugin = plugin.isApp ? null : installedPlugins.filter(function (ip) {
var installedPlugin = installedPlugins.filter(function (ip) {
return ip.Id == plugin.guid;
})[0];
html += "<div class='cardText cardText-secondary'>";

View file

@ -42,14 +42,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
html += '<div class="cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += configPageUrl ? '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + configPageUrl + '">' : '<div class="cardContent noConfigPluginCard noHoverEffect cardImageContainer">';
if (plugin.ImageUrl) {
html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.ImageUrl + "');\">";
html += "</div>";
} else {
html += '<i class="cardImageIcon material-icons">folder</i>';
}
html += '<i class="cardImageIcon material-icons">folder</i>';
html += configPageUrl ? "</a>" : "</div>";
html += "</div>";
html += '<div class="cardFooter">';
@ -57,7 +50,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
html += '<button type="button" is="paper-icon-button-light" class="btnCardMenu autoSize"><i class="material-icons more_horiz"></i></button>';
html += "</div>";
html += "<div class='cardText'>";
html += configPage ? configPage.DisplayName || plugin.Name : plugin.Name;
html += configPage.DisplayName || plugin.Name;
html += "</div>";
html += "<div class='cardText cardText-secondary'>";
html += plugin.Version;

View file

@ -1,4 +1,4 @@
define(["jQuery", "libraryMenu", "loading"], function ($, libraryMenu, loading) {
define(["jQuery", "libraryMenu", "loading", "globalize"], function ($, libraryMenu, loading, globalize) {
"use strict";
function loadPage(page, config) {
@ -20,13 +20,13 @@ define(["jQuery", "libraryMenu", "loading"], function ($, libraryMenu, loading)
function getTabs() {
return [{
href: "encodingsettings.html",
name: Globalize.translate("Transcoding")
name: globalize.translate("Transcoding")
}, {
href: "playbackconfiguration.html",
name: Globalize.translate("TabResumeSettings")
name: globalize.translate("TabResumeSettings")
}, {
href: "streamingsettings.html",
name: Globalize.translate("TabStreaming")
name: globalize.translate("TabStreaming")
}];
}

View file

@ -554,7 +554,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
renderTimerEditor(page, item, apiClient, user);
renderImage(page, item, apiClient, user);
renderLogo(page, item, apiClient);
setTitle(item, apiClient);
Emby.Page.setTitle('');
setInitialCollapsibleState(page, item, apiClient, context, user);
renderDetails(page, item, apiClient, context);
renderTrackSelections(page, instance, item);
@ -666,19 +666,6 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
return null;
}
function setTitle(item, apiClient) {
var url = logoImageUrl(item, apiClient, {});
if (url != null) {
var pageTitle = document.querySelector(".pageTitle");
pageTitle.style.backgroundImage = "url('" + url + "')";
pageTitle.classList.add("pageTitleWithLogo");
pageTitle.innerHTML = "";
} else {
Emby.Page.setTitle("");
}
}
function renderLogo(page, item, apiClient) {
var url = logoImageUrl(item, apiClient, {
maxWidth: 400
@ -2116,7 +2103,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
if (e.detail.isRestored) {
if (currentItem) {
setTitle(currentItem, connectionManager.getApiClient(currentItem.ServerId));
Emby.Page.setTitle('');
renderTrackSelections(page, self, currentItem, true);
}
} else {

View file

@ -1,4 +1,4 @@
define(["events", "loading"], function (events, loading) {
define(["events", "loading", "globalize"], function (events, loading, globalize) {
"use strict";
function onListingsSubmitted() {
@ -17,7 +17,7 @@ define(["events", "loading"], function (events, loading) {
function loadTemplate(page, type, providerId) {
require(["text!./components/tvproviders/" + type + ".template.html"], function (html) {
page.querySelector(".providerTemplate").innerHTML = Globalize.translateDocument(html);
page.querySelector(".providerTemplate").innerHTML = globalize.translateDocument(html);
init(page, type, providerId);
});
}

View file

@ -1,4 +1,4 @@
define(["jQuery", "loading", "fnchecked", "emby-button"], function ($, loading) {
define(["jQuery", "loading", "globalize", "fnchecked", "emby-button"], function ($, loading, globalize) {
"use strict";
function loadPage(page, config) {
@ -44,7 +44,7 @@ define(["jQuery", "loading", "fnchecked", "emby-button"], function ($, loading)
var msg = "";
if (recordingPathChanged) {
msg += Globalize.translate("RecordingPathChangeMessage");
msg += globalize.translate("RecordingPathChangeMessage");
}
if (msg) {

View file

@ -1,4 +1,4 @@
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings) {
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "userSettings", "globalize", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) {
"use strict";
return function (view, params, tabContent) {
@ -171,7 +171,7 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
}
if (!result.Items.length) {
html = '<p style="text-align:center;">' + Globalize.translate("MessageNoCollectionsAvailable") + "</p>";
html = '<p style="text-align:center;">' + globalize.translate("MessageNoCollectionsAvailable") + "</p>";
}
var itemsContainer = tabContent.querySelector(".itemsContainer");
@ -199,19 +199,19 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
name: globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
name: globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
name: globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
name: globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
name: globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function () {

View file

@ -1,4 +1,4 @@
define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"], function (loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "globalize", "emby-itemscontainer"], function (loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder, globalize) {
"use strict";
return function (view, params, tabContent, options) {
@ -191,31 +191,31 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
btnSort.addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
name: globalize.translate("OptionNameSort"),
id: "SortName,ProductionYear"
}, {
name: Globalize.translate("OptionImdbRating"),
name: globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionCriticRating"),
name: globalize.translate("OptionCriticRating"),
id: "CriticRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionDateAdded"),
name: globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionDatePlayed"),
name: globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionParentalRating"),
name: globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionPlayCount"),
name: globalize.translate("OptionPlayCount"),
id: "PlayCount,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionReleaseDate"),
name: globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionRuntime"),
name: globalize.translate("OptionRuntime"),
id: "Runtime,SortName,ProductionYear"
}],
callback: function () {

View file

@ -1,4 +1,4 @@
define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "cardBuilder", "dom", "imageLoader", "playbackManager", "emby-scroller", "emby-itemscontainer", "emby-tabs", "emby-button"], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager) {
define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "cardBuilder", "dom", "imageLoader", "playbackManager", "globalize", "emby-scroller", "emby-itemscontainer", "emby-tabs", "emby-button"], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager, globalize) {
"use strict";
function enableScrollX() {
@ -91,21 +91,21 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
switch (recommendation.RecommendationType) {
case "SimilarToRecentlyPlayed":
title = Globalize.translate("RecommendationBecauseYouWatched", recommendation.BaselineItemName);
title = globalize.translate("RecommendationBecauseYouWatched", recommendation.BaselineItemName);
break;
case "SimilarToLikedItem":
title = Globalize.translate("RecommendationBecauseYouLike", recommendation.BaselineItemName);
title = globalize.translate("RecommendationBecauseYouLike", recommendation.BaselineItemName);
break;
case "HasDirectorFromRecentlyPlayed":
case "HasLikedDirector":
title = Globalize.translate("RecommendationDirectedBy", recommendation.BaselineItemName);
title = globalize.translate("RecommendationDirectedBy", recommendation.BaselineItemName);
break;
case "HasActorFromRecentlyPlayed":
case "HasLikedActor":
title = Globalize.translate("RecommendationStarring", recommendation.BaselineItemName);
title = globalize.translate("RecommendationStarring", recommendation.BaselineItemName);
break;
}
@ -211,19 +211,19 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
function getTabs() {
return [{
name: Globalize.translate("Movies")
name: globalize.translate("Movies")
}, {
name: Globalize.translate("TabSuggestions")
name: globalize.translate("TabSuggestions")
}, {
name: Globalize.translate("TabTrailers")
name: globalize.translate("TabTrailers")
}, {
name: Globalize.translate("TabFavorites")
name: globalize.translate("TabFavorites")
}, {
name: Globalize.translate("TabCollections")
name: globalize.translate("TabCollections")
}, {
name: Globalize.translate("TabGenres")
name: globalize.translate("TabGenres")
}, {
name: Globalize.translate("ButtonSearch"),
name: globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}];
}
@ -398,8 +398,8 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
libraryMenu.setTitle(item.Name);
});
} else {
view.setAttribute("data-title", Globalize.translate("TabMovies"));
libraryMenu.setTitle(Globalize.translate("TabMovies"));
view.setAttribute("data-title", globalize.translate("TabMovies"));
libraryMenu.setTitle(globalize.translate("TabMovies"));
}
}

View file

@ -1,4 +1,4 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) {
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "globalize", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) {
"use strict";
return function (view, params, tabContent) {
@ -158,7 +158,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
}
if (!result.Items.length) {
html = '<p style="text-align:center;">' + Globalize.translate("MessageNoTrailersFound") + "</p>";
html = '<p style="text-align:center;">' + globalize.translate("MessageNoTrailersFound") + "</p>";
}
var itemsContainer = tabContent.querySelector(".itemsContainer");
@ -223,25 +223,25 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
name: globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
name: globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
name: globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
name: globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
name: globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
name: globalize.translate("OptionPlayCount"),
id: "PlayCount,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
name: globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function () {

View file

@ -1,4 +1,4 @@
define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) {
define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "globalize", "emby-itemscontainer"], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) {
"use strict";
return function (view, params, tabContent) {
@ -230,25 +230,25 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
name: globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionAlbumArtist"),
name: globalize.translate("OptionAlbumArtist"),
id: "AlbumArtist,SortName"
}, {
name: Globalize.translate("OptionCommunityRating"),
name: globalize.translate("OptionCommunityRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionCriticRating"),
name: globalize.translate("OptionCriticRating"),
id: "CriticRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
name: globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
name: globalize.translate("OptionReleaseDate"),
id: "ProductionYear,PremiereDate,SortName"
}, {
name: Globalize.translate("OptionRandom"),
name: globalize.translate("OptionRandom"),
id: "Random,SortName"
}],
callback: function () {

View file

@ -1,4 +1,4 @@
define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "cardBuilder", "dom", "apphost", "imageLoader", "libraryMenu", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button", "flexStyles"], function (browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager) {
define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "cardBuilder", "dom", "apphost", "imageLoader", "libraryMenu", "playbackManager", "mainTabsManager", "globalize", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button", "flexStyles"], function (browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager, globalize) {
"use strict";
function itemsPerRow() {
@ -167,21 +167,21 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
function getTabs() {
return [{
name: Globalize.translate("TabSuggestions")
name: globalize.translate("TabSuggestions")
}, {
name: Globalize.translate("TabAlbums")
name: globalize.translate("TabAlbums")
}, {
name: Globalize.translate("TabAlbumArtists")
name: globalize.translate("TabAlbumArtists")
}, {
name: Globalize.translate("TabArtists")
name: globalize.translate("TabArtists")
}, {
name: Globalize.translate("TabPlaylists")
name: globalize.translate("TabPlaylists")
}, {
name: Globalize.translate("TabSongs")
name: globalize.translate("TabSongs")
}, {
name: Globalize.translate("TabGenres")
name: globalize.translate("TabGenres")
}, {
name: Globalize.translate("ButtonSearch"),
name: globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}];
}
@ -388,8 +388,8 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
libraryMenu.setTitle(item.Name);
});
} else {
view.setAttribute("data-title", Globalize.translate("TabMusic"));
libraryMenu.setTitle(Globalize.translate("TabMusic"));
view.setAttribute("data-title", globalize.translate("TabMusic"));
libraryMenu.setTitle(globalize.translate("TabMusic"));
}
}

View file

@ -1,4 +1,4 @@
define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userSettings", "emby-itemscontainer"], function (events, libraryBrowser, imageLoader, listView, loading, userSettings) {
define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userSettings", "globalize", "emby-itemscontainer"], function (events, libraryBrowser, imageLoader, listView, loading, userSettings, globalize) {
"use strict";
return function (view, params, tabContent) {
@ -149,31 +149,31 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionTrackName"),
name: globalize.translate("OptionTrackName"),
id: "Name"
}, {
name: Globalize.translate("OptionAlbum"),
name: globalize.translate("OptionAlbum"),
id: "Album,SortName"
}, {
name: Globalize.translate("OptionAlbumArtist"),
name: globalize.translate("OptionAlbumArtist"),
id: "AlbumArtist,Album,SortName"
}, {
name: Globalize.translate("OptionArtist"),
name: globalize.translate("OptionArtist"),
id: "Artist,Album,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
name: globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
name: globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
name: globalize.translate("OptionPlayCount"),
id: "PlayCount,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
name: globalize.translate("OptionReleaseDate"),
id: "PremiereDate,AlbumArtist,Album,SortName"
}, {
name: Globalize.translate("OptionRuntime"),
name: globalize.translate("OptionRuntime"),
id: "Runtime,AlbumArtist,Album,SortName"
}],
callback: function () {

View file

@ -45,23 +45,6 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med
return null;
}
function logoImageUrl(item, apiClient, options) {
options = options || {};
options.type = "Logo";
if (item.ImageTags && item.ImageTags.Logo) {
options.tag = item.ImageTags.Logo;
return apiClient.getScaledImageUrl(item.Id, options);
}
if (item.ParentLogoImageTag) {
options.tag = item.ParentLogoImageTag;
return apiClient.getScaledImageUrl(item.ParentLogoItemId, options);
}
return null;
}
return function (view, params) {
function onVerticalSwipe(e, elem, data) {
var player = currentPlayer;
@ -309,18 +292,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med
}
function setTitle(item, parentName) {
var url = logoImageUrl(item, connectionManager.getApiClient(item.ServerId), {});
if (url) {
Emby.Page.setTitle("");
var pageTitle = document.querySelector(".pageTitle");
pageTitle.style.backgroundImage = "url('" + url + "')";
pageTitle.classList.add("pageTitleWithLogo");
pageTitle.classList.remove("pageTitleWithDefaultLogo");
pageTitle.innerHTML = "";
} else {
Emby.Page.setTitle(parentName || "");
}
Emby.Page.setTitle(parentName || '');
var documentTitle = parentName || (item ? item.Name : null);

View file

@ -1,4 +1,4 @@
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings) {
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "userSettings", "globalize", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) {
"use strict";
return function (view, params, tabContent) {
@ -188,28 +188,28 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
name: globalize.translate("OptionNameSort"),
id: "SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionTvdbRating"),
name: globalize.translate("OptionTvdbRating"),
id: "CommunityRating,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
name: globalize.translate("OptionDateAdded"),
id: "DateCreated,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionPremiereDate"),
name: globalize.translate("OptionPremiereDate"),
id: "PremiereDate,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
name: globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
name: globalize.translate("OptionParentalRating"),
id: "OfficialRating,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
name: globalize.translate("OptionPlayCount"),
id: "PlayCount,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionRuntime"),
name: globalize.translate("OptionRuntime"),
id: "Runtime,SeriesSortName,SortName"
}],
callback: function () {

View file

@ -1,23 +1,23 @@
define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-button"], function (events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager) {
define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "globalize", "scrollStyles", "emby-itemscontainer", "emby-button"], function (events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager, globalize) {
"use strict";
function getTabs() {
return [{
name: Globalize.translate("TabShows")
name: globalize.translate("TabShows")
}, {
name: Globalize.translate("TabSuggestions")
name: globalize.translate("TabSuggestions")
}, {
name: Globalize.translate("TabLatest")
name: globalize.translate("TabLatest")
}, {
name: Globalize.translate("TabUpcoming")
name: globalize.translate("TabUpcoming")
}, {
name: Globalize.translate("TabGenres")
name: globalize.translate("TabGenres")
}, {
name: Globalize.translate("TabNetworks")
name: globalize.translate("TabNetworks")
}, {
name: Globalize.translate("TabEpisodes")
name: globalize.translate("TabEpisodes")
}, {
name: Globalize.translate("ButtonSearch"),
name: globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}];
}
@ -314,8 +314,8 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do
libraryMenu.setTitle(item.Name);
});
} else {
view.setAttribute("data-title", Globalize.translate("TabShows"));
libraryMenu.setTitle(Globalize.translate("TabShows"));
view.setAttribute("data-title", globalize.translate("TabShows"));
libraryMenu.setTitle(globalize.translate("TabShows"));
}
}

View file

@ -1,4 +1,4 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings) {
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "userSettings", "globalize", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings, globalize) {
"use strict";
return function (view, params, tabContent) {
@ -241,22 +241,22 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
name: globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
name: globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
name: globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
name: globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
name: globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
name: globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function () {

View file

@ -1,4 +1,4 @@
define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer"], function (layoutManager, loading, datetime, libraryBrowser, cardBuilder, appHost, imageLoader) {
define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", "apphost", "imageLoader", "globalize", "scrollStyles", "emby-itemscontainer"], function (layoutManager, loading, datetime, libraryBrowser, cardBuilder, appHost, imageLoader, globalize) {
"use strict";
function getUpcomingPromise(context, params) {
@ -52,7 +52,7 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder",
if (item.PremiereDate) {
try {
var premiereDate = datetime.parseISO8601Date(item.PremiereDate, true);
dateText = datetime.isRelativeDay(premiereDate, -1) ? Globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, {
dateText = datetime.isRelativeDay(premiereDate, -1) ? globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, {
weekday: "long",
month: "short",
day: "numeric"

View file

@ -1,4 +1,4 @@
define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "emby-button"], function (UserPasswordPage, loading, libraryMenu, appHost) {
define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "globalize", "emby-button"], function (UserPasswordPage, loading, libraryMenu, appHost, globalize) {
"use strict";
function reloadUser(page) {
@ -37,7 +37,7 @@ define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "em
switch (evt.target.error.code) {
case evt.target.error.NOT_FOUND_ERR:
require(["toast"], function (toast) {
toast(Globalize.translate("FileNotFound"));
toast(globalize.translate("FileNotFound"));
});
break;
case evt.target.error.ABORT_ERR:
@ -46,7 +46,7 @@ define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "em
case evt.target.error.NOT_READABLE_ERR:
default:
require(["toast"], function (toast) {
toast(Globalize.translate("FileReadError"));
toast(globalize.translate("FileReadError"));
});
}
}
@ -54,7 +54,7 @@ define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "em
function onFileReaderAbort(evt) {
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("FileReadCancelled"));
toast(globalize.translate("FileReadCancelled"));
});
}
@ -86,7 +86,7 @@ define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "em
new UserPasswordPage(view, params);
view.querySelector("#btnDeleteImage").addEventListener("click", function () {
require(["confirm"], function (confirm) {
confirm(Globalize.translate("DeleteImageConfirmation"), Globalize.translate("DeleteImage")).then(function () {
confirm(globalize.translate("DeleteImageConfirmation"), globalize.translate("DeleteImage")).then(function () {
loading.show();
var userId = getParameterByName("userId");
ApiClient.deleteUserImage(userId, "primary").then(function () {

View file

@ -1,4 +1,4 @@
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function ($, loading, libraryMenu, globalize) {
"use strict";
function loadDeleteFolders(page, user, mediaFolders) {
@ -112,7 +112,7 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading,
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved"));
toast(globalize.translate("SettingsSaved"));
});
}
@ -176,7 +176,7 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading,
var currentUser;
$(document).on("pageinit", "#editUserPage", function () {
$(".editUserProfileForm").off("submit", onSubmit).on("submit", onSubmit);
this.querySelector(".sharingHelp").innerHTML = Globalize.translate("OptionAllowLinkSharingHelp", 30);
this.querySelector(".sharingHelp").innerHTML = globalize.translate("OptionAllowLinkSharingHelp", 30);
var page = this;
$("#chkEnableDeleteAllFolders", this).on("change", function () {
if (this.checked) {

View file

@ -1,4 +1,4 @@
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function ($, loading, libraryMenu, globalize) {
"use strict";
function triggerChange(select) {
@ -9,7 +9,7 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading,
function loadMediaFolders(page, user, mediaFolders) {
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>";
html += '<h3 class="checkboxListLabel">' + globalize.translate("HeaderLibraries") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = mediaFolders.length; i < length; i++) {
@ -28,7 +28,7 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading,
function loadChannels(page, user, channels) {
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>";
html += '<h3 class="checkboxListLabel">' + globalize.translate("HeaderChannels") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = channels.length; i < length; i++) {
@ -52,7 +52,7 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading,
function loadDevices(page, user, devices) {
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderDevices") + "</h3>";
html += '<h3 class="checkboxListLabel">' + globalize.translate("HeaderDevices") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = devices.length; i < length; i++) {
@ -85,7 +85,7 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading,
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved"));
toast(globalize.translate("SettingsSaved"));
});
}

View file

@ -1,9 +1,9 @@
define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function ($, loading) {
define(["jQuery", "loading", "globalize", "fnchecked", "emby-checkbox"], function ($, loading, globalize) {
"use strict";
function loadMediaFolders(page, mediaFolders) {
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>";
html += '<h3 class="checkboxListLabel">' + globalize.translate("HeaderLibraries") + "</h3>";
html += '<div class="checkboxList paperList" style="padding:.5em 1em;">';
for (var i = 0; i < mediaFolders.length; i++) {
@ -18,7 +18,7 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function ($, loading
function loadChannels(page, channels) {
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>";
html += '<h3 class="checkboxListLabel">' + globalize.translate("HeaderChannels") + "</h3>";
html += '<div class="checkboxList paperList" style="padding:.5em 1em;">';
for (var i = 0; i < channels.length; i++) {
@ -85,7 +85,7 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function ($, loading
});
}, function (response) {
require(["toast"], function (toast) {
toast(Globalize.translate("DefaultErrorMessage"));
toast(globalize.translate("DefaultErrorMessage"));
});
loading.hide();

View file

@ -1,4 +1,4 @@
define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-icon-button-light"], function ($, datetime, loading, libraryMenu) {
define(["jQuery", "datetime", "loading", "libraryMenu", "globalize", "listViewStyle", "paper-icon-button-light"], function ($, datetime, loading, libraryMenu, globalize) {
"use strict";
function populateRatings(allParentalRatings, page) {
@ -35,29 +35,29 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-
function loadUnratedItems(page, user) {
var items = [{
name: Globalize.translate("OptionBlockBooks"),
name: globalize.translate("OptionBlockBooks"),
value: "Book"
}, {
name: Globalize.translate("OptionBlockChannelContent"),
name: globalize.translate("OptionBlockChannelContent"),
value: "ChannelContent"
}, {
name: Globalize.translate("OptionBlockLiveTvChannels"),
name: globalize.translate("OptionBlockLiveTvChannels"),
value: "LiveTvChannel"
}, {
name: Globalize.translate("OptionBlockMovies"),
name: globalize.translate("OptionBlockMovies"),
value: "Movie"
}, {
name: Globalize.translate("OptionBlockMusic"),
name: globalize.translate("OptionBlockMusic"),
value: "Music"
}, {
name: Globalize.translate("OptionBlockTrailers"),
name: globalize.translate("OptionBlockTrailers"),
value: "Trailer"
}, {
name: Globalize.translate("OptionBlockTvShows"),
name: globalize.translate("OptionBlockTvShows"),
value: "Series"
}];
var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderBlockItemsWithNoRating") + "</h3>";
html += '<h3 class="checkboxListLabel">' + globalize.translate("HeaderBlockItemsWithNoRating") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = items.length; i < length; i++) {
@ -139,7 +139,7 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-
itemHtml += '<div class="liSchedule listItem" data-day="' + a.DayOfWeek + '" data-start="' + a.StartHour + '" data-end="' + a.EndHour + '">';
itemHtml += '<div class="listItemBody two-line">';
itemHtml += '<h3 class="listItemBodyText">';
itemHtml += Globalize.translate("Option" + a.DayOfWeek);
itemHtml += globalize.translate("Option" + a.DayOfWeek);
itemHtml += "</h3>";
itemHtml += '<div class="listItemBodyText secondary">' + getDisplayTime(a.StartHour) + " - " + getDisplayTime(a.EndHour) + "</div>";
itemHtml += "</div>";
@ -159,7 +159,7 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved"));
toast(globalize.translate("SettingsSaved"));
});
}
@ -226,7 +226,7 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-
function showBlockedTagPopup(page) {
require(["prompt"], function (prompt) {
prompt({
label: Globalize.translate("LabelTag")
label: globalize.translate("LabelTag")
}).then(function (value) {
var tags = getBlockedTagsFromPage(page);

View file

@ -1,4 +1,4 @@
define(["loading", "libraryMenu", "emby-button"], function (loading, libraryMenu) {
define(["loading", "libraryMenu", "globalize", "emby-button"], function (loading, libraryMenu, globalize) {
"use strict";
function loadUser(page, params) {
@ -79,7 +79,7 @@ define(["loading", "libraryMenu", "emby-button"], function (loading, libraryMenu
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("MessageSettingsSaved"));
toast(globalize.translate("MessageSettingsSaved"));
});
loadUser(view, params);
@ -102,15 +102,15 @@ define(["loading", "libraryMenu", "emby-button"], function (loading, libraryMenu
loading.hide();
require(["toast"], function (toast) {
toast(Globalize.translate("PasswordSaved"));
toast(globalize.translate("PasswordSaved"));
});
loadUser(view, params);
}, function () {
loading.hide();
Dashboard.alert({
title: Globalize.translate("HeaderLoginFailure"),
message: Globalize.translate("MessageInvalidUser")
title: globalize.translate("HeaderLoginFailure"),
message: globalize.translate("MessageInvalidUser")
});
});
}
@ -120,7 +120,7 @@ define(["loading", "libraryMenu", "emby-button"], function (loading, libraryMenu
if (form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value) {
require(["toast"], function (toast) {
toast(Globalize.translate("PasswordMatchError"));
toast(globalize.translate("PasswordMatchError"));
});
} else {
loading.show();
@ -139,17 +139,17 @@ define(["loading", "libraryMenu", "emby-button"], function (loading, libraryMenu
}
function resetPassword() {
var msg = Globalize.translate("PasswordResetConfirmation");
var msg = globalize.translate("PasswordResetConfirmation");
require(["confirm"], function (confirm) {
confirm(msg, Globalize.translate("PasswordResetHeader")).then(function () {
confirm(msg, globalize.translate("PasswordResetHeader")).then(function () {
var userId = params.userId;
loading.show();
ApiClient.resetUserPassword(userId).then(function () {
loading.hide();
Dashboard.alert({
message: Globalize.translate("PasswordResetComplete"),
title: Globalize.translate("PasswordResetHeader")
message: globalize.translate("PasswordResetComplete"),
title: globalize.translate("PasswordResetHeader")
});
loadUser(view, params);
});
@ -158,17 +158,17 @@ define(["loading", "libraryMenu", "emby-button"], function (loading, libraryMenu
}
function resetEasyPassword() {
var msg = Globalize.translate("PinCodeResetConfirmation");
var msg = globalize.translate("PinCodeResetConfirmation");
require(["confirm"], function (confirm) {
confirm(msg, Globalize.translate("HeaderPinCodeReset")).then(function () {
confirm(msg, globalize.translate("HeaderPinCodeReset")).then(function () {
var userId = params.userId;
loading.show();
ApiClient.resetEasyPassword(userId).then(function () {
loading.hide();
Dashboard.alert({
message: Globalize.translate("PinCodeResetComplete"),
title: Globalize.translate("HeaderPinCodeReset")
message: globalize.translate("PinCodeResetComplete"),
title: globalize.translate("HeaderPinCodeReset")
});
loadUser(view, params);
});

View file

@ -33,7 +33,7 @@ define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "em
if (form.querySelector("#txtManualPassword").value != form.querySelector("#txtPasswordConfirm").value) {
require(["toast"], function (toast) {
toast(Globalize.translate("PasswordMatchError"));
toast(globalize.translate("PasswordMatchError"));
});
} else {
submit(form);

View file

@ -49,6 +49,7 @@
.button-link {
background: transparent;
cursor: pointer;
margin: 0;
padding: 0;
vertical-align: initial;

View file

@ -26,9 +26,9 @@
<div class="runtime"></div>
</div>
<div class="nowPlayingButtonsContainer">
<div class="nowPlayingButtonsContainer focuscontainer-x">
<div class="nowPlayingInfoButtons focuscontainer-x">
<div class="nowPlayingInfoButtons">
<button is="paper-icon-button-light" class="btnRewind btnNowPlayingRewind btnPlayStateCommand autoSize" title="${Rewind}">
<i class="material-icons replay_10"></i>

View file

@ -22,7 +22,7 @@ define([], function () {
return true;
}
if (userAgent.indexOf('webos') !== -1) {
if (userAgent.indexOf('web0s') !== -1) {
return true;
}

View file

@ -887,6 +887,16 @@ define(['browser'], function (browser) {
Method: 'External'
});
}
if (options.enableSsaRender) {
profile.SubtitleProfiles.push({
Format: 'ass',
Method: 'External'
});
profile.SubtitleProfiles.push({
Format: 'ssa',
Method: 'External'
});
}
profile.ResponseProfiles = [];
profile.ResponseProfiles.push({

View file

@ -1,62 +1,62 @@
import { ar, be, bg, ca, cs, da, de, el, enGB, enUS, es, faIR, fi, fr, frCA, he, hi, hr, hu, id, it, ja, kk, ko, lt, ms, nb,
nl, pl, ptBR, pt, ro, ru, sk, sl, sv, tr, uk, vi, zhCN, zhTW } from 'date-fns/locale';
import globalize from 'globalize';
const dateLocales = (locale) => ({
'ar': ar,
'be-by': be,
'bg-bg': bg,
'ca': ca,
'cs': cs,
'da': da,
'de': de,
'el': el,
'en-gb': enGB,
'en-us': enUS,
'es': es,
'es-ar': es,
'es-mx': es,
'fa': faIR,
'fi': fi,
'fr': fr,
'fr-ca': frCA,
'gsw': de,
'he': he,
'hi-in': hi,
'hr': hr,
'hu': hu,
'id': id,
'it': it,
'ja': ja,
'kk': kk,
'ko': ko,
'lt-lt': lt,
'ms': ms,
'nb': nb,
'nl': nl,
'pl': pl,
'pt-br': ptBR,
'pt-pt': pt,
'ro': ro,
'ru': ru,
'sk': sk,
'sl-si': sl,
'sv': sv,
'tr': tr,
'uk': uk,
'vi': vi,
'zh-cn': zhCN,
'zh-hk': zhCN,
'zh-tw': zhTW
})[locale];
export function getLocale() {
return dateLocales(globalize.getCurrentLocale()) || enUS;
}
export const localeWithSuffix = { addSuffix: true, locale: getLocale() };
export default {
getLocale: getLocale,
localeWithSuffix: localeWithSuffix
};
import { ar, be, bg, ca, cs, da, de, el, enGB, enUS, es, faIR, fi, fr, frCA, he, hi, hr, hu, id, it, ja, kk, ko, lt, ms, nb,
nl, pl, ptBR, pt, ro, ru, sk, sl, sv, tr, uk, vi, zhCN, zhTW } from 'date-fns/locale';
import globalize from 'globalize';
const dateLocales = (locale) => ({
'ar': ar,
'be-by': be,
'bg-bg': bg,
'ca': ca,
'cs': cs,
'da': da,
'de': de,
'el': el,
'en-gb': enGB,
'en-us': enUS,
'es': es,
'es-ar': es,
'es-mx': es,
'fa': faIR,
'fi': fi,
'fr': fr,
'fr-ca': frCA,
'gsw': de,
'he': he,
'hi-in': hi,
'hr': hr,
'hu': hu,
'id': id,
'it': it,
'ja': ja,
'kk': kk,
'ko': ko,
'lt-lt': lt,
'ms': ms,
'nb': nb,
'nl': nl,
'pl': pl,
'pt-br': ptBR,
'pt-pt': pt,
'ro': ro,
'ru': ru,
'sk': sk,
'sl-si': sl,
'sv': sv,
'tr': tr,
'uk': uk,
'vi': vi,
'zh-cn': zhCN,
'zh-hk': zhCN,
'zh-tw': zhTW
})[locale];
export function getLocale() {
return dateLocales(globalize.getCurrentLocale()) || enUS;
}
export const localeWithSuffix = { addSuffix: true, locale: getLocale() };
export default {
getLocale: getLocale,
localeWithSuffix: localeWithSuffix
};

View file

@ -1,4 +1,4 @@
define(["datetime", "jQuery", "material-icons"], function (datetime, $) {
define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime, $, globalize) {
"use strict";
function getNode(item, folderState, selected) {
@ -70,7 +70,7 @@ define(["datetime", "jQuery", "material-icons"], function (datetime, $) {
var nodes = [];
nodes.push({
id: "MediaFolders",
text: Globalize.translate("HeaderMediaFolders"),
text: globalize.translate("HeaderMediaFolders"),
state: {
opened: true
},
@ -83,7 +83,7 @@ define(["datetime", "jQuery", "material-icons"], function (datetime, $) {
if (result.TotalRecordCount) {
nodes.push({
id: "livetv",
text: Globalize.translate("HeaderLiveTV"),
text: globalize.translate("HeaderLiveTV"),
state: {
opened: false
},

View file

@ -1,4 +1,4 @@
define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryBrowser", "emby-itemscontainer", "emby-button"], function (connectionManager, listView, cardBuilder, imageLoader, libraryBrowser) {
define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryBrowser", "globalize", "emby-itemscontainer", "emby-button"], function (connectionManager, listView, cardBuilder, imageLoader, libraryBrowser, globalize) {
"use strict";
function renderItems(page, item) {
@ -6,56 +6,56 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
if (item.ArtistCount) {
sections.push({
name: Globalize.translate("TabArtists"),
name: globalize.translate("TabArtists"),
type: "MusicArtist"
});
}
if (item.ProgramCount && "Person" == item.Type) {
sections.push({
name: Globalize.translate("HeaderUpcomingOnTV"),
name: globalize.translate("HeaderUpcomingOnTV"),
type: "Program"
});
}
if (item.MovieCount) {
sections.push({
name: Globalize.translate("TabMovies"),
name: globalize.translate("TabMovies"),
type: "Movie"
});
}
if (item.SeriesCount) {
sections.push({
name: Globalize.translate("TabShows"),
name: globalize.translate("TabShows"),
type: "Series"
});
}
if (item.EpisodeCount) {
sections.push({
name: Globalize.translate("TabEpisodes"),
name: globalize.translate("TabEpisodes"),
type: "Episode"
});
}
if (item.TrailerCount) {
sections.push({
name: Globalize.translate("TabTrailers"),
name: globalize.translate("TabTrailers"),
type: "Trailer"
});
}
if (item.AlbumCount) {
sections.push({
name: Globalize.translate("TabAlbums"),
name: globalize.translate("TabAlbums"),
type: "MusicAlbum"
});
}
if (item.MusicVideoCount) {
sections.push({
name: Globalize.translate("TabMusicVideos"),
name: globalize.translate("TabMusicVideos"),
type: "MusicVideo"
});
}
@ -74,7 +74,7 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">';
html += section.name;
html += "</h2>";
html += '<a is="emby-linkbutton" href="#" class="clearLink hide" style="margin-left:1em;vertical-align:middle;"><button is="emby-button" type="button" class="raised more raised-mini noIcon">' + Globalize.translate("ButtonMore") + "</button></a>";
html += '<a is="emby-linkbutton" href="#" class="clearLink hide" style="margin-left:1em;vertical-align:middle;"><button is="emby-button" type="button" class="raised more raised-mini noIcon">' + globalize.translate("ButtonMore") + "</button></a>";
html += "</div>";
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right">';
html += "</div>";

View file

@ -155,7 +155,7 @@ export function enable() {
function attachGamepadScript(e) {
console.log("Gamepad connected! Attaching gamepadtokey.js script");
window.removeEventListener("gamepadconnected", attachGamepadScript);
require(["components/input/gamepadtokey"]);
require(["scripts/gamepadtokey"]);
}
// No need to check for gamepads manually at load time, the eventhandler will be fired for that

View file

@ -1,4 +1,4 @@
define(["userSettings"], function (userSettings) {
define(["userSettings", "globalize"], function (userSettings, globalize) {
"use strict";
var libraryBrowser = {
@ -45,7 +45,7 @@ define(["userSettings"], function (userSettings) {
var menuItems = views.map(function (v) {
return {
name: Globalize.translate("Option" + v),
name: globalize.translate("Option" + v),
id: v,
selected: currentLayout == v
};
@ -83,7 +83,7 @@ define(["userSettings"], function (userSettings) {
if (html += '<div class="listPaging">', showControls) {
html += '<span style="vertical-align:middle;">';
html += Globalize.translate("ListPaging", (totalRecordCount ? startIndex + 1 : 0), recordsEnd, totalRecordCount);
html += globalize.translate("ListPaging", (totalRecordCount ? startIndex + 1 : 0), recordsEnd, totalRecordCount);
html += "</span>";
}
@ -96,15 +96,15 @@ define(["userSettings"], function (userSettings) {
}
if (options.addLayoutButton) {
html += '<button is="paper-icon-button-light" title="' + Globalize.translate("ButtonSelectView") + '" class="btnChangeLayout autoSize" data-layouts="' + (options.layouts || "") + '" onclick="LibraryBrowser.showLayoutMenu(this, \'' + (options.currentLayout || "") + '\');"><i class="material-icons view_comfy"></i></button>';
html += '<button is="paper-icon-button-light" title="' + globalize.translate("ButtonSelectView") + '" class="btnChangeLayout autoSize" data-layouts="' + (options.layouts || "") + '" onclick="LibraryBrowser.showLayoutMenu(this, \'' + (options.currentLayout || "") + '\');"><i class="material-icons view_comfy"></i></button>';
}
if (options.sortButton) {
html += '<button is="paper-icon-button-light" class="btnSort autoSize" title="' + Globalize.translate("ButtonSort") + '"><i class="material-icons sort_by_alpha"></i></button>';
html += '<button is="paper-icon-button-light" class="btnSort autoSize" title="' + globalize.translate("ButtonSort") + '"><i class="material-icons sort_by_alpha"></i></button>';
}
if (options.filterButton) {
html += '<button is="paper-icon-button-light" class="btnFilter autoSize" title="' + Globalize.translate("ButtonFilter") + '"><i class="material-icons filter_list"></i></button>';
html += '<button is="paper-icon-button-light" class="btnFilter autoSize" title="' + globalize.translate("ButtonFilter") + '"><i class="material-icons filter_list"></i></button>';
}
html += "</div>";
@ -154,7 +154,7 @@ define(["userSettings"], function (userSettings) {
var html = "";
html += '<div style="margin:0;padding:1.25em 1.5em 1.5em;">';
html += '<h2 style="margin:0 0 .5em;">';
html += Globalize.translate("HeaderSortBy");
html += globalize.translate("HeaderSortBy");
html += "</h2>";
var i;
var length;
@ -169,13 +169,13 @@ define(["userSettings"], function (userSettings) {
html += "</div>";
html += '<h2 style="margin: 1em 0 .5em;">';
html += Globalize.translate("HeaderSortOrder");
html += globalize.translate("HeaderSortOrder");
html += "</h2>";
html += "<div>";
isChecked = "Ascending" == options.query.SortOrder ? " checked" : "";
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Ascending" class="menuSortOrder" ' + isChecked + " /><span>" + Globalize.translate("OptionAscending") + "</span></label>";
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Ascending" class="menuSortOrder" ' + isChecked + " /><span>" + globalize.translate("OptionAscending") + "</span></label>";
isChecked = "Descending" == options.query.SortOrder ? " checked" : "";
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Descending" class="menuSortOrder" ' + isChecked + " /><span>" + Globalize.translate("OptionDescending") + "</span></label>";
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Descending" class="menuSortOrder" ' + isChecked + " /><span>" + globalize.translate("OptionDescending") + "</span></label>";
html += "</div>";
html += "</div>";
dlg.innerHTML = html;

View file

@ -23,6 +23,35 @@ define([
console.debug("defining core routes");
defineRoute({
path: "/addserver.html",
autoFocus: false,
anonymous: true,
startup: true,
controller: "auth/addserver"
});
defineRoute({
path: "/selectserver.html",
autoFocus: false,
anonymous: true,
startup: true,
controller: "auth/selectserver",
type: "selectserver"
});
defineRoute({
path: "/forgotpassword.html",
anonymous: true,
startup: true,
controller: "auth/forgotpassword"
});
defineRoute({
path: "/forgotpasswordpin.html",
autoFocus: false,
anonymous: true,
startup: true,
controller: "auth/forgotpasswordpin"
});
defineRoute({
path: "/addplugin.html",
autoFocus: false,
@ -41,13 +70,6 @@ define([
transition: "fade",
controller: "user/profile"
});
defineRoute({
path: "/addserver.html",
autoFocus: false,
anonymous: true,
startup: true,
controller: "auth/addserver"
});
defineRoute({
path: "/mypreferencesdisplay.html",
autoFocus: false,
@ -95,31 +117,31 @@ define([
path: "/devices.html",
autoFocus: false,
roles: "admin",
controller: "devices"
controller: "dashboard/devices/devices"
});
defineRoute({
path: "/device.html",
autoFocus: false,
roles: "admin",
controller: "device"
controller: "dashboard/devices/device"
});
defineRoute({
path: "/dlnaprofile.html",
autoFocus: false,
roles: "admin",
controller: "dlnaprofile"
controller: "dashboard/dlna/dlnaprofile"
});
defineRoute({
path: "/dlnaprofiles.html",
autoFocus: false,
roles: "admin",
controller: "dlnaprofiles"
controller: "dashboard/dlna/dlnaprofiles"
});
defineRoute({
path: "/dlnasettings.html",
autoFocus: false,
roles: "admin",
controller: "dlnasettings"
controller: "dashboard/dlna/dlnasettings"
});
defineRoute({
path: "/edititemmetadata.html",
@ -130,20 +152,7 @@ define([
path: "/encodingsettings.html",
autoFocus: false,
roles: "admin",
controller: "encodingsettings"
});
defineRoute({
path: "/forgotpassword.html",
anonymous: true,
startup: true,
controller: "auth/forgotpassword"
});
defineRoute({
path: "/forgotpasswordpin.html",
autoFocus: false,
anonymous: true,
startup: true,
controller: "auth/forgotpasswordpin"
controller: "dashboard/encodingsettings"
});
defineRoute({
path: "/home.html",
@ -158,11 +167,6 @@ define([
controller: "list",
transition: "fade"
});
defineRoute({
path: "/index.html",
autoFocus: false,
isDefaultRoute: true
});
defineRoute({
path: "/itemdetails.html",
controller: "itemdetailpage",
@ -173,19 +177,13 @@ define([
path: "/library.html",
autoFocus: false,
roles: "admin",
controller: "medialibrarypage"
controller: "dashboard/medialibrarypage"
});
defineRoute({
path: "/librarydisplay.html",
autoFocus: false,
roles: "admin",
controller: "librarydisplay"
});
defineRoute({
path: "/librarysettings.html",
autoFocus: false,
roles: "admin",
controller: "librarysettings"
controller: "dashboard/librarydisplay"
});
defineRoute({
path: "/livetv.html",
@ -233,13 +231,13 @@ define([
path: "/metadataimages.html",
autoFocus: false,
roles: "admin",
controller: "metadataimagespage"
controller: "dashboard/metadataimagespage"
});
defineRoute({
path: "/metadatanfo.html",
autoFocus: false,
roles: "admin",
controller: "metadatanfo"
controller: "dashboard/metadatanfo"
});
defineRoute({
path: "/movies.html",
@ -265,20 +263,11 @@ define([
autoFocus: false,
roles: "admin"
});
defineRoute({
path: "/nowplaying.html",
controller: "playback/nowplaying",
autoFocus: false,
transition: "fade",
fullscreen: true,
supportsThemeMedia: true,
enableMediaControl: false
});
defineRoute({
path: "/playbackconfiguration.html",
autoFocus: false,
roles: "admin",
controller: "playbackconfiguration"
controller: "dashboard/playbackconfiguration"
});
defineRoute({
path: "/availableplugins.html",
@ -308,31 +297,23 @@ define([
path: "/search.html",
controller: "searchpage"
});
defineRoute({
path: "/selectserver.html",
autoFocus: false,
anonymous: true,
startup: true,
controller: "auth/selectserver",
type: "selectserver"
});
defineRoute({
path: "/serveractivity.html",
autoFocus: false,
roles: "admin",
controller: "serveractivity"
controller: "dashboard/serveractivity"
});
defineRoute({
path: "/apikeys.html",
autoFocus: false,
roles: "admin",
controller: "apikeys"
controller: "dashboard/apikeys"
});
defineRoute({
path: "/streamingsettings.html",
autoFocus: false,
roles: "admin",
controller: "streamingsettings"
controller: "dashboard/streamingsettings"
});
defineRoute({
path: "/tv.html",
@ -423,6 +404,15 @@ define([
fullscreen: true,
enableMediaControl: false
});
defineRoute({
path: "/nowplaying.html",
controller: "playback/nowplaying",
autoFocus: false,
transition: "fade",
fullscreen: true,
supportsThemeMedia: true,
enableMediaControl: false
});
defineRoute({
path: "/configurationpage",
autoFocus: false,
@ -436,4 +426,9 @@ define([
isDefaultRoute: true,
autoFocus: false
});
defineRoute({
path: "/index.html",
autoFocus: false,
isDefaultRoute: true
});
});

View file

@ -12,7 +12,7 @@ import events from 'events';
}
export function enableAutoLogin(val) {
if (val != null) {
if (val !== undefined) {
this.set('enableAutoLogin', val.toString());
}
@ -20,7 +20,7 @@ import events from 'events';
}
export function enableSystemExternalPlayers(val) {
if (val !== null) {
if (val !== undefined) {
this.set('enableSystemExternalPlayers', val.toString());
}
@ -29,7 +29,7 @@ import events from 'events';
export function enableAutomaticBitrateDetection(isInNetwork, mediaType, val) {
var key = 'enableautobitratebitrate-' + mediaType + '-' + isInNetwork;
if (val != null) {
if (val !== undefined) {
if (isInNetwork && mediaType === 'Audio') {
val = true;
}
@ -46,7 +46,7 @@ import events from 'events';
export function maxStreamingBitrate(isInNetwork, mediaType, val) {
var key = 'maxbitrate-' + mediaType + '-' + isInNetwork;
if (val != null) {
if (val !== undefined) {
if (isInNetwork && mediaType === 'Audio') {
// nothing to do, this is always a max value
} else {
@ -72,7 +72,7 @@ import events from 'events';
}
export function maxChromecastBitrate(val) {
if (val != null) {
if (val !== undefined) {
this.set('chromecastBitrate1', val);
}
@ -81,7 +81,7 @@ import events from 'events';
}
export function syncOnlyOnWifi(val) {
if (val != null) {
if (val !== undefined) {
this.set('syncOnlyOnWifi', val.toString());
}
@ -89,7 +89,7 @@ import events from 'events';
}
export function syncPath(val) {
if (val != null) {
if (val !== undefined) {
this.set('syncPath', val);
}
@ -97,7 +97,7 @@ import events from 'events';
}
export function cameraUploadServers(val) {
if (val != null) {
if (val !== undefined) {
this.set('cameraUploadServers', val.join(','));
}
@ -110,7 +110,7 @@ import events from 'events';
}
export function runAtStartup(val) {
if (val != null) {
if (val !== undefined) {
this.set('runatstartup', val.toString());
}

View file

@ -84,7 +84,7 @@ import events from 'events';
}
export function enableCinemaMode(val) {
if (val != null) {
if (val !== undefined) {
return this.set('enableCinemaMode', val.toString(), false);
}
@ -93,7 +93,7 @@ import events from 'events';
}
export function enableNextVideoInfoOverlay(val) {
if (val != null) {
if (val !== undefined) {
return this.set('enableNextVideoInfoOverlay', val.toString());
}
@ -102,7 +102,7 @@ import events from 'events';
}
export function enableThemeSongs(val) {
if (val != null) {
if (val !== undefined) {
return this.set('enableThemeSongs', val.toString(), false);
}
@ -111,7 +111,7 @@ import events from 'events';
}
export function enableThemeVideos(val) {
if (val != null) {
if (val !== undefined) {
return this.set('enableThemeVideos', val.toString(), false);
}
@ -120,7 +120,7 @@ import events from 'events';
}
export function enableFastFadein(val) {
if (val != null) {
if (val !== undefined) {
return this.set('fastFadein', val.toString(), false);
}
@ -129,7 +129,7 @@ import events from 'events';
}
export function enableBackdrops(val) {
if (val != null) {
if (val !== undefined) {
return this.set('enableBackdrops', val.toString(), false);
}
@ -138,7 +138,7 @@ import events from 'events';
}
export function language(val) {
if (val != null) {
if (val !== undefined) {
return this.set('language', val.toString(), false);
}
@ -146,7 +146,7 @@ import events from 'events';
}
export function dateTimeLocale(val) {
if (val != null) {
if (val !== undefined) {
return this.set('datetimelocale', val.toString(), false);
}
@ -154,7 +154,7 @@ import events from 'events';
}
export function skipBackLength(val) {
if (val != null) {
if (val !== undefined) {
return this.set('skipBackLength', val.toString());
}
@ -162,7 +162,7 @@ import events from 'events';
}
export function skipForwardLength(val) {
if (val != null) {
if (val !== undefined) {
return this.set('skipForwardLength', val.toString());
}
@ -170,7 +170,7 @@ import events from 'events';
}
export function dashboardTheme(val) {
if (val != null) {
if (val !== undefined) {
return this.set('dashboardTheme', val);
}
@ -178,7 +178,7 @@ import events from 'events';
}
export function skin(val) {
if (val != null) {
if (val !== undefined) {
return this.set('skin', val, false);
}
@ -186,7 +186,7 @@ import events from 'events';
}
export function theme(val) {
if (val != null) {
if (val !== undefined) {
return this.set('appTheme', val, false);
}
@ -194,7 +194,7 @@ import events from 'events';
}
export function screensaver(val) {
if (val != null) {
if (val !== undefined) {
return this.set('screensaver', val, false);
}
@ -202,7 +202,7 @@ import events from 'events';
}
export function libraryPageSize(val) {
if (val != null) {
if (val !== undefined) {
return this.set('libraryPageSize', parseInt(val, 10), false);
}
@ -216,7 +216,7 @@ import events from 'events';
}
export function soundEffects(val) {
if (val != null) {
if (val !== undefined) {
return this.set('soundeffects', val, false);
}

View file

@ -11,5 +11,8 @@ function getConfig() {
export function enableMultiServer() {
return getConfig().then(config => {
return config.multiserver;
}).catch(error => {
console.log("cannot get web config:", error);
return false;
});
}

View file

@ -371,8 +371,9 @@ var AppInfo = {};
function initRequireWithBrowser(browser) {
var bowerPath = getBowerPath();
var componentsPath = getComponentsPath();
var scriptsPath = getScriptsPath();
define("filesystem", [componentsPath + "/filesystem"], returnFirstDependency);
define("filesystem", [scriptsPath + "/filesystem"], returnFirstDependency);
define("lazyLoader", [componentsPath + "/lazyloader/lazyloader-intersectionobserver"], returnFirstDependency);
define("shell", [componentsPath + "/shell"], returnFirstDependency);
@ -416,9 +417,6 @@ var AppInfo = {};
if (!window.fetch) {
promises.push(require(["fetch"]));
}
if ("function" != typeof Object.assign) {
promises.push(require(["objectassign"]));
}
Promise.all(promises).then(function () {
createConnectionManager().then(function () {
@ -556,7 +554,7 @@ var AppInfo = {};
require(["playerSelectionMenu", "components/playback/remotecontrolautoplay"]);
}
require(["components/screensavermanager"]);
require(["libraries/screensavermanager"]);
if (!appHost.supports("physicalvolumecontrol") || browser.touch) {
require(["components/playback/volumeosd"]);
@ -648,7 +646,7 @@ var AppInfo = {};
medialibraryeditor: componentsPath + "/medialibraryeditor/medialibraryeditor",
imageoptionseditor: componentsPath + "/imageoptionseditor/imageoptionseditor",
apphost: componentsPath + "/apphost",
visibleinviewport: componentsPath + "/visibleinviewport",
visibleinviewport: bowerPath + "/visibleinviewport",
qualityoptions: componentsPath + "/qualityoptions",
focusManager: componentsPath + "/focusManager",
itemHelper: componentsPath + "/itemhelper",
@ -702,6 +700,7 @@ var AppInfo = {};
onError: onRequireJsError
});
require(["fetch"]);
require(["polyfill"]);
require(["fast-text-encoding"]);
require(["intersection-observer"]);
@ -753,8 +752,8 @@ var AppInfo = {};
// TODO remove these libraries
// all of these have been modified so we need to fix that first
define("scroller", [componentsPath + "/scroller"], returnFirstDependency);
define("navdrawer", [componentsPath + "/navdrawer/navdrawer"], returnFirstDependency);
define("scroller", [bowerPath + "/scroller"], returnFirstDependency);
define("navdrawer", [bowerPath + "/navdrawer/navdrawer"], returnFirstDependency);
define("emby-button", [elementsPath + "/emby-button/emby-button"], returnFirstDependency);
define("paper-icon-button-light", [elementsPath + "/emby-button/paper-icon-button-light"], returnFirstDependency);
@ -794,7 +793,7 @@ var AppInfo = {};
define("playerSettingsMenu", [componentsPath + "/playback/playersettingsmenu"], returnFirstDependency);
define("playMethodHelper", [componentsPath + "/playback/playmethodhelper"], returnFirstDependency);
define("brightnessOsd", [componentsPath + "/playback/brightnessosd"], returnFirstDependency);
define("alphaNumericShortcuts", [componentsPath + "/alphanumericshortcuts/alphanumericshortcuts"], returnFirstDependency);
define("alphaNumericShortcuts", [scriptsPath + "/alphanumericshortcuts"], returnFirstDependency);
define("multiSelect", [componentsPath + "/multiselect/multiselect"], returnFirstDependency);
define("alphaPicker", [componentsPath + "/alphapicker/alphapicker"], returnFirstDependency);
define("tabbedView", [componentsPath + "/tabbedview/tabbedview"], returnFirstDependency);
@ -816,7 +815,7 @@ var AppInfo = {};
define("itemContextMenu", [componentsPath + "/itemcontextmenu"], returnFirstDependency);
define("imageEditor", [componentsPath + "/imageeditor/imageeditor"], returnFirstDependency);
define("imageDownloader", [componentsPath + "/imagedownloader/imagedownloader"], returnFirstDependency);
define("dom", [componentsPath + "/dom"], returnFirstDependency);
define("dom", [scriptsPath + "/dom"], returnFirstDependency);
define("playerStats", [componentsPath + "/playerstats/playerstats"], returnFirstDependency);
define("searchFields", [componentsPath + "/search/searchfields"], returnFirstDependency);
define("searchResults", [componentsPath + "/search/searchresults"], returnFirstDependency);
@ -846,8 +845,7 @@ var AppInfo = {};
return viewManager;
});
define("slideshow", [componentsPath + "/slideshow/slideshow"], returnFirstDependency);
define("objectassign", [componentsPath + "/polyfills/objectassign"], returnFirstDependency);
define("focusPreventScroll", [componentsPath + "/polyfills/focusPreventScroll"], returnFirstDependency);
define("focusPreventScroll", ["legacy/focusPreventScroll"], returnFirstDependency);
define("userdataButtons", [componentsPath + "/userdatabuttons/userdatabuttons"], returnFirstDependency);
define("listView", [componentsPath + "/listview/listview"], returnFirstDependency);
define("indicators", [componentsPath + "/indicators/indicators"], returnFirstDependency);
@ -865,8 +863,8 @@ var AppInfo = {};
define("dialogHelper", [componentsPath + "/dialogHelper/dialogHelper"], returnFirstDependency);
define("serverNotifications", [componentsPath + "/serverNotifications"], returnFirstDependency);
define("skinManager", [componentsPath + "/skinManager"], returnFirstDependency);
define("keyboardnavigation", [componentsPath + "/input/keyboardnavigation"], returnFirstDependency);
define("mouseManager", [componentsPath + "/input/mouseManager"], returnFirstDependency);
define("keyboardnavigation", [scriptsPath + "/keyboardnavigation"], returnFirstDependency);
define("mouseManager", [scriptsPath + "/mouseManager"], returnFirstDependency);
define("scrollManager", [componentsPath + "/scrollManager"], returnFirstDependency);
define("autoFocuser", [componentsPath + "/autoFocuser"], returnFirstDependency);
define("connectionManager", [], function () {

View file

@ -1,4 +1,4 @@
define(["events", "userSettings", "serverNotifications", "connectionManager", "emby-button"], function (events, userSettings, serverNotifications, connectionManager) {
define(["events", "userSettings", "serverNotifications", "connectionManager", "globalize", "emby-button"], function (events, userSettings, serverNotifications, connectionManager, globalize) {
"use strict";
return function (options) {
@ -48,11 +48,11 @@ define(["events", "userSettings", "serverNotifications", "connectionManager", "e
var lastResult = task.LastExecutionResult ? task.LastExecutionResult.Status : '';
if (lastResult == "Failed") {
options.lastResultElem.html('<span style="color:#FF0000;">(' + Globalize.translate('LabelFailed') + ')</span>');
options.lastResultElem.html('<span style="color:#FF0000;">(' + globalize.translate('LabelFailed') + ')</span>');
} else if (lastResult == "Cancelled") {
options.lastResultElem.html('<span style="color:#0026FF;">(' + Globalize.translate('LabelCancelled') + ')</span>');
options.lastResultElem.html('<span style="color:#0026FF;">(' + globalize.translate('LabelCancelled') + ')</span>');
} else if (lastResult == "Aborted") {
options.lastResultElem.html('<span style="color:#FF0000;">' + Globalize.translate('LabelAbortedByServerShutdown') + '</span>');
options.lastResultElem.html('<span style="color:#FF0000;">' + globalize.translate('LabelAbortedByServerShutdown') + '</span>');
} else {
options.lastResultElem.html(lastResult);
}

View file

@ -40,5 +40,6 @@
"Add": "Voeg by",
"Actor": "Akteur",
"AccessRestrictedTryAgainLater": "Toegang is beperk. Probeer weer later .",
"Absolute": "Absoluut"
"Absolute": "Absoluut",
"AlbumArtist": "Album Kunstenaar"
}

View file

@ -86,17 +86,17 @@
"ChannelAccessHelp": "Изберете каналите, които да споделите с потребителя. Администраторите ще могат да редактират всички канали, използвайки управлението на метаданни.",
"Collections": "Колекции",
"ColorSpace": "Цветово пространство",
"CommunityRating": "Обществена ощенка",
"CommunityRating": "Рейтинг на общността",
"Composer": "Съчинител",
"ConfirmDeleteImage": "Изтриване на изображението?",
"ContinueWatching": "Продължаване на гледането",
"ContinueWatching": "Продължи гледането",
"Continuing": "Продължаващо",
"CriticRating": "Оценка на критиците",
"DateAdded": "Дата на добавяне",
"DatePlayed": "Дата на пускане",
"DeathDateValue": "Починал/а на: {0}",
"Default": "По подразбиране",
"Delete": "Изтриване",
"Delete": "Премахване",
"DeleteMedia": "Изтриване на медията",
"Desktop": "Работен плот",
"DeviceAccessHelp": "Това се отнася само за устройства, които могат да бъдат различени и няма да попречи на достъп от мрежов четец. Филтрирането на потребителски устройства ще предотврати използването им докато не бъдат одобрени тук.",
@ -305,7 +305,7 @@
"LabelCustomCertificatePath": "Път към потребителския сертификат:",
"LabelCustomCertificatePathHelp": "Път до файл с шифровъчен стандарт №12 (PKCS #12), съдържащ сертификат и частен ключ за поддръжка на протокол TLS на собствен домейн.",
"LabelCustomCss": "CSS по избор:",
"LabelCustomCssHelp": "Добавете собствен стил за Уеб-интерфейса.",
"LabelCustomCssHelp": "Добавете собствен стил към уеб-интерфейса.",
"LabelCustomDeviceDisplayName": "Показвано име:",
"LabelCustomRating": "Оценка по избор:",
"LabelDashboardTheme": "Облик на сървърното табло:",
@ -836,7 +836,7 @@
"AddItemToCollectionHelp": "Добавяне към колекция чрез търсенето им и използване на дясно-щракване с мишката или контекстното меню.",
"Absolute": "Aбсолютен",
"LabelLanNetworks": "Локални мрежи:",
"LabelKodiMetadataSaveImagePathsHelp": "Това е препоръчително ако имате изображения, пътят към които не е съобразен с изискванията на Kodi",
"LabelKodiMetadataSaveImagePathsHelp": "Това е препоръчително, ако наименованието на изображенията не са съобразени с изискванията на Kodi.",
"LabelKodiMetadataSaveImagePaths": "Записване на пътеките към изображенията в nfo файловете",
"LabelChannels": "Канали:",
"DropShadow": "Сянка",
@ -878,5 +878,30 @@
"BoxRear": "Комплект (стар)",
"BoxSet": "Комплект",
"AuthProviderHelp": "Избор на доставчик на услуга за Автентификация, която ще се използва за автентификация на потребителската парола.",
"AllowedRemoteAddressesHelp": "Списък с IP адреси или IP/маска записи, разделени със запетая, които ще имат отдалечен достъп. Ако полето не е попълнено всички адреси ще имат отдалечен достъп."
"AllowedRemoteAddressesHelp": "Списък с IP адреси или IP/маска записи, разделени със запетая, които ще имат отдалечен достъп. Ако полето не е попълнено всички адреси ще имат отдалечен достъп.",
"BurnSubtitlesHelp": "Определя дали сървърът трябва да записва субтитри във видеоклиповете припрекодиране. Избягването на това значително ще подобри производителността. Изберете Auto, за да запишете формати, базирани на изображения (VOBSUB, PGS, SUB, IDX) и някои ASS или SSA субтитри.",
"AllowFfmpegThrottlingHelp": "Когато прекодирането или запазването на видео стигне достатъчно далеч напред от текущата позиция за възпроизвеждане, поставете на пауза процеса, така ще се изразходват по-малко ресурси. Това е най-полезно, когато се гледа, без да се търси често из видеото. Изключете това, ако имате проблеми с възпроизвеждането.",
"AllowOnTheFlySubtitleExtractionHelp": "Вградените субтитри могат да бъдат извлечени от видеоклиповете и прехвърлени към клиентите като обикновен текст, за да се предотврати транскодирането на видеото. В някои системи това може да отнеме много време и да спре възпроизвеждането на видео по време на процеса на извличане. Деактивирайте това, за да има вградени субтитри, записани с видео кодиране, когато те не се поддържат от клиентското устройство.",
"CinemaModeConfigurationHelp": "Режимът на кино носи театрално изживяване направо във вашата всекидневна с възможност за пускане на трейлъри и персонализирани интродукции преди основния филм.",
"ChangingMetadataImageSettingsNewContent": "Промените в настройките за изтегляне на метаданни или изображения ще се прилагат само за ново съдържание, добавено към вашата библиотека. За да приложите промените към съществуващите заглавия, ще трябва да обновите метаданните им ръчно.",
"DefaultMetadataLangaugeDescription": "Това са настройки по подразбиране и могат да се променят на база библиотека.",
"DefaultErrorMessage": "Възникна грешка при изпълнение на заявката. Моля опитайте по-късно.",
"CustomDlnaProfilesHelp": "Създаване на персонализиран профил за целево устройство или заменяне на системния профил.",
"CopyStreamURL": "Копиране URL на стрийма",
"CopyStreamURLError": "Възникна грешка при копиране на URL.",
"CopyStreamURLSuccess": "URL се копира успешно.",
"Connect": "Свързване",
"ConfirmEndPlayerSession": "Искате ли да изключите Jellyfin на {0}?",
"ConfirmDeletion": "Потвърждаване на изтриването",
"ConfirmDeleteItem": "Изтриването на елемента ще го премахне едновременно от файловата система и библиотеката. Сигурни ли сте, че искате да продължите?",
"ConfigureDateAdded": "Конфигурацията на добавянето на датата се определя в панела на Jellyfin сървъра в секцията за настройка на библиотека",
"ConfirmDeleteItems": "Изтриването на елементите ще ги премахне едновременно от файловата система и библиотеката. Сигурни ли сте, че искате да продължите?",
"ColorTransfer": "Предаване на цвета",
"ColorPrimaries": "Основни цветове",
"DeleteUserConfirmation": "Сигурнили сте че искате да премахнете този потребител?",
"DeleteUser": "Премахване на потребител",
"DeleteImageConfirmation": "Сигурнили сте че искате да премахнете това Изображение?",
"DeleteImage": "Премахване на Исображение",
"ButtonTogglePlaylist": "Списък с изпълнения",
"ButtonToggleContextMenu": "Повече"
}

View file

@ -1603,5 +1603,6 @@
"LabelLibraryPageSize": "Velikost stránky knihovny:",
"LabelDeinterlaceMethod": "Metoda odstranění prokládání:",
"DeinterlaceMethodHelp": "Vyberte metodu odstranění prokládání obrazu při překódování obsahu.",
"UnsupportedPlayback": "Jellyfin nemůže dešifrovat obsah chráněný technologií DRM, ale pokusí se zobrazit o veškerý obsah, včetně chráněných titulů. Některé soubory se mohou zdát úplně černé kvůli šifrování nebo jiným nepodporovaným funkcím, jako jsou například interaktivní funkce."
"UnsupportedPlayback": "Jellyfin nemůže dešifrovat obsah chráněný technologií DRM, ale pokusí se zobrazit o veškerý obsah, včetně chráněných titulů. Některé soubory se mohou zdát úplně černé kvůli šifrování nebo jiným nepodporovaným funkcím, jako jsou například interaktivní funkce.",
"MessageUnauthorizedUser": "Momentálně nemáte oprávnění k přístupu na server. Další informace získáte od správce serveru."
}

View file

@ -12,7 +12,7 @@
"AllChannels": "Alle kanaler",
"AllEpisodes": "Alle episoder",
"AllLibraries": "Alle biblioteker",
"AllowHWTranscodingHelp": "Lader tuneren omkode streams on-the-fly. Dette kan hjælpe med at reducere omkodning der kræves af serveren.",
"AllowHWTranscodingHelp": "Tillader tuneren at omkode streaming on-the-fly. Dette kan hjælpe med at reducere belastning af serveren på grund af yderligere omkodning.",
"AllowMediaConversion": "Tillad media konvertering",
"AllowMediaConversionHelp": "Giv eller nægt adgang til Konvertér Media featuren.",
"AllowOnTheFlySubtitleExtraction": "Tillad udtræk af undertekster on-the-fly",
@ -1539,7 +1539,7 @@
"Album": "Album",
"EveryHour": "Hver time",
"EveryXMinutes": "Hvert {0} minut",
"OnWakeFromSleep": "Når du vågner fra søvn",
"OnWakeFromSleep": "Ved vækning fra dvale",
"WeeklyAt": "{0}s ved {1}",
"DailyAt": "Dagligt kl. {0}",
"LastSeen": "Sidst set {0}",
@ -1585,7 +1585,7 @@
"MediaInfoStreamTypeEmbeddedImage": "Indlejret billede",
"MediaInfoStreamTypeAudio": "Lyd",
"LaunchWebAppOnStartupHelp": "Åben web klienten i den standard web browser når serveren starter første gang. Dette vil ikke ske når restart server funktionen benyttes.",
"LaunchWebAppOnStartup": "Åben webinterfacet når serveren startes",
"LaunchWebAppOnStartup": "Åben webinterfacet når serveren startes",
"LabelWeb": "Web:",
"LabelVideoResolution": "Videoopløsning:",
"LabelVideoBitrate": "Video bitrate:",
@ -1633,9 +1633,11 @@
"ClientSettings": "Klient Indstillinger",
"ButtonSplit": "Opdel",
"BoxSet": "Box Set",
"AuthProviderHelp": "Vælg en godkendelse udbyder, der skal bruges til at godkende denne brugers adgangskode.",
"AuthProviderHelp": "Vælg en godkendelses udbyder, der kan bruges til at godkende denne brugers adgangskode.",
"AskAdminToCreateLibrary": "Spørg en administrator om at oprette et bibliotek.",
"Artist": "Artist",
"EveryXHours": "Hver {0} time",
"OnApplicationStartup": "Ved programstart"
"OnApplicationStartup": "Ved programstart",
"UnsupportedPlayback": "Jellyfin kan ikke dekryptere indhold, der er beskyttet af DRM, men alt indhold vil blive forsøgt afspillet uanset, inklusive beskyttede titler. Nogle filer kan eventuelt vises med sort skærm på grund af kryptering eller andre funktioner, der ikke understøttes, såsom interaktive titler.",
"MessageUnauthorizedUser": "Du har ikke tilladelse til at tilgå serveren på dette tidspunkt. Kontakt din serveradministrator for mere information."
}

View file

@ -10,7 +10,7 @@
"AdditionalNotificationServices": "Περιηγηθείτε στον κατάλογο plugin για να εγκαταστήσετε πρόσθετες υπηρεσίες ειδοποίησης.",
"AirDate": "Ημερομηνία προβολής",
"Aired": "Προβλήθηκε",
"Albums": "Άλμπουμ",
"Albums": "Άλμπουμς",
"All": "Όλα",
"AllChannels": "Όλα τα κανάλια",
"AllComplexFormats": "Όλες οι σύνθετες μορφές (ASS, SSA, VOBSUB, PGS, SUB / IDX κ.λπ.)",
@ -19,7 +19,7 @@
"AllLibraries": "Όλες οι βιβλιοθήκες",
"AllowRemoteAccess": "Να επιτρέπονται οι απομακρυσμένες συνδέσεις σε αυτόν το διακομιστή Jellyfin.",
"AllowRemoteAccessHelp": "Εάν δεν επιλεχθεί, όλες οι απομακρυσμένες συνδέσεις θα αποκλειστούν.",
"AlwaysPlaySubtitles": άντα αναπαραγωγή Υποτίτλων",
"AlwaysPlaySubtitles": αίξτε πάντα",
"AlwaysPlaySubtitlesHelp": "Οι υπότιτλοι που ταιριάζουν με τις προτιμήσεις γλώσσας θα φορτωθούν ανεξάρτητα από τη γλώσσα του ήχου.",
"AnyLanguage": "Οποιαδήποτε γλώσσα",
"Anytime": "Οποτεδήποτε",
@ -28,7 +28,7 @@
"Artists": "Καλλιτέχνες",
"AsManyAsPossible": "Οσο το δυνατον περισσοτερα",
"Ascending": "Αύξουσα",
"AspectRatio": "Αρχικός λόγος διαστάσεων",
"AspectRatio": "Αναλογία απεικόνισης",
"AttributeNew": "Νέο",
"Audio": "Ήχος",
"Auto": "Αυτόματο",
@ -1224,6 +1224,14 @@
"LabelServerName": "Όνομα Διακομιστή:",
"ButtonAddImage": "Προσθήκη Εικόνας",
"BoxRear": "Κουτί(πίσω)",
"BookLibraryHelp": "Ήχος και βιβλία υποστηρίζονται.Ελέγξτε τον {0}ονομαστικό οδηγό βιβλίων{1}.",
"AuthProviderHelp": "Επιλέξτε ένα Πάροχο Επαλήθευσης για να επαληθεύσετε το κωδικό αυτού του χρήστη."
"BookLibraryHelp": "Υποστήριξη ήχου και βιβλίων κειμένου. Εξετάστε τον {0}οδηγό ονομάτων βιβλίου{1}.",
"AuthProviderHelp": "Επιλέξτε ένα Πάροχο Επαλήθευσης για να επαληθεύσετε το κωδικό αυτού του χρήστη.",
"AllowFfmpegThrottling": "Επιτάχυνση Διακωδικοποιησής",
"AlbumArtist": "Άλμπουμ Καλλιτέχνη",
"Album": "Άλμπουμ",
"BoxSet": "Σετ Κουτιού",
"AskAdminToCreateLibrary": "Ζητήστε από έναν διαχειριστή να δημιουργήσει μια βιβλιοθήκη.",
"Artist": "Καλλιτέχνης",
"AllowedRemoteAddressesHelp": "Λίστα διαχωρισμένων διευθύνσεων IP ή καταχωρίσεων IP / netmask για δίκτυα που θα επιτρέπεται η σύνδεση εξ αποστάσεως. Εάν αφεθεί κενό, όλες οι απομακρυσμένες διευθύνσεις θα επιτρέπονται.",
"AllowFfmpegThrottlingHelp": "Όταν ένας διακωδικοποιητής ή remux φτάσει αρκετά μπροστά από την τρέχουσα θέση αναπαραγωγής, διακόψτε τη διαδικασία ώστε να καταναλώσει λιγότερους πόρους. Αυτό είναι πιο χρήσιμο όταν παρακολουθείτε χωρίς να αναζητάτε συχνά. Απενεργοποιήστε το εάν αντιμετωπίζετε προβλήματα αναπαραγωγής."
}

View file

@ -385,6 +385,7 @@
"HeaderFavoriteArtists": "Favourite Artists",
"HeaderFavoriteSongs": "Favourite Songs",
"HeaderFavoriteVideos": "Favourite Videos",
"HeaderFavoritePlaylists": "Favourite Playlists",
"HeaderFeatureAccess": "Feature Access",
"HeaderFeatures": "Features",
"HeaderFetchImages": "Fetch Images:",
@ -527,6 +528,8 @@
"Smart": "Smart",
"SimultaneousConnectionLimitHelp": "The maximum number of allowed simultaneous streams. Enter 0 for no limit.",
"Shuffle": "Shuffle",
"New": "New",
"Filter": "Filter",
"ShowYear": "Show year",
"ShowIndicatorsFor": "Show indicators for:",
"ShowAdvancedSettings": "Show advanced settings",

View file

@ -137,6 +137,8 @@
"ButtonSplit": "Split",
"ButtonSubmit": "Submit",
"ButtonSubtitles": "Subtitles",
"ButtonToggleContextMenu": "More",
"ButtonTogglePlaylist": "Playlist",
"ButtonTrailer": "Trailer",
"ButtonUninstall": "Uninstall",
"ButtonUp": "Up",
@ -368,6 +370,7 @@
"HeaderFavoriteArtists": "Favorite Artists",
"HeaderFavoriteSongs": "Favorite Songs",
"HeaderFavoriteVideos": "Favorite Videos",
"HeaderFavoritePlaylists": "Favorite Playlists",
"HeaderFeatureAccess": "Feature Access",
"HeaderFeatures": "Features",
"HeaderFetchImages": "Fetch Images:",
@ -1335,6 +1338,8 @@
"ShowYear": "Show year",
"Shows": "Shows",
"Shuffle": "Shuffle",
"New": "New",
"Filter": "Filter",
"SimultaneousConnectionLimitHelp": "The maximum number of allowed simultaneous streams. Enter 0 for no limit.",
"SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library",
"SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.",

View file

@ -499,5 +499,6 @@
"HeaderDeleteItems": "Eliminar ítems",
"HeaderDeleteItem": "Eliminar ítem",
"HeaderDeleteDevice": "Eliminar dispositivo",
"HeaderDefaultRecordingSettings": "Ajustes de grabación por defecto"
"HeaderDefaultRecordingSettings": "Ajustes de grabación por defecto",
"UnsupportedPlayback": "Jellyfin no puede descifrar contenido protegido por DRM pero a pesar de esto lo intentará con todo el contenido, incluyendo títulos protegidos. Algunos archivos pueden aparecer completamente en negro por estar cifrados o por otras características no soportadas, como títulos interactivos."
}

View file

@ -1508,5 +1508,7 @@
"UnsupportedPlayback": "No es posible desencriptar contenido protegido mediante DRM; sin embargo se intentará su reproducción. Algunos archivos pueden aparecer completamente negros debido a encriptación u otras características no soportadas, como títulos interactivos.",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
"MessageUnauthorizedUser": "No tiene autorización para acceder al servidor en este momento. Póngase en contacto con el administrador del servidor para obtener más información."
"MessageUnauthorizedUser": "No tiene autorización para acceder al servidor en este momento. Póngase en contacto con el administrador del servidor para obtener más información.",
"ButtonTogglePlaylist": "Lista de reproducción",
"ButtonToggleContextMenu": "Más"
}

View file

@ -106,7 +106,7 @@
"TabProfiles": "پروفایل ها",
"TabShows": "سریال ها",
"TabSongs": "آهنگ ها",
"TabSuggestions": "پیشنهادات",
"TabSuggestions": "پیشنهادها",
"TabUpcoming": "بزودی",
"TellUsAboutYourself": "در مورد خودتان به ما بگویید",
"ThisWizardWillGuideYou": "این عمل برای انجام تنظیمات به شما کمک می‌کند. برای شروع، لطفا زبان مورد نظر خود را انتخاب کنید.",
@ -163,7 +163,7 @@
"ButtonNextTrack": "ترانه پسین",
"ButtonPreviousTrack": "ترانه پیشین",
"ButtonPause": "مکث",
"ButtonParentalControl": "کنترل والدین",
"ButtonParentalControl": "رتبه بندی والدین",
"ButtonOpen": "باز",
"ButtonOff": "خاموش",
"ButtonNetwork": "شبکه",
@ -613,5 +613,62 @@
"AlwaysPlaySubtitlesHelp": "زیرنویس‌های متناسب با توجه به اولویت زبان بدون در نظر گرفتن زبان صوتی ویدیو پخش می شوند.",
"AllowedRemoteAddressesHelp": "لیستی از آدرس های IP یا ورودی‌های IP/netmask برای شبکه هایی که به آنها امکان ارتباط از راه دور داده می‌شود ، با کاما از هم جدا شدند. در صورت خالی ماندن ، تمام آدرسهای راه دور مجاز خواهند بود.",
"AllowOnTheFlySubtitleExtractionHelp": "زیرنویس های جاسازی شده را می‌توان از فیلم‌ها استخراج کرد و به منظور جلوگیری از کدگذاری فیلم ، به صورت متن ساده به بازدید کننده ارسال کرد. در بعضی از سیستم‌ها این می‌تواند مدت زیادی طول بکشد و باعث شود پخش فیلم در طول فرآیند استخراج متوقف شود. این گزینه را غیرفعال کنید تا زیرنویس‌های جاسازی شده با استفاده از رمزگذاری ویدیو در حالی که به طور محلی توسط دستگاه بازدیدکننده پشتیبانی نمی‌شوند ارسال شود.",
"AdditionalNotificationServices": "برای نصب سرویس‌های اعلان اضافی، در فروشگاه افزونه‌ها جستجو کنید."
"AdditionalNotificationServices": "برای نصب سرویس‌های اعلان اضافی، در فروشگاه افزونه‌ها جستجو کنید.",
"OptionThumbCard": "کارت بندانگشتی",
"OptionThumb": "بندانگشتی",
"OptionThursday": "پنجشنبه",
"OptionSunday": "یکشنبه",
"OptionSubstring": "زیررشته",
"OptionSpecialEpisode": "ویژه‌ها",
"OptionSaveMetadataAsHidden": "ذخیره فراداده‌ها و عکس‌ها به عنوان فایل‌های پنهان",
"OptionSaturday": "شنبه",
"OptionRuntime": "زمان اجرا",
"OptionResumable": "قابل از سرگیری",
"OptionResElement": "عنصر res",
"OptionReleaseDate": "تاریخ انتشار",
"OptionRegex": "عبارت منظم",
"OptionRandom": "تصادفی",
"OptionProtocolHttp": "HTTP",
"OptionProtocolHls": "پخش مستقیم HTTP",
"OptionProfileVideoAudio": "صوتی تصویری",
"OptionProfilePhoto": "عکس",
"OptionProfileAudio": "صدا",
"OptionPremiereDate": "تاریخ پخش",
"OptionPosterCard": "کارتِ پوستر",
"OptionPoster": "پوستر",
"OptionPlayCount": "تعداد پخش",
"OptionPlainVideoItems": "نمایش همه فیلم‌ها به عنوان موارد ویدیویی ساده",
"OptionPlainStorageFolders": "نمایش همه پوشه‌ها به عنوان پوشه‌های ذخیره سازی ساده",
"OptionParentalRating": "رتبه بندی والدین",
"OptionOnInterval": "در یک فاصله",
"BookLibraryHelp": "کتاب‌های صوتی و متنی پشتیبانی می‌شوند. {0}راهنمای نامگذاری کتاب{1} را مرور کنید.",
"TabInfo": "اطلاعات",
"TabGuide": "راهنما",
"TabFavorites": "مورد علاقه‌ها",
"TabDisplay": "نمایش",
"TabDirectPlay": "پخش مستقیم",
"TabDevices": "دستگاه‌ها",
"TabDashboard": "داشبورد",
"TabCollections": "مجموعه‌ها",
"TabCodecs": "کدک‌ها",
"TabChannels": "کانال‌ها",
"TabCatalog": "فهرست",
"TV": "تلویزیون",
"Sunday": "یکشنبه",
"TabTranscoding": "کدگذاری",
"TabTrailers": "تریلرها",
"Suggestions": "پیشنهادها",
"Subtitles": "زیرنویس‌ها",
"Studios": "استودیو‌ها",
"StopRecording": "توقف ضبط",
"Sports": "ورزش‌ها",
"SortName": "مرتب سازی نام",
"SortChannelsBy": "مرتب سازی کانال‌ها بر اساس:",
"SortByValue": "مرتب شده بر اساس {0}",
"Sort": "مرتب سازی",
"Smart": "باهوش",
"Smaller": "کوچکتر",
"Small": "کوچک",
"ButtonTogglePlaylist": "لیست پخش",
"ButtonToggleContextMenu": "بیشتر"
}

View file

@ -4,7 +4,7 @@
"ButtonAddUser": "Lisää Käyttäjä",
"ButtonCancel": "Peruuta",
"ButtonDeleteImage": "Poista Kuva",
"ButtonResetPassword": "Uusi Salasana",
"ButtonResetPassword": "Nollaa salasana",
"ButtonSave": "Tallenna",
"ButtonSignOut": "Sign out",
"Delete": "Poista",
@ -15,16 +15,16 @@
"FileNotFound": "Tiedostoa ei löydy.",
"FileReadCancelled": "Tiedoston luku on peruutettu.",
"FileReadError": "Virhe tiedoston luvun aikana.",
"FolderTypeTvShows": "TV",
"FolderTypeTvShows": "TV-sarjat",
"HeaderCreatePassword": "Luo Salasana:",
"HeaderParentalRating": "Parental Rating",
"HeaderSeries": "Jaksot",
"HeaderSeries": "Sarjat",
"HeaderYear": "Year:",
"LabelAudioLanguagePreference": "Äänen ensisijainen kieli:",
"LabelConfigureSettings": "Muuta asetuksia",
"LabelCountry": "Maa:",
"LabelCurrentPassword": "Tämän hetkinen salsana:",
"LabelDisplayMissingEpisodesWithinSeasons": "Näytä puuttuvat jaksot tuotantokausissa",
"LabelDisplayMissingEpisodesWithinSeasons": "Näytä puuttuvat jaksot kausien sisällä",
"LabelDownloadInternetMetadata": "Lataa kuvamateriaali ja metadata internetistä",
"LabelFinish": "Valmis",
"LabelFolderType": "Kansion tyyppi:",
@ -34,22 +34,22 @@
"LabelNewPasswordConfirm": "Uuden salasanan varmistus:",
"LabelNext": "Seuraava",
"LabelPrevious": "Edellinen",
"LabelSaveLocalMetadata": "Tallenna kuvamateriaali ja metadata media kansioihin.",
"LabelSaveLocalMetadata": "Tallenna kuvamateriaali mediakansioihin",
"LabelSaveLocalMetadataHelp": "Kuvamateriaalin ja metadatan tallentaminen suoraan kansioihin missä niitä on helppo muuttaa.",
"LabelSubtitleLanguagePreference": "Tekstityksien ensisijainen kieli:",
"LabelUnairedMissingEpisodesWithinSeasons": "Näytä julkaisemattomat jaksot tuotantokausissa",
"LabelYourFirstName": "Sinun ensimmäinen nimi:",
"LabelYoureDone": "Olet valmis!",
"LibraryAccessHelp": "Valitse media kansiot jotka haluat jakaa tämän käyttäjän kanssa. Järjestelmänvalvoja pystyy muokkaamaan kaikkia kansioita käyttäen metadata hallintaa.",
"MaxParentalRatingHelp": "Suuremman arvosanan takia, sisältö tulla piilottamaan käyttäjältä.",
"MoreUsersCanBeAddedLater": "Käyttäjiä voi lisätä lisää myöhemmin Dashboardista",
"LabelYourFirstName": "Etunimesi:",
"LabelYoureDone": "Valmista!",
"LibraryAccessHelp": "Valitse kirjastot, jotka haluat jakaa tämän käyttäjän kanssa. Järjestelmänvalvoja pystyy muokkaamaan kaikkia kansioita käyttäen metadatan hallintatyökalua.",
"MaxParentalRatingHelp": "",
"MoreUsersCanBeAddedLater": "Käyttäjiä voidaan lisätä myöhemmin lisää päänäkymästä.",
"NoPluginsInstalledMessage": "Sinulla ei ole mitään lisäosia asennettuna.",
"OptionRelease": "Virallinen Julkaisu",
"ParentalRating": "Parental Rating",
"ParentalRating": "",
"Password": "Salasana",
"PasswordMatchError": "Salasana ja salasanan vahvistuksen pitää olla samat.",
"PasswordResetComplete": "Salasana on palauttettu.",
"PasswordResetConfirmation": "Oletko varma, että haluat palauttaa salasanan?",
"PasswordMatchError": "Salasanan ja salasanan vahvistuksen on oltava samat.",
"PasswordResetComplete": "Salasana on nollattu.",
"PasswordResetConfirmation": "Haluatko varmasti nollata salasanan?",
"PasswordSaved": "Salasana tallennettu.",
"Save": "Tallenna",
"SettingsSaved": "Asetukset tallennettu.",
@ -59,7 +59,7 @@
"TabProfile": "Profiili",
"TabProfiles": "Profiilit",
"TellUsAboutYourself": "Kerro meille itsestäsi",
"ThisWizardWillGuideYou": "Tämä työkalu auttaa sinua asennus prosessin aikana. loittaaksesi valitse kieli.",
"ThisWizardWillGuideYou": "Tämä työkalu auttaa sinua asennusprosessin aikana. Valitse kieli aloittaaksesi.",
"UninstallPluginConfirmation": "Oletko varma, että haluat poistaa {0}?",
"UninstallPluginHeader": "Poista Lisäosa",
"Users": "Käyttäjät",
@ -88,7 +88,7 @@
"AddGuideProviderHelp": "Lisää lähde ohjelmaoppaalle.",
"AddItemToCollectionHelp": "Lisää nimikkeitä etsimällä niitä ja käyttämällä hiiren oikeaa nappia tai valikkoa lisätäksesi ne kokoelmaan.",
"Aired": "Esityspäivä",
"AllowHWTranscodingHelp": "Salli virittimen muuntaa bittivirtaa lennossa. Tämä voi vähentää tarvetta muunnokseen palvelimella.",
"AllowHWTranscodingHelp": "Salli virittimen muuntaa bittivirtaa lennossa. Tämä voi vähentää muunnoksen tarvetta Jellyfin-palvelimella.",
"AllowMediaConversion": "Salli median muunto",
"AllowMediaConversionHelp": "Salli tai kiellä pääsy median muunnostoimintoon.",
"AllowOnTheFlySubtitleExtractionHelp": "Sisäiset tekstitykset voidaan lähettää päätelaitteille ilmitekstinä, jotta videota ei tarvitsisi uudelleenkoodata. Joissain järjestelmissä tämä voi viedä paljon aikaa ja aiheuttaa toiston pysähtymisen purun ajaksi. Poista tämä käytöstä polttaaksesi tekstiykset suoraan videoon, mikäli päätelaite ei tue tekstityksiä.",
@ -101,7 +101,7 @@
"AlwaysPlaySubtitlesHelp": "Oletuskieliasetusta vastaava tekstitys otetaan käyttöön ääniraidan kielestä huolimatta.",
"AnamorphicVideoNotSupported": "Anamorfinen video ei ole tuettu",
"AndroidUnlockRestoreHelp": "Palauttaaksesi aikaisemman ostoksesi, varmista, että olet kirjautuneena samalla Google (tai Amazon) tunnuksella, jolla teit alkuperäisen oston. Varmista, että sovelluskauppa on päällä eikä sitä ole rajoitettu vanhempien lukolla. Varmista myös, että sinulla on toimiva internet -yhteys. Sinun tarvitsee tehdä taämä vain kerran.",
"AnyLanguage": "Mikä tahansa kieli",
"AnyLanguage": "Mikä tahansa",
"Anytime": "Milloin tahansa",
"AroundTime": "Noin {0}",
"Art": "Taide",
@ -249,13 +249,13 @@
"DisplayInOtherHomeScreenSections": "Näytä kotinäytöllä osastoja kuten viimeisin media ja jatka katselua",
"DisplayMissingEpisodesWithinSeasons": "Näytä puuttuvat jaksot tuotantokausissa",
"DisplayMissingEpisodesWithinSeasonsHelp": "Tämän pitää aktivoida TV-kirjastoille myös palvelimen asetuksissa.",
"DisplayModeHelp": "Valitse näyttölaitteen tyyppi jolla pyörität Jellyfiniä.",
"DisplayModeHelp": "Valitse ulkonäkö, jonka haluat käyttöliittymälle.",
"DoNotRecord": "Älä tallenna",
"Down": "Alas",
"Download": "Lataa",
"DownloadsValue": "{0} latausta",
"DrmChannelsNotImported": "Kanavia joissa on tekijänoikeusesto-ohjelmia, ei ladata.",
"DropShadow": "Tiputa varjo",
"DropShadow": "Varjostus",
"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",
@ -267,7 +267,7 @@
"ButtonAddImage": "Lisää kuva",
"Movies": "Elokuvat",
"HeaderNextUp": "Seuraavaksi",
"HeaderLiveTV": "Suorat lähetykset",
"HeaderLiveTV": "Live-TV",
"HeaderFavoriteSongs": "Lempikappaleet",
"HeaderFavoriteShows": "Lempisarjat",
"HeaderFavoriteEpisodes": "Lempijaksot",
@ -284,16 +284,16 @@
"ValueSpecialEpisodeName": "Erikois - {0}",
"Sync": "Synkronoi",
"Songs": "Kappaleet",
"Shows": "Ohjelmat",
"Shows": "Sarjat",
"CopyStreamURLSuccess": "Osoite kopioitu onnistuneesti.",
"DeathDateValue": "Kuoli: {0}",
"CustomDlnaProfilesHelp": "Luo mukautettu profiili uutta laitetta varten, tai ohita järjestelmäprofiili.",
"DeathDateValue": "Kuoli: {}",
"CustomDlnaProfilesHelp": "Luo uusi profiili kohdistaaksesi uuteen laitteeseen tai ohittaaksesi järjestelmäprofiilin.",
"EnableBackdrops": "Taustat",
"ErrorAddingMediaPathToVirtualFolder": "Media-polkua lisätessä ilmeni ongelma. Varmista, että polku on kirjoitettu oikein ja Jellyfin Palvelimella pääsy sijaintiin.",
"Episodes": "Jaksot",
"EndsAtValue": "Päättyy {0}",
"Ended": "Päättynyt",
"EnableThemeSongsHelp": "Soita tunnuslaulut taustalla, selatessasi kirjastoa.",
"EnableThemeSongsHelp": "Soita tunnussäveliä taustalla selatessasi kirjastoa.",
"EnableThemeSongs": "Tunnuslaulut",
"EnableStreamLoopingHelp": "Laita tämä päälle, jos suoratoistot sisältävät vain muutaman sekuntin verran dataa jota tarvitsee pyytää jatkuvasti. Tämän päälle laittaminen ilman toiminnon tarvetta voi aiheuttaa ongelmia.",
"EnablePhotosHelp": "Kuvat tunnistetaan ja näytetään muiden media-tiedostojen ohessa.",
@ -307,11 +307,11 @@
"EnableBackdropsHelp": "Näytä taustat tietyillä sivuilla selatessasi kirjastoa.",
"EnableExternalVideoPlayersHelp": "Videota soitettaessa näytetään erillinen valikko.",
"Depressed": "Painettu",
"CopyStreamURLError": "Verkko-osoitteen kopioinnissa tapahtui virhe.",
"CopyStreamURLError": "Osoitteen kopioidessa 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.",
"EnableNextVideoInfoOverlayHelp": "Näytä videon lopussa tietoja seuraavasta videosta soittolistalla.",
"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",
@ -319,7 +319,744 @@
"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",
"EnableThemeVideos": "Tunnusvideot",
"AlbumArtist": "Albumin Artisti",
"Album": "Albumi"
"Album": "Albumi",
"Played": "Toistetut",
"PlayFromBeginning": "Toista alusta",
"PlayNext": "Toista seuraava",
"Play": "Toista",
"PinCodeResetConfirmation": "Haluatko varmasti nollata PIN-koodin?",
"People": "Ihmiset",
"PasswordResetHeader": "Nollaa salasana",
"OriginalAirDateValue": "Alkuperäinen esityspäivä: {0}",
"OptionWeekly": "Viikottainen",
"OptionWeekends": "Viikonloput",
"OptionWeekdays": "Arkipäivät",
"OptionTvdbRating": "TVDB luokitus",
"OptionTrackName": "Raidan nimi",
"OptionThumbCard": "Pienoiskuvakortti",
"OptionThumb": "Pienoiskuva",
"OptionSubstring": "Substring",
"OptionSpecialEpisode": "Erikoisjaksot",
"OptionSaveMetadataAsHidden": "Tallenna metadata ja kuvat piilotettuina tiedostoina",
"OptionRuntime": "Kesto",
"OptionResumable": "Jatkettavissa oleva",
"OptionResElement": "res element",
"OptionReleaseDate": "Julkaisupäivä",
"OptionRegex": "Regex",
"OptionRandom": "Satunnainen",
"OptionProtocolHttp": "HTTP",
"OptionProtocolHls": "HTTP Suoratoisto",
"OptionProfileVideoAudio": "Video Audio",
"OptionProfileVideo": "Video",
"OptionProfilePhoto": "Kuva",
"OptionProfileAudio": "Audio",
"OptionPremiereDate": "Ensi-iltapäivä",
"OptionPosterCard": "Julistekortti",
"OptionPoster": "Juliste",
"OptionPlayCount": "Toistokerrat",
"OptionPlayed": "Toistettu",
"OptionOnAppStartup": "Käynnistyksen yhteydessä",
"OptionNew": "Uusi...",
"OptionNameSort": "Nimi",
"OptionMonday": "Maanantai",
"OptionMissingEpisode": "Puuttuvat jaksot",
"OptionMax": "Maksimi",
"OptionList": "Lista",
"OptionLikes": "Likes",
"OptionIsSD": "SD",
"OptionIsHD": "HD",
"OptionImdbRating": "IMDb Luokitus",
"OptionHomeVideos": "Kuvat",
"OptionHideUser": "Piilota tämä käyttäjä kirjautumisnäkymästä",
"OptionHasTrailer": "Traileri",
"OptionHasThemeVideo": "Tunnusvideo",
"OptionHasThemeSong": "Tunnuskappale",
"OptionHasSubtitles": "Tekstitykset",
"OptionHasSpecialFeatures": "Erikoisominaisuudet",
"OptionFriday": "Perjantai",
"OptionFavorite": "Suosikit",
"OptionExtractChapterImage": "Ota käyttöön kappalekuvien luonti",
"OptionExternallyDownloaded": "Ulkoinen lataus",
"OptionEveryday": "Joka päivä",
"OptionEnded": "Loppuneet",
"OptionEnableM2tsMode": "Ota käyttöön M2ts tila",
"OptionEnableForAllTuners": "Ota käyttöön kaikille viritinlaitteille",
"OptionEnableAccessToAllLibraries": "Salli pääsy kaikkiin kirjastoihin",
"OptionEnableAccessToAllChannels": "Salli pääsy kaikille kanaville",
"OptionEnableAccessFromAllDevices": "Salli pääsy kaikista laitteista",
"OptionDvd": "DVD",
"OptionDownloadThumbImage": "Pienoiskuva",
"OptionDownloadPrimaryImage": "Ensisijainen",
"OptionDownloadMenuImage": "Valikko",
"OptionDownloadLogoImage": "Logo",
"OptionDownloadImagesInAdvance": "Lataa kuvat etukäteen",
"OptionDislikes": "Disliket",
"OptionCustomUsers": "Mukautettu",
"OptionCriticRating": "Kriitikoiden luokitus",
"OptionContinuing": "Jatkuvat",
"OptionCommunityRating": "Yhteisön luokitus",
"OptionBlockLiveTvChannels": "Live-TV kanavat",
"OptionBanner": "Juliste",
"OnlyForcedSubtitlesHelp": "Vain pakotetuiksi merkityt tekstitykset ladataan.",
"OnlyImageFormats": "Vain kuvaformaatit (VOBSUB, PGS, SUB)",
"OnlyForcedSubtitles": "Vain pakotetut",
"NoSubtitlesHelp": "Tekstityksiä ei ladata oletuksena. Ne voidaan silti kytkeä päälle manuaalisesti toiston aikana.",
"News": "Uutiset",
"Never": "Ei koskaan",
"MessageReenableUser": "Ottaaksesi uudelleen käyttöön, katso alempaa",
"MessagePluginConfigurationRequiresLocalAccess": "Kirjaudu suoraan paikalliselle palvelimellesi muokataksesi tätä liitännäistä.",
"MessagePleaseEnsureInternetMetadata": "Varmista, että metadatan lataus on käytössä.",
"MessageNoServersAvailable": "Automaattisen palvelintunnistuksen avulla ei löydy palvelimia.",
"MessageUnauthorizedUser": "Sinulla ei ole lupaa käyttää palvelinta tällä hetkellä. Ota yhteyttä palvelimen järjestelmänvalvojaan saadaksesi lisätietoja.",
"MessageInvalidForgotPasswordPin": "PIN-koodi on kelpaa tai vanhentunut. Yritä uudelleen.",
"MessageImageTypeNotSelected": "Valitse kuvatyyppi pudotusvalikosta.",
"MessageImageFileTypeAllowed": "Vain JPEG ja PNG tiedostomuotoja tuetaan.",
"MessageContactAdminToResetPassword": "Ota yhteyttä järjestelmänvalvojaan nollataksesi salasanasi.",
"MessageConfirmShutdown": "Haluatko varmasti sammuttaa palvelimen?",
"LabelUserLibrary": "Käyttäjän kirjasto:",
"LabelTranscodingProgress": "Transkoodauksen edistyminen:",
"LabelTranscodingFramerate": "Transkoodauksen ruudunpäivitysnopeus:",
"LabelTranscodes": "Transkoodaukset:",
"LabelTrackNumber": "Raidan numero:",
"LabelTitle": "Nimi:",
"LabelTagline": "Tunnisterivi:",
"LabelSubtitlePlaybackMode": "Tekstitystila:",
"LabelSortOrder": "Lajittelujärjestys:",
"LabelSerialNumber": "Sarjanumero",
"LabelSendNotificationToUsers": "Lähetä ilmoitus:",
"LabelSelectVersionToInstall": "Valitse asennettava versio:",
"LabelPublicHttpsPortHelp": "Paikalliseen HTTPS-porttiin liitettävä julkisen portin numero.",
"LabelPublicHttpPortHelp": "Paikalliseen HTTP-porttiin liitettävä julkisen portin numero.",
"LabelPreferredDisplayLanguage": "Ensisijainen näyttökieli:",
"LabelOriginalTitle": "Alkuperäinen nimi:",
"LabelOriginalAspectRatio": "Alkuperäinen kuvasuhde:",
"LabelEnableAutomaticPortMapHelp": "Yritä automaattisesti yhdistää julkinen ja paikallinen portti UPnP:n kautta. Tämä ei välttämättä toimi kaikkien reitittimien kanssa. Muutokset tulevat voimaan vasta palvelimen uudelleenkäynnistyksen yhteydessä.",
"LabelEnableAutomaticPortMap": "Salli reitittimen porttien automaattinen avaaminen (UPnP)",
"LabelDownloadLanguages": "Latauskielet:",
"LabelDisplaySpecialsWithinSeasons": "Näytä erityiset jaksot kausien sisällä, jolloin ne ilmestyivät",
"LabelDisplayOrder": "Näyttöjärjestys:",
"LabelDisplayName": "Näyttönimi:",
"LabelDisplayMode": "Näyttötila:",
"LabelDateTimeLocale": "Päivämäärä ja aika:",
"LabelCustomRating": "Mukautettu luokitus:",
"LabelCustomDeviceDisplayName": "Näyttönimi:",
"LabelCustomCss": "Mukautettu CSS:",
"LabelCertificatePassword": "Sertifikaatin salasana:",
"LabelAudio": "Audio",
"LabelArtistsHelp": "Erota useita käyttämällä ;",
"LabelAppNameExample": "Esimerkiksi: Sickbeard, Sonarr",
"LabelAppName": "Sovelluksen nimi",
"LabelAllowedRemoteAddressesMode": "Etä-IP-osoitesuodattimen tila:",
"LabelAllowedRemoteAddresses": "Etä-IP-osoitesuodatin:",
"LabelAllowServerAutoRestartHelp": "Palvelin käynnistyy uudelleen vain hiljaisina aikoina, kun yksikään käyttäjä ei ole aktiivinen.",
"LabelAllowServerAutoRestart": "Salli palvelimen automaattinen uudelleenkäynnistys päivitysten asentamiseksi",
"LabelAllowHWTranscoding": "Salli laitteistolla transkoodaus",
"LabelAlbumArtMaxWidth": "Albumin kuvan maksimileveys:",
"LabelAlbumArtMaxHeight": "Albumin kuvan maksimikorkeus:",
"LabelAbortedByServerShutdown": "(Keskeytetty palvelimen sammutuksen takia)",
"Identify": "Tunnista",
"Horizontal": "Horisontaalinen",
"HideWatchedContentFromLatestMedia": "Piilota toistettu sisältö \"uusin media\"-luettelosta",
"HeaderUpcomingOnTV": "Tulossa televisiossa",
"HeaderTypeImageFetchers": "{0} Kuvien hakijat",
"HeaderTranscodingProfile": "Transkoodausprofiili",
"HeaderTracks": "Raidat",
"HeaderThisUserIsCurrentlyDisabled": "Tämä käyttäjä on poistettu käytöstä",
"HeaderSystemDlnaProfiles": "Järjestelmäprofiilit",
"HeaderSubtitleDownloads": "Tekstitysten lataukset",
"HeaderSpecialFeatures": "Lisäominaisuudet",
"HeaderSpecialEpisodeInfo": "Erikoisjakson tiedot",
"HeaderSortOrder": "Lajittelujärjestys",
"HeaderSetupLibrary": "Aseta mediakirjastosi",
"HeaderSeriesStatus": "Sarjan status",
"HeaderSeriesOptions": "Sarjan asetukset",
"HeaderSelectTranscodingPath": "Valitse transkoodauksen väliaikainen polku",
"HeaderSchedule": "Ajastus",
"HeaderScenes": "Kohtaukset",
"HeaderResponseProfile": "Vastausprofiili",
"HeaderRemoveMediaLocation": "Poista mediasijainti",
"HeaderRecordingOptions": "Tallennusasetukset",
"HeaderRecentlyPlayed": "Äskettäin toistetut",
"HeaderProfileServerSettingsHelp": "Nämä arvot mukauttavat sitä, kuinka Jellyfin-palvelin esittää itsensä laitteelle.",
"HeaderProfileInformation": "Profiili-informaatio",
"HeaderPreferredMetadataLanguage": "Ensisijainen metadatan kieli",
"HeaderPinCodeReset": "Nollaa PIN-koodi",
"HeaderPhotoAlbums": "Kuva-albumit",
"HeaderPendingInvitations": "Odottavat kutsut",
"HeaderPaths": "Polut",
"HeaderPasswordReset": "Salasanan nollaus",
"HeaderNextVideoPlayingInValue": "Seuraava video alkaa {0}",
"HeaderNextEpisodePlayingInValue": "Seuraava jakso alkaa {0}",
"HeaderNewDevices": "Uudet laitteet",
"HeaderMyMediaSmall": "Minun mediani (pieni)",
"HeaderMyMedia": "Minun mediani",
"HeaderMyDevice": "Minun laitteeni",
"HeaderLoginFailure": "Kirjautumisvirhe",
"HeaderIdentifyItemHelp": "Anna yksi tai useampi hakukriteeri. Poista kriteerejä lisätäksesi hakutuloksia.",
"HeaderIdentificationCriteriaHelp": "Lisää ainakin yksi tunnistuskriteeri.",
"HeaderFeatures": "Ominaisuudet",
"HeaderFavoriteVideos": "Suosikkivideot",
"HeaderFavoritePeople": "Suosikki-ihmiset",
"HeaderFavoriteMovies": "Suosikkielokuvat",
"HeaderFavoriteBooks": "Suosikkikirjat",
"HeaderExternalIds": "Ulkoiset IDt:",
"HeaderDirectPlayProfile": "Suoratoistoprofiili",
"HeaderEasyPinCode": "Helppo PIN-koodi",
"HeaderDownloadSync": "Lataus ja synkronointi",
"HeaderDeveloperInfo": "Kehittäjäinfo",
"HeaderDetectMyDevices": "Havaitse laitteitani",
"HeaderDeleteProvider": "Poista tarjoaja",
"HeaderDefaultRecordingSettings": "Oletus tallennusasetukset",
"HeaderDateIssued": "Antopäivä",
"HeaderCustomDlnaProfiles": "Mukautetut profiilit",
"HeaderConfirmRevokeApiKey": "Peru API-avain",
"HeaderConfirmProfileDeletion": "Vahvista profiilin poisto",
"HeaderConfirmPluginInstallation": "Vahvista liitännäisen asennus",
"HeaderConfigureRemoteAccess": "Määritä etäkäyttö",
"HeaderChapterImages": "Kappalekuvat",
"HeaderChannels": "Kanavat",
"HeaderApp": "Sovellus",
"HeaderAllowMediaDeletionFrom": "Salli median poisto",
"HeaderAlert": "Hälytys",
"HeaderActivity": "Toiminta",
"HandledByProxy": "Reverse proxyn hoitama",
"HDPrograms": "HD-ohjelmat",
"OptionDownloadArtImage": "Taide",
"OptionDownloadDiscImage": "Levy",
"OptionDownloadBoxImage": "Laatikko",
"OptionDownloadBannerImage": "Juliste",
"OptionDownloadBackImage": "Tausta",
"OptionDisableUser": "Poista tämä käyttäjä käytöstä",
"OptionDescending": "Laskeva",
"OptionDatePlayed": "Toistopäivä",
"OptionDateAddedImportTime": "Käytä kirjastoon skannauspäivää",
"OptionDateAddedFileTime": "Käytä tiedoston luontipäivää",
"OptionDateAdded": "Lisäyspäivä",
"OptionDaily": "Päivittäinen",
"OptionBluray": "Blu-ray",
"TabTrailers": "Trailerit",
"OptionBlockTvShows": "TV-sarjat",
"OptionBlockTrailers": "Trailerit",
"OptionBlockMusic": "Musiikki",
"OptionBlockMovies": "Elokuvat",
"HeaderMovies": "Elokuvat",
"HeaderMoreLikeThis": "Lisää tällaista",
"HeaderMetadataSettings": "Metadata-asetukset",
"MoreMediaInfo": "Mediainfo",
"HeaderMediaInfo": "Mediainfo",
"HeaderMediaFolders": "Mediakansiot",
"HeaderMedia": "Media",
"HeaderLiveTv": "Live-TV",
"HeaderLibraryFolders": "Kirjaston kansiot",
"HeaderLatestMedia": "Uusin media",
"HeaderLatestRecordings": "Uusimmat tallenteet",
"HeaderLatestMusic": "Uusin musiikki",
"HeaderLatestMovies": "Uusimmat elokuvat",
"HeaderLatestEpisodes": "Uusimmat jaksot",
"HeaderInstall": "Asenna",
"HeaderGenres": "Tyylilajit",
"HeaderFrequentlyPlayed": "Usein toistetut",
"HeaderFetcherSettings": "Hakijan asetukset",
"HeaderFetchImages": "Hae kuvia:",
"HeaderFilters": "Suodattimet",
"OptionBlockBooks": "Kirjat",
"Filters": "Suodattimet",
"FastForward": "Hyppää eteenpäin",
"YadifBob": "YADIF Bob",
"MessageInvalidUser": "Väärä käyttäjätunnus tai salasana. Yritä uudelleen.",
"MessageConfirmRestart": "Haluatko varmasti uudelleenkäynnistää Jellyfin-palvelimen?",
"MessageConfirmProfileDeletion": "Haluatko varmasti poistaa tämän profiilin?",
"MessageConfirmDeleteTunerDevice": "Haluatko varmasti poistaa tämän laitteen?",
"MessageConfirmAppExit": "Haluatko poistua?",
"MessageAreYouSureYouWishToRemoveMediaFolder": "Haluatko varmasti poistaa tämän mediakansion?",
"MessageAreYouSureDeleteSubtitles": "Haluatko varmasti poistaa tämän tekstitystiedoston?",
"MessageAlreadyInstalled": "Tämä versio on jo asennettu.",
"Menu": "Valikko",
"MediaInfoStreamTypeVideo": "Video",
"MediaInfoStreamTypeSubtitle": "Tekstitys",
"MediaInfoStreamTypeData": "Data",
"MediaInfoStreamTypeAudio": "Audio",
"MediaInfoSoftware": "Ohjelmisto",
"MediaInfoTimestamp": "Aikaleima",
"MediaInfoResolution": "Resoluutio",
"MediaInfoSize": "Koko",
"MediaInfoProfile": "Profiili",
"MediaInfoLevel": "Taso",
"MediaInfoPath": "Polku",
"MediaInfoLanguage": "Kieli",
"MediaInfoInterlaced": "Lomiteltu",
"MediaInfoFramerate": "Ruudunpäivitysnopeus",
"MediaInfoForced": "Pakotettu",
"MediaInfoDefault": "Oletus",
"MediaInfoExternal": "Ulkoinen",
"MediaInfoChannels": "Kanavat",
"MediaInfoAspectRatio": "Kuvasuhde",
"MarkUnplayed": "Merkitse toistamattomaksi",
"MarkPlayed": "Merkitse toistetuksi",
"ManageRecording": "Hallitse tallennusta",
"ManageLibrary": "Hallitse kirjastoa",
"Logo": "Logo",
"LiveTV": "Live-TV",
"LiveBroadcasts": "Suorat lähetykset",
"Live": "Suora",
"List": "Lista",
"LinksValue": "Linkkejä: {0}",
"LearnHowYouCanContribute": "Katso, miten voit auttaa.",
"Large": "Suuri",
"LabelffmpegPath": "FFmpeg polku:",
"LabelZipCode": "Postinumero:",
"LabelYear": "Vuosi:",
"LabelVideoResolution": "Videon resoluutio:",
"LabelVideo": "Video",
"DashboardArchitecture": "Arkkitehtuuri: {0}",
"DashboardOperatingSystem": "Käyttöjärjestelmä: {0}",
"DashboardServerName": "Palvelin: {0}",
"DashboardVersionNumber": "Versio: {0}",
"LabelVersionInstalled": "{0} asennettu",
"LabelVersion": "Versio:",
"LabelValue": "Arvo:",
"LabelUsername": "Käyttäjätunnus:",
"LabelUser": "Käyttäjä:",
"LabelUseNotificationServices": "Käytä seuraavia palveluita:",
"LabelTypeText": "Teksti",
"LabelTypeMetadataDownloaders": "{0} metadatan lataajat:",
"LabelType": "Tyyppi:",
"LabelTunerType": "Virittimen tyyppi:",
"LabelTunerIpAddress": "Virittimen IP-osoite:",
"LabelTranscodingThreadCountHelp": "Valitse enimmäismäärä säikeitä, joita käytetään transkoodatessa. Säikeiden vähentäminen laskee prosessorin käyttöä, mutta myös lisää riskiä, että uudelleenkoodaus ei tapahdu riittävän nopeasti virheetöntä toistoa varten.",
"LabelTranscodingThreadCount": "Transkoodaus säikeidein lukumäärä:",
"LabelTranscodePath": "Transkoodauksen polku:",
"LabelTimeLimitHours": "Aikaraja (tunteina):",
"LabelTime": "Aika:",
"LabelTheme": "Teema:",
"LabelTextSize": "Tekstin koko:",
"LabelTextColor": "Tekstin väri:",
"LabelTextBackgroundColor": "Tekstin taustaväri:",
"LabelSupportedMediaTypes": "Tuetut mediatyypit:",
"LabelTag": "Tunniste:",
"LabelSubtitles": "Tekstitykset",
"LabelSubtitleFormatHelp": "Esimerkki: srt",
"LabelStatus": "Status:",
"LabelSource": "Lähde:",
"LabelSize": "Koko:",
"LabelServerName": "Palvelimen nimi:",
"LabelServerHostHelp": "192.168.1.100:8096 tai https://myserver.com",
"LabelSelectUsers": "Valitse käyttäjät:",
"LabelSeasonNumber": "Kauden numero:",
"LabelScreensaver": "Näytönsäästäjä:",
"LabelReasonForTranscoding": "Transkoodauksen syy:",
"LabelReadHowYouCanContribute": "Katso, miten voit auttaa.",
"LabelPublicHttpsPort": "Julkinen HTTPS-porttinumero:",
"LabelPublicHttpPort": "Julkinen HTTP-porttinumero:",
"LabelProtocolInfo": "Protokollan info:",
"LabelProtocol": "Protokolla:",
"LabelPreferredSubtitleLanguage": "Ensisijainen tekstityksen kieli:",
"LabelPreferredDisplayLanguageHelp": "Jellyfinin kääntäminen on käynnissä oleva projekti.",
"LabelPlayerDimensions": "Soittimen mitat:",
"LabelPlayer": "Soitin:",
"LabelPlaylist": "Soittolista:",
"LabelPlaceOfBirth": "Synnyinpaikka:",
"LabelPersonRoleHelp": "Esimerkki: Jäätelöauton ajaja",
"LabelPersonRole": "Rooli:",
"LabelPath": "Polku:",
"LabelPasswordRecoveryPinCode": "PIN-koodi:",
"LabelPasswordConfirm": "Salasanan varmistus:",
"LabelPassword": "Salasana:",
"LabelOptionalNetworkPath": "(Valinnainen) Jaettu verkkokansio:",
"LabelNumber": "Numero:",
"LabelNotificationEnabled": "Ota tämä ilmoitus käyttöön",
"LabelNewName": "Uusi nimi:",
"LabelName": "Nimi:",
"LabelMovieCategories": "Elokuvakategoriat:",
"LabelMinScreenshotDownloadWidth": "Pienin kuvakaappauksen latauksen leveys:",
"LabelMinResumePercentageHelp": "Kohteita pidetään toistamattomina, jos toisto keskeytetään ennen tätä aikaa.",
"LabelMinResumeDuration": "Minimi jatkamisen kesto (sekuntia):",
"LabelMinResumePercentage": "Vähimmäisaika jatkoa varten (%):",
"LabelMinResumeDurationHelp": "Kohteiden, joiden toistoaika on tätä lyhyempi, ei voi jatkaa.",
"LabelMethod": "Metodi:",
"LabelMetadataSaversHelp": "Valitse tiedostomuodot, joihin metadata tallennetaan.",
"LabelMetadataSavers": "Metadatan tallentajat:",
"LabelMetadataDownloadLanguage": "Ensisijainen latauskieli:",
"LabelMetadataReaders": "Metadatan lukijat:",
"LabelMetadataPath": "Metadatan polku:",
"LabelMetadata": "Metadata:",
"LabelMessageTitle": "Viestin otsikko:",
"LabelCachePath": "Välimuistin polku:",
"LabelCache": "Välimuisti:",
"LabelBurnSubtitles": "Polta tekstitykset:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Päivitä metadata automaattisesti:",
"LabelAuthProvider": "Todennuksen tarjoaja:",
"ExtraLarge": "Suurin",
"EveryNDays": "Joka {0} päivä",
"Raised": "Korotettu",
"TabShows": "Sarjat",
"Yesterday": "Eilen",
"Yes": "Kyllä",
"Unplayed": "Toistamattomat",
"Unmute": "Lopeta vaimennus",
"Tuesday": "Tiistai",
"Transcoding": "Transkoodaus",
"Trailers": "Trailerit",
"TitlePlayback": "Toistaminen",
"Thursday": "Torstai",
"TheseSettingsAffectSubtitlesOnThisDevice": "Nämä asetukset vaikuttavat tekstityksiin tällä laitteella",
"ThemeVideos": "Tunnusvideot",
"ThemeSongs": "Tunnuslaulut",
"TagsValue": "Tunnisteet: {0}",
"Tags": "Tunnisteet",
"TabUsers": "Käyttäjät",
"TabUpcoming": "Tulevat",
"TabTranscoding": "Transkoodaus",
"TabSuggestions": "Ehdotukset",
"TabSongs": "Kappaleet",
"TabSettings": "Asetukset",
"TabServer": "Palvelin",
"TabSeries": "Sarjat",
"TabScheduledTasks": "Ajastetut tehtävät",
"TabResumeSettings": "Jatka",
"TabResponses": "Vastaukset",
"TabRecordings": "Tallennukset",
"TabPlugins": "Liitännäiset",
"TabPlaylists": "Soittolistat",
"TabPlaylist": "Soittolista",
"TabPlayback": "Toistaminen",
"TabNfoSettings": "NFO-asetukset",
"TabNetworks": "Verkot",
"TabMyPlugins": "Omat liittännäiseni",
"TabMusicVideos": "Musiikkivideot",
"TabMusic": "Musiikki",
"TabMovies": "Elokuvat",
"TabMetadata": "Metadata",
"TabLogs": "Lokit",
"TabLiveTV": "Live-TV",
"TabLatest": "Uusimmat",
"TabInfo": "Info",
"TabGenres": "Tyylilajit",
"TabFavorites": "Suosikit",
"TabEpisodes": "Jaksot",
"TabDisplay": "Näyttö",
"TabDirectPlay": "Suoratoisto",
"TabDevices": "Laitteet",
"TabDashboard": "Päänäkymä",
"TabCollections": "Kokoelmat",
"TabChannels": "Kanavat",
"TabCatalog": "Luettelo",
"TabArtists": "Artistit",
"TabAlbums": "Albumit",
"TabAlbumArtists": "Albumin artistit",
"TabAdvanced": "Edistynyt",
"TV": "TV",
"Sunday": "Sunnuntai",
"Subtitles": "Tekstitykset",
"Studios": "Studiot",
"StopRecording": "Lopeta tallennus",
"Sort": "Järjestä",
"Smart": "Älykäs",
"SkipEpisodesAlreadyInMyLibrary": "Älä tallenna jaksoja, jotka ovat jo kirjastossani",
"Shuffle": "Sekoita",
"ShowTitle": "Näytä nimi",
"ShowYear": "Näytä vuosi",
"ShowAdvancedSettings": "Näytä edistyneet asetukset",
"Share": "Jaa",
"Settings": "Asetukset",
"ServerRestartNeededAfterPluginInstall": "Jellyfin palvelin täytyy uudelleenkäynnistää liitännäisen asennuksen jälkeen.",
"ServerNameIsShuttingDown": "Jellyfin palvelin - {0} on sammumassa.",
"ServerNameIsRestarting": "Jellyfin palvelin - {0} uudelleenkäynnistyy.",
"Series": "Sarjat",
"SendMessage": "Lähetä viesti",
"SelectAdminUsername": "Valitse käyttäjätunnus järjestelmänvalvojan tilille.",
"SearchForCollectionInternetMetadata": "Etsi kuvamateriaalia ja metadataa internetistä",
"SearchForMissingMetadata": "Etsi puuttuvaa metadataa",
"Season": "Kausi",
"SearchResults": "Tulokset",
"SearchForSubtitles": "Etsi tekstityksiä",
"Search": "Etsi",
"Screenshots": "Kuvakaappaukset",
"Screenshot": "Kuvakaappaus",
"Schedule": "Ajasta",
"ScanLibrary": "Skannaa kirjasto",
"SaveSubtitlesIntoMediaFolders": "Tallenna tekstitykset mediakansioihin",
"Saturday": "Lauantai",
"ResumeAt": "Jatka kohdasta {0}",
"RestartPleaseWaitMessage": "Odota kunnes Jellyfin palvelin sammuu ja käynnistyy uudelleen. Tämä voi kestää hetken aikaa.",
"RequiredForAllRemoteConnections": "Vaadittu kaikille etäyhteyksille",
"ReplaceExistingImages": "Korvaa olemassaolevat kuvat",
"ReplaceAllMetadata": "Korvaa kaikki metadata",
"RepeatEpisodes": "Toista jaksot uudelleen",
"RepeatAll": "Toista kaikki uudelleen",
"Repeat": "Toista uudelleen",
"RemoveFromPlaylist": "Poista soittolistalta",
"RemoveFromCollection": "Poista kokoelmasta",
"RememberMe": "Muista minut",
"ReleaseDate": "Julkaisupäivä",
"RefreshMetadata": "Päivitä metadata",
"RefreshDialogHelp": "Metadata päivitetään asetuksien ja Internet palveluiden perusteella, jotka ovat kytkettynä päälle Jellyfin palvelimen päänäkymässä.",
"Refresh": "Päivitä",
"Recordings": "Tallennukset",
"RecordingScheduled": "Tallennus ajastettu.",
"RecordingCancelled": "Tallennus peruttu.",
"RecordSeries": "Tallenna sarja",
"Record": "Tallenna",
"OptionAutomatic": "Auto",
"OptionAuto": "Auto",
"OptionAscending": "Nouseva",
"OptionArtist": "Artisti",
"OptionAllowVideoPlaybackTranscoding": "Salli transkoodausta vaativan videon toistaminen",
"OptionAllowVideoPlaybackRemuxing": "Salli videon toistaminen, joka vaatii muuntamista ilman koodausta",
"OptionAllowMediaPlaybackTranscodingHelp": "Transkoodauksen estäminen voi aiheuttaa toistovirheitä Jellyfin-sovelluksissa ei-tuettujen mediaformaattien takia.",
"OptionAllowLinkSharingHelp": "Vain mediatietoja sisältävät web-sivut jaetaan. Mediatiedostoja ei koskaan jaeta julkisesti. Jaot ovat määräaikaisia ja päättyvät {0} päivän kuluttua.",
"OptionAllowUserToManageServer": "Salli tämän käyttäjän hallita palvelinta",
"OptionAllowSyncTranscoding": "Salli transkoodausta vaativan median lataaminen ja synkronointi",
"OptionAllowRemoteSharedDevicesHelp": "DLNA-laitteet katsotaan jaetuiksi kunnes käyttäjä alkaa ohjata niitä.",
"OptionAllowRemoteSharedDevices": "Salli jaettujen laitteiden etäohjaaminen",
"OptionAllowRemoteControlOthers": "Salli muiden käyttäjien etäohjaaminen",
"OptionAllowManageLiveTv": "Salli Live-TV tallenteiden hallinta",
"OptionAllowMediaPlayback": "Salli median toisto",
"OptionAllowContentDownloading": "Salli median lataaminen ja synkronointi",
"OptionAllowBrowsingLiveTv": "Salli Live-TV käyttöoikeus",
"HeaderPluginInstallation": "Liitännäisen asennus",
"HeaderPlaybackError": "Toistovirhe",
"HeaderPlayback": "Median toisto",
"HeaderPlayOn": "Toista laitteella",
"OptionAllowLinkSharing": "Salli jakaminen sosiaaliseen mediaan",
"OptionAllowAudioPlaybackTranscoding": "Salli äänen toistaminen joka vaatii uudelleenpakkausta",
"OptionAllUsers": "Kaikki käyttäjät",
"OptionAlbumArtist": "Albumin artisti",
"OptionAlbum": "Albumi",
"OptionAdminUsers": "Järjestelmänvalvojat",
"Option3D": "3D",
"MusicVideo": "Musiikkivideo",
"MoveRight": "Siirry oikealle",
"MoveLeft": "Siirry vasemmalle",
"Mobile": "Mobiili",
"EveryXHours": "Joka {0} tunti",
"EveryXMinutes": "Joka {0} minuutti",
"EveryHour": "Joka tunti",
"LastSeen": "Viimeksi nähty {0}",
"Yadif": "YADIF",
"Writer": "Kirjoittaja",
"WelcomeToProject": "Tervetuloa Jellyfiniin!",
"Wednesday": "Keskiviikko",
"ViewArtist": "Näytä artisti",
"ViewAlbum": "Näytä albumi",
"Vertical": "Vertikaalinen",
"ValueSongCount": "{0} kappaletta",
"ValueSeriesCount": "{0} sarjaa",
"ValueSeconds": "{0} sekuntia",
"ValueOneSong": "1 kappale",
"ValueOneSeries": "1 sarja",
"ValueOneMusicVideo": "1 musiikkivideo",
"ValueOneMovie": "1 elokuva",
"ValueOneEpisode": "1 jakso",
"ValueOneAlbum": "1 albumi",
"ValueMusicVideoCount": "{0} musiikkivideota",
"ValueMovieCount": "{0} elokuvaa",
"ValueMinutes": "{0} min",
"ValueEpisodeCount": "{0} jaksoa",
"ValueDiscNumber": "Levy {0}",
"ValueAlbumCount": "{0} albumia",
"Up": "Ylös",
"OnApplicationStartup": "Käynnistyksen yhteydessä",
"NumLocationsValue": "{0} kansiota",
"NoSubtitleSearchResultsFound": "Ei tuloksia.",
"NoPluginConfigurationMessage": "Tällä liitännäisellä ei ole asetuksia muokattavaksi.",
"NoCreatedLibraries": "Vaikuttaa siltä, ettet ole luonut vielä yhtään kirjastoa. {0} Haluaisitko luoda sellaisen nyt?{1}",
"No": "Ei",
"NextUp": "Seuraavana",
"Next": "Seuraava",
"NewEpisodesOnly": "Vain uudet jaksot",
"NewEpisodes": "Uusia jaksoja",
"NewCollectionNameExample": "Esimerkki: Star Wars Kokoelma",
"NewCollectionHelp": "Kokoelmat mahdollistavat elokuvien ja muun kirjastosisällön personalisoidun ryhmittämisen.",
"NewCollection": "Uusi kokoelma",
"Mute": "Vaimenna",
"Name": "Nimi",
"MySubtitles": "Minun tekstitykseni",
"MusicArtist": "Musiikkiartisti",
"MusicAlbum": "Musiikkialbumi",
"Movie": "Elokuva",
"Monday": "Maanantai",
"MetadataManager": "Metadatan hallintatyökalu",
"Metadata": "Metadata",
"MessageYouHaveVersionInstalled": "Sinulla on versio {0} asennettuna.",
"MessageSettingsSaved": "Asetukset tallennettu.",
"MessagePleaseWait": "Ole hyvä ja odota. Tämä voi kestää hetken.",
"MessageNothingHere": "Täällä ei ole mitään.",
"MessageNoPluginsInstalled": "Sinulla ei ole asennettuna yhtään liitännäistä.",
"MessageNoAvailablePlugins": "Ei saatavilla olevia liitännäisiä.",
"InstallingPackage": "Asennetaan {0} (versio {1})",
"HeaderVideoTypes": "Videotyypit",
"HeaderVideoType": "Videotyyppi",
"HeaderUploadImage": "Lataa kuva",
"HeaderTypeText": "Kirjoita teksti",
"HeaderTunerDevices": "Viritinlaitteet",
"HeaderTuners": "Virittimet",
"HeaderTaskTriggers": "Tehtävän laukaisijat",
"HeaderSubtitleProfilesHelp": "Tekstitysprofiilit kuvaavat tämän laitteen tukemia tekstitysformaatteja.",
"HeaderSubtitleProfiles": "Tekstitysprofiilit",
"HeaderSubtitleProfile": "Tekstitysprofiili",
"HeaderStartNow": "Aloita nyt",
"HeaderSortBy": "Lajittele",
"HeaderSelectServerCachePath": "Valitse palvelimen välimuistin polku",
"HeaderSelectPath": "Valitse polku",
"HeaderSelectCertificatePath": "Valitse sertifikaatin polku",
"HeaderSelectMetadataPath": "Valitse metadatan polku",
"HeaderSecondsValue": "{0} Sekuntia",
"HeaderRunningTasks": "Käynnissä olevat tehtävät",
"HeaderRevisionHistory": "Versiohistoria",
"HeaderRestartingServer": "Uudelleenkäynnistetään palvelinta",
"HeaderRemoveMediaFolder": "Poista mediakansio",
"HeaderRemoteControl": "Etäohjaus",
"HeaderPleaseSignIn": "Ole hyvä ja kirjaudu sisään",
"BoxSet": "Laatikkosarja",
"LabelAccessEnd": "",
"LabelManufacturerUrl": "Valmistajan verkko-osoite",
"LabelManufacturer": "Valmistaja:",
"LabelLogs": "Lokit:",
"LabelLanNetworks": "Lähiverkot:",
"LabelKodiMetadataDateFormat": "Julkaisupäivämäärän muoto:",
"LabelImageType": "Kuvan tyyppi:",
"LabelIconMaxWidth": "Ikonin enimmäisleveys:",
"LabelIconMaxHeight": "Ikonin enimmäiskorkeus:",
"LabelGroupMoviesIntoCollections": "Ryhmitä elokuvat kokoelmiin",
"LabelFormat": "Muoto:",
"LabelFont": "Kirjasinlaji:",
"LabelFolder": "Kansio:",
"LabelEpisodeNumber": "Jaksonumero:",
"LabelDropShadow": "Varjostus:",
"LabelDeathDate": "Kuolinpäivä:",
"LabelDay": "Päivä:",
"LabelDateAdded": "Lisäyspäivämäärä:",
"LabelCollection": "Kokoelma:",
"LabelBirthYear": "Syntymävuosi:",
"LabelBirthDate": "Syntymäaika:",
"LabelArtists": "Artistit:",
"LabelAll": "Kaikki",
"LabelAlbum": "Albumi:",
"LabelAirTime": "Lähetysaika:",
"LabelAccessDay": "Viikonpäivä:",
"Label3DFormat": "3D-formaatti:",
"Kids": "Lapset",
"Images": "Kuvat",
"Hide": "Piilota",
"HeadersFolders": "Kansiot",
"HeaderYears": "Vuodet",
"HeaderVideos": "Videot",
"HeaderVideoQuality": "Kuvanlaatu",
"HeaderUsers": "Käyttäjät",
"HeaderUser": "Käyttäjä",
"HeaderTags": "Tunnisteet",
"HeaderSubtitleAppearance": "Tekstityksen ulkonäkö",
"HeaderStatus": "Tila",
"HeaderShutdown": "Sammuta",
"HeaderServerSettings": "Palvelimen asetukset",
"HeaderSettings": "Asetukset",
"HeaderSendMessage": "Lähetä viesti",
"HeaderSelectServer": "Valitse palvelin",
"HeaderSeasons": "Kaudet",
"HeaderRestart": "Uudelleenkäynnistys",
"HeaderProfile": "Profiili",
"HeaderPlayAll": "Toista kaikki",
"HeaderPeople": "Ihmiset",
"HeaderPassword": "Salasana",
"HeaderNewApiKey": "Uusi API-avain",
"HeaderNavigation": "Navigaatio",
"HeaderMusicVideos": "Musiikkivideot",
"HeaderMusicQuality": "Musiikin laatu",
"HeaderLibraries": "Kirjastot",
"HeaderIdentification": "Tunnistautuminen",
"HeaderForgotPassword": "Unohtuiko salasana",
"HeaderForKids": "Lapsille",
"HeaderError": "Virhe",
"HeaderEpisodes": "Jaksot",
"HeaderEditImages": "Muokkaa kuvia",
"HeaderDisplay": "Näyttö",
"HeaderDevices": "Laitteet",
"HeaderDeleteItems": "Poista valitut",
"HeaderDeleteItem": "Poista valittu",
"HeaderDeleteDevice": "Poista laite",
"HeaderContinueListening": "Jatka kuuntelua",
"HeaderConnectionFailure": "Yhteys epäonnistui",
"HeaderConnectToServer": "Yhdistä palvelimeen",
"HeaderAudioSettings": "Ääniasetukset",
"GroupBySeries": "Ryhmitä sarjan perusteella",
"Fullscreen": "Kokonäyttötila",
"HeaderBooks": "Kirjat",
"HeaderAutomaticUpdates": "Automaattiset päivitykset",
"HeaderAudioBooks": "Äänikirjat",
"HeaderApiKeys": "API-avaimet",
"HeaderApiKey": "API-avain",
"HeaderAdmin": "Ylläpitäjä",
"HeaderAlbums": "Albumit",
"HeaderAddUser": "Lisää käyttäjä",
"HeaderAddUpdateImage": "Lisää/Päivitä kuva",
"HeaderAddToPlaylist": "Lisää soittolistaan",
"HeaderAddToCollection": "Lisää kokoelmaan",
"HeaderActiveDevices": "Aktiiviset laitteet",
"Friday": "Perjantai",
"Premiere": "Ensiesitys",
"Producer": "Tuottaja",
"Quality": "Laatu",
"LabelMessageText": "Viestin sisältö:",
"LabelMaxScreenshotsPerItem": "Kuvakaappausten enimmäismäärä per kohde:",
"LabelLoginDisclaimerHelp": "Viesti, joka näytetään kirjautumissivun alareunassa.",
"LabelLockItemToPreventChanges": "Lukitse tämä kohde estääksesi tulevat muutokset",
"LabelLocalHttpServerPortNumberHelp": "TCP-portin numero, jota Jellyfinin HTTP-palvelimen tulee kuunnella.",
"LabelLocalHttpServerPortNumber": "Paikallisen HTTP-portin numero:",
"LabelKodiMetadataSaveImagePaths": "Tallenna kuvien polut NFO-tiedostojen sisälle",
"LabelKidsCategories": "Lasten kategoriat:",
"LabelHttpsPortHelp": "TCP-portin numero, jota Jellyfinin HTTPS-palvelimen tulee kuunnella.",
"LabelHttpsPort": "Paikallisen HTTPS-portin numero:",
"LabelHardwareAccelerationTypeHelp": "Laitteistokiihdytys vaatii ylimääräistä määritystä.",
"LabelHardwareAccelerationType": "Laitteistokiihdytys:",
"LabelEncoderPreset": "H264 and H265 encoding preset:",
"LabelH264Crf": "H264 encoding CRF:",
"LabelForgotPasswordUsernameHelp": "Anna käyttäjätunnuksesi, jos muistat sen.",
"LabelEveryXMinutes": "Joka:",
"LabelEndDate": "Päättymispäivä:",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Määrittää, kuinka usein Jellyfin etsii SSDP-protokollaa käyttäviä laitteita.",
"LabelEnableDlnaDebugLoggingHelp": "Luo suuria lokitiedostoja ja tulisi käyttää vain tarvittaessa vianmääritystä varten.",
"LabelEnableDlnaServerHelp": "Sallii verkon UPnP-laitteiden selata ja toistaa sisältöä tältä palvelimelta.",
"LabelEnableDlnaServer": "Ota DLNA-palvelin käyttöön",
"LabelEnableDlnaPlayTo": "Salli DLNA toisto",
"LabelEnableDlnaDebugLogging": "Ota DLNA:n virheenjäljitys käyttöön",
"LabelEnableBlastAliveMessages": "Lähetä hereilläolo -viesti",
"LabelEnableBlastAliveMessagesHelp": "Ota tämä käyttöön, jos muilla verkon UPnP-laitteilla on ongelmia palvelimen havaitsemisessa.",
"LabelEnableDlnaClientDiscoveryInterval": "Asiakaslaitteiden havaintoväli (sekunteina)",
"LabelEasyPinCode": "Helppo PIN-koodi:",
"LabelDynamicExternalId": "{0} Id:",
"LabelDisplayLanguageHelp": "Jellyfinin kääntäminen on käynnissä oleva projekti.",
"LabelDisplayLanguage": "Näytön kieli:",
"LabelDiscNumber": "Levynumero:",
"LabelDeviceDescription": "Laitteen kuvaus",
"LabelDefaultScreen": "Oletusnäyttö:",
"LabelDefaultUser": "Oletuskäyttäjä:",
"LabelDashboardTheme": "Palvelimen päänäkymän teema:",
"LabelCustomCertificatePathHelp": "Polku PKCS # 12-tiedostoon, joka sisältää sertifikaatin ja yksityisen avaimen, jotta TLS-tuki voidaan sallia henkilökohtaiselle verkkotunnukselle.",
"LabelCustomCertificatePath": "Mukautetun SSL-sertifikaatin polku:",
"LabelContentType": "Sisältötyyppi:",
"LabelChannels": "Kanavat:",
"LabelCertificatePasswordHelp": "Jos sertifikaattisi vaatii salasanaa, laita se tähän.",
"OptionWednesday": "Keskiviikko",
"OptionTuesday": "Tiistai",
"OptionThursday": "Torstai",
"OptionSunday": "Sunnuntai",
"OptionSaturday": "Lauantai",
"LabelRuntimeMinutes": "Pituus (minuutteja):",
"LabelReleaseDate": "Julkaisupäivä:",
"Genre": "Tyylilaji",
"FolderTypeBooks": "Kirjat",
"FolderTypeMusicVideos": "Musiikkivideot",
"FolderTypeMusic": "Musiikki",
"FolderTypeMovies": "Elokuvat",
"File": "Tiedosto",
"Favorite": "Suosikki",
"Extras": "Extrat",
"ExitFullscreen": "Poistu kokonäyttötilasta",
"Episode": "Jakso",
"ButtonTogglePlaylist": "Soittolista",
"ButtonToggleContextMenu": "Lisää",
"Artist": "Artisti"
}

Some files were not shown because too many files have changed in this diff Show more