";
diff --git a/src/components/chromecast/chromecasthelpers.js b/src/components/chromecast/chromecasthelpers.js
index 0beba824c0..9d6f811cb1 100644
--- a/src/components/chromecast/chromecasthelpers.js
+++ b/src/components/chromecast/chromecasthelpers.js
@@ -5,7 +5,7 @@ define(['events'], function (events) {
//
// https://github.com/ravisorg/LinkParser
//
- // Locate and extract almost any URL within a string. Handles protocol-less domains, IPv4 and
+ // Locate and extract almost any URL within a string. Handles protocol-less domains, IPv4 and
// IPv6, unrecognised TLDs, and more.
//
// This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
@@ -14,26 +14,26 @@ define(['events'], function (events) {
// Original URL regex from the Android android.text.util.Linkify function, found here:
// http://stackoverflow.com/a/19696443
- //
- // However there were problems with it, most probably related to the fact it was
+ //
+ // However there were problems with it, most probably related to the fact it was
// written in 2007, and it's been highly modified.
- //
- // 1) I didn't like the fact that it was tied to specific TLDs, since new ones
+ //
+ // 1) I didn't like the fact that it was tied to specific TLDs, since new ones
// are being added all the time it wouldn't be reasonable to expect developer to
// be continually updating their regular expressions.
- //
- // 2) It didn't allow unicode characters in the domains which are now allowed in
+ //
+ // 2) It didn't allow unicode characters in the domains which are now allowed in
// many languages, (including some IDN TLDs). Again these are constantly being
// added to and it doesn't seem reasonable to hard-code them. Note this ended up
// not being possible in standard JS due to the way it handles multibyte strings.
// It is possible using XRegExp, however a big performance hit results. Disabled
// for now.
- //
+ //
// 3) It didn't allow for IPv6 hostnames
// IPv6 regex from http://stackoverflow.com/a/17871737
//
// 4) It was very poorly commented
- //
+ //
// 5) It wasn't as smart as it could have been about what should be part of a
// URL and what should be part of human language.
@@ -102,8 +102,8 @@ define(['events'], function (events) {
+ "|(?:\\%[a-f0-9]{2})"
// some characters are much more likely to be used AFTER a url and
// were not intended to be included in the url itself. Mostly end
- // of sentence type things. It's also likely that the URL would
- // still work if any of these characters were missing from the end
+ // of sentence type things. It's also likely that the URL would
+ // still work if any of these characters were missing from the end
// because we parsed it incorrectly. For these characters to be accepted
// they must be followed by another character that we're reasonably
// sure is part of the url
diff --git a/src/components/chromecast/chromecastplayer.js b/src/components/chromecast/chromecastplayer.js
index f3f7e6b865..7302b74124 100644
--- a/src/components/chromecast/chromecastplayer.js
+++ b/src/components/chromecast/chromecastplayer.js
@@ -479,8 +479,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
TotalRecordCount: 1
};
});
- }
- else {
+ } else {
query.Limit = query.Limit || 100;
query.ExcludeLocationTypes = "Virtual";
@@ -752,8 +751,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
ChromecastPlayer.prototype.volumeDown = function () {
var vol = this._castPlayer.session.receiver.volume.level;
- if (vol == null)
- {
+ if (vol == null) {
vol = 0.5;
}
vol -= 0.05;
@@ -776,8 +774,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
ChromecastPlayer.prototype.volumeUp = function () {
var vol = this._castPlayer.session.receiver.volume.level;
- if (vol == null)
- {
+ if (vol == null) {
vol = 0.5;
}
vol += 0.05;
diff --git a/src/components/collectioneditor/collectioneditor.js b/src/components/collectioneditor/collectioneditor.js
index ccb1cdc286..a91594556e 100644
--- a/src/components/collectioneditor/collectioneditor.js
+++ b/src/components/collectioneditor/collectioneditor.js
@@ -243,13 +243,13 @@ define(['dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManage
var title = items.length ? globalize.translate('HeaderAddToCollection') : globalize.translate('NewCollection');
html += '
\ No newline at end of file
+
diff --git a/src/components/multiselect/multiselect.js b/src/components/multiselect/multiselect.js
index d706b76b99..6b2906cb0a 100644
--- a/src/components/multiselect/multiselect.js
+++ b/src/components/multiselect/multiselect.js
@@ -1,5 +1,5 @@
-define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'globalize', 'appRouter', 'dom', 'css!./multiselect'], function (browser, appStorage, appHost, loading, connectionManager, globalize, appRouter, dom) {
- 'use strict';
+define(["browser", "appStorage", "apphost", "loading", "connectionManager", "globalize", "appRouter", "dom", "css!./multiselect"], function (browser, appStorage, appHost, loading, connectionManager, globalize, appRouter, dom) {
+ "use strict";
var selectedItems = [];
var selectedElements = [];
@@ -15,12 +15,12 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
selectedItems = [];
selectedElements = [];
- var elems = document.querySelectorAll('.itemSelectionPanel');
+ var elems = document.querySelectorAll(".itemSelectionPanel");
for (var i = 0, length = elems.length; i < length; i++) {
var parent = elems[i].parentNode;
parent.removeChild(elems[i]);
- parent.classList.remove('withMultiSelect');
+ parent.classList.remove("withMultiSelect");
}
}
}
@@ -28,13 +28,13 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
function onItemSelectionPanelClick(e, itemSelectionPanel) {
// toggle the checkbox, if it wasn't clicked on
- if (!dom.parentWithClass(e.target, 'chkItemSelect')) {
- var chkItemSelect = itemSelectionPanel.querySelector('.chkItemSelect');
+ if (!dom.parentWithClass(e.target, "chkItemSelect")) {
+ var chkItemSelect = itemSelectionPanel.querySelector(".chkItemSelect");
if (chkItemSelect) {
- if (chkItemSelect.classList.contains('checkedInitial')) {
- chkItemSelect.classList.remove('checkedInitial');
+ if (chkItemSelect.classList.contains("checkedInitial")) {
+ chkItemSelect.classList.remove("checkedInitial");
} else {
var newValue = !chkItemSelect.checked;
chkItemSelect.checked = newValue;
@@ -50,7 +50,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
function updateItemSelection(chkItemSelect, selected) {
- var id = dom.parentWithAttribute(chkItemSelect, 'data-id').getAttribute('data-id');
+ var id = dom.parentWithAttribute(chkItemSelect, "data-id").getAttribute("data-id");
if (selected) {
@@ -73,7 +73,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
}
if (selectedItems.length) {
- var itemSelectionCount = document.querySelector('.itemSelectionCount');
+ var itemSelectionCount = document.querySelector(".itemSelectionCount");
if (itemSelectionCount) {
itemSelectionCount.innerHTML = selectedItems.length;
}
@@ -88,27 +88,27 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
function showSelection(item, isChecked) {
- var itemSelectionPanel = item.querySelector('.itemSelectionPanel');
+ var itemSelectionPanel = item.querySelector(".itemSelectionPanel");
if (!itemSelectionPanel) {
- itemSelectionPanel = document.createElement('div');
- itemSelectionPanel.classList.add('itemSelectionPanel');
+ itemSelectionPanel = document.createElement("div");
+ itemSelectionPanel.classList.add("itemSelectionPanel");
- var parent = item.querySelector('.cardBox') || item.querySelector('.cardContent');
- parent.classList.add('withMultiSelect');
+ var parent = item.querySelector(".cardBox") || item.querySelector(".cardContent");
+ parent.classList.add("withMultiSelect");
parent.appendChild(itemSelectionPanel);
- var cssClass = 'chkItemSelect';
+ var cssClass = "chkItemSelect";
if (isChecked && !browser.firefox) {
// In firefox, the initial tap hold doesnt' get treated as a click
// In other browsers it does, so we need to make sure that initial click is ignored
- cssClass += ' checkedInitial';
+ cssClass += " checkedInitial";
}
- var checkedAttribute = isChecked ? ' checked' : '';
+ var checkedAttribute = isChecked ? " checked" : "";
itemSelectionPanel.innerHTML = '';
- var chkItemSelect = itemSelectionPanel.querySelector('.chkItemSelect');
- chkItemSelect.addEventListener('change', onSelectionChange);
+ var chkItemSelect = itemSelectionPanel.querySelector(".chkItemSelect");
+ chkItemSelect.addEventListener("change", onSelectionChange);
}
}
@@ -118,27 +118,27 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
if (!selectionCommandsPanel) {
- selectionCommandsPanel = document.createElement('div');
- selectionCommandsPanel.classList.add('selectionCommandsPanel');
+ selectionCommandsPanel = document.createElement("div");
+ selectionCommandsPanel.classList.add("selectionCommandsPanel");
document.body.appendChild(selectionCommandsPanel);
currentSelectionCommandsPanel = selectionCommandsPanel;
- var html = '';
+ var html = "";
html += 'close';
html += '';
- var moreIcon = '';
+ var moreIcon = "more_horiz";
html += '' + moreIcon + '';
selectionCommandsPanel.innerHTML = html;
- selectionCommandsPanel.querySelector('.btnCloseSelectionPanel').addEventListener('click', hideSelections);
+ selectionCommandsPanel.querySelector(".btnCloseSelectionPanel").addEventListener("click", hideSelections);
- var btnSelectionPanelOptions = selectionCommandsPanel.querySelector('.btnSelectionPanelOptions');
+ var btnSelectionPanelOptions = selectionCommandsPanel.querySelector(".btnSelectionPanelOptions");
- dom.addEventListener(btnSelectionPanelOptions, 'click', showMenuForSelectedItems, { passive: true });
+ dom.addEventListener(btnSelectionPanelOptions, "click", showMenuForSelectedItems, { passive: true });
}
}
@@ -146,7 +146,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
return new Promise(function (resolve, reject) {
- require(['alert'], function (alert) {
+ require(["alert"], function (alert) {
alert(options).then(resolve, resolve);
});
});
@@ -156,15 +156,15 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
return new Promise(function (resolve, reject) {
- var msg = globalize.translate('ConfirmDeleteItem');
- var title = globalize.translate('HeaderDeleteItem');
+ var msg = globalize.translate("ConfirmDeleteItem");
+ var title = globalize.translate("HeaderDeleteItem");
if (itemIds.length > 1) {
- msg = globalize.translate('ConfirmDeleteItems');
- title = globalize.translate('HeaderDeleteItems');
+ msg = globalize.translate("ConfirmDeleteItems");
+ title = globalize.translate("HeaderDeleteItems");
}
- require(['confirm'], function (confirm) {
+ require(["confirm"], function (confirm) {
confirm(msg, title).then(function () {
var promises = itemIds.map(function (itemId) {
@@ -173,7 +173,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
Promise.all(promises).then(resolve, function () {
- alertText(globalize.translate('ErrorDeletingItem')).then(reject, reject);
+ alertText(globalize.translate("ErrorDeletingItem")).then(reject, reject);
});
}, reject);
@@ -190,59 +190,60 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
var menuItems = [];
menuItems.push({
- name: globalize.translate('AddToCollection'),
- id: 'addtocollection',
- ironIcon: 'add'
+ name: globalize.translate("AddToCollection"),
+ id: "addtocollection",
+ icon: "add"
});
menuItems.push({
- name: globalize.translate('AddToPlaylist'),
- id: 'playlist',
- ironIcon: 'playlist-add'
+ name: globalize.translate("AddToPlaylist"),
+ id: "playlist",
+ icon: "playlist_add"
});
// TODO: Be more dynamic based on what is selected
if (user.Policy.EnableContentDeletion) {
menuItems.push({
- name: globalize.translate('Delete'),
- id: 'delete',
- ironIcon: 'delete'
+ name: globalize.translate("Delete"),
+ id: "delete",
+ icon: "delete"
});
}
- if (user.Policy.EnableContentDownloading && appHost.supports('filedownload')) {
+ if (user.Policy.EnableContentDownloading && appHost.supports("filedownload")) {
menuItems.push({
- name: Globalize.translate('ButtonDownload'),
- id: 'download',
- ironIcon: 'file-download'
+ name: Globalize.translate("ButtonDownload"),
+ id: "download",
+ icon: "file_download"
});
}
if (user.Policy.IsAdministrator) {
menuItems.push({
- name: globalize.translate('GroupVersions'),
- id: 'groupvideos',
- ironIcon: 'call-merge'
+ name: globalize.translate("GroupVersions"),
+ id: "groupvideos",
+ icon: "call_merge"
});
}
menuItems.push({
- name: globalize.translate('MarkPlayed'),
- id: 'markplayed'
+ name: globalize.translate("MarkPlayed"),
+ id: "markplayed",
+ icon: "check_box"
});
menuItems.push({
- name: globalize.translate('MarkUnplayed'),
- id: 'markunplayed'
+ name: globalize.translate("MarkUnplayed"),
+ id: "markunplayed",
+ icon: "check_box_outline_blank"
});
menuItems.push({
- name: globalize.translate('RefreshMetadata'),
- id: 'refresh'
+ name: globalize.translate("RefreshMetadata"),
+ id: "refresh",
+ icon: "refresh"
});
-
-
require(['actionsheet'], function (actionsheet) {
actionsheet.show({
items: menuItems,
@@ -252,8 +253,8 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
var serverId = apiClient.serverInfo().Id;
switch (id) {
- case 'addtocollection':
- require(['collectionEditor'], function (collectionEditor) {
+ case "addtocollection":
+ require(["collectionEditor"], function (collectionEditor) {
new collectionEditor().show({
items: items,
serverId: serverId
@@ -262,8 +263,8 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
hideSelections();
dispatchNeedsRefresh();
break;
- case 'playlist':
- require(['playlistEditor'], function (playlistEditor) {
+ case "playlist":
+ require(["playlistEditor"], function (playlistEditor) {
new playlistEditor().show({
items: items,
serverId: serverId
@@ -272,30 +273,30 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
hideSelections();
dispatchNeedsRefresh();
break;
- case 'delete':
+ case "delete":
deleteItems(apiClient, items).then(dispatchNeedsRefresh);
hideSelections();
dispatchNeedsRefresh();
break;
- case 'groupvideos':
+ case "groupvideos":
combineVersions(apiClient, items);
break;
- case 'markplayed':
+ case "markplayed":
items.forEach(function (itemId) {
apiClient.markPlayed(apiClient.getCurrentUserId(), itemId);
});
hideSelections();
dispatchNeedsRefresh();
break;
- case 'markunplayed':
+ case "markunplayed":
items.forEach(function (itemId) {
apiClient.markUnplayed(apiClient.getCurrentUserId(), itemId);
});
hideSelections();
dispatchNeedsRefresh();
break;
- case 'refresh':
- require(['refreshDialog'], function (refreshDialog) {
+ case "refresh":
+ require(["refreshDialog"], function (refreshDialog) {
new refreshDialog({
itemIds: items,
serverId: serverId
@@ -320,7 +321,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
[].forEach.call(selectedElements, function (i) {
- var container = dom.parentWithAttribute(i, 'is', 'emby-itemscontainer');
+ var container = dom.parentWithAttribute(i, "is", "emby-itemscontainer");
if (container && elems.indexOf(container) === -1) {
elems.push(container);
@@ -336,9 +337,9 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
if (selection.length < 2) {
- require(['alert'], function (alert) {
+ require(["alert"], function (alert) {
alert({
- text: globalize.translate('PleaseSelectTwoItems')
+ text: globalize.translate("PleaseSelectTwoItems")
});
});
return;
@@ -349,7 +350,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
apiClient.ajax({
type: "POST",
- url: apiClient.getUrl("Videos/MergeVersions", { Ids: selection.join(',') })
+ url: apiClient.getUrl("Videos/MergeVersions", { Ids: selection.join(",") })
}).then(function () {
@@ -361,8 +362,8 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
function showSelections(initialCard) {
- require(['emby-checkbox'], function () {
- var cards = document.querySelectorAll('.card');
+ require(["emby-checkbox"], function () {
+ var cards = document.querySelectorAll(".card");
for (var i = 0, length = cards.length; i < length; i++) {
showSelection(cards[i], initialCard === cards[i]);
}
@@ -378,9 +379,9 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
if (selectedItems.length) {
- var card = dom.parentWithClass(target, 'card');
+ var card = dom.parentWithClass(target, "card");
if (card) {
- var itemSelectionPanel = card.querySelector('.itemSelectionPanel');
+ var itemSelectionPanel = card.querySelector(".itemSelectionPanel");
if (itemSelectionPanel) {
return onItemSelectionPanelClick(e, itemSelectionPanel);
}
@@ -392,7 +393,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
}
}
- document.addEventListener('viewbeforehide', hideSelections);
+ document.addEventListener("viewbeforehide", hideSelections);
return function (options) {
@@ -402,7 +403,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
function onTapHold(e) {
- var card = dom.parentWithClass(e.target, 'card');
+ var card = dom.parentWithClass(e.target, "card");
if (card) {
@@ -439,7 +440,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
var element = touch.target;
if (element) {
- var card = dom.parentWithClass(element, 'card');
+ var card = dom.parentWithClass(element, "card");
if (card) {
@@ -508,7 +509,7 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
return;
}
- var card = dom.parentWithClass(touchTarget, 'card');
+ var card = dom.parentWithClass(touchTarget, "card");
touchTarget = null;
if (card) {
@@ -521,27 +522,27 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
// mobile safari doesn't allow contextmenu override
if (browser.touch && !browser.safari) {
- element.addEventListener('contextmenu', onTapHold);
+ element.addEventListener("contextmenu", onTapHold);
} else {
- dom.addEventListener(element, 'touchstart', onTouchStart, {
+ dom.addEventListener(element, "touchstart", onTouchStart, {
passive: true
});
- dom.addEventListener(element, 'touchmove', onTouchMove, {
+ dom.addEventListener(element, "touchmove", onTouchMove, {
passive: true
});
- dom.addEventListener(element, 'touchend', onTouchEnd, {
+ dom.addEventListener(element, "touchend", onTouchEnd, {
passive: true
});
- dom.addEventListener(element, 'touchcancel', onTouchEnd, {
+ dom.addEventListener(element, "touchcancel", onTouchEnd, {
passive: true
});
- dom.addEventListener(element, 'mousedown', onMouseDown, {
+ dom.addEventListener(element, "mousedown", onMouseDown, {
passive: true
});
- dom.addEventListener(element, 'mouseleave', onMouseOut, {
+ dom.addEventListener(element, "mouseleave", onMouseOut, {
passive: true
});
- dom.addEventListener(element, 'mouseup', onMouseOut, {
+ dom.addEventListener(element, "mouseup", onMouseOut, {
passive: true
});
}
@@ -550,38 +551,38 @@ define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'glo
initTapHold(container);
if (options.bindOnClick !== false) {
- container.addEventListener('click', onContainerClick);
+ container.addEventListener("click", onContainerClick);
}
self.onContainerClick = onContainerClick;
self.destroy = function () {
- container.removeEventListener('click', onContainerClick);
- container.removeEventListener('contextmenu', onTapHold);
+ container.removeEventListener("click", onContainerClick);
+ container.removeEventListener("contextmenu", onTapHold);
var element = container;
- dom.removeEventListener(element, 'touchstart', onTouchStart, {
+ dom.removeEventListener(element, "touchstart", onTouchStart, {
passive: true
});
- dom.removeEventListener(element, 'touchmove', onTouchMove, {
+ dom.removeEventListener(element, "touchmove", onTouchMove, {
passive: true
});
- dom.removeEventListener(element, 'touchend', onTouchEnd, {
+ dom.removeEventListener(element, "touchend", onTouchEnd, {
passive: true
});
// this fires in safari due to magnifying class
- //dom.removeEventListener(element, 'touchcancel', onTouchEnd, {
+ //dom.removeEventListener(element, "touchcancel", onTouchEnd, {
// passive: true
//});
- dom.removeEventListener(element, 'mousedown', onMouseDown, {
+ dom.removeEventListener(element, "mousedown", onMouseDown, {
passive: true
});
- dom.removeEventListener(element, 'mouseleave', onMouseOut, {
+ dom.removeEventListener(element, "mouseleave", onMouseOut, {
passive: true
});
- dom.removeEventListener(element, 'mouseup', onMouseOut, {
+ dom.removeEventListener(element, "mouseup", onMouseOut, {
passive: true
});
};
diff --git a/src/components/navdrawer/navdrawer.js b/src/components/navdrawer/navdrawer.js
index cbf5c1eebc..69adbd1f5a 100644
--- a/src/components/navdrawer/navdrawer.js
+++ b/src/components/navdrawer/navdrawer.js
@@ -21,13 +21,13 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
}
function onMenuTouchMove(e) {
- var isOpen = self.visible,
- touches = getTouches(e),
- touch = touches[0] || {},
- endX = touch.clientX || 0,
- endY = touch.clientY || 0,
- deltaX = endX - (menuTouchStartX || 0),
- deltaY = endY - (menuTouchStartY || 0);
+ var isOpen = self.visible;
+ var touches = getTouches(e);
+ var touch = touches[0] || {};
+ var endX = touch.clientX || 0;
+ var endY = touch.clientY || 0;
+ var deltaX = endX - (menuTouchStartX || 0);
+ var deltaY = endY - (menuTouchStartY || 0);
setVelocity(deltaX), isOpen && 1 !== dragMode && deltaX > 0 && (dragMode = 2), 0 === dragMode && (!isOpen || Math.abs(deltaX) >= 10) && Math.abs(deltaY) < 5 ? (dragMode = 1, scrollContainer.addEventListener("scroll", disableEvent), self.showMask()) : 0 === dragMode && Math.abs(deltaY) >= 5 && (dragMode = 2), 1 === dragMode && (newPos = currentPos + deltaX, self.changeMenuPos())
}
@@ -36,12 +36,12 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
scrollContainer.removeEventListener("scroll", disableEvent);
dragMode = 0;
- var touches = getTouches(e),
- touch = touches[0] || {},
- endX = touch.clientX || 0,
- endY = touch.clientY || 0,
- deltaX = endX - (menuTouchStartX || 0),
- deltaY = endY - (menuTouchStartY || 0);
+ var touches = getTouches(e);
+ var touch = touches[0] || {};
+ var endX = touch.clientX || 0;
+ var endY = touch.clientY || 0;
+ var deltaX = endX - (menuTouchStartX || 0);
+ var deltaY = endY - (menuTouchStartY || 0);
currentPos = deltaX;
self.checkMenuState(deltaX, deltaY);
@@ -78,15 +78,15 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
}
function onBackgroundTouchStart(e) {
- var touches = getTouches(e),
- touch = touches[0] || {};
+ var touches = getTouches(e);
+ var touch = touches[0] || {};
backgroundTouchStartX = touch.clientX, backgroundTouchStartTime = (new Date).getTime()
}
function onBackgroundTouchMove(e) {
- var touches = getTouches(e),
- touch = touches[0] || {},
- endX = touch.clientX || 0;
+ var touches = getTouches(e);
+ var touch = touches[0] || {};
+ var endX = touch.clientX || 0;
if (endX <= options.width && self.isVisible) {
countStart++;
var deltaX = endX - (backgroundTouchStartX || 0);
@@ -100,10 +100,10 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
}
function onBackgroundTouchEnd(e) {
- var touches = getTouches(e),
- touch = touches[0] || {},
- endX = touch.clientX || 0,
- deltaX = endX - (backgroundTouchStartX || 0);
+ var touches = getTouches(e);
+ var touch = touches[0] || {};
+ var endX = touch.clientX || 0;
+ var deltaX = endX - (backgroundTouchStartX || 0);
self.checkMenuState(deltaX), countStart = 0
}
@@ -111,21 +111,24 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
var classList = mask.classList;
classList.contains("backdrop") || classList.add("hide")
}
- var self, defaults, mask, newPos = 0,
- currentPos = 0,
- startPoint = 0,
- countStart = 0,
- velocity = 0;
+ var self;
+ var defaults;
+ var mask;
+ var newPos = 0;
+ var currentPos = 0;
+ var startPoint = 0;
+ var countStart = 0;
+ var velocity = 0;
options.target.classList.add("transition");
- var dragMode = 0,
- scrollContainer = options.target.querySelector(".mainDrawer-scrollContainer");
+ var dragMode = 0;
+ var scrollContainer = options.target.querySelector(".mainDrawer-scrollContainer");
scrollContainer.classList.add("scrollY");
var TouchMenuLA = function() {
self = this, defaults = {
width: 260,
handleSize: 10,
disableMask: !1,
- maxMaskOpacity: .5
+ maxMaskOpacity: 0.5
}, this.isVisible = !1, this.initialize()
};
TouchMenuLA.prototype.initElements = function() {
@@ -133,8 +136,11 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
passive: !0
}))
};
- var menuTouchStartX, menuTouchStartY, menuTouchStartTime, edgeContainer = document.querySelector(".mainDrawerHandle"),
- isPeeking = !1;
+ var menuTouchStartX;
+ var menuTouchStartY;
+ var menuTouchStartTime;
+ var edgeContainer = document.querySelector(".mainDrawerHandle");
+ var isPeeking = false;
TouchMenuLA.prototype.animateToPosition = function(pos) {
requestAnimationFrame(function() {
options.target.style.transform = pos ? "translateX(" + pos + "px)" : "none"
@@ -146,7 +152,7 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
self.close()
})
}, TouchMenuLA.prototype.checkMenuState = function(deltaX, deltaY) {
- velocity >= .4 ? deltaX >= 0 || Math.abs(deltaY || 0) >= 70 ? self.open() : self.close() : newPos >= 100 ? self.open() : newPos && self.close()
+ velocity >= 0.4 ? deltaX >= 0 || Math.abs(deltaY || 0) >= 70 ? self.open() : self.close() : newPos >= 100 ? self.open() : newPos && self.close()
}, TouchMenuLA.prototype.open = function() {
this.animateToPosition(options.width), currentPos = options.width, this.isVisible = !0, options.target.classList.add("drawer-open"), self.showMask(), self.invoke(options.onChange)
}, TouchMenuLA.prototype.close = function() {
@@ -154,7 +160,8 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
}, TouchMenuLA.prototype.toggle = function() {
self.isVisible ? self.close() : self.open()
};
- var backgroundTouchStartX, backgroundTouchStartTime;
+ var backgroundTouchStartX;
+ var backgroundTouchStartTime;
TouchMenuLA.prototype.showMask = function() {
mask.classList.remove("hide"), mask.offsetWidth, mask.classList.add("backdrop")
}, TouchMenuLA.prototype.hideMask = function() {
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index c30819f423..2c3e45b630 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -19,8 +19,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
setTimeout(function () {
if (notification.close) {
notification.close();
- }
- else if (notification.cancel) {
+ } else if (notification.cancel) {
notification.cancel();
}
}, timeoutMs);
@@ -176,15 +175,12 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
if (status === 'completed') {
notification.title = globalize.translate('PackageInstallCompleted').replace('{0}', installation.Name + ' ' + installation.Version);
notification.vibrate = true;
- }
- else if (status === 'cancelled') {
+ } else if (status === 'cancelled') {
notification.title = globalize.translate('PackageInstallCancelled').replace('{0}', installation.Name + ' ' + installation.Version);
- }
- else if (status === 'failed') {
+ } else if (status === 'failed') {
notification.title = globalize.translate('PackageInstallFailed').replace('{0}', installation.Name + ' ' + installation.Version);
notification.vibrate = true;
- }
- else if (status === 'progress') {
+ } else if (status === 'progress') {
notification.title = globalize.translate('InstallingPackage').replace('{0}', installation.Name + ' ' + installation.Version);
notification.actions =
diff --git a/src/components/nowplayingbar/nowplayingbar.js b/src/components/nowplayingbar/nowplayingbar.js
index 9fac61ba1f..37a1a32f56 100644
--- a/src/components/nowplayingbar/nowplayingbar.js
+++ b/src/components/nowplayingbar/nowplayingbar.js
@@ -42,31 +42,31 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
// The onclicks are needed due to the return false above
html += '
';
- html += '';
+ html += 'skip_previous';
- html += '';
+ html += 'pause';
html += 'stop';
- html += '';
+ html += 'skip_next';
html += '';
html += '
';
html += '
';
- html += '';
+ html += 'volume_up';
html += '
';
html += '';
html += '
';
- html += '';
+ html += 'repeat';
html += '
';
html += '
';
- html += '';
- html += '';
+ html += 'pause';
+ html += 'playlist_play';
html += '
';
html += '';
@@ -134,7 +134,8 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
}
});
- var i, length;
+ var i;
+ var length;
playPauseButtons = elem.querySelectorAll('.playPauseButton');
for (i = 0, length = playPauseButtons.length; i < length; i++) {
playPauseButtons[i].addEventListener('click', onPlayPauseClick);
@@ -195,7 +196,6 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
volumeSlider.addEventListener('mousemove', setVolume);
volumeSlider.addEventListener('touchmove', setVolume);
-
positionSlider = elem.querySelector('.nowPlayingBarPositionSlider');
positionSlider.addEventListener('change', function () {
@@ -282,8 +282,8 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
}
function updatePlayPauseState(isPaused) {
-
- var i, length;
+ var i;
+ var length;
if (playPauseButtons) {
if (isPaused) {
@@ -345,8 +345,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
if (repeatMode === 'RepeatAll') {
toggleRepeatButtonIcon.innerHTML = "repeat";
toggleRepeatButton.classList.add('repeatButton-active');
- }
- else if (repeatMode === 'RepeatOne') {
+ } else if (repeatMode === 'RepeatOne') {
toggleRepeatButtonIcon.innerHTML = "repeat_one";
toggleRepeatButton.classList.add('repeatButton-active');
} else {
@@ -401,9 +400,9 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
}
if (isMuted) {
- muteButton.querySelector('i').innerHTML = '';
+ muteButton.querySelector('i').innerHTML = 'volume_off';
} else {
- muteButton.querySelector('i').innerHTML = '';
+ muteButton.querySelector('i').innerHTML = 'volume_up';
}
if (progressElement) {
@@ -572,7 +571,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
var userData = item.UserData || {};
var likes = userData.Likes == null ? '' : userData.Likes;
- nowPlayingUserData.innerHTML = '';
+ nowPlayingUserData.innerHTML = 'favorite';
});
}
diff --git a/src/components/playback/autoplaydetect.js b/src/components/playback/autoplaydetect.js
index 7a7a73a538..3610eef2ab 100644
--- a/src/components/playback/autoplaydetect.js
+++ b/src/components/playback/autoplaydetect.js
@@ -48,9 +48,7 @@ define([], function () {
}
timeout = setTimeout(testAutoplay, 500);
- }
-
- catch (e) {
+ } catch (e) {
reject();
return;
}
diff --git a/src/components/playback/brightnessosd.js b/src/components/playback/brightnessosd.js
index 1797463f29..b2bf9d4106 100644
--- a/src/components/playback/brightnessosd.js
+++ b/src/components/playback/brightnessosd.js
@@ -11,7 +11,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia
function getOsdElementHtml() {
var html = '';
- html += '';
+ html += 'brightness_high';
html += '
';
@@ -102,12 +102,11 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia
if (iconElement) {
if (brightness >= 80) {
- iconElement.innerHTML = '';
- }
- else if (brightness >= 20) {
- iconElement.innerHTML = '';
+ iconElement.innerHTML = 'brightness_high';
+ } else if (brightness >= 20) {
+ iconElement.innerHTML = 'brightness_medium';
} else {
- iconElement.innerHTML = '';
+ iconElement.innerHTML = 'brightness_low';
}
}
if (progressElement) {
@@ -162,4 +161,4 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia
bindToPlayer(playbackManager.getCurrentPlayer());
-});
\ No newline at end of file
+});
diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js
index 63e0bde6c1..7f4b9f519e 100644
--- a/src/components/playback/mediasession.js
+++ b/src/components/playback/mediasession.js
@@ -158,7 +158,7 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
lastUpdateTime = now;
- if (navigator.mediaSession){
+ if (navigator.mediaSession) {
navigator.mediaSession.metadata = new MediaMetadata({
title: title,
artist: artist,
@@ -278,7 +278,6 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
}
if (navigator.mediaSession) {
-
navigator.mediaSession.setActionHandler('previoustrack', function () {
execute('previousTrack');
});
diff --git a/src/components/playback/nowplayinghelper.js b/src/components/playback/nowplayinghelper.js
index d5803b426f..b1af977ab0 100644
--- a/src/components/playback/nowplayinghelper.js
+++ b/src/components/playback/nowplayinghelper.js
@@ -43,8 +43,7 @@ define([], function () {
} else if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) {
bottomText = nowPlayingItem.Artists.join(', ');
- }
- else if (nowPlayingItem.SeriesName || nowPlayingItem.Album) {
+ } else if (nowPlayingItem.SeriesName || nowPlayingItem.Album) {
bottomText = topText;
topText = nowPlayingItem.SeriesName || nowPlayingItem.Album;
@@ -60,8 +59,7 @@ define([], function () {
} else {
topItem = null;
}
- }
- else if (nowPlayingItem.ProductionYear && includeNonNameInfo !== false) {
+ } else if (nowPlayingItem.ProductionYear && includeNonNameInfo !== false) {
bottomText = nowPlayingItem.ProductionYear;
}
diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js
index 13497e1912..23f0d4572e 100644
--- a/src/components/playback/playbackmanager.js
+++ b/src/components/playback/playbackmanager.js
@@ -107,8 +107,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
TotalRecordCount: 1
};
});
- }
- else {
+ } else {
query.Limit = query.Limit || 300;
query.Fields = "Chapters";
@@ -182,8 +181,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
if (container === 'm4a') {
return 'audio/mp4';
}
- }
- else if (type === 'video') {
+ } else if (type === 'video') {
if (container === 'mkv') {
return 'video/x-matroska';
}
@@ -212,8 +210,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
var results = regex.exec(url);
if (results == null) {
return "";
- }
- else {
+ } else {
return decodeURIComponent(results[1].replace(/\+/g, " "));
}
}
@@ -649,13 +646,10 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
// If this is the only way it can be played, then allow it
if (!mediaSource.SupportsDirectStream && !mediaSource.SupportsTranscoding) {
return Promise.resolve(true);
- }
- else {
+ } else {
return isHostReachable(mediaSource, apiClient);
}
- }
-
- else if (mediaSource.Protocol === 'File') {
+ } else if (mediaSource.Protocol === 'File') {
return new Promise(function (resolve, reject) {
@@ -1272,7 +1266,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
var currentMediaSource = self.currentMediaSource(player);
var mediaStreams = [];
- var i, length;
+ var i;
+ var length;
for (i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) {
if (currentMediaSource.MediaStreams[i].Type === 'Audio') {
mediaStreams.push(currentMediaSource.MediaStreams[i]);
@@ -1316,7 +1311,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
var currentMediaSource = self.currentMediaSource(player);
var mediaStreams = [];
- var i, length;
+ var i;
+ var length;
for (i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) {
if (currentMediaSource.MediaStreams[i].Type === 'Subtitle') {
mediaStreams.push(currentMediaSource.MediaStreams[i]);
@@ -1360,7 +1356,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
function isAudioStreamSupported(mediaSource, index, deviceProfile) {
var mediaStream;
- var i, length;
+ var i;
+ var length;
var mediaStreams = mediaSource.MediaStreams;
for (i = 0, length = mediaStreams.length; i < length; i++) {
@@ -1423,8 +1420,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
if (isAudioStreamSupported(self.currentMediaSource(player), index, profile)) {
player.setAudioStreamIndex(index);
getPlayerData(player).audioStreamIndex = index;
- }
- else {
+ } else {
changeStream(player, getCurrentTicks(player), { AudioStreamIndex: index });
getPlayerData(player).audioStreamIndex = index;
}
@@ -1595,8 +1591,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
// Need to change the transcoded stream to remove subs
changeStream(player, getCurrentTicks(player), { SubtitleStreamIndex: -1 });
}
- }
- else if (!currentStream && newStream) {
+ } else if (!currentStream && newStream) {
if (getDeliveryMethod(newStream) === 'External') {
selectedTrackElementIndex = index;
@@ -1607,8 +1602,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
// Need to change the transcoded stream to add subs
changeStream(player, getCurrentTicks(player), { SubtitleStreamIndex: index });
}
- }
- else if (currentStream && newStream) {
+ } else if (currentStream && newStream) {
// Switching tracks
// We can handle this clientside if the new track is external or the new track is embedded and we're not transcoding
@@ -1645,7 +1639,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
player = player || self._currentPlayer;
if (player.disableShowingSubtitleOffset) {
player.disableShowingSubtitleOffset();
- }
+ }
}
self.isShowingSubtitleOffsetEnabled = function(player) {
@@ -1674,7 +1668,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
self.canHandleOffsetOnCurrentSubtitle = function(player) {
var index = self.getSubtitleStreamIndex(player);
- return index !== -1 && self.isSubtitleStreamExternal(index, player);
+ return index !== -1 && self.isSubtitleStreamExternal(index, player);
}
self.seek = function (ticks, player) {
@@ -1865,17 +1859,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
if (firstItem.Type === "Program") {
promise = getItemsForPlayback(serverId, {
- Ids: firstItem.ChannelId,
+ Ids: firstItem.ChannelId
});
- }
- else if (firstItem.Type === "Playlist") {
+ } else if (firstItem.Type === "Playlist") {
promise = getItemsForPlayback(serverId, {
ParentId: firstItem.Id,
SortBy: options.shuffle ? 'Random' : null
});
- }
- else if (firstItem.Type === "MusicArtist") {
+ } else if (firstItem.Type === "MusicArtist") {
promise = getItemsForPlayback(serverId, {
ArtistIds: firstItem.Id,
@@ -1885,8 +1877,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
MediaTypes: "Audio"
});
- }
- else if (firstItem.MediaType === "Photo") {
+ } else if (firstItem.MediaType === "Photo") {
promise = getItemsForPlayback(serverId, {
ParentId: firstItem.ParentId,
@@ -1915,8 +1906,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return Promise.resolve(result);
});
- }
- else if (firstItem.Type === "PhotoAlbum") {
+ } else if (firstItem.Type === "PhotoAlbum") {
promise = getItemsForPlayback(serverId, {
ParentId: firstItem.Id,
@@ -1928,8 +1918,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
Limit: 1000
});
- }
- else if (firstItem.Type === "MusicGenre") {
+ } else if (firstItem.Type === "MusicGenre") {
promise = getItemsForPlayback(serverId, {
GenreIds: firstItem.Id,
@@ -1938,8 +1927,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
SortBy: options.shuffle ? 'Random' : 'SortName',
MediaTypes: "Audio"
});
- }
- else if (firstItem.IsFolder) {
+ } else if (firstItem.IsFolder) {
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
@@ -1951,8 +1939,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
MediaTypes: "Audio,Video"
}, queryOptions));
- }
- else if (firstItem.Type === "Episode" && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
+ } else if (firstItem.Type === "Episode" && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
promise = new Promise(function (resolve, reject) {
var apiClient = connectionManager.getApiClient(firstItem.ServerId);
@@ -2537,16 +2524,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
playMethod = 'DirectPlay';
- }
-
- else if (mediaSource.StreamUrl) {
+ } else if (mediaSource.StreamUrl) {
// Only used for audio
playMethod = 'Transcode';
mediaUrl = mediaSource.StreamUrl;
- }
-
- else if (mediaSource.SupportsDirectStream) {
+ } else if (mediaSource.SupportsDirectStream) {
directOptions = {
Static: true,
@@ -2706,9 +2689,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return p.canPlayItem(item, playOptions);
}
return true;
- }
-
- else if (item.Url && p.canPlayUrl) {
+ } else if (item.Url && p.canPlayUrl) {
return p.canPlayUrl(item.Url);
}
}
@@ -3222,8 +3203,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
if (displayErrorCode && typeof (displayErrorCode) === 'string') {
showPlaybackInfoErrorMessage(self, displayErrorCode, nextItem);
- }
- else if (nextItem) {
+ } else if (nextItem) {
self.nextTrack();
}
}
diff --git a/src/components/playback/playbackorientation.js b/src/components/playback/playbackorientation.js
index 731d9c3c42..3253d8acdf 100644
--- a/src/components/playback/playbackorientation.js
+++ b/src/components/playback/playbackorientation.js
@@ -29,8 +29,7 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager
// returns a boolean
orientationLocked = promise;
}
- }
- catch (err) {
+ } catch (err) {
onOrientationChangeError(err);
}
}
@@ -46,8 +45,7 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager
if (unlockOrientation) {
try {
unlockOrientation();
- }
- catch (err) {
+ } catch (err) {
console.log('error unlocking orientation: ' + err);
}
orientationLocked = false;
diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js
index 2102720e9a..97e6e46230 100644
--- a/src/components/playback/playerSelectionMenu.js
+++ b/src/components/playback/playerSelectionMenu.js
@@ -63,17 +63,17 @@ define(['appSettings', 'events', 'browser', 'loading', 'playbackManager', 'appRo
switch (deviceType) {
case 'smartphone':
- return '';
+ return 'smartphone';
case 'tablet':
- return '';
+ return 'tablet';
case 'tv':
- return '';
+ return 'tv';
case 'cast':
- return '';
+ return 'cast';
case 'desktop':
- return '';
+ return 'computer';
default:
- return '';
+ return 'tv';
}
}
@@ -153,7 +153,6 @@ define(['appSettings', 'events', 'browser', 'loading', 'playbackManager', 'appRo
});
}
-
function disconnectFromPlayer(currentDeviceName) {
if (playbackManager.getSupportedCommands().indexOf('EndSession') !== -1) {
@@ -193,7 +192,6 @@ define(['appSettings', 'events', 'browser', 'loading', 'playbackManager', 'appRo
});
-
} else {
playbackManager.setDefaultPlayerActive();
@@ -275,8 +273,7 @@ define(['appSettings', 'events', 'browser', 'loading', 'playbackManager', 'appRo
dialogHelper.open(dlg).then(function () {
if (destination === 'nowplaying') {
appRouter.showNowPlaying();
- }
- else if (destination === 'disconnectFromPlayer') {
+ } else if (destination === 'disconnectFromPlayer') {
disconnectFromPlayer(currentDeviceName);
}
}, emptyCallback);
@@ -320,4 +317,4 @@ define(['appSettings', 'events', 'browser', 'loading', 'playbackManager', 'appRo
return {
show: showPlayerSelection
};
-});
\ No newline at end of file
+});
diff --git a/src/components/playback/playmethodhelper.js b/src/components/playback/playmethodhelper.js
index 58458aa399..4e85f87093 100644
--- a/src/components/playback/playmethodhelper.js
+++ b/src/components/playback/playmethodhelper.js
@@ -9,14 +9,11 @@ define([], function () {
if (session.TranscodingInfo && session.TranscodingInfo.IsVideoDirect) {
return 'DirectStream';
- }
- else if (session.PlayState.PlayMethod === 'Transcode') {
+ } else if (session.PlayState.PlayMethod === 'Transcode') {
return 'Transcode';
- }
- else if (session.PlayState.PlayMethod === 'DirectStream') {
+ } else if (session.PlayState.PlayMethod === 'DirectStream') {
return 'DirectPlay';
- }
- else if (session.PlayState.PlayMethod === 'DirectPlay') {
+ } else if (session.PlayState.PlayMethod === 'DirectPlay') {
return 'DirectPlay';
}
}
diff --git a/src/components/playback/playqueuemanager.js b/src/components/playback/playqueuemanager.js
index 2cbaf1d9f4..ed2076a814 100644
--- a/src/components/playback/playqueuemanager.js
+++ b/src/components/playback/playqueuemanager.js
@@ -58,15 +58,15 @@ define([], function () {
function arrayInsertAt(destArray, pos, arrayToInsert) {
var args = [];
- args.push(pos); // where to insert
- args.push(0); // nothing to remove
- args = args.concat(arrayToInsert); // add on array to insert
- destArray.splice.apply(destArray, args); // splice it in
+ args.push(pos); // where to insert
+ args.push(0); // nothing to remove
+ args = args.concat(arrayToInsert); // add on array to insert
+ destArray.splice.apply(destArray, args); // splice it in
}
PlayQueueManager.prototype.queueNext = function (items) {
-
- var i, length;
+ var i;
+ var length;
for (i = 0, length = items.length; i < length; i++) {
diff --git a/src/components/playback/volumeosd.js b/src/components/playback/volumeosd.js
index c7a3438d54..b622cc18b1 100644
--- a/src/components/playback/volumeosd.js
+++ b/src/components/playback/volumeosd.js
@@ -11,7 +11,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia
function getOsdElementHtml() {
var html = '';
- html += '';
+ html += 'volume_up';
html += '
';
@@ -101,7 +101,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia
function updatePlayerVolumeState(isMuted, volume) {
if (iconElement) {
- iconElement.innerHTML = isMuted ? '' : '';
+ iconElement.innerHTML = isMuted ? 'volume_off' : 'volume_up';
}
if (progressElement) {
progressElement.style.width = (volume || 0) + '%';
@@ -155,4 +155,4 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia
bindToPlayer(playbackManager.getCurrentPlayer());
-});
\ No newline at end of file
+});
diff --git a/src/components/playerstats/playerstats.js b/src/components/playerstats/playerstats.js
index 5e097f2fe2..4179192dd2 100644
--- a/src/components/playerstats/playerstats.js
+++ b/src/components/playerstats/playerstats.js
@@ -364,8 +364,7 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth
var category = playerStats[i];
if (category.type === 'audio') {
category.name = 'Audio Info';
- }
- else if (category.type === 'video') {
+ } else if (category.type === 'video') {
category.name = 'Video Info';
}
categories.push(category);
diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js
index 0379e56347..4738211a5e 100644
--- a/src/components/playlisteditor/playlisteditor.js
+++ b/src/components/playlisteditor/playlisteditor.js
@@ -258,7 +258,7 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
var title = globalize.translate('HeaderAddToPlaylist');
html += '
';
- html += '';
+ html += 'arrow_back';
html += '
';
html += title;
html += '
';
@@ -295,4 +295,4 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
};
return PlaylistEditor;
-});
\ No newline at end of file
+});
diff --git a/src/components/polyfills/focusPreventScroll.js b/src/components/polyfills/focusPreventScroll.js
new file mode 100644
index 0000000000..6511c0426c
--- /dev/null
+++ b/src/components/polyfills/focusPreventScroll.js
@@ -0,0 +1,41 @@
+// Polyfill to add support for preventScroll by focus function
+
+if (HTMLElement.prototype.nativeFocus === undefined) {
+ (function () {
+ var supportsPreventScrollOption = false;
+ try {
+ var focusElem = document.createElement("div");
+
+ focusElem.addEventListener("focus", function(event) {
+ event.preventDefault();
+ event.stopPropagation();
+ }, true);
+
+ var opts = Object.defineProperty({}, "preventScroll", {
+ get: function () {
+ supportsPreventScrollOption = true;
+ }
+ });
+
+ focusElem.focus(opts);
+ } catch (e) {
+ console.log("error checking preventScroll support");
+ }
+
+ if (!supportsPreventScrollOption) {
+ HTMLElement.prototype.nativeFocus = HTMLElement.prototype.focus;
+
+ HTMLElement.prototype.focus = function(options) {
+ var scrollX = window.scrollX;
+ var scrollY = window.scrollY;
+
+ this.nativeFocus();
+
+ // Restore window scroll if preventScroll
+ if (options && options.preventScroll) {
+ window.scroll(scrollX, scrollY);
+ }
+ };
+ }
+ })();
+}
diff --git a/src/components/prompt/prompt.template.html b/src/components/prompt/prompt.template.html
index 200c98b116..b1e7f580f0 100644
--- a/src/components/prompt/prompt.template.html
+++ b/src/components/prompt/prompt.template.html
@@ -1,6 +1,6 @@
-
+ arrow_back
@@ -22,4 +22,4 @@
-
\ No newline at end of file
+
diff --git a/src/components/recordingcreator/recordingbutton.js b/src/components/recordingcreator/recordingbutton.js
index 0a76d3914c..a32803e107 100644
--- a/src/components/recordingcreator/recordingbutton.js
+++ b/src/components/recordingcreator/recordingbutton.js
@@ -30,7 +30,7 @@ define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom'
this.refresh(options.itemId, options.serverId);
}
var button = options.button;
- button.querySelector('i').innerHTML = '';
+ button.querySelector('i').innerHTML = 'fiber_manual_record';
var clickFn = onRecordingButtonClick.bind(this);
this.clickFn = clickFn;
@@ -45,28 +45,25 @@ define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom'
var status;
if (item.Type === 'SeriesTimer') {
- return '';
- }
- else if (item.TimerId || item.SeriesTimerId) {
+ return 'fiber_smart_record';
+ } else if (item.TimerId || item.SeriesTimerId) {
status = item.Status || 'Cancelled';
- }
- else if (item.Type === 'Timer') {
+ } else if (item.Type === 'Timer') {
status = item.Status;
- }
- else {
- return '';
+ } else {
+ return 'fiber_manual_record';
}
if (item.SeriesTimerId) {
if (status !== 'Cancelled') {
- return '';
+ return 'fiber_smart_record';
}
}
- return '';
+ return 'fiber_manual_record';
}
RecordingButton.prototype.refresh = function (serverId, itemId) {
@@ -113,4 +110,4 @@ define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom'
};
return RecordingButton;
-});
\ No newline at end of file
+});
diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js
index b3d16a0dab..614d483b21 100644
--- a/src/components/recordingcreator/recordingcreator.js
+++ b/src/components/recordingcreator/recordingcreator.js
@@ -40,8 +40,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
maxHeight: imageHeight,
tag: item.ImageTags.Primary
});
- }
- else if (imageTags.Thumb) {
+ } else if (imageTags.Thumb) {
return apiClient.getScaledImageUrl(item.Id, {
type: "Thumb",
diff --git a/src/components/recordingcreator/recordingcreator.template.html b/src/components/recordingcreator/recordingcreator.template.html
index 386aa149cc..2a2840aecc 100644
--- a/src/components/recordingcreator/recordingcreator.template.html
+++ b/src/components/recordingcreator/recordingcreator.template.html
@@ -1,5 +1,5 @@
-
+ arrow_back
@@ -28,4 +28,4 @@
-
\ No newline at end of file
+
diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js
index 69b8b1023b..3a1d4ba943 100644
--- a/src/components/recordingcreator/recordingeditor.js
+++ b/src/components/recordingcreator/recordingeditor.js
@@ -95,7 +95,6 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
currentResolve = resolve;
require(['text!./recordingeditor.template.html'], function (template) {
-
var dialogOptions = {
removeOnClose: true,
scrollY: false
@@ -103,7 +102,6 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
if (layoutManager.tv) {
dialogOptions.size = 'fullscreen';
- } else {
}
var dlg = dialogHelper.createDialog(dialogOptions);
diff --git a/src/components/recordingcreator/recordingeditor.template.html b/src/components/recordingcreator/recordingeditor.template.html
index e36dda3f57..6b853704f3 100644
--- a/src/components/recordingcreator/recordingeditor.template.html
+++ b/src/components/recordingcreator/recordingeditor.template.html
@@ -1,5 +1,5 @@
-
+ arrow_back
${HeaderRecordingOptions}
@@ -43,4 +43,4 @@
-
\ No newline at end of file
+
diff --git a/src/components/recordingcreator/recordingfields.template.html b/src/components/recordingcreator/recordingfields.template.html
index 76ea5cee25..622b0d62e7 100644
--- a/src/components/recordingcreator/recordingfields.template.html
+++ b/src/components/recordingcreator/recordingfields.template.html
@@ -2,7 +2,7 @@
-
+ fiber_smart_record${RecordSeries}
@@ -14,7 +14,7 @@
-
+ fiber_manual_record${Record}
@@ -22,4 +22,4 @@
${Settings}
-
\ No newline at end of file
+
diff --git a/src/components/recordingcreator/recordinghelper.js b/src/components/recordingcreator/recordinghelper.js
index 8c56b578c9..4bfd316c73 100644
--- a/src/components/recordingcreator/recordinghelper.js
+++ b/src/components/recordingcreator/recordinghelper.js
@@ -166,8 +166,7 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi
loading.show();
cancelTimer(apiClient, timerId, true).then(resolve, reject);
- }
- else if (result === 'cancelseriestimer') {
+ } else if (result === 'cancelseriestimer') {
loading.show();
diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js
index 9878081e67..73a98cf5e7 100644
--- a/src/components/recordingcreator/seriesrecordingeditor.js
+++ b/src/components/recordingcreator/seriesrecordingeditor.js
@@ -139,7 +139,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
context.querySelector('.selectKeepUpTo').innerHTML = html;
}
-
+
function onFieldChange(e) {
this.querySelector('.btnSubmit').click();
}
diff --git a/src/components/recordingcreator/seriesrecordingeditor.template.html b/src/components/recordingcreator/seriesrecordingeditor.template.html
index 54133ebbbb..c2e8ebd0ed 100644
--- a/src/components/recordingcreator/seriesrecordingeditor.template.html
+++ b/src/components/recordingcreator/seriesrecordingeditor.template.html
@@ -1,5 +1,5 @@
-
+ arrow_back
${HeaderSeriesOptions}
@@ -75,4 +75,4 @@
-
\ No newline at end of file
+
diff --git a/src/components/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js
index 6650170960..30074b4d0b 100644
--- a/src/components/refreshdialog/refreshdialog.js
+++ b/src/components/refreshdialog/refreshdialog.js
@@ -123,7 +123,7 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager'
var title = globalize.translate('RefreshMetadata');
html += '
';
- html += '';
+ html += 'arrow_back';
html += '
';
html += title;
html += '
';
@@ -172,4 +172,4 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager'
};
return RefreshDialog;
-});
\ No newline at end of file
+});
diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js
index e586a1e124..59bb2c5cc4 100644
--- a/src/components/remotecontrol/remotecontrol.js
+++ b/src/components/remotecontrol/remotecontrol.js
@@ -135,7 +135,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) {
var userData = fullItem.UserData || {};
var likes = null == userData.Likes ? "" : userData.Likes;
- context.querySelector(".nowPlayingPageUserDataButtons").innerHTML = '';
+ context.querySelector(".nowPlayingPageUserDataButtons").innerHTML = 'favorite';
});
} else {
backdrop.clear();
@@ -179,15 +179,15 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
if (player) {
switch (playbackManager.getRepeatMode(player)) {
case "RepeatNone":
- playbackManager.setRepeatMode("RepeatAll", player);
- break;
+ playbackManager.setRepeatMode("RepeatAll", player);
+ break;
case "RepeatAll":
- playbackManager.setRepeatMode("RepeatOne", player);
- break;
+ playbackManager.setRepeatMode("RepeatOne", player);
+ break;
case "RepeatOne":
- playbackManager.setRepeatMode("RepeatNone", player);
+ playbackManager.setRepeatMode("RepeatNone", player);
}
}
}
@@ -291,10 +291,10 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
if (isMuted) {
view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Unmute"));
- view.querySelector(".buttonMute i").innerHTML = "";
+ view.querySelector(".buttonMute i").innerHTML = "volume_off";
} else {
view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Mute"));
- view.querySelector(".buttonMute i").innerHTML = "";
+ view.querySelector(".buttonMute i").innerHTML = "volume_up";
}
if (progressElement) {
@@ -361,7 +361,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
action: "setplaylistindex",
enableUserDataButtons: false,
rightButtons: [{
- icon: "",
+ icon: "remove_circle_outline",
title: globalize.translate("ButtonRemove"),
id: "remove"
}],
diff --git a/src/components/sanitizefilename.js b/src/components/sanitizefilename.js
index 843ab31f04..d422a95533 100644
--- a/src/components/sanitizefilename.js
+++ b/src/components/sanitizefilename.js
@@ -34,18 +34,14 @@ define([], function () {
// when parsing previous hi-surrogate, 3 is added to byteLength
if (prevCodePoint != null && isHighSurrogate(prevCodePoint)) {
byteLength += 1;
- }
- else {
+ } else {
byteLength += 3;
}
- }
- else if (codePoint <= 0x7f) {
+ } else if (codePoint <= 0x7f) {
byteLength += 1;
- }
- else if (codePoint >= 0x80 && codePoint <= 0x7ff) {
+ } else if (codePoint >= 0x80 && codePoint <= 0x7ff) {
byteLength += 2;
- }
- else if (codePoint >= 0x800 && codePoint <= 0xffff) {
+ } else if (codePoint >= 0x800 && codePoint <= 0xffff) {
byteLength += 3;
}
prevCodePoint = codePoint;
@@ -77,8 +73,7 @@ define([], function () {
if (curByteLength === byteLength) {
return string.slice(0, i + 1);
- }
- else if (curByteLength > byteLength) {
+ } else if (curByteLength > byteLength) {
return string.slice(0, i - segment.length + 1);
}
}
@@ -89,11 +84,11 @@ define([], function () {
return {
sanitize: function (input, replacement) {
var sanitized = input
- .replace(illegalRe, replacement)
- .replace(controlRe, replacement)
- .replace(reservedRe, replacement)
- .replace(windowsReservedRe, replacement)
- .replace(windowsTrailingRe, replacement);
+ .replace(illegalRe, replacement)
+ .replace(controlRe, replacement)
+ .replace(reservedRe, replacement)
+ .replace(windowsReservedRe, replacement)
+ .replace(windowsTrailingRe, replacement);
return truncate(sanitized, 255);
}
};
diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js
new file mode 100644
index 0000000000..9f7035d528
--- /dev/null
+++ b/src/components/scrollManager.js
@@ -0,0 +1,499 @@
+define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManager) {
+ "use strict";
+
+ /**
+ * Scroll time in ms.
+ */
+ var ScrollTime = 270;
+
+ /**
+ * Epsilon for comparing values.
+ */
+ var Epsilon = 1e-6;
+
+ // FIXME: Need to scroll to top of page to fully show the top menu. This can be solved by some marker of top most elements or their containers
+ /**
+ * Returns minimum vertical scroll.
+ * Scroll less than that value will be zeroed.
+ *
+ * @return {number} minimum vertical scroll
+ */
+ function minimumScrollY() {
+ var topMenu = document.querySelector(".headerTop");
+ if (topMenu) {
+ return topMenu.clientHeight;
+ }
+ return 0;
+ }
+
+ var supportsSmoothScroll = "scrollBehavior" in document.documentElement.style;
+
+ var supportsScrollToOptions = false;
+ try {
+ var elem = document.createElement("div");
+
+ var opts = Object.defineProperty({}, "behavior", {
+ get: function () {
+ supportsScrollToOptions = true;
+ }
+ });
+
+ elem.scrollTo(opts);
+ } catch (e) {
+ console.log("error checking ScrollToOptions support");
+ }
+
+ /**
+ * Returns value clamped by range [min, max].
+ *
+ * @param {number} value clamped value
+ * @param {number} min begining of range
+ * @param {number} max ending of range
+ * @return {number} clamped value
+ */
+ function clamp(value, min, max) {
+ return value <= min ? min : value >= max ? max : value;
+ }
+
+ /**
+ * Returns the required delta to fit range 1 into range 2.
+ * In case of range 1 is bigger than range 2 returns delta to fit most out of range part.
+ *
+ * @param {number} begin1 begining of range 1
+ * @param {number} end1 ending of range 1
+ * @param {number} begin2 begining of range 2
+ * @param {number} end2 ending of range 2
+ * @return {number} delta: <0 move range1 to the left, >0 - to the right
+ */
+ function fitRange(begin1, end1, begin2, end2) {
+ var delta1 = begin1 - begin2;
+ var delta2 = end2 - end1;
+ if (delta1 < 0 && delta1 < delta2) {
+ return -delta1;
+ } else if (delta2 < 0) {
+ return delta2;
+ }
+ return 0;
+ }
+
+ /**
+ * Ease value.
+ *
+ * @param {number} t value in range [0, 1]
+ * @return {number} eased value in range [0, 1]
+ */
+ function ease(t) {
+ return t*(2 - t); // easeOutQuad === ease-out
+ }
+
+ /**
+ * Document scroll wrapper helps to unify scrolling and fix issues of some browsers.
+ *
+ * webOS 2 Browser: scrolls documentElement (and window), but body has a scroll size
+ *
+ * webOS 3 Browser: scrolls body (and window)
+ *
+ * webOS 4 Native: scrolls body (and window); has a document.scrollingElement
+ *
+ * Tizen 4 Browser/Native: scrolls body (and window); has a document.scrollingElement
+ *
+ * Tizen 5 Browser/Native: scrolls documentElement (and window); has a document.scrollingElement
+ */
+ function DocumentScroller() {
+ }
+
+ DocumentScroller.prototype = {
+ get scrollLeft() {
+ return window.pageXOffset;
+ },
+ set scrollLeft(val) {
+ window.scroll(val, window.pageYOffset);
+ },
+
+ get scrollTop() {
+ return window.pageYOffset;
+ },
+ set scrollTop(val) {
+ window.scroll(window.pageXOffset, val);
+ },
+
+ get scrollWidth() {
+ return Math.max(document.documentElement.scrollWidth, document.body.scrollWidth);
+ },
+
+ get scrollHeight() {
+ return Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);
+ },
+
+ get clientWidth() {
+ return Math.min(document.documentElement.clientWidth, document.body.clientWidth);
+ },
+
+ get clientHeight() {
+ return Math.min(document.documentElement.clientHeight, document.body.clientHeight);
+ },
+
+ getBoundingClientRect: function() {
+ // Make valid viewport coordinates: documentElement.getBoundingClientRect returns rect of entire document relative to viewport
+ return {
+ left: 0,
+ top: 0,
+ width: this.clientWidth,
+ height: this.clientHeight
+ };
+ },
+
+ scrollTo: function() {
+ window.scrollTo.apply(window, arguments);
+ }
+ };
+
+ var documentScroller = new DocumentScroller();
+
+ /**
+ * Returns parent element that can be scrolled. If no such, returns documentElement.
+ *
+ * @param {HTMLElement} element element for which parent is being searched
+ * @param {boolean} vertical search for vertical scrollable parent
+ */
+ function getScrollableParent(element, vertical) {
+ if (element) {
+ var parent = element.parentElement;
+
+ while (parent) {
+ if ((!vertical && parent.scrollWidth > parent.clientWidth && parent.classList.contains("scrollX")) ||
+ (vertical && parent.scrollHeight > parent.clientHeight && parent.classList.contains("scrollY"))) {
+ return parent;
+ }
+
+ parent = parent.parentElement;
+ }
+ }
+
+ return documentScroller;
+ }
+
+ /**
+ * @typedef {Object} ScrollerData
+ * @property {number} scrollPos current scroll position
+ * @property {number} scrollSize scroll size
+ * @property {number} clientSize client size
+ */
+
+ /**
+ * Returns scroll data for specified orientation.
+ *
+ * @param {HTMLElement} scroller scroller
+ * @param {boolean} vertical vertical scroll data
+ * @return {ScrollerData} scroll data
+ */
+ function getScrollerData(scroller, vertical) {
+ var data = {};
+
+ if (!vertical) {
+ data.scrollPos = scroller.scrollLeft;
+ data.scrollSize = scroller.scrollWidth;
+ data.clientSize = scroller.clientWidth;
+ } else {
+ data.scrollPos = scroller.scrollTop;
+ data.scrollSize = scroller.scrollHeight;
+ data.clientSize = scroller.clientHeight;
+ }
+
+ return data;
+ }
+
+ /**
+ * Returns position of child of scroller for specified orientation.
+ *
+ * @param {HTMLElement} scroller scroller
+ * @param {HTMLElement} element child of scroller
+ * @param {boolean} vertical vertical scroll
+ * @return {number} child position
+ */
+ function getScrollerChildPos(scroller, element, vertical) {
+ var elementRect = element.getBoundingClientRect();
+ var scrollerRect = scroller.getBoundingClientRect();
+
+ if (!vertical) {
+ return scroller.scrollLeft + elementRect.left - scrollerRect.left;
+ } else {
+ return scroller.scrollTop + elementRect.top - scrollerRect.top;
+ }
+ }
+
+ /**
+ * Returns scroll position for element.
+ *
+ * @param {ScrollerData} scrollerData scroller data
+ * @param {number} elementPos child element position
+ * @param {number} elementSize child element size
+ * @param {boolean} centered scroll to center
+ * @return {number} scroll position
+ */
+ function calcScroll(scrollerData, elementPos, elementSize, centered) {
+ var maxScroll = scrollerData.scrollSize - scrollerData.clientSize;
+
+ var scroll;
+
+ if (centered) {
+ scroll = elementPos + (elementSize - scrollerData.clientSize) / 2;
+ } else {
+ var delta = fitRange(elementPos, elementPos + elementSize - 1, scrollerData.scrollPos, scrollerData.scrollPos + scrollerData.clientSize - 1);
+ scroll = scrollerData.scrollPos - delta;
+ }
+
+ return clamp(Math.round(scroll), 0, maxScroll);
+ }
+
+ /**
+ * Calls scrollTo function in proper way.
+ *
+ * @param {HTMLElement} scroller scroller
+ * @param {ScrollToOptions} options scroll options
+ */
+ function scrollToHelper(scroller, options) {
+ if ("scrollTo" in scroller) {
+ if (!supportsScrollToOptions) {
+ var scrollX = (options.left !== undefined ? options.left : scroller.scrollLeft);
+ var scrollY = (options.top !== undefined ? options.top : scroller.scrollTop);
+ scroller.scrollTo(scrollX, scrollY);
+ } else {
+ scroller.scrollTo(options);
+ }
+ } else if ("scrollLeft" in scroller) {
+ if (options.left !== undefined) {
+ scroller.scrollLeft = options.left;
+ }
+ if (options.top !== undefined) {
+ scroller.scrollTop = options.top;
+ }
+ }
+ }
+
+ /**
+ * Performs built-in scroll.
+ *
+ * @param {HTMLElement} xScroller horizontal scroller
+ * @param {number} scrollX horizontal coordinate
+ * @param {HTMLElement} yScroller vertical scroller
+ * @param {number} scrollY vertical coordinate
+ * @param {boolean} smooth smooth scrolling
+ */
+ function builtinScroll(xScroller, scrollX, yScroller, scrollY, smooth) {
+ var scrollBehavior = smooth ? "smooth" : "instant";
+
+ if (xScroller !== yScroller) {
+ scrollToHelper(xScroller, {left: scrollX, behavior: scrollBehavior});
+ scrollToHelper(yScroller, {top: scrollY, behavior: scrollBehavior});
+ } else {
+ scrollToHelper(xScroller, {left: scrollX, top: scrollY, behavior: scrollBehavior});
+ }
+ }
+
+ var scrollTimer;
+
+ /**
+ * Resets scroll timer to stop scrolling.
+ */
+ function resetScrollTimer() {
+ cancelAnimationFrame(scrollTimer);
+ scrollTimer = undefined;
+ }
+
+ /**
+ * Performs animated scroll.
+ *
+ * @param {HTMLElement} xScroller horizontal scroller
+ * @param {number} scrollX horizontal coordinate
+ * @param {HTMLElement} yScroller vertical scroller
+ * @param {number} scrollY vertical coordinate
+ */
+ function animateScroll(xScroller, scrollX, yScroller, scrollY) {
+
+ var ox = xScroller.scrollLeft;
+ var oy = yScroller.scrollTop;
+ var dx = scrollX - ox;
+ var dy = scrollY - oy;
+
+ if (Math.abs(dx) < Epsilon && Math.abs(dy) < Epsilon) {
+ return;
+ }
+
+ var start;
+
+ function scrollAnim(currentTimestamp) {
+
+ start = start || currentTimestamp;
+
+ var k = Math.min(1, (currentTimestamp - start) / ScrollTime);
+
+ if (k === 1) {
+ resetScrollTimer();
+ builtinScroll(xScroller, scrollX, yScroller, scrollY, false);
+ return;
+ }
+
+ k = ease(k);
+
+ var x = ox + dx*k;
+ var y = oy + dy*k;
+
+ builtinScroll(xScroller, x, yScroller, y, false);
+
+ scrollTimer = requestAnimationFrame(scrollAnim);
+ }
+
+ scrollTimer = requestAnimationFrame(scrollAnim);
+ }
+
+ /**
+ * Performs scroll.
+ *
+ * @param {HTMLElement} xScroller horizontal scroller
+ * @param {number} scrollX horizontal coordinate
+ * @param {HTMLElement} yScroller vertical scroller
+ * @param {number} scrollY vertical coordinate
+ * @param {boolean} smooth smooth scrolling
+ */
+ function doScroll(xScroller, scrollX, yScroller, scrollY, smooth) {
+
+ resetScrollTimer();
+
+ if (smooth && useAnimatedScroll()) {
+ animateScroll(xScroller, scrollX, yScroller, scrollY);
+ } else {
+ builtinScroll(xScroller, scrollX, yScroller, scrollY, smooth);
+ }
+ }
+
+ /**
+ * Returns true if smooth scroll must be used.
+ */
+ function useSmoothScroll() {
+
+ if (browser.tizen) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns true if animated implementation of smooth scroll must be used.
+ */
+ function useAnimatedScroll() {
+ // Add block to force using (or not) of animated implementation
+
+ return !supportsSmoothScroll;
+ }
+
+ /**
+ * Returns true if scroll manager is enabled.
+ */
+ var isEnabled = function() {
+
+ if (!layoutManager.tv) {
+ return false;
+ }
+
+ if (browser.tizen) {
+ return true;
+ }
+
+ if (browser.web0s) {
+ return true;
+ }
+
+ return false;
+ };
+
+ /**
+ * Scrolls the document to a given position.
+ *
+ * @param {number} scrollX horizontal coordinate
+ * @param {number} scrollY vertical coordinate
+ * @param {boolean} [smooth=false] smooth scrolling
+ */
+ var scrollTo = function(scrollX, scrollY, smooth) {
+
+ smooth = !!smooth;
+
+ // Scroller is document itself by default
+ var scroller = getScrollableParent(null, false);
+
+ var xScrollerData = getScrollerData(scroller, false);
+ var yScrollerData = getScrollerData(scroller, true);
+
+ scrollX = clamp(Math.round(scrollX), 0, xScrollerData.scrollSize - xScrollerData.clientSize);
+ scrollY = clamp(Math.round(scrollY), 0, yScrollerData.scrollSize - yScrollerData.clientSize);
+
+ doScroll(scroller, scrollX, scroller, scrollY, smooth);
+ }
+
+ /**
+ * Scrolls the document to a given element.
+ *
+ * @param {HTMLElement} element target element of scroll task
+ * @param {boolean} [smooth=false] smooth scrolling
+ */
+ var scrollToElement = function(element, smooth) {
+
+ smooth = !!smooth;
+
+ var scrollCenterX = true;
+ var scrollCenterY = true;
+
+ var offsetParent = element.offsetParent;
+
+ // In Firefox offsetParent.offsetParent is BODY
+ var isFixed = offsetParent && (!offsetParent.offsetParent || window.getComputedStyle(offsetParent).position === "fixed");
+
+ // Scroll fixed elements to nearest edge (or do not scroll at all)
+ if (isFixed) {
+ scrollCenterX = scrollCenterY = false;
+ }
+
+ var xScroller = getScrollableParent(element, false);
+ var yScroller = getScrollableParent(element, true);
+
+ var elementRect = element.getBoundingClientRect();
+
+ var xScrollerData = getScrollerData(xScroller, false);
+ var yScrollerData = getScrollerData(yScroller, true);
+
+ var xPos = getScrollerChildPos(xScroller, element, false);
+ var yPos = getScrollerChildPos(yScroller, element, true);
+
+ var scrollX = calcScroll(xScrollerData, xPos, elementRect.width, scrollCenterX);
+ var scrollY = calcScroll(yScrollerData, yPos, elementRect.height, scrollCenterY);
+
+ // HACK: Scroll to top for top menu because it is hidden
+ // FIXME: Need a marker to scroll top/bottom
+ if (isFixed && elementRect.bottom < 0) {
+ scrollY = 0;
+ }
+
+ // HACK: Ensure we are at the top
+ // FIXME: Need a marker to scroll top/bottom
+ if (scrollY < minimumScrollY() && yScroller === documentScroller) {
+ scrollY = 0;
+ }
+
+ doScroll(xScroller, scrollX, yScroller, scrollY, smooth);
+ }
+
+ if (isEnabled()) {
+ dom.addEventListener(window, "focusin", function(e) {
+ setTimeout(function() {
+ scrollToElement(e.target, useSmoothScroll());
+ }, 0);
+ }, {capture: true});
+ }
+
+ return {
+ isEnabled: isEnabled,
+ scrollTo: scrollTo,
+ scrollToElement: scrollToElement
+ };
+});
diff --git a/src/components/scroller.js b/src/components/scroller.js
index de0ce6b932..65f33b8e8d 100644
--- a/src/components/scroller.js
+++ b/src/components/scroller.js
@@ -82,7 +82,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
intervactive: null, // Selector for special interactive elements.
// Mixed options
- speed: 0, // Animations speed in milliseconds. 0 to disable animations.
+ speed: 0 // Animations speed in milliseconds. 0 to disable animations.
}, options);
@@ -93,17 +93,14 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
// in cases with firefox, if the smooth scroll api is supported then use that because their implementation is very good
if (options.allowNativeScroll === false) {
options.enableNativeScroll = false;
- }
- else if (isSmoothScrollSupported && ((browser.firefox && !layoutManager.tv) || options.allowNativeSmoothScroll)) {
+ } else if (isSmoothScrollSupported && ((browser.firefox && !layoutManager.tv) || options.allowNativeSmoothScroll)) {
// native smooth scroll
options.enableNativeScroll = true;
- }
- else if (options.requireAnimation && (browser.animate || browser.supportsCssAnimation())) {
+ } else if (options.requireAnimation && (browser.animate || browser.supportsCssAnimation())) {
// transform is the only way to guarantee animation
options.enableNativeScroll = false;
- }
- else if (!layoutManager.tv || !browser.animate) {
+ } else if (!layoutManager.tv || !browser.animate) {
options.enableNativeScroll = true;
}
@@ -211,7 +208,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
self.frameResizeObserver.observe(frame);
}
- self.reload = function () { load(); };
+ self.reload = function () {
+ load();
+ };
self.getScrollEventName = function () {
return transform ? 'scrollanimate' : 'scroll';
@@ -227,7 +226,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
function nativeScrollTo(container, pos, immediate) {
-
if (container.scroll) {
if (o.horizontal) {
@@ -242,8 +240,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
behavior: immediate ? 'instant' : 'smooth'
});
}
- }
- else if (!immediate && container.scrollTo) {
+ } else if (!immediate && container.scrollTo) {
if (o.horizontal) {
container.scrollTo(Math.round(pos), 0);
} else {
diff --git a/src/components/search/searchfields.template.html b/src/components/search/searchfields.template.html
index cb6f11499a..bad808cb7e 100644
--- a/src/components/search/searchfields.template.html
+++ b/src/components/search/searchfields.template.html
@@ -1,7 +1,7 @@
-
\ No newline at end of file
+
diff --git a/src/livetv.html b/src/livetv.html
index 2bc99b2b80..2ff8990e4a 100644
--- a/src/livetv.html
+++ b/src/livetv.html
@@ -7,7 +7,7 @@
\ No newline at end of file
+
diff --git a/src/myprofile.html b/src/myprofile.html
index fdb071dde5..d30f905818 100644
--- a/src/myprofile.html
+++ b/src/myprofile.html
@@ -2,8 +2,8 @@
diff --git a/src/scripts/browser.js b/src/scripts/browser.js
index a50eeaa608..66c3051c8c 100644
--- a/src/scripts/browser.js
+++ b/src/scripts/browser.js
@@ -30,7 +30,6 @@ define([], function () {
}
function isMobile(userAgent) {
-
var terms = [
'mobi',
'ipad',
@@ -144,14 +143,16 @@ define([], function () {
}
}
- var animation = false,
- animationstring = 'animation',
- keyframeprefix = '',
- domPrefixes = ['Webkit', 'O', 'Moz'],
- pfx = '',
- elm = document.createElement('div');
+ var animation = false;
+ var animationstring = 'animation';
+ var keyframeprefix = '';
+ var domPrefixes = ['Webkit', 'O', 'Moz'];
+ var pfx = '';
+ var elm = document.createElement('div');
- if (elm.style.animationName !== undefined) { animation = true; }
+ if (elm.style.animationName !== undefined) {
+ animation = true;
+ }
if (animation === false && allowPrefix) {
for (var i = 0; i < domPrefixes.length; i++) {
@@ -204,8 +205,7 @@ define([], function () {
// http://www.neowin.net/news/ie11-fakes-user-agent-to-fool-gmail-in-windows-phone-81-gdr1-update
browser = "msie";
- }
- else if (ua.indexOf("like gecko") !== -1 && ua.indexOf('webkit') === -1 && ua.indexOf('opera') === -1 && ua.indexOf('chrome') === -1 && ua.indexOf('safari') === -1) {
+ } else if (ua.indexOf("like gecko") !== -1 && ua.indexOf('webkit') === -1 && ua.indexOf('opera') === -1 && ua.indexOf('chrome') === -1 && ua.indexOf('safari') === -1) {
browser = "msie";
}
}
diff --git a/src/scripts/browserdeviceprofile.js b/src/scripts/browserdeviceprofile.js
index ad5237fde8..bc7c26769e 100644
--- a/src/scripts/browserdeviceprofile.js
+++ b/src/scripts/browserdeviceprofile.js
@@ -88,18 +88,14 @@ define(['browser'], function (browser) {
if (browser.edgeUwp) {
return true;
}
- }
-
- else if (format === 'wma') {
+ } else if (format === 'wma') {
if (browser.tizen || browser.orsay) {
return true;
}
if (browser.edgeUwp) {
return true;
}
- }
-
- else if (format === 'opus') {
+ } else if (format === 'opus') {
typeString = 'audio/ogg; codecs="opus"';
if (document.createElement('audio').canPlayType(typeString).replace(/no/, '')) {
@@ -107,9 +103,7 @@ define(['browser'], function (browser) {
}
return false;
- }
-
- else if (format === 'mp2') {
+ } else if (format === 'mp2') {
// For now
return false;
@@ -575,9 +569,7 @@ define(['browser'], function (browser) {
Type: 'Audio',
AudioCodec: audioFormat
});
- }
-
- else if (audioFormat === 'mp3') {
+ } else if (audioFormat === 'mp3') {
profile.DirectPlayProfiles.push({
Container: audioFormat,
diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js
index bb35d8f60f..bcb3883755 100644
--- a/src/scripts/editorsidebar.js
+++ b/src/scripts/editorsidebar.js
@@ -2,19 +2,19 @@ define(["datetime", "jQuery", "material-icons"], function (datetime, $) {
"use strict";
function getNode(item, folderState, selected) {
- var htmlName = getNodeInnerHtml(item),
- node = {
- id: item.Id,
- text: htmlName,
- state: {
- opened: item.IsFolder && folderState == "open",
- selected: selected
- },
- li_attr: {
- serveritemtype: item.Type,
- collectiontype: item.CollectionType
- }
- };
+ var htmlName = getNodeInnerHtml(item);
+ var node = {
+ id: item.Id,
+ text: htmlName,
+ state: {
+ opened: item.IsFolder && folderState == "open",
+ selected: selected
+ },
+ li_attr: {
+ serveritemtype: item.Type,
+ collectiontype: item.CollectionType
+ }
+ };
if (item.IsFolder) {
node.children = [{
text: "Loading...",
@@ -44,20 +44,15 @@ define(["datetime", "jQuery", "material-icons"], function (datetime, $) {
var htmlName = "
";
if (item.IsFolder) {
htmlName += 'folder';
- }
- else if (item.MediaType === "Video") {
+ } else if (item.MediaType === "Video") {
htmlName += 'movie';
- }
- else if (item.MediaType === "Audio") {
+ } else if (item.MediaType === "Audio") {
htmlName += 'audiotrack';
- }
- else if (item.Type === "TvChannel") {
+ } else if (item.Type === "TvChannel") {
htmlName += 'live_tv';
- }
- else if (item.MediaType === "Photo") {
+ } else if (item.MediaType === "Photo") {
htmlName += 'photo';
- }
- else if (item.MediaType === "Book") {
+ } else if (item.MediaType === "Book") {
htmlName += 'book';
}
if (item.LockData) {
diff --git a/src/scripts/librarybrowser.js b/src/scripts/librarybrowser.js
index 4f3eaf4144..b9f3b92471 100644
--- a/src/scripts/librarybrowser.js
+++ b/src/scripts/librarybrowser.js
@@ -91,20 +91,20 @@ define(["userSettings"], function (userSettings) {
html += '
';
if (showControls) {
- html += '';
- html += '= totalRecordCount ? "disabled" : "") + '>';
+ html += 'arrow_back';
+ html += '= totalRecordCount ? "disabled" : "") + '>arrow_forward';
}
if (options.addLayoutButton) {
- html += '';
+ html += 'view_comfy';
}
if (options.sortButton) {
- html += '';
+ html += 'sort_by_alpha';
}
if (options.filterButton) {
- html += '';
+ html += 'filter_list';
}
html += "
";
@@ -156,7 +156,8 @@ define(["userSettings"], function (userSettings) {
html += '
';
html += Globalize.translate("HeaderSortBy");
html += "
";
- var i, length;
+ var i;
+ var length;
var isChecked;
html += '
';
- html += '' + (browser.safari ? "chevron_left" : "") + "";
- html += '';
- html += '';
+ html += '' + (browser.safari ? "chevron_left" : "arrow_back") + "";
+ html += 'home';
+ html += 'menu';
html += '';
html += "
";
html += '
';
html += '';
- html += '';
- html += '';
- html += '';
+ html += 'cast';
+ html += 'search';
+ html += 'person';
html += "
";
html += "
";
html += '
';
diff --git a/src/scripts/routes.js b/src/scripts/routes.js
index 680a99a80b..a72e7e0566 100644
--- a/src/scripts/routes.js
+++ b/src/scripts/routes.js
@@ -447,6 +447,6 @@ define([
defineRoute({
path: "/",
isDefaultRoute: true,
- autoFocus: false,
+ autoFocus: false
});
});
diff --git a/src/scripts/site.js b/src/scripts/site.js
index d902cdf6de..14d7d01bbb 100644
--- a/src/scripts/site.js
+++ b/src/scripts/site.js
@@ -477,6 +477,10 @@ var AppInfo = {};
require(["keyboardnavigation"], function(keyboardnavigation) {
keyboardnavigation.enable();
});
+ require(["focusPreventScroll"]);
+ require(["autoFocuser"], function(autoFocuser) {
+ autoFocuser.enable();
+ });
});
});
}
@@ -839,6 +843,7 @@ var AppInfo = {};
});
define("slideshow", [componentsPath + "/slideshow/slideshow"], returnFirstDependency);
define("objectassign", [componentsPath + "/polyfills/objectassign"], returnFirstDependency);
+ define("focusPreventScroll", [componentsPath + "/polyfills/focusPreventScroll"], returnFirstDependency);
define("userdataButtons", [componentsPath + "/userdatabuttons/userdatabuttons"], returnFirstDependency);
define("emby-playstatebutton", [componentsPath + "/userdatabuttons/emby-playstatebutton"], returnFirstDependency);
define("emby-ratingbutton", [componentsPath + "/userdatabuttons/emby-ratingbutton"], returnFirstDependency);
@@ -863,6 +868,8 @@ var AppInfo = {};
define("serverNotifications", [componentsPath + "/serverNotifications/serverNotifications"], returnFirstDependency);
define("skinManager", [componentsPath + "/skinManager"], returnFirstDependency);
define("keyboardnavigation", [componentsPath + "/keyboardnavigation"], returnFirstDependency);
+ define("scrollManager", [componentsPath + "/scrollManager"], returnFirstDependency);
+ define("autoFocuser", [componentsPath + "/autoFocuser"], returnFirstDependency);
define("connectionManager", [], function () {
return ConnectionManager;
});
diff --git a/src/standalone.js b/src/standalone.js
new file mode 100644
index 0000000000..5692e8dddb
--- /dev/null
+++ b/src/standalone.js
@@ -0,0 +1,4 @@
+(function() {
+ "use strict";
+ window.appMode='standalone';
+})();
diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json
index ce12e70563..c7ce361903 100644
--- a/src/strings/bg-bg.json
+++ b/src/strings/bg-bg.json
@@ -59,7 +59,7 @@
"ButtonPlay": "Пускане",
"ButtonPreviousTrack": "Предишна пътека",
"ButtonProfile": "Профил",
- "ButtonQuickStartGuide": "Ръководство за бързо започване",
+ "ButtonQuickStartGuide": "Първи стъпки",
"ButtonRefresh": "Опресняване",
"ButtonRefreshGuideData": "Обновяване на данните в справочника",
"ButtonRemove": "Премахване",
@@ -78,7 +78,7 @@
"ButtonSignIn": "Вписване",
"ButtonSignOut": "Отписване",
"ButtonSort": "Подреждане",
- "ButtonStop": "Стоп",
+ "ButtonStop": "Спиране",
"ButtonSubmit": "Подаване",
"ButtonSubtitles": "Субтитри",
"ButtonUninstall": "Деинсталиране",
@@ -108,13 +108,13 @@
"Display": "Показване",
"Download": "Изтегляне",
"DownloadsValue": "{0} изтегляния",
- "EasyPasswordHelp": "Вашият лесен пин код е използван за офлайн достъп със съвместими Jellyfin приложения, както и за влизане през същата мрежа.",
+ "EasyPasswordHelp": "Вашият лесен пин-код се използва за достъп извън линия със съвместими приложения, както и за влизане през същата мрежа.",
"Edit": "Редактиране",
"EditImages": "Редактиране на изображенията",
"EditMetadata": "Редактиране на метаданните",
"EditSubtitles": "Редактиране на субтитрите",
"EnableBackdrops": "Фонове",
- "EnableCinemaMode": "Включване на режим \"Киносалон\"",
+ "EnableCinemaMode": "Режим \"Киносалон\"",
"EnableThemeSongs": "Тематични песни",
"Ended": "Приключило",
"EndsAtValue": "Свършва на {0}",
@@ -209,7 +209,7 @@
"HeaderLiveTv": "Телевизия на живо",
"HeaderMedia": "Медия",
"HeaderMediaFolders": "Медийни папки",
- "HeaderMediaInfo": "Данни",
+ "HeaderMediaInfo": "Сведения",
"HeaderMetadataSettings": "Настройки на метаданните",
"HeaderMoreLikeThis": "Подобни",
"HeaderMovies": "Филми",
@@ -248,7 +248,7 @@
"HeaderSecondsValue": "{0} секунди",
"HeaderSelectPath": "Изберете път",
"HeaderSendMessage": "Изпращане на съобщение",
- "HeaderSeries": "Series:",
+ "HeaderSeries": "Сериал",
"HeaderServerSettings": "Настройки на сървъра",
"HeaderSettings": "Настройки",
"HeaderSetupLibrary": "Настройте своите медийни библиотеки",
@@ -256,7 +256,7 @@
"HeaderSortOrder": "Ред на подреждане",
"HeaderSpecialFeatures": "Специални функции",
"HeaderStartNow": "Пускане веднага",
- "HeaderStatus": "Състояние:",
+ "HeaderStatus": "Състояние",
"HeaderSubtitleAppearance": "Облик на субтитрите",
"HeaderSystemDlnaProfiles": "Системни профили",
"HeaderTags": "Етикети",
@@ -289,7 +289,7 @@
"LabelAlbumArtPN": "ПН на албумното изкуство:",
"LabelAlbumArtists": "Изпълнители на албума:",
"LabelAllowServerAutoRestart": "Разрешаване на сървъра автоматично да се пуска повторно за прилагане на обновления",
- "LabelAllowServerAutoRestartHelp": "Сървърът ще се рестартира само през свободното си време, когато няма активни потребители.",
+ "LabelAllowServerAutoRestartHelp": "Сървърът ще се пуска наново само през ненатоварено време, когато няма активни потребители.",
"LabelAppName": "Име",
"LabelArtists": "Изпълнители:",
"LabelArtistsHelp": "Отделете няколко с ;",
@@ -299,7 +299,7 @@
"LabelCertificatePassword": "Парола на сертификата:",
"LabelCertificatePasswordHelp": "Ако сертификатът ви изисква парола, моля, въведете я тук.",
"LabelCollection": "Колекция:",
- "LabelCommunityRating": "Обществена оценка",
+ "LabelCommunityRating": "Обществена оценка:",
"LabelContentType": "Тип на съдържанието:",
"LabelCountry": "Държава:",
"LabelCriticRating": "Оценка на критиците:",
@@ -333,7 +333,7 @@
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Определя времетраенето в секунди между SSDP търсения направени от Jellyfin.",
"LabelEnableDlnaDebugLogging": "Включване на журналите за грешки на ДЛНА",
"LabelEnableDlnaPlayTo": "Включване на функцията \"възпроизвеждане с ДЛНА\"",
- "LabelEnableDlnaPlayToHelp": "Емби може да засича устройства в мрежата ви и да предлага възможност за дистанционен контрол.",
+ "LabelEnableDlnaPlayToHelp": "Засичане на устройства в мрежата ви и предлагане на възможност за дистанционно управление.",
"LabelEnableDlnaServer": "Включване на ДЛНА-сървър",
"LabelEnableDlnaServerHelp": "Разрешава на UPnP устройства в мрежата да разглеждат и пускат Jellyfin съдържание.",
"LabelEnableRealtimeMonitor": "Активиране на наблюдение в реално време",
@@ -414,7 +414,7 @@
"LabelPublicHttpPortHelp": "Публичният порт, който да бъде съпоставен с локалния HTTP порт.",
"LabelPublicHttpsPort": "Публичен HTTPS порт:",
"LabelPublicHttpsPortHelp": "Публичният порт, който да бъде съпоставен с локалния HTTPS порт.",
- "LabelReadHowYouCanContribute": "Научете как можете да допринесете",
+ "LabelReadHowYouCanContribute": "Научете как можете да допринесете.",
"LabelRecordingPath": "Път за запис по подразбиране:",
"LabelReleaseDate": "Дата на издаване:",
"LabelRemoteClientBitrateLimit": "Ограничение на интернетното излъчване (мбит/сек):",
@@ -428,7 +428,7 @@
"LabelSkipIfAudioTrackPresent": "Да се пропусне, ако звуковата пътечка по подразбиране съвпада с езика",
"LabelSkipIfGraphicalSubsPresent": "Да се пропусне, ако файлът съдържа вградени субтитри",
"LabelSortBy": "Подреждане по:",
- "LabelSortOrder": "Ред на подреждане",
+ "LabelSortOrder": "Ред на подреждане:",
"LabelSource": "Източник:",
"LabelSpecialSeasonsDisplayName": "Име на сезона със специални епизоди:",
"LabelStartWhenPossible": "Започвай, когато е възможно:",
@@ -460,7 +460,7 @@
"LabelYoureDone": "Готови сте!",
"Large": "Голям",
"LatestFromLibrary": "Последни {0}",
- "LibraryAccessHelp": "Изберете медийните папки, които да споделите с потребителя. Администраторите ще могат да редактират всички папки, използвайки управлението на метаданни.",
+ "LibraryAccessHelp": "Изберете библиотеките, които да споделите с потребителя. Администраторите ще могат да редактират всички папки, използвайки управлението на метаданни.",
"Like": "Харесване",
"LinksValue": "Препратки: {0}",
"List": "Списък",
@@ -487,7 +487,7 @@
"MessageAlreadyInstalled": "Версията вече е инсталирана.",
"MessageAreYouSureYouWishToRemoveMediaFolder": "Сигурни ли сте, че искате да премахнете медийната папка?",
"MessageConfirmRestart": "Наистина ли искате да пуснете сървъра наново?",
- "MessageConfirmShutdown": "Наистина ли искате да спрете Jellyfin сървърът?",
+ "MessageConfirmShutdown": "Наистина ли искате да загасите сървъра?",
"MessageNoAvailablePlugins": "Няма налични приставки.",
"MessageNoPluginsInstalled": "Нямате инсталирани приставки.",
"MessageNothingHere": "Тук няма нищо.",
@@ -501,7 +501,7 @@
"Mobile": "Мобилно устройство",
"Monday": "Понеделник",
"MoreFromValue": "Още от {0}",
- "MoreUsersCanBeAddedLater": "Повече потребители могат да бъдат добавени по-късно от главния панел.",
+ "MoreUsersCanBeAddedLater": "Можете да добавите още потребители от таблото.",
"Movies": "Филми",
"Mute": "Заглушаване",
"MySubtitles": "Моите субтитри",
@@ -578,7 +578,7 @@
"OptionHasTrailer": "Трейлър",
"OptionHideUser": "Скриване на потребителя от страниците за вход",
"OptionHideUserFromLoginHelp": "Полезно за частни или скрити администраторски профили. Потребителят ще трябва да влезе ръчно чрез въвеждане на потребителско име и парола.",
- "OptionHomeVideos": "Домашни клипове и снимки",
+ "OptionHomeVideos": "Снимки",
"OptionImdbRating": "Оценка в IMDb",
"OptionIsHD": "ВК",
"OptionIsSD": "СК",
@@ -608,7 +608,7 @@
"OptionSpecialEpisode": "Специални",
"OptionSunday": "Неделя",
"OptionThursday": "Четвъртък",
- "OptionTrackName": "Име на песента:",
+ "OptionTrackName": "Име на песента",
"OptionTuesday": "Вторник",
"OptionUnairedEpisode": "Неизлъчени епизоди",
"OptionUnplayed": "Непускано",
@@ -672,7 +672,7 @@
"ShowAdvancedSettings": "Разширени настройки",
"ShowTitle": "Показване на заглавието",
"ShowYear": "Показване на годината",
- "Shows": "Предавания",
+ "Shows": "Сериали",
"Shuffle": "Пускане в разбъркан ред",
"Small": "Малък",
"Smart": "Умни",
@@ -757,7 +757,7 @@
"Unmute": "Без заглушаване",
"Unplayed": "Непускано",
"Upload": "Качване",
- "UserProfilesIntro": "Емби включва вградена поддръжка на потребителски профили, които позволяват на всеки потребител да има свои настройки на картината, място на пускане и родителски настройки.",
+ "UserProfilesIntro": "Джелифин включва поддръжка на потребителски профили със самостоятелни настройки на картината, пускането и родителските настройки.",
"ValueAlbumCount": "{0} албума",
"ValueAudioCodec": "Звуков кодек: {0}",
"ValueCodec": "Кодек: {0}",
@@ -784,9 +784,9 @@
"Watched": "Изгледано",
"Wednesday": "Сряда",
"WelcomeToProject": "Добре дошли в Емби!",
- "WizardCompleted": "Това е всичко от което се нуждаем за момента. Емби започна да събира данни за медийната ви библиотека. Разгледайте някои от нашите приложения, после натиснете Готово, за да видите таблото на сървъра.",
+ "WizardCompleted": "Това е всичко, от което се нуждаем за момента. Джелифин започва да събира данни за библиотеката ви. Разгледайте някои от нашите приложения, после натиснете Готово, за да видите таблото на сървъра.",
"Writer": "Писател",
- "AllowMediaConversion": "Разрешаване на медиини преобразувания",
+ "AllowMediaConversion": "Разрешаване на медийни преобразувания",
"AllLanguages": "Всички езици",
"AllEpisodes": "Всички епизоди",
"AllComplexFormats": "Всички комплексни формати (ASS, SSA, VOBSUB, PGS, SUB/IDX, и т.н.)",
@@ -794,5 +794,44 @@
"Alerts": "Известия",
"AdditionalNotificationServices": "Разгледайте каталога с добавки за допълнителни услуги за известяване.",
"AddToPlayQueue": "Добавяне към опашка",
- "AccessRestrictedTryAgainLater": "Достъпът е временно ограничен. Моля опитайте отново по-късно."
+ "AccessRestrictedTryAgainLater": "Достъпът е временно ограничен. Моля, опитайте отново по-късно.",
+ "HeaderFavoriteSongs": "Любими песни",
+ "HeaderFavoriteShows": "Любими сериали",
+ "HeaderFavoriteEpisodes": "Любими епизоди",
+ "HeaderFavoriteArtists": "Любими изпълнители",
+ "HeaderFavoriteAlbums": "Любими албуми",
+ "Folders": "Папки",
+ "No": "Не",
+ "Yes": "Да",
+ "MediaInfoStreamTypeSubtitle": "Субтитри",
+ "MediaInfoStreamTypeEmbeddedImage": "Вградено изображение",
+ "MediaInfoStreamTypeData": "Данни",
+ "MediaInfoStreamTypeAudio": "Звук",
+ "MediaInfoContainer": "Контейнер",
+ "MediaInfoInterlaced": "Презредово",
+ "MediaInfoForced": "Принудително",
+ "MediaInfoLayout": "Подредба",
+ "MusicVideo": "Музикален клип",
+ "MediaInfoStreamTypeVideo": "Видео",
+ "LabelVideo": "Видео:",
+ "HeaderVideoTypes": "Видове видеа",
+ "HeaderVideoType": "Вид на видеото",
+ "EnableExternalVideoPlayers": "Външни възпроизводители",
+ "HeaderLoginFailure": "Неуспешно вписване",
+ "Metadata": "Метаданни",
+ "ReplaceAllMetadata": "Заменяне на всички метаданни",
+ "ReplaceExistingImages": "Заменяне на текущите изображения",
+ "Channels": "Канали",
+ "Categories": "Категории",
+ "ButtonViewWebsite": "Преглед на сайта",
+ "ButtonUp": "Нагоре",
+ "ButtonTrailer": "Предварителен откъс",
+ "ButtonStart": "Пускане",
+ "ButtonSelectView": "Изберете изглед",
+ "ButtonSelectServer": "Изберете сървър",
+ "ButtonRepeat": "Повтаряне",
+ "ButtonNetwork": "Мрежа",
+ "ButtonFullscreen": "На цял екран",
+ "ButtonDown": "Надолу",
+ "ButtonConnect": "Свързване"
}
diff --git a/src/strings/cs.json b/src/strings/cs.json
index d6b39c7de4..bfc7c2b58f 100644
--- a/src/strings/cs.json
+++ b/src/strings/cs.json
@@ -457,7 +457,7 @@
"LabelAllowServerAutoRestartHelp": "Server bude restartován pouze v době nečinnosti, pokud nejsou aktivní žádní uživatelé.",
"LabelAnytime": "Kdykoliv",
"LabelAppName": "Název aplikace",
- "LabelAppNameExample": "Příklad: Sickbeard, NzbDrone",
+ "LabelAppNameExample": "Příklad: Sickbeard, Sonarr",
"LabelArtist": "Umělec",
"LabelArtists": "Umělci:",
"LabelArtistsHelp": "Odděl pomocí ;",
@@ -804,7 +804,7 @@
"MessageDeleteTaskTrigger": "Opravdu si přejete odebrat spouštění úlohy?",
"MessageDirectoryPickerBSDInstruction": "Pro BSD, budete možná muset nakonfigurovat úložiště přímo ve Vašem FreeNAS Jail aby k nim Jellyfin povolil přístup.",
"MessageDirectoryPickerInstruction": "Síťové cesty lze zadat ručně v případě, že tlačítko 'Síť' nedokáže automaticky lokalizovat vaše zařízení. Například, {0} nebo {1}.",
- "MessageDirectoryPickerLinuxInstruction": "Pro systémy Linux jako Arch Linux, CentOS, Debian, Fedora, openSUSE nebo Ubuntu musíte udělit uživateli služby oprávnění alespoň pro čtení.",
+ "MessageDirectoryPickerLinuxInstruction": "Pro systémy Linux jako Arch Linux, CentOS, Debian, Fedora, OpenSUSE nebo Ubuntu musíte udělit uživateli služby oprávnění alespoň pro čtení.",
"MessageDownloadQueued": "Stažení zařazeno.",
"MessageFileReadError": "Došlo k chybě při čtení souboru. Prosím zkuste to znovu.",
"MessageForgotPasswordFileCreated": "Následující soubor byl vytvořen na serveru a obsahuje pokyny, jak postupovat:",
@@ -1343,7 +1343,7 @@
"HeaderVideoType": "Formát videa",
"Horizontal": "Vodorovně",
"HowWouldYouLikeToAddUser": "Jak chcete přidat uživatele?",
- "HttpsRequiresCert": "Chcete-li povolit zabezpečená připojení, budete muset zadat důvěryhodný certifikát SSL, například Lets Encrypt. Zadejte prosím certifikát nebo zakažte zabezpečená připojení.",
+ "HttpsRequiresCert": "Chcete-li povolit zabezpečená připojení, budete muset zadat důvěryhodný certifikát SSL, například Let's Encrypt. Zadejte prosím certifikát nebo zakažte zabezpečená připojení.",
"Invitations": "Pozvánky",
"InviteAnJellyfinConnectUser": "Přidejte uživatele odesláním e-mailové pozvánky.",
"KeepDownload": "Zachovat stahování",
@@ -1359,7 +1359,7 @@
"LabelCertificatePassword": "Heslo certifikátu:",
"LabelCertificatePasswordHelp": "Pokud certifikát vyžaduje heslo, zadejte jej prosím zde.",
"LabelConvertTo": "Konvertovat na:",
- "LabelCustomCertificatePath": "Vlastní umístění ssl certifikátu:",
+ "LabelCustomCertificatePath": "Vlastní umístění SSL certifikátu:",
"LabelCustomCertificatePathHelp": "Umístění souboru PKCS #12, který obsahuje certifikát a soukromý klíč k povolení podpory TLS na vlastní doméně.",
"LabelDateTimeLocale": "Místní nastavení data:",
"LabelDefaultScreen": "Výchozí obrazovka:",
@@ -1451,7 +1451,7 @@
"OptionBluray": "Blu-ray",
"OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)",
"OptionDownloadBannerImage": "Banner",
- "OptionDownloadBoxImage": "Box",
+ "OptionDownloadBoxImage": "Krabice",
"OptionDownloadLogoImage": "Logo",
"OptionIsHD": "HD",
"OptionIsSD": "SD",
@@ -1554,5 +1554,6 @@
"FetchingData": "Načtení dalších dat",
"CopyStreamURLSuccess": "Úspěšně zkopírovaná URL.",
"CopyStreamURL": "Kopírovat URL adresu streamu",
- "ButtonAddImage": "Přidat obrázek"
+ "ButtonAddImage": "Přidat obrázek",
+ "HeaderFavoritePeople": "Oblíbení lidé"
}
diff --git a/src/strings/de.json b/src/strings/de.json
index 6899e251d2..54ed6af1a0 100644
--- a/src/strings/de.json
+++ b/src/strings/de.json
@@ -1,12 +1,12 @@
{
- "Absolute": "Absolut",
+ "Absolute": "Gesamt",
"AccessRestrictedTryAgainLater": "Der Zugriff ist derzeit eingeschränkt. Bitte versuche es später erneut.",
"Actor": "Darsteller(in)",
"Add": "Hinzufügen",
"AddGuideProviderHelp": "Fernsehprogrammquelle hinzufügen",
"AddItemToCollectionHelp": "Fügen Sie Elemente zu Sammlungen hinzu, indem Sie sie suchen und deren Rechtsklick- oder Antippmenü benutzen.",
"AddToCollection": "Zur Sammlung hinzufügen",
- "AddToPlayQueue": "Zur Abspielwarteschlange hinzufügen",
+ "AddToPlayQueue": "Zur Warteschlange hinzufügen",
"AddToPlaylist": "Zur Wiedergabeliste hinzufügen",
"AddUser": "Benutzer anlegen",
"AddUserByManually": "Lege einen lokalen User durch manuelle Eingabe der User-Informationen an.",
@@ -60,7 +60,7 @@
"BoxRear": "Box (Rückseite)",
"Browse": "Blättern",
"BrowsePluginCatalogMessage": "Durchsuche unsere Bibliothek, um alle verfügbaren Plugins anzuzeigen.",
- "BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel basierend auf deren Format einbrennen soll während der Videokonvertierung. Die Vermeidung des Einbrennen von Untertiteln verbessert die Serverperformance. Wähle Auto, um Bildfomate (z.B. VOBSUB, PGS, SUB/IDX, etc.) sowie bestimmte ASS/SSA-Untertitel einbrennen zu lassen.",
+ "BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel basierend auf deren Format während der Videokonvertierung einbrennen soll. Die Vermeidung des Einbrennen von Untertiteln verbessert die Serverperformance. Wähle Auto, um Bildfomate (z.B. VOBSUB, PGS, SUB/IDX, etc.) sowie bestimmte ASS/SSA-Untertitel einbrennen zu lassen.",
"ButtonAdd": "Hinzufügen",
"ButtonAddMediaLibrary": "Füge Medienbibliothek hinzu",
"ButtonAddScheduledTaskTrigger": "Auslöser hinzufügen",
@@ -171,7 +171,7 @@
"DetectingDevices": "Suche Geräte",
"DeviceAccessHelp": "Dies wird nur auf Geräte angewandt die eindeutig identifiziert werden können und verhindert nicht den Web-Zugriff. Gefilterter Zugriff auf Geräte verhindert die Nutzung neuer Geräte solange, bis der Zugriff für diese freigegeben wird.",
"DirectPlaying": "Direktes Abspielen",
- "DirectStreamHelp1": "Das Medium ist mit dem Abspielgerät kompatibel bzgl. Auflösung und Codecs (H.264, AC3, etc.), besitzt jedoch ein inkompatibles Containerformat (.mkv, .avi, .wmv, etc.). Das Video wird in Echtzeit neuverpackt bevor es zum Abspielgerät gestreamt wird.",
+ "DirectStreamHelp1": "Das Medium ist mit dem Abspielgerät kompatibel bzgl. Auflösung und Codecs (H.264, AC3, etc.), besitzt jedoch ein inkompatibles Containerformat (mkv, avi, wmv, etc.). Das Video wird in Echtzeit neuverpackt bevor es zum Abspielgerät gestreamt wird.",
"DirectStreamHelp2": "Direktes Streaming von Dateien benötigt sehr wenig Rechenleistung ohne Verlust der Videoqualität.",
"DirectStreaming": "Direktes Streaming",
"Director": "Regisseur",
@@ -185,36 +185,36 @@
"DisplayInMyMedia": "Zeige auf Homescreen",
"DisplayInOtherHomeScreenSections": "Zeige auf dem Homescreen Bereiche wie 'Neueste Medien' oder 'Weiterschauen'",
"DisplayMissingEpisodesWithinSeasons": "Zeige fehlende Episoden innerhalb von Staffeln",
- "DisplayMissingEpisodesWithinSeasonsHelp": "Dies sollte auch für Serienbibliotheken in den Jellyfin Server Einstellungen aktiviert sein.",
+ "DisplayMissingEpisodesWithinSeasonsHelp": "Dies muss auch für Serienbibliotheken in den Servereinstellungen aktiviert sein.",
"DisplayModeHelp": "Bitte wähle den Typ des Bildschirms auf dem Du Jellyfin verwendest.",
"DoNotRecord": "Nicht aufnehmen",
"Down": "Runter",
"DownloadsValue": "{0} Downloads",
"DrmChannelsNotImported": "Verschlüsselte Kanäle werden nicht importiert.",
"DropShadow": "Schlagschatten",
- "EasyPasswordHelp": "Die vereinfachte PIN Eingabe wird für offline Zugriffe von unterstützenden Jellyfin Apps verwendet. Sie kann ebenso als erleichterten Zugang aus dem eigenen Netzwerk verwendet werden.",
+ "EasyPasswordHelp": "Die vereinfachte PIN-Eingabe wird für Offline-Zugriffe über unterstützte Clients verwendet. Sie kann ebenso für ein einfaches Einloggen über das eigene Netzwerk verwendet werden.",
"Edit": "Bearbeiten",
"EditImages": "Bearbeite Bilder",
"EditMetadata": "Bearbeite Metadaten",
"EditSubtitles": "Untertitel bearbeiten",
- "EnableBackdrops": "Aktiviere Hintergründe",
- "EnableBackdropsHelp": "Wenn aktiviert, werden während des Browsens durch die Bibliothek auf einigen Seiten passende Hintergründe angezeigt.",
+ "EnableBackdrops": "Hintergründe",
+ "EnableBackdropsHelp": "Zeige während des Browsens durch die Bibliothek auf einigen Seiten passende Hintergründe an",
"EnableCinemaMode": "Kino-Modus",
- "EnableColorCodedBackgrounds": "Aktiviere farbige Hintergründe",
+ "EnableColorCodedBackgrounds": "Farbige Hintergründe",
"EnableDisplayMirroring": "Display-Spiegelung",
"EnableExternalVideoPlayers": "Externe Videoplayer",
"EnableExternalVideoPlayersHelp": "Ein Menü für externe Videoplayer wird beim Start der Videowiedergabe angezeigt.",
"EnableHardwareEncoding": "Aktiviere Hardware-Encoding",
- "EnableNextVideoInfoOverlay": "Aktiviere \"Next-Video-Info\" während der Wiedergabe",
+ "EnableNextVideoInfoOverlay": "Zeige \"Next-Video-Info\" während der Wiedergabe",
"EnableNextVideoInfoOverlayHelp": "Zeige Informationen über das nächste abzuspielende Video in der aktuellen Abspielliste am Ende des laufenden Videos an.",
- "EnablePhotos": "Aktiviere Fotos",
- "EnablePhotosHelp": "Fotos werden erkannt und neben anderen Mediendateien angezeigt.",
+ "EnablePhotos": "Zeige Fotos",
+ "EnablePhotosHelp": "Bilder werden erkannt und neben anderen Mediendateien angezeigt.",
"EnableStreamLooping": "Auto-Schleife Live Streams",
"EnableStreamLoopingHelp": "Aktivieren, wenn Live Streams nur ein paar Sekunden Daten enthalten und ständig angefragt werden müssen. Kann zu Problemen führen wenn aktiviert, obwohl nicht nötig.",
- "EnableThemeSongs": "Aktiviere Titelmelodien",
- "EnableThemeSongsHelp": "Wenn aktiviert, wird Titelmusik während des Browsens durch die Bibliothek im Hintergrund abgespielt.",
- "EnableThemeVideos": "Altiviere Titelvideos",
- "EnableThemeVideosHelp": "Wenn aktiviert, wird ein Titelvideo während dem Durchsuchen durch die Bibliothek im Hintergrund abgespielt.",
+ "EnableThemeSongs": "Titelmelodien",
+ "EnableThemeSongsHelp": "Titelmusik wird während des Blätterns durch die Bibliothek im Hintergrund abgespielt.",
+ "EnableThemeVideos": "Titelvideos",
+ "EnableThemeVideosHelp": "Titelvideos werden während des Blätterns durch die Bibliothek im Hintergrund abgespielt.",
"Ended": "Beendent",
"EndsAtValue": "Endet um {0}",
"Episodes": "Episoden",
@@ -223,7 +223,7 @@
"ErrorAddingTunerDevice": "Es trat ein Fehler beim hinzufügen eines Tuners auf. Bitte stellen Sie sicher das dieser erreichbar ist und versuchen Sie es erneut.",
"ErrorAddingXmlTvFile": "Fehler beim Zugriff auf die XmlTV Datei. Stelle bitte sicher, dass die Datei existiert und versuche es nochmal.",
"ErrorDeletingItem": "Fehler beim Löschen des Mediums vom Jellyfin Server. Bitte stelle sicher dass der Jellyfin Server Schreibzugriff auf den Dateiordner hat und versuche es erneut.",
- "ErrorGettingTvLineups": "Ein Fehler trat beim herunterladen des TV Programs auf. Bitte stellen Sie sicher, dass Ihre Informationen korrekt sind und versuchen Sie es erneut.",
+ "ErrorGettingTvLineups": "Ein Fehler trat beim Herunterladen des Fernsehprogramms auf. Bitte stellen Sie sicher, dass Ihre Informationen korrekt sind und versuchen Sie es erneut.",
"ErrorMessageStartHourGreaterThanEnd": "Die Endzeit muss größer als die Startzeit sein.",
"ErrorPleaseSelectLineup": "Bitte wählen Sie ein TV Programm und versuchen Sie es erneut. Wenn keine Programme verfügbar sind prüfen Sie bitte Benutzername, Passwort und Ihre Postleitzahl.",
"ErrorSavingTvProvider": "Ein Fehler beim speichern des TV Verzeichnisses trat auf. Bitte stellen Sie sicher das dieser erreichbar ist und versuchen Sie es erneut.",
@@ -359,7 +359,7 @@
"HeaderLibraryFolders": "Bibliotheksverzeichnisse",
"HeaderLibraryOrder": "Bibliotheksreihenfolge",
"HeaderLibrarySettings": "Bibliothekseinstellungen",
- "HeaderLiveTV": "Live-TV",
+ "HeaderLiveTV": "Live TV",
"HeaderLiveTv": "Live-TV",
"HeaderLiveTvTunerSetup": "TV Tuner Setup",
"HeaderLoginFailure": "Login Fehler",
@@ -422,7 +422,7 @@
"HeaderSelectServerCachePathHelp": "Suche oder gib den Pfad für die Speicherung von Server Cache Dateien an. Das Verzeichnis muss beschreibbar sein.",
"HeaderSelectTranscodingPath": "Wähle Pfad für temporäre Transkodierdateien",
"HeaderSelectTranscodingPathHelp": "Suche oder gib den Pfad für die Speicherung von temporären Transkodierdateien an. Das Verzeichnis muss beschreibbar sein.",
- "HeaderSendMessage": "sende Nachricht",
+ "HeaderSendMessage": "Nachricht senden",
"HeaderSeries": "Serien",
"HeaderSeriesOptions": "Serienoptionen",
"HeaderSeriesStatus": "Serienstatus",
@@ -495,7 +495,7 @@
"LabelAll": "Alle",
"LabelAllowHWTranscoding": "Erlaube Hardware Transkodierung",
"LabelAllowServerAutoRestart": "Erlaube dem Server sich automatisch neuzustarten, um Updates durchzuführen",
- "LabelAllowServerAutoRestartHelp": "Der Server startet nur in benutzerfreien Leerlaufzeiten neu.",
+ "LabelAllowServerAutoRestartHelp": "Der Server startet nur wenn keine Nutzer aktiv sind neu.",
"LabelAllowedRemoteAddresses": "Remote-IP Adressen Filter:",
"LabelAllowedRemoteAddressesMode": "Remote IP Adressen Filtermodus:",
"LabelAppName": "App Name",
@@ -509,7 +509,7 @@
"LabelBirthDate": "Geburtsdatum:",
"LabelBirthYear": "Geburtsjahr:",
"LabelBlastMessageInterval": "Alive Meldungsintervall (Sekunden)",
- "LabelBlastMessageIntervalHelp": "Legt die Dauer in Sekunden zwischen den Server Alive Meldungen fest.",
+ "LabelBlastMessageIntervalHelp": "Legt die Dauer in Sekunden zwischen den Server-Alive-Meldungen fest.",
"LabelBlockContentWithTags": "Blockiere Inhalte mit Tags:",
"LabelBurnSubtitles": "Untertitel einbrennen:",
"LabelCachePath": "Cache Pfad:",
@@ -1461,5 +1461,13 @@
"MoreMediaInfo": "Medieninformation",
"MessageNoServersAvailable": "Die automatische Serversuche konnte keinen Server finden.",
"LabelPlayer": "Player:",
- "MediaInfoCodecTag": "Codec Tag"
+ "MediaInfoCodecTag": "Codec Tag",
+ "SubtitleOffset": "Untertitelvorlauf",
+ "PlaybackData": "Wiedergabeinformationen",
+ "OptionThumbCard": "Vorschaukarte",
+ "OptionPosterCard": "Posterkarte",
+ "OptionPoster": "Poster",
+ "OptionList": "Liste",
+ "OptionBanner": "Banner",
+ "MusicVideo": "Musikvideo"
}
diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json
index 573baf2165..4f734645b4 100644
--- a/src/strings/en-gb.json
+++ b/src/strings/en-gb.json
@@ -5,32 +5,32 @@
"ColorPrimaries": "Colour primaries",
"ColorSpace": "Colour space",
"ColorTransfer": "Colour transfer",
- "DefaultMetadataLangaugeDescription": "These are your defaults and can be customised on a per-library basis.",
- "EnableColorCodedBackgrounds": "Enable colour-coded backgrounds",
+ "DefaultMetadataLangaugeDescription": "These are your defaults and can be customized on a per-library basis.",
+ "EnableColorCodedBackgrounds": "Colour coded backgrounds",
"Favorite": "Favourite",
"Favorites": "Favourites",
- "HDPrograms": "HD programmes",
- "HeaderBlockItemsWithNoRating": "Block items with no or unrecognised rating information:",
- "HeaderResponseProfileHelp": "Response profiles provide a way to customise information sent to the device when playing certain kinds of media.",
+ "HDPrograms": "HD programs",
+ "HeaderBlockItemsWithNoRating": "Block items with no or unrecognized rating information:",
+ "HeaderResponseProfileHelp": "Response profiles provide a way to customize information sent to the device when playing certain kinds of media.",
"ImportFavoriteChannelsHelp": "If enabled, only channels that are marked as favourite on the tuner device will be imported.",
"LabelDateAddedBehavior": "Date added behaviour for new content:",
"LabelImportOnlyFavoriteChannels": "Restrict to channels marked as favourite",
- "LabelKodiMetadataUserHelp": "Enable this to save watch data to Nfo files for other applications to utilise.",
- "LabelTextBackgroundColor": "Text background colour:",
- "LabelTextColor": "Text colour:",
- "NewCollectionHelp": "Collections allow you to create personalised groupings of movies and other library content.",
- "NoNewDevicesFound": "No new devices found. To add a new tuner, close this dialogue and enter the device information manually.",
- "OptionEnableExternalContentInSuggestionsHelp": "Allow internet trailers and live TV programmes to be included within suggested content.",
+ "LabelKodiMetadataUserHelp": "Save watch data to NFO files for other applications to utilize.",
+ "LabelTextBackgroundColor": "Text background color:",
+ "LabelTextColor": "Text color:",
+ "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.",
+ "NoNewDevicesFound": "No new devices found. To add a new tuner, close this dialogueand enter the device information manually.",
+ "OptionEnableExternalContentInSuggestionsHelp": "Allow internet trailers and live TV programs to be included within suggested content.",
"OptionFavorite": "Favourites",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honoured but will ignore the byte range header.",
"PlaceFavoriteChannelsAtBeginning": "Place favourite channels at the beginning",
- "Programs": "Programmes",
+ "Programs": "Programs",
"TabCatalog": "Catalogue",
"TabFavorites": "Favourites",
- "XmlTvKidsCategoriesHelp": "Programmes with these categories will be displayed as programmes for children. Separate multiple with '|'.",
- "XmlTvMovieCategoriesHelp": "Programmes with these categories will be displayed as movies. Separate multiple with '|'.",
- "XmlTvNewsCategoriesHelp": "Programmes with these categories will be displayed as news programmes. Separate multiple with '|'.",
- "XmlTvSportsCategoriesHelp": "Programmes with these categories will be displayed as sports programmes. Separate multiple with '|'.",
+ "XmlTvKidsCategoriesHelp": "Programs with these categories will be displayed as programs for children. Separate multiple with '|'.",
+ "XmlTvMovieCategoriesHelp": "Programs with these categories will be displayed as movies. Separate multiple with '|'.",
+ "XmlTvNewsCategoriesHelp": "Programs with these categories will be displayed as news programs. Separate multiple with '|'.",
+ "XmlTvSportsCategoriesHelp": "Programs with these categories will be displayed as sports programs. Separate multiple with '|'.",
"Albums": "Albums",
"Artists": "Artists",
"Books": "Books",
@@ -67,11 +67,11 @@
"AllEpisodes": "All episodes",
"AllLanguages": "All languages",
"AllLibraries": "All libraries",
- "AllowHWTranscodingHelp": "If enabled, allow the tuner to transcode streams on the fly. This may help reduce transcoding required by Jellyfin Server.",
+ "AllowHWTranscodingHelp": "Allow the tuner to transcode streams on the fly. This may help reduce transcoding required by the server.",
"AllowMediaConversion": "Allow media conversion",
"AllowMediaConversionHelp": "Grant or deny access to the convert media feature.",
"AllowOnTheFlySubtitleExtraction": "Allow subtitle extraction on the fly",
- "AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to Jellyfin apps in plain text in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.",
+ "AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.",
"AllowRemoteAccess": "Allow remote connections to this Jellyfin Server.",
"AllowRemoteAccessHelp": "If unchecked, all remote connections will be blocked.",
"AllowedRemoteAddressesHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be allowed to connect remotely. If left blank, all remote addresses will be allowed.",
@@ -86,7 +86,7 @@
"AspectRatio": "Aspect ratio",
"AttributeNew": "New",
"Audio": "Audio",
- "AuthProviderHelp": "Select an Authentication Provider to be used to authenticate this user's password",
+ "AuthProviderHelp": "Select an Authentication Provider to be used to authenticate this user's password.",
"Auto": "Auto",
"AutoBasedOnLanguageSetting": "Auto (based on language setting)",
"Backdrop": "Backdrop",
@@ -96,11 +96,11 @@
"BirthLocation": "Birth location",
"BirthPlaceValue": "Birth place: {0}",
"Blacklist": "Blacklist",
- "BookLibraryHelp": "Audio and text books are supported. Review the {0}Jellyfin Book naming guide{1}.",
+ "BookLibraryHelp": "Audio and text books are supported. Review the {0}book naming guide{1}.",
"Box": "Box",
"BoxRear": "Box (rear)",
"Browse": "Browse",
- "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
+ "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitle format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB/IDX, etc) and certain ASS/SSA subtitles.",
"ButtonAdd": "Add",
"ButtonAddMediaLibrary": "Add Media Library",
"ButtonAddScheduledTaskTrigger": "Add Trigger",
@@ -124,7 +124,7 @@
"ButtonEditImages": "Edit images",
"ButtonEditOtherUserPreferences": "Edit this user's profile, image and personal preferences.",
"ButtonFilter": "Filter",
- "ButtonForgotPassword": "Forgot password",
+ "ButtonForgotPassword": "Forgot Password",
"ButtonFullscreen": "Fullscreen",
"ButtonGotIt": "Got It",
"ButtonGuide": "Guide",
@@ -140,7 +140,7 @@
"ButtonNew": "New",
"ButtonNextTrack": "Next track",
"ButtonOff": "Off",
- "ButtonOk": "Ok",
+ "ButtonOk": "OK",
"ButtonOpen": "Open",
"ButtonParentalControl": "Parental control",
"ButtonPause": "Pause",
@@ -219,7 +219,7 @@
"DetectingDevices": "Detecting devices",
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
"DirectPlaying": "Direct playing",
- "DirectStreamHelp1": "The media is compatible with the device regarding resolution and media type (H.264, AC3, etc.), but is in an incompatible file container (.mkv, .avi, .wmv, etc.). The video will be re-packaged on the fly before streaming it to the device.",
+ "DirectStreamHelp1": "The media is compatible with the device regarding resolution and media type (H.264, AC3, etc), but is in an incompatible file container (mkv, avi, wmv, etc). The video will be re-packaged on the fly before streaming it to the device.",
"DirectStreamHelp2": "Direct Streaming a file uses very little processing power without any loss in video quality.",
"DirectStreaming": "Direct streaming",
"Director": "Director",
@@ -233,37 +233,37 @@
"DisplayInMyMedia": "Display on home screen",
"DisplayInOtherHomeScreenSections": "Display in home screen sections such as latest media and continue watching",
"DisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
- "DisplayMissingEpisodesWithinSeasonsHelp": "This must also be enabled for TV libraries in Jellyfin Server setup.",
+ "DisplayMissingEpisodesWithinSeasonsHelp": "This must also be enabled for TV libraries in the server configuration.",
"DisplayModeHelp": "Select the type of screen you're running Jellyfin on.",
"DoNotRecord": "Do not record",
"Down": "Down",
"Download": "Download",
"DownloadsValue": "{0} downloads",
"DrmChannelsNotImported": "Channels with DRM will not be imported.",
- "DropShadow": "Drop shadow",
- "EasyPasswordHelp": "Your easy pin code is used for offline access with supported Jellyfin apps, and can also be used for easy in-network sign in.",
+ "DropShadow": "Drop Shadow",
+ "EasyPasswordHelp": "Your easy pin code is used for offline access on supported clients and can also be used for easy in-network sign in.",
"Edit": "Edit",
"EditImages": "Edit images",
"EditMetadata": "Edit metadata",
"EditSubtitles": "Edit subtitles",
- "EnableBackdrops": "Enable backdrops",
- "EnableBackdropsHelp": "If enabled, backdrops will be displayed in the background of some pages while browsing the library.",
- "EnableCinemaMode": "Enable cinema mode",
+ "EnableBackdrops": "Backdrops",
+ "EnableBackdropsHelp": "Display backdrops in the background of some pages while browsing the library.",
+ "EnableCinemaMode": "Cinema mode",
"EnableDebugLoggingHelp": "Debug logging should only be enabled as needed for troubleshooting purposes. The increased file system access may prevent the server machine from being able to sleep in some environments.",
- "EnableDisplayMirroring": "Enable display mirroring",
- "EnableExternalVideoPlayers": "Enable external video players",
+ "EnableDisplayMirroring": "Display mirroring",
+ "EnableExternalVideoPlayers": "External video players",
"EnableExternalVideoPlayersHelp": "An external player menu will be shown when starting video playback.",
"EnableHardwareEncoding": "Enable hardware encoding",
- "EnableNextVideoInfoOverlay": "Enable next video info during playback",
+ "EnableNextVideoInfoOverlay": "Show next video info during playback",
"EnableNextVideoInfoOverlayHelp": "At the end of a video, display info about the next video coming up in the current playlist.",
- "EnablePhotos": "Enable photos",
- "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.",
+ "EnablePhotos": "Display photos",
+ "EnablePhotosHelp": "Images will be detected and displayed alongside other media files.",
"EnableStreamLooping": "Auto-loop live streams",
"EnableStreamLoopingHelp": "Enable this if live streams only contain a few seconds of data and need to be continuously requested. Enabling this when not needed may cause problems.",
- "EnableThemeSongs": "Enable theme songs",
- "EnableThemeSongsHelp": "If enabled, theme songs will be played in the background while browsing the library.",
- "EnableThemeVideos": "Enable theme videos",
- "EnableThemeVideosHelp": "If enabled, theme videos will be played in the background while browsing the library.",
+ "EnableThemeSongs": "Theme songs",
+ "EnableThemeSongsHelp": "Play theme songs in the background while browsing the library.",
+ "EnableThemeVideos": "Theme videos",
+ "EnableThemeVideosHelp": "Play theme videos in the background while browsing the library.",
"Ended": "Ended",
"EndsAtValue": "Ends at {0}",
"Episodes": "Episodes",
@@ -272,14 +272,14 @@
"ErrorAddingTunerDevice": "There was an error adding the tuner device. Please ensure it is accessible and try again.",
"ErrorAddingXmlTvFile": "There was an error accessing the XMLTV file. Please ensure the file exists and try again.",
"ErrorDeletingItem": "There was an error deleting the item from Jellyfin Server. Please check that Jellyfin Server has write access to the media folder and try again.",
- "ErrorGettingTvLineups": "There was an error downloading tv lineups. Please ensure your information is correct and try again.",
+ "ErrorGettingTvLineups": "There was an error downloading TV lineups. Please ensure your information is correct and try again.",
"ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time.",
"ErrorPleaseSelectLineup": "Please select a lineup and try again. If no lineups are available, then please check that your username, password, and postal code is correct.",
"ErrorSavingTvProvider": "There was an error saving the TV provider. Please ensure it is accessible and try again.",
"EveryNDays": "Every {0} days",
"ExitFullscreen": "Exit full screen",
- "ExtraLarge": "Extra large",
- "ExtractChapterImagesHelp": "Extracting chapter images will allow Jellyfin apps to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs when videos are discovered, and also as a nightly scheduled task. The schedule is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.",
+ "ExtraLarge": "Extra Large",
+ "ExtractChapterImagesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, resource intensive, and may require several gigabytes of space. It runs when videos are discovered, and also as a nightly scheduled task. The schedule is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.",
"Extras": "Extras",
"FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.",
"FastForward": "Fast-forward",
@@ -292,9 +292,9 @@
"FolderTypeBooks": "Books",
"FolderTypeMovies": "Movies",
"FolderTypeMusic": "Music",
- "FolderTypeMusicVideos": "Music videos",
+ "FolderTypeMusicVideos": "Music Videos",
"FolderTypeTvShows": "TV Shows",
- "FolderTypeUnset": "Mixed content",
+ "FolderTypeUnset": "Mixed Content",
"FormatValue": "Format: {0}",
"Friday": "Friday",
"Fullscreen": "Full screen",
@@ -328,7 +328,7 @@
"HeaderAllowMediaDeletionFrom": "Allow Media Deletion From",
"HeaderApiKey": "API Key",
"HeaderApiKeys": "API Keys",
- "HeaderApiKeysHelp": "External applications are required to have an API key in order to communicate with Jellyfin Server. Keys are issued by logging in with an Jellyfin account, or by manually granting the application a key.",
+ "HeaderApiKeysHelp": "External applications are required to have an API key in order to communicate with Jellyfin Server. Keys are issued by logging in with a Jellyfin account, or by manually granting the application a key.",
"HeaderApp": "App",
"HeaderAppearsOn": "Appears On",
"HeaderAudioBooks": "Audio Books",
@@ -449,5 +449,1014 @@
"HeaderPaths": "Paths",
"HeaderPendingInvitations": "Pending Invitations",
"CopyStreamURL": "Copy Stream URL",
- "CopyStreamURLSuccess": "URL copied successfully."
+ "CopyStreamURLSuccess": "URL copied successfully.",
+ "XmlDocumentAttributeListHelp": "These attributes are applied to the root element of every XML response.",
+ "Writer": "Writer",
+ "WizardCompleted": "That's all we need for now. Jellyfin has begun collecting information about your media library. Check out some of our apps, and then click Finish to view the Dashboard.",
+ "Vertical": "Vertical",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueTimeLimitSingleHour": "Time limit: 1 hour",
+ "ValueTimeLimitMultiHour": "Time limit: {0} hours",
+ "ValueSeriesCount": "{0} series",
+ "ValueSeconds": "{0} seconds",
+ "ValueOneSong": "1 song",
+ "ValueOneMusicVideo": "1 music video",
+ "ValueOneAlbum": "1 album",
+ "ValueMusicVideoCount": "{0} music videos",
+ "ValueMovieCount": "{0} movies",
+ "ValueMinutes": "{0} min",
+ "ValueDiscNumber": "Disc {0}",
+ "ValueContainer": "Container: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueAlbumCount": "{0} albums",
+ "UserProfilesIntro": "Jellyfin includes support for user profiles with granular display settings, play state, and parental controls.",
+ "UserAgentHelp": "Supply a custom user-agent HTTP header.",
+ "Upload": "Upload",
+ "Unrated": "Unrated",
+ "Unplayed": "Unplayed",
+ "Unmute": "Unmute",
+ "UninstallPluginHeader": "Uninstall Plugin",
+ "Trailers": "Trailers",
+ "TrackCount": "{0} tracks",
+ "TitlePlayback": "Playback",
+ "TitleHostingSettings": "Hosting Settings",
+ "TitleHardwareAcceleration": "Hardware Acceleration",
+ "Thursday": "Thursday",
+ "ThisWizardWillGuideYou": "This wizard will help guide you through the setup process. To begin, please select your preferred language.",
+ "TheseSettingsAffectSubtitlesOnThisDevice": "These settings affect subtitles on this device",
+ "TabShows": "Shows",
+ "TabSettings": "Settings",
+ "TabServer": "Server",
+ "TabSeries": "Series",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "TabResumeSettings": "Resume",
+ "TabResponses": "Responses",
+ "TabRecordings": "Recordings",
+ "TabPlaylist": "Playlist",
+ "TabPlayback": "Playback",
+ "TabOther": "Other",
+ "TabNotifications": "Notifications",
+ "TabNetworks": "Networks",
+ "TabMyPlugins": "My Plugins",
+ "TabMusicVideos": "Music Videos",
+ "TabMusic": "Music",
+ "TabMovies": "Movies",
+ "TabMetadata": "Metadata",
+ "TabLogs": "Logs",
+ "TabDisplay": "Display",
+ "TabDirectPlay": "Direct Play",
+ "TabDevices": "Devices",
+ "TabChannels": "Channels",
+ "TabArtists": "Artists",
+ "TabAlbums": "Albums",
+ "TabAlbumArtists": "Album Artists",
+ "TabAdvanced": "Advanced",
+ "TabAccess": "Access",
+ "TV": "TV",
+ "SystemDlnaProfilesHelp": "System profiles are read-only. Changes to a system profile will be saved to a new custom profile.",
+ "Sunday": "Sunday",
+ "Suggestions": "Suggestions",
+ "Subtitles": "Subtitles",
+ "SubtitleOffset": "Subtitle Offset",
+ "SubtitleDownloadersHelp": "Enable and rank your preferred subtitle downloaders in order of priority.",
+ "SubtitleAppearanceSettingsDisclaimer": "These settings will not apply to graphical subtitles (PGS, DVD, etc) or ASS/SSA subtitles that embed their own styles.",
+ "SortName": "Sort name",
+ "SortChannelsBy": "Sort channels by:",
+ "SortByValue": "Sort by {0}",
+ "SmartSubtitlesHelp": "Subtitles matching the language preference will be loaded when the audio is in a foreign language.",
+ "Smart": "Smart",
+ "SimultaneousConnectionLimitHelp": "The maximum number of allowed simultaneous streams. Enter 0 for no limit.",
+ "Shuffle": "Shuffle",
+ "ShowYear": "Show year",
+ "ShowIndicatorsFor": "Show indicators for:",
+ "ShowAdvancedSettings": "Show advanced settings",
+ "Share": "Share",
+ "SettingsWarning": "Changing these values may cause instability or connectivity failures. If you experience any problems, we recommend changing them back to default.",
+ "SettingsSaved": "Settings saved.",
+ "Settings": "Settings",
+ "ServerUpdateNeeded": "This Jellyfin Server needs to be updated. To download the latest version, please visit {0}",
+ "ServerRestartNeededAfterPluginInstall": "Jellyfin Server will need to be restarted after installing a plugin.",
+ "ServerNameIsShuttingDown": "Jellyfin Server - {0} is shutting down.",
+ "SeriesYearToPresent": "{0} - Present",
+ "SeriesSettings": "Series settings",
+ "SeriesRecordingScheduled": "Series recording scheduled.",
+ "SeriesCancelled": "Series cancelled.",
+ "SendMessage": "Send message",
+ "SearchResults": "Search Results",
+ "SearchForSubtitles": "Search for Subtitles",
+ "SearchForMissingMetadata": "Search for missing metadata",
+ "Search": "Search",
+ "Screenshots": "Screenshots",
+ "Screenshot": "Screenshot",
+ "Schedule": "Schedule",
+ "ScanLibrary": "Scan library",
+ "ScanForNewAndUpdatedFiles": "Scan for new and updated files",
+ "SaveSubtitlesIntoMediaFoldersHelp": "Storing subtitles next to video files will allow them to be more easily managed.",
+ "SaveSubtitlesIntoMediaFolders": "Save subtitles into media folders",
+ "Saturday": "Saturday",
+ "Runtime": "Runtime",
+ "RunAtStartup": "Run at startup",
+ "Rewind": "Rewind",
+ "ResumeAt": "Resume from {0}",
+ "RestartPleaseWaitMessage": "Please wait while Jellyfin Server shuts down and restarts. This may take a minute or two.",
+ "RequiredForAllRemoteConnections": "Required for all remote connections",
+ "ReplaceExistingImages": "Replace existing images",
+ "ReplaceAllMetadata": "Replace all metadata",
+ "RepeatOne": "Repeat one",
+ "RepeatMode": "Repeat mode",
+ "RepeatEpisodes": "Repeat episodes",
+ "RepeatAll": "Repeat all",
+ "Repeat": "Repeat",
+ "RemoveFromPlaylist": "Remove from playlist",
+ "RemoveFromCollection": "Remove from collection",
+ "RememberMe": "Remember me",
+ "ReleaseDate": "Release date",
+ "RefreshMetadata": "Refresh metadata",
+ "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Jellyfin Server dashboard.",
+ "Refresh": "Refresh",
+ "Recordings": "Recordings",
+ "RecordingScheduled": "Recording scheduled.",
+ "RecordingPathChangeMessage": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.",
+ "RecordingCancelled": "Recording cancelled.",
+ "RecordSeries": "Record series",
+ "Record": "Record",
+ "RecommendationStarring": "Starring {0}",
+ "RecommendationDirectedBy": "Directed by {0}",
+ "RecommendationBecauseYouWatched": "Because you watched {0}",
+ "Rate": "Rate",
+ "Raised": "Raised",
+ "QueueAllFromHere": "Queue all from here",
+ "Quality": "Quality",
+ "Producer": "Producer",
+ "Primary": "Primary",
+ "Previous": "Previous",
+ "Premieres": "Premieres",
+ "Premiere": "Premiere",
+ "PreferredNotRequired": "Preferred, but not required",
+ "PreferEmbeddedTitlesOverFileNamesHelp": "This determines the default display title when no internet metadata or local metadata is available.",
+ "PreferEmbeddedTitlesOverFileNames": "Prefer embedded titles over filenames",
+ "PluginInstalledMessage": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.",
+ "PleaseSelectTwoItems": "Please select at least two items.",
+ "PleaseRestartServerName": "Please restart Jellyfin Server - {0}.",
+ "PleaseConfirmPluginInstallation": "Please click OK to confirm you've read the above and wish to proceed with the plugin installation.",
+ "PleaseAddAtLeastOneFolder": "Please add at least one folder to this library by clicking the Add button.",
+ "Played": "Played",
+ "PlayNextEpisodeAutomatically": "Play next episode automatically",
+ "PlayNext": "Play next",
+ "PlayFromBeginning": "Play from beginning",
+ "PlayCount": "Play count",
+ "PlaybackData": "Playback Data",
+ "PlayAllFromHere": "Play all from here",
+ "PinCodeResetConfirmation": "Are you sure you wish to reset the pin code?",
+ "PinCodeResetComplete": "The pin code has been reset.",
+ "PictureInPicture": "Picture in picture",
+ "PerfectMatch": "Perfect match",
+ "PasswordSaved": "Password saved.",
+ "PasswordResetHeader": "Reset Password",
+ "PasswordResetConfirmation": "Are you sure you wish to reset the password?",
+ "PasswordResetComplete": "The password has been reset.",
+ "PasswordMatchError": "Password and password confirmation must match.",
+ "ParentalRating": "Parental rating",
+ "PackageInstallFailed": "{0} installation failed.",
+ "PackageInstallCompleted": "{0} installation completed.",
+ "PackageInstallCancelled": "{0} installation cancelled.",
+ "OriginalAirDateValue": "Original air date: {0}",
+ "OptionWeekly": "Weekly",
+ "OptionWeekends": "Weekends",
+ "OptionWeekdays": "Weekdays",
+ "OptionWednesday": "Wednesday",
+ "OptionWakeFromSleep": "Wake from sleep",
+ "OptionUnplayed": "Unplayed",
+ "OptionUnairedEpisode": "Unaired Episodes",
+ "OptionTrackName": "Track Name",
+ "OptionThumbCard": "Thumb card",
+ "OptionThumb": "Thumb",
+ "OptionThursday": "Thursday",
+ "OptionSunday": "Sunday",
+ "OptionSubstring": "Substring",
+ "OptionSpecialEpisode": "Specials",
+ "OptionSaveMetadataAsHiddenHelp": "Changing this will apply to new metadata saved going forward. Existing metadata files will be updated the next time they are saved by Jellyfin Server.",
+ "OptionSaveMetadataAsHidden": "Save metadata and images as hidden files",
+ "OptionSaturday": "Saturday",
+ "OptionRuntime": "Runtime",
+ "OptionResumable": "Resumable",
+ "OptionResElement": "res element",
+ "OptionRequirePerfectSubtitleMatchHelp": "Requiring a perfect match will filter subtitles to include only those that have been tested and verified with your exact video file. Unchecking this will increase the likelihood of subtitles being downloaded, but will increase the chances of mistimed or incorrect subtitle text.",
+ "OptionRequirePerfectSubtitleMatch": "Only download subtitles that are a perfect match for my video files",
+ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.",
+ "OptionReportByteRangeSeekingWhenTranscoding": "Report that the server supports byte seeking when transcoding",
+ "OptionRegex": "Regex",
+ "OptionProfileVideo": "Video",
+ "OptionProfileAudio": "Audio",
+ "OptionPremiereDate": "Premiere Date",
+ "OptionPlayCount": "Play Count",
+ "OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".",
+ "OptionPlainVideoItems": "Display all videos as plain video items",
+ "OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".",
+ "OptionParentalRating": "Parental Rating",
+ "OptionOnInterval": "On an interval",
+ "OptionOnAppStartup": "On application startup",
+ "OptionNone": "None",
+ "OptionNew": "New...",
+ "OptionMissingEpisode": "Missing Episodes",
+ "OptionMax": "Max",
+ "OptionLoginAttemptsBeforeLockoutHelp": "A value of zero means inheriting the default of three attempts for normal users and five for administrators. Setting this to -1 will disable the feature.",
+ "OptionLoginAttemptsBeforeLockout": "Determines how many incorrect login attempts can be made before lockout occurs.",
+ "OptionList": "List",
+ "OptionDatePlayed": "Date Played",
+ "OptionBlockTvShows": "TV Shows",
+ "OptionBlockTrailers": "Trailers",
+ "OptionBlockMovies": "Movies",
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "OptionBanner": "Banner",
+ "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.",
+ "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders",
+ "OptionArtist": "Artist",
+ "OptionAllowVideoPlaybackTranscoding": "Allow video playback that requires transcoding",
+ "OptionAllowVideoPlaybackRemuxing": "Allow video playback that requires conversion without re-encoding",
+ "OptionAllowUserToManageServer": "Allow this user to manage the server",
+ "OptionAllowSyncTranscoding": "Allow media downloading and syncing that requires transcoding",
+ "OptionAllowRemoteSharedDevicesHelp": "DLNA devices are considered shared until a user begins controlling them.",
+ "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
+ "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+ "OptionAllowMediaPlaybackTranscodingHelp": "Restricting access to transcoding may cause playback failures in Jellyfin apps due to unsupported media formats.",
+ "OptionAllowManageLiveTv": "Allow Live TV recording management",
+ "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire after {0} days.",
+ "OptionAllowLinkSharing": "Allow social media sharing",
+ "OptionAllowContentDownloading": "Allow media downloading and syncing",
+ "OptionAllowBrowsingLiveTv": "Allow Live TV access",
+ "OptionAllowAudioPlaybackTranscoding": "Allow audio playback that requires transcoding",
+ "OptionAllUsers": "All users",
+ "OptionAlbumArtist": "Album Artist",
+ "OptionAlbum": "Album",
+ "Option3D": "3D",
+ "OnlyImageFormats": "Only image formats (VOBSUB, PGS, SUB, etc)",
+ "OnlyForcedSubtitlesHelp": "Only subtitles marked as forced will be loaded.",
+ "Normal": "Normal",
+ "None": "None",
+ "NoSubtitlesHelp": "Subtitles will not be loaded by default. They can still be turned on manually during playback.",
+ "NoSubtitles": "No subtitles",
+ "NoPluginConfigurationMessage": "This plugin has no settings to configure.",
+ "NoNextUpItemsMessage": "None found. Start watching your shows!",
+ "No": "No",
+ "NextUp": "Next Up",
+ "NewEpisodesOnly": "New episodes only",
+ "NewCollection": "New Collection",
+ "Never": "Never",
+ "MySubtitles": "My Subtitles",
+ "Mute": "Mute",
+ "MusicLibraryHelp": "Review the {0}music naming guide{1}.",
+ "Monday": "Monday",
+ "MinutesBefore": "minutes before",
+ "MetadataSettingChangeHelp": "Changing metadata settings will affect new content that is added going forward. To refresh existing content, open the detail screen and click the refresh button, or perform bulk refreshes using the metadata manager.",
+ "MetadataManager": "Metadata Manager",
+ "MessagePluginInstallDisclaimer": "Plugins built by Jellyfin community members are a great way to enhance your Jellyfin experience with additional features and benefits. Before installing, please be aware of the effects they may have on your Jellyfin Server, such as longer library scans, additional background processing, and decreased system stability.",
+ "MessagePluginConfigurationRequiresLocalAccess": "To configure this plugin please sign in to your local server directly.",
+ "MessagePleaseWait": "Please wait. This may take a minute.",
+ "MessagePleaseEnsureInternetMetadata": "Please ensure downloading of internet metadata is enabled.",
+ "MessagePlayAccessRestricted": "Playback of this content is currently restricted. Please contact your server administrator for more information.",
+ "MessagePasswordResetForUsers": "The following users have had their passwords reset. They can now sign in with the pin codes that were used to perform the reset.",
+ "MessageNothingHere": "Nothing here.",
+ "MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.",
+ "MessageNoServersAvailable": "No servers have been found using the automatic server discovery.",
+ "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.",
+ "MessageNoAvailablePlugins": "No available plugins.",
+ "MessageInvalidUser": "Invalid username or password. Please try again.",
+ "MessageInvalidForgotPasswordPin": "An invalid or expired pin code was entered. Please try again.",
+ "MessageInstallPluginFromApp": "This plugin must be installed from within the app you intend to use it in.",
+ "MessageImageTypeNotSelected": "Please select an image type from the drop-down menu.",
+ "MessageImageFileTypeAllowed": "Only JPEG and PNG files are supported.",
+ "MessageForgotPasswordInNetworkRequired": "Please try again within your home network to initiate the password reset process.",
+ "MessageForgotPasswordFileCreated": "The following file has been created on your server and contains instructions on how to proceed:",
+ "MessageDirectoryPickerInstruction": "Network paths can be entered manually in the event the Network button fails to locate your devices. For example, {0} or {1}.",
+ "MessageDeleteTaskTrigger": "Are you sure you wish to delete this task trigger?",
+ "MessageCreateAccountAt": "Create an account at {0}",
+ "MessageContactAdminToResetPassword": "Please contact your system administrator to reset your password.",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Jellyfin Server will be abruptly terminated.",
+ "MessageConfirmRestart": "Are you sure you wish to restart Jellyfin Server?",
+ "MessageConfirmRemoveMediaLocation": "Are you sure you wish to remove this location?",
+ "MessageConfirmDeleteTunerDevice": "Are you sure you wish to delete this device?",
+ "MessageConfirmDeleteGuideProvider": "Are you sure you wish to delete this guide provider?",
+ "MessageAlreadyInstalled": "This version is already installed.",
+ "Menu": "Menu",
+ "MediaIsBeingConverted": "The media is being converted into a format that is compatible with the device that is playing the media.",
+ "MediaInfoStreamTypeVideo": "Video",
+ "MediaInfoStreamTypeEmbeddedImage": "Embedded Image",
+ "MediaInfoStreamTypeAudio": "Audio",
+ "MediaInfoTimestamp": "Timestamp",
+ "MediaInfoSize": "Size",
+ "MediaInfoSampleRate": "Sample rate",
+ "MediaInfoResolution": "Resolution",
+ "MediaInfoRefFrames": "Ref frames",
+ "MediaInfoProfile": "Profile",
+ "MediaInfoPixelFormat": "Pixel format",
+ "MediaInfoPath": "Path",
+ "MediaInfoLevel": "Level",
+ "MediaInfoLayout": "Layout",
+ "MediaInfoAspectRatio": "Aspect ratio",
+ "MediaInfoAnamorphic": "Anamorphic",
+ "MaxParentalRatingHelp": "Content with a higher rating will be hidden from this user.",
+ "MarkUnplayed": "Mark unplayed",
+ "MarkPlayed": "Mark played",
+ "MapChannels": "Map Channels",
+ "ManageLibrary": "Manage library",
+ "Logo": "Logo",
+ "LiveBroadcasts": "Live broadcasts",
+ "Live": "Live",
+ "List": "List",
+ "LibraryAccessHelp": "Select the libraries to share with this user. Administrators will be able to edit all folders using the metadata manager.",
+ "LeaveBlankToNotSetAPassword": "You can leave this field blank to set no password.",
+ "LearnHowYouCanContribute": "Learn how you can contribute.",
+ "LaunchWebAppOnStartupHelp": "Open the web client in your default web browser when the server initially starts. This will not occur when using the restart server function.",
+ "LanNetworksHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be considered on local network when enforcing bandwidth restrictions. If set, all other IP addresses will be considered to be on the external network and will be subject to the external bandwidth restrictions. If left blank, only the server's subnet is considered to be on the local network.",
+ "LabelffmpegPathHelp": "The path to the ffmpeg application file, or folder containing ffmpeg.",
+ "LabelffmpegPath": "FFmpeg path:",
+ "LabelYear": "Year:",
+ "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.",
+ "LabelXDlnaDoc": "X-DLNA doc:",
+ "LabelXDlnaCapHelp": "Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.",
+ "LabelWeb": "Web: ",
+ "DashboardServerName": "Server: {0}",
+ "DashboardVersionNumber": "Version: {0}",
+ "LabelVersionInstalled": "{0} installed",
+ "LabelVaapiDeviceHelp": "This is the render node that is used for hardware acceleration.",
+ "LabelVaapiDevice": "VA API Device:",
+ "LabelUsername": "Username:",
+ "LabelUserRemoteClientBitrateLimitHelp": "Override the default global value set in server playback settings.",
+ "LabelUserLibraryHelp": "Select which user library to display to the device. Leave empty to inherit the default setting.",
+ "LabelUserLibrary": "User library:",
+ "LabelUserAgent": "User agent:",
+ "LabelUser": "User:",
+ "LabelUseNotificationServices": "Use the following services:",
+ "LabelTypeText": "Text",
+ "LabelTunerIpAddress": "Tuner IP Address:",
+ "LabelTriggerType": "Trigger Type:",
+ "LabelTranscodingVideoCodec": "Video codec:",
+ "LabelTranscodingThreadCountHelp": "Select the maximum number of threads to use when transcoding. Reducing the thread count will lower CPU usage but may not convert fast enough for a smooth playback experience.",
+ "LabelTranscodingThreadCount": "Transcoding thread count:",
+ "LabelTranscodingFramerate": "Transcoding framerate:",
+ "LabelTranscodes": "Transcodes:",
+ "LabelTranscodingTempPathHelp": "Specify a custom path for the transcode files served to clients. Leave blank to use the server default.",
+ "LabelTranscodePath": "Transcode path:",
+ "LabelTranscodingContainer": "Container:",
+ "LabelTranscodingAudioCodec": "Audio codec:",
+ "LabelTrackNumber": "Track number:",
+ "LabelTitle": "Title:",
+ "LabelTagline": "Tagline:",
+ "LabelTag": "Tag:",
+ "LabelTVHomeScreen": "TV mode home screen:",
+ "LabelSupportedMediaTypes": "Supported Media Types:",
+ "LabelSubtitles": "Subtitles:",
+ "LabelSubtitlePlaybackMode": "Subtitle mode:",
+ "LabelSubtitleFormatHelp": "Example: srt",
+ "LabelSubtitleDownloaders": "Subtitle downloaders:",
+ "LabelStopping": "Stopping",
+ "LabelStopWhenPossible": "Stop when possible:",
+ "LabelStatus": "Status:",
+ "LabelStartWhenPossible": "Start when possible:",
+ "LabelSpecialSeasonsDisplayName": "Special season display name:",
+ "LabelSource": "Source:",
+ "LabelSoundEffects": "Sound effects:",
+ "LabelSortBy": "Sort by:",
+ "LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.",
+ "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery and decrease the likelihood of video transcoding.",
+ "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.",
+ "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language",
+ "LabelSkipBackLength": "Skip back length:",
+ "LabelSkin": "Skin:",
+ "LabelSize": "Size:",
+ "LabelSimultaneousConnectionLimit": "Simultaneous stream limit:",
+ "LabelServerHost": "Host:",
+ "LabelSerialNumber": "Serial number",
+ "LabelSendNotificationToUsers": "Send the notification to:",
+ "LabelSelectFolderGroupsHelp": "Folders that are unchecked will be displayed by themselves in their own view.",
+ "LabelSelectFolderGroups": "Automatically group content from the following folders into views such as Movies, Music and TV:",
+ "LabelSecureConnectionsMode": "Secure connection mode:",
+ "LabelSeasonNumber": "Season number:",
+ "LabelScreensaver": "Screensaver:",
+ "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
+ "LabelSaveLocalMetadataHelp": "Saving artwork into media folders will put them in a place where they can be easily edited.",
+ "LabelRuntimeMinutes": "Run time (minutes):",
+ "LabelRemoteClientBitrateLimitHelp": "An optional per-stream bitrate limit for all out of network devices. This is useful to prevent devices from requesting a higher bitrate than your internet connection can handle. This may result in increased CPU load on your server in order to transcode videos on the fly to a lower bitrate.",
+ "LabelRemoteClientBitrateLimit": "Internet streaming bitrate limit (Mbps):",
+ "LabelReleaseDate": "Release date:",
+ "LabelRefreshMode": "Refresh mode:",
+ "LabelRecord": "Record:",
+ "LabelReasonForTranscoding": "Reason for transcoding:",
+ "LabelPublicHttpsPort": "Public HTTPS port number:",
+ "LabelPublicHttpPortHelp": "The public port number that should be mapped to the local HTTP port.",
+ "LabelPublicHttpPort": "Public HTTP port number:",
+ "LabelMetadataDownloadersHelp": "Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.",
+ "LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
+ "LabelDidlMode": "DIDL mode:",
+ "LabelDefaultUser": "Default user:",
+ "LabelDefaultScreen": "Default screen:",
+ "LabelDeathDate": "Death date:",
+ "LabelDay": "Day:",
+ "LabelDateTimeLocale": "Date time locale:",
+ "LabelCustomDeviceDisplayNameHelp": "Supply a custom display name or leave empty to use the name reported by the device.",
+ "HeaderYears": "Years",
+ "HeaderVideos": "Videos",
+ "HeaderVideoTypes": "Video Types",
+ "Series": "Series",
+ "NewEpisodes": "New episodes",
+ "NewCollectionNameExample": "Example: Star Wars Collection",
+ "MinutesAfter": "minutes after",
+ "Metadata": "Metadata",
+ "MessageFileReadError": "There was an error reading the file. Please try again.",
+ "MessageEnablingOptionLongerScans": "Enabling this option may result in significantly longer library scans.",
+ "MessageConfirmRecordingCancellation": "Cancel recording?",
+ "MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?",
+ "LaunchWebAppOnStartup": "Launch the web interface when starting the server",
+ "LabelYourFirstName": "Your first name:",
+ "OnlyForcedSubtitles": "Only forced subtitles",
+ "Off": "Off",
+ "NumLocationsValue": "{0} folders",
+ "Name": "Name",
+ "MovieLibraryHelp": "Review the {0}movie naming guide{1}.",
+ "MoveRight": "Move right",
+ "MoveLeft": "Move left",
+ "MoreMediaInfo": "Media Info",
+ "MoreUsersCanBeAddedLater": "More users can be added later from within the dashboard.",
+ "MoreFromValue": "More from {0}",
+ "MessageDownloadQueued": "Download queued.",
+ "MediaInfoStreamTypeData": "Data",
+ "MediaInfoLanguage": "Language",
+ "MediaInfoInterlaced": "Interlaced",
+ "MediaInfoFramerate": "Framerate",
+ "MediaInfoForced": "Forced",
+ "MediaInfoExternal": "External",
+ "MediaInfoDefault": "Default",
+ "MediaInfoContainer": "Container",
+ "MediaInfoCodecTag": "Codec tag",
+ "MediaInfoCodec": "Codec",
+ "ManageRecording": "Manage recording",
+ "LiveTV": "Live TV",
+ "Like": "Like",
+ "LatestFromLibrary": "Latest {0}",
+ "Large": "Large",
+ "LabelZipCode": "Postcode:",
+ "LabelYoureDone": "You're Done!",
+ "LabelVideoCodec": "Video codec:",
+ "LabelVideoBitrate": "Video bitrate:",
+ "DashboardArchitecture": "Architecture: {0}",
+ "DashboardOperatingSystem": "Operating System: {0}",
+ "LabelVersion": "Version:",
+ "LabelValue": "Value:",
+ "LabelUserLoginAttemptsBeforeLockout": "Failed login attempts before user is locked out:",
+ "LabelTranscodingProgress": "Transcoding progress:",
+ "LabelTimeLimitHours": "Time limit (hours):",
+ "LabelTime": "Time:",
+ "LabelTheme": "Theme:",
+ "LabelTextSize": "Text size:",
+ "LabelSportsCategories": "Sports categories:",
+ "LabelSortTitle": "Sort title:",
+ "LabelSortOrder": "Sort order:",
+ "LabelSonyAggregationFlags": "Sony aggregation flags:",
+ "LabelSkipForwardLength": "Skip forward length:",
+ "LabelSelectUsers": "Select users:",
+ "LabelPublicHttpsPortHelp": "The public port number that should be mapped to the local HTTPS port.",
+ "LabelProtocolInfoHelp": "The value that will be used when responding to GetProtocolInfo requests from the device.",
+ "LabelProtocolInfo": "Protocol info:",
+ "LabelProfileContainer": "Container:",
+ "LabelPostProcessorArguments": "Post-processor command line arguments:",
+ "LabelPlayMethod": "Play method:",
+ "LabelPlaylist": "Playlist:",
+ "LabelPlayDefaultAudioTrack": "Play default audio track regardless of language",
+ "LabelPlaceOfBirth": "Place of birth:",
+ "LabelOverview": "Overview:",
+ "LabelOriginalAspectRatio": "Original aspect ratio:",
+ "LabelMusicStreamingTranscodingBitrateHelp": "Specify a max bitrate when streaming music",
+ "LabelMetadataDownloadLanguage": "Preferred download language:",
+ "LabelMetadata": "Metadata:",
+ "LabelKeepUpTo": "Keep up to:",
+ "LabelFinish": "Finish",
+ "LabelFailed": "Failed",
+ "LabelExtractChaptersDuringLibraryScan": "Extract chapter images during the library scan",
+ "LabelEndDate": "End date:",
+ "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
+ "LabelEnableDlnaDebugLogging": "Enable DLNA debug logging",
+ "UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?",
+ "Uniform": "Uniform",
+ "TvLibraryHelp": "Review the {0}TV naming guide{1}.",
+ "Tuesday": "Tuesday",
+ "Transcoding": "Transcoding",
+ "ThemeVideos": "Theme videos",
+ "ThemeSongs": "Theme songs",
+ "TellUsAboutYourself": "Tell us about yourself",
+ "TagsValue": "Tags: {0}",
+ "Tags": "Tags",
+ "TabUsers": "Users",
+ "TabUpcoming": "Upcoming",
+ "TabTranscoding": "Transcoding",
+ "TabTrailers": "Trailers",
+ "TabSuggestions": "Suggestions",
+ "LabelDisplayMode": "Display mode:",
+ "LabelDisplayLanguageHelp": "Translating Jellyfin is an ongoing project.",
+ "LabelDisplayLanguage": "Display language:",
+ "LabelDiscNumber": "Disc number:",
+ "LabelDeviceDescription": "Device description",
+ "LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.",
+ "TabStreaming": "Streaming",
+ "TabSongs": "Songs",
+ "TabProfiles": "Profiles",
+ "TabProfile": "Profile",
+ "TabPlugins": "Plugins",
+ "TabPlaylists": "Playlists",
+ "TabNfoSettings": "NFO Settings",
+ "TabNetworking": "Networking",
+ "TabLiveTV": "Live TV",
+ "TabLatest": "Latest",
+ "TabInfo": "Info",
+ "TabGuide": "Guide",
+ "TabGenres": "Genres",
+ "TabEpisodes": "Episodes",
+ "TabDashboard": "Dashboard",
+ "TabContainers": "Containers",
+ "TabCollections": "Collections",
+ "TabCodecs": "Codecs",
+ "Sort": "Sort",
+ "Smaller": "Smaller",
+ "SmallCaps": "Small Caps",
+ "Small": "Small",
+ "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library",
+ "RecommendationBecauseYouLike": "Because you like {0}",
+ "RecentlyWatched": "Recently watched",
+ "OptionEveryday": "Every day",
+ "OptionEstimateContentLength": "Estimate content length when transcoding",
+ "OptionAllowMediaPlayback": "Allow media playback",
+ "Next": "Next",
+ "MessageAreYouSureYouWishToRemoveMediaFolder": "Are you sure you wish to remove this media folder?",
+ "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?",
+ "LabelTypeMetadataDownloaders": "{0} metadata downloaders:",
+ "LabelType": "Type:",
+ "LabelTunerType": "Tuner type:",
+ "LabelServerName": "Server name:",
+ "LabelServerHostHelp": "192.168.1.100:8096 or https://myserver.com",
+ "LabelSeriesRecordingPath": "Series recording path (optional):",
+ "LabelRecordingPathHelp": "Specify the default location to save recordings. If left empty, the server's program data folder will be used.",
+ "LabelRecordingPath": "Default recording path:",
+ "LabelReadHowYouCanContribute": "Learn how you can contribute.",
+ "LabelAlbumArtMaxWidth": "Album art max width:",
+ "LabelCustomCssHelp": "Apply your own custom styling to the web interface.",
+ "LabelBlastMessageIntervalHelp": "Determines the duration in seconds between blast alive messages.",
+ "LabelBlastMessageInterval": "Alive message interval (seconds)",
+ "LabelBitrate": "Bitrate:",
+ "LabelAudioSampleRate": "Audio sample rate:",
+ "LabelAlbumArtMaxHeight": "Album art max height:",
+ "LabelAccessStart": "Start time:",
+ "Label3DFormat": "3D format:",
+ "Thumb": "Thumb",
+ "ProductionLocations": "Production locations",
+ "OptionProtocolHttp": "HTTP",
+ "OptionEnableForAllTuners": "Enable for all tuner devices",
+ "MessageNoPluginsInstalled": "You have no plugins installed.",
+ "LabelXDlnaCap": "X-DLNA cap:",
+ "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains embedded subtitles",
+ "LabelManufacturer": "Manufacturer",
+ "LabelLoginDisclaimer": "Login disclaimer:",
+ "LabelLocalHttpServerPortNumber": "Local HTTP port number:",
+ "LabelKodiMetadataEnablePathSubstitution": "Enable path substitution",
+ "LabelKodiMetadataDateFormatHelp": "All dates within NFO files will be parsed using this format.",
+ "LabelKodiMetadataDateFormat": "Release date format:",
+ "LabelKidsCategories": "Children's categories:",
+ "LabelInNetworkSignInWithEasyPasswordHelp": "Use the easy pin code to sign in to clients within your local network. Your regular password will only be needed away from home. If the pin code is left blank, you won't need a password within your home network.",
+ "LabelInNetworkSignInWithEasyPassword": "Enable in-network sign in with my easy pin code",
+ "LabelHardwareAccelerationTypeHelp": "This is an experimental feature only available on supported systems.",
+ "LabelEnableHardwareDecodingFor": "Enable hardware decoding for:",
+ "LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play content.",
+ "LabelEnableDlnaDebugLoggingHelp": "Create large log files and should only be used as needed for troubleshooting purposes.",
+ "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches performed by Jellyfin.",
+ "LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models.",
+ "InstallingPackage": "Installing {0}",
+ "ImportMissingEpisodesHelp": "If enabled, information about missing episodes will be imported into your Jellyfin database and displayed within seasons and series. This may cause significantly longer library scans.",
+ "HeaderSubtitleAppearance": "Subtitle Appearance",
+ "LabelProtocol": "Protocol:",
+ "LabelProfileVideoCodecs": "Video codecs:",
+ "LabelProfileContainersHelp": "Separated by comma. This can be left empty to apply to all containers.",
+ "LabelProfileCodecsHelp": "Separated by comma. This can be left empty to apply to all codecs.",
+ "LabelProfileAudioCodecs": "Audio codecs:",
+ "LabelPreferredSubtitleLanguage": "Preferred subtitle language:",
+ "LabelPreferredDisplayLanguageHelp": "Translating Jellyfin is an ongoing project.",
+ "LabelPreferredDisplayLanguage": "Preferred display language:",
+ "LabelPostProcessor": "Post-processing application:",
+ "LabelPlayer": "Player:",
+ "LabelPersonRoleHelp": "Example: Ice cream truck driver",
+ "LabelPersonRole": "Role:",
+ "LabelPath": "Path:",
+ "LabelPassword": "Password:",
+ "LabelParentalRating": "Parental rating:",
+ "LabelParentNumber": "Parent number:",
+ "LabelOptionalNetworkPath": "(Optional) Shared network folder:",
+ "LabelNext": "Next",
+ "LabelNewsCategories": "News categories:",
+ "LabelNewPasswordConfirm": "New password confirm:",
+ "LabelNewPassword": "New password:",
+ "LabelNewName": "New name:",
+ "LabelName": "Name:",
+ "LabelMusicStreamingTranscodingBitrate": "Music transcoding bitrate:",
+ "LabelMoviePrefix": "Movie prefix:",
+ "LabelMovieCategories": "Movie categories:",
+ "LabelMonitorUsers": "Monitor activity from:",
+ "LabelModelUrl": "Model URL",
+ "LabelModelNumber": "Model number",
+ "LabelModelName": "Model name",
+ "LabelModelDescription": "Model description",
+ "LabelMinScreenshotDownloadWidth": "Minimum screenshot download width:",
+ "LabelMinResumePercentageHelp": "Titles are assumed unplayed if stopped before this time.",
+ "LabelMinResumePercentage": "Minimum resume percentage:",
+ "LabelMinResumeDurationHelp": "The shortest video length in seconds that will save playback location and let you resume.",
+ "LabelMinResumeDuration": "Minimum resume duration:",
+ "LabelMinBackdropDownloadWidth": "Minimum backdrop download width:",
+ "LabelMethod": "Method:",
+ "LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.",
+ "LabelMetadataSavers": "Metadata savers:",
+ "LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.",
+ "LabelMetadataReaders": "Metadata readers:",
+ "LabelMetadataPath": "Metadata path:",
+ "LabelMaxResumePercentageHelp": "Titles are assumed fully played if stopped after this time.",
+ "LabelMaxResumePercentage": "Maximum resume percentage:",
+ "LabelMaxChromecastBitrate": "Chromecast streaming quality:",
+ "LabelMaxBackdropsPerItem": "Maximum number of backdrops per item:",
+ "LabelMatchType": "Match type:",
+ "LabelManufacturerUrl": "Manufacturer URL",
+ "LabelLoginDisclaimerHelp": "A message that will be displayed at the bottom of the login page.",
+ "LabelLockItemToPreventChanges": "Lock this item to prevent future changes",
+ "LabelLocalHttpServerPortNumberHelp": "The TCP port number that Jellyfin's HTTP server should bind to.",
+ "LabelLineup": "Lineup:",
+ "LabelLanguage": "Language:",
+ "LabelLanNetworks": "LAN networks:",
+ "LabelKodiMetadataUser": "Save user watch data to NFO files for:",
+ "LabelKodiMetadataSaveImagePathsHelp": "This is recommended if you have image file names that don't conform to Kodi guidelines.",
+ "LabelKodiMetadataSaveImagePaths": "Save image paths within nfo files",
+ "LabelKodiMetadataEnablePathSubstitutionHelp": "Enables path substitution of image paths using the server's path substitution settings.",
+ "LabelKodiMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Kodi skin compatibility.",
+ "LabelImageType": "Image type:",
+ "LabelImageFetchersHelp": "Enable and rank your preferred image fetchers in order of priority.",
+ "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.",
+ "LabelIconMaxWidthHelp": "Maximum resolution of icons exposed via upnp:icon.",
+ "LabelIconMaxWidth": "Icon maximum width:",
+ "LabelIconMaxHeightHelp": "Maximum resolution of icons exposed via upnp:icon.",
+ "LabelIconMaxHeight": "Icon maximum height:",
+ "LabelHttpsPortHelp": "The TCP port number that Jellyfin's HTTPS server should bind to.",
+ "LabelHttpsPort": "Local HTTPS port number:",
+ "LabelHomeScreenSectionValue": "Home screen section {0}:",
+ "LabelHomeNetworkQuality": "Home network quality:",
+ "LabelHardwareAccelerationType": "Hardware acceleration:",
+ "LabelH264EncodingPreset": "H264 encoding preset:",
+ "LabelH264Crf": "H264 encoding CRF:",
+ "LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.",
+ "LabelGroupMoviesIntoCollections": "Group movies into collections",
+ "LabelServerNameHelp": "This name will be used to identify the server and will default to the server's computer name.",
+ "LabelFriendlyName": "Friendly name:",
+ "LabelFormat": "Format:",
+ "LabelForgotPasswordUsernameHelp": "Enter your username, if you remember it.",
+ "LabelFont": "Font:",
+ "LabelExtractChaptersDuringLibraryScanHelp": "Generate chapter images when videos are imported during the library scan. Otherwise, they will be extracted during the chapter images scheduled task, allowing the regular library scan to complete faster.",
+ "LabelBaseUrlHelp": "You can add a custom subdirectory here to access the server from a more unique URL.",
+ "LabelEveryXMinutes": "Every:",
+ "LabelEvent": "Event:",
+ "LabelEpisodeNumber": "Episode number:",
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "LabelEnableRealtimeMonitorHelp": "Changes to files will be processed immediately, on supported file systems.",
+ "LabelEnableRealtimeMonitor": "Enable real time monitoring",
+ "LabelEnableDlnaServer": "Enable DLNA server",
+ "LabelEnableDlnaPlayToHelp": "Detect devices within your network and offer the ability to remote control them.",
+ "LabelEnableDlnaPlayTo": "Enable DLNA Play To",
+ "LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)",
+ "LabelEnableBlastAliveMessagesHelp": "Enable this if the server is not detected reliably by other UPnP devices on your network.",
+ "LabelEnableBlastAliveMessages": "Blast alive messages",
+ "LabelEnableAutomaticPortMap": "Enable automatic port mapping",
+ "LabelEmbedAlbumArtDidlHelp": "Some devices prefer this method for obtaining album art. Others may fail to play with this option enabled.",
+ "LabelEmbedAlbumArtDidl": "Embed album art in Didl",
+ "LabelEasyPinCode": "Easy pin code:",
+ "LabelDynamicExternalId": "{0} Id:",
+ "LabelDropShadow": "Drop shadow:",
+ "LabelDropImageHere": "Drop image here, or click to browse.",
+ "LabelDownloadLanguages": "Download languages:",
+ "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. A value of one will preserve the original volume.",
+ "LabelDownMixAudioScale": "Audio boost when downmixing:",
+ "LabelDisplaySpecialsWithinSeasons": "Display specials within seasons they aired in",
+ "LabelDisplayOrder": "Display order:",
+ "LabelDisplayName": "Display name:",
+ "LabelDateAddedBehaviorHelp": "If a metadata value is present it will always be used before either of these options.",
+ "LabelCustomDeviceDisplayName": "Display name:",
+ "LabelCustomCss": "Custom CSS:",
+ "LabelCustomCertificatePathHelp": "Path to a PKCS #12 file containing a certificate and private key to enable TLS support on a custom domain.",
+ "LabelCurrentPassword": "Current password:",
+ "LabelCriticRating": "Critic rating:",
+ "LabelCountry": "Country:",
+ "LabelContentType": "Content type:",
+ "LabelCommunityRating": "Community rating:",
+ "LabelCertificatePassword": "Certificate password:",
+ "LabelCancelled": "Cancelled",
+ "LabelCachePathHelp": "Specify a custom location for server cache files such as images. Leave blank to use the server default.",
+ "LabelCachePath": "Cache path:",
+ "LabelCache": "Cache:",
+ "LabelBurnSubtitles": "Burn subtitles:",
+ "LabelBlockContentWithTags": "Block items with tags:",
+ "LabelBirthYear": "Birth year:",
+ "LabelBirthDate": "Birth date:",
+ "LabelBindToLocalNetworkAddress": "Bind to local network address:",
+ "LabelAutomaticallyRefreshInternetMetadataEvery": "Automatically refresh metadata from the internet:",
+ "LabelAuthProvider": "Authentication Provider:",
+ "LabelAudioLanguagePreference": "Preferred audio language:",
+ "LabelAudioCodec": "Audio codec:",
+ "LabelAudioChannels": "Audio channels:",
+ "LabelAudioBitrate": "Audio bitrate:",
+ "LabelAudioBitDepth": "Audio bit depth:",
+ "LabelAudio": "Audio:",
+ "LabelArtistsHelp": "Separate multiple using ;",
+ "LabelArtists": "Artists:",
+ "LabelAppName": "App name",
+ "LabelAllowedRemoteAddressesMode": "Remote IP address filter mode:",
+ "LabelAllowedRemoteAddresses": "Remote IP address filter:",
+ "LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods when no users are active.",
+ "LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates",
+ "LabelAllowHWTranscoding": "Allow hardware transcoding",
+ "LabelAll": "All",
+ "LabelAlbumArtists": "Album artists:",
+ "LabelAlbumArtPN": "Album art PN:",
+ "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.",
+ "LabelAlbumArtMaxHeightHelp": "Max resolution of album art exposed via upnp:albumArtURI.",
+ "LabelAlbumArtHelp": "PN used for album art, within the dlna:profileID attribute on upnp:albumArtURI. Some devices require a specific value, regardless of the size of the image.",
+ "LabelAirsBeforeSeason": "Airs before season:",
+ "LabelAirsBeforeEpisode": "Airs before episode:",
+ "LabelAirsAfterSeason": "Airs after season:",
+ "LabelAirTime": "Air time:",
+ "LabelAirDays": "Air days:",
+ "LabelAccessEnd": "End time:",
+ "LabelAccessDay": "Day of week:",
+ "LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
+ "Kids": "Kids",
+ "Items": "Items",
+ "ItemCount": "{0} items",
+ "InstantMix": "Instant mix",
+ "Images": "Images",
+ "Identify": "Identify",
+ "Horizontal": "Horizontal",
+ "Home": "Home",
+ "HideWatchedContentFromLatestMedia": "Hide watched content from latest media",
+ "Hide": "Hide",
+ "Help": "Help",
+ "HeadersFolders": "Folders",
+ "HeaderXmlSettings": "XML Settings",
+ "HeaderXmlDocumentAttributes": "XML Document Attributes",
+ "HeaderXmlDocumentAttribute": "XML Document Attribute",
+ "HeaderVideoType": "Video Type",
+ "HeaderVideoQuality": "Video Quality",
+ "HeaderUsers": "Users",
+ "HeaderUser": "User",
+ "HeaderUploadImage": "Upload Image",
+ "HeaderUpcomingOnTV": "Upcoming On TV",
+ "HeaderTypeText": "Enter Text",
+ "HeaderTypeImageFetchers": "{0} Image Fetchers",
+ "HeaderTuners": "Tuners",
+ "HeaderTunerDevices": "Tuner Devices",
+ "HeaderTranscodingProfileHelp": "Add transcoding profiles to indicate which formats should be used when transcoding is required.",
+ "HeaderTranscodingProfile": "Transcoding Profile",
+ "HeaderTracks": "Tracks",
+ "HeaderThisUserIsCurrentlyDisabled": "This user is currently disabled",
+ "HeaderTaskTriggers": "Task Triggers",
+ "HeaderTags": "Tags",
+ "HeaderSystemDlnaProfiles": "System Profiles",
+ "HeaderSubtitleProfilesHelp": "Subtitle profiles describe the subtitle formats supported by the device.",
+ "HeaderSubtitleProfiles": "Subtitle Profiles",
+ "HeaderSubtitleProfile": "Subtitle Profile",
+ "Overview": "Overview",
+ "LabelLogs": "Logs:",
+ "Whitelist": "Whitelist",
+ "ServerNameIsRestarting": "Jellyfin Server - {0} is restarting.",
+ "OptionProtocolHls": "HTTP Live Streaming",
+ "OptionProfileVideoAudio": "Video Audio",
+ "OptionPosterCard": "Poster card",
+ "OptionPoster": "Poster",
+ "OptionPlayed": "Played",
+ "OneChannel": "One channel",
+ "MediaInfoChannels": "Channels",
+ "MediaInfoBitDepth": "Bit depth",
+ "LabelAlbum": "Album:",
+ "LabelProfileCodecs": "Codecs:",
+ "LabelPasswordRecoveryPinCode": "Pin code:",
+ "LabelPasswordResetProvider": "Password Reset Provider:",
+ "LabelPasswordConfirm": "Password (confirm):",
+ "LabelOriginalTitle": "Original title:",
+ "LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Jellyfin apps on other devices to access media files directly.",
+ "LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.",
+ "LabelNumberOfGuideDays": "Number of days of guide data to download:",
+ "LabelNumber": "Number:",
+ "LabelNotificationEnabled": "Enable this notification",
+ "SeriesDisplayOrderHelp": "Order episodes by air date, DVD order, or absolute numbering.",
+ "PleaseEnterNameOrId": "Please enter a name or an external ID.",
+ "OptionTvdbRating": "TVDB Rating",
+ "OptionDvd": "DVD",
+ "MessageDirectoryPickerLinuxInstruction": "For Linux on Arch Linux, CentOS, Debian, Fedora, openSUSE, or Ubuntu, you must grant the service user at least read access to your storage locations.",
+ "LabelCustomCertificatePath": "Custom SSL certificate path:",
+ "LabelBindToLocalNetworkAddressHelp": "Optional. Override the local IP address to bind the http server to. If left empty, the server will bind to all availabile addresses. Changing this value requires restarting Jellyfin Server.",
+ "LabelAppNameExample": "Example: Sickbeard, Sonarr",
+ "HttpsRequiresCert": "To enable secure connections, you will need to supply a trusted SSL certificate, such as Let's Encrypt. Please either supply a certificate, or disable secure connections.",
+ "Yesterday": "Yesterday",
+ "Yes": "Yes",
+ "XmlTvPathHelp": "A path to an XML TV file. Jellyfin will read this file and periodically check it for updates. You are responsible for creating and updating the file.",
+ "WelcomeToProject": "Welcome to Jellyfin!",
+ "Wednesday": "Wednesday",
+ "Watched": "Watched",
+ "ViewPlaybackInfo": "View playback info",
+ "ViewAlbum": "View album",
+ "VideoRange": "Video range",
+ "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "These settings also apply to any Chromecast playback started by this device.",
+ "Studios": "Studios",
+ "StopRecording": "Stop recording",
+ "Sports": "Sports",
+ "OptionProfilePhoto": "Photo",
+ "OptionPlainStorageFolders": "Display all folders as plain storage folders",
+ "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.",
+ "OptionDateAdded": "Date Added",
+ "OptionDaily": "Daily",
+ "OptionContinuing": "Continuing",
+ "OptionCommunityRating": "Community Rating",
+ "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.",
+ "LinksValue": "Links: {0}",
+ "LabelSelectVersionToInstall": "Select version to install:",
+ "LabelMetadataPathHelp": "Specify a custom location for downloaded artwork and metadata.",
+ "OptionLikes": "Likes",
+ "OptionIsSD": "SD",
+ "OptionIsHD": "HD",
+ "OptionImdbRating": "IMDb Rating",
+ "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
+ "OptionHomeVideos": "Photos",
+ "OptionHlsSegmentedSubtitles": "HLS segmented subtitles",
+ "OptionHideUserFromLoginHelp": "Useful for private or hidden administrator accounts. The user will need to sign in manually by entering their username and password.",
+ "OptionHideUser": "Hide this user from login screens",
+ "OptionHasTrailer": "Trailer",
+ "OptionHasThemeVideo": "Theme Video",
+ "OptionHasThemeSong": "Theme Song",
+ "OptionHasSubtitles": "Subtitles",
+ "OptionHasSpecialFeatures": "Special Features",
+ "OptionFriday": "Friday",
+ "OptionExtractChapterImage": "Enable chapter image extraction",
+ "OptionExternallyDownloaded": "External download",
+ "OptionEquals": "Equals",
+ "OptionEnded": "Ended",
+ "OptionEnableM2tsModeHelp": "Enable m2ts mode when encoding to mpegts.",
+ "OptionEnableM2tsMode": "Enable M2ts mode",
+ "OptionEnableExternalContentInSuggestions": "Enable external content in suggestions",
+ "OptionEnableAutomaticServerUpdates": "Enable automatic server updates",
+ "OptionEnableAccessToAllLibraries": "Enable access to all libraries",
+ "OptionEnableAccessToAllChannels": "Enable access to all channels",
+ "OptionEnableAccessFromAllDevices": "Enable access from all devices",
+ "OptionEmbedSubtitles": "Embed within container",
+ "OptionDownloadThumbImage": "Thumb",
+ "OptionDownloadPrimaryImage": "Primary",
+ "OptionDownloadMenuImage": "Menu",
+ "OptionDownloadLogoImage": "Logo",
+ "OptionDownloadImagesInAdvanceHelp": "By default, most images are only downloaded when requested by a Jellyfin app. Enable this option to download all images in advance, as new media is imported. This may cause significantly longer library scans.",
+ "OptionDownloadImagesInAdvance": "Download images in advance",
+ "OptionDownloadDiscImage": "Disc",
+ "OptionDownloadBoxImage": "Box",
+ "OptionDownloadBannerImage": "Banner",
+ "OptionDownloadBackImage": "Back",
+ "OptionDownloadArtImage": "Art",
+ "OptionDisplayFolderView": "Display a folder view to show plain media folders",
+ "LabelMovieRecordingPath": "Movie recording path (optional):",
+ "LabelMoviePrefixHelp": "If a prefix is applied to movie titles, enter it here so the server can handle it properly.",
+ "LabelMessageTitle": "Message title:",
+ "LabelMessageText": "Message text:",
+ "LabelMaxStreamingBitrateHelp": "Specify a maximum bitrate when streaming.",
+ "LabelMaxStreamingBitrate": "Maximum streaming quality:",
+ "LabelMaxScreenshotsPerItem": "Maximum number of screenshots per item:",
+ "LabelMaxParentalRating": "Maximum allowed parental rating:",
+ "LabelFolder": "Folder:",
+ "LabelBaseUrl": "Base URL:",
+ "ViewArtist": "View artist",
+ "Up": "Up",
+ "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata",
+ "MediaInfoStreamTypeSubtitle": "Subtitle",
+ "MediaInfoSoftware": "Software",
+ "ValueOneSeries": "1 series",
+ "MediaInfoBitrate": "Bitrate",
+ "LabelVideo": "Video:",
+ "LabelPrevious": "Previous",
+ "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.",
+ "LabelKodiMetadataEnableExtraThumbs": "Copy extrafanart to extrathumbs field",
+ "LabelInternetQuality": "Internet quality:",
+ "LabelFileOrUrl": "File or URL:",
+ "LabelDateAdded": "Date added:",
+ "LabelDashboardTheme": "Server dashboard theme:",
+ "LabelCustomRating": "Custom rating:",
+ "LabelCollection": "Collection:",
+ "LabelChannels": "Channels:",
+ "LabelCertificatePasswordHelp": "If your certificate requires a password, please enter it here.",
+ "ValueOneMovie": "1 movie",
+ "ValueOneEpisode": "1 episode",
+ "ValueEpisodeCount": "{0} episodes",
+ "TabPassword": "Password",
+ "TabParentalControl": "Parental Control",
+ "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.",
+ "RefreshQueued": "Refresh queued.",
+ "Play": "Play",
+ "PasswordResetProviderHelp": "Choose a Password Reset Provider to be used when this user requests a password reset",
+ "OptionTuesday": "Tuesday",
+ "OptionReleaseDate": "Release Date",
+ "OptionDisplayFolderViewHelp": "Display folders alongside your other media libraries. This can be useful if you'd like to have a plain folder view.",
+ "OptionDislikes": "Dislikes",
+ "OptionDisableUser": "Disable this user",
+ "OptionDescending": "Descending",
+ "OptionDateAddedImportTime": "Use date scanned into the library",
+ "OptionDateAddedFileTime": "Use file creation date",
+ "OptionCustomUsers": "Custom",
+ "OptionCriticRating": "Critic Rating",
+ "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)",
+ "OptionBluray": "Blu-ray",
+ "OptionBlockMusic": "Music",
+ "OptionBlockLiveTvChannels": "Live TV Channels",
+ "OptionBlockBooks": "Books",
+ "OptionAutomatic": "Auto",
+ "OptionAuto": "Auto",
+ "OptionAscending": "Ascending",
+ "OptionAdminUsers": "Administrators",
+ "NoSubtitleSearchResultsFound": "No results found.",
+ "News": "News",
+ "MusicVideo": "Music Video",
+ "MusicArtist": "Music Artist",
+ "Mobile": "Mobile",
+ "MessageYouHaveVersionInstalled": "You currently have version {0} installed.",
+ "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please ensure it is running and try again.",
+ "MessageTheFollowingLocationWillBeRemovedFromLibrary": "The following media locations will be removed from your library:",
+ "MessageSettingsSaved": "Settings saved.",
+ "MessageReenableUser": "See below to reenable",
+ "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.",
+ "MessageItemsAdded": "Items added.",
+ "MessageItemSaved": "Item saved.",
+ "MessageDirectoryPickerBSDInstruction": "For BSD, you may need to configure storage within your FreeNAS Jail in order to allow Jellyfin to access it.",
+ "MessageConfirmShutdown": "Are you sure you wish to shutdown the server?",
+ "LabelSaveLocalMetadata": "Save artwork into media folders",
+ "LabelPleaseRestart": "Changes will take effect after manually reloading the web client.",
+ "ValueSongCount": "{0} songs",
+ "Save": "Save",
+ "People": "People",
+ "OptionNameSort": "Name",
+ "OptionMonday": "Monday",
+ "MusicAlbum": "Music Album",
+ "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and Albums. Click the + button to start creating collections.",
+ "ShowTitle": "Show title",
+ "HeaderStopRecording": "Stop Recording",
+ "HeaderStatus": "Status",
+ "HeaderStartNow": "Start Now",
+ "HeaderSpecialFeatures": "Special Features",
+ "HeaderSpecialEpisodeInfo": "Special Episode Info",
+ "HeaderSortOrder": "Sort Order",
+ "HeaderSortBy": "Sort By",
+ "HeaderShutdown": "Shutdown",
+ "HeaderSetupLibrary": "Setup your media libraries",
+ "HeaderSettings": "Settings",
+ "HeaderServerSettings": "Server Settings",
+ "HeaderSeriesStatus": "Series Status",
+ "HeaderSeriesOptions": "Series Options",
+ "HeaderSeries": "Series",
+ "HeaderSendMessage": "Send Message",
+ "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.",
+ "HeaderSubtitleDownloads": "Subtitle Downloads",
+ "HeaderSelectTranscodingPath": "Select Transcoding Temporary Path",
+ "HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable.",
+ "HeaderSelectServerCachePath": "Select Server Cache Path",
+ "HeaderSelectServer": "Select Server",
+ "HeaderSelectPath": "Select Path",
+ "HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to store metadata within. The folder must be writeable.",
+ "HeaderSelectMetadataPath": "Select Metadata Path",
+ "HeaderSelectCertificatePath": "Select Certificate Path",
+ "HeaderSecondsValue": "{0} Seconds",
+ "HeaderSeasons": "Seasons",
+ "HeaderSchedule": "Schedule",
+ "HeaderScenes": "Scenes",
+ "HeaderRunningTasks": "Running Tasks",
+ "HeaderRevisionHistory": "Revision History",
+ "HeaderRestartingServer": "Restarting Server",
+ "HeaderRestart": "Restart",
+ "HeaderResponseProfile": "Response Profile",
+ "HeaderRemoveMediaLocation": "Remove Media Location",
+ "HeaderRemoveMediaFolder": "Remove Media Folder",
+ "HeaderRemoteControl": "Remote Control",
+ "HeaderRecordingPostProcessing": "Recording Post Processing",
+ "HeaderRecordingOptions": "Recording Options",
+ "HeaderRecentlyPlayed": "Recently Played",
+ "HeaderProfileServerSettingsHelp": "These values control how Jellyfin Server will present itself to the device.",
+ "HeaderProfileInformation": "Profile Information",
+ "HeaderProfile": "Profile",
+ "HeaderPreferredMetadataLanguage": "Preferred Metadata Language",
+ "HeaderPluginInstallation": "Plugin Installation",
+ "HeaderPleaseSignIn": "Please sign in",
+ "HeaderPlaybackError": "Playback Error",
+ "HeaderPlayback": "Media Playback",
+ "HeaderPlayOn": "Play On",
+ "HeaderPlayAll": "Play All",
+ "HeaderPinCodeReset": "Reset Pin Code",
+ "HeaderPhotoAlbums": "Photo Albums",
+ "HeaderPeople": "People",
+ "HeaderHome": "Home",
+ "HeaderFavoritePeople": "Favourite People",
+ "FetchingData": "Fetching additional data",
+ "ButtonAddImage": "Add Image"
}
diff --git a/src/strings/en-us.json b/src/strings/en-us.json
index 4d83b070d1..b9c99b2471 100644
--- a/src/strings/en-us.json
+++ b/src/strings/en-us.json
@@ -354,6 +354,7 @@
"HeaderFavoriteShows": "Favorite Shows",
"HeaderFavoriteEpisodes": "Favorite Episodes",
"HeaderFavoriteAlbums": "Favorite Albums",
+ "HeaderFavoritePeople": "Favorite People",
"HeaderFavoriteArtists": "Favorite Artists",
"HeaderFavoriteSongs": "Favorite Songs",
"HeaderFavoriteVideos": "Favorite Videos",
@@ -505,7 +506,7 @@
"HideWatchedContentFromLatestMedia": "Hide watched content from latest media",
"Home": "Home",
"Horizontal": "Horizontal",
- "HttpsRequiresCert": "To enable secure connections, you will need to supply a trusted SSL certificate, such as Lets Encrypt. Please either supply a certificate, or disable secure connections.",
+ "HttpsRequiresCert": "To enable secure connections, you will need to supply a trusted SSL certificate, such as Let's Encrypt. Please either supply a certificate, or disable secure connections.",
"Identify": "Identify",
"Images": "Images",
"ImportFavoriteChannelsHelp": "If enabled, only channels that are marked as favorite on the tuner device will be imported.",
@@ -540,7 +541,7 @@
"LabelAllowedRemoteAddresses": "Remote IP address filter:",
"LabelAllowedRemoteAddressesMode": "Remote IP address filter mode:",
"LabelAppName": "App name",
- "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "LabelAppNameExample": "Example: Sickbeard, Sonarr",
"LabelArtists": "Artists:",
"LabelArtistsHelp": "Separate multiple using ;",
"LabelAudio": "Audio:",
@@ -574,7 +575,7 @@
"LabelCountry": "Country:",
"LabelCriticRating": "Critic rating:",
"LabelCurrentPassword": "Current password:",
- "LabelCustomCertificatePath": "Custom ssl certificate path:",
+ "LabelCustomCertificatePath": "Custom SSL certificate path:",
"LabelCustomCertificatePathHelp": "Path to a PKCS #12 file containing a certificate and private key to enable TLS support on a custom domain.",
"LabelCustomCss": "Custom CSS:",
"LabelCustomCssHelp": "Apply your own custom styling to the web interface.",
@@ -956,7 +957,7 @@
"MessageDeleteTaskTrigger": "Are you sure you wish to delete this task trigger?",
"MessageDirectoryPickerBSDInstruction": "For BSD, you may need to configure storage within your FreeNAS Jail in order to allow Jellyfin to access it.",
"MessageDirectoryPickerInstruction": "Network paths can be entered manually in the event the Network button fails to locate your devices. For example, {0} or {1}.",
- "MessageDirectoryPickerLinuxInstruction": "For Linux on Arch Linux, CentOS, Debian, Fedora, OpenSuse, or Ubuntu, you must grant the service user at least read access to your storage locations.",
+ "MessageDirectoryPickerLinuxInstruction": "For Linux on Arch Linux, CentOS, Debian, Fedora, openSUSE, or Ubuntu, you must grant the service user at least read access to your storage locations.",
"MessageDownloadQueued": "Download queued.",
"MessageEnablingOptionLongerScans": "Enabling this option may result in significantly longer library scans.",
"MessageFileReadError": "There was an error reading the file. Please try again.",
@@ -1096,7 +1097,7 @@
"OptionDownloadMenuImage": "Menu",
"OptionDownloadPrimaryImage": "Primary",
"OptionDownloadThumbImage": "Thumb",
- "OptionDvd": "Dvd",
+ "OptionDvd": "DVD",
"OptionEmbedSubtitles": "Embed within container",
"OptionEnableAccessFromAllDevices": "Enable access from all devices",
"OptionEnableAccessToAllChannels": "Enable access to all channels",
@@ -1177,7 +1178,7 @@
"OptionThumbCard": "Thumb card",
"OptionTrackName": "Track Name",
"OptionTuesday": "Tuesday",
- "OptionTvdbRating": "Tvdb Rating",
+ "OptionTvdbRating": "TVDB Rating",
"OptionUnairedEpisode": "Unaired Episodes",
"OptionUnplayed": "Unplayed",
"OptionWakeFromSleep": "Wake from sleep",
@@ -1215,7 +1216,7 @@
"Playlists": "Playlists",
"PleaseAddAtLeastOneFolder": "Please add at least one folder to this library by clicking the Add button.",
"PleaseConfirmPluginInstallation": "Please click OK to confirm you've read the above and wish to proceed with the plugin installation.",
- "PleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "PleaseEnterNameOrId": "Please enter a name or an external ID.",
"PleaseRestartServerName": "Please restart Jellyfin Server - {0}.",
"PleaseSelectTwoItems": "Please select at least two items.",
"PluginInstalledMessage": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.",
@@ -1282,7 +1283,7 @@
"SendMessage": "Send message",
"Series": "Series",
"SeriesCancelled": "Series cancelled.",
- "SeriesDisplayOrderHelp": "Order episodes by air date, dvd order, or absolute numbering.",
+ "SeriesDisplayOrderHelp": "Order episodes by air date, DVD order, or absolute numbering.",
"SeriesRecordingScheduled": "Series recording scheduled.",
"SeriesSettings": "Series settings",
"SeriesYearToPresent": "{0} - Present",
diff --git a/src/strings/fr.json b/src/strings/fr.json
index b89cda0015..05ef432660 100644
--- a/src/strings/fr.json
+++ b/src/strings/fr.json
@@ -51,7 +51,7 @@
"BoxRear": "Dos de boîtier",
"Browse": "Parcourir",
"BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.",
- "BurnSubtitlesHelp": "Détermine si le serveur doit graver les sous-titres lors de la conversion vidéo en fonction du format de sous-titre. Éviter la gravure des sous-titres améliorera les performances du serveur. Sélectionnez Auto pour graver les formats basés sur l'image (VOBSUB, PGS, SUB/IDX etc) ainsi que certains sous-titres ASS/SSA.",
+ "BurnSubtitlesHelp": "Détermine si le serveur doit incruster les sous-titres lors de la conversion vidéo en fonction du format de sous-titre. Éviter l'incrustation des sous-titres améliorera les performances du serveur. Sélectionnez Auto pour incruster les formats basés sur l'image (VOBSUB, PGS, SUB/IDX etc) ainsi que certains sous-titres ASS/SSA.",
"ButtonAdd": "Ajouter",
"ButtonAddMediaLibrary": "Ajouter une médiathèque",
"ButtonAddScheduledTaskTrigger": "Ajouter un déclencheur",
@@ -172,7 +172,7 @@
"DetectingDevices": "Détection des appareils",
"DeviceAccessHelp": "Ceci ne s'applique qu'aux appareils qui peuvent être identifiés de manière unique et n'empêchera pas l'accès par navigateur. Le filtrage de l'accès aux appareil par utilisateur empêchera l'utilisation de nouveaux appareils jusqu'à ce qu'ils soient approuvés ici.",
"DirectPlaying": "Lecture directe",
- "DirectStreamHelp1": "Le média est compatible avec l'appareil en ce qui concerne la résolution et le type de média (H.264, AC3 etc), mais se trouve dans un conteneur de fichiers incompatible (mkv, avi, wmv, etc). La vidéo sera rempaquetée à la volée avant d'être diffusée à l'appareil.",
+ "DirectStreamHelp1": "Le média est compatible avec l'appareil en ce qui concerne la résolution et le type de média (H.264, AC3,etc), mais se trouve dans un conteneur de fichiers incompatible (mkv, avi, wmv, etc). La vidéo sera rempaquetée à la volée avant d'être diffusée à l'appareil.",
"DirectStreamHelp2": "Le streaming en direct d'un fichier utilise très peu de puissance de traitement sans perte de qualité vidéo.",
"DirectStreaming": "Streaming direct",
"Director": "Réalisateur(trice)",
@@ -1449,6 +1449,7 @@
"LabelAudioChannels": "Canaux audio :",
"HeaderFavoriteBooks": "Livres Favoris",
"FetchingData": "Récupération de données additionnelles",
- "CopyStreamURLSuccess": "Lien copié avec succès.",
- "CopyStreamURL": "Copier le lien du flux"
+ "CopyStreamURLSuccess": "URL copié avec succès.",
+ "CopyStreamURL": "Copier l'URL du flux",
+ "LabelBaseUrlHelp": "Vous pouvez ajouter un sous-répertoire personnalisé pour accéder au serveur à partir d'une URL unique."
}
diff --git a/src/strings/hu.json b/src/strings/hu.json
index ea50446071..df6a4bca4c 100644
--- a/src/strings/hu.json
+++ b/src/strings/hu.json
@@ -1302,7 +1302,7 @@
"TabNetworking": "Hálózat",
"HeaderFavoriteArtists": "Kedvenc előadók",
"SmallCaps": "Kiskapitális",
- "AllowOnTheFlySubtitleExtractionHelp": "A beágyazott feliratokat ki lehet távolítani a videókból és elküldeni a Jellyfin alkalmazásoknak sima szöveg formátumba, hogy ne legyen átkódolás. Néhány eszközön ez hosszú ideig is eltarthat, valamint a videó lejátszás megakadhat az eltávolítási folyamat futása közben. Ezt kikapcsolva a beágyazott feliratok videó átkódolással beégetésre kerülnek azon kliens eszközökre melyek nem támogatják a külső feliratokat.",
+ "AllowOnTheFlySubtitleExtractionHelp": "A beágyazott feliratokat ki lehet nyerni a videókból és elküldeni az alkalmazásoknak sima szöveg formátumba, hogy ne legyen átkódolás. Néhány eszközön ez hosszú ideig is eltarthat, valamint a videó lejátszás megakadhat az eltávolítási folyamat futása közben. Ezt kikapcsolva a beágyazott feliratok videó átkódolással beégetésre kerülnek azon kliens eszközökre melyek nem támogatják a külső feliratokat.",
"Art": "ClearArt",
"AuthProviderHelp": "Válaszd ki az azonosítási szolgáltatást amely ezen felhasználó jelszavának ellenőrzését valósítja meg.",
"BurnSubtitlesHelp": "Meghatározza, hogy a szervernek be kell-e égetnie a feliratot videó átkódolás esetén a felirat típusának függvényében. A beégetés elkerülésével a szerver teljesítménye javul. Válaszd az Auto lehetőséget a kép alapú feliratok (pl. VOBSUB, PGS, SUB/IDX, stb) és bizonyos ASS/SSA feliratok beégetéséhez.",
@@ -1317,7 +1317,7 @@
"H264CrfHelp": "A Constant Rate Factor (CRF) az alapértelmezett minőségi beállítás az x264 enkóderhez. Az értékek 0 és 51 között állíthatók, ahol az alacsonyabb érték jobb minőséget eredményez (nagyobb fájl méret mellett). Az ajánlott érték 18 és 28 között van. Az x264 alapértelmezett beállítása 23, ez lehet kiindulási alap.",
"HeaderAddScheduledTaskTrigger": "Vezérlő Hozzáadása",
"HeaderApiKeysHelp": "A külső alkalmazásoknak egy API kulcsra van szükésge, hogy kommunikáljanak a Jellyfin szerverrel. A kulcsokat egy Jellyfin fiókkal történő belépéssel lehet megkapni, vagy kézileg felvenni egy alkalmazáshoz tartozó kulcsot.",
- "HeaderBranding": "Személyes védjegy",
+ "HeaderBranding": "Személyes arculat",
"HeaderContinueListening": "Folyamatban lévő zenék",
"HeaderDeleteTaskTrigger": "Feladatvezérlő törlése",
"HeaderFavoriteMovies": "Kedvenc Filmek",
diff --git a/src/strings/kk.json b/src/strings/kk.json
index 3b0f4467d9..45025bb1bd 100644
--- a/src/strings/kk.json
+++ b/src/strings/kk.json
@@ -500,7 +500,7 @@
"HideWatchedContentFromLatestMedia": "Eń keıingi tasyǵyshderekterden qaralǵan mazmundy jasyrý",
"Home": "Basqy",
"Horizontal": "Kóldeneń",
- "HttpsRequiresCert": "Qaýipsiz qosylymdar qosý úshin Lets Encrypt sıaqty senimdi SSL-kýáligin jetkizýińiz qajet. Kýálikti jetkizińiz nemese qaýipsiz qosylymdardy óshirińiz.",
+ "HttpsRequiresCert": "Qaýipsiz qosylymdar qosý úshin Letʼs Encrypt sıaqty senimdi SSL-kýáligin jetkizýińiz qajet. Kýálikti jetkizińiz nemese qaýipsiz qosylymdardy óshirińiz.",
"Identify": "Anyqtaý",
"Images": "Sýretter",
"ImportFavoriteChannelsHelp": "Qosylǵanda, túner qurylǵysyndaǵy tańdaýly retinde belgilengen ǵana arnalar shetten ákelinetin bolady.",
@@ -535,7 +535,7 @@
"LabelAllowedRemoteAddresses": "Qashyqtaǵy IP-mekenjaı súzgisi:",
"LabelAllowedRemoteAddressesMode": "Qashyqtaǵy IP-mekenjaı súzgisiniń rejimi:",
"LabelAppName": "Qoldanba aty",
- "LabelAppNameExample": "Mysaly: Sickbeard, NzbDrone",
+ "LabelAppNameExample": "Mysaly: Sickbeard, Sonarr",
"LabelArtists": "Oryndaýshylar:",
"LabelArtistsHelp": "Birneshýin mynaýmen bólińiz ;",
"LabelAudio": "Dybys:",
@@ -926,7 +926,7 @@
"MessageDeleteTaskTrigger": "Shynymen osy tapsyrma trıggerin joıý qajet pe?",
"MessageDirectoryPickerBSDInstruction": "BSD ortasynda, Jellyfin qol jetkizý maqsatynda, sizdiń FreeNAS Jail ishindegi jınaqtaýyshty teńsheý qajet bolýy múmkin.",
"MessageDirectoryPickerInstruction": "Jeli túımeshigi basylǵanda qurylǵylaryńyz orny tabylmasa, jelilik joldar qolmen engizilýi múmkin. Mysaly, {0} nemese {1}.",
- "MessageDirectoryPickerLinuxInstruction": "Arch Linux, CentOS, Debian, Fedora, OpenSuse nemese Ubuntu júıelerindegi Linux úshin, Jqyzmet kórsetý paıdalanýshyǵa kem degende saqtaý jerlerińizge oqýǵa qatynas úshin ruqsat etýge tıissiz.",
+ "MessageDirectoryPickerLinuxInstruction": "Arch Linux, CentOS, Debian, Fedora, openSUSE nemese Ubuntu júıelerindegi Linux úshin, Jqyzmet kórsetý paıdalanýshyǵa kem degende saqtaý jerlerińizge oqýǵa qatynas úshin ruqsat etýge tıissiz.",
"MessageDownloadQueued": "Júktep alý kezekte.",
"MessageEnablingOptionLongerScans": "Osy opsıa qoıylsa, tasyǵyshhana skanerleýleri edáýir uzyn bolýy múmkin.",
"MessageFileReadError": "Faıl oqý kezinde qate oryn aldy. Áreketti keıin qaıtalańyz.",
@@ -1131,7 +1131,7 @@
"OptionThursday": "beısenbi",
"OptionTrackName": "Jolshyq aty",
"OptionTuesday": "seısenbi",
- "OptionTvdbRating": "Tvdb baǵalaýy",
+ "OptionTvdbRating": "TVDB baǵalaýy",
"OptionUnairedEpisode": "Kórsetilmegen bólimder",
"OptionUnplayed": "Oınatylmaǵan",
"OptionWakeFromSleep": "Uıqydan oıatýda",
@@ -1485,5 +1485,6 @@
"CopyStreamURL": "Aǵyn URL mekenjaıyn kóshirý",
"FetchingData": "Qosymsha derekterdi shyǵaryp alý",
"ButtonAddImage": "Sýret ústeý",
- "MusicLibraryHelp": "{0}Mýzyka ataý nusqaýlyǵyn{1} qarap shyǵý."
+ "MusicLibraryHelp": "{0}Mýzyka ataý nusqaýlyǵyn{1} qarap shyǵý.",
+ "HeaderFavoritePeople": "Tańdaýly adamdar"
}
diff --git a/src/strings/ro.json b/src/strings/ro.json
index 221dfcbaec..f40c51d0e2 100644
--- a/src/strings/ro.json
+++ b/src/strings/ro.json
@@ -221,5 +221,28 @@
"UserProfilesIntro": "Jellyfin include sprijin pentru profile de utilizator, permițând fiecărui utilizator să își facă propriile setări de afișare, playstate și control parental.",
"Wednesday": "Miercuri",
"WelcomeToProject": "Bine ați venit la Jellyfin!",
- "WizardCompleted": "Asta e tot ce avem nevoie pentru moment. Jellyfin a început colectarea de informații despre biblioteca media. Verifică unele din aplicațiile noastre, și apoi faceți clic pe Finalizare pentru a vizualiza Tabloul de bord al Serverului ."
+ "WizardCompleted": "Asta e tot ce avem nevoie pentru moment. Jellyfin a început colectarea de informații despre biblioteca media. Verifică unele din aplicațiile noastre, și apoi faceți clic pe Finalizare pentru a vizualiza Tabloul de bord al Serverului .",
+ "AllowOnTheFlySubtitleExtraction": "Permite extragerea subtitrărilor în timp real",
+ "AllowMediaConversionHelp": "Permite sau interzice accesul la funcția de conversie media.",
+ "AllowMediaConversion": "Permite coversia media",
+ "AllowHWTranscodingHelp": "Permite tunerului să transcodeze automat. Poate ajuta la reducerea timpului necesar pentru transcodare pe server.",
+ "AllLibraries": "Toate librăriile",
+ "AllLanguages": "Toate limbile",
+ "AllEpisodes": "Toate episoadele",
+ "AllComplexFormats": "Toate formatele complexe (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc.)",
+ "AllChannels": "Toate canalele",
+ "Alerts": "Alerte",
+ "Albums": "Albume",
+ "Aired": "Premiera emisă",
+ "AirDate": "Data premierei",
+ "AdditionalNotificationServices": "Caută în catalogul de extensii pentru alte servicii de notificate.",
+ "AddToCollection": "Adaugă la colecție",
+ "Absolute": "Absolut",
+ "AddedOnValue": "Adăugat la {0}",
+ "AddToPlaylist": "Adaugă la playlist",
+ "AddToPlayQueue": "Adaugă la coada de redare",
+ "AddItemToCollectionHelp": "Adaugă obiectele la colecții căutând-le și folosind meniul de click-dreapta sau apasare pentru a le adăuga la colecție.",
+ "Add": "Adaugă",
+ "Actor": "Actor",
+ "AccessRestrictedTryAgainLater": "Accesul este restricționat. Te rugăm să încerci mai târziu."
}
diff --git a/src/strings/ru.json b/src/strings/ru.json
index 1846e95026..dac71be5ab 100644
--- a/src/strings/ru.json
+++ b/src/strings/ru.json
@@ -489,7 +489,7 @@
"HideWatchedContentFromLatestMedia": "Скрыть просмотренное содержание из Новейших медиаданных",
"Home": "Главное",
"Horizontal": "Горизонтально",
- "HttpsRequiresCert": "Чтобы включить HTTPS для внешних подключений, вам нужно будет предоставить доверенный SSL-cертификат, например, Lets Encrypt. Предоставьте сертификат или отключите защищенные соединения.",
+ "HttpsRequiresCert": "Чтобы включить HTTPS для внешних подключений, вам нужно будет предоставить доверенный SSL-cертификат, например, Let's Encrypt. Предоставьте сертификат или отключите защищенные соединения.",
"Identify": "Распознать",
"Images": "Рисунки",
"ImportFavoriteChannelsHelp": "При включении, будут импортированы только каналы, которые обозначены как избранное на тюнерном устройстве.",
@@ -524,7 +524,7 @@
"LabelAllowedRemoteAddresses": "Фильтр внешних IP-адресов:",
"LabelAllowedRemoteAddressesMode": "Режим фильтра внешних IP-адресов:",
"LabelAppName": "Название приложения",
- "LabelAppNameExample": "Пример: Sickbeard, NzbDrone",
+ "LabelAppNameExample": "Пример: Sickbeard, Sonarr",
"LabelArtists": "Исполнители:",
"LabelArtistsHelp": "Для разделения используйте точку с запятой ;",
"LabelAudio": "Аудио:",
@@ -903,7 +903,7 @@
"MessageDeleteTaskTrigger": "Вы действительно хотите удалить данный триггер задачи?",
"MessageDirectoryPickerBSDInstruction": "Касаемо BSD, возможно, потребуется конфигурировать хранилище в вашем FreeNAS Jail для того, чтобы разрешить Jellyfin получить к нему доступ.",
"MessageDirectoryPickerInstruction": "Сетевые пути возможно ввести вручную, в том случае, если при нажатии кнопки «Сеть» происходит сбой обнаружения устройств. Например: {0} или {1}.",
- "MessageDirectoryPickerLinuxInstruction": "Для Linux на Arch Linux, CentOS, Debian, Fedora, OpenSuse или Ubuntu, вы должны предоставить пользователю службы, по крайней мере, доступ для чтения к расположениям хранилища.",
+ "MessageDirectoryPickerLinuxInstruction": "Для Linux на Arch Linux, CentOS, Debian, Fedora, openSUSE или Ubuntu, вы должны предоставить пользователю службы, по крайней мере, доступ для чтения к расположениям хранилища.",
"MessageDownloadQueued": "Загрузка в очереди.",
"MessageEnablingOptionLongerScans": "Включение этой опции может привести к значительному увеличению времени сканирования медиатеки.",
"MessageFileReadError": "Произошла ошибка при считывании файла. Повторите попытку позже.",
@@ -1102,7 +1102,7 @@
"OptionThursday": "четверг",
"OptionTrackName": "Название трека",
"OptionTuesday": "вторник",
- "OptionTvdbRating": "Оценка TVDb",
+ "OptionTvdbRating": "Оценка TVDB",
"OptionUnairedEpisode": "Ожидаемые эпизоды",
"OptionUnplayed": "Невоспроизведённое",
"OptionWakeFromSleep": "Выход из спящего режима",
@@ -1450,5 +1450,6 @@
"CopyStreamURLSuccess": "URL скопирован успешно.",
"MusicLibraryHelp": "Просмотрите {0}руководство по именованию музыки{1}.",
"FetchingData": "Выборка дополнительных данных",
- "ButtonAddImage": "Добавить рисунок"
+ "ButtonAddImage": "Добавить рисунок",
+ "HeaderFavoritePeople": "Избранные люди"
}
diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json
index 25f611793a..2840cfb60d 100644
--- a/src/strings/sl-si.json
+++ b/src/strings/sl-si.json
@@ -311,7 +311,7 @@
"HeaderSelectServerCachePath": "Izberite pot predpomnjenih podatkov",
"HeaderSelectServer": "Izberi strežnik",
"HeaderSelectPath": "Izberi pot",
- "HeaderSelectMetadataPathHelp": "Poiščite ali vnesite pot, v kateri bi želeli shranjevati metapodatke. Datoteka mora omogočati pisanje.",
+ "HeaderSelectMetadataPathHelp": "Poiščite ali vnesite pot, v kateri želite shranjevati metapodatke. Datoteka mora omogočati pisanje.",
"HeaderSelectMetadataPath": "Izberi pot metapodatkov",
"HeaderSelectCertificatePath": "Izberi pot certifikata",
"HeaderSecondsValue": "{0} sekund",
@@ -352,7 +352,7 @@
"HeaderMyMediaSmall": "Moja predstavnost (majhno)",
"HeaderMyMedia": "Moja predstavnost",
"HeaderMyDevice": "Moja naprava",
- "HeaderMusicVideos": "Glasbeni videi",
+ "HeaderMusicVideos": "Glasbeni video posnetki",
"HeaderMusicQuality": "Kvaliteta glasbe",
"HeaderMovies": "Filmi",
"HeaderMoreLikeThis": "Več tega",
@@ -607,7 +607,7 @@
"LabelAutomaticallyRefreshInternetMetadataEvery": "Samodejno posodobi metapodatke z interneta:",
"Label3DFormat": "Format 3D:",
"LabelAccessDay": "Dan v tednu:",
- "LabelAccessEnd": "Čas konca:",
+ "LabelAccessEnd": "Ura konca:",
"LabelAccessStart": "Čas začetka:",
"LabelAirDays": "Dnevi predvajanja:",
"LabelAirTime": "Čas predvajanja:",
@@ -653,5 +653,25 @@
"LabelDeathDate": "Datum smrti:",
"LabelBitrate": "Bitna hitrost:",
"LabelBlastMessageInterval": "Interval sporočila o dostopnosti (sekunde)",
- "LabelDefaultUserHelp": "Določi knjižnica katerega uporabnika bo prikazana na povezanih napravah. To lahko preglasite s profili za posamezno napravo."
+ "LabelDefaultUserHelp": "Določi knjižnica katerega uporabnika bo prikazana na povezanih napravah. To lahko preglasite s profili za posamezno napravo.",
+ "LabelEnableDlnaClientDiscoveryIntervalHelp": "Določi trajanje v sekundah med SSDP iskanji, ki jih izvede Jellyfin.",
+ "LabelEnableDlnaClientDiscoveryInterval": "Interval odkrivanja sprejemnikov (sekunde)",
+ "LabelEnableBlastAliveMessagesHelp": "Omogočite, če imajo UPnP naprave težave z zaznavanjem strežnika v omrežju.",
+ "LabelEnableBlastAliveMessages": "Oddajaj sporočila o dostopnosti",
+ "LabelEnableAutomaticPortMapHelp": "Poskuša avtomatično povezati javna vrata z lokalnimi preko UPnP. To ne deluje z nekaterimi usmerjevalniki.",
+ "LabelEnableAutomaticPortMap": "Omogoči avtomatično mapiranje vrat",
+ "LabelEmbedAlbumArtDidl": "Vdelaj grafike albuma v Didl",
+ "LabelEasyPinCode": "Enostavna PIN koda:",
+ "LabelDropImageHere": "Povleci in spusti sliko sem, klikni za brskanje.",
+ "LabelDownloadLanguages": "Jeziki za prenos:",
+ "LabelDownMixAudioScaleHelp": "Ojačaj jakost zvoka pri pretvarjanju v manj kanalov. Vrednost 1 ohrani izvirno glasnost.",
+ "LabelDownMixAudioScale": "Ojačanje zvoka pri pretvarjanju v manj kanalov:",
+ "LabelDisplaySpecialsWithinSeasons": "Prikaži posebne epizode znotraj sezon v katerih so bile predvajane",
+ "LabelDisplayOrder": "Vrstni red prikaza:",
+ "LabelDisplayName": "Prikazano ime:",
+ "LabelDisplayMode": "Način prikaza:",
+ "LabelBindToLocalNetworkAddressHelp": "Neobvezno. Preglasi lokalni IP naslov za povezavo s HTTP strežnikom. V kolikor pustite prazno se strežnik poveže z vsemi možnimi naslovi. Sprememba vrednosti zahteva ponovni zagon Jellyfin strežnika.",
+ "InstallingPackage": "Nameščanje {0}",
+ "ImportMissingEpisodesHelp": "Če je omogočeno, bodo podatki o manjkajočih epizodah dodani v Jellyfin bazo podatkov in prikazani znotraj sezon in serij. To lahko občutno podaljša uvoz v knjižnjico.",
+ "ImportFavoriteChannelsHelp": "Če je omogočeno, bodo uvoženi zgolj kanali, ki so na sprejemniku označeni kot priljubljeni."
}
diff --git a/src/strings/sv.json b/src/strings/sv.json
index fbdb0c3272..062e8d34af 100644
--- a/src/strings/sv.json
+++ b/src/strings/sv.json
@@ -19,7 +19,7 @@
"AllLibraries": "Alla bibliotek",
"AllowHWTranscodingHelp": "Aktivera för att låta TV-mottagaren omkoda strömmar. Det kan minska behovet av omkodning på Jellyfin Server.",
"AllowOnTheFlySubtitleExtraction": "Tillåt undertextsextrahering under uppspelning",
- "AllowOnTheFlySubtitleExtractionHelp": "Inbäddade undertexter kan extraheras ur videor och skickas till Jellyfin-appar i textformat för att förhindra omkodning. I vissa system kan detta ta en lång tid och stoppa videouppspelningen under extraheringsprocessen. Avaktivera detta för att bränna in inbäddade undertexter genom omkodning när de inte stöds av klienten.",
+ "AllowOnTheFlySubtitleExtractionHelp": "Inbäddade undertexter kan extraheras ur videor och skickas till klienter i textformat för att förhindra omkodning. I vissa system kan detta ta en lång tid och stoppa videouppspelningen under extraheringsprocessen. Avaktivera detta för att bränna in inbäddade undertexter genom omkodning när de inte stöds av klienten.",
"AllowRemoteAccess": "Tillåt fjärranslutningar till denna Jellyfin-server.",
"AllowRemoteAccessHelp": "Om avaktiverat så blockeras alla fjärranslutningar.",
"AlwaysPlaySubtitles": "Visa alltid undertexter",
@@ -1295,7 +1295,7 @@
"ButtonGuide": "Guide",
"Blacklist": "Svartlista",
"Auto": "Automatisk",
- "AuthProviderHelp": "Välj en autentiserings leverantör som ska användas för att autentisera denna användarens lösenord",
+ "AuthProviderHelp": "Välj en autentiseringsleverantör som ska användas för att autentisera denna användares lösenord",
"Ascending": "Stigande",
"AllowedRemoteAddressesHelp": "Kommaavgränsad lista av IP-adresser eller IP/nätmask poster för nätverk som kommer bli tillåtna att ansluta avlägset. Om fältet lämnas tomt så kommer alla avlägsna adresser tillåtas.",
"AllowMediaConversionHelp": "Tillåt eller neka tillgång till media konvertings funktionen.",
diff --git a/src/strings/tr.json b/src/strings/tr.json
index f517eb10e9..eae0b419c9 100644
--- a/src/strings/tr.json
+++ b/src/strings/tr.json
@@ -53,7 +53,7 @@
"FolderTypeBooks": "Kitaplar",
"FolderTypeMovies": "Filmler",
"FolderTypeMusic": "Müzik",
- "FolderTypeMusicVideos": "Müzik videoları",
+ "FolderTypeMusicVideos": "Müzik Videoları",
"FolderTypeTvShows": "TV",
"Friday": "Cuma",
"HeaderActiveRecordings": "Aktif Kayıtlar",
@@ -82,7 +82,7 @@
"HeaderRecentlyPlayed": "Son oynatılan",
"HeaderRemoteControl": "Uzaktan Kontrol",
"HeaderResponseProfile": "Profil Görüntüleme",
- "HeaderScenes": "Diziler",
+ "HeaderScenes": "Sahneler",
"HeaderSendMessage": "Mesaj Gönder",
"HeaderSeries": "Series",
"HeaderServerSettings": "Sunucu ayarları",
@@ -102,10 +102,10 @@
"LabelCurrentPassword": "Kullanımdaki şifre:",
"LabelDay": "Gün:",
"LabelDisplayMissingEpisodesWithinSeasons": "Sezondaki kayıp bölümleri göster",
- "LabelEnableDlnaServer": "DLNA Sunucusu etkin",
+ "LabelEnableDlnaServer": "DLNA Sunucusunu Etkinleştir",
"LabelFinish": "Bitir",
- "LabelIconMaxHeight": "İkon Max Genişlik:",
- "LabelIconMaxWidth": "ikon Max Yükseklik:",
+ "LabelIconMaxHeight": "İkon Maksimum Yükseklik:",
+ "LabelIconMaxWidth": "ikon Maksimum Genişlik:",
"LabelLanguage": "Dil:",
"LabelManufacturer": "Üretici",
"LabelMaxParentalRating": "Maksimum izin verilen ebeveyn değerlendirmesi:",
@@ -132,7 +132,7 @@
"LabelYear": "Yıl:",
"LabelYourFirstName": "İlk Ad:",
"LabelYoureDone": "Bitti!",
- "LibraryAccessHelp": "Bu kullanıcı ile paylaşmak için medya klasörleri seçin. Yöneticiler meta yöneticisini kullanarak tüm klasörleri düzenlemesi mümkün olacaktır.",
+ "LibraryAccessHelp": "Bu kullanıcı ile paylaşmak için kütüphaneleri seçin. Yöneticiler meta yöneticisini kullanarak tüm klasörleri düzenlemesi mümkün olacaktır.",
"Live": "Canlı",
"MaxParentalRatingHelp": "Daha yüksek bir derece ile İçerik Bu kullanıcıdan gizli olacak.",
"MessageNothingHere": "Burada birşey yok.",
@@ -368,7 +368,7 @@
"EnableBackdrops": "Arka planında",
"BurnSubtitlesHelp": "Altyazı formatına bağlı olarak video dönüştürülürken sunucunun altyazılarda yazıp yazmayacağını belirler. Altyazılarda yanmaktan kaçınmak, sunucu performansını iyileştirir. Görüntü tabanlı biçimleri (VOBSUB, PGS, SUB / IDX, vb.) Ve bazı ASS / SSA altyazılarını yazmak için Otomatik'i seçin.",
"ConfirmDeleteItem": "Bu öğeyi silmek, onu hem dosya sisteminden hem de medya kütüphanenizden siler. Devam etmek istediğinize emin misiniz?",
- "ValueSpecialEpisodeName": "Özel -{0}",
+ "ValueSpecialEpisodeName": "Özel - {0}",
"DeviceAccessHelp": "Bu, yalnızca benzersiz şekilde tanımlanabilen ve tarayıcı erişimini engellemeyen cihazlar için geçerlidir. Kullanıcı cihazlarına erişimin filtrelenmesi, burada onaylanana kadar yeni cihazları kullanmalarını önler.",
"DirectStreamHelp1": "Medya, çözünürlük ve medya türüyle (H.264, AC3, vb.) İlgili cihazla uyumludur, ancak uyumsuz bir dosya konteynerinde (mkv, avi, wmv, vb.) Bulunur. Video, cihaza aktarılmadan önce anında yeniden paketlenecek.",
"DisplayMissingEpisodesWithinSeasonsHelp": "Bu, sunucu yapılandırmasındaki TV kütüphaneleri için de etkinleştirilmelidir.",
@@ -555,5 +555,143 @@
"EnableThemeSongsHelp": "Kitaplığa göz atarken tema şarkıları arka planda çalın.",
"EnableThemeSongs": "Tema şarkıları",
"EnableStreamLoopingHelp": "Canlı akışlar yalnızca birkaç saniye veri içeriyorsa ve sürekli istenmesi gerekiyorsa bunu etkinleştirin. Gerekmediğinde bunu etkinleştirmek sorunlara neden olabilir.",
- "EnableStreamLooping": "Otomatik döngü canlı akışları"
+ "EnableStreamLooping": "Otomatik döngü canlı akışları",
+ "Hide": "Gizle",
+ "HeaderVideos": "Videolar",
+ "HeaderVideoTypes": "Video Tipleri",
+ "HeaderVideoType": "Video Tipi",
+ "HeaderVideoQuality": "Video Kalitesi",
+ "HeaderSelectServerCachePath": "Sunucu Önbellek Yolunu Seç",
+ "HeaderSelectServer": "Sunucu Seç",
+ "HeaderSelectPath": "Yolu Seç",
+ "HeaderSelectMetadataPath": "Meta Verisi Yolunu Seç",
+ "HeaderSelectCertificatePath": "Sertifika Yolunu Seç",
+ "HeaderSecondsValue": "{0} Saniye",
+ "HeaderSeasons": "Sezonlar",
+ "HeaderSchedule": "Zamanla",
+ "HeaderRunningTasks": "Çalışan Görevler",
+ "HeaderRevisionHistory": "Revizyon Geçmişi",
+ "HeaderRestartingServer": "Sunucu Yeniden Başlıyor",
+ "HeaderRestart": "Yeniden Başlat",
+ "HeaderRemoveMediaLocation": "Medya Konumunu Kaldır",
+ "HeaderRemoveMediaFolder": "Medya Klasörünü Kaldır",
+ "HeaderRecordingPostProcessing": "Kayıt Sonrası İşlemesi",
+ "HeaderRecordingOptions": "Kayıt Ayarları",
+ "HeaderProfileInformation": "Profil Bilgileri",
+ "HeaderProfile": "Profil",
+ "HeaderPluginInstallation": "Eklenti Kurulumu",
+ "HeaderPlaybackError": "Oynatma Hatası",
+ "HeaderPlayback": "Medya Oynatma",
+ "HeaderPinCodeReset": "Pin Kodunu Sıfırla",
+ "HeaderPhotoAlbums": "Fotoğraf Albümleri",
+ "HeaderPeople": "Kişiler",
+ "HeaderPendingInvitations": "Bekleyen Davetiyeler",
+ "HeaderPasswordReset": "Şifre Sıfırlama",
+ "HeaderPassword": "Şifre",
+ "HeaderParentalRatings": "Ebeveyn Derecelendirmeleri",
+ "HeaderOtherItems": "Diğer Öğeler",
+ "HeaderOnNow": "Şimdi",
+ "HeaderNextVideoPlayingInValue": "Sonraki Video Başlıyor {0}",
+ "HeaderNextEpisodePlayingInValue": "Sonraki Bölüm {0}",
+ "HeaderNewDevices": "Yeni Cihazlar",
+ "HeaderNewApiKey": "Yeni API Anahtarı",
+ "HeaderMyMediaSmall": "Benim Medyam (küçük)",
+ "HeaderMyMedia": "Benim Medyam",
+ "HeaderMyDevice": "Benim Cihazım",
+ "HeaderMusicQuality": "Müzik Kalitesi",
+ "HeaderMovies": "Filmler",
+ "HeaderMoreLikeThis": "Buna Benzer Daha Fazla",
+ "HeaderMetadataSettings": "Meta Verisi Ayarları",
+ "HeaderMediaInfo": "Medya Bilgisi",
+ "HeaderMedia": "Medya",
+ "HeaderLoginFailure": "Giriş Başarısız",
+ "HeaderLiveTvTunerSetup": "Canlı TV istasyon Kurulumu",
+ "HeaderLiveTv": "Canlı TV",
+ "HeaderLibrarySettings": "Kütüphane Ayarları",
+ "HeaderLibraryOrder": "Kütüphane Sırası",
+ "HeaderLibraryAccess": "Kütüphane Erişimi",
+ "HeaderLibraries": "Kütüphaneler",
+ "HeaderLatestMusic": "Son Müzik",
+ "HeaderKeepSeries": "Seriyi Sakla",
+ "HeaderKeepRecording": "Kaydı Sakla",
+ "HeaderItems": "Öğeler",
+ "HeaderInstall": "Yükle",
+ "HeaderImageOptions": "Resim Seçenekleri",
+ "HeaderIdentifyItemHelp": "Bir veya daha fazla arama kriteri giriniz. Faha fazla arama sonucu için kriter kaldırın.",
+ "HeaderIdentificationHeader": "Kimlik Başlığı",
+ "HeaderIdentificationCriteriaHelp": "En az bir kimlik kriteri girmelisiniz.",
+ "HeaderIdentification": "Kimlik",
+ "HeaderHttpHeaders": "HTTP Başlıkları",
+ "HeaderHome": "Ana Sayfa",
+ "HeaderFavoritePeople": "Favori Kişiler",
+ "LabelEnableAutomaticPortMap": "Otomatik port eşleştirmeyi etkinleştir",
+ "LabelEasyPinCode": "Basit pin kodu:",
+ "LabelDropImageHere": "Görüntüyü buraya bırakın veya göz atmak için tıklayın.",
+ "LabelDownloadLanguages": "Dilleri indir:",
+ "LabelDisplayOrder": "Görüntüleme sırası:",
+ "LabelDisplayName": "Ekran adı:",
+ "LabelDisplayMode": "Ekran modu:",
+ "LabelDisplayLanguageHelp": "Jellyfin çevirisi devam eden bir projedir.",
+ "LabelDisplayLanguage": "Ekran dili:",
+ "LabelDiscNumber": "Disk no:",
+ "LabelDeviceDescription": "Sürücü açıklaması",
+ "LabelDefaultUser": "Varsayılan kullanıcı:",
+ "LabelDefaultScreen": "Varsayılan ekran:",
+ "LabelDeathDate": "Ölüm tarihi:",
+ "LabelDateTimeLocale": "Tarih saat yerelleştirme:",
+ "LabelDateAdded": "Eklenme tarihi:",
+ "LabelCustomCss": "Özel CSS:",
+ "LabelCommunityRating": "Topluluk değerlendirmesi:",
+ "LabelCertificatePassword": "Sertifika şifresi:",
+ "LabelCache": "Önbellek:",
+ "LabelBitrate": "Bit Hızı:",
+ "LabelBirthYear": "Doğum yılı:",
+ "LabelBirthDate": "Doğum tarihi:",
+ "LabelAuthProvider": "Kimlik Doğrulama Sağlayıcısı:",
+ "LabelAudioSampleRate": "Ses örnekleme hızı:",
+ "LabelAudioCodec": "Ses kodeği:",
+ "LabelAudioChannels": "Ses kanalları:",
+ "LabelAudio": "Ses:",
+ "LabelAppName": "Uygulama adı",
+ "LabelAllowHWTranscoding": "Donanım kod dönüştürmesine izin ver",
+ "LabelAll": "Tümü",
+ "LabelAlbumArtMaxWidth": "Albüm resmi maks. genişlik:",
+ "LabelAlbumArtMaxHeight": "Albüm resmi maks. yükseklik:",
+ "LabelAlbum": "Albüm:",
+ "LabelAccessStart": "Başlangıç zamanı:",
+ "LabelAccessEnd": "Bitiş zamanı:",
+ "LabelAccessDay": "Haftanın Günü:",
+ "LabelAbortedByServerShutdown": "(Sunucu kapanması nedeniyle iptal edildi)",
+ "Label3DFormat": "3D Formatı:",
+ "Kids": "Çocuklar",
+ "ItemCount": "{0} nesne",
+ "InstallingPackage": "Yükleniyor {0}",
+ "Images": "Resimler",
+ "Identify": "Tanımla",
+ "Horizontal": "Yatay",
+ "Help": "Yardım",
+ "HeadersFolders": "Klasörler",
+ "HeaderYears": "Yıl",
+ "HeaderXmlSettings": "Xml Ayarları",
+ "HeaderXmlDocumentAttributes": "Xml Döküman Öznitelikleri",
+ "HeaderXmlDocumentAttribute": "Xml Dökümanı Öznitelik",
+ "HeaderUser": "Kullanıcı",
+ "HeaderUploadImage": "Resim Yükle",
+ "HeaderUpcomingOnTV": "TV'de Yaklaşan",
+ "HeaderTypeText": "Metin Gir",
+ "HeaderTunerDevices": "Tuner Cihazları",
+ "HeaderThisUserIsCurrentlyDisabled": "Bu kullanıcı şu anda pasif",
+ "HeaderTags": "Etiketler",
+ "HeaderSubtitleProfiles": "Altyazı Profilleri",
+ "HeaderSubtitleProfile": "Altyazı Profili",
+ "HeaderSubtitleDownloads": "Altyazı İndirmeleri",
+ "HeaderStopRecording": "Kaydı Durdur",
+ "HeaderStartNow": "Şimdi Başlat",
+ "HeaderSpecialFeatures": "Ekstra Özellikler",
+ "HeaderSpecialEpisodeInfo": "Özel Bölüm Bilgisi",
+ "HeaderSortOrder": "Sıralama Düzeni",
+ "HeaderSortBy": "Sırala",
+ "HeaderShutdown": "Kapat",
+ "HeaderSettings": "Ayarlar",
+ "LabelLogs": "Günlük:"
}
diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json
index 749a5b0a8a..eb3e6a8181 100644
--- a/src/strings/zh-cn.json
+++ b/src/strings/zh-cn.json
@@ -498,7 +498,7 @@
"LabelBurnSubtitles": "烧录字幕:",
"LabelCache": "缓存:",
"LabelCachePath": "缓存路径:",
- "LabelCachePathHelp": "指定服务器缓存文件的自定义路径,比如图片。留空将使用服务器默认。",
+ "LabelCachePathHelp": "指定服务器缓存文件(如图片)的自定义路径。留空将使用服务器默认。",
"LabelCancelled": "已取消",
"LabelCertificatePassword": "证书密码:",
"LabelCertificatePasswordHelp": "如果你的证书需要密码,请在此输入它。",
@@ -585,7 +585,7 @@
"LabelHomeNetworkQuality": "家庭网络质量:",
"LabelHomeScreenSectionValue": "主屏幕模块{0}:",
"LabelHttpsPort": "本地 HTTPS 端口号:",
- "LabelHttpsPortHelp": "Jellyfin HTTPS 服务器监听的 TCP 端口。",
+ "LabelHttpsPortHelp": "Jellyfin HTTPS 服务器监听端口。",
"LabelIconMaxHeight": "图标最大高度:",
"LabelIconMaxHeightHelp": "通过UPnP显示的图标最大分辨率。",
"LabelIconMaxWidth": "图标最大宽度:",
@@ -595,12 +595,12 @@
"LabelImageType": "图片类型:",
"LabelImportOnlyFavoriteChannels": "限制标记频道为我的最爱",
"LabelInNetworkSignInWithEasyPassword": "启用简易PIN码登录家庭网络",
- "LabelInNetworkSignInWithEasyPasswordHelp": "如果启动该选项,你将可以在你的家庭网络中使用你的简易 PIN 码登录 Jellyfin 应用程序。仅在你使用外部网络时才需要输入常规密码。如果 PIN 码留空,那么在你的家庭网络中,你将不需要输入密码。",
+ "LabelInNetworkSignInWithEasyPasswordHelp": "在你的本地网络中使用简易 PIN 码登录客户端,如果 PIN 码留空,那么在本地网络中则不需要输入密码。外部网络中需要输入常规密码登陆。",
"LabelInternetQuality": "网络质量:",
"LabelKidsCategories": "儿童分类:",
"LabelKodiMetadataDateFormat": "发行日期格式:",
"LabelKodiMetadataDateFormatHelp": "Nfo的所有日期将使用这种格式。",
- "LabelKodiMetadataEnableExtraThumbs": "复制同人画到extrathumbs文件夹",
+ "LabelKodiMetadataEnableExtraThumbs": "复制同人画到extrathumbs目录",
"LabelKodiMetadataEnableExtraThumbsHelp": "为了最大化兼容Kodi皮肤,下载的图片同时保存在 extrafanart 和 extrathumbs 文件夹。",
"LabelKodiMetadataEnablePathSubstitution": "启用路径替换",
"LabelKodiMetadataEnablePathSubstitutionHelp": "允许图像的路径替换使用服务器的路径替换设置。",
@@ -724,7 +724,7 @@
"LabelSerialNumber": "序列号",
"LabelSeriesRecordingPath": "电视剧录制路径 (可选的):",
"LabelServerHost": "主机:",
- "LabelServerHostHelp": "192.168.1.100 或 https://myserver.com",
+ "LabelServerHostHelp": "192.168.1.100:8096 或 https://myserver.com",
"LabelSimultaneousConnectionLimit": "并发流限制:",
"LabelSkin": "皮肤:",
"LabelSkipBackLength": "跳过长度:",
@@ -764,7 +764,7 @@
"LabelTrackNumber": "音轨号码:",
"LabelTranscodingAudioCodec": "音频编解码器:",
"LabelTranscodingContainer": "容器:",
- "LabelTranscodingTempPathHelp": "此文件夹包含用于转码的工作文件。请自定义路径,或留空以使用默认的服务器数据文件夹。",
+ "LabelTranscodingTempPathHelp": "设置转码文件存储目录。留空以使用服务器默认文件夹。",
"LabelTranscodingThreadCount": "转码线程数:",
"LabelTranscodingThreadCountHelp": "选择转码时使用的最大线程数。\n减少线程数量将会降低CPU使用率,可能无法快速进行转换并流畅的播放。",
"LabelTranscodingVideoCodec": "视频编解码器:",
@@ -779,7 +779,7 @@
"LabelUserAgent": "用户代理:",
"LabelUserLibrary": "用户程序库:",
"LabelUserLibraryHelp": "选择一个在设备上显示的用户媒体库。留空则使用默认设置。",
- "LabelUserRemoteClientBitrateLimitHelp": "这将会覆盖服务器“播放”设置中为全局设置的默认值。",
+ "LabelUserRemoteClientBitrateLimitHelp": "覆盖服务器“播放”设置的全局默认值。",
"LabelUsername": "用户名:",
"LabelVaapiDevice": "VA API 设备:",
"LabelVaapiDeviceHelp": "此渲染节点用来硬件加速。",
@@ -801,7 +801,7 @@
"Large": "大",
"LatestFromLibrary": "最新的{0}",
"LearnHowYouCanContribute": "学习如何构建。",
- "LibraryAccessHelp": "选择共享给此用户的媒体文件夹。管理员能使用媒体资料管理器来编辑所有文件夹。",
+ "LibraryAccessHelp": "选择共享给此用户的媒体库。管理员有权使用媒体资料管理器来编辑所有文件夹。",
"Like": "喜欢",
"List": "列表",
"Live": "直播",
@@ -845,20 +845,20 @@
"MessageConfirmRemoveMediaLocation": "你确定要移除此位置?",
"MessageConfirmRestart": "你确定要重启 Jellyfin 服务端?",
"MessageConfirmRevokeApiKey": "你确定你希望撤销这个 API 秘钥吗?这个应用程序与 Jellyfin 服务器的连接将会被立刻中断。",
- "MessageConfirmShutdown": "你确定要关闭 Jellyfin 服务端?",
+ "MessageConfirmShutdown": "你确定要关闭服务端?",
"MessageContactAdminToResetPassword": "请联系你的管理员以重置你的密码。",
"MessageCreateAccountAt": "在 {0} 创建帐户",
"MessageDeleteTaskTrigger": "你确定删除这个任务触发条件?",
"MessageDirectoryPickerBSDInstruction": "对于 BSD 系统,你需要设置包含你的 FreeNAS Jail 虚拟机的存储以允许 Jellyfin 访问它。",
"MessageDirectoryPickerInstruction": "网络按钮无法找到你的设备的情况下,网络路径可以手动输入。 例如, {0} 或者 {1}。",
- "MessageDirectoryPickerLinuxInstruction": "对于 Arch Linux 上的 Linux 或是 CentOS、Debian、Fedora、OpenSuse、Ubuntu 这些系统,你必须授权 Jellyfin 系统用户至少拥有你存储位置的读取权限。",
+ "MessageDirectoryPickerLinuxInstruction": "对于 Arch Linux 上的 Linux 或是 CentOS、Debian、Fedora、OpenSuse、Ubuntu 这些系统,你必须授权系统服务用户访问你存储位置的权限。",
"MessageDownloadQueued": "下载已列队。",
"MessageEnablingOptionLongerScans": "启用此选项可能会大大延长媒体库扫描时间。",
"MessageFileReadError": "读取文件发生错误。",
"MessageForgotPasswordFileCreated": "已在服务器上创建了以下文件, 并包含有关后续步骤说明:",
"MessageForgotPasswordInNetworkRequired": "请连接你的家庭网络后再试一次以开始密码重置流程。",
"MessageInstallPluginFromApp": "这个插件必须从你打算使用的应用程序中安装。",
- "MessageInvalidForgotPasswordPin": "你输入了一个无效的或过期的 pin 码。请再试一次。",
+ "MessageInvalidForgotPasswordPin": "无效的或过期的 pin 码。请再试一次。",
"MessageInvalidUser": "用户名或密码不可用。请重试。",
"MessageItemSaved": "项目已保存。",
"MessageItemsAdded": "项目已添加。",
@@ -875,7 +875,7 @@
"MessagePluginInstallDisclaimer": "安装 Jellyfin 社区成员构建的插件来获取额外的功能是增强你的 Jellyfin 体验的一种很好的方式。但在安装之前请意识到他们可能会对你的 Jellyfin 服务器造成的影响,如更长的媒体库扫描时间、额外的背景数据加工、降低系统稳定性等。",
"MessageReenableUser": "请参阅以下以重新启用",
"MessageSettingsSaved": "设置已保存。",
- "MessageTheFollowingLocationWillBeRemovedFromLibrary": "以下媒体路径将从你的 Jellyfin 媒体库移除:",
+ "MessageTheFollowingLocationWillBeRemovedFromLibrary": "以下媒体路径将从你的媒体库移除:",
"MessageUnableToConnectToServer": "现在无法连接所选择的服务器,请确保该服务器目前正在运行。",
"MessageUnsetContentHelp": "内容将显示为纯文件夹。为取得最佳效果, 请使用元数据管理器设置子文件夹的内容类型。",
"MessageYouHaveVersionInstalled": "你目前安装了 {0} 版本。",
@@ -884,13 +884,13 @@
"MetadataSettingChangeHelp": "更改元数据设置将影响添加的新内容。要刷新现有内容, 请打开详细信息屏幕并单击 \"刷新\" 按钮, 或使用元数据管理器执行批量刷新。",
"MinutesAfter": "分钟后",
"MinutesBefore": "分钟前",
- "Mobile": "手机/平板",
+ "Mobile": "移动设备",
"Monday": "星期一",
"MoreFromValue": "更多来自 {0}",
"MoreUsersCanBeAddedLater": "稍后可以在控制台中添加更多用户。",
"MoveLeft": "左移",
"MoveRight": "右移",
- "MovieLibraryHelp": "回顾{0}Jellyfin 电影命名指南{1}。",
+ "MovieLibraryHelp": "回顾{0}电影命名指南{1}。",
"Movies": "电影",
"Mute": "静音",
"MySubtitles": "我的字幕",
@@ -917,7 +917,7 @@
"OneChannel": "一个频道",
"OnlyForcedSubtitles": "只显示强制字幕",
"OnlyForcedSubtitlesHelp": "只有被标记为“强制”的字幕会被加载。",
- "OnlyImageFormats": "仅图像格式(VOBSUB, PGS, SUB/IDX 等)",
+ "OnlyImageFormats": "仅图像格式(VOBSUB, PGS, SUB等)",
"OptionAdminUsers": "管理员",
"OptionAlbum": "专辑",
"OptionAlbumArtist": "专辑艺术家",
@@ -932,7 +932,7 @@
"OptionAllowMediaPlaybackTranscodingHelp": "由于不支持的媒体格式, 限制对代码转换的访问可能会导致 Jellyfin 应用程序中的播放失败。",
"OptionAllowRemoteControlOthers": "允许其他用户全程控制",
"OptionAllowRemoteSharedDevices": "允许远程控制共享的设备",
- "OptionAllowRemoteSharedDevicesHelp": "DLNA 在有用户对它进行控制前设备被视为是共享的。",
+ "OptionAllowRemoteSharedDevicesHelp": "DLNA 设备在用户对他们进行控制前都被视为是共享的。",
"OptionAllowSyncTranscoding": "允许需要转码的媒体下载和同步",
"OptionAllowUserToManageServer": "运行此用户管理服务器",
"OptionAllowVideoPlaybackRemuxing": "允许播放需转换但无需重新编码的视频",
@@ -966,7 +966,7 @@
"OptionDisableUserHelp": "如果禁用该用户,服务器将不允许该用户连接。现有的连接将被终止。",
"OptionDislikes": "不喜欢",
"OptionDisplayFolderView": "显示一个“文件夹”类别用于按文件夹分类浏览你的媒体文件夹",
- "OptionDisplayFolderViewHelp": "如果启用此项,Jellyfin 应用程序将在你的媒体库列表中显示一个“文件夹”类别。如果你有按文件夹分类进行浏览的需求,这个功能将是有帮助的。",
+ "OptionDisplayFolderViewHelp": "在你的媒体库列表中显示文件夹。如果你有按文件夹分类进行浏览的需求,这会非常有用。",
"OptionDownloadArtImage": "艺术图",
"OptionDownloadBackImage": "包装背面",
"OptionDownloadBannerImage": "横幅",
diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json
index 6165b5ef20..b83aaf0330 100644
--- a/src/strings/zh-hk.json
+++ b/src/strings/zh-hk.json
@@ -1,5 +1,5 @@
{
- "Add": "新增",
+ "Add": "添加",
"ButtonAdd": "新增",
"ButtonAddScheduledTaskTrigger": "新增觸發",
"ButtonAddUser": "添加用戶",
@@ -334,5 +334,18 @@
"ValueSongCount": "{0} 首歌",
"Wednesday": "星期三",
"WelcomeToProject": "歡迎來到 Jellyfin!",
- "WizardCompleted": "這就是我們所需要的。 Jellyfin 已開始收集有關您的媒體庫信息。請看看我們一些應用程式,然後點擊 完成 才查看 服務器控制台 。"
+ "WizardCompleted": "這就是我們所需要的。 Jellyfin 已開始收集有關您的媒體庫信息。請看看我們一些應用程式,然後點擊 完成 才查看 服務器控制台 。",
+ "Actor": "演員",
+ "Anytime": "任何時間",
+ "AnyLanguage": "任何語言",
+ "Artists": "藝人",
+ "AsManyAsPossible": "盡可能地越多越好",
+ "Audio": "音頻",
+ "Auto": "自動",
+ "AutoBasedOnLanguageSetting": "自動 (基於語言設定)",
+ "BirthLocation": "出生地點",
+ "AllLanguages": "全部語言",
+ "All": "全部",
+ "AddedOnValue": "已添加 {0}",
+ "AddToPlaylist": "添加至播放清單"
}
diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json
index 7b428ad51a..cca299cf15 100644
--- a/src/strings/zh-tw.json
+++ b/src/strings/zh-tw.json
@@ -309,7 +309,7 @@
"AddToPlaylist": "加入播放列表",
"Absolute": "絕對",
"AccessRestrictedTryAgainLater": "您的存取目前受限,請稍後再試。",
- "AddedOnValue": "加入 {0}",
+ "AddedOnValue": "已加入 {0}",
"AdditionalNotificationServices": "請瀏覽附加元件目錄以安裝額外的通知服務。",
"Albums": "專輯",
"Alerts": "警示",
diff --git a/src/userprofiles.html b/src/userprofiles.html
index bfa8c2e8e4..6fa5f058ce 100644
--- a/src/userprofiles.html
+++ b/src/userprofiles.html
@@ -6,7 +6,7 @@
\ No newline at end of file
+
diff --git a/src/videoosd.html b/src/videoosd.html
index 34c73a3019..0c7a910908 100644
--- a/src/videoosd.html
+++ b/src/videoosd.html
@@ -1,4 +1,4 @@
-