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

Merge pull request #1651 from MediaBrowser/dev

Dev
This commit is contained in:
Luke 2016-04-16 15:07:29 -04:00
commit b097df1ead
117 changed files with 1363 additions and 891 deletions

View file

@ -16,12 +16,12 @@
},
"devDependencies": {},
"ignore": [],
"version": "1.2.25",
"_release": "1.2.25",
"version": "1.2.26",
"_release": "1.2.26",
"_resolution": {
"type": "version",
"tag": "1.2.25",
"commit": "7d3165462b584cfe4e1a76dd0afd4bade40274f5"
"tag": "1.2.26",
"commit": "7e13c8d9c17a4946681b3485c5fbf3e62f39cd2f"
},
"_source": "https://github.com/MediaBrowser/emby-webcomponents.git",
"_target": "^1.2.0",

View file

@ -5,7 +5,6 @@
border: none;
border-radius: 2px;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);
/*opacity: 1;
-webkit-transform: scale(1);
transform: scale(1);
@ -43,7 +42,7 @@
}
.actionSheetMenuItem {
padding: .7em 1.5em;
padding: .8em 1.6em;
margin: 0;
text-transform: none;
text-align: inherit;
@ -52,6 +51,11 @@
font-weight: inherit;
}
.layout-tv .actionSheetMenuItem {
padding-top: .6em;
padding-bottom: .6em;
}
.actionSheetItemIcon {
margin-right: 1.5em !important;
}

View file

@ -247,6 +247,7 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana
translateDocument: translateHtml,
translateHtml: translateHtml,
loadStrings: loadTranslations,
defaultModule: defaultModule
defaultModule: defaultModule,
getCurrentLocale: getCurrentLocale
};
});

View file

@ -1,6 +1,6 @@
{
"name": "hls.js",
"version": "0.5.21",
"version": "0.5.22",
"license": "Apache-2.0",
"description": "Media Source Extension - HLS library, by/for Dailymotion",
"homepage": "https://github.com/dailymotion/hls.js",
@ -16,11 +16,11 @@
"test",
"tests"
],
"_release": "0.5.21",
"_release": "0.5.22",
"_resolution": {
"type": "version",
"tag": "v0.5.21",
"commit": "25b13e24bbd97785da7e255db117902e692c09dd"
"tag": "v0.5.22",
"commit": "ed41f6bffac7c6e35963c8aa741e00be8edea2c8"
},
"_source": "git://github.com/dailymotion/hls.js.git",
"_target": "~0.5.7",

View file

@ -97,6 +97,7 @@ each error is categorized by :
- ```Hls.ErrorDetails.FRAG_LOAD_TIMEOUT```raised when fragment loading fails because of a timeout
- ```Hls.ErrorDetails.FRAG_DECRYPT_ERROR```raised when fragment decryption fails
- ```Hls.ErrorDetails.FRAG_PARSING_ERROR```raised when fragment parsing fails
- ```Hls.ErrorDetails.BUFFER_ADD_CODEC_ERROR```raised when exception is raised while adding a new sourceBuffer to MediaSource
- ```Hls.ErrorDetails.BUFFER_APPEND_ERROR```raised when exception is raised while preparing buffer append
- ```Hls.ErrorDetails.BUFFER_APPENDING_ERROR```raised when exception is raised during buffer appending
- ```Hls.ErrorDetails.BUFFER_STALLED_ERROR```raised when playback stalls because the buffer runs out
@ -559,6 +560,10 @@ get/set : capping/max level value that could be used by ABR Controller
default value is -1 (no level capping)
## Version Control
#### ```Hls.version```
static getter: return hls.js dist version number
## Network Loading Control API
@ -615,7 +620,7 @@ full list of Events available below :
- `Hls.Events.FRAG_LOADING` - fired when a fragment loading starts
- data: { frag : fragment object}
- `Hls.Events.FRAG_LOAD_PROGRESS` - fired when a fragment load is in progress
- data: { frag : fragment object with frag.loaded=stats.loaded, stats : { trequest, tfirst, loaded} }
- data: { frag : fragment object with frag.loaded=stats.loaded, stats : { trequest, tfirst, loaded, total} }
- `Hls.Events.FRAG_LOADED` - fired when a fragment loading is completed
- data: { frag : fragment object, payload : fragment payload, stats : { trequest, tfirst, tload, length}}
- `Hls.Events.FRAG_PARSING_INIT_SEGMENT` - fired when Init Segment has been extracted from fragment
@ -632,6 +637,8 @@ full list of Events available below :
- data: { frag : fragment object }
- `Hls.Events.FPS_DROP` - triggered when FPS drop in last monitoring period is higher than given threshold
- data: {curentDropped : nb of dropped frames in last monitoring period, currentDecoded: nb of decoded frames in last monitoring period, totalDropped : total dropped frames on this video element}
- `Hls.Events.FPS_DROP_LEVEL_CAPPING` - triggered when FPS drop triggers auto level capping
- data: { level: suggested new auto level capping by fps controller, droppedLevel : level has to much dropped frame will be restricted }
- `Hls.Events.ERROR` - Identifier for an error event
- data: { type : error Type, details : error details, fatal : is error fatal or not, other error specific data}
- `Hls.Events.DESTROYING` - fired when hls.js instance starts destroying. Different from MEDIA_DETACHED as one could want to detach and reattach a video to the instance of hls.js to handle mid-rolls for example.
@ -669,6 +676,8 @@ full list of Errors is described below:
### Media Errors
- ```Hls.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR```raised when manifest only contains quality level with codecs incompatible with MediaSource Engine.
- data: { type : ```MEDIA_ERROR```, details : ```Hls.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR```, fatal : ```true```, url : manifest URL}
- ```Hls.ErrorDetails.BUFFER_ADD_CODEC_ERROR```raised when MediaSource fails to add new sourceBuffer
- data: { type : ```MEDIA_ERROR```, details : ```Hls.ErrorDetails.BUFFER_ADD_CODEC_ERROR```, fatal : ```false```, err : error raised by MediaSource, mimeType: mimeType on which the failure happened}
- ```Hls.ErrorDetails.BUFFER_APPEND_ERROR```raised when exception is raised while calling buffer append
- data: { type : ```MEDIA_ERROR```, details : ```Hls.ErrorDetails.BUFFER_APPEND_ERROR```, fatal : ```true```, frag : fragment object}
- ```Hls.ErrorDetails.BUFFER_APPENDING_ERROR```raised when exception is raised during buffer appending

View file

@ -1,6 +1,6 @@
{
"name": "hls.js",
"version": "0.5.21",
"version": "0.6.1",
"license": "Apache-2.0",
"description": "Media Source Extension - HLS library, by/for Dailymotion",
"homepage": "https://github.com/dailymotion/hls.js",

View file

@ -93,7 +93,7 @@ header {
<video id="video" controls autoplay class="videoCentered"></video><br>
<canvas id="buffered_c" height="15" class="videoCentered" onclick="buffered_seek(event);"></canvas><br><br>
<pre id="HlsStatus" class="center"></pre>
<pre id="HlsStatus" class="center" style="white-space: pre-wrap;"></pre>
<div class="center" id="toggleButtons">
<button type="button" class="btn btn-sm" onclick="$('#PlaybackControl').toggle();">toggle playback controls</button>
@ -477,6 +477,9 @@ $(document).ready(function() {
case Hls.ErrorDetails.BUFFER_APPEND_ERROR:
$("#HlsStatus").text("Buffer Append Error");
break;
case Hls.ErrorDetails.BUFFER_ADD_CODEC_ERROR:
$("#HlsStatus").text("Buffer Add Codec Error for " + data.mimeType + ":" + data.err.message);
break;
case Hls.ErrorDetails.BUFFER_APPENDING_ERROR:
$("#HlsStatus").text("Buffer Appending Error");
break;

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,5 @@
#/bin/sh
git checkout gh-pages
git rebase v0.5.x
git rebase master
git push origin gh-pages --force
git checkout v0.5.x
git checkout master

View file

@ -1,6 +1,6 @@
{
"name": "hls.js",
"version": "0.5.21",
"version": "0.6.1",
"license": "Apache-2.0",
"description": "Media Source Extension - HLS library, by/for Dailymotion",
"homepage": "https://github.com/dailymotion/hls.js",
@ -17,7 +17,7 @@
"scripts": {
"clean": "find dist -mindepth 1 -delete",
"prebuild": "npm run clean & npm run test",
"build": "npm run babel && browserify -t [babelify] -s Hls src/index.js --debug | exorcist dist/hls.js.map -b . > dist/hls.js",
"build": "npm run babel && browserify -t browserify-versionify -t [babelify] -s Hls src/index.js --debug | exorcist dist/hls.js.map -b . > dist/hls.js",
"postbuild": "npm run minify",
"prerelease": "npm run prebuild && npm run build && npm run postbuild && git add dist/* && git commit -m 'update dist'",
"patch": "npm run prerelease && mversion p",
@ -38,13 +38,14 @@
"webworkify": "^1.0.2"
},
"devDependencies": {
"babel-preset-es2015": "^6.3.13",
"babel-register": "^6.3.13",
"babelify": "^7.2.0",
"arraybuffer-equal": "^1.0.4",
"babel": "^6.3.26",
"babel-cli": "^6.3.17",
"babel-preset-es2015": "^6.3.13",
"babel-register": "^6.3.13",
"babelify": "^7.2.0",
"browserify": "^13.0.0",
"browserify-versionify": "^1.0.6",
"deep-strict-equal": "^0.1.0",
"exorcist": "^0.4.0",
"http-server": "^0.9.0",

View file

@ -67,7 +67,7 @@ class BufferController extends EventHandler {
this.mediaSource = null;
this.media = null;
this.pendingTracks = null;
this.sourceBuffer = null;
this.sourceBuffer = {};
}
this.onmso = this.onmse = this.onmsc = null;
this.hls.trigger(Event.MEDIA_DETACHED);
@ -122,18 +122,16 @@ class BufferController extends EventHandler {
onBufferReset() {
var sourceBuffer = this.sourceBuffer;
if (sourceBuffer) {
for(var type in sourceBuffer) {
var sb = sourceBuffer[type];
try {
this.mediaSource.removeSourceBuffer(sb);
sb.removeEventListener('updateend', this.onsbue);
sb.removeEventListener('error', this.onsbe);
} catch(err) {
}
for(var type in sourceBuffer) {
var sb = sourceBuffer[type];
try {
this.mediaSource.removeSourceBuffer(sb);
sb.removeEventListener('updateend', this.onsbue);
sb.removeEventListener('error', this.onsbe);
} catch(err) {
}
this.sourceBuffer = null;
}
this.sourceBuffer = {};
this.flushRange = [];
this.appended = 0;
}
@ -146,19 +144,24 @@ class BufferController extends EventHandler {
return;
}
if (!this.sourceBuffer) {
var sourceBuffer = {}, mediaSource = this.mediaSource;
for (trackName in tracks) {
var sourceBuffer = this.sourceBuffer,mediaSource = this.mediaSource;
for (trackName in tracks) {
if(!sourceBuffer[trackName]) {
track = tracks[trackName];
// use levelCodec as first priority
codec = track.levelCodec || track.codec;
mimeType = `${track.container};codecs=${codec}`;
logger.log(`creating sourceBuffer with mimeType:${mimeType}`);
sb = sourceBuffer[trackName] = mediaSource.addSourceBuffer(mimeType);
sb.addEventListener('updateend', this.onsbue);
sb.addEventListener('error', this.onsbe);
try {
sb = sourceBuffer[trackName] = mediaSource.addSourceBuffer(mimeType);
sb.addEventListener('updateend', this.onsbue);
sb.addEventListener('error', this.onsbe);
} catch(err) {
logger.error(`error while trying to add sourceBuffer:${err.message}`);
this.hls.trigger(Event.ERROR, {type: ErrorTypes.MEDIA_ERROR, details: ErrorDetails.BUFFER_ADD_CODEC_ERROR, fatal: false, err: err, mimeType : mimeType});
}
}
this.sourceBuffer = sourceBuffer;
}
}
@ -223,10 +226,8 @@ class BufferController extends EventHandler {
// let's recompute this.appended, which is used to avoid flush looping
var appended = 0;
var sourceBuffer = this.sourceBuffer;
if (sourceBuffer) {
for (var type in sourceBuffer) {
appended += sourceBuffer[type].buffered.length;
}
for (var type in sourceBuffer) {
appended += sourceBuffer[type].buffered.length;
}
this.appended = appended;
this.hls.trigger(Event.BUFFER_FLUSHED);
@ -251,9 +252,16 @@ class BufferController extends EventHandler {
var segment = segments.shift();
try {
//logger.log(`appending ${segment.type} SB, size:${segment.data.length});
sourceBuffer[segment.type].appendBuffer(segment.data);
this.appendError = 0;
this.appended++;
if(sourceBuffer[segment.type]) {
sourceBuffer[segment.type].appendBuffer(segment.data);
this.appendError = 0;
this.appended++;
} else {
// in case we don't have any source buffer matching with this segment type,
// it means that Mediasource fails to create sourcebuffer
// discard this segment, and trigger update end
this.onSBUpdateEnd();
}
} catch(err) {
// in case any error occured while appending, put back segment in segments table
logger.error(`error while trying to append buffer:${err.message}`);

View file

@ -8,20 +8,30 @@ import EventHandler from '../event-handler';
class CapLevelController extends EventHandler {
constructor(hls) {
super(hls,
Event.FPS_DROP_LEVEL_CAPPING,
Event.MEDIA_ATTACHING,
Event.MANIFEST_PARSED);
}
destroy() {
if (this.hls.config.capLevelToPlayerSize) {
this.media = null;
this.media = this.restrictedLevels = null;
this.autoLevelCapping = Number.POSITIVE_INFINITY;
if (this.timer) {
this.timer = clearInterval(this.timer);
}
}
}
onFpsDropLevelCapping(data) {
if (!this.restrictedLevels) {
this.restrictedLevels = [];
}
if (!this.isLevelRestricted(data.droppedLevel)) {
this.restrictedLevels.push(data.droppedLevel);
}
}
onMediaAttaching(data) {
this.media = data.media instanceof HTMLVideoElement ? data.media : null;
}
@ -56,7 +66,7 @@ class CapLevelController extends EventHandler {
* returns level should be the one with the dimensions equal or greater than the media (player) dimensions (so the video will be downscaled)
*/
getMaxLevel(capLevelIndex) {
let result,
let result = 0,
i,
level,
mWidth = this.mediaWidth,
@ -66,6 +76,9 @@ class CapLevelController extends EventHandler {
for (i = 0; i <= capLevelIndex; i++) {
level = this.levels[i];
if (this.isLevelRestricted(i)) {
break;
}
result = i;
lWidth = level.width;
lHeight = level.height;
@ -76,6 +89,10 @@ class CapLevelController extends EventHandler {
return result;
}
isLevelRestricted(level) {
return (this.restrictedLevels && this.restrictedLevels.indexOf(level) !== -1) ? true : false;
}
get contentScaleFactor() {
let pixelRatio = 1;
try {

View file

@ -3,46 +3,72 @@
*/
import Event from '../events';
import EventHandler from '../event-handler';
import {logger} from '../utils/logger';
class FPSController {
class FPSController extends EventHandler{
constructor(hls) {
this.hls = hls;
this.timer = setInterval(this.checkFPS, hls.config.fpsDroppedMonitoringPeriod);
super(hls, Event.MEDIA_ATTACHING);
}
destroy() {
if (this.timer) {
clearInterval(this.timer);
clearInterval(this.timer);
}
this.isVideoPlaybackQualityAvailable = false;
}
checkFPS() {
var v = this.hls.video;
if (v) {
var decodedFrames = v.webkitDecodedFrameCount, droppedFrames = v.webkitDroppedFrameCount, currentTime = new Date();
if (decodedFrames) {
if (this.lastTime) {
var currentPeriod = currentTime - this.lastTime;
var currentDropped = droppedFrames - this.lastDroppedFrames;
var currentDecoded = decodedFrames - this.lastDecodedFrames;
var decodedFPS = 1000 * currentDecoded / currentPeriod;
var droppedFPS = 1000 * currentDropped / currentPeriod;
if (droppedFPS > 0) {
logger.log(`checkFPS : droppedFPS/decodedFPS:${droppedFPS.toFixed(1)}/${decodedFPS.toFixed(1)}`);
if (currentDropped > this.hls.config.fpsDroppedMonitoringThreshold * currentDecoded) {
logger.warn('drop FPS ratio greater than max allowed value');
this.hls.trigger(Event.FPS_DROP, {currentDropped: currentDropped, currentDecoded: currentDecoded, totalDroppedFrames: droppedFrames});
onMediaAttaching(data) {
if (this.hls.config.capLevelOnFPSDrop) {
this.video = data.media instanceof HTMLVideoElement ? data.media : null;
if (typeof this.video.getVideoPlaybackQuality === 'function') {
this.isVideoPlaybackQualityAvailable = true;
}
clearInterval(this.timer);
this.timer = setInterval(this.checkFPSInterval.bind(this), this.hls.config.fpsDroppedMonitoringPeriod);
}
}
checkFPS(video, decodedFrames, droppedFrames) {
let currentTime = performance.now();
if (decodedFrames) {
if (this.lastTime) {
let currentPeriod = currentTime - this.lastTime,
currentDropped = droppedFrames - this.lastDroppedFrames,
currentDecoded = decodedFrames - this.lastDecodedFrames,
droppedFPS = 1000 * currentDropped / currentPeriod;
this.hls.trigger(Event.FPS_DROP, {currentDropped: currentDropped, currentDecoded: currentDecoded, totalDroppedFrames: droppedFrames});
if (droppedFPS > 0) {
//logger.log('checkFPS : droppedFPS/decodedFPS:' + droppedFPS/(1000 * currentDecoded / currentPeriod));
if (currentDropped > this.hls.config.fpsDroppedMonitoringThreshold * currentDecoded) {
let currentLevel = this.hls.currentLevel;
logger.warn('drop FPS ratio greater than max allowed value for currentLevel: ' + currentLevel);
if (currentLevel > 0 && (this.hls.autoLevelCapping === -1 || this.hls.autoLevelCapping >= currentLevel)) {
currentLevel = currentLevel - 1;
this.hls.trigger(Event.FPS_DROP_LEVEL_CAPPING, {level: currentLevel, droppedLevel: this.hls.currentLevel});
this.hls.autoLevelCapping = currentLevel;
this.hls.streamController.nextLevelSwitch();
}
}
}
this.lastTime = currentTime;
this.lastDroppedFrames = droppedFrames;
this.lastDecodedFrames = decodedFrames;
}
this.lastTime = currentTime;
this.lastDroppedFrames = droppedFrames;
this.lastDecodedFrames = decodedFrames;
}
}
checkFPSInterval() {
if (this.video) {
if (this.isVideoPlaybackQualityAvailable) {
let videoPlaybackQuality = this.video.getVideoPlaybackQuality();
this.checkFPS(this.video, videoPlaybackQuality.totalVideoFrames, videoPlaybackQuality.droppedVideoFrames);
} else {
this.checkFPS(this.video, this.video.webkitDecodedFrameCount, this.video.webkitDroppedFrameCount);
}
}
}
}
export default FPSController;

View file

@ -234,10 +234,15 @@ class LevelController extends EventHandler {
onLevelLoaded(data) {
// check if current playlist is a live playlist
if (data.details.live && !this.timer) {
if (data.details.live) {
// if live playlist we will have to reload it periodically
// set reload period to playlist target duration
this.timer = setInterval(this.ontick, 1000 * data.details.targetduration);
// set reload period to average of the frag duration, if average not set then use playlist target duration
let timerInterval = data.details.averagetargetduration ? data.details.averagetargetduration : data.details.targetduration;
if (!this.timer || timerInterval !== this.timerInterval) {
clearInterval(this.timer);
this.timer = setInterval(this.ontick, 1000 * timerInterval);
this.timerInterval = timerInterval;
}
}
if (!data.details.live && this.timer) {
// playlist is not live and timer is armed : stopping it

View file

@ -36,6 +36,8 @@ export const ErrorDetails = {
KEY_LOAD_ERROR: 'keyLoadError',
// Identifier for decrypt key load timeout error - data: { frag : fragment object}
KEY_LOAD_TIMEOUT: 'keyLoadTimeOut',
// Triggered when an exception occurs while adding a sourceBuffer to MediaSource - data : { err : exception , mimeType : mimeType }
BUFFER_ADD_CODEC_ERROR: 'bufferAddCodecError',
// Identifier for a buffer append error - data: append error description
BUFFER_APPEND_ERROR: 'bufferAppendError',
// Identifier for a buffer appending error event - data: appending error description

View file

@ -59,8 +59,10 @@ module.exports = {
FRAG_BUFFERED: 'hlsFragBuffered',
// fired when fragment matching with current media position is changing - data : { frag : fragment object }
FRAG_CHANGED: 'hlsFragChanged',
// Identifier for a FPS drop event - data: {curentDropped, currentDecoded, totalDroppedFrames}
// Identifier for a FPS drop event - data: {curentDropped, currentDecoded, totalDroppedFrames}
FPS_DROP: 'hlsFpsDrop',
//triggered when FPS drop triggers auto level capping - data: {level, droppedlevel}
FPS_DROP_LEVEL_CAPPING: 'hlsFpsDropLevelCapping',
// Identifier for an error event - data: { type : error type, details : error details, fatal : if true, hls.js cannot/will not try to recover, if false, hls.js will try to recover,other error specific data}
ERROR: 'hlsError',
// fired when hls.js instance starts destroying. Different from MEDIA_DETACHED as one could want to detach and reattach a media to the instance of hls.js to handle mid-rolls for example

View file

@ -45,8 +45,9 @@ class LevelHelper {
LevelHelper.updateFragPTS(newDetails,PTSFrag.sn,PTSFrag.startPTS,PTSFrag.endPTS);
} else {
// ensure that delta is within oldfragments range
// no need to offset start if delta === 0
if (delta > 0 && delta < oldfragments.length) {
// also adjust sliding in case delta is 0 (we could have old=[50-60] and new=old=[50-61])
// in that case we also need to adjust start offset of all fragments
if (delta >= 0 && delta < oldfragments.length) {
// adjust start by sliding offset
var sliding = oldfragments[delta].start;
for(i = 0 ; i < newfragments.length ; i++) {

View file

@ -13,7 +13,7 @@ import CapLevelController from './controller/cap-level-controller';
import StreamController from './controller/stream-controller';
import LevelController from './controller/level-controller';
import TimelineController from './controller/timeline-controller';
//import FPSController from './controller/fps-controller';
import FPSController from './controller/fps-controller';
import {logger, enableLogs} from './utils/logger';
import XhrLoader from './utils/xhr-loader';
import EventEmitter from 'events';
@ -21,6 +21,11 @@ import KeyLoader from './loader/key-loader';
class Hls {
static get version() {
// replaced with browserify-versionify transform
return '__VERSION__';
}
static isSupported() {
return (window.MediaSource && window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'));
}
@ -42,6 +47,7 @@ class Hls {
Hls.defaultConfig = {
autoStartLoad: true,
debug: false,
capLevelOnFPSDrop: false,
capLevelToPlayerSize: false,
maxBufferLength: 30,
maxBufferSize: 60 * 1000 * 1000,
@ -67,8 +73,8 @@ class Hls {
fragLoadingRetryDelay: 1000,
fragLoadingLoopThreshold: 3,
startFragPrefetch : false,
// fpsDroppedMonitoringPeriod: 5000,
// fpsDroppedMonitoringThreshold: 0.2,
fpsDroppedMonitoringPeriod: 5000,
fpsDroppedMonitoringThreshold: 0.2,
appendErrorMaxRetry: 3,
loader: XhrLoader,
fLoader: undefined,
@ -76,6 +82,7 @@ class Hls {
abrController : AbrController,
bufferController : BufferController,
capLevelController : CapLevelController,
fpsController: FPSController,
streamController: StreamController,
timelineController: TimelineController,
enableCEA708Captions: true,
@ -129,10 +136,10 @@ class Hls {
this.abrController = new config.abrController(this);
this.bufferController = new config.bufferController(this);
this.capLevelController = new config.capLevelController(this);
this.fpsController = new config.fpsController(this);
this.streamController = new config.streamController(this);
this.timelineController = new config.timelineController(this);
this.keyLoader = new KeyLoader(this);
//this.fpsController = new FPSController(this);
}
destroy() {
@ -145,10 +152,10 @@ class Hls {
this.abrController.destroy();
this.bufferController.destroy();
this.capLevelController.destroy();
this.fpsController.destroy();
this.streamController.destroy();
this.timelineController.destroy();
this.keyLoader.destroy();
//this.fpsController.destroy();
this.keyLoader.destroy();
this.url = null;
this.observer.removeAllListeners();
}

View file

@ -51,7 +51,7 @@ class FragmentLoader extends EventHandler {
this.hls.trigger(Event.ERROR, {type: ErrorTypes.NETWORK_ERROR, details: ErrorDetails.FRAG_LOAD_TIMEOUT, fatal: false, frag: this.frag});
}
loadprogress(event, stats) {
loadprogress(stats) {
this.frag.loaded = stats.loaded;
this.hls.trigger(Event.FRAG_LOAD_PROGRESS, {frag: this.frag, stats: stats});
}

View file

@ -211,6 +211,7 @@ class PlaylistLoader extends EventHandler {
totalduration-=frag.duration;
}
level.totalduration = totalduration;
level.averagetargetduration = totalduration / level.fragments.length;
level.endSN = currentSN - 1;
return level;
}
@ -224,7 +225,8 @@ class PlaylistLoader extends EventHandler {
hls = this.hls,
levels;
// responseURL not supported on some browsers (it is used to detect URL redirection)
if (url === undefined) {
// data-uri mode also not supported (but no need to detect redirection)
if (url === undefined || url.indexOf('data:') === 0) {
// fallback to initial URL
url = this.url;
}

View file

@ -132,135 +132,164 @@ class MP4Remuxer {
}
remuxVideo(track, timeOffset, contiguous) {
var view,
offset = 8,
var offset = 8,
pesTimeScale = this.PES_TIMESCALE,
pes2mp4ScaleFactor = this.PES2MP4SCALEFACTOR,
avcSample,
mp4Sample,
mp4SampleLength,
unit,
mp4SampleDuration,
mdat, moof,
firstPTS, firstDTS, lastDTS,
pts, dts, ptsnorm, dtsnorm,
flags,
samples = [];
firstPTS, firstDTS,
nextDTS,
lastPTS, lastDTS,
inputSamples = track.samples,
outputSamples = [];
// PTS is coded on 33bits, and can loop from -2^32 to 2^32
// PTSNormalize will make PTS/DTS value monotonic, we use last known DTS value as reference value
let nextAvcDts;
if (contiguous) {
// if parsed fragment is contiguous with last one, let's use last DTS value as reference
nextAvcDts = this.nextAvcDts;
} else {
// if not contiguous, let's use target timeOffset
nextAvcDts = timeOffset*pesTimeScale;
}
// compute first DTS and last DTS, normalize them against reference value
let sample = inputSamples[0];
firstDTS = Math.max(this._PTSNormalize(sample.dts,nextAvcDts) - this._initDTS,0);
firstPTS = Math.max(this._PTSNormalize(sample.pts,nextAvcDts) - this._initDTS,0);
// check timestamp continuity accross consecutive fragments (this is to remove inter-fragment gap/hole)
let delta = Math.round((firstDTS - nextAvcDts) / 90);
// if fragment are contiguous, or if there is a huge delta (more than 10s) between expected PTS and sample PTS
if (contiguous || Math.abs(delta) > 10000) {
if (delta) {
if (delta > 1) {
logger.log(`AVC:${delta} ms hole between fragments detected,filling it`);
} else if (delta < -1) {
logger.log(`AVC:${(-delta)} ms overlapping between fragments detected`);
}
// remove hole/gap : set DTS to next expected DTS
firstDTS = nextAvcDts;
inputSamples[0].dts = firstDTS + this._initDTS;
// offset PTS as well, ensure that PTS is smaller or equal than new DTS
firstPTS = Math.max(firstPTS - delta, nextAvcDts);
inputSamples[0].pts = firstPTS + this._initDTS;
logger.log(`Video/PTS/DTS adjusted: ${firstPTS}/${firstDTS},delta:${delta}`);
}
}
nextDTS = firstDTS;
// compute lastPTS/lastDTS
sample = inputSamples[inputSamples.length-1];
lastDTS = Math.max(this._PTSNormalize(sample.dts,nextAvcDts) - this._initDTS,0);
lastPTS = Math.max(this._PTSNormalize(sample.pts,nextAvcDts) - this._initDTS,0);
lastPTS = Math.max(lastPTS, lastDTS);
let vendor = navigator.vendor, userAgent = navigator.userAgent,
isSafari = vendor && vendor.indexOf('Apple') > -1 && userAgent && !userAgent.match('CriOS');
// on Safari let's signal the same sample duration for all samples
// sample duration (as expected by trun MP4 boxes), should be the delta between sample DTS
// set this constant duration as being the avg delta between consecutive DTS.
if (isSafari) {
mp4SampleDuration = Math.round((lastDTS-firstDTS)/(pes2mp4ScaleFactor*(inputSamples.length-1)));
}
// normalize all PTS/DTS now ...
for (let i = 0; i < inputSamples.length; i++) {
let sample = inputSamples[i];
if (isSafari) {
// sample DTS is computed using a constant decoding offset (mp4SampleDuration) between samples
sample.dts = firstDTS + i*pes2mp4ScaleFactor*mp4SampleDuration;
} else {
// ensure sample monotonic DTS
sample.dts = Math.max(this._PTSNormalize(sample.dts, nextAvcDts) - this._initDTS,firstDTS);
// ensure dts is a multiple of scale factor to avoid rounding issues
sample.dts = Math.round(sample.dts/pes2mp4ScaleFactor)*pes2mp4ScaleFactor;
}
// we normalize PTS against nextAvcDts, we also substract initDTS (some streams don't start @ PTS O)
// and we ensure that computed value is greater or equal than sample DTS
sample.pts = Math.max(this._PTSNormalize(sample.pts,nextAvcDts) - this._initDTS, sample.dts);
// ensure pts is a multiple of scale factor to avoid rounding issues
sample.pts = Math.round(sample.pts/pes2mp4ScaleFactor)*pes2mp4ScaleFactor;
}
/* concatenate the video data and construct the mdat in place
(need 8 more bytes to fill length and mpdat type) */
mdat = new Uint8Array(track.len + (4 * track.nbNalu) + 8);
view = new DataView(mdat.buffer);
let view = new DataView(mdat.buffer);
view.setUint32(0, mdat.byteLength);
mdat.set(MP4.types.mdat, 4);
while (track.samples.length) {
avcSample = track.samples.shift();
mp4SampleLength = 0;
for (let i = 0; i < inputSamples.length; i++) {
let avcSample = inputSamples[i],
mp4SampleLength = 0,
compositionTimeOffset;
// convert NALU bitstream to MP4 format (prepend NALU with size field)
while (avcSample.units.units.length) {
unit = avcSample.units.units.shift();
let unit = avcSample.units.units.shift();
view.setUint32(offset, unit.data.byteLength);
offset += 4;
mdat.set(unit.data, offset);
offset += unit.data.byteLength;
mp4SampleLength += 4 + unit.data.byteLength;
}
pts = avcSample.pts - this._initDTS;
dts = avcSample.dts - this._initDTS;
// ensure DTS is not bigger than PTS
dts = Math.min(pts,dts);
//logger.log(`Video/PTS/DTS:${Math.round(pts/90)}/${Math.round(dts/90)}`);
// if not first AVC sample of video track, normalize PTS/DTS with previous sample value
// and ensure that sample duration is positive
if (lastDTS !== undefined) {
ptsnorm = this._PTSNormalize(pts, lastDTS);
dtsnorm = this._PTSNormalize(dts, lastDTS);
var sampleDuration = (dtsnorm - lastDTS) / pes2mp4ScaleFactor;
if (sampleDuration <= 0) {
logger.log(`invalid sample duration at PTS/DTS: ${avcSample.pts}/${avcSample.dts}:${sampleDuration}`);
sampleDuration = 1;
}
mp4Sample.duration = sampleDuration;
} else {
let nextAvcDts, delta;
if (contiguous) {
nextAvcDts = this.nextAvcDts;
if(!isSafari) {
// expected sample duration is the Decoding Timestamp diff of consecutive samples
if (i < inputSamples.length - 1) {
mp4SampleDuration = inputSamples[i+1].dts - avcSample.dts;
} else {
nextAvcDts = timeOffset*pesTimeScale;
// last sample duration is same than previous one
mp4SampleDuration = avcSample.dts - inputSamples[i-1].dts;
}
// first AVC sample of video track, normalize PTS/DTS
ptsnorm = this._PTSNormalize(pts, nextAvcDts);
dtsnorm = this._PTSNormalize(dts, nextAvcDts);
delta = Math.round((dtsnorm - nextAvcDts) / 90);
// if fragment are contiguous, or if there is a huge delta (more than 10s) between expected PTS and sample PTS
if (contiguous || Math.abs(delta) > 10000) {
if (delta) {
if (delta > 1) {
logger.log(`AVC:${delta} ms hole between fragments detected,filling it`);
} else if (delta < -1) {
logger.log(`AVC:${(-delta)} ms overlapping between fragments detected`);
}
// set DTS to next DTS
dtsnorm = nextAvcDts;
// offset PTS as well, ensure that PTS is smaller or equal than new DTS
ptsnorm = Math.max(ptsnorm - delta, dtsnorm);
logger.log(`Video/PTS/DTS adjusted: ${ptsnorm}/${dtsnorm},delta:${delta}`);
}
}
// remember first PTS of our avcSamples, ensure value is positive
firstPTS = Math.max(0, ptsnorm);
firstDTS = Math.max(0, dtsnorm);
mp4SampleDuration /= pes2mp4ScaleFactor;
compositionTimeOffset = Math.round((avcSample.pts - avcSample.dts) / pes2mp4ScaleFactor);
} else {
compositionTimeOffset = Math.max(0,mp4SampleDuration*Math.round((avcSample.pts - avcSample.dts)/(pes2mp4ScaleFactor*mp4SampleDuration)));
}
//console.log('PTS/DTS/initDTS/normPTS/normDTS/relative PTS : ${avcSample.pts}/${avcSample.dts}/${this._initDTS}/${ptsnorm}/${dtsnorm}/${(avcSample.pts/4294967296).toFixed(3)}');
mp4Sample = {
outputSamples.push({
size: mp4SampleLength,
duration: 0,
cts: (ptsnorm - dtsnorm) / pes2mp4ScaleFactor,
// constant duration
duration: mp4SampleDuration,
cts: compositionTimeOffset,
flags: {
isLeading: 0,
isDependedOn: 0,
hasRedundancy: 0,
degradPrio: 0
degradPrio: 0,
dependsOn : avcSample.key ? 2 : 1,
isNonSync : avcSample.key ? 0 : 1
}
};
flags = mp4Sample.flags;
if (avcSample.key === true) {
// the current sample is a key frame
flags.dependsOn = 2;
flags.isNonSync = 0;
} else {
flags.dependsOn = 1;
flags.isNonSync = 1;
}
samples.push(mp4Sample);
lastDTS = dtsnorm;
});
}
var lastSampleDuration = 0;
if (samples.length >= 2) {
lastSampleDuration = samples[samples.length - 2].duration;
mp4Sample.duration = lastSampleDuration;
}
// next AVC sample DTS should be equal to last sample DTS + last sample duration
this.nextAvcDts = dtsnorm + lastSampleDuration * pes2mp4ScaleFactor;
// next AVC sample DTS should be equal to last sample DTS + last sample duration (in PES timescale)
this.nextAvcDts = lastDTS + mp4SampleDuration*pes2mp4ScaleFactor;
track.len = 0;
track.nbNalu = 0;
if(samples.length && navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
flags = samples[0].flags;
if(outputSamples.length && navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
let flags = outputSamples[0].flags;
// chrome workaround, mark first sample as being a Random Access Point to avoid sourcebuffer append issue
// https://code.google.com/p/chromium/issues/detail?id=229412
flags.dependsOn = 2;
flags.isNonSync = 0;
}
track.samples = samples;
track.samples = outputSamples;
moof = MP4.moof(track.sequenceNumber++, firstDTS / pes2mp4ScaleFactor, track);
track.samples = [];
this.observer.trigger(Event.FRAG_PARSING_DATA, {
data1: moof,
data2: mdat,
startPTS: firstPTS / pesTimeScale,
endPTS: (ptsnorm + pes2mp4ScaleFactor * lastSampleDuration) / pesTimeScale,
endPTS: (lastPTS + pes2mp4ScaleFactor * mp4SampleDuration) / pesTimeScale,
startDTS: firstDTS / pesTimeScale,
endDTS: this.nextAvcDts / pesTimeScale,
type: 'video',
nb: samples.length
nb: outputSamples.length
});
}
@ -299,7 +328,7 @@ class MP4Remuxer {
mp4Sample.duration = (dtsnorm - lastDTS) / pes2mp4ScaleFactor;
if(Math.abs(mp4Sample.duration - expectedSampleDuration) > expectedSampleDuration/10) {
// more than 10% diff between sample duration and expectedSampleDuration .... lets log that
logger.log(`invalid AAC sample duration at PTS ${Math.round(pts/90)},should be 1024,found :${Math.round(mp4Sample.duration*track.audiosamplerate/track.timescale)}`);
logger.trace(`invalid AAC sample duration at PTS ${Math.round(pts/90)},should be 1024,found :${Math.round(mp4Sample.duration*track.audiosamplerate/track.timescale)}`);
}
// always adjust sample duration to avoid av sync issue
mp4Sample.duration = expectedSampleDuration;
@ -327,7 +356,7 @@ class MP4Remuxer {
track.len -= unit.byteLength;
continue;
}
// set PTS/DTS to next PTS/DTS
// set PTS/DTS to expected PTS/DTS
ptsnorm = dtsnorm = nextAacPts;
}
}

View file

@ -112,8 +112,11 @@ class XhrLoader {
stats.tfirst = performance.now();
}
stats.loaded = event.loaded;
if (event.lengthComputable) {
stats.total = event.total;
}
if (this.onProgress) {
this.onProgress(event, stats);
this.onProgress(stats);
}
}
}

View file

@ -30,14 +30,14 @@
"web-component-tester": "polymer/web-component-tester#^3.4.0"
},
"ignore": [],
"homepage": "https://github.com/polymerelements/iron-a11y-announcer",
"homepage": "https://github.com/PolymerElements/iron-a11y-announcer",
"_release": "1.0.4",
"_resolution": {
"type": "version",
"tag": "v1.0.4",
"commit": "5ce3eb8c4282bb53cd72e348858dc6be6b4c50b9"
},
"_source": "git://github.com/polymerelements/iron-a11y-announcer.git",
"_source": "git://github.com/PolymerElements/iron-a11y-announcer.git",
"_target": "^1.0.0",
"_originalSource": "polymerelements/iron-a11y-announcer"
"_originalSource": "PolymerElements/iron-a11y-announcer"
}

View file

@ -32,14 +32,14 @@
"web-component-tester": "^4.0.0",
"webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
},
"homepage": "https://github.com/polymerelements/iron-icon",
"homepage": "https://github.com/PolymerElements/iron-icon",
"_release": "1.0.8",
"_resolution": {
"type": "version",
"tag": "v1.0.8",
"commit": "f36b38928849ef3853db727faa8c9ef104d611eb"
},
"_source": "git://github.com/polymerelements/iron-icon.git",
"_source": "git://github.com/PolymerElements/iron-icon.git",
"_target": "^1.0.0",
"_originalSource": "polymerelements/iron-icon"
"_originalSource": "PolymerElements/iron-icon"
}

View file

@ -36,7 +36,7 @@
"tag": "v1.4.0",
"commit": "554f7418fdbd97688eb21518b5f8172167d53a95"
},
"_source": "git://github.com/PolymerElements/iron-selector.git",
"_source": "git://github.com/polymerelements/iron-selector.git",
"_target": "^1.0.0",
"_originalSource": "PolymerElements/iron-selector"
"_originalSource": "polymerelements/iron-selector"
}

View file

@ -1,6 +1,6 @@
{
"name": "paper-input",
"version": "1.1.10",
"version": "1.1.11",
"description": "Material design text fields",
"authors": [
"The Polymer Authors"
@ -33,7 +33,7 @@
"iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
"iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0",
"iron-input": "PolymerElements/iron-input#^1.0.0",
"paper-styles": "PolymerElements/paper-styles#^1.1.0",
"paper-styles": "PolymerElements/paper-styles#^1.1.4",
"iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0"
},
"devDependencies": {
@ -48,11 +48,11 @@
"web-component-tester": "^4.0.0",
"webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
},
"_release": "1.1.10",
"_release": "1.1.11",
"_resolution": {
"type": "version",
"tag": "v1.1.10",
"commit": "d8e201099b4b2987bea1dbcf5804c0383544bbfd"
"tag": "v1.1.11",
"commit": "8cfe5c5bf8c2e40d243443d046a94b6fe371983c"
},
"_source": "git://github.com/polymerelements/paper-input.git",
"_target": "^1.0.9",

View file

@ -0,0 +1,33 @@
<!-- Instructions: https://github.com/PolymerElements/paper-input/CONTRIBUTING.md#filing-issues -->
### Description
<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
### Expected outcome
<!-- Example: The page stays the same color. -->
### Actual outcome
<!-- Example: The page turns pink. -->
### Live Demo
<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
### Steps to reproduce
<!-- Example
1. Put a `paper-foo` element in the page.
2. Open the page in a web browser.
3. Click the `paper-foo` element.
-->
### Browsers Affected
<!-- Check all that apply -->
- [ ] Chrome
- [ ] Firefox
- [ ] Safari 9
- [ ] Safari 8
- [ ] Safari 7
- [ ] Edge
- [ ] IE 11
- [ ] IE 10

View file

@ -1,15 +1,14 @@
language: node_js
sudo: false
sudo: required
before_script:
- npm install web-component-tester
- npm install bower
- 'export PATH=$PWD/node_modules/.bin:$PATH'
- npm install -g bower polylint web-component-tester
- bower install
- polylint
env:
global:
- secure: TcDqx+YdNCa/DRQjdKt9dgYCPgXtPl2EZ7Nnv6bRvbcmUjW2eSr7Zwb+e0fO8wgwms/RqFaVx+u5jo7D1lnC4Ybcg1HKiMOvCyzY36MjF9oB/VKSEUC+p4tMVQfw1IZ/RmK3dD+WEWaoT/EKmNfctz7v5kR+yk2lZo44D9I7rrc=
- secure: nh65tvhnhOrK05qKvDJKMV7Jm9yiCoG1wFkP3ZnqOHix9Ny+KmcTa41Bl6NXQdvYaMTFtzS7lMZX5cqIziyKyGWHVN30LzGMHJNz12fhcMi3nJ84trhQGcu/9qR9yDv16q9ouGlcz1VxnDOHaRAHnIKjLIbhN3aJtMtZBbnWihA=
node_js: 4
node_js: stable
addons:
firefox: latest
apt:
@ -17,6 +16,8 @@ addons:
- google-chrome
packages:
- google-chrome-stable
sauce_connect: true
script:
- xvfb-run wct
- "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi"
dist: trusty

View file

@ -1,6 +1,6 @@
{
"name": "paper-input",
"version": "1.1.10",
"version": "1.1.11",
"description": "Material design text fields",
"authors": [
"The Polymer Authors"
@ -33,7 +33,7 @@
"iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
"iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0",
"iron-input": "PolymerElements/iron-input#^1.0.0",
"paper-styles": "PolymerElements/paper-styles#^1.1.0",
"paper-styles": "PolymerElements/paper-styles#^1.1.4",
"iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0"
},
"devDependencies": {

View file

@ -13,6 +13,13 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
<link rel="import" href="../iron-behaviors/iron-control-state.html">
<script>
// Generate unique, monotonically increasing IDs for labels (needed by
// aria-labelledby) and add-ons.
Polymer.PaperInputHelper = {};
Polymer.PaperInputHelper.NextLabelID = 1;
Polymer.PaperInputHelper.NextAddonID = 1;
/**
* Use `Polymer.PaperInputBehavior` to implement inputs with `<paper-input-container>`. This
* behavior is implemented by `<paper-input>`. It exposes a number of properties from
@ -24,6 +31,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
* @polymerBehavior Polymer.PaperInputBehavior
*/
Polymer.PaperInputBehaviorImpl = {
properties: {
/**
* Fired when the input changes due to user interaction.
@ -419,7 +427,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
if (target.id) {
this._ariaDescribedBy = this._appendStringWithSpace(this._ariaDescribedBy, target.id);
} else {
var id = 'paper-input-add-on-' + Math.floor((Math.random() * 100000));
var id = 'paper-input-add-on-' + Polymer.PaperInputHelper.NextAddonID++;
target.id = id;
this._ariaDescribedBy = this._appendStringWithSpace(this._ariaDescribedBy, id);
}
@ -507,7 +515,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
if (label.id) {
labelledBy = label.id;
} else {
labelledBy = 'paper-input-label-' + new Date().getUTCMilliseconds();
labelledBy = 'paper-input-label-' + Polymer.PaperInputHelper.NextLabelID++;
label.id = labelledBy;
}
this._ariaLabelledBy = labelledBy;
@ -525,7 +533,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
});
}
}
};
}
/** @polymerBehavior */
Polymer.PaperInputBehavior = [

View file

@ -25,7 +25,7 @@ For example:
<input is="iron-input">
</paper-input-container>
Do not wrap <paper-input-contanter> around elements that already include it, such as <paper-input>.
Do not wrap `<paper-input-container>` around elements that already include it, such as `<paper-input>`.
Doing so may cause events to bounce infintely between the container and its contained element.
### Listening for input changes

View file

@ -1,4 +1,5 @@
<!DOCTYPE html><!--
@license
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

@ -1,5 +1,6 @@
<!doctype html>
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

@ -1,5 +1,6 @@
<!doctype html>
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

@ -1,5 +1,6 @@
<!doctype html>
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

@ -1,5 +1,6 @@
<!doctype html>
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
@ -108,6 +109,15 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
</template>
</test-fixture>
<test-fixture id="multiple-inputs">
<template>
<paper-input label="one"></paper-input>
<paper-input label="two"></paper-input>
<paper-input label="three"></paper-input>
<paper-input label="four"></paper-input>
</template>
</test-fixture>
<script>
suite('basic', function() {
@ -274,11 +284,24 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
});
suite('a11y', function() {
test('has aria-labelledby, which is monotonically increasing', function() {
var inputs = fixture('multiple-inputs');
test('has aria-labelledby', function() {
var input = fixture('label');
assert.isTrue(input.inputElement.hasAttribute('aria-labelledby'))
assert.equal(input.inputElement.getAttribute('aria-labelledby'), Polymer.dom(input.root).querySelector('label').id, 'aria-labelledby points to the label');
// Find the first index of the input in this fixture. Since the label
// ids monotonically increase every time a new input is created, and
// this fixture isn't the first one in the document, we're going to start
// at an ID > 1.
var firstLabel = Polymer.dom(inputs[0].root).querySelector('label').id;
var index = parseInt(firstLabel.substr(firstLabel.lastIndexOf('-') + 1));
for (var i = 0; i < inputs.length; i++ ) {
var input = inputs[i].inputElement;
var label = Polymer.dom(inputs[i].root).querySelector('label').id;
assert.isTrue(input.hasAttribute('aria-labelledby'));
assert.equal(label, 'paper-input-label-' + (index++));
assert.equal(input.getAttribute('aria-labelledby'), label);
}
});
test('has aria-describedby for error message', function() {

View file

@ -1,5 +1,6 @@
<!doctype html>
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

@ -1,6 +1,6 @@
{
"name": "paper-item",
"version": "1.2.0",
"version": "1.2.1",
"description": "A material-design styled list item",
"authors": [
"The Polymer Authors"
@ -40,11 +40,11 @@
"webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
"iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0"
},
"_release": "1.2.0",
"_release": "1.2.1",
"_resolution": {
"type": "version",
"tag": "v1.2.0",
"commit": "04568bc89c181222d53d8d166aef07708640484f"
"tag": "v1.2.1",
"commit": "1eab91333b318ae19e315866575b2dddd38e6abc"
},
"_source": "git://github.com/PolymerElements/paper-item.git",
"_target": "^1.0.0",

View file

@ -1,5 +1,5 @@
language: node_js
sudo: false
sudo: required
before_script:
- npm install -g bower polylint web-component-tester
- bower install
@ -8,18 +8,16 @@ env:
global:
- secure: NCk3KK+wbaXMzp8XAY6FeL+TSdI0AlPI3/tl0OpsUIaU2EiCjQuzf/UpyzCW5XZMEVFF4q/eDjrPkqJodHfpngj36mpkfmfqj9DrgDmYsV9BDvsTd8KmLsA6H8D6p7Qer+r1JMMB8PvX44vdhQ6GhZD1HFNYK1Ekpt0TkYwWKNw=
- secure: TGgUEQe6FJS+GuYk94d//8YQmDLUu0ekMvPSIs8TQ2QkdBK4SL+2bSXZt44BbDEOwc9P4NCPSUx/RMiCAqsc5OGRJImzb/zqPNIDTeKG6q72HPBBBD3Sk0CrEpTQbOK/Flaa/B7RYR0U1kuljSmRS7lPG19nnY8gOHnIAgwIyk0=
- CXX=g++-4.8
node_js: stable
addons:
firefox: latest
apt:
sources:
- google-chrome
- ubuntu-toolchain-r-test
packages:
- google-chrome-stable
- g++-4.8
sauce_connect: true
script:
- xvfb-run wct
- "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi"
dist: trusty

View file

@ -1,6 +1,6 @@
{
"name": "paper-item",
"version": "1.2.0",
"version": "1.2.1",
"description": "A material-design styled list item",
"authors": [
"The Polymer Authors"

View file

@ -11,7 +11,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
<link rel="import" href="../paper-styles/color.html">
<link rel="import" href="../paper-styles/default-theme.html">
<llink rel="import" href="../paper-styles/typography.html">
<link rel="import" href="../paper-styles/typography.html">
<dom-module id="paper-item-shared-styles">
<template>

View file

@ -26,14 +26,14 @@
"web-component-tester": "*"
},
"private": true,
"homepage": "https://github.com/polymer/polymer",
"homepage": "https://github.com/Polymer/polymer",
"_release": "1.4.0",
"_resolution": {
"type": "version",
"tag": "v1.4.0",
"commit": "11c987b2eb3c73b388a79fc8aaea8ca01624f514"
},
"_source": "git://github.com/polymer/polymer.git",
"_source": "git://github.com/Polymer/polymer.git",
"_target": "^1.0.0",
"_originalSource": "polymer/polymer"
"_originalSource": "Polymer/polymer"
}

View file

@ -769,7 +769,7 @@ prevent = dy > dx;
prevent = dx > dy;
}
if (prevent) {
//ev.preventDefault();
ev.preventDefault();
} else {
Gestures.prevent('track');
}

View file

@ -1,7 +1,7 @@
{
"name": "webcomponentsjs",
"main": "webcomponents.js",
"version": "0.7.21",
"version": "0.7.22",
"homepage": "http://webcomponents.org",
"authors": [
"The Polymer Authors"
@ -18,13 +18,13 @@
"devDependencies": {
"web-component-tester": "^4.0.1"
},
"_release": "0.7.21",
"_release": "0.7.22",
"_resolution": {
"type": "version",
"tag": "v0.7.21",
"commit": "19ffcd921e1aef84b55f515b00eb56e8e9116126"
"tag": "v0.7.22",
"commit": "50f9751f8e638301603aebb33ba9f1e90d2b0d32"
},
"_source": "git://github.com/Polymer/webcomponentsjs.git",
"_source": "https://github.com/Polymer/webcomponentsjs.git",
"_target": "^0.7.20",
"_originalSource": "webcomponentsjs"
}

View file

@ -7,7 +7,7 @@
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
// @version 0.7.21
// @version 0.7.22
if (typeof WeakMap === "undefined") {
(function() {
var defineProperty = Object.defineProperty;
@ -778,6 +778,9 @@ window.CustomElements.addModule(function(scope) {
definition.prototype = Object.create(HTMLElement.prototype);
}
definition.__name = name.toLowerCase();
if (definition.extends) {
definition.extends = definition.extends.toLowerCase();
}
definition.lifecycle = definition.lifecycle || {};
definition.ancestry = ancestry(definition.extends);
resolveTagName(definition);
@ -950,21 +953,6 @@ window.CustomElements.addModule(function(scope) {
}
wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode");
wrapDomMethodToForceUpgrade(document, "importNode");
if (isIE) {
(function() {
var importNode = document.importNode;
document.importNode = function() {
var n = importNode.apply(document, arguments);
if (n.nodeType == n.DOCUMENT_FRAGMENT_NODE) {
var f = document.createDocumentFragment();
f.appendChild(n);
return f;
} else {
return n;
}
};
})();
}
document.registerElement = register;
document.createElement = createElement;
document.createElementNS = createElementNS;

File diff suppressed because one or more lines are too long

View file

@ -7,7 +7,7 @@
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
// @version 0.7.21
// @version 0.7.22
if (typeof WeakMap === "undefined") {
(function() {
var defineProperty = Object.defineProperty;

File diff suppressed because one or more lines are too long

View file

@ -7,7 +7,7 @@
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
// @version 0.7.21
// @version 0.7.22
if (typeof WeakMap === "undefined") {
(function() {
var defineProperty = Object.defineProperty;

File diff suppressed because one or more lines are too long

View file

@ -7,7 +7,7 @@
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
// @version 0.7.21
// @version 0.7.22
if (typeof WeakMap === "undefined") {
(function() {
var defineProperty = Object.defineProperty;

File diff suppressed because one or more lines are too long

View file

@ -1,7 +1,7 @@
{
"name": "webcomponentsjs",
"main": "webcomponents.js",
"version": "0.7.21",
"version": "0.7.22",
"homepage": "http://webcomponents.org",
"authors": [
"The Polymer Authors"

View file

@ -1,6 +1,6 @@
{
"name": "webcomponents.js",
"version": "0.7.21",
"version": "0.7.22",
"description": "webcomponents.js",
"main": "webcomponents.js",
"directories": {

View file

@ -7,7 +7,7 @@
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
// @version 0.7.21
// @version 0.7.22
(function() {
window.WebComponents = window.WebComponents || {
flags: {}
@ -914,14 +914,29 @@ if (typeof WeakMap === "undefined") {
(function() {
var needsTemplate = typeof HTMLTemplateElement === "undefined";
if (/Trident/.test(navigator.userAgent)) {
(function() {
var importNode = document.importNode;
document.importNode = function() {
var n = importNode.apply(document, arguments);
if (n.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
var f = document.createDocumentFragment();
f.appendChild(n);
return f;
} else {
return n;
}
};
})();
}
var needsCloning = function() {
if (!needsTemplate) {
var frag = document.createDocumentFragment();
var t = document.createElement("template");
frag.appendChild(t);
t.content.appendChild(document.createElement("div"));
var clone = frag.cloneNode(true);
return clone.firstChild.content.childNodes.length === 0;
var t2 = document.createElement("template");
t2.content.appendChild(document.createElement("div"));
t.content.appendChild(t2);
var clone = t.cloneNode(true);
return clone.content.childNodes.length === 0 || clone.content.firstChild.content.childNodes.length === 0;
}
}();
var TEMPLATE_TAG = "template";
@ -943,6 +958,9 @@ if (typeof WeakMap === "undefined") {
while (child = template.firstChild) {
template.content.appendChild(child);
}
template.cloneNode = function(deep) {
return TemplateImpl.cloneNode(this, deep);
};
if (canDecorate) {
try {
Object.defineProperty(template, "innerHTML", {
@ -965,9 +983,6 @@ if (typeof WeakMap === "undefined") {
},
configurable: true
});
template.cloneNode = function(deep) {
return TemplateImpl.cloneNode(this, deep);
};
} catch (err) {
canDecorate = false;
}
@ -987,7 +1002,7 @@ if (typeof WeakMap === "undefined") {
document.createElement = function() {
"use strict";
var el = createElement.apply(document, arguments);
if (el.localName == "template") {
if (el.localName === "template") {
TemplateImpl.decorate(el);
}
return el;
@ -1015,7 +1030,7 @@ if (typeof WeakMap === "undefined") {
if (needsTemplate || needsCloning) {
var nativeCloneNode = Node.prototype.cloneNode;
TemplateImpl.cloneNode = function(template, deep) {
var clone = nativeCloneNode.call(template);
var clone = nativeCloneNode.call(template, false);
if (this.decorate) {
this.decorate(clone);
}
@ -1026,6 +1041,7 @@ if (typeof WeakMap === "undefined") {
return clone;
};
TemplateImpl.fixClonedDom = function(clone, source) {
if (!source.querySelectorAll) return;
var s$ = source.querySelectorAll(TEMPLATE_TAG);
var t$ = clone.querySelectorAll(TEMPLATE_TAG);
for (var i = 0, l = t$.length, t, s; i < l; i++) {
@ -1063,7 +1079,7 @@ if (typeof WeakMap === "undefined") {
}
}
if (needsTemplate) {
HTMLTemplateElement = TemplateImpl;
window.HTMLTemplateElement = TemplateImpl;
}
})();
@ -2231,6 +2247,9 @@ window.CustomElements.addModule(function(scope) {
definition.prototype = Object.create(HTMLElement.prototype);
}
definition.__name = name.toLowerCase();
if (definition.extends) {
definition.extends = definition.extends.toLowerCase();
}
definition.lifecycle = definition.lifecycle || {};
definition.ancestry = ancestry(definition.extends);
resolveTagName(definition);
@ -2403,21 +2422,6 @@ window.CustomElements.addModule(function(scope) {
}
wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode");
wrapDomMethodToForceUpgrade(document, "importNode");
if (isIE) {
(function() {
var importNode = document.importNode;
document.importNode = function() {
var n = importNode.apply(document, arguments);
if (n.nodeType == n.DOCUMENT_FRAGMENT_NODE) {
var f = document.createDocumentFragment();
f.appendChild(n);
return f;
} else {
return n;
}
};
})();
}
document.registerElement = register;
document.createElement = createElement;
document.createElementNS = createElementNS;

File diff suppressed because one or more lines are too long

View file

@ -7,7 +7,7 @@
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
// @version 0.7.21
// @version 0.7.22
(function() {
window.WebComponents = window.WebComponents || {
flags: {}
@ -6930,6 +6930,9 @@ window.CustomElements.addModule(function(scope) {
definition.prototype = Object.create(HTMLElement.prototype);
}
definition.__name = name.toLowerCase();
if (definition.extends) {
definition.extends = definition.extends.toLowerCase();
}
definition.lifecycle = definition.lifecycle || {};
definition.ancestry = ancestry(definition.extends);
resolveTagName(definition);
@ -7102,21 +7105,6 @@ window.CustomElements.addModule(function(scope) {
}
wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode");
wrapDomMethodToForceUpgrade(document, "importNode");
if (isIE) {
(function() {
var importNode = document.importNode;
document.importNode = function() {
var n = importNode.apply(document, arguments);
if (n.nodeType == n.DOCUMENT_FRAGMENT_NODE) {
var f = document.createDocumentFragment();
f.appendChild(n);
return f;
} else {
return n;
}
};
})();
}
document.registerElement = register;
document.createElement = createElement;
document.createElementNS = createElementNS;

File diff suppressed because one or more lines are too long

View file

@ -7,7 +7,7 @@
<p>${CinemaModeConfigurationHelp}</p>
<div style="margin-top: 2em;">
<div class="paperCheckboxListLabel">${LabelEnableCinemaModeFor}</div>
<div class="paperListLabel">${LabelEnableCinemaModeFor}</div>
<div class="paperCheckboxList">
<paper-checkbox class="chkMovies">${OptionMovies}</paper-checkbox>
<paper-checkbox class="chkEpisodes">${OptionEpisodes}</paper-checkbox>
@ -15,7 +15,7 @@
</div>
<br />
<div>
<div class="paperCheckboxListLabel">${LabelSelectInternetTrailersForCinemaMode}</div>
<div class="paperListLabel">${LabelSelectInternetTrailersForCinemaMode}</div>
<div class="paperCheckboxList">
<paper-checkbox class="chkUpcomingTheaterTrailers">${OptionUpcomingMoviesInTheaters}</paper-checkbox>
<paper-checkbox class="chkUpcomingDvdTrailers">${OptionUpcomingDvdMovies}</paper-checkbox>

View file

@ -59,7 +59,7 @@
<paper-checkbox class="chkAllTuners">${OptionEnableForAllTuners}</paper-checkbox>
<div class="selectTunersSection hide">
<br /><br />
<div class="paperCheckboxListLabel">${HeaderTuners}</div>
<div class="paperListLabel">${HeaderTuners}</div>
<div class="paperCheckboxList paperList tunerList">
</div>
</div>

View file

@ -779,11 +779,28 @@ paper-input + .fieldDescription {
}
.mainDrawerPanel:not([narrow]) .content-primary {
padding: 110px 1.5em 3em 3em;
padding-top: 110px;
padding-bottom: 3em;
}
@media all and (min-width: 800px) {
.mainDrawerPanel:not([narrow]) .content-primary {
padding-right: 1.5em;
padding-left: 1.5em;
}
}
@media all and (min-width: 1200px) {
.mainDrawerPanel:not([narrow]) .content-primary {
padding-right: 1.5em;
padding-left: 3em;
}
}
.mainDrawerPanel:not([narrow]) .withTabs .content-primary {
padding-top: 135px!important;
padding-top: 135px !important;
}
.mainDrawerPanel:not([narrow]) .content-primary ul:first-child {

View file

@ -71,7 +71,7 @@
<br />
<ul data-role="listview" class="ulForm" style="margin-bottom:0!important;">
<li>
<div class="paperCheckboxListLabel">${HeaderExtractChapterImagesFor}</div>
<div class="paperListLabel">${HeaderExtractChapterImagesFor}</div>
<div class="paperCheckboxList">
<paper-checkbox id="chkChaptersMovies">${OptionMovies}</paper-checkbox>
@ -103,7 +103,7 @@
<br />
<ul data-role="listview" class="ulForm">
<li>
<div class="paperCheckboxListLabel">${HeaderDownloadPeopleMetadataFor}</div>
<div class="paperListLabel">${HeaderDownloadPeopleMetadataFor}</div>
<div class="paperCheckboxList">
<paper-checkbox id="chkPeopleActors">${OptionActors}</paper-checkbox>

View file

@ -43,7 +43,7 @@
</div>
</div>
<div class="paperCheckboxListLabel">${HeaderFetchImages}</div>
<div class="paperListLabel">${HeaderFetchImages}</div>
<div class="imageSelections paperCheckboxList">
<paper-checkbox class="imageType hide" data-imagetype="Primary">${OptionDownloadPrimaryImage}</paper-checkbox>

View file

@ -10,14 +10,14 @@
<input type="text" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" />
</div>
<div class="paperCheckboxListLabel">${HeaderDownloadSubtitlesFor}</div>
<div class="paperListLabel">${HeaderDownloadSubtitlesFor}</div>
<div class="paperCheckboxList">
<paper-checkbox id="chkSubtitlesMovies">${OptionMovies}</paper-checkbox>
<paper-checkbox id="chkSubtitlesEpisodes">${OptionEpisodes}</paper-checkbox>
</div>
<br />
<div>
<div class="paperCheckboxListLabel">${LabelDownloadLanguages}</div>
<div class="paperListLabel">${LabelDownloadLanguages}</div>
<div class="downloadLanguages paperList paperCheckboxList" style="max-height: 150px; overflow-y: auto; padding: .5em 1em;">
</div>
</div>

View file

@ -14,7 +14,7 @@
</ul>
<div class="monitorUsers" style="display: none;">
<div class="paperCheckboxListLabel">${LabelMonitorUsers}</div>
<div class="paperListLabel">${LabelMonitorUsers}</div>
<div class="monitorUsersList">
</div>
<br />

View file

@ -21,7 +21,7 @@
var html = '';
html += '<div class="paperCheckboxListLabel">';
html += '<div class="paperListLabel">';
html += Globalize.translate('LabelEnableCameraUploadFor');
html += '</div>';

View file

@ -59,7 +59,13 @@
if (item.PremiereDate) {
try {
dateText = LibraryBrowser.getFutureDateText(parseISO8601Date(item.PremiereDate, { toLocal: true }), true);
var premiereDate = parseISO8601Date(item.PremiereDate, { toLocal: true });
if (premiereDate.getDate() == new Date().getDate() - 1) {
dateText = Globalize.translate('Yesterday');
} else {
dateText = LibraryBrowser.getFutureDateText(premiereDate, true);
}
} catch (err) {
}

View file

@ -1157,6 +1157,16 @@
ironIcon: 'call-merge'
});
items.push({
name: Globalize.translate('MarkPlayed'),
id: 'markplayed'
});
items.push({
name: Globalize.translate('MarkUnplayed'),
id: 'markunplayed'
});
items.push({
name: Globalize.translate('ButtonRefresh'),
id: 'refresh',
@ -1203,6 +1213,18 @@
case 'groupvideos':
combineVersions($.mobile.activePage, items);
break;
case 'markplayed':
items.forEach(function(itemId) {
ApiClient.markPlayed(Dashboard.getCurrentUserId(), itemId);
});
hideSelections();
break;
case 'markunplayed':
items.forEach(function (itemId) {
ApiClient.markUnplayed(Dashboard.getCurrentUserId(), itemId);
});
hideSelections();
break;
case 'refresh':
items.map(function (itemId) {

View file

@ -996,7 +996,7 @@
// add a delay to continue building up the buffer. without this we see failures in safari mobile
setTimeout(function () {
self.playVideoInternal(item, mediaSource, startPosition, streamInfo, callback);
}, 2000);
}, 0);
}, function () {
Dashboard.hideLoadingMsg();

View file

@ -150,7 +150,7 @@
var i, length, plugin, id;
html += '<div class="paperCheckboxListLabel">' + Globalize.translate('LabelImageFetchers') + '</div>';
html += '<div class="paperListLabel">' + Globalize.translate('LabelImageFetchers') + '</div>';
html += '<div class="paperList">';
for (i = 0, length = plugins.length; i < length; i++) {
@ -220,7 +220,7 @@
return;
}
html += '<div class="paperCheckboxListLabel">' + Globalize.translate('LabelMetadataSavers') + '</div>';
html += '<div class="paperListLabel">' + Globalize.translate('LabelMetadataSavers') + '</div>';
html += '<div class="paperCheckboxList paperList">';
for (var i = 0, length = plugins.length; i < length; i++) {
@ -253,7 +253,7 @@
var i, length, plugin;
html += '<div class="paperCheckboxListLabel">' + Globalize.translate('LabelMetadataDownloaders') + '</div>';
html += '<div class="paperListLabel">' + Globalize.translate('LabelMetadataDownloaders') + '</div>';
html += '<div class="paperList">';
for (i = 0, length = plugins.length; i < length; i++) {
@ -323,7 +323,7 @@
return;
}
html += '<div class="paperCheckboxListLabel">' + Globalize.translate('LabelMetadataReaders') + '</div>';
html += '<div class="paperListLabel">' + Globalize.translate('LabelMetadataReaders') + '</div>';
html += '<div class="paperList">';
for (var i = 0, length = plugins.length; i < length; i++) {

View file

@ -179,7 +179,7 @@
}
var cacheKey = 'lastappinfopresent5';
if ((new Date().getTime() - parseInt(appSettings.get(cacheKey) || '0')) < 172800000) {
if ((new Date().getTime() - parseInt(appSettings.get(cacheKey) || '0')) < 86400000) {
return Promise.resolve('');
}

View file

@ -62,7 +62,13 @@
if (item.PremiereDate) {
try {
dateText = LibraryBrowser.getFutureDateText(parseISO8601Date(item.PremiereDate, { toLocal: true }), true);
var premiereDate = parseISO8601Date(item.PremiereDate, { toLocal: true });
if (premiereDate.getDate() == new Date().getDate() - 1) {
dateText = Globalize.translate('Yesterday');
} else {
dateText = LibraryBrowser.getFutureDateText(premiereDate, true);
}
} catch (err) {
}

View file

@ -4,7 +4,7 @@
var html = '';
html += '<div class="paperCheckboxListLabel">' + Globalize.translate('HeaderLibraries') + '</div>';
html += '<div class="paperListLabel">' + Globalize.translate('HeaderLibraries') + '</div>';
html += '<div class="paperCheckboxList paperList">';
@ -29,7 +29,7 @@
var html = '';
html += '<div class="paperCheckboxListLabel">' + Globalize.translate('HeaderChannels') + '</div>';
html += '<div class="paperListLabel">' + Globalize.translate('HeaderChannels') + '</div>';
html += '<div class="paperCheckboxList paperList">';
@ -60,7 +60,7 @@
var html = '';
html += '<div class="paperCheckboxListLabel">' + Globalize.translate('HeaderDevices') + '</div>';
html += '<div class="paperListLabel">' + Globalize.translate('HeaderDevices') + '</div>';
html += '<div class="paperCheckboxList paperList">';

View file

@ -4,7 +4,7 @@
var html = '';
html += '<div class="paperCheckboxListLabel">' + Globalize.translate('HeaderLibraries') + '</div>';
html += '<div class="paperListLabel">' + Globalize.translate('HeaderLibraries') + '</div>';
html += '<div class="paperCheckboxList paperList" style="padding:.5em 1em;">';
@ -28,7 +28,7 @@
var html = '';
html += '<div class="paperCheckboxListLabel">' + Globalize.translate('HeaderChannels') + '</div>';
html += '<div class="paperListLabel">' + Globalize.translate('HeaderChannels') + '</div>';
html += '<div class="paperCheckboxList paperList" style="padding:.5em 1em;">';

View file

@ -55,7 +55,7 @@
var html = '';
html += '<p class="paperCheckboxListLabel">' + Globalize.translate('HeaderBlockItemsWithNoRating') + '</p>';
html += '<p class="paperListLabel">' + Globalize.translate('HeaderBlockItemsWithNoRating') + '</p>';
html += '<div class="paperCheckboxList">';

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "\u062e\u0631\u0648\u062c",
"LabelVisitCommunity": "\u0632\u064a\u0627\u0631\u0629 \u0627\u0644\u0645\u062c\u062a\u0645\u0639",
"LabelGithub": "\u062c\u064a\u062a \u0647\u0628",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "\u0418\u0437\u0445\u043e\u0434",
"LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0442\u0438 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u0442\u043e",
"LabelGithub": "Github",

View file

@ -41,7 +41,7 @@
"ButtonTermsOfService": "Termes del Servei",
"HeaderDeveloperOptions": "Opcions de desenvolupador",
"OptionEnableWebClientResponseCache": "Habilita mem\u00f2ria cau al web",
"OptionDisableForDevelopmentHelp": "Configure these as needed for web development purposes.",
"OptionDisableForDevelopmentHelp": "Configura'ls com necessitis per a desenvolupament web.",
"OptionEnableWebClientResourceMinification": "Habilita la reducci\u00f3 de recursos al web",
"LabelDashboardSourcePath": "Directori del codi font del client web:",
"LabelDashboardSourcePathHelp": "Si executes el servidor des del codi font, especifica el directori de l'UI del tauler de control. Tots els fitxers del client web se serviran des d'aquesta ubicaci\u00f3.",
@ -76,7 +76,7 @@
"ButtonConfigurePinCode": "Configura codi pin",
"HeaderAdultsReadHere": "Adults Llegiu Aqu\u00ed!",
"RegisterWithPayPal": "Registra amb PayPal",
"HeaderEnjoyDayTrial": "Gaudiu una Prova Gratu\u00efta de 14 Dies",
"HeaderEnjoyDayTrial": "Gaudeix una Prova Gratu\u00efta de 14 Dies",
"LabelSyncTempPath": "Directori de fitxers temporals:",
"LabelSyncTempPathHelp": "Especifica un directori de treball personalitzat per al sync. Els multim\u00e8dia convertits durant el proc\u00e9s de sincronitzaci\u00f3 es desaran aqu\u00ed.",
"LabelCustomCertificatePath": "Directori del certificat personalitzat:",
@ -88,7 +88,7 @@
"LabelEnterConnectUserNameHelp": "Aquest \u00e9s l'usuari o e-mail del teu compte en l\u00ednia d'Emby.",
"LabelEnableEnhancedMovies": "Habilita la visualitzaci\u00f3 millorada de pel\u00b7l\u00edcules",
"LabelEnableEnhancedMoviesHelp": "Si s'habilita, les pel\u00b7l\u00edcules es mostraran com a directoris per a incloure tr\u00e0ilers, extres, elenc i equip i qualsevol altre contingut relacionat.",
"HeaderSyncJobInfo": "Sync Job",
"HeaderSyncJobInfo": "Feina del Sync",
"FolderTypeMixed": "Contingut mesclat",
"FolderTypeMovies": "Pel\u00b7l\u00edcules",
"FolderTypeMusic": "M\u00fasica",
@ -535,7 +535,7 @@
"LabelPreferredDisplayLanguageHelp": "La traducci\u00f3 d'Emby \u00e9s un projecte en curs.",
"LabelReadHowYouCanContribute": "Apr\u00e8n com pots contribuir.",
"HeaderNewCollection": "Nova Col\u00b7lecci\u00f3",
"ButtonSubmit": "Submit",
"ButtonSubmit": "Envia",
"ButtonCreate": "Crea",
"LabelCustomCss": "CSS propi:",
"LabelCustomCssHelp": "Aplica el teu propi css a la interf\u00edcie web.",
@ -567,7 +567,7 @@
"TabActivityLog": "Registre d'Activitat",
"TabSmartMatches": "Smart Matches",
"TabSmartMatchInfo": "Manage your smart matches that were added using the Auto-Organize correction dialog",
"HeaderName": "Name",
"HeaderName": "Nom",
"HeaderDate": "Data",
"HeaderSource": "Origen",
"HeaderStatus": "Estat",
@ -1544,8 +1544,8 @@
"MessageKeyEmailedTo": "Key emailed to {0}.",
"MessageKeysLinked": "Keys linked.",
"HeaderConfirmation": "Confirmation",
"MessageKeyUpdated": "Thank you. Your Emby Premiere key has been updated.",
"MessageKeyRemoved": "Thank you. Your Emby Premiere key has been removed.",
"MessageKeyUpdated": "Gr\u00e0cies. La teva clau Emby Premiere ha estat actualitzada.",
"MessageKeyRemoved": "Gr\u00e0cies. La teva clau Emby Premiere ha estat eliminada.",
"TextEnjoyBonusFeatures": "Gaudeix de caracter\u00edstiques addicionals",
"ButtonCancelSyncJob": "Cancel\u00b7la sync",
"HeaderAddTag": "Afegir Etiqueta",
@ -1585,7 +1585,7 @@
"LabelEpisode": "Episode",
"Series": "Series",
"LabelStopping": "Stopping",
"LabelCancelled": "(cancel\u00b7lat)",
"LabelCancelled": "Cancel\u00b7lat",
"ButtonDownload": "Descarrega",
"SyncJobStatusQueued": "Queued",
"SyncJobStatusConverting": "Converting",
@ -2085,8 +2085,8 @@
"TabExpert": "Expert",
"HeaderSelectCustomIntrosPath": "Select Custom Intros Path",
"HeaderRateAndReview": "Rate and Review",
"HeaderThankYou": "Thank You",
"MessageThankYouForYourReview": "Thank you for your review.",
"HeaderThankYou": "Gr\u00e0cies",
"MessageThankYouForYourReview": "Gr\u00e0cies per la teva valoraci\u00f3.",
"LabelYourRating": "Your rating:",
"LabelFullReview": "Full review:",
"LabelShortRatingDescription": "Short rating summary:",
@ -2295,7 +2295,7 @@
"PleaseConfirmPluginInstallation": "Please click OK to confirm you've read the above and wish to proceed with the plugin installation.",
"MessagePluginInstallDisclaimer": "Plugins built by Emby community members are a great way to enhance your Emby experience with additional features and benefits. Before installing, please be aware of the effects they may have on your Emby Server, such as longer library scans, additional background processing, and decreased system stability.",
"ButtonPlayOneMinute": "Play one minute",
"ThankYouForTryingEnjoyOneMinute": "Please enjoy one minute of playback. Thank you for trying Emby.",
"ThankYouForTryingEnjoyOneMinute": "Si et plau, gaudeix d'un minut de reproducci\u00f3. Gr\u00e0cies per provar Emby.",
"HeaderTryPlayback": "Try Playback",
"HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere",
"MobileSyncFeatureDescription": "Sync your media to your smart phones and tablets for easy offline access.",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Zav\u0159\u00edt",
"LabelVisitCommunity": "Nav\u0161t\u00edvit komunitu",
"LabelGithub": "Github",
@ -8,7 +10,7 @@
"LabelDeveloperResources": "Zdroje v\u00fdvoj\u00e1\u0159\u016f",
"LabelBrowseLibrary": "Proch\u00e1zet knihovnu",
"LabelConfigureServer": "Konfigurovat Emby",
"LabelOpenLibraryViewer": "Otev\u0159\u00edt knihovnu",
"LabelOpenLibraryViewer": "Otev\u0159\u00edt prohl\u00ed\u017ee\u010d knihovny",
"LabelRestartServer": "Restartovat server",
"LabelShowLogWindow": "Zobrazit okno \u017eurn\u00e1lu",
"LabelPrevious": "P\u0159edchoz\u00ed",
@ -227,7 +229,7 @@
"OptionResumable": "Pozastavaviteln\u00fd",
"ScheduledTasksHelp": "Klikn\u011bte na \u00falohu pro zobrazen\u00ed rozvrhu.",
"ScheduledTasksTitle": "Rozvrh \u00faloh",
"TabMyPlugins": "Moje pluginy",
"TabMyPlugins": "Moje z\u00e1suvn\u00e9 moduly",
"TabCatalog": "Katalog",
"TitlePlugins": "Z\u00e1suvn\u00e9 moduly",
"HeaderAutomaticUpdates": "Automatick\u00e9 aktualizace",
@ -335,7 +337,7 @@
"LabelAllowServerAutoRestartHelp": "Server se restartuje pouze v p\u0159\u00edpad\u011b, \u017ee \u017e\u00e1dn\u00fd z u\u017eivatel\u016f nen\u00ed aktivn\u00ed-",
"LabelEnableDebugLogging": "Povolit z\u00e1znam pro lad\u011bn\u00ed",
"LabelRunServerAtStartup": "Spustit server p\u0159i startu",
"LabelRunServerAtStartupHelp": "Toto spust\u00ed ikonu v oznamovac\u00ed oblasti. Pro spu\u0161t\u011bn\u00ed slu\u017eby Windows tuto polo\u017eku ponechte od\u0161krtnutou a spus\u0165te slu\u017ebu z ovl\u00e1dac\u00edch panel\u016f. Pros\u00edm berte na v\u011bdom\u00ed \u017ee nemohou b\u011b\u017eet souvisle, bude pot\u0159eba ukon\u010dit program v oznamovac\u00ed oblasti panelu.",
"LabelRunServerAtStartupHelp": "Toto spust\u00ed ikonu v oznamovac\u00ed oblasti. Pro spu\u0161t\u011bn\u00ed pomoc\u00ed slu\u017eeb Windows tuto polo\u017eku ponechte od\u0161krtnutou a spus\u0165te slu\u017ebu z ovl\u00e1dac\u00edch panel\u016f. Pros\u00edm vezm\u011bte na v\u011bdom\u00ed, \u017ee nemohou b\u011b\u017eet 2 instance serveru z\u00e1rove\u0148, bude pot\u0159eba ukon\u010dit program v oznamovac\u00ed oblasti panelu.",
"ButtonSelectDirectory": "Vybrat slo\u017eku",
"LabelCustomPaths": "Specifikujte adres\u00e1\u0159. Nechte pr\u00e1zdn\u00e9 pro defaultn\u00ed nastaven\u00ed.",
"LabelCachePath": "Slo\u017eka pro cache:",
@ -421,7 +423,7 @@
"OptionAutomatic": "Automaticky",
"HeaderServices": "Slu\u017eby",
"LiveTvPluginRequired": "P\u0159ed pokra\u010dov\u00e1n\u00edm je vy\u017eadov\u00e1n z\u00e1suvn\u00fd modul Live TV poskytovatele.",
"LiveTvPluginRequiredHelp": "Pros\u00edm nainstalujte jeden z dostupn\u00fdch plugin\u016f, jako Next PVR nebo ServerWmc",
"LiveTvPluginRequiredHelp": "Pros\u00edm nainstalujte jeden z dostupn\u00fdch z\u00e1suvn\u00fdch modul\u016f, jako Next PVR nebo ServerWmc",
"LabelCustomizeOptionsPerMediaType": "P\u0159izp\u016fsoben\u00ed pro typ m\u00e9dia:",
"OptionDownloadThumbImage": "Miniatura",
"OptionDownloadMenuImage": "Nab\u00eddka",
@ -540,7 +542,7 @@
"LabelCustomCss": "Vlastn\u00ed css:",
"LabelCustomCssHelp": "Aplikovat va\u0161e u\u017eivatelsk\u00e9 \u00fapravy CSS do webov\u00e9ho rozhran\u00ed.",
"LabelLocalHttpServerPortNumber": "Lok\u00e1ln\u00ed http port:",
"LabelLocalHttpServerPortNumberHelp": "Tcp port, se kter\u00fdm Emby http server by m\u011bl b\u00fdt sv\u00e1z\u00e1n.",
"LabelLocalHttpServerPortNumberHelp": "Tcp port, se kter\u00fdm by Emby http server m\u011bl b\u00fdt sv\u00e1z\u00e1n.",
"LabelPublicHttpPort": "Ve\u0159ejn\u00fd http port:",
"LabelPublicHttpPortHelp": "Ve\u0159ejn\u00fd port, na kter\u00fd by m\u011bl b\u00fdt mapov\u00e1n lok\u00e1ln\u00ed http port.",
"LabelPublicHttpsPort": "Ve\u0159ejn\u00fd https port:",
@ -548,10 +550,10 @@
"LabelEnableHttps": "Https uv\u00e1d\u011bt jako extern\u00ed adresu",
"LabelEnableHttpsHelp": "Pokud povol\u00edte, server bude uv\u00e1d\u011bt https URL klient\u016fm jako extern\u00ed adresu.",
"LabelHttpsPort": "Lok\u00e1ln\u00ed https port:",
"LabelHttpsPortHelp": "Tcp port, se kter\u00fdm Emby https server by m\u011bl b\u00fdt sv\u00e1z\u00e1n.",
"LabelHttpsPortHelp": "Tcp port, se kter\u00fdm by Emby https server m\u011bl b\u00fdt sv\u00e1z\u00e1n.",
"LabelWebSocketPortNumber": "\u010c\u00edslo portu web socketu:",
"LabelEnableAutomaticPortMap": "Povolit automatick\u00e9 mapov\u00e1n\u00ed port\u016f",
"LabelEnableAutomaticPortMapHelp": "Pokuste se automaticky mapovat ve\u0159ejn\u00fd port m\u00edstn\u00edho portu p\u0159es UPnP. Nemus\u00ed fungovat u n\u011bkter\u00fdch model\u016f routeru.",
"LabelEnableAutomaticPortMapHelp": "Pokus\u00ed se automaticky namapovat ve\u0159ejn\u00fd port m\u00edstn\u00edho portu p\u0159es UPnP na va\u0161em routeru. Nemus\u00ed fungovat u n\u011bkter\u00fdch model\u016f routeru.",
"LabelExternalDDNS": "Extern\u00ed WAN adresa",
"LabelExternalDDNSHelp": "M\u00e1te-li dynamick\u00e9 DNS zadejte jej zde. Emby aplikace jej vyu\u017eij\u00ed p\u0159i vzd\u00e1len\u00e9m p\u0159ipojen\u00ed. Nechte pr\u00e1zdn\u00e9 pro automatickou detekci.",
"TabResume": "P\u0159eru\u0161it",
@ -683,7 +685,7 @@
"NotificationOptionNewLibraryContentMultiple": "P\u0159id\u00e1n nov\u00fd obsah (v\u00edcen\u00e1sobn\u00fd)",
"NotificationOptionCameraImageUploaded": "Kamerov\u00fd z\u00e1znam nahr\u00e1n",
"NotificationOptionUserLockedOut": "U\u017eivatel uzam\u010den",
"HeaderSendNotificationHelp": "Ozn\u00e1men\u00ed jsou doru\u010dena do va\u0161\u00ed e-mailov\u00e9 schr\u00e1nky Emby. Dal\u0161\u00ed mo\u017enosti lze instalovat z karty Slu\u017eby.",
"HeaderSendNotificationHelp": "Ozn\u00e1men\u00ed jsou doru\u010dena do va\u0161\u00ed e-mailov\u00e9 schr\u00e1nky Emby. Dal\u0161\u00ed nastaven\u00ed lze instalovat z karty Slu\u017eby.",
"NotificationOptionServerRestartRequired": "Je vy\u017eadov\u00e1n restart serveru",
"LabelNotificationEnabled": "Povolit toto ozn\u00e1men\u00ed",
"LabelMonitorUsers": "Sledov\u00e1n\u00ed aktivity z:",
@ -827,7 +829,7 @@
"OptionReportByteRangeSeekingWhenTranscodingHelp": "Tento krok je nutn\u00fd pro n\u011bkter\u00e1 za\u0159\u00edzen\u00ed, kter\u00e9 nemaj\u00ed moc dobr\u00fd time seek.",
"HeaderDownloadSubtitlesFor": "St\u00e1hnout titulky pro:",
"MessageNoChapterProviders": "Nainstalujte z\u00e1suvn\u00fd modul poskytovatele kapitol jako nap\u0159. ChapterDb pro povolen\u00ed dal\u0161\u00edch mo\u017enost\u00ed konfigurace kapitol.",
"LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains embedded subtitles",
"LabelSkipIfGraphicalSubsPresent": "P\u0159esko\u010dit, jestli\u017ee video obsahuje vlo\u017een\u00e9 titulky",
"LabelSkipIfGraphicalSubsPresentHelp": "Udr\u017een\u00edm textov\u00fdch verz\u00ed titulk\u016f bude m\u00edt za n\u00e1sledek efektivn\u011bj\u0161\u00ed dod\u00e1vku a sn\u00ed\u017e\u00ed t\u00edm pravd\u011bpodobnost p\u0159ek\u00f3dov\u00e1n\u00ed videa.",
"TabSubtitles": "Titulky",
"TabChapters": "Kapitoly",
@ -1278,9 +1280,9 @@
"LabelDateAddedBehaviorHelp": "Pokud je hodnota metadat p\u0159\u00edtomna, bude v\u017edy pou\u017eita p\u0159ed n\u011bkterou z t\u011bchto mo\u017enost\u00ed.",
"LabelNumberTrailerToPlay": "Po\u010det p\u0159ehr\u00e1van\u00fdch trailer\u016f:",
"TitleDevices": "Za\u0159\u00edzen\u00ed",
"TabCameraUpload": "Upload z fotoapar\u00e1tu",
"TabCameraUpload": "Nahr\u00e1t z fotoapar\u00e1tu",
"TabDevices": "Za\u0159\u00edzen\u00ed",
"HeaderCameraUploadHelp": "Automaticky nahr\u00e1vat fotografie a videa po\u0159\u00edzen\u00e9 z va\u0161ich mobiln\u00edch za\u0159\u00edzen\u00ed do Emby.",
"HeaderCameraUploadHelp": "Automaticky nahr\u00e1vat fotografie a videa po\u0159\u00edzen\u00e9 na va\u0161ich mobiln\u00edch za\u0159\u00edzen\u00edch do Emby.",
"MessageNoDevicesSupportCameraUpload": "V sou\u010dasn\u00e9 dob\u011b nem\u00e1te \u017e\u00e1dn\u00e1 za\u0159\u00edzen\u00ed, kter\u00e1 podporuj\u00ed nahr\u00e1v\u00e1n\u00ed fotografi\u00ed.",
"LabelCameraUploadPath": "Slo\u017eka pro upload z fotoapar\u00e1tu:",
"LabelCameraUploadPathHelp": "Vyberte vlastn\u00ed slo\u017eku pro nahr\u00e1v\u00e1n\u00ed, pokud je to \u017e\u00e1douc\u00ed. Pokud tento parametr nezad\u00e1te bude pou\u017eita v\u00fdchoz\u00ed slo\u017eka. Pokud pou\u017e\u00edv\u00e1te vlastn\u00ed slo\u017eku, bude muset b\u00fdt rovn\u011b\u017e p\u0159id\u00e1n v nastaven\u00ed knihoven.",
@ -1534,9 +1536,9 @@
"PasswordMatchError": "Heslo a potvrzen\u00ed hesla mus\u00ed souhlasit.",
"UninstallPluginHeader": "Odinstalovat z\u00e1suvn\u00fd modul",
"UninstallPluginConfirmation": "Jste si jisti, \u017ee chcete odinstalovat {0}?",
"NoPluginConfigurationMessage": "Tento plugin nem\u00e1 nastaven\u00ed.",
"NoPluginsInstalledMessage": "Nem\u00e1te nainstalov\u00e1n \u017e\u00e1dn\u00fd plugin.",
"BrowsePluginCatalogMessage": "Prohl\u00e9dn\u011bte si n\u00e1\u0161 katalog, kde najdete dostupn\u00e9 pluginy.",
"NoPluginConfigurationMessage": "Tento z\u00e1suvn\u00fd modul nem\u00e1 nastaven\u00ed.",
"NoPluginsInstalledMessage": "Nem\u00e1te nainstalov\u00e1n \u017e\u00e1dn\u00fd z\u00e1suvn\u00fd modul.",
"BrowsePluginCatalogMessage": "Prohl\u00e9dn\u011bte si n\u00e1\u0161 katalog, kde najdete dostupn\u00e9 z\u00e1suvn\u00e9 moduly.",
"HeaderNewApiKey": "Nov\u00fd kl\u00ed\u010d API",
"LabelAppName": "N\u00e1zev aplikace",
"LabelAppNameExample": "P\u0159\u00edklad: Sickbeard, NzbDrone",
@ -1583,9 +1585,9 @@
"LabelMovie": "Film",
"LabelMusicVideo": "Hudebn\u00ed video",
"LabelEpisode": "Epizoda",
"Series": "Series",
"Series": "Seri\u00e1ly",
"LabelStopping": "Zastavov\u00e1n\u00ed",
"LabelCancelled": "(zru\u0161eno)",
"LabelCancelled": "Zru\u0161eno",
"ButtonDownload": "St\u00e1hnout",
"SyncJobStatusQueued": "Za\u0159azeno",
"SyncJobStatusConverting": "Konverze",
@ -1606,7 +1608,7 @@
"MessageItemsAdded": "Polo\u017eka p\u0159id\u00e1na",
"HeaderSelectCertificatePath": "Vyber cestu k certifik\u00e1tu",
"ConfirmMessageScheduledTaskButton": "Tato operace se obvykle spust\u00ed automaticky pomoc\u00ed napl\u00e1novan\u00e9 \u00falohy a nevy\u017eaduje \u017e\u00e1dn\u00fd v\u00e1\u0161 z\u00e1sah. Chcete-li napl\u00e1novat \u00falohy, pak:",
"HeaderSupporterBenefit": "Aktivn\u00ed Emby Premiere p\u0159edplatn\u00e9 poskytuje dal\u0161\u00ed v\u00fdhody, jako je p\u0159\u00edstup k synchronizaci, pr\u00e9miov\u00fdm plugin\u016f, obsahu internetov\u00e9ho kan\u00e1lu, a dal\u0161\u00ed. {0} Dal\u0161\u00ed informace {1}.",
"HeaderSupporterBenefit": "Aktivn\u00ed Emby Premiere p\u0159edplatn\u00e9 poskytuje dal\u0161\u00ed v\u00fdhody, jako je p\u0159\u00edstup k synchronizaci, pr\u00e9miov\u00fdm z\u00e1suvn\u00fdm modul\u016fm, obsahu internetov\u00e9ho kan\u00e1lu, a dal\u0161\u00edm. {0} Dal\u0161\u00ed informace {1}.",
"LabelSyncNoTargetsHelp": "Vypad\u00e1 to, \u017ee v sou\u010dasn\u00e9 dob\u011b nem\u00e1te \u017e\u00e1dn\u00e9 aplikace, kter\u00e9 podporuj\u00ed synchronizaci.",
"HeaderWelcomeToProjectServerDashboard": "V\u00edtejte na hlavn\u00ed nab\u00eddce Server Emby",
"HeaderWelcomeToProjectWebClient": "V\u00edtejte v Emby",
@ -2135,7 +2137,7 @@
"HeaderConnectionFailure": "P\u0159ipojen\u00ed selhalo",
"MessageUnableToConnectToServer": "Nejsme schopni se p\u0159ipojit k vybran\u00e9mu serveru pr\u00e1v\u011b te\u010f. Pros\u00edm, ujist\u011bte se, \u017ee je spu\u0161t\u011bn a zkuste to znovu.",
"ButtonSelectServer": "V\u00fdb\u011br serveru",
"MessagePluginConfigurationRequiresLocalAccess": "Chcete-li nakonfigurovat tento plugin p\u0159ihlaste se p\u0159\u00edmo na m\u00edstn\u00ed server",
"MessagePluginConfigurationRequiresLocalAccess": "Pro konfiguraci z\u00e1suvn\u00e9ho modulu se p\u0159ihlaste p\u0159\u00edmo na lok\u00e1ln\u00ed server",
"MessageLoggedOutParentalControl": "P\u0159\u00edstup je v sou\u010dasn\u00e9 dob\u011b omezen. Pros\u00edm zkuste to znovu pozd\u011bji.",
"DefaultErrorMessage": "Do\u0161lo k chyb\u011b p\u0159i zpracov\u00e1n\u00ed po\u017eadavku. Pros\u00edm zkuste to znovu pozd\u011bji.",
"ButtonAccept": "P\u0159ijmout",
@ -2186,7 +2188,7 @@
"HeaderUnlockSync": "Odemknout synchronizaci Emby",
"MessageUnlockAppWithPurchaseOrSupporter": "Odemknout tuto funkci pomoc\u00ed jednor\u00e1zov\u00e9 platby, nebo pomoc\u00ed aktivace p\u0159edplatn\u00e9ho Emby Premiere.",
"MessageUnlockAppWithSupporter": "Odemknout tuto funkci pomoc\u00ed aktivn\u00edho p\u0159edplatn\u00e9ho Emby Premiere.",
"MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard under Help -> Emby Premiere.",
"MessageToValidateSupporter": "Pokud m\u00e1te aktivn\u00ed p\u0159edplatn\u00e9 Emby Premiere, ujist\u011bte se, \u017ee m\u00e1te nastaven Emby Premiere v panelu Nastaven\u00ed pod N\u00e1pov\u011bda -> Emby Premiere.",
"MessagePaymentServicesUnavailable": "Platebn\u00ed slu\u017eby nejsou v sou\u010dasn\u00e9 dob\u011b k dispozici. Pros\u00edm zkuste to pozd\u011bji znovu.",
"MessagePleaseSignInLocalNetwork": "Ne\u017e budete pokra\u010dovat, ujist\u011bte se, \u017ee jste p\u0159ipojeni k m\u00edstn\u00ed s\u00edti pomoc\u00ed p\u0159ipojen\u00ed WiFi nebo LAN.",
"ButtonUnlockWithPurchase": "Odemkn\u011bte pomoc\u00ed koup\u011b",
@ -2258,7 +2260,7 @@
"ButtonRestorePreviousPurchase": "Obnovit n\u00e1kup",
"AlreadyPaid": "U\u017e jste provedli platbu?",
"AlreadyPaidHelp1": "Pokud jste ji\u017e zaplatili star\u0161\u00ed verzi Media Browser pro Android, nemus\u00edte platit znovu, aby jste aktivovali tuto aplikaci. Kliknut\u00edm na tla\u010d\u00edtko OK n\u00e1m po\u0161lete e-mail na {0} a my aktivujeme Va\u0161e p\u0159edplatn\u00e9.",
"AlreadyPaidHelp2": "Got Emby Premiere? Just cancel this dialog, setup Emby Premiere in your Emby Server Dashboard under Help -> Emby Premiere, and it will be unlocked automatically.",
"AlreadyPaidHelp2": "Vlastn\u00edte Emby Premiere? Jen stornujte toto dialogov\u00e9 okno, nastavte Emby Premiere v ovl\u00e1dac\u00edm panelu Emby Server N\u00e1pov\u011bda -> Emby Premiere, a funkce bude automaticky odblokov\u00e1na.",
"ButtonForYou": "Pro v\u00e1s",
"ButtonLibrary": "Knihovna",
"ButtonNowPlaying": "Nyn\u00ed je p\u0159ehr\u00e1v\u00e1no",
@ -2292,7 +2294,7 @@
"HeaderFavoriteArtists": "Obl\u00edben\u00ed \u00fam\u011blci",
"HeaderFavoriteSongs": "Obl\u00edben\u00e1 hudba",
"HeaderConfirmPluginInstallation": "Potvrzen\u00ed instalace z\u00e1suvn\u00e9ho modulu",
"PleaseConfirmPluginInstallation": "Pro potvrzen\u00ed, \u017ee jste si p\u0159e\u010detli text v\u00fd\u0161e a chcete pokra\u010dovat v instalaci plugin\u016f, klikn\u011bte na tla\u010d\u00edtko OK.",
"PleaseConfirmPluginInstallation": "Pro potvrzen\u00ed, \u017ee jste si p\u0159e\u010detli text v\u00fd\u0161e a chcete pokra\u010dovat v instalaci z\u00e1suvn\u00fdch modul\u016f, klikn\u011bte na tla\u010d\u00edtko OK.",
"MessagePluginInstallDisclaimer": "Zasuvn\u00e9 moduly vytvo\u0159en\u00e9 \u010dleny Emby komunity jsou skv\u011bl\u00fd zp\u016fsob, jak zv\u00fd\u0161it sv\u016fj Emby pro\u017eitek pomoc\u00ed dopl\u0148kov\u00fdch funkc\u00ed :-) P\u0159ed instalac\u00ed, se pros\u00edm seznamte se v\u0161emi dopady, kter\u00e9 mohou m\u00edt na Emby Server, jako je nap\u0159\u00edklad del\u0161\u00ed prohled\u00e1v\u00e1n\u00ed knihovny, dal\u0161\u00ed zpracov\u00e1n\u00ed na pozad\u00ed, a sn\u00ed\u017een\u00ed stability syst\u00e9mu.",
"ButtonPlayOneMinute": "P\u0159ehr\u00e1t jednu minutu",
"ThankYouForTryingEnjoyOneMinute": "Pros\u00edm zkuste jednu minutu p\u0159ehr\u00e1v\u00e1n\u00ed. D\u011bkujeme v\u00e1m za vyzkou\u0161en\u00ed Emby.",
@ -2309,7 +2311,7 @@
"CoverArt": "Obal",
"ButtonOff": "Vypnout",
"TitleHardwareAcceleration": "Hardwarov\u00e1 akcelerace",
"HardwareAccelerationWarning": "Enabling hardware acceleration may cause instability in some environments. Ensure that your operating system and video drivers are fully up to date. If you have difficulty playing video after enabling this, you'll need to change the setting back to Auto.",
"HardwareAccelerationWarning": "Zapnut\u00ed hardwarov\u00e9 akcelerace m\u016f\u017ee zp\u016fsobit nestabilitu v n\u011bkter\u00fdch prost\u0159ed\u00edch. Ujist\u011bte se, \u017ee va\u0161e ovlada\u010de opera\u010dn\u00edho syst\u00e9mu a videa jsou pln\u011b aktu\u00e1ln\u00ed. M\u00e1te-li pot\u00ed\u017ee s p\u0159ehr\u00e1v\u00e1n\u00edm videa po zapnut\u00ed, budete muset zm\u011bnit nastaven\u00ed zp\u011bt na Auto.",
"HeaderSelectCodecIntrosPath": "Vyberte cestu ke kodeku pro p\u0159edehry",
"ButtonLocalRefresh": "Lok\u00e1ln\u00ed obnoven\u00ed",
"ButtonAddMissingData": "P\u0159idat pouze chyb\u011bj\u00edc\u00ed data",
@ -2324,15 +2326,15 @@
"LabelOptionalM3uUrl": "M3U url (nepovinn\u00e9):",
"LabelOptionalM3uUrlHelp": "N\u011bkter\u00e1 za\u0159\u00edzen\u00ed podporuj\u00edc\u00ed M3U v\u00fdpis kan\u00e1lu.",
"TabResumeSettings": "Obnovit nastaven\u00ed",
"HowDidYouPay": "How did you pay?",
"IHaveEmbyPremiere": "I have Emby Premiere",
"IPurchasedThisApp": "I purchased this app",
"DrmChannelsNotImported": "Channels with DRM will not be imported.",
"ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings",
"LabelAllowHWTranscoding": "Allow hardware transcoding",
"AllowHWTranscodingHelp": "If enabled, allow the tuner to transcode streams on the fly. This may help reduce transcoding required by Emby Server.",
"OptionRequirePerfectSubtitleMatch": "Only download subtitles that are a perfect match for my video files",
"ErrorAddingGuestAccount1": "There was an error adding the Emby Connect account. Has your guest created an Emby account? They can sign up at {0}.",
"ErrorAddingGuestAccount2": "Please ensure your guest has completed activation by following the instructions in the email sent after creating the account. If they did not receive this email then please send an email to {0}, and include your email address as well as theirs.",
"GuestUserNotFound": "User not found. Please ensure the name is correct and try again, or try entering their email address."
"HowDidYouPay": "Jak chcete platit?",
"IHaveEmbyPremiere": "Ji\u017e m\u00e1m Emby Premiere",
"IPurchasedThisApp": "Tuto aplikaci m\u00e1m ji\u017e zaplacenu",
"DrmChannelsNotImported": "Kan\u00e1l s DRM nebude importov\u00e1n",
"ConfigureDateAdded": "Konfigurace p\u0159id\u00e1n\u00ed datumu je definov\u00e1na v nastaven\u00ed knihovny v ovl\u00e1dac\u00edm panelu",
"LabelAllowHWTranscoding": "Povolit hardwarov\u00e9 p\u0159ek\u00f3dov\u00e1n\u00ed",
"AllowHWTranscodingHelp": "Pokud nastav\u00edte, povol\u00edte tuneru p\u0159ek\u00f3dov\u00e1n\u00ed v re\u00e1ln\u00e9m \u010dase. M\u016f\u017ee sn\u00ed\u017eit z\u00e1t\u011b\u017e p\u0159ek\u00f3dov\u00e1v\u00e1n\u00ed po\u017eadovan\u00e9 Emby Serverem.",
"OptionRequirePerfectSubtitleMatch": "Stahovat jen titulky, kter\u00e9 perfektn\u011b sed\u00ed k m\u00fdm video soubor\u016fm.",
"ErrorAddingGuestAccount1": "Do\u0161lo k chyb\u011b p\u0159i p\u0159id\u00e1v\u00e1n\u00ed \u00fa\u010dtu Emby Connect. M\u00e1 v\u00e1\u0161 nov\u00fd u\u017eivatel vytvo\u0159en\u00fd \u00fa\u010det Emby? U\u017eivatel\u00e9 se mohou p\u0159ihl\u00e1sit na {0}.",
"ErrorAddingGuestAccount2": "Ujist\u011bte se pros\u00edm, \u017ee v\u00e1\u0161 nov\u00fd u\u017eivatel dokon\u010dil aktivaci dle pokyn\u016f z e-mailu zaslan\u00e9m po vytvo\u0159en\u00ed \u00fa\u010dtu. Jestli\u017ee nedostali takov\u00fd e-mail, pak pros\u00edm po\u0161lete email na {0}, a p\u0159ipojte svoj\u00ed e-mailovou adresu, stejn\u011b jako jejich.",
"GuestUserNotFound": "U\u017eivatel nenalezen. Pros\u00edm, ujist\u011bte se, \u017ee n\u00e1zev je spr\u00e1vn\u00fd a zkuste to znovu, nebo zkuste zadat jejich e-mailovou adresu."
}

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Afslut",
"LabelVisitCommunity": "Bes\u00f8g F\u00e6lleskab",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Beenden",
"LabelVisitCommunity": "Besuche die Community",
"LabelGithub": "Github",
@ -2332,7 +2334,7 @@
"LabelAllowHWTranscoding": "Erlaube Hardware Transkodierung",
"AllowHWTranscodingHelp": "Wenn aktiviert, erlaube dem tuner eine Transkodierung des Streams in Echtzeit vorzunehmen. Dadurch wird die Transkodierung des Emby Servers reduziert.",
"OptionRequirePerfectSubtitleMatch": "Lade nur Untertitel die perfekt zu meinen Videos passen",
"ErrorAddingGuestAccount1": "There was an error adding the Emby Connect account. Has your guest created an Emby account? They can sign up at {0}.",
"ErrorAddingGuestAccount2": "Please ensure your guest has completed activation by following the instructions in the email sent after creating the account. If they did not receive this email then please send an email to {0}, and include your email address as well as theirs.",
"GuestUserNotFound": "User not found. Please ensure the name is correct and try again, or try entering their email address."
"ErrorAddingGuestAccount1": "Ein Fehler trat beim Hinzuf\u00fcgen des Emby Connect Kontos auf. Hat einer Ihrer G\u00e4ste ein Emby Konto erstellt? Sie k\u00f6nnen sich hier anmelden {0}.",
"ErrorAddingGuestAccount2": "Bitte stellen Sie sicher, dass Ihre G\u00e4ste die Aktivierung vervollst\u00e4ndigt haben, welche wir ihm in einer Email nach der Erstellung des Kontos zugesandt haben. Sollte diese Email nicht angekommen sein, senden Sie bitte eine Email an {0}. Bitte geben Sie Ihre Emailadresse und die des Gastes mit an.",
"GuestUserNotFound": "Benutzer nicht gefunden. Bitte stellen Sie die korrekte Schreibweise sicher und versuchen Sie es erneut. Sie k\u00f6nnen auch die Emailadresse verwenden."
}

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "\u0388\u03be\u03bf\u03b4\u03bf\u03c2",
"LabelVisitCommunity": "\u039a\u03bf\u03b9\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Exit",
"LabelVisitCommunity": "Visit Community",
"LabelGithub": "Github",

View file

@ -2334,5 +2334,8 @@
"OptionRequirePerfectSubtitleMatch": "Only download subtitles that are a perfect match for my video files",
"ErrorAddingGuestAccount1": "There was an error adding the Emby Connect account. Has your guest created an Emby account? They can sign up at {0}.",
"ErrorAddingGuestAccount2": "Please ensure your guest has completed activation by following the instructions in the email sent after creating the account. If they did not receive this email then please send an email to {0}, and include your email address as well as theirs.",
"GuestUserNotFound": "User not found. Please ensure the name is correct and try again, or try entering their email address."
"GuestUserNotFound": "User not found. Please ensure the name is correct and try again, or try entering their email address.",
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"Yesterday": "Yesterday"
}

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Salir",
"LabelVisitCommunity": "Visit Community",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Salir",
"LabelVisitCommunity": "Visitar la Comunidad",
"LabelGithub": "Github",
@ -77,9 +79,9 @@
"HeaderAdultsReadHere": "\u00a1Adultos Leer Esto!",
"RegisterWithPayPal": "Registrar con PayPal",
"HeaderEnjoyDayTrial": "Disfrute de una Prueba Gratuita por 14 D\u00edas",
"LabelSyncTempPath": "Trayectoria de archivos temporales:",
"LabelSyncTempPath": "Ruta de archivos temporales:",
"LabelSyncTempPathHelp": "Especifique una carpeta de trabajo personalizada para sinc. Los medios convertidos creados durante el proceso de sinc ser\u00e1n almacenados en este lugar.",
"LabelCustomCertificatePath": "Trayectoria del certificado personalizado:",
"LabelCustomCertificatePath": "Ruta del certificado personalizado:",
"LabelCustomCertificatePathHelp": "Proporcione su archivo de certificado .pfx personalizado. Si se omite, el servidor crear\u00e1 un certificado auto firmado.",
"TitleNotifications": "Notificaciones",
"OptionDetectArchiveFilesAsMedia": "Detectar archivos comprimidos como medios",
@ -347,7 +349,7 @@
"LabelMetadataPath": "Ruta para metadatos:",
"LabelMetadataPathHelp": "Especifique una ubicaci\u00f3n personalizada para ilustraciones descargadas y metadatos.",
"LabelTranscodingTempPath": "Ruta para transcodificaci\u00f3n temporal:",
"LabelTranscodingTempPathHelp": "Esta carpeta contiene archivos de trabajo usados por el transcodificador. Especifique una trayectoria personalizada, o d\u00e9jela vac\u00eda para utilizar su valor por omisi\u00f3n en la carpeta de datos del servidor.",
"LabelTranscodingTempPathHelp": "Esta carpeta contiene archivos de trabajo usados por el transcodificador. Especifique una ruta personalizada, o d\u00e9jela vac\u00eda para utilizar su valor por omisi\u00f3n en la carpeta de datos del servidor.",
"TabBasics": "B\u00e1sicos",
"TabTV": "TV",
"TabGames": "Juegos",
@ -971,10 +973,10 @@
"LabelKodiMetadataUserHelp": "Habilitar esto para mantener los datos monitoreados en sincron\u00eda entre el Servidor Emby y los archivos Nfo .",
"LabelKodiMetadataDateFormat": "Formato de fecha de estreno:",
"LabelKodiMetadataDateFormatHelp": "Todas las fechas en los nfo\u00b4s ser\u00e1n le\u00eddas y escritas utilizando este formato.",
"LabelKodiMetadataSaveImagePaths": "Guardar trayectorias de im\u00e1genes en los archivos nfo",
"LabelKodiMetadataSaveImagePaths": "Guardar rutas de im\u00e1genes en los archivos nfo",
"LabelKodiMetadataSaveImagePathsHelp": "Esto se recomienda si tiene nombres de imagenes que no se ajustan a los lineamientos de Kodi.",
"LabelKodiMetadataEnablePathSubstitution": "Habilitar sustituci\u00f3n de trayectorias",
"LabelKodiMetadataEnablePathSubstitutionHelp": "Habilita la sustituci\u00f3n de trayectorias de im\u00e1genes usando la configuraci\u00f3n de sustituci\u00f3n de trayectorias del servidor.",
"LabelKodiMetadataEnablePathSubstitution": "Habilitar sustituci\u00f3n de ruta",
"LabelKodiMetadataEnablePathSubstitutionHelp": "Habilita la sustituci\u00f3n de rutas de im\u00e1genes usando la configuraci\u00f3n de sustituci\u00f3n de rutas del servidor.",
"LabelKodiMetadataEnablePathSubstitutionHelp2": "Ver sustituci\u00f3n de trayectoras.",
"OptionDisplayChannelsInline": "Mostrar canales alineado junto con mis vistas",
"OptionDisplayChannelsInlineHelp": "Al activarse, estos canales ser\u00e1n mostrados directamente junto con otras vistas. Si se deshabilitados, ser\u00e1n mostrados dentro de una vista independiente de Canales.",
@ -1019,7 +1021,7 @@
"TabFilter": "Filtro",
"ButtonView": "Vista",
"LabelPageSize": "Cantidad de \u00cdtems:",
"LabelPath": "Trayectoria:",
"LabelPath": "Ruta:",
"LabelView": "Vista:",
"TabUsers": "Usuarios",
"LabelSortName": "Nombre para ordenar:",
@ -1261,7 +1263,7 @@
"LabelEnableIntroParentalControlHelp": "Los tr\u00e1ilers s\u00f3lo ser\u00e1n seleccionados con una clasificaci\u00f3n parental igual o menor a la del contenido que se est\u00e1 reproduciendo.",
"LabelTheseFeaturesRequireSubscriptionHelpAndTrailers": "Estas caracter\u00edsticas requieren de una suscripci\u00f3n de Emby Premier activa y la instalaci\u00f3n del complemento de canal de Tr\u00e1ilers.",
"OptionTrailersFromMyMoviesHelp": "Requiere configurar tr\u00e1ilers locales.",
"LabelCustomIntrosPath": "Trayectoria para intros personalizados:",
"LabelCustomIntrosPath": "Ruta para intros personalizados:",
"LabelCustomIntrosPathHelp": "Un folder que contiene archivos de video. Un video ser\u00e1 seleccionado aleatoriamente y reproducido despu\u00e9s de los tr\u00e1ilers.",
"ValueSpecialEpisodeName": "Especial: {0}",
"LabelSelectInternetTrailersForCinemaMode": "Tr\u00e1ilers de Internet",
@ -1283,7 +1285,7 @@
"HeaderCameraUploadHelp": "Subir autom\u00e1ticamente fotograf\u00edas y videos tomados desde sus dispositivos m\u00f3viles a Emby.",
"MessageNoDevicesSupportCameraUpload": "Actualmente no cuenta con ning\u00fan dispositivo que soporte subir desde la c\u00e1mara.",
"LabelCameraUploadPath": "Ruta para subir desde la c\u00e1mara:",
"LabelCameraUploadPathHelp": "Seleccione una trayectoria personalizada de subida. Si no se especifica, una carpeta por omisi\u00f3n ser\u00e1 usada. Si usa una trayectoria personalizada, tambi\u00e9n ser\u00e1 necesario agregarla en el \u00e1rea de configuraci\u00f3n de la biblioteca.",
"LabelCameraUploadPathHelp": "Seleccione una ruta personalizada de subida. Si no se especifica, una carpeta por omisi\u00f3n ser\u00e1 usada. Si usa una ruta personalizada, tambi\u00e9n ser\u00e1 necesario agregarla en el \u00e1rea de configuraci\u00f3n de la biblioteca.",
"LabelCreateCameraUploadSubfolder": "Crear una subcarpeta para cada dispositivo",
"LabelCreateCameraUploadSubfolderHelp": "Se pueden especificar carpetas espec\u00edficas para un dispositivo haciendo clic en \u00e9l desde la p\u00e1gina de Dispositivos.",
"LabelCustomDeviceDisplayName": "Nombre a Desplegar:",
@ -1466,7 +1468,7 @@
"LabelTranscodingThreadCountHelp": "Elija el numero m\u00e1ximo de hilos a usar para transcodificar. Reduciendo el conteo de hilos disminuir\u00e1 el uso del cpu pero es posible que no convierta lo suficientemente r\u00e1pido para obtener una reproducci\u00f3n fluida.",
"OptionMax": "M\u00e1ximo",
"HeaderEmbyGuide": "Gu\u00eda de Emby",
"LabelSyncPath": "Trayectoria para contenido sincronizado:",
"LabelSyncPath": "Ruta para contenido sincronizado:",
"OptionSyncOnlyOnWifi": "Sincronizar \u00fanicamente por WiFi",
"OptionSyncLosslessAudioOriginal": "Sincronizar audio \"lossless\" con su calidad original.",
"HeaderMetadata": "Metadatos",
@ -1500,7 +1502,7 @@
"LabelDisplayName": "Nombre a Desplegar:",
"HeaderNewRecording": "Nueva Grabaci\u00f3n",
"ButtonAdvanced": "Avanzado",
"LabelCodecIntrosPath": "Trayectoria de intros de Codec:",
"LabelCodecIntrosPath": "Ruta de intros de Codec:",
"LabelCodecIntrosPathHelp": "Carpeta que contiene archivos de video. Si un nombre de archivo de video de entrada coincide con el c\u00f3dec de video, c\u00f3dec de audio, perf\u00edl de audio, o una etiqueta, entonces se reproducir\u00e1 antes de la funci\u00f3n principal.",
"OptionConvertRecordingsToStreamingFormat": "Convertir autom\u00e1ticamente las grabaciones a un formato amigable para transmisi\u00f3n",
"OptionConvertRecordingsToStreamingFormatHelp": "Las grabaciones ser\u00e1n convertidas en tiempo real a MP4 para una f\u00e1cil reproducci\u00f3n en sus dispositivos.",
@ -1585,7 +1587,7 @@
"LabelEpisode": "Episodio",
"Series": "Series",
"LabelStopping": "Deteniendo",
"LabelCancelled": "(cancelado)",
"LabelCancelled": "Cancelado",
"ButtonDownload": "Descargar",
"SyncJobStatusQueued": "En cola",
"SyncJobStatusConverting": "Convirti\u00e9ndo",
@ -1604,7 +1606,7 @@
"HeaderDevices": "Dispositivos",
"ButtonScheduledTasks": "Tareas programadas",
"MessageItemsAdded": "\u00cdtems agregados",
"HeaderSelectCertificatePath": "Seleccione Trayectoria del Certificado",
"HeaderSelectCertificatePath": "Seleccione la Ruta del Certificado",
"ConfirmMessageScheduledTaskButton": "Esta operaci\u00f3n normalmente se ejecuta de manera autom\u00e1tica como una tarea programada y no requiere de ningun esfuerzo manual. Para configurar la tarea programada, vea:",
"HeaderSupporterBenefit": "Una suscripci\u00f3n Emby Premiere activa provee beneficios adicionales como acceso a sincronizacion, complementos premium, contenido de canales de internet, y mas. {0}Conocer mas{1}.",
"LabelSyncNoTargetsHelp": "Parece que actualmente no cuentas con ninguna app que soporte sinc.",
@ -1701,7 +1703,7 @@
"HeaderRatingsDownloads": "Calificaciones \/ Descargas",
"HeaderConfirmProfileDeletion": "Confirmar Eliminaci\u00f3n del Perfil",
"MessageConfirmProfileDeletion": "\u00bfEst\u00e1 seguro de querer eliminar este perfil?",
"HeaderSelectServerCachePath": "Seleccionar Trayector\u00eda para Cach\u00e9 del Servidor",
"HeaderSelectServerCachePath": "Seleccionar ruta para Cach\u00e9 del Servidor",
"HeaderSelectTranscodingPath": "Seleccionar Ruta para Transcodificaci\u00f3n Temporal",
"HeaderSelectImagesByNamePath": "Seleccionar Ruta para Im\u00e1genes por Nombre",
"HeaderSelectMetadataPath": "Seleccionar Ruta para Metadatos",
@ -1761,7 +1763,7 @@
"HeaderLatestTvRecordings": "Grabaciones Recientes",
"LabelCurrentPath": "Ruta actual:",
"HeaderSelectMediaPath": "Seleccionar ruta a medios",
"HeaderSelectPath": "Seleccionar Trayectoria",
"HeaderSelectPath": "Seleccionar Ruta",
"ButtonNetwork": "Red",
"MessageDirectoryPickerInstruction": "Las rutas de red pueden ser introducidas manualmente en caso de que el bot\u00f3n de Red no pueda localizar sus dispositivos. Por ejemplo, {0} or {1}.",
"MessageDirectoryPickerBSDInstruction": "Para BSD, quiz\u00e1s necesite configurar el almacenamiento dentro de su \"FreeNAS Jail\" de manera que permita a Emby accesarlo.",
@ -1951,7 +1953,7 @@
"ButtonChangeContentType": "Cambiar tipo de contenido",
"HeaderMediaLocations": "Ubicaciones de Medios",
"LabelContentTypeValue": "Tipo de contenido: {0}",
"LabelPathSubstitutionHelp": "Opcional: La sustituci\u00f3n de trayectoras puede mapear trayectorias del servidor a recursos de red comaprtidos que los clientes pueden acceder para reproducir de manera directa.",
"LabelPathSubstitutionHelp": "Opcional: La sustituci\u00f3n de rutas puede mapear rutas del servidor a recursos de red compartidos que los clientes pueden acceder para reproducir de manera directa.",
"FolderTypeUnset": "No establecido (contenido mixto)",
"BirthPlaceValue": "Lugar de nacimiento: {0}",
"DeathDateValue": "Fallcimiento: {0}",
@ -2052,7 +2054,7 @@
"ValueAsRole": "como {0}",
"ValueGuestStar": "Estrella invitada",
"MediaInfoSize": "Tama\u00f1o",
"MediaInfoPath": "Trayectoria",
"MediaInfoPath": "Ruta",
"MediaInfoFile": "Archivo",
"MediaInfoFormat": "Formato",
"MediaInfoContainer": "Contenedor",
@ -2083,7 +2085,7 @@
"MediaInfoStreamTypeEmbeddedImage": "Im\u00e1gen Embebida",
"MediaInfoRefFrames": "Tramas de referencia",
"TabExpert": "Experto",
"HeaderSelectCustomIntrosPath": "Seleccionar Trayectoria de Intros Personalizados",
"HeaderSelectCustomIntrosPath": "Seleccionar Ruta de Intros Personalizados",
"HeaderRateAndReview": "Clasificar y Rese\u00f1ar",
"HeaderThankYou": "Gracias",
"MessageThankYouForYourReview": "Gracias por su rese\u00f1a.",
@ -2310,7 +2312,7 @@
"ButtonOff": "Apagar",
"TitleHardwareAcceleration": "Aceleraci\u00f3n por Hardware",
"HardwareAccelerationWarning": "Habilitar la aceleraci\u00f3n por hardware podr\u00eda causar inestabilidad en algunos entornos, Aseg\u00farese de que su sistema operativo y controladores de video est\u00e1n actualizados. Si tiene dificultades reproduciendo vides despu\u00e9s de habilitar esto, necesita cambiar las configuraciones de nuevo a Auto,",
"HeaderSelectCodecIntrosPath": "Seleccionar Trayectoria de Intros de C\u00f3dec",
"HeaderSelectCodecIntrosPath": "Seleccionar ruta de Intros de C\u00f3dec",
"ButtonLocalRefresh": "Actualizaci\u00f3n local",
"ButtonAddMissingData": "S\u00f3lo agregar datos faltantes",
"ButtonFullRefresh": "Actualizaci\u00f3n completa",
@ -2332,7 +2334,7 @@
"LabelAllowHWTranscoding": "Permitir transcodificacion de hardware",
"AllowHWTranscodingHelp": "Si se habilita, permite a la sintonizadora transcodificar transmisiones al vuelo. Esto podr\u00eda ayudar a reducir la transcodificacion requer\u00eda por el Servidor Emby.",
"OptionRequirePerfectSubtitleMatch": "Solo descargar subtitulos que corresponden perfectamente para mis archivos de video.",
"ErrorAddingGuestAccount1": "There was an error adding the Emby Connect account. Has your guest created an Emby account? They can sign up at {0}.",
"ErrorAddingGuestAccount2": "Please ensure your guest has completed activation by following the instructions in the email sent after creating the account. If they did not receive this email then please send an email to {0}, and include your email address as well as theirs.",
"GuestUserNotFound": "User not found. Please ensure the name is correct and try again, or try entering their email address."
"ErrorAddingGuestAccount1": "Hubo un error agregando la cuenta de Emby Connect. \u00bfSu invitado ya ha creado una cuenta de Emby Connect? puede registrarse en {0}.",
"ErrorAddingGuestAccount2": "Por favor aseg\u00farese de que su invitado ha completado la activaci\u00f3n siguiendo las instrucciones que le fueron enviadas en el correo electr\u00f3nico despu\u00e9s de crear la cuenta. Si no recibi\u00f3 dicho correo entonces escriba un correo electr\u00f3nico a {0}, e incluya su direcci\u00f3n de correo electr\u00f3nico ademas de la de su invitado.",
"GuestUserNotFound": "Usuario no encontrado. Por favor aseg\u00farese de que el nombre es correcto e intente de nuevo, o intente introducir la direcci\u00f3n de correo de su invitado."
}

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Salir",
"LabelVisitCommunity": "Visitar la comunidad",
"LabelGithub": "Github",
@ -31,11 +33,11 @@
"LabelEnableVideoImageExtraction": "Habilitar extracci\u00f3n de im\u00e1genes de video",
"VideoImageExtractionHelp": "Para los v\u00eddeos que no dispongan de im\u00e1genes y que no podemos encontrar en Internet. Esto agregar\u00e1 un tiempo adicional para la exploraci\u00f3n inicial de bibliotecas, pero resultar\u00e1 en una presentaci\u00f3n m\u00e1s agradable.",
"LabelEnableChapterImageExtractionForMovies": "Extraer im\u00e1genes de cap\u00edtulos para pel\u00edculas",
"LabelChapterImageExtractionForMoviesHelp": "Extraer imagenes de capitulos permitir\u00e1 a los usuarios ver escenas gr\u00e1ficas en la seleccion de men\u00fa. El proceso puede ser lento, cpu-intenso y puede requerir algunos gigabytes de espacio.",
"LabelChapterImageExtractionForMoviesHelp": "Extraer im\u00e1genes de cap\u00edtulos permitir\u00e1 a los usuarios ver escenas gr\u00e1ficas en la selecci\u00f3n de men\u00fa. El proceso puede ser lento, cargar el procesador y requerir algunos gigabytes de espacio. Se ejecuta como una tarea nocturna programada, puede ser configurado en el \u00e1rea de tareas programadas. No se recomienda ejecutarlo durante las horas punta.",
"LabelEnableAutomaticPortMapping": "Habilitar asignaci\u00f3n de puertos autom\u00e1tico",
"LabelEnableAutomaticPortMappingHelp": "UPnP permite la configuraci\u00f3n del router para acceso externo de forma f\u00e1cil y autom\u00e1tica. Esto puede no funcionar en algunos modelos de routers.",
"HeaderTermsOfService": "T\u00e9rminos de servicios de Emby",
"MessagePleaseAcceptTermsOfService": "Por favor aceptar los terminos de servicios y politica de privacidad antes de continuar.",
"HeaderTermsOfService": "T\u00e9rminos del servicio de Emby",
"MessagePleaseAcceptTermsOfService": "Por favor aceptar los t\u00e9rminos del servicio y pol\u00edtica de privacidad antes de continuar.",
"OptionIAcceptTermsOfService": "Acepto los terminos de servicio",
"ButtonPrivacyPolicy": "Politica de privacidad",
"ButtonTermsOfService": "Terminos de servicios",
@ -1000,55 +1002,55 @@
"HeaderLatestMusic": "\u00daltima m\u00fasica",
"HeaderBranding": "Branding",
"HeaderApiKeys": "Keys de Api",
"HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Emby Server. Keys are issued by logging in with an Emby account, or by manually granting the application a key.",
"HeaderApiKeysHelp": "Las aplicaciones externas requieren de una clave API para comunicarse con el servidor Emby. Las claves se facilitan iniciando sesi\u00f3n con una cuenta de Emby, o otorgando manualmente una clave a la aplicaci\u00f3n.",
"HeaderApiKey": "Clave Api",
"HeaderApp": "App",
"HeaderDevice": "Dispositivo",
"HeaderUser": "Usuario",
"HeaderDateIssued": "Fecha de emisi\u00f3n",
"LabelChapterName": "Cap\u00edtulo {0}",
"HeaderHttpHeaders": "Http Headers",
"HeaderIdentificationHeader": "Identification Header",
"LabelValue": "Value:",
"LabelMatchType": "Match type:",
"OptionEquals": "Equals",
"HeaderHttpHeaders": "Cabeceras Http",
"HeaderIdentificationHeader": "Cabecera de indentificaci\u00f3n",
"LabelValue": "Valor:",
"LabelMatchType": "Tipo de emparejamiento",
"OptionEquals": "Igual",
"OptionRegex": "Regex",
"OptionSubstring": "Substring",
"TabView": "View",
"TabSort": "Sort",
"TabFilter": "Filter",
"ButtonView": "View",
"LabelPageSize": "Item limit:",
"LabelPath": "Path:",
"LabelView": "View:",
"TabUsers": "Users",
"LabelSortName": "Sort name:",
"LabelDateAdded": "Date added:",
"HeaderFeatures": "Features",
"HeaderAdvanced": "Advanced",
"ButtonSync": "Sync",
"TabScheduledTasks": "Scheduled Tasks",
"HeaderChapters": "Chapters",
"HeaderResumeSettings": "Resume Settings",
"TabSync": "Sync",
"TitleUsers": "Users",
"LabelProtocol": "Protocol:",
"TabView": "Vista",
"TabSort": "Ordenar",
"TabFilter": "Filtrar",
"ButtonView": "Vista",
"LabelPageSize": "Limite de \u00edtems:",
"LabelPath": "Ruta:",
"LabelView": "Vista:",
"TabUsers": "Usuarios",
"LabelSortName": "Nombre de la clasificaci\u00f3n:",
"LabelDateAdded": "Fecha a\u00f1adido:",
"HeaderFeatures": "Caracter\u00edsticas",
"HeaderAdvanced": "Avanzado",
"ButtonSync": "Sincronizar",
"TabScheduledTasks": "Tareas programadas",
"HeaderChapters": "Cap\u00edtulos",
"HeaderResumeSettings": "Reanudar ajustes",
"TabSync": "Sincronizar",
"TitleUsers": "Usuarios",
"LabelProtocol": "Protocolo:",
"OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming",
"LabelContext": "Context:",
"OptionContextStreaming": "Streaming",
"OptionContextStatic": "Sync",
"ButtonAddToPlaylist": "Add to playlist",
"TabPlaylists": "Playlists",
"OptionProtocolHls": "Emisi\u00f3n http en vivo",
"LabelContext": "Contexto:",
"OptionContextStreaming": "Emisi\u00f3n",
"OptionContextStatic": "Sincronizar",
"ButtonAddToPlaylist": "A\u00f1adir a la lista de reproducci\u00f3n",
"TabPlaylists": "Listas de reproducci\u00f3n",
"ButtonClose": "Cerrar",
"LabelAllLanguages": "All languages",
"HeaderBrowseOnlineImages": "Browse Online Images",
"LabelSource": "Source:",
"OptionAll": "All",
"LabelImage": "Image:",
"ButtonBrowseImages": "Browse Images",
"HeaderImages": "Images",
"HeaderBackdrops": "Backdrops",
"LabelAllLanguages": "Todos los idiomas",
"HeaderBrowseOnlineImages": "Navegar im\u00e1genes online",
"LabelSource": "Fuente:",
"OptionAll": "Todos",
"LabelImage": "Imagen:",
"ButtonBrowseImages": "Navegar im\u00e1genes",
"HeaderImages": "Im\u00e1genes",
"HeaderBackdrops": "Im\u00e1genes de fondo",
"HeaderScreenshots": "Capturas de pantalla",
"HeaderAddUpdateImage": "A\u00f1adir\/Actualizar imagen",
"LabelDropImageHere": "Soltar imagen aqui",
@ -1098,58 +1100,58 @@
"DeviceOnlineWithName": "{0} est\u00e1 conectado",
"UserOnlineFromDevice": "{0} est\u00e1 conectado desde {1}",
"DeviceOfflineWithName": "{0} se ha desconectado",
"UserOfflineFromDevice": "{0} has disconnected from {1}",
"SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",
"SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
"LabelRunningTimeValue": "Running time: {0}",
"LabelIpAddressValue": "Ip address: {0}",
"UserLockedOutWithName": "User {0} has been locked out",
"UserConfigurationUpdatedWithName": "User configuration has been updated for {0}",
"UserCreatedWithName": "User {0} has been created",
"UserPasswordChangedWithName": "Password has been changed for user {0}",
"UserDeletedWithName": "User {0} has been deleted",
"MessageServerConfigurationUpdated": "Server configuration has been updated",
"MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated",
"MessageApplicationUpdated": "Emby Server has been updated",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"AppDeviceValues": "App: {0}, Device: {1}",
"ProviderValue": "Provider: {0}",
"LabelChannelDownloadSizeLimit": "Download size limit (GB):",
"LabelChannelDownloadSizeLimitHelpText": "Limit the size of the channel download folder.",
"HeaderRecentActivity": "Recent Activity",
"HeaderPeople": "People",
"HeaderDownloadPeopleMetadataFor": "Download biography and images for:",
"OptionComposers": "Composers",
"OptionOthers": "Others",
"HeaderDownloadPeopleMetadataForHelp": "Enabling additional options will provide more on-screen information but will result in slower library scans.",
"ViewTypeFolders": "Folders",
"LabelDisplayFoldersView": "Display a folders view to show plain media folders",
"ViewTypeLiveTvRecordingGroups": "Recordings",
"ViewTypeLiveTvChannels": "Channels",
"UserOfflineFromDevice": "{0} se ha desconectado de {1}",
"SubtitlesDownloadedForItem": "Subt\u00edtulos descargados para {0}",
"SubtitleDownloadFailureForItem": "Fallo en la descarga de subt\u00edtulos para {0}",
"LabelRunningTimeValue": "Tiempo de ejecuci\u00f3n: {0}",
"LabelIpAddressValue": "Direcci\u00f3n IP: {0}",
"UserLockedOutWithName": "El usuario {0} ha sido bloqueado",
"UserConfigurationUpdatedWithName": "Se ha actualizado la configuraci\u00f3n de usuario para {0}",
"UserCreatedWithName": "Se ha creado el usuario {0}",
"UserPasswordChangedWithName": "Contrase\u00f1a cambiada al usuario {0}",
"UserDeletedWithName": "El usuario {0} ha sido eliminado",
"MessageServerConfigurationUpdated": "Se ha actualizado la configuraci\u00f3n del servidor",
"MessageNamedServerConfigurationUpdatedWithValue": "Se ha actualizado la secci\u00f3n {0} de la configuraci\u00f3n del servidor",
"MessageApplicationUpdated": "Se ha actualizado el servidor Emby",
"AuthenticationSucceededWithUserName": "{0} se ha autenticado satisfactoriamente",
"FailedLoginAttemptWithUserName": "Intento de inicio de sesi\u00f3n fallido desde {0}",
"UserDownloadingItemWithValues": "{0} est\u00e1 descargando {1}",
"UserStartedPlayingItemWithValues": "{0} ha empezado a reproducir {1}",
"UserStoppedPlayingItemWithValues": "{0} ha parado de reproducir {1}",
"AppDeviceValues": "Aplicaci\u00f3n: {0}, Dispositivo: {1}",
"ProviderValue": "Proveedor: {0}",
"LabelChannelDownloadSizeLimit": "Tama\u00f1o l\u00edmite de descarga (GB):",
"LabelChannelDownloadSizeLimitHelpText": "Limitar el tama\u00f1o de la carpeta de descargas del canal.",
"HeaderRecentActivity": "Actividad reciente",
"HeaderPeople": "Gente",
"HeaderDownloadPeopleMetadataFor": "Descargar biograf\u00eda e im\u00e1genes para:",
"OptionComposers": "Compositores",
"OptionOthers": "Otros",
"HeaderDownloadPeopleMetadataForHelp": "Activar m\u00e1s opciones permite mas informaci\u00f3n en pantalla pero los escaneos de la biblioteca ser\u00e1n m\u00e1s lentos.",
"ViewTypeFolders": "Carpetas",
"LabelDisplayFoldersView": "Mostrar vista de carpetas para ver las carpetas de medios de forma sencilla",
"ViewTypeLiveTvRecordingGroups": "Grabaciones",
"ViewTypeLiveTvChannels": "Canales",
"LabelEasyPinCode": "F\u00e1cil c\u00f3digo PIN:",
"EasyPasswordHelp": "Your easy pin code is used for offline access with supported Emby apps, and can also be used for easy in-network sign in.",
"LabelInNetworkSignInWithEasyPassword": "Enable in-network sign in with my easy pin code",
"LabelInNetworkSignInWithEasyPasswordHelp": "If enabled, you'll be able to use your easy pin code to sign in to Emby apps from inside your home 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.",
"HeaderPassword": "Password",
"HeaderLocalAccess": "Local Access",
"HeaderViewOrder": "View Order",
"EasyPasswordHelp": "Su c\u00f3digo pin es para el acceso sin conexi\u00f3n en la aplicaciones de Emby soportadas, tambi\u00e9n puede ser usado para iniciar sesi\u00f3n en l\u00ednea m\u00e1s c\u00f3modamente.",
"LabelInNetworkSignInWithEasyPassword": "Activar inicio de sesi\u00f3n en l\u00ednea con c\u00f3digo pin",
"LabelInNetworkSignInWithEasyPasswordHelp": "Si est\u00e1 activado, ser\u00e1s capaz de usar tu c\u00f3digo pin para iniciar sesi\u00f3n en las aplicaciones de Emby desde tu red local. S\u00f3lo necesitar\u00e1s tu contrase\u00f1a para cuando est\u00e9s fuera de casa. Si dejas el c\u00f3digo pin en blanco, no necesitar\u00e1s contrase\u00f1a en tu red local.",
"HeaderPassword": "Contrase\u00f1a",
"HeaderLocalAccess": "Acceso Local",
"HeaderViewOrder": "Ver Orden",
"ButtonResetEasyPassword": "Restablecer f\u00e1cil c\u00f3digo PIN",
"LabelSelectUserViewOrder": "Choose the order your views will be displayed in within Emby apps",
"HeaderPersonInfo": "Person Info",
"HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.",
"LabelSelectUserViewOrder": "Elige el orden en que sus entradas aparecer\u00e1n dentro de las apps Emby",
"HeaderPersonInfo": "Info personal",
"HeaderIdentifyItemHelp": "Asigna uno o m\u00e1s criterios de b\u00fasqueda. Quita criterios para aumentar el n\u00famero de resultados de b\u00fasqueda",
"HeaderConfirmDeletion": "Confirmar borrado",
"LabelFollowingFileWillBeDeleted": "The following file will be deleted:",
"LabelIfYouWishToContinueWithDeletion": "If you wish to continue, please confirm by entering the value of:",
"ButtonIdentify": "Identify",
"LabelAlbumArtist": "Album artist:",
"LabelAlbumArtists": "Album artists:",
"LabelAlbum": "Album:",
"LabelCommunityRating": "Community rating:",
"LabelVoteCount": "Vote count:",
"LabelFollowingFileWillBeDeleted": "El siguiente archivo se eliminar\u00e1",
"LabelIfYouWishToContinueWithDeletion": "Si desea continuar, por favor conf\u00edrmelo escribiendo el valor de:",
"ButtonIdentify": "Identificar",
"LabelAlbumArtist": "Artista del \u00e1lbum",
"LabelAlbumArtists": "Artistas de los \u00e1lbumes",
"LabelAlbum": "\u00c1lbum",
"LabelCommunityRating": "Puntuaci\u00f3n de la comunidad",
"LabelVoteCount": "Contador de votos:",
"LabelMetascore": "Metapuntuaci\u00f3n:",
"LabelCriticRating": "Valoraci\u00f3n de la cr\u00edtica:",
"LabelCriticRatingSummary": "Resumen de la valoraci\u00f3n de la cr\u00edtica:",
@ -1200,56 +1202,56 @@
"LabelOneTimeDonationAmount": "Cantidad de la donaci\u00f3n:",
"ButtonPurchase": "Comprar",
"OptionActor": "Actor",
"OptionComposer": "Composer",
"OptionComposer": "Compositor",
"OptionDirector": "Director",
"OptionGuestStar": "Guest star",
"OptionProducer": "Producer",
"OptionWriter": "Writer",
"LabelAirDays": "Air days:",
"LabelAirTime": "Air time:",
"HeaderMediaInfo": "Media Info",
"HeaderPhotoInfo": "Photo Info",
"HeaderInstall": "Install",
"LabelSelectVersionToInstall": "Select version to install:",
"LinkLearnMoreAboutSubscription": "Learn about Emby Premiere",
"MessagePluginRequiresSubscription": "This plugin will require an active Emby Premiere subscription after the 14 day free trial.",
"MessagePremiumPluginRequiresMembership": "This plugin will require an active Emby Premiere subscription in order to purchase after the 14 day free trial.",
"HeaderReviews": "Reviews",
"HeaderDeveloperInfo": "Developer Info",
"HeaderRevisionHistory": "Revision History",
"ButtonViewWebsite": "View website",
"HeaderXmlSettings": "Xml Settings",
"HeaderXmlDocumentAttributes": "Xml Document Attributes",
"HeaderXmlDocumentAttribute": "Xml Document Attribute",
"XmlDocumentAttributeListHelp": "These attributes are applied to the root element of every xml response.",
"OptionSaveMetadataAsHidden": "Save metadata and images as hidden files",
"LabelExtractChaptersDuringLibraryScan": "Extract chapter images during the library scan",
"LabelExtractChaptersDuringLibraryScanHelp": "If enabled, chapter images will be extracted when videos are imported during the library scan. If disabled they will be extracted during the chapter images scheduled task, allowing the regular library scan to complete faster.",
"LabelConnectGuestUserName": "Their Emby username or email address:",
"LabelConnectUserName": "Emby username or email address:",
"LabelConnectUserNameHelp": "Connect this local user to an online Emby account to enable easy sign-in access from any Emby app without having to know the server ip address.",
"ButtonLearnMoreAboutEmbyConnect": "Learn more about Emby Connect",
"LabelExternalPlayers": "External players:",
"LabelExternalPlayersHelp": "Display buttons to play content in external players. This is only available on devices that support url schemes, generally Android and iOS. With external players there is generally no support for remote control or resuming.",
"LabelNativeExternalPlayersHelp": "Display buttons to play content in external players.",
"LabelEnableItemPreviews": "Enable item previews",
"LabelEnableItemPreviewsHelp": "if enabled, sliding previews will appear when clicking items on certain screens.",
"HeaderSubtitleProfile": "Subtitle Profile",
"HeaderSubtitleProfiles": "Subtitle Profiles",
"HeaderSubtitleProfilesHelp": "Subtitle profiles describe the subtitle formats supported by the device.",
"LabelFormat": "Format:",
"LabelMethod": "Method:",
"LabelDidlMode": "Didl mode:",
"OptionGuestStar": "Estrella invitada",
"OptionProducer": "Productor",
"OptionWriter": "Escritor",
"LabelAirDays": "D\u00edas de emisi\u00f3n:",
"LabelAirTime": "Tiempo de emisi\u00f3n:",
"HeaderMediaInfo": "Info multimedia",
"HeaderPhotoInfo": "Info foto",
"HeaderInstall": "Instalar",
"LabelSelectVersionToInstall": "Seleccionar versi\u00f3n a instalar",
"LinkLearnMoreAboutSubscription": "Saber m\u00e1s sobre Emby Premiere",
"MessagePluginRequiresSubscription": "Este plugin necesita una suscripci\u00f3n activa a Emby Premiere despu\u00e9s de los 14 d\u00edas de prueba.",
"MessagePremiumPluginRequiresMembership": "Este plugin necesitar\u00e1 una suscripci\u00f3n activa a Emby Premiere para poder comprarlo despu\u00e9s del periodo de prueba de 14 d\u00edas.",
"HeaderReviews": "An\u00e1lisis",
"HeaderDeveloperInfo": "Informaci\u00f3n del desarrollador",
"HeaderRevisionHistory": "Hist\u00f3rico de revisiones",
"ButtonViewWebsite": "Ver sitio web",
"HeaderXmlSettings": "Ajustes xml",
"HeaderXmlDocumentAttributes": "Atributos del documento xml",
"HeaderXmlDocumentAttribute": "Atributos del documento xml",
"XmlDocumentAttributeListHelp": "Estos atributos se aplican al elemento ra\u00edz de cada respuesta xml.",
"OptionSaveMetadataAsHidden": "Guardar los metadatos e im\u00e1genes como archivos ocultos",
"LabelExtractChaptersDuringLibraryScan": "Extraer im\u00e1genes de los cap\u00edtulos durante el escaneo de la biblioteca",
"LabelExtractChaptersDuringLibraryScanHelp": "Si est\u00e1 activado, se extraer\u00e1n im\u00e1genes de cap\u00edulos cuando se importen v\u00eddeos durante el escaneo de las bibliotecas. Si se desactiva, las im\u00e1genes se descargar\u00e1n cuando se ejecute la terea programada para ello, permitiendo asi un escaneo de la biblioteca m\u00e1s r\u00e1pido.",
"LabelConnectGuestUserName": "Su nombre de usuario o correo de Emby",
"LabelConnectUserName": "Nombre de usuario o correo de Emby",
"LabelConnectUserNameHelp": "Conecta este usuario local a una cuenta online de Emby para activar el acceso sencillo desde una aplicaci\u00f3n de Emby sin necesidad de saber la IP del servidor.",
"ButtonLearnMoreAboutEmbyConnect": "Aprende m\u00e1s sobre Emby Connect",
"LabelExternalPlayers": "Reproductores externos:",
"LabelExternalPlayersHelp": "Mostrar botones para reproducir contenido en reproductores externos. Esto s\u00f3lo est\u00e1 disponible en dispositivos que soporten el esquema url, generalmente Android e iOS. Con reproductores externos no hay soporte para control remoto o reanudaci\u00f3n.",
"LabelNativeExternalPlayersHelp": "Mostrar botones para reproducir contenido en un reproductor externo.",
"LabelEnableItemPreviews": "Activar previsualizaci\u00f3n de los \u00edtems",
"LabelEnableItemPreviewsHelp": "Si est\u00e1 activado, aparecer\u00e1n previsualizaciones deslizantes cuando haga clic en \u00edtems de ciertas pantallas.",
"HeaderSubtitleProfile": "Perfil de subt\u00edtulos",
"HeaderSubtitleProfiles": "Perfil de subt\u00edtulos",
"HeaderSubtitleProfilesHelp": "El perfil de los subt\u00edtulos describe el formato soportado por el dispositivo.",
"LabelFormat": "Formato:",
"LabelMethod": "M\u00e9todo:",
"LabelDidlMode": "Modo didl:",
"OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)",
"OptionResElement": "res element",
"OptionEmbedSubtitles": "Embed within container",
"OptionExternallyDownloaded": "External download",
"OptionHlsSegmentedSubtitles": "Hls segmented subtitles",
"LabelSubtitleFormatHelp": "Example: srt",
"ButtonLearnMore": "Learn more",
"TabPlayback": "Playback",
"HeaderAudioSettings": "Audio Settings",
"HeaderSubtitleSettings": "Subtitle Settings",
"OptionResElement": "elemento res",
"OptionEmbedSubtitles": "Integrado con el contenedor",
"OptionExternallyDownloaded": "Descarga externa",
"OptionHlsSegmentedSubtitles": "Subt\u00edtulos segmentados hls",
"LabelSubtitleFormatHelp": "Ejemplo: srt",
"ButtonLearnMore": "Aprende m\u00e1s",
"TabPlayback": "Reproducci\u00f3n",
"HeaderAudioSettings": "Ajustes de audio",
"HeaderSubtitleSettings": "Ajustes de subt\u00edtulos",
"TabCinemaMode": "Modo cine",
"TitlePlayback": "Reproducci\u00f3n",
"LabelEnableCinemaModeFor": "Activar el modo cine para:",
@ -1300,57 +1302,57 @@
"HeaderAccessSchedule": "Horario de acceso",
"HeaderAccessScheduleHelp": "Crea un horario de acceso para limitar el acceso a determinadas horas.",
"ButtonAddSchedule": "A\u00f1adir horario",
"LabelAccessDay": "Day of week:",
"LabelAccessStart": "Start time:",
"LabelAccessEnd": "End time:",
"HeaderSchedule": "Schedule",
"OptionEveryday": "Every day",
"OptionWeekdays": "Weekdays",
"OptionWeekends": "Weekends",
"MessageProfileInfoSynced": "User profile information synced with Emby Connect.",
"HeaderOptionalLinkEmbyAccount": "Optional: Link your Emby account",
"ButtonTrailer": "Trailer",
"OptionPlayUnwatchedTrailersOnly": "Play only unwatched trailers",
"HeaderTrailerReelHelp": "Start a trailer reel to play a long running playlist of trailers.",
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.",
"HeaderNewUsers": "New Users",
"ButtonSignUp": "Sign up",
"ButtonForgotPassword": "Forgot password",
"OptionDisableUserPreferences": "Disable access to user preferences",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.",
"HeaderSelectServer": "Select Server",
"MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to accept it below or by clicking the link in the email.",
"TitleNewUser": "New User",
"ButtonConfigurePassword": "Configure Password",
"HeaderDashboardUserPassword": "User passwords are managed within each user's personal profile settings.",
"HeaderLibraryAccess": "Library Access",
"HeaderChannelAccess": "Channel Access",
"HeaderLatestItems": "Latest Items",
"LabelSelectLastestItemsFolders": "Include media from the following sections in Latest Items",
"HeaderShareMediaFolders": "Share Media Folders",
"MessageGuestSharingPermissionsHelp": "Most features are initially unavailable to guests but can be enabled as needed.",
"HeaderInvitations": "Invitations",
"LabelForgotPasswordUsernameHelp": "Enter your username, if you remember it.",
"HeaderForgotPassword": "Forgot Password",
"TitleForgotPassword": "Forgot Password",
"TitlePasswordReset": "Password Reset",
"LabelAccessDay": "D\u00eda de la semana:",
"LabelAccessStart": "Hora de inicio:",
"LabelAccessEnd": "Hora de finalizaci\u00f3n:",
"HeaderSchedule": "Horario",
"OptionEveryday": "Todos los d\u00edas",
"OptionWeekdays": "D\u00edas de la semana",
"OptionWeekends": "Fines de semana",
"MessageProfileInfoSynced": "Informac\u00edon de perfil de usuario sincronizada con Emby Connect.",
"HeaderOptionalLinkEmbyAccount": "Opcional: Asocia tu cuenta de Emby",
"ButtonTrailer": "Tr\u00e1iler",
"OptionPlayUnwatchedTrailersOnly": "Reproducir s\u00f3lo tr\u00e1ilers que no hayan sido vistos",
"HeaderTrailerReelHelp": "Iniciar un conjunto de tr\u00e1ilers para reproducir junto a la lista de tr\u00e1ilers.",
"MessageNoTrailersFound": "No se han encontrado tr\u00e1ilers. Instala el canal de tr\u00e1ilers para mejorar su experiencia a\u00f1adiendo una biblioteca de tr\u00e1ilers por internet.",
"HeaderNewUsers": "Nuevos usuarios",
"ButtonSignUp": "Reg\u00edstrate",
"ButtonForgotPassword": "Contrase\u00f1a olvidada",
"OptionDisableUserPreferences": "Desactivar el acceso a las preferencias de usuario",
"OptionDisableUserPreferencesHelp": "Si est\u00e1 activado, solo los administradores pueden configurar las contrase\u00f1as, im\u00e1genes y preferencias de idioma del perfil de usuario.",
"HeaderSelectServer": "Selecionar servidor",
"MessageNoServersAvailableToConnect": "No hay servidores disponibles para conectarse. Si te han invitado a unirte a un servidor, asegurate de aceptar aqu\u00ed abajo o aciendo clic en el enlace del correo.",
"TitleNewUser": "Nuevo usuario",
"ButtonConfigurePassword": "Configurar contrase\u00f1a",
"HeaderDashboardUserPassword": "Las contrase\u00f1as de los usuarios se gestionan desde los ajustes de perfil de cada usuario.",
"HeaderLibraryAccess": "Acceso a la biblioteca",
"HeaderChannelAccess": "Acceso a los canales",
"HeaderLatestItems": "\u00daltimos \u00edtems",
"LabelSelectLastestItemsFolders": "Incluir medios de las siguientes secciones en \u00daltimos \u00edtems",
"HeaderShareMediaFolders": "Compartir carpetas de medios",
"MessageGuestSharingPermissionsHelp": "Muchas de las caracter\u00edsticas no est\u00e1n disponibles para los invitados, pero pueden activarse seg\u00fan se requieran.",
"HeaderInvitations": "Invitaciones",
"LabelForgotPasswordUsernameHelp": "Introduce tu nombre de usuario, si te acuerdas.",
"HeaderForgotPassword": "Contrase\u00f1a olvidada",
"TitleForgotPassword": "Contrase\u00f1a olvidada",
"TitlePasswordReset": "Reestablecer contrase\u00f1a",
"LabelPasswordRecoveryPinCode": "C\u00f3digo PIN:",
"HeaderPasswordReset": "Password Reset",
"HeaderParentalRatings": "Parental Ratings",
"HeaderVideoTypes": "Video Types",
"HeaderYears": "Years",
"HeaderBlockItemsWithNoRating": "Block content with no or unrecognized rating information:",
"LabelBlockContentWithTags": "Block content with tags:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
"LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
"TabActivity": "Activity",
"TitleSync": "Sync",
"OptionAllowSyncContent": "Allow Sync",
"OptionAllowContentDownloading": "Allow media downloading",
"NameSeasonUnknown": "Season Unknown",
"NameSeasonNumber": "Season {0}",
"LabelNewUserNameHelp": "Usernames can contain letters (a-z), numbers (0-9), dashes (-), underscores (_), apostrophes ('), and periods (.)",
"TabJobs": "Jobs",
"HeaderPasswordReset": "Reestablecer contrase\u00f1a",
"HeaderParentalRatings": "Clasificaci\u00f3n parental",
"HeaderVideoTypes": "Tipos de v\u00eddeos",
"HeaderYears": "A\u00f1os",
"HeaderBlockItemsWithNoRating": "Bloquear contenido sin valoraciones o si son desconocidas:",
"LabelBlockContentWithTags": "Bloquear contenido sin etiquetas:",
"LabelEnableSingleImageInDidlLimit": "Limitar a una imagen integrada",
"LabelEnableSingleImageInDidlLimitHelp": "Algunos dispositivos no renderizan correctamente si hay muchas im\u00e1genes integradas en Didl.",
"TabActivity": "Actividad",
"TitleSync": "Sincronizar",
"OptionAllowSyncContent": "Permitir la sincronizaci\u00f3n",
"OptionAllowContentDownloading": "Permitir la descarga de medios",
"NameSeasonUnknown": "Temporada desconocida",
"NameSeasonNumber": "Temporada {0}",
"LabelNewUserNameHelp": "Los nummobres de usuario pueden contener letras (a-Z), n\u00fameros (0-9), guiones (-), barras bajas (_), ap\u00f3strofes ('), y comas (,).",
"TabJobs": "Trabajos",
"TabSyncJobs": "Trabajos de sincronizaci\u00f3n",
"LabelTagFilterMode": "Modo:",
"LabelTagFilterAllowModeHelp": "Si las etiquetas permitidas forman parte de una estructura de carpetas anidadas, el contenido que esta etiquetado necesitar\u00e1 que las carpetas principales est\u00e9n etiquetadas tambi\u00e9n.",
@ -1362,7 +1364,7 @@
"HeaderUpcomingSports": "Pr\u00f3ximos deportes",
"HeaderUpcomingPrograms": "Pr\u00f3ximos programas",
"ButtonMoreItems": "M\u00e1s",
"LabelShowLibraryTileNames": "Show library tile names",
"LabelShowLibraryTileNames": "Mostrar nombres de pesta\u00f1as de la biblioteca",
"LabelShowLibraryTileNamesHelp": "Determina si las etiquetas se mostrar\u00e1n debajo de las pesta\u00f1as de la biblioteca en la p\u00e1gina de inicio",
"OptionEnableTranscodingThrottle": "Activar estrangulamiento",
"OptionEnableTranscodingThrottleHelp": "El estrangulamiento ajustar\u00e1 autom\u00e1ticamente la velocidad de transcodificaci\u00f3n para minimizar la carga del procesador durante la reproducci\u00f3n.",
@ -1374,13 +1376,13 @@
"OptionAllowMediaPlaybackTranscodingHelp": "Los usuarios recibir\u00e1n un mensaje cuando no pueden reproducir contenido en base a los ajustes.",
"TabStreaming": "Transmisi\u00f3n",
"LabelRemoteClientBitrateLimit": "L\u00edmite de la transmisi\u00f3n de tasa de bits por internet (Mbps):",
"LabelRemoteClientBitrateLimitHelp": "An optional streaming bitrate limit for all out of network clients. This is useful to prevent clients from requesting a higher bitrate than your internet connection can handle.",
"LabelConversionCpuCoreLimit": "CPU core limit:",
"LabelConversionCpuCoreLimitHelp": "Limit the number of CPU cores that will be used during sync conversion.",
"OptionEnableFullSpeedConversion": "Enable full speed conversion",
"OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.",
"HeaderPlaylists": "Playlists",
"HeaderViewStyles": "View Styles",
"LabelRemoteClientBitrateLimitHelp": "Una limitaci\u00f3n opcional de la tasa de bits saliente para todos los clientes de la red. \u00datil para evitar que los clientes soliciten una tasa de bits mayor de la que tu conexi\u00f3n puede soportar.",
"LabelConversionCpuCoreLimit": "L\u00edmite de n\u00facleos del procesador:",
"LabelConversionCpuCoreLimitHelp": "Limitar la cantidad de n\u00facleos del procesador que se utilizan para los trabajos de sincronizaci\u00f3n.",
"OptionEnableFullSpeedConversion": "Activar la conversi\u00f3n a m\u00e1xima velocidad",
"OptionEnableFullSpeedConversionHelp": "Por defecto, la conversi\u00f3n de las sinronizaciones se realiza a baja velocidad para minimizar el uso de recursos.",
"HeaderPlaylists": "Listas de reproducci\u00f3n",
"HeaderViewStyles": "Estilos de vistas",
"LabelSelectViewStyles": "Enable enhanced presentations for:",
"LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
"TabPhotos": "Photos",
@ -1585,7 +1587,7 @@
"LabelEpisode": "Episodio",
"Series": "Series",
"LabelStopping": "Deteniendo",
"LabelCancelled": "(cancelado)",
"LabelCancelled": "Cancelado",
"ButtonDownload": "Descargar",
"SyncJobStatusQueued": "Queued",
"SyncJobStatusConverting": "Converting",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Poistu",
"LabelVisitCommunity": "K\u00e4y Yhteis\u00f6ss\u00e4",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Quitter",
"LabelVisitCommunity": "Visiter la Communaut\u00e9",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Quitter",
"LabelVisitCommunity": "Visiter la Communaut\u00e9",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Verlasse",
"LabelVisitCommunity": "Bsuech d'Community",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "\u05d9\u05e6\u05d9\u05d0\u05d4",
"LabelVisitCommunity": "\u05d1\u05e7\u05e8 \u05d1\u05e7\u05d4\u05d9\u05dc\u05d4",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Izlaz",
"LabelVisitCommunity": "Posjeti zajednicu",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Kil\u00e9p\u00e9s",
"LabelVisitCommunity": "K\u00f6z\u00f6ss\u00e9g",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Keluar",
"LabelVisitCommunity": "Kunjungi Komunitas",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Esci",
"LabelVisitCommunity": "Visita la Community",
"LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "\u0428\u044b\u0493\u0443",
"LabelVisitCommunity": "\u049a\u0430\u0443\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u049b\u049b\u0430 \u0431\u0430\u0440\u0443",
"LabelGithub": "GitHub \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439\u0456",
@ -1583,9 +1585,9 @@
"LabelMovie": "\u0424\u0438\u043b\u044c\u043c",
"LabelMusicVideo": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435",
"LabelEpisode": "\u0411\u04e9\u043b\u0456\u043c",
"Series": "Series",
"Series": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f",
"LabelStopping": "\u0422\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0443\u0434\u0430",
"LabelCancelled": "(\u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b)",
"LabelCancelled": "\u0411\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b",
"ButtonDownload": "\u0416\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443",
"SyncJobStatusQueued": "\u041a\u0435\u0437\u0435\u043a\u0442\u0435",
"SyncJobStatusConverting": "\u0422\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443\u0434\u0435",
@ -2288,7 +2290,7 @@
"ErrorAddingMediaPathToVirtualFolder": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0436\u043e\u043b\u044b\u043d \u04af\u0441\u0442\u0435\u0433\u0435\u043d \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u0416\u043e\u043b \u0434\u04b1\u0440\u044b\u0441 \u0435\u043a\u0435\u043d\u0456\u043d\u0435 \u0436\u04d9\u043d\u0435 Emby Server \u043f\u0440\u043e\u0446\u0435\u0441\u0456 \u043e\u0441\u044b \u0436\u0430\u0439\u0493\u0430\u0441\u044b\u043c\u0493\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0439\u0442\u044b\u043d\u0430 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437.",
"ErrorRemovingEmbyConnectAccount": "Emby Connect \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u0411\u0435\u043b\u0441\u0435\u043d\u0434\u0456 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u049b\u043e\u0441\u044b\u043b\u044b\u043c\u044b \u0431\u0430\u0440 \u0435\u043a\u0435\u043d\u0456\u043d\u0435 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437 \u0436\u04d9\u043d\u0435 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u043a\u0435\u0439\u0456\u043d \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437.",
"ErrorAddingEmbyConnectAccount1": "Emby Connect \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d \u04af\u0441\u0442\u0435\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d \u0436\u0430\u0441\u0430\u0434\u044b\u04a3\u044b\u0437 \u0431\u0430? {0} \u0436\u0430\u043d\u044b\u043d\u0434\u0430 \u0442\u0456\u0440\u043a\u0435\u043b\u0456\u04a3\u0456\u0437.",
"ErrorAddingEmbyConnectAccount2": "\u0422\u0456\u0440\u043a\u0435\u043b\u0433\u0456 \u0436\u0430\u0441\u0430\u0493\u0430\u043d\u043d\u0430\u043d \u043a\u0435\u0439\u0456\u043d \u044d-\u043f\u043e\u0448\u0442\u0430\u043c\u0435\u043d \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0433\u0435\u043d \u043d\u04b1\u0441\u049b\u0430\u0443\u043b\u0430\u0440\u0493\u0430 \u0441\u04d9\u0439\u043a\u0435\u0441 Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u0440\u0456\u043b\u0433\u0435\u043d\u0456\u043d\u0435 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437. \u0415\u0433\u0435\u0440 \u043e\u0441\u044b \u044d-\u043f\u043e\u0448\u0442\u0430 \u0430\u043b\u044b\u043d\u0431\u0430\u0493\u0430\u043d \u0431\u043e\u043b\u0441\u0430, Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d\u0434\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0493\u0430\u043d \u044d-\u043f\u043e\u0448\u0442\u0430 \u0430\u0440\u049b\u044b\u043b\u044b {0} \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b\u043d\u0430 \u0445\u0430\u0431\u0430\u0440 \u0436\u0456\u0431\u0435\u0440\u0456\u04a3\u0456\u0437.",
"ErrorAddingEmbyConnectAccount2": "\u0422\u0456\u0440\u043a\u0435\u043b\u0433\u0456 \u0436\u0430\u0441\u0430\u0493\u0430\u043d\u043d\u0430\u043d \u043a\u0435\u0439\u0456\u043d \u044d-\u043f\u043e\u0448\u0442\u0430\u043c\u0435\u043d \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0433\u0435\u043d \u043d\u04b1\u0441\u049b\u0430\u0443\u043b\u0430\u0440\u0493\u0430 \u0441\u04d9\u0439\u043a\u0435\u0441 Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u0440\u0443\u0456\u043d\u0435 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437. \u0415\u0433\u0435\u0440 \u0441\u0456\u0437 \u043e\u0441\u044b \u044d-\u043f\u043e\u0448\u0442\u0430 \u0430\u043b\u043c\u0430\u0493\u0430\u043d \u0431\u043e\u043b\u0441\u0430\u04a3\u044b\u0437, Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d\u0434\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0493\u0430\u043d \u044d-\u043f\u043e\u0448\u0442\u0430 \u0430\u0440\u049b\u044b\u043b\u044b {0} \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b\u043d\u0430 \u0445\u0430\u0431\u0430\u0440 \u0436\u0456\u0431\u0435\u0440\u0456\u04a3\u0456\u0437.",
"HeaderFavoriteArtists": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440",
"HeaderFavoriteSongs": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u04d9\u0443\u0435\u043d\u0434\u0435\u0440",
"HeaderConfirmPluginInstallation": "\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u043c\u044b\u043d \u0440\u0430\u0441\u0442\u0430\u0443",
@ -2332,7 +2334,7 @@
"LabelAllowHWTranscoding": "\u0410\u043f\u043f\u0430\u0440\u0430\u0442\u0442\u044b\u049b \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443\u0493\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
"AllowHWTranscodingHelp": "If enabled, allow the tuner to transcode streams on the fly. This may help reduce transcoding required by Emby Server.",
"OptionRequirePerfectSubtitleMatch": "Only download subtitles that are a perfect match for my video files",
"ErrorAddingGuestAccount1": "There was an error adding the Emby Connect account. Has your guest created an Emby account? They can sign up at {0}.",
"ErrorAddingGuestAccount2": "Please ensure your guest has completed activation by following the instructions in the email sent after creating the account. If they did not receive this email then please send an email to {0}, and include your email address as well as theirs.",
"ErrorAddingGuestAccount1": "Emby Connect \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d \u04af\u0441\u0442\u0435\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u049a\u043e\u043d\u0430\u0493\u044b\u04a3\u044b\u0437 Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d \u0436\u0430\u0441\u0430\u0434\u044b \u043c\u0430? \u041e\u043b {0} \u0436\u0430\u043d\u044b\u043d\u0434\u0430 \u0442\u0456\u0440\u043a\u0435\u043b\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.",
"ErrorAddingGuestAccount2": "\u0422\u0456\u0440\u043a\u0435\u043b\u0433\u0456 \u0436\u0430\u0441\u0430\u0493\u0430\u043d\u043d\u0430\u043d \u043a\u0435\u0439\u0456\u043d \u044d-\u043f\u043e\u0448\u0442\u0430\u043c\u0435\u043d \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0433\u0435\u043d \u043d\u04b1\u0441\u049b\u0430\u0443\u043b\u0430\u0440\u0493\u0430 \u0441\u04d9\u0439\u043a\u0435\u0441, \u049b\u043e\u043d\u0430\u0493\u044b\u04a3\u044b\u0437 \u0436\u0430\u0441\u0430\u0493\u0430\u043d\u043d\u0430\u043d \u043a\u0435\u0439\u0456\u043d \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u0440\u0443\u0456\u043d \u0430\u044f\u049b\u0442\u0430\u0493\u0430\u043d\u044b\u043d\u0430 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437. \u0415\u0433\u0435\u0440 \u043e\u043b \u043e\u0441\u044b \u044d-\u043f\u043e\u0448\u0442\u0430\u043d\u044b \u0430\u043b\u043c\u0430\u0493\u0430\u043d \u0431\u043e\u043b\u0441\u0430, \u04e9\u0437\u0456\u04a3\u0456\u0437\u0434\u0456\u04a3 \u0436\u04d9\u043d\u0435 \u043e\u043d\u044b\u04a3 \u044d-\u043f\u043e\u0448\u0442\u0430 \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u043b\u0430\u0440\u044b\u043d \u049b\u043e\u0441\u044b\u043f \u044d-\u043f\u043e\u0448\u0442\u0430 \u0430\u0440\u049b\u044b\u043b\u044b {0} \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b\u043d\u0430 \u0445\u0430\u0431\u0430\u0440 \u0436\u0456\u0431\u0435\u0440\u0456\u04a3\u0456\u0437.",
"GuestUserNotFound": "User not found. Please ensure the name is correct and try again, or try entering their email address."
}

View file

@ -1,4 +1,6 @@
{
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "\uc885\ub8cc",
"LabelVisitCommunity": "\ucee4\ubba4\ub2c8\ud2f0 \ubc29\ubb38",
"LabelGithub": "Github",

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