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": {}, "devDependencies": {},
"ignore": [], "ignore": [],
"version": "1.2.25", "version": "1.2.26",
"_release": "1.2.25", "_release": "1.2.26",
"_resolution": { "_resolution": {
"type": "version", "type": "version",
"tag": "1.2.25", "tag": "1.2.26",
"commit": "7d3165462b584cfe4e1a76dd0afd4bade40274f5" "commit": "7e13c8d9c17a4946681b3485c5fbf3e62f39cd2f"
}, },
"_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_source": "https://github.com/MediaBrowser/emby-webcomponents.git",
"_target": "^1.2.0", "_target": "^1.2.0",

View file

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

View file

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

View file

@ -1,6 +1,6 @@
{ {
"name": "hls.js", "name": "hls.js",
"version": "0.5.21", "version": "0.5.22",
"license": "Apache-2.0", "license": "Apache-2.0",
"description": "Media Source Extension - HLS library, by/for Dailymotion", "description": "Media Source Extension - HLS library, by/for Dailymotion",
"homepage": "https://github.com/dailymotion/hls.js", "homepage": "https://github.com/dailymotion/hls.js",
@ -16,11 +16,11 @@
"test", "test",
"tests" "tests"
], ],
"_release": "0.5.21", "_release": "0.5.22",
"_resolution": { "_resolution": {
"type": "version", "type": "version",
"tag": "v0.5.21", "tag": "v0.5.22",
"commit": "25b13e24bbd97785da7e255db117902e692c09dd" "commit": "ed41f6bffac7c6e35963c8aa741e00be8edea2c8"
}, },
"_source": "git://github.com/dailymotion/hls.js.git", "_source": "git://github.com/dailymotion/hls.js.git",
"_target": "~0.5.7", "_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_LOAD_TIMEOUT```raised when fragment loading fails because of a timeout
- ```Hls.ErrorDetails.FRAG_DECRYPT_ERROR```raised when fragment decryption fails - ```Hls.ErrorDetails.FRAG_DECRYPT_ERROR```raised when fragment decryption fails
- ```Hls.ErrorDetails.FRAG_PARSING_ERROR```raised when fragment parsing 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_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_APPENDING_ERROR```raised when exception is raised during buffer appending
- ```Hls.ErrorDetails.BUFFER_STALLED_ERROR```raised when playback stalls because the buffer runs out - ```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) default value is -1 (no level capping)
## Version Control
#### ```Hls.version```
static getter: return hls.js dist version number
## Network Loading Control API ## Network Loading Control API
@ -615,7 +620,7 @@ full list of Events available below :
- `Hls.Events.FRAG_LOADING` - fired when a fragment loading starts - `Hls.Events.FRAG_LOADING` - fired when a fragment loading starts
- data: { frag : fragment object} - data: { frag : fragment object}
- `Hls.Events.FRAG_LOAD_PROGRESS` - fired when a fragment load is in progress - `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 - `Hls.Events.FRAG_LOADED` - fired when a fragment loading is completed
- data: { frag : fragment object, payload : fragment payload, stats : { trequest, tfirst, tload, length}} - 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 - `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 } - data: { frag : fragment object }
- `Hls.Events.FPS_DROP` - triggered when FPS drop in last monitoring period is higher than given threshold - `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} - 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 - `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} - 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. - `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 ### Media Errors
- ```Hls.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR```raised when manifest only contains quality level with codecs incompatible with MediaSource Engine. - ```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} - 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 - ```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} - 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 - ```Hls.ErrorDetails.BUFFER_APPENDING_ERROR```raised when exception is raised during buffer appending

View file

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

View file

@ -93,7 +93,7 @@ header {
<video id="video" controls autoplay class="videoCentered"></video><br> <video id="video" controls autoplay class="videoCentered"></video><br>
<canvas id="buffered_c" height="15" class="videoCentered" onclick="buffered_seek(event);"></canvas><br><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"> <div class="center" id="toggleButtons">
<button type="button" class="btn btn-sm" onclick="$('#PlaybackControl').toggle();">toggle playback controls</button> <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: case Hls.ErrorDetails.BUFFER_APPEND_ERROR:
$("#HlsStatus").text("Buffer Append Error"); $("#HlsStatus").text("Buffer Append Error");
break; 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: case Hls.ErrorDetails.BUFFER_APPENDING_ERROR:
$("#HlsStatus").text("Buffer Appending Error"); $("#HlsStatus").text("Buffer Appending Error");
break; 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 #/bin/sh
git checkout gh-pages git checkout gh-pages
git rebase v0.5.x git rebase master
git push origin gh-pages --force git push origin gh-pages --force
git checkout v0.5.x git checkout master

View file

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

View file

@ -67,7 +67,7 @@ class BufferController extends EventHandler {
this.mediaSource = null; this.mediaSource = null;
this.media = null; this.media = null;
this.pendingTracks = null; this.pendingTracks = null;
this.sourceBuffer = null; this.sourceBuffer = {};
} }
this.onmso = this.onmse = this.onmsc = null; this.onmso = this.onmse = this.onmsc = null;
this.hls.trigger(Event.MEDIA_DETACHED); this.hls.trigger(Event.MEDIA_DETACHED);
@ -122,18 +122,16 @@ class BufferController extends EventHandler {
onBufferReset() { onBufferReset() {
var sourceBuffer = this.sourceBuffer; var sourceBuffer = this.sourceBuffer;
if (sourceBuffer) { for(var type in sourceBuffer) {
for(var type in sourceBuffer) { var sb = sourceBuffer[type];
var sb = sourceBuffer[type]; try {
try { this.mediaSource.removeSourceBuffer(sb);
this.mediaSource.removeSourceBuffer(sb); sb.removeEventListener('updateend', this.onsbue);
sb.removeEventListener('updateend', this.onsbue); sb.removeEventListener('error', this.onsbe);
sb.removeEventListener('error', this.onsbe); } catch(err) {
} catch(err) {
}
} }
this.sourceBuffer = null;
} }
this.sourceBuffer = {};
this.flushRange = []; this.flushRange = [];
this.appended = 0; this.appended = 0;
} }
@ -146,19 +144,24 @@ class BufferController extends EventHandler {
return; return;
} }
if (!this.sourceBuffer) { var sourceBuffer = this.sourceBuffer,mediaSource = this.mediaSource;
var sourceBuffer = {}, mediaSource = this.mediaSource;
for (trackName in tracks) { for (trackName in tracks) {
if(!sourceBuffer[trackName]) {
track = tracks[trackName]; track = tracks[trackName];
// use levelCodec as first priority // use levelCodec as first priority
codec = track.levelCodec || track.codec; codec = track.levelCodec || track.codec;
mimeType = `${track.container};codecs=${codec}`; mimeType = `${track.container};codecs=${codec}`;
logger.log(`creating sourceBuffer with mimeType:${mimeType}`); logger.log(`creating sourceBuffer with mimeType:${mimeType}`);
sb = sourceBuffer[trackName] = mediaSource.addSourceBuffer(mimeType); try {
sb.addEventListener('updateend', this.onsbue); sb = sourceBuffer[trackName] = mediaSource.addSourceBuffer(mimeType);
sb.addEventListener('error', this.onsbe); 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 // let's recompute this.appended, which is used to avoid flush looping
var appended = 0; var appended = 0;
var sourceBuffer = this.sourceBuffer; var sourceBuffer = this.sourceBuffer;
if (sourceBuffer) { for (var type in sourceBuffer) {
for (var type in sourceBuffer) { appended += sourceBuffer[type].buffered.length;
appended += sourceBuffer[type].buffered.length;
}
} }
this.appended = appended; this.appended = appended;
this.hls.trigger(Event.BUFFER_FLUSHED); this.hls.trigger(Event.BUFFER_FLUSHED);
@ -251,9 +252,16 @@ class BufferController extends EventHandler {
var segment = segments.shift(); var segment = segments.shift();
try { try {
//logger.log(`appending ${segment.type} SB, size:${segment.data.length}); //logger.log(`appending ${segment.type} SB, size:${segment.data.length});
sourceBuffer[segment.type].appendBuffer(segment.data); if(sourceBuffer[segment.type]) {
this.appendError = 0; sourceBuffer[segment.type].appendBuffer(segment.data);
this.appended++; 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) { } catch(err) {
// in case any error occured while appending, put back segment in segments table // in case any error occured while appending, put back segment in segments table
logger.error(`error while trying to append buffer:${err.message}`); 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 { class CapLevelController extends EventHandler {
constructor(hls) { constructor(hls) {
super(hls, super(hls,
Event.FPS_DROP_LEVEL_CAPPING,
Event.MEDIA_ATTACHING, Event.MEDIA_ATTACHING,
Event.MANIFEST_PARSED); Event.MANIFEST_PARSED);
} }
destroy() { destroy() {
if (this.hls.config.capLevelToPlayerSize) { if (this.hls.config.capLevelToPlayerSize) {
this.media = null; this.media = this.restrictedLevels = null;
this.autoLevelCapping = Number.POSITIVE_INFINITY; this.autoLevelCapping = Number.POSITIVE_INFINITY;
if (this.timer) { if (this.timer) {
this.timer = clearInterval(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) { onMediaAttaching(data) {
this.media = data.media instanceof HTMLVideoElement ? data.media : null; 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) * 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) { getMaxLevel(capLevelIndex) {
let result, let result = 0,
i, i,
level, level,
mWidth = this.mediaWidth, mWidth = this.mediaWidth,
@ -66,6 +76,9 @@ class CapLevelController extends EventHandler {
for (i = 0; i <= capLevelIndex; i++) { for (i = 0; i <= capLevelIndex; i++) {
level = this.levels[i]; level = this.levels[i];
if (this.isLevelRestricted(i)) {
break;
}
result = i; result = i;
lWidth = level.width; lWidth = level.width;
lHeight = level.height; lHeight = level.height;
@ -76,6 +89,10 @@ class CapLevelController extends EventHandler {
return result; return result;
} }
isLevelRestricted(level) {
return (this.restrictedLevels && this.restrictedLevels.indexOf(level) !== -1) ? true : false;
}
get contentScaleFactor() { get contentScaleFactor() {
let pixelRatio = 1; let pixelRatio = 1;
try { try {

View file

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

View file

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

View file

@ -36,6 +36,8 @@ export const ErrorDetails = {
KEY_LOAD_ERROR: 'keyLoadError', KEY_LOAD_ERROR: 'keyLoadError',
// Identifier for decrypt key load timeout error - data: { frag : fragment object} // Identifier for decrypt key load timeout error - data: { frag : fragment object}
KEY_LOAD_TIMEOUT: 'keyLoadTimeOut', 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 // Identifier for a buffer append error - data: append error description
BUFFER_APPEND_ERROR: 'bufferAppendError', BUFFER_APPEND_ERROR: 'bufferAppendError',
// Identifier for a buffer appending error event - data: appending error description // Identifier for a buffer appending error event - data: appending error description

View file

@ -59,8 +59,10 @@ module.exports = {
FRAG_BUFFERED: 'hlsFragBuffered', FRAG_BUFFERED: 'hlsFragBuffered',
// fired when fragment matching with current media position is changing - data : { frag : fragment object } // fired when fragment matching with current media position is changing - data : { frag : fragment object }
FRAG_CHANGED: 'hlsFragChanged', 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', 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} // 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', 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 // 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); LevelHelper.updateFragPTS(newDetails,PTSFrag.sn,PTSFrag.startPTS,PTSFrag.endPTS);
} else { } else {
// ensure that delta is within oldfragments range // ensure that delta is within oldfragments range
// no need to offset start if delta === 0 // also adjust sliding in case delta is 0 (we could have old=[50-60] and new=old=[50-61])
if (delta > 0 && delta < oldfragments.length) { // in that case we also need to adjust start offset of all fragments
if (delta >= 0 && delta < oldfragments.length) {
// adjust start by sliding offset // adjust start by sliding offset
var sliding = oldfragments[delta].start; var sliding = oldfragments[delta].start;
for(i = 0 ; i < newfragments.length ; i++) { 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 StreamController from './controller/stream-controller';
import LevelController from './controller/level-controller'; import LevelController from './controller/level-controller';
import TimelineController from './controller/timeline-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 {logger, enableLogs} from './utils/logger';
import XhrLoader from './utils/xhr-loader'; import XhrLoader from './utils/xhr-loader';
import EventEmitter from 'events'; import EventEmitter from 'events';
@ -21,6 +21,11 @@ import KeyLoader from './loader/key-loader';
class Hls { class Hls {
static get version() {
// replaced with browserify-versionify transform
return '__VERSION__';
}
static isSupported() { static isSupported() {
return (window.MediaSource && window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')); return (window.MediaSource && window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'));
} }
@ -42,6 +47,7 @@ class Hls {
Hls.defaultConfig = { Hls.defaultConfig = {
autoStartLoad: true, autoStartLoad: true,
debug: false, debug: false,
capLevelOnFPSDrop: false,
capLevelToPlayerSize: false, capLevelToPlayerSize: false,
maxBufferLength: 30, maxBufferLength: 30,
maxBufferSize: 60 * 1000 * 1000, maxBufferSize: 60 * 1000 * 1000,
@ -67,8 +73,8 @@ class Hls {
fragLoadingRetryDelay: 1000, fragLoadingRetryDelay: 1000,
fragLoadingLoopThreshold: 3, fragLoadingLoopThreshold: 3,
startFragPrefetch : false, startFragPrefetch : false,
// fpsDroppedMonitoringPeriod: 5000, fpsDroppedMonitoringPeriod: 5000,
// fpsDroppedMonitoringThreshold: 0.2, fpsDroppedMonitoringThreshold: 0.2,
appendErrorMaxRetry: 3, appendErrorMaxRetry: 3,
loader: XhrLoader, loader: XhrLoader,
fLoader: undefined, fLoader: undefined,
@ -76,6 +82,7 @@ class Hls {
abrController : AbrController, abrController : AbrController,
bufferController : BufferController, bufferController : BufferController,
capLevelController : CapLevelController, capLevelController : CapLevelController,
fpsController: FPSController,
streamController: StreamController, streamController: StreamController,
timelineController: TimelineController, timelineController: TimelineController,
enableCEA708Captions: true, enableCEA708Captions: true,
@ -129,10 +136,10 @@ class Hls {
this.abrController = new config.abrController(this); this.abrController = new config.abrController(this);
this.bufferController = new config.bufferController(this); this.bufferController = new config.bufferController(this);
this.capLevelController = new config.capLevelController(this); this.capLevelController = new config.capLevelController(this);
this.fpsController = new config.fpsController(this);
this.streamController = new config.streamController(this); this.streamController = new config.streamController(this);
this.timelineController = new config.timelineController(this); this.timelineController = new config.timelineController(this);
this.keyLoader = new KeyLoader(this); this.keyLoader = new KeyLoader(this);
//this.fpsController = new FPSController(this);
} }
destroy() { destroy() {
@ -145,10 +152,10 @@ class Hls {
this.abrController.destroy(); this.abrController.destroy();
this.bufferController.destroy(); this.bufferController.destroy();
this.capLevelController.destroy(); this.capLevelController.destroy();
this.fpsController.destroy();
this.streamController.destroy(); this.streamController.destroy();
this.timelineController.destroy(); this.timelineController.destroy();
this.keyLoader.destroy(); this.keyLoader.destroy();
//this.fpsController.destroy();
this.url = null; this.url = null;
this.observer.removeAllListeners(); 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}); 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.frag.loaded = stats.loaded;
this.hls.trigger(Event.FRAG_LOAD_PROGRESS, {frag: this.frag, stats: stats}); 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; totalduration-=frag.duration;
} }
level.totalduration = totalduration; level.totalduration = totalduration;
level.averagetargetduration = totalduration / level.fragments.length;
level.endSN = currentSN - 1; level.endSN = currentSN - 1;
return level; return level;
} }
@ -224,7 +225,8 @@ class PlaylistLoader extends EventHandler {
hls = this.hls, hls = this.hls,
levels; levels;
// responseURL not supported on some browsers (it is used to detect URL redirection) // 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 // fallback to initial URL
url = this.url; url = this.url;
} }

View file

@ -132,135 +132,164 @@ class MP4Remuxer {
} }
remuxVideo(track, timeOffset, contiguous) { remuxVideo(track, timeOffset, contiguous) {
var view, var offset = 8,
offset = 8,
pesTimeScale = this.PES_TIMESCALE, pesTimeScale = this.PES_TIMESCALE,
pes2mp4ScaleFactor = this.PES2MP4SCALEFACTOR, pes2mp4ScaleFactor = this.PES2MP4SCALEFACTOR,
avcSample, mp4SampleDuration,
mp4Sample,
mp4SampleLength,
unit,
mdat, moof, mdat, moof,
firstPTS, firstDTS, lastDTS, firstPTS, firstDTS,
pts, dts, ptsnorm, dtsnorm, nextDTS,
flags, lastPTS, lastDTS,
samples = []; 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 /* concatenate the video data and construct the mdat in place
(need 8 more bytes to fill length and mpdat type) */ (need 8 more bytes to fill length and mpdat type) */
mdat = new Uint8Array(track.len + (4 * track.nbNalu) + 8); 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); view.setUint32(0, mdat.byteLength);
mdat.set(MP4.types.mdat, 4); mdat.set(MP4.types.mdat, 4);
while (track.samples.length) {
avcSample = track.samples.shift(); for (let i = 0; i < inputSamples.length; i++) {
mp4SampleLength = 0; let avcSample = inputSamples[i],
mp4SampleLength = 0,
compositionTimeOffset;
// convert NALU bitstream to MP4 format (prepend NALU with size field) // convert NALU bitstream to MP4 format (prepend NALU with size field)
while (avcSample.units.units.length) { while (avcSample.units.units.length) {
unit = avcSample.units.units.shift(); let unit = avcSample.units.units.shift();
view.setUint32(offset, unit.data.byteLength); view.setUint32(offset, unit.data.byteLength);
offset += 4; offset += 4;
mdat.set(unit.data, offset); mdat.set(unit.data, offset);
offset += unit.data.byteLength; offset += unit.data.byteLength;
mp4SampleLength += 4 + unit.data.byteLength; mp4SampleLength += 4 + unit.data.byteLength;
} }
pts = avcSample.pts - this._initDTS;
dts = avcSample.dts - this._initDTS; if(!isSafari) {
// ensure DTS is not bigger than PTS // expected sample duration is the Decoding Timestamp diff of consecutive samples
dts = Math.min(pts,dts); if (i < inputSamples.length - 1) {
//logger.log(`Video/PTS/DTS:${Math.round(pts/90)}/${Math.round(dts/90)}`); mp4SampleDuration = inputSamples[i+1].dts - avcSample.dts;
// 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;
} else { } 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 mp4SampleDuration /= pes2mp4ScaleFactor;
ptsnorm = this._PTSNormalize(pts, nextAvcDts); compositionTimeOffset = Math.round((avcSample.pts - avcSample.dts) / pes2mp4ScaleFactor);
dtsnorm = this._PTSNormalize(dts, nextAvcDts); } else {
delta = Math.round((dtsnorm - nextAvcDts) / 90); compositionTimeOffset = Math.max(0,mp4SampleDuration*Math.round((avcSample.pts - avcSample.dts)/(pes2mp4ScaleFactor*mp4SampleDuration)));
// 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);
} }
//console.log('PTS/DTS/initDTS/normPTS/normDTS/relative PTS : ${avcSample.pts}/${avcSample.dts}/${this._initDTS}/${ptsnorm}/${dtsnorm}/${(avcSample.pts/4294967296).toFixed(3)}'); //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, size: mp4SampleLength,
duration: 0, // constant duration
cts: (ptsnorm - dtsnorm) / pes2mp4ScaleFactor, duration: mp4SampleDuration,
cts: compositionTimeOffset,
flags: { flags: {
isLeading: 0, isLeading: 0,
isDependedOn: 0, isDependedOn: 0,
hasRedundancy: 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; // next AVC sample DTS should be equal to last sample DTS + last sample duration (in PES timescale)
if (samples.length >= 2) { this.nextAvcDts = lastDTS + mp4SampleDuration*pes2mp4ScaleFactor;
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;
track.len = 0; track.len = 0;
track.nbNalu = 0; track.nbNalu = 0;
if(samples.length && navigator.userAgent.toLowerCase().indexOf('chrome') > -1) { if(outputSamples.length && navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
flags = samples[0].flags; let flags = outputSamples[0].flags;
// chrome workaround, mark first sample as being a Random Access Point to avoid sourcebuffer append issue // 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 // https://code.google.com/p/chromium/issues/detail?id=229412
flags.dependsOn = 2; flags.dependsOn = 2;
flags.isNonSync = 0; flags.isNonSync = 0;
} }
track.samples = samples; track.samples = outputSamples;
moof = MP4.moof(track.sequenceNumber++, firstDTS / pes2mp4ScaleFactor, track); moof = MP4.moof(track.sequenceNumber++, firstDTS / pes2mp4ScaleFactor, track);
track.samples = []; track.samples = [];
this.observer.trigger(Event.FRAG_PARSING_DATA, { this.observer.trigger(Event.FRAG_PARSING_DATA, {
data1: moof, data1: moof,
data2: mdat, data2: mdat,
startPTS: firstPTS / pesTimeScale, startPTS: firstPTS / pesTimeScale,
endPTS: (ptsnorm + pes2mp4ScaleFactor * lastSampleDuration) / pesTimeScale, endPTS: (lastPTS + pes2mp4ScaleFactor * mp4SampleDuration) / pesTimeScale,
startDTS: firstDTS / pesTimeScale, startDTS: firstDTS / pesTimeScale,
endDTS: this.nextAvcDts / pesTimeScale, endDTS: this.nextAvcDts / pesTimeScale,
type: 'video', type: 'video',
nb: samples.length nb: outputSamples.length
}); });
} }
@ -299,7 +328,7 @@ class MP4Remuxer {
mp4Sample.duration = (dtsnorm - lastDTS) / pes2mp4ScaleFactor; mp4Sample.duration = (dtsnorm - lastDTS) / pes2mp4ScaleFactor;
if(Math.abs(mp4Sample.duration - expectedSampleDuration) > expectedSampleDuration/10) { if(Math.abs(mp4Sample.duration - expectedSampleDuration) > expectedSampleDuration/10) {
// more than 10% diff between sample duration and expectedSampleDuration .... lets log that // 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 // always adjust sample duration to avoid av sync issue
mp4Sample.duration = expectedSampleDuration; mp4Sample.duration = expectedSampleDuration;
@ -327,7 +356,7 @@ class MP4Remuxer {
track.len -= unit.byteLength; track.len -= unit.byteLength;
continue; continue;
} }
// set PTS/DTS to next PTS/DTS // set PTS/DTS to expected PTS/DTS
ptsnorm = dtsnorm = nextAacPts; ptsnorm = dtsnorm = nextAacPts;
} }
} }

View file

@ -112,8 +112,11 @@ class XhrLoader {
stats.tfirst = performance.now(); stats.tfirst = performance.now();
} }
stats.loaded = event.loaded; stats.loaded = event.loaded;
if (event.lengthComputable) {
stats.total = event.total;
}
if (this.onProgress) { 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" "web-component-tester": "polymer/web-component-tester#^3.4.0"
}, },
"ignore": [], "ignore": [],
"homepage": "https://github.com/polymerelements/iron-a11y-announcer", "homepage": "https://github.com/PolymerElements/iron-a11y-announcer",
"_release": "1.0.4", "_release": "1.0.4",
"_resolution": { "_resolution": {
"type": "version", "type": "version",
"tag": "v1.0.4", "tag": "v1.0.4",
"commit": "5ce3eb8c4282bb53cd72e348858dc6be6b4c50b9" "commit": "5ce3eb8c4282bb53cd72e348858dc6be6b4c50b9"
}, },
"_source": "git://github.com/polymerelements/iron-a11y-announcer.git", "_source": "git://github.com/PolymerElements/iron-a11y-announcer.git",
"_target": "^1.0.0", "_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", "web-component-tester": "^4.0.0",
"webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.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", "_release": "1.0.8",
"_resolution": { "_resolution": {
"type": "version", "type": "version",
"tag": "v1.0.8", "tag": "v1.0.8",
"commit": "f36b38928849ef3853db727faa8c9ef104d611eb" "commit": "f36b38928849ef3853db727faa8c9ef104d611eb"
}, },
"_source": "git://github.com/polymerelements/iron-icon.git", "_source": "git://github.com/PolymerElements/iron-icon.git",
"_target": "^1.0.0", "_target": "^1.0.0",
"_originalSource": "polymerelements/iron-icon" "_originalSource": "PolymerElements/iron-icon"
} }

View file

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

View file

@ -1,6 +1,6 @@
{ {
"name": "paper-input", "name": "paper-input",
"version": "1.1.10", "version": "1.1.11",
"description": "Material design text fields", "description": "Material design text fields",
"authors": [ "authors": [
"The Polymer Authors" "The Polymer Authors"
@ -33,7 +33,7 @@
"iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0", "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
"iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0", "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0",
"iron-input": "PolymerElements/iron-input#^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" "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0"
}, },
"devDependencies": { "devDependencies": {
@ -48,11 +48,11 @@
"web-component-tester": "^4.0.0", "web-component-tester": "^4.0.0",
"webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
}, },
"_release": "1.1.10", "_release": "1.1.11",
"_resolution": { "_resolution": {
"type": "version", "type": "version",
"tag": "v1.1.10", "tag": "v1.1.11",
"commit": "d8e201099b4b2987bea1dbcf5804c0383544bbfd" "commit": "8cfe5c5bf8c2e40d243443d046a94b6fe371983c"
}, },
"_source": "git://github.com/polymerelements/paper-input.git", "_source": "git://github.com/polymerelements/paper-input.git",
"_target": "^1.0.9", "_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 language: node_js
sudo: false sudo: required
before_script: before_script:
- npm install web-component-tester - npm install -g bower polylint web-component-tester
- npm install bower
- 'export PATH=$PWD/node_modules/.bin:$PATH'
- bower install - bower install
- polylint
env: env:
global: global:
- secure: TcDqx+YdNCa/DRQjdKt9dgYCPgXtPl2EZ7Nnv6bRvbcmUjW2eSr7Zwb+e0fO8wgwms/RqFaVx+u5jo7D1lnC4Ybcg1HKiMOvCyzY36MjF9oB/VKSEUC+p4tMVQfw1IZ/RmK3dD+WEWaoT/EKmNfctz7v5kR+yk2lZo44D9I7rrc= - secure: TcDqx+YdNCa/DRQjdKt9dgYCPgXtPl2EZ7Nnv6bRvbcmUjW2eSr7Zwb+e0fO8wgwms/RqFaVx+u5jo7D1lnC4Ybcg1HKiMOvCyzY36MjF9oB/VKSEUC+p4tMVQfw1IZ/RmK3dD+WEWaoT/EKmNfctz7v5kR+yk2lZo44D9I7rrc=
- secure: nh65tvhnhOrK05qKvDJKMV7Jm9yiCoG1wFkP3ZnqOHix9Ny+KmcTa41Bl6NXQdvYaMTFtzS7lMZX5cqIziyKyGWHVN30LzGMHJNz12fhcMi3nJ84trhQGcu/9qR9yDv16q9ouGlcz1VxnDOHaRAHnIKjLIbhN3aJtMtZBbnWihA= - secure: nh65tvhnhOrK05qKvDJKMV7Jm9yiCoG1wFkP3ZnqOHix9Ny+KmcTa41Bl6NXQdvYaMTFtzS7lMZX5cqIziyKyGWHVN30LzGMHJNz12fhcMi3nJ84trhQGcu/9qR9yDv16q9ouGlcz1VxnDOHaRAHnIKjLIbhN3aJtMtZBbnWihA=
node_js: 4 node_js: stable
addons: addons:
firefox: latest firefox: latest
apt: apt:
@ -17,6 +16,8 @@ addons:
- google-chrome - google-chrome
packages: packages:
- google-chrome-stable - google-chrome-stable
sauce_connect: true
script: script:
- xvfb-run wct - xvfb-run wct
- "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi"
dist: trusty

View file

@ -1,6 +1,6 @@
{ {
"name": "paper-input", "name": "paper-input",
"version": "1.1.10", "version": "1.1.11",
"description": "Material design text fields", "description": "Material design text fields",
"authors": [ "authors": [
"The Polymer Authors" "The Polymer Authors"
@ -33,7 +33,7 @@
"iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0", "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
"iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0", "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0",
"iron-input": "PolymerElements/iron-input#^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" "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0"
}, },
"devDependencies": { "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"> <link rel="import" href="../iron-behaviors/iron-control-state.html">
<script> <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 * Use `Polymer.PaperInputBehavior` to implement inputs with `<paper-input-container>`. This
* behavior is implemented by `<paper-input>`. It exposes a number of properties from * 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 * @polymerBehavior Polymer.PaperInputBehavior
*/ */
Polymer.PaperInputBehaviorImpl = { Polymer.PaperInputBehaviorImpl = {
properties: { properties: {
/** /**
* Fired when the input changes due to user interaction. * 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) { if (target.id) {
this._ariaDescribedBy = this._appendStringWithSpace(this._ariaDescribedBy, target.id); this._ariaDescribedBy = this._appendStringWithSpace(this._ariaDescribedBy, target.id);
} else { } else {
var id = 'paper-input-add-on-' + Math.floor((Math.random() * 100000)); var id = 'paper-input-add-on-' + Polymer.PaperInputHelper.NextAddonID++;
target.id = id; target.id = id;
this._ariaDescribedBy = this._appendStringWithSpace(this._ariaDescribedBy, 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) { if (label.id) {
labelledBy = label.id; labelledBy = label.id;
} else { } else {
labelledBy = 'paper-input-label-' + new Date().getUTCMilliseconds(); labelledBy = 'paper-input-label-' + Polymer.PaperInputHelper.NextLabelID++;
label.id = labelledBy; label.id = labelledBy;
} }
this._ariaLabelledBy = labelledBy; this._ariaLabelledBy = labelledBy;
@ -525,7 +533,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
}); });
} }
} }
}; }
/** @polymerBehavior */ /** @polymerBehavior */
Polymer.PaperInputBehavior = [ Polymer.PaperInputBehavior = [

View file

@ -25,7 +25,7 @@ For example:
<input is="iron-input"> <input is="iron-input">
</paper-input-container> </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. Doing so may cause events to bounce infintely between the container and its contained element.
### Listening for input changes ### Listening for input changes

View file

@ -1,4 +1,5 @@
<!DOCTYPE html><!-- <!DOCTYPE html><!--
@license
Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 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 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 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

@ -1,5 +1,6 @@
<!doctype html> <!doctype html>
<!-- <!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved. 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 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 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

@ -1,5 +1,6 @@
<!doctype html> <!doctype html>
<!-- <!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved. 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 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 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

@ -1,5 +1,6 @@
<!doctype html> <!doctype html>
<!-- <!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved. 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 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 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

@ -1,5 +1,6 @@
<!doctype html> <!doctype html>
<!-- <!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved. 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 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 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> </template>
</test-fixture> </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> <script>
suite('basic', function() { suite('basic', function() {
@ -274,11 +284,24 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
}); });
suite('a11y', function() { suite('a11y', function() {
test('has aria-labelledby, which is monotonically increasing', function() {
var inputs = fixture('multiple-inputs');
test('has aria-labelledby', function() { // Find the first index of the input in this fixture. Since the label
var input = fixture('label'); // ids monotonically increase every time a new input is created, and
assert.isTrue(input.inputElement.hasAttribute('aria-labelledby')) // this fixture isn't the first one in the document, we're going to start
assert.equal(input.inputElement.getAttribute('aria-labelledby'), Polymer.dom(input.root).querySelector('label').id, 'aria-labelledby points to the label'); // 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() { test('has aria-describedby for error message', function() {

View file

@ -1,5 +1,6 @@
<!doctype html> <!doctype html>
<!-- <!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved. 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 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 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

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

View file

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

View file

@ -1,6 +1,6 @@
{ {
"name": "paper-item", "name": "paper-item",
"version": "1.2.0", "version": "1.2.1",
"description": "A material-design styled list item", "description": "A material-design styled list item",
"authors": [ "authors": [
"The Polymer 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="../iron-flex-layout/iron-flex-layout.html">
<link rel="import" href="../paper-styles/color.html"> <link rel="import" href="../paper-styles/color.html">
<link rel="import" href="../paper-styles/default-theme.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"> <dom-module id="paper-item-shared-styles">
<template> <template>

View file

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

View file

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

View file

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

View file

@ -7,7 +7,7 @@
* Code distributed by Google as part of the polymer project is also * 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 * 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") { if (typeof WeakMap === "undefined") {
(function() { (function() {
var defineProperty = Object.defineProperty; var defineProperty = Object.defineProperty;
@ -778,6 +778,9 @@ window.CustomElements.addModule(function(scope) {
definition.prototype = Object.create(HTMLElement.prototype); definition.prototype = Object.create(HTMLElement.prototype);
} }
definition.__name = name.toLowerCase(); definition.__name = name.toLowerCase();
if (definition.extends) {
definition.extends = definition.extends.toLowerCase();
}
definition.lifecycle = definition.lifecycle || {}; definition.lifecycle = definition.lifecycle || {};
definition.ancestry = ancestry(definition.extends); definition.ancestry = ancestry(definition.extends);
resolveTagName(definition); resolveTagName(definition);
@ -950,21 +953,6 @@ window.CustomElements.addModule(function(scope) {
} }
wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode"); wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode");
wrapDomMethodToForceUpgrade(document, "importNode"); 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.registerElement = register;
document.createElement = createElement; document.createElement = createElement;
document.createElementNS = createElementNS; 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 * 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 * 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") { if (typeof WeakMap === "undefined") {
(function() { (function() {
var defineProperty = Object.defineProperty; 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 * 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 * 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") { if (typeof WeakMap === "undefined") {
(function() { (function() {
var defineProperty = Object.defineProperty; 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 * 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 * 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") { if (typeof WeakMap === "undefined") {
(function() { (function() {
var defineProperty = Object.defineProperty; var defineProperty = Object.defineProperty;

File diff suppressed because one or more lines are too long

View file

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

View file

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

View file

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

File diff suppressed because one or more lines are too long

View file

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

View file

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

View file

@ -779,11 +779,28 @@ paper-input + .fieldDescription {
} }
.mainDrawerPanel:not([narrow]) .content-primary { .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 { .mainDrawerPanel:not([narrow]) .withTabs .content-primary {
padding-top: 135px!important; padding-top: 135px !important;
} }
.mainDrawerPanel:not([narrow]) .content-primary ul:first-child { .mainDrawerPanel:not([narrow]) .content-primary ul:first-child {

View file

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

View file

@ -43,7 +43,7 @@
</div> </div>
</div> </div>
<div class="paperCheckboxListLabel">${HeaderFetchImages}</div> <div class="paperListLabel">${HeaderFetchImages}</div>
<div class="imageSelections paperCheckboxList"> <div class="imageSelections paperCheckboxList">
<paper-checkbox class="imageType hide" data-imagetype="Primary">${OptionDownloadPrimaryImage}</paper-checkbox> <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" /> <input type="text" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" />
</div> </div>
<div class="paperCheckboxListLabel">${HeaderDownloadSubtitlesFor}</div> <div class="paperListLabel">${HeaderDownloadSubtitlesFor}</div>
<div class="paperCheckboxList"> <div class="paperCheckboxList">
<paper-checkbox id="chkSubtitlesMovies">${OptionMovies}</paper-checkbox> <paper-checkbox id="chkSubtitlesMovies">${OptionMovies}</paper-checkbox>
<paper-checkbox id="chkSubtitlesEpisodes">${OptionEpisodes}</paper-checkbox> <paper-checkbox id="chkSubtitlesEpisodes">${OptionEpisodes}</paper-checkbox>
</div> </div>
<br /> <br />
<div> <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 class="downloadLanguages paperList paperCheckboxList" style="max-height: 150px; overflow-y: auto; padding: .5em 1em;">
</div> </div>
</div> </div>

View file

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

View file

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

View file

@ -59,7 +59,13 @@
if (item.PremiereDate) { if (item.PremiereDate) {
try { 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) { } catch (err) {
} }

View file

@ -1157,6 +1157,16 @@
ironIcon: 'call-merge' ironIcon: 'call-merge'
}); });
items.push({
name: Globalize.translate('MarkPlayed'),
id: 'markplayed'
});
items.push({
name: Globalize.translate('MarkUnplayed'),
id: 'markunplayed'
});
items.push({ items.push({
name: Globalize.translate('ButtonRefresh'), name: Globalize.translate('ButtonRefresh'),
id: 'refresh', id: 'refresh',
@ -1203,6 +1213,18 @@
case 'groupvideos': case 'groupvideos':
combineVersions($.mobile.activePage, items); combineVersions($.mobile.activePage, items);
break; 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': case 'refresh':
items.map(function (itemId) { 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 // add a delay to continue building up the buffer. without this we see failures in safari mobile
setTimeout(function () { setTimeout(function () {
self.playVideoInternal(item, mediaSource, startPosition, streamInfo, callback); self.playVideoInternal(item, mediaSource, startPosition, streamInfo, callback);
}, 2000); }, 0);
}, function () { }, function () {
Dashboard.hideLoadingMsg(); Dashboard.hideLoadingMsg();

View file

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

View file

@ -179,7 +179,7 @@
} }
var cacheKey = 'lastappinfopresent5'; 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(''); return Promise.resolve('');
} }

View file

@ -62,7 +62,13 @@
if (item.PremiereDate) { if (item.PremiereDate) {
try { 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) { } catch (err) {
} }

View file

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

View file

@ -4,7 +4,7 @@
var html = ''; 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;">'; html += '<div class="paperCheckboxList paperList" style="padding:.5em 1em;">';
@ -28,7 +28,7 @@
var html = ''; 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;">'; html += '<div class="paperCheckboxList paperList" style="padding:.5em 1em;">';

View file

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

View file

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

View file

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

View file

@ -41,7 +41,7 @@
"ButtonTermsOfService": "Termes del Servei", "ButtonTermsOfService": "Termes del Servei",
"HeaderDeveloperOptions": "Opcions de desenvolupador", "HeaderDeveloperOptions": "Opcions de desenvolupador",
"OptionEnableWebClientResponseCache": "Habilita mem\u00f2ria cau al web", "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", "OptionEnableWebClientResourceMinification": "Habilita la reducci\u00f3 de recursos al web",
"LabelDashboardSourcePath": "Directori del codi font del client 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.", "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", "ButtonConfigurePinCode": "Configura codi pin",
"HeaderAdultsReadHere": "Adults Llegiu Aqu\u00ed!", "HeaderAdultsReadHere": "Adults Llegiu Aqu\u00ed!",
"RegisterWithPayPal": "Registra amb PayPal", "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:", "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.", "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:", "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.", "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", "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.", "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", "FolderTypeMixed": "Contingut mesclat",
"FolderTypeMovies": "Pel\u00b7l\u00edcules", "FolderTypeMovies": "Pel\u00b7l\u00edcules",
"FolderTypeMusic": "M\u00fasica", "FolderTypeMusic": "M\u00fasica",
@ -535,7 +535,7 @@
"LabelPreferredDisplayLanguageHelp": "La traducci\u00f3 d'Emby \u00e9s un projecte en curs.", "LabelPreferredDisplayLanguageHelp": "La traducci\u00f3 d'Emby \u00e9s un projecte en curs.",
"LabelReadHowYouCanContribute": "Apr\u00e8n com pots contribuir.", "LabelReadHowYouCanContribute": "Apr\u00e8n com pots contribuir.",
"HeaderNewCollection": "Nova Col\u00b7lecci\u00f3", "HeaderNewCollection": "Nova Col\u00b7lecci\u00f3",
"ButtonSubmit": "Submit", "ButtonSubmit": "Envia",
"ButtonCreate": "Crea", "ButtonCreate": "Crea",
"LabelCustomCss": "CSS propi:", "LabelCustomCss": "CSS propi:",
"LabelCustomCssHelp": "Aplica el teu propi css a la interf\u00edcie web.", "LabelCustomCssHelp": "Aplica el teu propi css a la interf\u00edcie web.",
@ -567,7 +567,7 @@
"TabActivityLog": "Registre d'Activitat", "TabActivityLog": "Registre d'Activitat",
"TabSmartMatches": "Smart Matches", "TabSmartMatches": "Smart Matches",
"TabSmartMatchInfo": "Manage your smart matches that were added using the Auto-Organize correction dialog", "TabSmartMatchInfo": "Manage your smart matches that were added using the Auto-Organize correction dialog",
"HeaderName": "Name", "HeaderName": "Nom",
"HeaderDate": "Data", "HeaderDate": "Data",
"HeaderSource": "Origen", "HeaderSource": "Origen",
"HeaderStatus": "Estat", "HeaderStatus": "Estat",
@ -1544,8 +1544,8 @@
"MessageKeyEmailedTo": "Key emailed to {0}.", "MessageKeyEmailedTo": "Key emailed to {0}.",
"MessageKeysLinked": "Keys linked.", "MessageKeysLinked": "Keys linked.",
"HeaderConfirmation": "Confirmation", "HeaderConfirmation": "Confirmation",
"MessageKeyUpdated": "Thank you. Your Emby Premiere key has been updated.", "MessageKeyUpdated": "Gr\u00e0cies. La teva clau Emby Premiere ha estat actualitzada.",
"MessageKeyRemoved": "Thank you. Your Emby Premiere key has been removed.", "MessageKeyRemoved": "Gr\u00e0cies. La teva clau Emby Premiere ha estat eliminada.",
"TextEnjoyBonusFeatures": "Gaudeix de caracter\u00edstiques addicionals", "TextEnjoyBonusFeatures": "Gaudeix de caracter\u00edstiques addicionals",
"ButtonCancelSyncJob": "Cancel\u00b7la sync", "ButtonCancelSyncJob": "Cancel\u00b7la sync",
"HeaderAddTag": "Afegir Etiqueta", "HeaderAddTag": "Afegir Etiqueta",
@ -1585,7 +1585,7 @@
"LabelEpisode": "Episode", "LabelEpisode": "Episode",
"Series": "Series", "Series": "Series",
"LabelStopping": "Stopping", "LabelStopping": "Stopping",
"LabelCancelled": "(cancel\u00b7lat)", "LabelCancelled": "Cancel\u00b7lat",
"ButtonDownload": "Descarrega", "ButtonDownload": "Descarrega",
"SyncJobStatusQueued": "Queued", "SyncJobStatusQueued": "Queued",
"SyncJobStatusConverting": "Converting", "SyncJobStatusConverting": "Converting",
@ -2085,8 +2085,8 @@
"TabExpert": "Expert", "TabExpert": "Expert",
"HeaderSelectCustomIntrosPath": "Select Custom Intros Path", "HeaderSelectCustomIntrosPath": "Select Custom Intros Path",
"HeaderRateAndReview": "Rate and Review", "HeaderRateAndReview": "Rate and Review",
"HeaderThankYou": "Thank You", "HeaderThankYou": "Gr\u00e0cies",
"MessageThankYouForYourReview": "Thank you for your review.", "MessageThankYouForYourReview": "Gr\u00e0cies per la teva valoraci\u00f3.",
"LabelYourRating": "Your rating:", "LabelYourRating": "Your rating:",
"LabelFullReview": "Full review:", "LabelFullReview": "Full review:",
"LabelShortRatingDescription": "Short rating summary:", "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.", "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.", "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", "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", "HeaderTryPlayback": "Try Playback",
"HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere", "HeaderBenefitsEmbyPremiere": "Benefits of Emby Premiere",
"MobileSyncFeatureDescription": "Sync your media to your smart phones and tablets for easy offline access.", "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", "LabelExit": "Zav\u0159\u00edt",
"LabelVisitCommunity": "Nav\u0161t\u00edvit komunitu", "LabelVisitCommunity": "Nav\u0161t\u00edvit komunitu",
"LabelGithub": "Github", "LabelGithub": "Github",
@ -8,7 +10,7 @@
"LabelDeveloperResources": "Zdroje v\u00fdvoj\u00e1\u0159\u016f", "LabelDeveloperResources": "Zdroje v\u00fdvoj\u00e1\u0159\u016f",
"LabelBrowseLibrary": "Proch\u00e1zet knihovnu", "LabelBrowseLibrary": "Proch\u00e1zet knihovnu",
"LabelConfigureServer": "Konfigurovat Emby", "LabelConfigureServer": "Konfigurovat Emby",
"LabelOpenLibraryViewer": "Otev\u0159\u00edt knihovnu", "LabelOpenLibraryViewer": "Otev\u0159\u00edt prohl\u00ed\u017ee\u010d knihovny",
"LabelRestartServer": "Restartovat server", "LabelRestartServer": "Restartovat server",
"LabelShowLogWindow": "Zobrazit okno \u017eurn\u00e1lu", "LabelShowLogWindow": "Zobrazit okno \u017eurn\u00e1lu",
"LabelPrevious": "P\u0159edchoz\u00ed", "LabelPrevious": "P\u0159edchoz\u00ed",
@ -227,7 +229,7 @@
"OptionResumable": "Pozastavaviteln\u00fd", "OptionResumable": "Pozastavaviteln\u00fd",
"ScheduledTasksHelp": "Klikn\u011bte na \u00falohu pro zobrazen\u00ed rozvrhu.", "ScheduledTasksHelp": "Klikn\u011bte na \u00falohu pro zobrazen\u00ed rozvrhu.",
"ScheduledTasksTitle": "Rozvrh \u00faloh", "ScheduledTasksTitle": "Rozvrh \u00faloh",
"TabMyPlugins": "Moje pluginy", "TabMyPlugins": "Moje z\u00e1suvn\u00e9 moduly",
"TabCatalog": "Katalog", "TabCatalog": "Katalog",
"TitlePlugins": "Z\u00e1suvn\u00e9 moduly", "TitlePlugins": "Z\u00e1suvn\u00e9 moduly",
"HeaderAutomaticUpdates": "Automatick\u00e9 aktualizace", "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-", "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", "LabelEnableDebugLogging": "Povolit z\u00e1znam pro lad\u011bn\u00ed",
"LabelRunServerAtStartup": "Spustit server p\u0159i startu", "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", "ButtonSelectDirectory": "Vybrat slo\u017eku",
"LabelCustomPaths": "Specifikujte adres\u00e1\u0159. Nechte pr\u00e1zdn\u00e9 pro defaultn\u00ed nastaven\u00ed.", "LabelCustomPaths": "Specifikujte adres\u00e1\u0159. Nechte pr\u00e1zdn\u00e9 pro defaultn\u00ed nastaven\u00ed.",
"LabelCachePath": "Slo\u017eka pro cache:", "LabelCachePath": "Slo\u017eka pro cache:",
@ -421,7 +423,7 @@
"OptionAutomatic": "Automaticky", "OptionAutomatic": "Automaticky",
"HeaderServices": "Slu\u017eby", "HeaderServices": "Slu\u017eby",
"LiveTvPluginRequired": "P\u0159ed pokra\u010dov\u00e1n\u00edm je vy\u017eadov\u00e1n z\u00e1suvn\u00fd modul Live TV poskytovatele.", "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:", "LabelCustomizeOptionsPerMediaType": "P\u0159izp\u016fsoben\u00ed pro typ m\u00e9dia:",
"OptionDownloadThumbImage": "Miniatura", "OptionDownloadThumbImage": "Miniatura",
"OptionDownloadMenuImage": "Nab\u00eddka", "OptionDownloadMenuImage": "Nab\u00eddka",
@ -540,7 +542,7 @@
"LabelCustomCss": "Vlastn\u00ed css:", "LabelCustomCss": "Vlastn\u00ed css:",
"LabelCustomCssHelp": "Aplikovat va\u0161e u\u017eivatelsk\u00e9 \u00fapravy CSS do webov\u00e9ho rozhran\u00ed.", "LabelCustomCssHelp": "Aplikovat va\u0161e u\u017eivatelsk\u00e9 \u00fapravy CSS do webov\u00e9ho rozhran\u00ed.",
"LabelLocalHttpServerPortNumber": "Lok\u00e1ln\u00ed http port:", "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:", "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.", "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:", "LabelPublicHttpsPort": "Ve\u0159ejn\u00fd https port:",
@ -548,10 +550,10 @@
"LabelEnableHttps": "Https uv\u00e1d\u011bt jako extern\u00ed adresu", "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.", "LabelEnableHttpsHelp": "Pokud povol\u00edte, server bude uv\u00e1d\u011bt https URL klient\u016fm jako extern\u00ed adresu.",
"LabelHttpsPort": "Lok\u00e1ln\u00ed https port:", "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:", "LabelWebSocketPortNumber": "\u010c\u00edslo portu web socketu:",
"LabelEnableAutomaticPortMap": "Povolit automatick\u00e9 mapov\u00e1n\u00ed port\u016f", "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", "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.", "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", "TabResume": "P\u0159eru\u0161it",
@ -683,7 +685,7 @@
"NotificationOptionNewLibraryContentMultiple": "P\u0159id\u00e1n nov\u00fd obsah (v\u00edcen\u00e1sobn\u00fd)", "NotificationOptionNewLibraryContentMultiple": "P\u0159id\u00e1n nov\u00fd obsah (v\u00edcen\u00e1sobn\u00fd)",
"NotificationOptionCameraImageUploaded": "Kamerov\u00fd z\u00e1znam nahr\u00e1n", "NotificationOptionCameraImageUploaded": "Kamerov\u00fd z\u00e1znam nahr\u00e1n",
"NotificationOptionUserLockedOut": "U\u017eivatel uzam\u010den", "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", "NotificationOptionServerRestartRequired": "Je vy\u017eadov\u00e1n restart serveru",
"LabelNotificationEnabled": "Povolit toto ozn\u00e1men\u00ed", "LabelNotificationEnabled": "Povolit toto ozn\u00e1men\u00ed",
"LabelMonitorUsers": "Sledov\u00e1n\u00ed aktivity z:", "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.", "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:", "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.", "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.", "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", "TabSubtitles": "Titulky",
"TabChapters": "Kapitoly", "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.", "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:", "LabelNumberTrailerToPlay": "Po\u010det p\u0159ehr\u00e1van\u00fdch trailer\u016f:",
"TitleDevices": "Za\u0159\u00edzen\u00ed", "TitleDevices": "Za\u0159\u00edzen\u00ed",
"TabCameraUpload": "Upload z fotoapar\u00e1tu", "TabCameraUpload": "Nahr\u00e1t z fotoapar\u00e1tu",
"TabDevices": "Za\u0159\u00edzen\u00ed", "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.", "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:", "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.", "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.", "PasswordMatchError": "Heslo a potvrzen\u00ed hesla mus\u00ed souhlasit.",
"UninstallPluginHeader": "Odinstalovat z\u00e1suvn\u00fd modul", "UninstallPluginHeader": "Odinstalovat z\u00e1suvn\u00fd modul",
"UninstallPluginConfirmation": "Jste si jisti, \u017ee chcete odinstalovat {0}?", "UninstallPluginConfirmation": "Jste si jisti, \u017ee chcete odinstalovat {0}?",
"NoPluginConfigurationMessage": "Tento plugin nem\u00e1 nastaven\u00ed.", "NoPluginConfigurationMessage": "Tento z\u00e1suvn\u00fd modul nem\u00e1 nastaven\u00ed.",
"NoPluginsInstalledMessage": "Nem\u00e1te nainstalov\u00e1n \u017e\u00e1dn\u00fd plugin.", "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 pluginy.", "BrowsePluginCatalogMessage": "Prohl\u00e9dn\u011bte si n\u00e1\u0161 katalog, kde najdete dostupn\u00e9 z\u00e1suvn\u00e9 moduly.",
"HeaderNewApiKey": "Nov\u00fd kl\u00ed\u010d API", "HeaderNewApiKey": "Nov\u00fd kl\u00ed\u010d API",
"LabelAppName": "N\u00e1zev aplikace", "LabelAppName": "N\u00e1zev aplikace",
"LabelAppNameExample": "P\u0159\u00edklad: Sickbeard, NzbDrone", "LabelAppNameExample": "P\u0159\u00edklad: Sickbeard, NzbDrone",
@ -1583,9 +1585,9 @@
"LabelMovie": "Film", "LabelMovie": "Film",
"LabelMusicVideo": "Hudebn\u00ed video", "LabelMusicVideo": "Hudebn\u00ed video",
"LabelEpisode": "Epizoda", "LabelEpisode": "Epizoda",
"Series": "Series", "Series": "Seri\u00e1ly",
"LabelStopping": "Zastavov\u00e1n\u00ed", "LabelStopping": "Zastavov\u00e1n\u00ed",
"LabelCancelled": "(zru\u0161eno)", "LabelCancelled": "Zru\u0161eno",
"ButtonDownload": "St\u00e1hnout", "ButtonDownload": "St\u00e1hnout",
"SyncJobStatusQueued": "Za\u0159azeno", "SyncJobStatusQueued": "Za\u0159azeno",
"SyncJobStatusConverting": "Konverze", "SyncJobStatusConverting": "Konverze",
@ -1606,7 +1608,7 @@
"MessageItemsAdded": "Polo\u017eka p\u0159id\u00e1na", "MessageItemsAdded": "Polo\u017eka p\u0159id\u00e1na",
"HeaderSelectCertificatePath": "Vyber cestu k certifik\u00e1tu", "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:", "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.", "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", "HeaderWelcomeToProjectServerDashboard": "V\u00edtejte na hlavn\u00ed nab\u00eddce Server Emby",
"HeaderWelcomeToProjectWebClient": "V\u00edtejte v Emby", "HeaderWelcomeToProjectWebClient": "V\u00edtejte v Emby",
@ -2135,7 +2137,7 @@
"HeaderConnectionFailure": "P\u0159ipojen\u00ed selhalo", "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.", "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", "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.", "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.", "DefaultErrorMessage": "Do\u0161lo k chyb\u011b p\u0159i zpracov\u00e1n\u00ed po\u017eadavku. Pros\u00edm zkuste to znovu pozd\u011bji.",
"ButtonAccept": "P\u0159ijmout", "ButtonAccept": "P\u0159ijmout",
@ -2186,7 +2188,7 @@
"HeaderUnlockSync": "Odemknout synchronizaci Emby", "HeaderUnlockSync": "Odemknout synchronizaci Emby",
"MessageUnlockAppWithPurchaseOrSupporter": "Odemknout tuto funkci pomoc\u00ed jednor\u00e1zov\u00e9 platby, nebo pomoc\u00ed aktivace p\u0159edplatn\u00e9ho Emby Premiere.", "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.", "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.", "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.", "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", "ButtonUnlockWithPurchase": "Odemkn\u011bte pomoc\u00ed koup\u011b",
@ -2258,7 +2260,7 @@
"ButtonRestorePreviousPurchase": "Obnovit n\u00e1kup", "ButtonRestorePreviousPurchase": "Obnovit n\u00e1kup",
"AlreadyPaid": "U\u017e jste provedli platbu?", "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.", "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", "ButtonForYou": "Pro v\u00e1s",
"ButtonLibrary": "Knihovna", "ButtonLibrary": "Knihovna",
"ButtonNowPlaying": "Nyn\u00ed je p\u0159ehr\u00e1v\u00e1no", "ButtonNowPlaying": "Nyn\u00ed je p\u0159ehr\u00e1v\u00e1no",
@ -2292,7 +2294,7 @@
"HeaderFavoriteArtists": "Obl\u00edben\u00ed \u00fam\u011blci", "HeaderFavoriteArtists": "Obl\u00edben\u00ed \u00fam\u011blci",
"HeaderFavoriteSongs": "Obl\u00edben\u00e1 hudba", "HeaderFavoriteSongs": "Obl\u00edben\u00e1 hudba",
"HeaderConfirmPluginInstallation": "Potvrzen\u00ed instalace z\u00e1suvn\u00e9ho modulu", "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.", "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", "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.", "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", "CoverArt": "Obal",
"ButtonOff": "Vypnout", "ButtonOff": "Vypnout",
"TitleHardwareAcceleration": "Hardwarov\u00e1 akcelerace", "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", "HeaderSelectCodecIntrosPath": "Vyberte cestu ke kodeku pro p\u0159edehry",
"ButtonLocalRefresh": "Lok\u00e1ln\u00ed obnoven\u00ed", "ButtonLocalRefresh": "Lok\u00e1ln\u00ed obnoven\u00ed",
"ButtonAddMissingData": "P\u0159idat pouze chyb\u011bj\u00edc\u00ed data", "ButtonAddMissingData": "P\u0159idat pouze chyb\u011bj\u00edc\u00ed data",
@ -2324,15 +2326,15 @@
"LabelOptionalM3uUrl": "M3U url (nepovinn\u00e9):", "LabelOptionalM3uUrl": "M3U url (nepovinn\u00e9):",
"LabelOptionalM3uUrlHelp": "N\u011bkter\u00e1 za\u0159\u00edzen\u00ed podporuj\u00edc\u00ed M3U v\u00fdpis kan\u00e1lu.", "LabelOptionalM3uUrlHelp": "N\u011bkter\u00e1 za\u0159\u00edzen\u00ed podporuj\u00edc\u00ed M3U v\u00fdpis kan\u00e1lu.",
"TabResumeSettings": "Obnovit nastaven\u00ed", "TabResumeSettings": "Obnovit nastaven\u00ed",
"HowDidYouPay": "How did you pay?", "HowDidYouPay": "Jak chcete platit?",
"IHaveEmbyPremiere": "I have Emby Premiere", "IHaveEmbyPremiere": "Ji\u017e m\u00e1m Emby Premiere",
"IPurchasedThisApp": "I purchased this app", "IPurchasedThisApp": "Tuto aplikaci m\u00e1m ji\u017e zaplacenu",
"DrmChannelsNotImported": "Channels with DRM will not be imported.", "DrmChannelsNotImported": "Kan\u00e1l s DRM nebude importov\u00e1n",
"ConfigureDateAdded": "Configure how date added is determined in the Emby Server dashboard under Library settings", "ConfigureDateAdded": "Konfigurace p\u0159id\u00e1n\u00ed datumu je definov\u00e1na v nastaven\u00ed knihovny v ovl\u00e1dac\u00edm panelu",
"LabelAllowHWTranscoding": "Allow hardware transcoding", "LabelAllowHWTranscoding": "Povolit hardwarov\u00e9 p\u0159ek\u00f3dov\u00e1n\u00ed",
"AllowHWTranscodingHelp": "If enabled, allow the tuner to transcode streams on the fly. This may help reduce transcoding required by Emby Server.", "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": "Only download subtitles that are a perfect match for my video files", "OptionRequirePerfectSubtitleMatch": "Stahovat jen titulky, kter\u00e9 perfektn\u011b sed\u00ed k m\u00fdm video soubor\u016fm.",
"ErrorAddingGuestAccount1": "There was an error adding the Emby Connect account. Has your guest created an Emby account? They can sign up at {0}.", "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": "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.", "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": "User not found. Please ensure the name is correct and try again, or try entering their email address." "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", "LabelExit": "Afslut",
"LabelVisitCommunity": "Bes\u00f8g F\u00e6lleskab", "LabelVisitCommunity": "Bes\u00f8g F\u00e6lleskab",
"LabelGithub": "Github", "LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{ {
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Beenden", "LabelExit": "Beenden",
"LabelVisitCommunity": "Besuche die Community", "LabelVisitCommunity": "Besuche die Community",
"LabelGithub": "Github", "LabelGithub": "Github",
@ -2332,7 +2334,7 @@
"LabelAllowHWTranscoding": "Erlaube Hardware Transkodierung", "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.", "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", "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}.", "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": "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.", "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": "User not found. Please ensure the name is correct and try again, or try entering their email address." "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", "LabelExit": "\u0388\u03be\u03bf\u03b4\u03bf\u03c2",
"LabelVisitCommunity": "\u039a\u03bf\u03b9\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1", "LabelVisitCommunity": "\u039a\u03bf\u03b9\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1",
"LabelGithub": "Github", "LabelGithub": "Github",

View file

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

View file

@ -2334,5 +2334,8 @@
"OptionRequirePerfectSubtitleMatch": "Only download subtitles that are a perfect match for my video files", "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}.", "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.", "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", "LabelExit": "Salir",
"LabelVisitCommunity": "Visit Community", "LabelVisitCommunity": "Visit Community",
"LabelGithub": "Github", "LabelGithub": "Github",

View file

@ -1,4 +1,6 @@
{ {
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "Salir", "LabelExit": "Salir",
"LabelVisitCommunity": "Visitar la Comunidad", "LabelVisitCommunity": "Visitar la Comunidad",
"LabelGithub": "Github", "LabelGithub": "Github",
@ -77,9 +79,9 @@
"HeaderAdultsReadHere": "\u00a1Adultos Leer Esto!", "HeaderAdultsReadHere": "\u00a1Adultos Leer Esto!",
"RegisterWithPayPal": "Registrar con PayPal", "RegisterWithPayPal": "Registrar con PayPal",
"HeaderEnjoyDayTrial": "Disfrute de una Prueba Gratuita por 14 D\u00edas", "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.", "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.", "LabelCustomCertificatePathHelp": "Proporcione su archivo de certificado .pfx personalizado. Si se omite, el servidor crear\u00e1 un certificado auto firmado.",
"TitleNotifications": "Notificaciones", "TitleNotifications": "Notificaciones",
"OptionDetectArchiveFilesAsMedia": "Detectar archivos comprimidos como medios", "OptionDetectArchiveFilesAsMedia": "Detectar archivos comprimidos como medios",
@ -347,7 +349,7 @@
"LabelMetadataPath": "Ruta para metadatos:", "LabelMetadataPath": "Ruta para metadatos:",
"LabelMetadataPathHelp": "Especifique una ubicaci\u00f3n personalizada para ilustraciones descargadas y metadatos.", "LabelMetadataPathHelp": "Especifique una ubicaci\u00f3n personalizada para ilustraciones descargadas y metadatos.",
"LabelTranscodingTempPath": "Ruta para transcodificaci\u00f3n temporal:", "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", "TabBasics": "B\u00e1sicos",
"TabTV": "TV", "TabTV": "TV",
"TabGames": "Juegos", "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 .", "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:", "LabelKodiMetadataDateFormat": "Formato de fecha de estreno:",
"LabelKodiMetadataDateFormatHelp": "Todas las fechas en los nfo\u00b4s ser\u00e1n le\u00eddas y escritas utilizando este formato.", "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.", "LabelKodiMetadataSaveImagePathsHelp": "Esto se recomienda si tiene nombres de imagenes que no se ajustan a los lineamientos de Kodi.",
"LabelKodiMetadataEnablePathSubstitution": "Habilitar sustituci\u00f3n de trayectorias", "LabelKodiMetadataEnablePathSubstitution": "Habilitar sustituci\u00f3n de ruta",
"LabelKodiMetadataEnablePathSubstitutionHelp": "Habilita la sustituci\u00f3n de trayectorias de im\u00e1genes usando la configuraci\u00f3n de sustituci\u00f3n de trayectorias del servidor.", "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.", "LabelKodiMetadataEnablePathSubstitutionHelp2": "Ver sustituci\u00f3n de trayectoras.",
"OptionDisplayChannelsInline": "Mostrar canales alineado junto con mis vistas", "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.", "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", "TabFilter": "Filtro",
"ButtonView": "Vista", "ButtonView": "Vista",
"LabelPageSize": "Cantidad de \u00cdtems:", "LabelPageSize": "Cantidad de \u00cdtems:",
"LabelPath": "Trayectoria:", "LabelPath": "Ruta:",
"LabelView": "Vista:", "LabelView": "Vista:",
"TabUsers": "Usuarios", "TabUsers": "Usuarios",
"LabelSortName": "Nombre para ordenar:", "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.", "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.", "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.", "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.", "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}", "ValueSpecialEpisodeName": "Especial: {0}",
"LabelSelectInternetTrailersForCinemaMode": "Tr\u00e1ilers de Internet", "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.", "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.", "MessageNoDevicesSupportCameraUpload": "Actualmente no cuenta con ning\u00fan dispositivo que soporte subir desde la c\u00e1mara.",
"LabelCameraUploadPath": "Ruta para 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", "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.", "LabelCreateCameraUploadSubfolderHelp": "Se pueden especificar carpetas espec\u00edficas para un dispositivo haciendo clic en \u00e9l desde la p\u00e1gina de Dispositivos.",
"LabelCustomDeviceDisplayName": "Nombre a Desplegar:", "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.", "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", "OptionMax": "M\u00e1ximo",
"HeaderEmbyGuide": "Gu\u00eda de Emby", "HeaderEmbyGuide": "Gu\u00eda de Emby",
"LabelSyncPath": "Trayectoria para contenido sincronizado:", "LabelSyncPath": "Ruta para contenido sincronizado:",
"OptionSyncOnlyOnWifi": "Sincronizar \u00fanicamente por WiFi", "OptionSyncOnlyOnWifi": "Sincronizar \u00fanicamente por WiFi",
"OptionSyncLosslessAudioOriginal": "Sincronizar audio \"lossless\" con su calidad original.", "OptionSyncLosslessAudioOriginal": "Sincronizar audio \"lossless\" con su calidad original.",
"HeaderMetadata": "Metadatos", "HeaderMetadata": "Metadatos",
@ -1500,7 +1502,7 @@
"LabelDisplayName": "Nombre a Desplegar:", "LabelDisplayName": "Nombre a Desplegar:",
"HeaderNewRecording": "Nueva Grabaci\u00f3n", "HeaderNewRecording": "Nueva Grabaci\u00f3n",
"ButtonAdvanced": "Avanzado", "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.", "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", "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.", "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", "LabelEpisode": "Episodio",
"Series": "Series", "Series": "Series",
"LabelStopping": "Deteniendo", "LabelStopping": "Deteniendo",
"LabelCancelled": "(cancelado)", "LabelCancelled": "Cancelado",
"ButtonDownload": "Descargar", "ButtonDownload": "Descargar",
"SyncJobStatusQueued": "En cola", "SyncJobStatusQueued": "En cola",
"SyncJobStatusConverting": "Convirti\u00e9ndo", "SyncJobStatusConverting": "Convirti\u00e9ndo",
@ -1604,7 +1606,7 @@
"HeaderDevices": "Dispositivos", "HeaderDevices": "Dispositivos",
"ButtonScheduledTasks": "Tareas programadas", "ButtonScheduledTasks": "Tareas programadas",
"MessageItemsAdded": "\u00cdtems agregados", "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:", "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}.", "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.", "LabelSyncNoTargetsHelp": "Parece que actualmente no cuentas con ninguna app que soporte sinc.",
@ -1701,7 +1703,7 @@
"HeaderRatingsDownloads": "Calificaciones \/ Descargas", "HeaderRatingsDownloads": "Calificaciones \/ Descargas",
"HeaderConfirmProfileDeletion": "Confirmar Eliminaci\u00f3n del Perfil", "HeaderConfirmProfileDeletion": "Confirmar Eliminaci\u00f3n del Perfil",
"MessageConfirmProfileDeletion": "\u00bfEst\u00e1 seguro de querer eliminar este 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", "HeaderSelectTranscodingPath": "Seleccionar Ruta para Transcodificaci\u00f3n Temporal",
"HeaderSelectImagesByNamePath": "Seleccionar Ruta para Im\u00e1genes por Nombre", "HeaderSelectImagesByNamePath": "Seleccionar Ruta para Im\u00e1genes por Nombre",
"HeaderSelectMetadataPath": "Seleccionar Ruta para Metadatos", "HeaderSelectMetadataPath": "Seleccionar Ruta para Metadatos",
@ -1761,7 +1763,7 @@
"HeaderLatestTvRecordings": "Grabaciones Recientes", "HeaderLatestTvRecordings": "Grabaciones Recientes",
"LabelCurrentPath": "Ruta actual:", "LabelCurrentPath": "Ruta actual:",
"HeaderSelectMediaPath": "Seleccionar ruta a medios", "HeaderSelectMediaPath": "Seleccionar ruta a medios",
"HeaderSelectPath": "Seleccionar Trayectoria", "HeaderSelectPath": "Seleccionar Ruta",
"ButtonNetwork": "Red", "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}.", "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.", "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", "ButtonChangeContentType": "Cambiar tipo de contenido",
"HeaderMediaLocations": "Ubicaciones de Medios", "HeaderMediaLocations": "Ubicaciones de Medios",
"LabelContentTypeValue": "Tipo de contenido: {0}", "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)", "FolderTypeUnset": "No establecido (contenido mixto)",
"BirthPlaceValue": "Lugar de nacimiento: {0}", "BirthPlaceValue": "Lugar de nacimiento: {0}",
"DeathDateValue": "Fallcimiento: {0}", "DeathDateValue": "Fallcimiento: {0}",
@ -2052,7 +2054,7 @@
"ValueAsRole": "como {0}", "ValueAsRole": "como {0}",
"ValueGuestStar": "Estrella invitada", "ValueGuestStar": "Estrella invitada",
"MediaInfoSize": "Tama\u00f1o", "MediaInfoSize": "Tama\u00f1o",
"MediaInfoPath": "Trayectoria", "MediaInfoPath": "Ruta",
"MediaInfoFile": "Archivo", "MediaInfoFile": "Archivo",
"MediaInfoFormat": "Formato", "MediaInfoFormat": "Formato",
"MediaInfoContainer": "Contenedor", "MediaInfoContainer": "Contenedor",
@ -2083,7 +2085,7 @@
"MediaInfoStreamTypeEmbeddedImage": "Im\u00e1gen Embebida", "MediaInfoStreamTypeEmbeddedImage": "Im\u00e1gen Embebida",
"MediaInfoRefFrames": "Tramas de referencia", "MediaInfoRefFrames": "Tramas de referencia",
"TabExpert": "Experto", "TabExpert": "Experto",
"HeaderSelectCustomIntrosPath": "Seleccionar Trayectoria de Intros Personalizados", "HeaderSelectCustomIntrosPath": "Seleccionar Ruta de Intros Personalizados",
"HeaderRateAndReview": "Clasificar y Rese\u00f1ar", "HeaderRateAndReview": "Clasificar y Rese\u00f1ar",
"HeaderThankYou": "Gracias", "HeaderThankYou": "Gracias",
"MessageThankYouForYourReview": "Gracias por su rese\u00f1a.", "MessageThankYouForYourReview": "Gracias por su rese\u00f1a.",
@ -2310,7 +2312,7 @@
"ButtonOff": "Apagar", "ButtonOff": "Apagar",
"TitleHardwareAcceleration": "Aceleraci\u00f3n por Hardware", "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,", "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", "ButtonLocalRefresh": "Actualizaci\u00f3n local",
"ButtonAddMissingData": "S\u00f3lo agregar datos faltantes", "ButtonAddMissingData": "S\u00f3lo agregar datos faltantes",
"ButtonFullRefresh": "Actualizaci\u00f3n completa", "ButtonFullRefresh": "Actualizaci\u00f3n completa",
@ -2332,7 +2334,7 @@
"LabelAllowHWTranscoding": "Permitir transcodificacion de hardware", "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.", "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.", "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}.", "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": "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.", "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": "User not found. Please ensure the name is correct and try again, or try entering their email address." "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", "LabelExit": "Salir",
"LabelVisitCommunity": "Visitar la comunidad", "LabelVisitCommunity": "Visitar la comunidad",
"LabelGithub": "Github", "LabelGithub": "Github",
@ -31,11 +33,11 @@
"LabelEnableVideoImageExtraction": "Habilitar extracci\u00f3n de im\u00e1genes de video", "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.", "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", "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", "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.", "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", "HeaderTermsOfService": "T\u00e9rminos del servicio de Emby",
"MessagePleaseAcceptTermsOfService": "Por favor aceptar los terminos de servicios y politica de privacidad antes de continuar.", "MessagePleaseAcceptTermsOfService": "Por favor aceptar los t\u00e9rminos del servicio y pol\u00edtica de privacidad antes de continuar.",
"OptionIAcceptTermsOfService": "Acepto los terminos de servicio", "OptionIAcceptTermsOfService": "Acepto los terminos de servicio",
"ButtonPrivacyPolicy": "Politica de privacidad", "ButtonPrivacyPolicy": "Politica de privacidad",
"ButtonTermsOfService": "Terminos de servicios", "ButtonTermsOfService": "Terminos de servicios",
@ -1000,55 +1002,55 @@
"HeaderLatestMusic": "\u00daltima m\u00fasica", "HeaderLatestMusic": "\u00daltima m\u00fasica",
"HeaderBranding": "Branding", "HeaderBranding": "Branding",
"HeaderApiKeys": "Keys de Api", "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", "HeaderApiKey": "Clave Api",
"HeaderApp": "App", "HeaderApp": "App",
"HeaderDevice": "Dispositivo", "HeaderDevice": "Dispositivo",
"HeaderUser": "Usuario", "HeaderUser": "Usuario",
"HeaderDateIssued": "Fecha de emisi\u00f3n", "HeaderDateIssued": "Fecha de emisi\u00f3n",
"LabelChapterName": "Cap\u00edtulo {0}", "LabelChapterName": "Cap\u00edtulo {0}",
"HeaderHttpHeaders": "Http Headers", "HeaderHttpHeaders": "Cabeceras Http",
"HeaderIdentificationHeader": "Identification Header", "HeaderIdentificationHeader": "Cabecera de indentificaci\u00f3n",
"LabelValue": "Value:", "LabelValue": "Valor:",
"LabelMatchType": "Match type:", "LabelMatchType": "Tipo de emparejamiento",
"OptionEquals": "Equals", "OptionEquals": "Igual",
"OptionRegex": "Regex", "OptionRegex": "Regex",
"OptionSubstring": "Substring", "OptionSubstring": "Substring",
"TabView": "View", "TabView": "Vista",
"TabSort": "Sort", "TabSort": "Ordenar",
"TabFilter": "Filter", "TabFilter": "Filtrar",
"ButtonView": "View", "ButtonView": "Vista",
"LabelPageSize": "Item limit:", "LabelPageSize": "Limite de \u00edtems:",
"LabelPath": "Path:", "LabelPath": "Ruta:",
"LabelView": "View:", "LabelView": "Vista:",
"TabUsers": "Users", "TabUsers": "Usuarios",
"LabelSortName": "Sort name:", "LabelSortName": "Nombre de la clasificaci\u00f3n:",
"LabelDateAdded": "Date added:", "LabelDateAdded": "Fecha a\u00f1adido:",
"HeaderFeatures": "Features", "HeaderFeatures": "Caracter\u00edsticas",
"HeaderAdvanced": "Advanced", "HeaderAdvanced": "Avanzado",
"ButtonSync": "Sync", "ButtonSync": "Sincronizar",
"TabScheduledTasks": "Scheduled Tasks", "TabScheduledTasks": "Tareas programadas",
"HeaderChapters": "Chapters", "HeaderChapters": "Cap\u00edtulos",
"HeaderResumeSettings": "Resume Settings", "HeaderResumeSettings": "Reanudar ajustes",
"TabSync": "Sync", "TabSync": "Sincronizar",
"TitleUsers": "Users", "TitleUsers": "Usuarios",
"LabelProtocol": "Protocol:", "LabelProtocol": "Protocolo:",
"OptionProtocolHttp": "Http", "OptionProtocolHttp": "Http",
"OptionProtocolHls": "Http Live Streaming", "OptionProtocolHls": "Emisi\u00f3n http en vivo",
"LabelContext": "Context:", "LabelContext": "Contexto:",
"OptionContextStreaming": "Streaming", "OptionContextStreaming": "Emisi\u00f3n",
"OptionContextStatic": "Sync", "OptionContextStatic": "Sincronizar",
"ButtonAddToPlaylist": "Add to playlist", "ButtonAddToPlaylist": "A\u00f1adir a la lista de reproducci\u00f3n",
"TabPlaylists": "Playlists", "TabPlaylists": "Listas de reproducci\u00f3n",
"ButtonClose": "Cerrar", "ButtonClose": "Cerrar",
"LabelAllLanguages": "All languages", "LabelAllLanguages": "Todos los idiomas",
"HeaderBrowseOnlineImages": "Browse Online Images", "HeaderBrowseOnlineImages": "Navegar im\u00e1genes online",
"LabelSource": "Source:", "LabelSource": "Fuente:",
"OptionAll": "All", "OptionAll": "Todos",
"LabelImage": "Image:", "LabelImage": "Imagen:",
"ButtonBrowseImages": "Browse Images", "ButtonBrowseImages": "Navegar im\u00e1genes",
"HeaderImages": "Images", "HeaderImages": "Im\u00e1genes",
"HeaderBackdrops": "Backdrops", "HeaderBackdrops": "Im\u00e1genes de fondo",
"HeaderScreenshots": "Capturas de pantalla", "HeaderScreenshots": "Capturas de pantalla",
"HeaderAddUpdateImage": "A\u00f1adir\/Actualizar imagen", "HeaderAddUpdateImage": "A\u00f1adir\/Actualizar imagen",
"LabelDropImageHere": "Soltar imagen aqui", "LabelDropImageHere": "Soltar imagen aqui",
@ -1098,58 +1100,58 @@
"DeviceOnlineWithName": "{0} est\u00e1 conectado", "DeviceOnlineWithName": "{0} est\u00e1 conectado",
"UserOnlineFromDevice": "{0} est\u00e1 conectado desde {1}", "UserOnlineFromDevice": "{0} est\u00e1 conectado desde {1}",
"DeviceOfflineWithName": "{0} se ha desconectado", "DeviceOfflineWithName": "{0} se ha desconectado",
"UserOfflineFromDevice": "{0} has disconnected from {1}", "UserOfflineFromDevice": "{0} se ha desconectado de {1}",
"SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", "SubtitlesDownloadedForItem": "Subt\u00edtulos descargados para {0}",
"SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", "SubtitleDownloadFailureForItem": "Fallo en la descarga de subt\u00edtulos para {0}",
"LabelRunningTimeValue": "Running time: {0}", "LabelRunningTimeValue": "Tiempo de ejecuci\u00f3n: {0}",
"LabelIpAddressValue": "Ip address: {0}", "LabelIpAddressValue": "Direcci\u00f3n IP: {0}",
"UserLockedOutWithName": "User {0} has been locked out", "UserLockedOutWithName": "El usuario {0} ha sido bloqueado",
"UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserConfigurationUpdatedWithName": "Se ha actualizado la configuraci\u00f3n de usuario para {0}",
"UserCreatedWithName": "User {0} has been created", "UserCreatedWithName": "Se ha creado el usuario {0}",
"UserPasswordChangedWithName": "Password has been changed for user {0}", "UserPasswordChangedWithName": "Contrase\u00f1a cambiada al usuario {0}",
"UserDeletedWithName": "User {0} has been deleted", "UserDeletedWithName": "El usuario {0} ha sido eliminado",
"MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageServerConfigurationUpdated": "Se ha actualizado la configuraci\u00f3n del servidor",
"MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Se ha actualizado la secci\u00f3n {0} de la configuraci\u00f3n del servidor",
"MessageApplicationUpdated": "Emby Server has been updated", "MessageApplicationUpdated": "Se ha actualizado el servidor Emby",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated", "AuthenticationSucceededWithUserName": "{0} se ha autenticado satisfactoriamente",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "FailedLoginAttemptWithUserName": "Intento de inicio de sesi\u00f3n fallido desde {0}",
"UserDownloadingItemWithValues": "{0} is downloading {1}", "UserDownloadingItemWithValues": "{0} est\u00e1 descargando {1}",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStartedPlayingItemWithValues": "{0} ha empezado a reproducir {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "UserStoppedPlayingItemWithValues": "{0} ha parado de reproducir {1}",
"AppDeviceValues": "App: {0}, Device: {1}", "AppDeviceValues": "Aplicaci\u00f3n: {0}, Dispositivo: {1}",
"ProviderValue": "Provider: {0}", "ProviderValue": "Proveedor: {0}",
"LabelChannelDownloadSizeLimit": "Download size limit (GB):", "LabelChannelDownloadSizeLimit": "Tama\u00f1o l\u00edmite de descarga (GB):",
"LabelChannelDownloadSizeLimitHelpText": "Limit the size of the channel download folder.", "LabelChannelDownloadSizeLimitHelpText": "Limitar el tama\u00f1o de la carpeta de descargas del canal.",
"HeaderRecentActivity": "Recent Activity", "HeaderRecentActivity": "Actividad reciente",
"HeaderPeople": "People", "HeaderPeople": "Gente",
"HeaderDownloadPeopleMetadataFor": "Download biography and images for:", "HeaderDownloadPeopleMetadataFor": "Descargar biograf\u00eda e im\u00e1genes para:",
"OptionComposers": "Composers", "OptionComposers": "Compositores",
"OptionOthers": "Others", "OptionOthers": "Otros",
"HeaderDownloadPeopleMetadataForHelp": "Enabling additional options will provide more on-screen information but will result in slower library scans.", "HeaderDownloadPeopleMetadataForHelp": "Activar m\u00e1s opciones permite mas informaci\u00f3n en pantalla pero los escaneos de la biblioteca ser\u00e1n m\u00e1s lentos.",
"ViewTypeFolders": "Folders", "ViewTypeFolders": "Carpetas",
"LabelDisplayFoldersView": "Display a folders view to show plain media folders", "LabelDisplayFoldersView": "Mostrar vista de carpetas para ver las carpetas de medios de forma sencilla",
"ViewTypeLiveTvRecordingGroups": "Recordings", "ViewTypeLiveTvRecordingGroups": "Grabaciones",
"ViewTypeLiveTvChannels": "Channels", "ViewTypeLiveTvChannels": "Canales",
"LabelEasyPinCode": "F\u00e1cil c\u00f3digo PIN:", "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.", "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": "Enable in-network sign in with my easy pin code", "LabelInNetworkSignInWithEasyPassword": "Activar inicio de sesi\u00f3n en l\u00ednea con c\u00f3digo pin",
"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.", "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": "Password", "HeaderPassword": "Contrase\u00f1a",
"HeaderLocalAccess": "Local Access", "HeaderLocalAccess": "Acceso Local",
"HeaderViewOrder": "View Order", "HeaderViewOrder": "Ver Orden",
"ButtonResetEasyPassword": "Restablecer f\u00e1cil c\u00f3digo PIN", "ButtonResetEasyPassword": "Restablecer f\u00e1cil c\u00f3digo PIN",
"LabelSelectUserViewOrder": "Choose the order your views will be displayed in within Emby apps", "LabelSelectUserViewOrder": "Elige el orden en que sus entradas aparecer\u00e1n dentro de las apps Emby",
"HeaderPersonInfo": "Person Info", "HeaderPersonInfo": "Info personal",
"HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", "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", "HeaderConfirmDeletion": "Confirmar borrado",
"LabelFollowingFileWillBeDeleted": "The following file will be deleted:", "LabelFollowingFileWillBeDeleted": "El siguiente archivo se eliminar\u00e1",
"LabelIfYouWishToContinueWithDeletion": "If you wish to continue, please confirm by entering the value of:", "LabelIfYouWishToContinueWithDeletion": "Si desea continuar, por favor conf\u00edrmelo escribiendo el valor de:",
"ButtonIdentify": "Identify", "ButtonIdentify": "Identificar",
"LabelAlbumArtist": "Album artist:", "LabelAlbumArtist": "Artista del \u00e1lbum",
"LabelAlbumArtists": "Album artists:", "LabelAlbumArtists": "Artistas de los \u00e1lbumes",
"LabelAlbum": "Album:", "LabelAlbum": "\u00c1lbum",
"LabelCommunityRating": "Community rating:", "LabelCommunityRating": "Puntuaci\u00f3n de la comunidad",
"LabelVoteCount": "Vote count:", "LabelVoteCount": "Contador de votos:",
"LabelMetascore": "Metapuntuaci\u00f3n:", "LabelMetascore": "Metapuntuaci\u00f3n:",
"LabelCriticRating": "Valoraci\u00f3n de la cr\u00edtica:", "LabelCriticRating": "Valoraci\u00f3n de la cr\u00edtica:",
"LabelCriticRatingSummary": "Resumen de la 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:", "LabelOneTimeDonationAmount": "Cantidad de la donaci\u00f3n:",
"ButtonPurchase": "Comprar", "ButtonPurchase": "Comprar",
"OptionActor": "Actor", "OptionActor": "Actor",
"OptionComposer": "Composer", "OptionComposer": "Compositor",
"OptionDirector": "Director", "OptionDirector": "Director",
"OptionGuestStar": "Guest star", "OptionGuestStar": "Estrella invitada",
"OptionProducer": "Producer", "OptionProducer": "Productor",
"OptionWriter": "Writer", "OptionWriter": "Escritor",
"LabelAirDays": "Air days:", "LabelAirDays": "D\u00edas de emisi\u00f3n:",
"LabelAirTime": "Air time:", "LabelAirTime": "Tiempo de emisi\u00f3n:",
"HeaderMediaInfo": "Media Info", "HeaderMediaInfo": "Info multimedia",
"HeaderPhotoInfo": "Photo Info", "HeaderPhotoInfo": "Info foto",
"HeaderInstall": "Install", "HeaderInstall": "Instalar",
"LabelSelectVersionToInstall": "Select version to install:", "LabelSelectVersionToInstall": "Seleccionar versi\u00f3n a instalar",
"LinkLearnMoreAboutSubscription": "Learn about Emby Premiere", "LinkLearnMoreAboutSubscription": "Saber m\u00e1s sobre Emby Premiere",
"MessagePluginRequiresSubscription": "This plugin will require an active Emby Premiere subscription after the 14 day free trial.", "MessagePluginRequiresSubscription": "Este plugin necesita una suscripci\u00f3n activa a Emby Premiere despu\u00e9s de los 14 d\u00edas de prueba.",
"MessagePremiumPluginRequiresMembership": "This plugin will require an active Emby Premiere subscription in order to purchase after the 14 day free trial.", "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": "Reviews", "HeaderReviews": "An\u00e1lisis",
"HeaderDeveloperInfo": "Developer Info", "HeaderDeveloperInfo": "Informaci\u00f3n del desarrollador",
"HeaderRevisionHistory": "Revision History", "HeaderRevisionHistory": "Hist\u00f3rico de revisiones",
"ButtonViewWebsite": "View website", "ButtonViewWebsite": "Ver sitio web",
"HeaderXmlSettings": "Xml Settings", "HeaderXmlSettings": "Ajustes xml",
"HeaderXmlDocumentAttributes": "Xml Document Attributes", "HeaderXmlDocumentAttributes": "Atributos del documento xml",
"HeaderXmlDocumentAttribute": "Xml Document Attribute", "HeaderXmlDocumentAttribute": "Atributos del documento xml",
"XmlDocumentAttributeListHelp": "These attributes are applied to the root element of every xml response.", "XmlDocumentAttributeListHelp": "Estos atributos se aplican al elemento ra\u00edz de cada respuesta xml.",
"OptionSaveMetadataAsHidden": "Save metadata and images as hidden files", "OptionSaveMetadataAsHidden": "Guardar los metadatos e im\u00e1genes como archivos ocultos",
"LabelExtractChaptersDuringLibraryScan": "Extract chapter images during the library scan", "LabelExtractChaptersDuringLibraryScan": "Extraer im\u00e1genes de los cap\u00edtulos durante el escaneo de la biblioteca",
"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.", "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": "Their Emby username or email address:", "LabelConnectGuestUserName": "Su nombre de usuario o correo de Emby",
"LabelConnectUserName": "Emby username or email address:", "LabelConnectUserName": "Nombre de usuario o correo de Emby",
"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.", "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": "Learn more about Emby Connect", "ButtonLearnMoreAboutEmbyConnect": "Aprende m\u00e1s sobre Emby Connect",
"LabelExternalPlayers": "External players:", "LabelExternalPlayers": "Reproductores externos:",
"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.", "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": "Display buttons to play content in external players.", "LabelNativeExternalPlayersHelp": "Mostrar botones para reproducir contenido en un reproductor externo.",
"LabelEnableItemPreviews": "Enable item previews", "LabelEnableItemPreviews": "Activar previsualizaci\u00f3n de los \u00edtems",
"LabelEnableItemPreviewsHelp": "if enabled, sliding previews will appear when clicking items on certain screens.", "LabelEnableItemPreviewsHelp": "Si est\u00e1 activado, aparecer\u00e1n previsualizaciones deslizantes cuando haga clic en \u00edtems de ciertas pantallas.",
"HeaderSubtitleProfile": "Subtitle Profile", "HeaderSubtitleProfile": "Perfil de subt\u00edtulos",
"HeaderSubtitleProfiles": "Subtitle Profiles", "HeaderSubtitleProfiles": "Perfil de subt\u00edtulos",
"HeaderSubtitleProfilesHelp": "Subtitle profiles describe the subtitle formats supported by the device.", "HeaderSubtitleProfilesHelp": "El perfil de los subt\u00edtulos describe el formato soportado por el dispositivo.",
"LabelFormat": "Format:", "LabelFormat": "Formato:",
"LabelMethod": "Method:", "LabelMethod": "M\u00e9todo:",
"LabelDidlMode": "Didl mode:", "LabelDidlMode": "Modo didl:",
"OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)",
"OptionResElement": "res element", "OptionResElement": "elemento res",
"OptionEmbedSubtitles": "Embed within container", "OptionEmbedSubtitles": "Integrado con el contenedor",
"OptionExternallyDownloaded": "External download", "OptionExternallyDownloaded": "Descarga externa",
"OptionHlsSegmentedSubtitles": "Hls segmented subtitles", "OptionHlsSegmentedSubtitles": "Subt\u00edtulos segmentados hls",
"LabelSubtitleFormatHelp": "Example: srt", "LabelSubtitleFormatHelp": "Ejemplo: srt",
"ButtonLearnMore": "Learn more", "ButtonLearnMore": "Aprende m\u00e1s",
"TabPlayback": "Playback", "TabPlayback": "Reproducci\u00f3n",
"HeaderAudioSettings": "Audio Settings", "HeaderAudioSettings": "Ajustes de audio",
"HeaderSubtitleSettings": "Subtitle Settings", "HeaderSubtitleSettings": "Ajustes de subt\u00edtulos",
"TabCinemaMode": "Modo cine", "TabCinemaMode": "Modo cine",
"TitlePlayback": "Reproducci\u00f3n", "TitlePlayback": "Reproducci\u00f3n",
"LabelEnableCinemaModeFor": "Activar el modo cine para:", "LabelEnableCinemaModeFor": "Activar el modo cine para:",
@ -1300,57 +1302,57 @@
"HeaderAccessSchedule": "Horario de acceso", "HeaderAccessSchedule": "Horario de acceso",
"HeaderAccessScheduleHelp": "Crea un horario de acceso para limitar el acceso a determinadas horas.", "HeaderAccessScheduleHelp": "Crea un horario de acceso para limitar el acceso a determinadas horas.",
"ButtonAddSchedule": "A\u00f1adir horario", "ButtonAddSchedule": "A\u00f1adir horario",
"LabelAccessDay": "Day of week:", "LabelAccessDay": "D\u00eda de la semana:",
"LabelAccessStart": "Start time:", "LabelAccessStart": "Hora de inicio:",
"LabelAccessEnd": "End time:", "LabelAccessEnd": "Hora de finalizaci\u00f3n:",
"HeaderSchedule": "Schedule", "HeaderSchedule": "Horario",
"OptionEveryday": "Every day", "OptionEveryday": "Todos los d\u00edas",
"OptionWeekdays": "Weekdays", "OptionWeekdays": "D\u00edas de la semana",
"OptionWeekends": "Weekends", "OptionWeekends": "Fines de semana",
"MessageProfileInfoSynced": "User profile information synced with Emby Connect.", "MessageProfileInfoSynced": "Informac\u00edon de perfil de usuario sincronizada con Emby Connect.",
"HeaderOptionalLinkEmbyAccount": "Optional: Link your Emby account", "HeaderOptionalLinkEmbyAccount": "Opcional: Asocia tu cuenta de Emby",
"ButtonTrailer": "Trailer", "ButtonTrailer": "Tr\u00e1iler",
"OptionPlayUnwatchedTrailersOnly": "Play only unwatched trailers", "OptionPlayUnwatchedTrailersOnly": "Reproducir s\u00f3lo tr\u00e1ilers que no hayan sido vistos",
"HeaderTrailerReelHelp": "Start a trailer reel to play a long running playlist of trailers.", "HeaderTrailerReelHelp": "Iniciar un conjunto de tr\u00e1ilers para reproducir junto a la lista de tr\u00e1ilers.",
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.", "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": "New Users", "HeaderNewUsers": "Nuevos usuarios",
"ButtonSignUp": "Sign up", "ButtonSignUp": "Reg\u00edstrate",
"ButtonForgotPassword": "Forgot password", "ButtonForgotPassword": "Contrase\u00f1a olvidada",
"OptionDisableUserPreferences": "Disable access to user preferences", "OptionDisableUserPreferences": "Desactivar el acceso a las preferencias de usuario",
"OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.", "OptionDisableUserPreferencesHelp": "Si est\u00e1 activado, solo los administradores pueden configurar las contrase\u00f1as, im\u00e1genes y preferencias de idioma del perfil de usuario.",
"HeaderSelectServer": "Select Server", "HeaderSelectServer": "Selecionar servidor",
"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.", "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": "New User", "TitleNewUser": "Nuevo usuario",
"ButtonConfigurePassword": "Configure Password", "ButtonConfigurePassword": "Configurar contrase\u00f1a",
"HeaderDashboardUserPassword": "User passwords are managed within each user's personal profile settings.", "HeaderDashboardUserPassword": "Las contrase\u00f1as de los usuarios se gestionan desde los ajustes de perfil de cada usuario.",
"HeaderLibraryAccess": "Library Access", "HeaderLibraryAccess": "Acceso a la biblioteca",
"HeaderChannelAccess": "Channel Access", "HeaderChannelAccess": "Acceso a los canales",
"HeaderLatestItems": "Latest Items", "HeaderLatestItems": "\u00daltimos \u00edtems",
"LabelSelectLastestItemsFolders": "Include media from the following sections in Latest Items", "LabelSelectLastestItemsFolders": "Incluir medios de las siguientes secciones en \u00daltimos \u00edtems",
"HeaderShareMediaFolders": "Share Media Folders", "HeaderShareMediaFolders": "Compartir carpetas de medios",
"MessageGuestSharingPermissionsHelp": "Most features are initially unavailable to guests but can be enabled as needed.", "MessageGuestSharingPermissionsHelp": "Muchas de las caracter\u00edsticas no est\u00e1n disponibles para los invitados, pero pueden activarse seg\u00fan se requieran.",
"HeaderInvitations": "Invitations", "HeaderInvitations": "Invitaciones",
"LabelForgotPasswordUsernameHelp": "Enter your username, if you remember it.", "LabelForgotPasswordUsernameHelp": "Introduce tu nombre de usuario, si te acuerdas.",
"HeaderForgotPassword": "Forgot Password", "HeaderForgotPassword": "Contrase\u00f1a olvidada",
"TitleForgotPassword": "Forgot Password", "TitleForgotPassword": "Contrase\u00f1a olvidada",
"TitlePasswordReset": "Password Reset", "TitlePasswordReset": "Reestablecer contrase\u00f1a",
"LabelPasswordRecoveryPinCode": "C\u00f3digo PIN:", "LabelPasswordRecoveryPinCode": "C\u00f3digo PIN:",
"HeaderPasswordReset": "Password Reset", "HeaderPasswordReset": "Reestablecer contrase\u00f1a",
"HeaderParentalRatings": "Parental Ratings", "HeaderParentalRatings": "Clasificaci\u00f3n parental",
"HeaderVideoTypes": "Video Types", "HeaderVideoTypes": "Tipos de v\u00eddeos",
"HeaderYears": "Years", "HeaderYears": "A\u00f1os",
"HeaderBlockItemsWithNoRating": "Block content with no or unrecognized rating information:", "HeaderBlockItemsWithNoRating": "Bloquear contenido sin valoraciones o si son desconocidas:",
"LabelBlockContentWithTags": "Block content with tags:", "LabelBlockContentWithTags": "Bloquear contenido sin etiquetas:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", "LabelEnableSingleImageInDidlLimit": "Limitar a una imagen integrada",
"LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.", "LabelEnableSingleImageInDidlLimitHelp": "Algunos dispositivos no renderizan correctamente si hay muchas im\u00e1genes integradas en Didl.",
"TabActivity": "Activity", "TabActivity": "Actividad",
"TitleSync": "Sync", "TitleSync": "Sincronizar",
"OptionAllowSyncContent": "Allow Sync", "OptionAllowSyncContent": "Permitir la sincronizaci\u00f3n",
"OptionAllowContentDownloading": "Allow media downloading", "OptionAllowContentDownloading": "Permitir la descarga de medios",
"NameSeasonUnknown": "Season Unknown", "NameSeasonUnknown": "Temporada desconocida",
"NameSeasonNumber": "Season {0}", "NameSeasonNumber": "Temporada {0}",
"LabelNewUserNameHelp": "Usernames can contain letters (a-z), numbers (0-9), dashes (-), underscores (_), apostrophes ('), and periods (.)", "LabelNewUserNameHelp": "Los nummobres de usuario pueden contener letras (a-Z), n\u00fameros (0-9), guiones (-), barras bajas (_), ap\u00f3strofes ('), y comas (,).",
"TabJobs": "Jobs", "TabJobs": "Trabajos",
"TabSyncJobs": "Trabajos de sincronizaci\u00f3n", "TabSyncJobs": "Trabajos de sincronizaci\u00f3n",
"LabelTagFilterMode": "Modo:", "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.", "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", "HeaderUpcomingSports": "Pr\u00f3ximos deportes",
"HeaderUpcomingPrograms": "Pr\u00f3ximos programas", "HeaderUpcomingPrograms": "Pr\u00f3ximos programas",
"ButtonMoreItems": "M\u00e1s", "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", "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", "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.", "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.", "OptionAllowMediaPlaybackTranscodingHelp": "Los usuarios recibir\u00e1n un mensaje cuando no pueden reproducir contenido en base a los ajustes.",
"TabStreaming": "Transmisi\u00f3n", "TabStreaming": "Transmisi\u00f3n",
"LabelRemoteClientBitrateLimit": "L\u00edmite de la transmisi\u00f3n de tasa de bits por internet (Mbps):", "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.", "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": "CPU core limit:", "LabelConversionCpuCoreLimit": "L\u00edmite de n\u00facleos del procesador:",
"LabelConversionCpuCoreLimitHelp": "Limit the number of CPU cores that will be used during sync conversion.", "LabelConversionCpuCoreLimitHelp": "Limitar la cantidad de n\u00facleos del procesador que se utilizan para los trabajos de sincronizaci\u00f3n.",
"OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversion": "Activar la conversi\u00f3n a m\u00e1xima velocidad",
"OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", "OptionEnableFullSpeedConversionHelp": "Por defecto, la conversi\u00f3n de las sinronizaciones se realiza a baja velocidad para minimizar el uso de recursos.",
"HeaderPlaylists": "Playlists", "HeaderPlaylists": "Listas de reproducci\u00f3n",
"HeaderViewStyles": "View Styles", "HeaderViewStyles": "Estilos de vistas",
"LabelSelectViewStyles": "Enable enhanced presentations for:", "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.", "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", "TabPhotos": "Photos",
@ -1585,7 +1587,7 @@
"LabelEpisode": "Episodio", "LabelEpisode": "Episodio",
"Series": "Series", "Series": "Series",
"LabelStopping": "Deteniendo", "LabelStopping": "Deteniendo",
"LabelCancelled": "(cancelado)", "LabelCancelled": "Cancelado",
"ButtonDownload": "Descargar", "ButtonDownload": "Descargar",
"SyncJobStatusQueued": "Queued", "SyncJobStatusQueued": "Queued",
"SyncJobStatusConverting": "Converting", "SyncJobStatusConverting": "Converting",

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,4 +1,6 @@
{ {
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"LabelExit": "\u0428\u044b\u0493\u0443", "LabelExit": "\u0428\u044b\u0493\u0443",
"LabelVisitCommunity": "\u049a\u0430\u0443\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u049b\u049b\u0430 \u0431\u0430\u0440\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", "LabelGithub": "GitHub \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439\u0456",
@ -1583,9 +1585,9 @@
"LabelMovie": "\u0424\u0438\u043b\u044c\u043c", "LabelMovie": "\u0424\u0438\u043b\u044c\u043c",
"LabelMusicVideo": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435", "LabelMusicVideo": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435",
"LabelEpisode": "\u0411\u04e9\u043b\u0456\u043c", "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", "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", "ButtonDownload": "\u0416\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443",
"SyncJobStatusQueued": "\u041a\u0435\u0437\u0435\u043a\u0442\u0435", "SyncJobStatusQueued": "\u041a\u0435\u0437\u0435\u043a\u0442\u0435",
"SyncJobStatusConverting": "\u0422\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443\u0434\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.", "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.", "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.", "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", "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", "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", "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", "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.", "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", "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}.", "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": "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.", "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." "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", "LabelExit": "\uc885\ub8cc",
"LabelVisitCommunity": "\ucee4\ubba4\ub2c8\ud2f0 \ubc29\ubb38", "LabelVisitCommunity": "\ucee4\ubba4\ub2c8\ud2f0 \ubc29\ubb38",
"LabelGithub": "Github", "LabelGithub": "Github",

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