diff --git a/.circleci/config.yml b/.circleci/config.yml index ff7de669..d629c052 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -32,11 +32,11 @@ jobs: - run: sudo npm install -g gulp # run tests! - #- run: gulp build linux32,linux64,win32,osx64 - - run: gulp build -p linux32,linux64,win32,win64,osx64 + #- run: gulp build linux32,linux64,win32,win64,osx64 + - run: gulp build -p linux32,linux64,win32,win64 - deploy: - command: gulp zip + command: gulp zip -p linux32,linux64,win32,win64 #store cache dependencies - save_cache: diff --git a/CHANGELOG.md b/CHANGELOG.md index cf56d2c8..7c96d2f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,37 @@ +## 0.4.1-16 Beta - Summer Dream - 28 August 2018 + +New Features: +- OpenSubtitles: Add link to create account +- OpenSubtitles: Added Username and Password for OpenSubtitles API into the settings screen. +- ExtPlayer: Added Windows Media Player +- Player: Added a "Download Only" option to the player selection +- gulp: Add ffmpeg update to cache sdk +- gulp: Add ffmpeg update to builds +- gulp: Add commandline paramters to set nw.js version and downloadUrl location + +BugFixes: +- Register: Fixed default torrent +- Settings: Fixed Download direction selection +- Magnet and Torrent: Fixed Magnet and Torrent Drop +- Cache: Fixed SQL execute methods +- About: Added OpenSubtitles.org link +- circleci: Removed osx64 from automated builds and zip +- Trackers: Updated trackers +- GulpArm: Updated LinuxArm downloadUrl +- GulpArmSupport: Add support for linuxarm platform +- OpenSubtitles: Better handling of subtitle information downloading +- OpenSubtitles: Better error handling and fixed settings + +Updated: +- Nodejs: Updated to version 0.31.5 +- jQuery: Updated to version 3.3.1 +- Mousetrap: Updated to latest version 1.6.2 +- gitlab: Updated to version 3.11.0 +- xmlbuilder: Updated to version 10.0.0 +- webtorrent: Updated to version 0.102.1 +- yargs: Updated to version 12.0.1 +- opensubtitles-api: Updated to version 4.1.0 + ## 0.4.1-15 Beta - Ides of March - 11 March 2018 BugFixes: diff --git a/LICENSE.txt b/LICENSE.txt index 606ef094..1215503e 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,5 +1,5 @@ Popcorn Time - Streaming video through torrents -Copyright © 2014 - 2015 Popcorn Time and the contributors (popcorntime.ag) +Copyright © 2014 - 2018 Popcorn Time and the contributors (popcorntime.ag) If you distribute a copy or make a fork of the project, you have to credit this project as source. @@ -20,7 +20,7 @@ If you want to contact us : hello@popcorntime.ag Popcorn Time - Streaming video through torrents -Copyright © 2014 - 2015 Popcorn Time and the contributors (popcorntime.ag) +Copyright © 2014 - 2018 Popcorn Time and the contributors (popcorntime.ag) Popcorn Time is released under the GPL Last update: May 4, 2014 diff --git a/README.md b/README.md index 9842a4d8..304c8769 100644 --- a/README.md +++ b/README.md @@ -101,4 +101,4 @@ You should have received a copy of the GNU General Public License along with thi If you want to contact us : send pm to [samewhiterabbits](https://www.reddit.com/user/Samewhiterabbits) on reddit or [use the form](http://yify.is/index.php/blog/contact) on the yify website. -Copyright (c) 2015 Popcorn Time Community - Released under the [GPL v3 license](LICENSE.txt). +Copyright (c) 2018 Popcorn Time Community - Released under the [GPL v3 license](LICENSE.txt). diff --git a/gulpfile.js b/gulpfile.js index 30f14974..c0edc41f 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,22 +1,61 @@ var gulp = require('gulp'); var NwBuilder = require('nw-builder'); var os = require('os'); -var argv = require('yargs') - .alias('p', 'platforms') - .argv; var del = require('del'); var detectCurrentPlatform = require('nw-builder/lib/detectCurrentPlatform.js'); var zip = require('gulp-zip'); +var unzip = require('gulp-unzip'); var gzip = require('gulp-gzip'); var tar = require('gulp-tar'); +var download = require('gulp-download'); var package = require('./package.json'); +var merge2 = require('merge2'); + +//Commandline +var argv = require('yargs') + .alias('p', 'platforms') + .options({ + 'nwversion': { + alias: 'nwv', + describe: 'Set nw.js version' + }, + 'nwdownloadurl': { + alias: 'nwurl', + describe: 'Provide an alt download URL' + } + }) + .help() + .argv; + +//Set Default nw.js version +var nwVersion = '0.31.5'; +var buildDownloadUrl = 'https://dl.nwjs.io/'; + +nwVersion = argv.nwv ? argv.nwv : nwVersion; +buildDownloadUrl = argv.nwurl ? argv.nwurl : buildDownloadUrl; + +var buildplatforms = argv.p ? argv.p.split(',') : [detectCurrentPlatform()]; + +//Example URL FFMPEG Location: +//https://github.com/iteufel/nwjs-ffmpeg-prebuilt/releases/download/0.31.4/0.31.4-osx-x64.zip +var ffmpegDownloadurl = 'https://github.com/iteufel/nwjs-ffmpeg-prebuilt/releases/download/' + nwVersion; + +//Platform specific overrides if needed + +if (buildplatforms.indexOf("linuxarm") >= 0) { + nwVersion = '0.31.2'; +} + +if (buildplatforms.indexOf("linuxarm") >= 0) { + buildDownloadUrl = 'https://github.com/LeonardLaszlo/nw.js-armv7-binaries/releases/download/v0.27.6/nwjs-sdk-v0.27.6-linux-arm-chrome-branding.tar.gz'; +} var nw = new NwBuilder({ - files: ['./src/**', './node_modules/**', './package.json','./install','LICENSE.txt','CHANGELOG.md','README.md'], - version: '0.20.1', + files: ['./src/**', './node_modules/**', './package.json', './install', 'LICENSE.txt', 'CHANGELOG.md', 'README.md'], + version: nwVersion, zip: false, - downloadUrl: 'http://builds.butterproject.org/nw/', - platforms: argv.p ? argv.p.split(',') : [detectCurrentPlatform()] + downloadUrl: buildDownloadUrl, + platforms: buildplatforms, }).on('log', console.log); gulp.task('run', function() { @@ -36,28 +75,147 @@ gulp.task('clean', function() { return del('build/'); }); -gulp.task('zip', function () { - - gulp.src('./build/Popcorn-Time-CE/osx64/**/*') - .pipe(tar('popcorn-time-ce_osx64_'+package.version+'.tar')) - .pipe(gzip()) - .pipe(gulp.dest('./dist')); - gulp.src('./build/Popcorn-Time-CE/win32/**') - .pipe(zip('popcorn-time-ce_win32_'+package.version+'.zip')) - .pipe(gulp.dest('./dist')); - gulp.src('./build/Popcorn-Time-CE/win64/**') - .pipe(zip('popcorn-time-ce_win64_'+package.version+'.zip')) - .pipe(gulp.dest('./dist')); - gulp.src('./build/Popcorn-Time-CE/linux32/**') - .pipe(tar('popcorn-time-ce_linux32_'+package.version+'.tar')) - .pipe(gzip()) - .pipe(gulp.dest('./dist')); - return gulp.src('./build/Popcorn-Time-CE/linux64/**') - .pipe(tar('popcorn-time-ce_linux64_'+package.version+'.tar')) - .pipe(gzip()) - .pipe(gulp.dest('./dist')); +gulp.task('ffmpegbuild', function() { + var downloadArray = merge2(); + var item = 0; + buildplatforms.forEach(item => { + switch (item) { + case "linux64": + //Copy updated FFMPEG into the cache directory before building + downloadArray.add(download(ffmpegDownloadurl + '/' + nwVersion + '-linux-x64.zip') + .pipe(unzip()) + .pipe(gulp.dest("./pre/" + item)) + .pipe(gulp.dest("./build/Popcorn-Time-CE/" + item + "/lib"))); + break; + case "linux32": + //Copy updated FFMPEG into the cache directory before building + downloadArray.add(download(ffmpegDownloadurl + '/' + nwVersion + '-linux-ia32.zip') + .pipe(unzip()) + .pipe(gulp.dest("./pre/" + item)) + .pipe(gulp.dest("./build/Popcorn-Time-CE/" + item + "/lib"))); + break; + case "win32": + //Copy updated FFMPEG into the cache directory before building + downloadArray.add(download(ffmpegDownloadurl + '/' + nwVersion + '-win-ia32.zip') + .pipe(unzip()) + .pipe(gulp.dest("./pre/" + item)) + .pipe(gulp.dest("./build/Popcorn-Time-CE/" + item))); + break; + case "win64": + //Copy updated FFMPEG into the cache directory before building + downloadArray.add(download(ffmpegDownloadurl + '/' + nwVersion + '-win-x64.zip') + .pipe(unzip()) + .pipe(gulp.dest("./pre/" + item)) + .pipe(gulp.dest("./build/Popcorn-Time-CE/" + item))); + break; + case "osx64": + var fs = require("fs"); + var osxBuilddir = "./build/Popcorn-Time-CE/" + item + '/' + 'Popcorn-Time-CE.app/Contents/Versions/'; + var files = fs.readdirSync(osxBuilddir); + if (files.length > 0) { + //osxCachedir = './cache/' + nwVersion + '-sdk/osx64/nwjs.app/Contents/Versions/' + files[0]; + osxBuilddir = "./build/Popcorn-Time-CE/" + item + '/' + 'Popcorn-Time-CE.app/Contents/Versions/' + files[0]; + } + //Copy updated FFMPEG into the cache directory before building + //https://github.com/iteufel/nwjs-ffmpeg-prebuilt/releases/download/0.31.4/0.31.4-osx-x64.zip + downloadArray.add(download(ffmpegDownloadurl + '/' + nwVersion + '-osx-x64.zip') + .pipe(unzip()) + .pipe(gulp.dest("./pre/" + item)) + .pipe(gulp.dest(osxBuilddir))); + break; + } + }); + return downloadArray; +}); + +gulp.task('ffmpegcache', function() { + var cacheDir = './cache/' + nwVersion + '-sdk'; + var downloadArray = merge2(); + var item = 0; + + buildplatforms.forEach(item => { + switch (item) { + case "linux64": + //Copy updated FFMPEG into the cache directory before building + downloadArray.add(download(ffmpegDownloadurl + '/' + nwVersion + '-linux-x64.zip') + .pipe(unzip()) + .pipe(gulp.dest(cacheDir + '/' + item + "/lib"))); + break; + case "linux32": + //Copy updated FFMPEG into the cache directory before building + downloadArray.add(download(ffmpegDownloadurl + '/' + nwVersion + '-linux-ia32.zip') + .pipe(unzip()) + .pipe(gulp.dest(cacheDir + '/' + item + "/lib"))); + break; + case "win32": + //Copy updated FFMPEG into the cache directory before building + downloadArray.add(download(ffmpegDownloadurl + '/' + nwVersion + '-win-ia32.zip') + .pipe(unzip()) + .pipe(gulp.dest(cacheDir + '/' + item))); + break; + case "win64": + //Copy updated FFMPEG into the cache directory before building + downloadArray.add(download(ffmpegDownloadurl + '/' + nwVersion + '-win-x64.zip') + .pipe(unzip()) + .pipe(gulp.dest(cacheDir + '/' + item))); + break; + case "osx64": + var fs = require("fs"); + var osxCachedir = './cache/' + nwVersion + '-sdk/osx64/nwjs.app/Contents/Versions/'; + var files = fs.readdirSync(osxCachedir); + if (files.length > 0) { + osxCachedir = './cache/' + nwVersion + '-sdk/osx64/nwjs.app/Contents/Versions/' + files[0]; + } + downloadArray.add(download(ffmpegDownloadurl + '/' + nwVersion + '-osx-x64.zip') + .pipe(unzip()) + .pipe(gulp.dest(osxCachedir))); + break; + } + }); + + return downloadArray; +}); + +gulp.task('zip', ['ffmpegbuild'], function() { + var zipArray = merge2(); + + buildplatforms.forEach(item => { + switch (item) { + case "linux64": + zipArray.add(gulp.src('./build/Popcorn-Time-CE/linux64/**') + .pipe(tar('popcorn-time-ce_linux64_' + package.version + '.tar')) + .pipe(gzip()) + .pipe(gulp.dest('./dist'))); + break; + case "linux32": + zipArray.add(gulp.src('./build/Popcorn-Time-CE/linux32/**') + .pipe(tar('popcorn-time-ce_linux32_' + package.version + '.tar')) + .pipe(gzip()) + .pipe(gulp.dest('./dist'))); + break; + case "win32": + zipArray.add(gulp.src('./build/Popcorn-Time-CE/win32/**') + .pipe(zip('popcorn-time-ce_win32_' + package.version + '.zip')) + .pipe(gulp.dest('./dist'))); + break; + case "win64": + zipArray.add(gulp.src('./build/Popcorn-Time-CE/win64/**') + .pipe(zip('popcorn-time-ce_win64_' + package.version + '.zip')) + .pipe(gulp.dest('./dist'))); + break; + case "osx64": + zipArray.add(gulp.src('./build/Popcorn-Time-CE/osx64/**') + .pipe(zip('popcorn-time-ce_osx64_' + package.version + '.zip')) + //.pipe(gzip()) + .pipe(gulp.dest('./dist'))); + break; + } + }); + + return zipArray; }); gulp.task('default', function() { - // place code for your default task here + // place code for your default task here + console.log(nwVersion); }); \ No newline at end of file diff --git a/install b/install index eeab5f01..1f854d7f 100755 --- a/install +++ b/install @@ -23,7 +23,7 @@ fi func_error #Variables -version="0.4.1-15" +version="0.4.1-16" tos="http://popcorn-time.is/tos.html" $path="$HOME/.Popcorn-Time-CE" @@ -36,7 +36,7 @@ Popcorn Time CE $version - Linux $arch bits Please read our Terms of service: $tos -This installer will install Popcorn Time in: +This installer will install Popcorn Time CE in: ~/.Popcorn-Time-CE ~/.local/share/applications ~/.local/share/icons diff --git a/package.json b/package.json index ae631b4a..b60510ed 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,9 @@ }, "license": "GPL-3.0", "main": "src/app/index.html", - "version": "0.4.1-15", + "version": "0.4.1-16", "node-remote": "*://*", - "releaseName": "Ides of March", + "releaseName": "Summer Dreams", "scripts": { "start": "gulp run" }, @@ -30,17 +30,17 @@ }, "dependencies": { "urijs": "^1.17.0", - "adm-zip": "0.4.7", + "adm-zip": "0.4.11", + "ajv": "6.5.3", "airplay-js": "^0.3.0", "async": "^2.2.0", "chromecast-js": "git+https://github.com/captainyarr/chromecast-js.git", - "gitlab": "^1.7.1", + "gitlab": "^3.11.0", "i18n": "0.8.3", "iconv-lite": "^0.4.7", "jschardet": "1.6.0", "json-rpc2": "^1.0.2", "kat-api-ce": "^0.0.4", - "rarbg-api": "git+https://github.com/talas9/rarbg-api", "markdown": "~0.5.0", "memoizee": "^0.4.4", "mkdirp": "^0.5.1", @@ -51,14 +51,15 @@ "node-tvdb": "^4.0.0", "node-webkit-fdialogs": "^0.2.7", "nodecast-js": "^1.0.3", + "opensubtitles-api": "4.1.0", "opensubtitles-ce": "^1.0.0", - "opensubtitles-api": "4.0.0", "os-name": "^2.0.1", - "peerflix": "^0.37.0", - "q": "2.0.3", - "read-torrent": "1.3.0", + "parse-torrent": "^6.1.1", + "peerflix": "^0.39.0", + "q": "^2.0.3", + "rarbg-api": "git+https://github.com/talas9/rarbg-api.git", "readdirp": "^2.1.0", - "request": "^2.55.0", + "request": "^2.87.0", "rimraf": "^2.6.1", "sanitizer": "^0.1.2", "semver": "^5.3.0", @@ -69,21 +70,24 @@ "torrent-tracker-health": "git+https://github.com/PTCE-Public/torrent-tracker-health.git", "underscore": "^1.8.3", "upnp-mediarenderer-client": "^1.2.1", - "webtorrent": "^0.98.19", - "xmlbuilder": "^9.0.4" + "xmlbuilder": "^10.0.0", + "webtorrent": "^0.102.1" }, "devDependencies": { "del": "^3.0.0", - "eslint": "^4.13.1", + "eslint": "^5.0.1", "eslint-config-google": "^0.9.1", "gulp": "^3.9.1", "gulp-zip": "~4.1.0", - "gulp-gzip":"^1.4.0", + "gulp-download": "0.0.1", + "gulp-gzip": "^1.4.0", "gulp-tar": "^2.0.0", - "nw-builder": "^3.5.1", + "gulp-unzip": "^1.0.0", + "merge2": "1.2.2", + "nw-builder": "^3.5.4", "nw-gyp": "^3.4.0", - "yargs": "^11.0.0" + "yargs": "^12.0.1" }, "description": "", "author": "" -} \ No newline at end of file +} diff --git a/src/app/app.js b/src/app/app.js index 8c1f88b5..bcfe98a3 100644 --- a/src/app/app.js +++ b/src/app/app.js @@ -1,5 +1,5 @@ var -// Minimum percentage to open video + // Minimum percentage to open video MIN_PERCENTAGE_LOADED = 0.5, // Minimum bytes loaded to open video @@ -32,22 +32,22 @@ var // Special Debug Console Calls! win.log = console.log.bind(console); -win.debug = function () { +win.debug = function() { var params = Array.prototype.slice.call(arguments, 1); params.unshift('%c[%cDEBUG%c] %c' + arguments[0], 'color: black;', 'color: green;', 'color: black;', 'color: blue;'); console.debug.apply(console, params); }; -win.info = function () { +win.info = function() { var params = Array.prototype.slice.call(arguments, 1); params.unshift('[%cINFO%c] ' + arguments[0], 'color: blue;', 'color: black;'); console.info.apply(console, params); }; -win.warn = function () { +win.warn = function() { var params = Array.prototype.slice.call(arguments, 1); params.unshift('[%cWARNING%c] ' + arguments[0], 'color: orange;', 'color: black;'); console.warn.apply(console, params); }; -win.error = function () { +win.error = function() { var params = Array.prototype.slice.call(arguments, 1); params.unshift('%c[%cERROR%c] ' + arguments[0], 'color: black;', 'color: red;', 'color: black;'); console.error.apply(console, params); @@ -61,27 +61,27 @@ if (gui.App.fullArgv.indexOf('--reset') !== -1) { localStorage.clear(); - fs.unlinkSync(path.join(data_path, 'data/watched.db'), function (err) { + fs.unlinkSync(path.join(data_path, 'data/watched.db'), function(err) { if (err) { throw err; } }); - fs.unlinkSync(path.join(data_path, 'data/movies.db'), function (err) { + fs.unlinkSync(path.join(data_path, 'data/movies.db'), function(err) { if (err) { throw err; } }); - fs.unlinkSync(path.join(data_path, 'data/bookmarks.db'), function (err) { + fs.unlinkSync(path.join(data_path, 'data/bookmarks.db'), function(err) { if (err) { throw err; } }); - fs.unlinkSync(path.join(data_path, 'data/shows.db'), function (err) { + fs.unlinkSync(path.join(data_path, 'data/shows.db'), function(err) { if (err) { throw err; } }); - fs.unlinkSync(path.join(data_path, 'data/settings.db'), function (err) { + fs.unlinkSync(path.join(data_path, 'data/settings.db'), function(err) { if (err) { throw err; } @@ -109,7 +109,7 @@ App.db = Database; App.advsettings = AdvSettings; App.settings = Settings; -fs.readFile('./.git.json', 'utf8', function (err, json) { +fs.readFile('./.git.json', 'utf8', function(err, json) { if (!err) { App.git = JSON.parse(json); } @@ -134,7 +134,7 @@ if (os.platform() === 'darwin') { //Keeps a list of stacked views App.ViewStack = []; -App.addInitializer(function (options) { +App.addInitializer(function(options) { // this is the 'do things with resolutions and size initializer var zoom = 0; @@ -183,13 +183,13 @@ App.addInitializer(function (options) { win.moveTo(x, y); }); -var initTemplates = function () { +var initTemplates = function() { // Load in external templates var ts = []; - _.each(document.querySelectorAll('[type="text/x-template"]'), function (el) { + _.each(document.querySelectorAll('[type="text/x-template"]'), function(el) { var d = Q.defer(); - $.get(el.src, function (res) { + $.get(el.src, function(res) { el.innerHTML = res; d.resolve(true); }); @@ -199,7 +199,7 @@ var initTemplates = function () { return Q.all(ts); }; -var initApp = function () { +var initApp = function() { var mainWindow = new App.View.MainWindow(); win.show(); @@ -210,12 +210,12 @@ var initApp = function () { } }; -App.addInitializer(function (options) { +App.addInitializer(function(options) { initTemplates() .then(initApp); }); -var deleteFolder = function (path) { +var deleteFolder = function(path) { if (typeof path !== 'string') { return; @@ -225,7 +225,7 @@ var deleteFolder = function (path) { var files = []; if (fs.existsSync(path)) { files = fs.readdirSync(path); - files.forEach(function (file, index) { + files.forEach(function(file, index) { var curPath = path + '\/' + file; if (fs.lstatSync(curPath).isDirectory()) { deleteFolder(curPath); @@ -241,9 +241,9 @@ var deleteFolder = function (path) { } }; -var deleteCookies = function () { +var deleteCookies = function() { var nwWin = gui.Window.get(); - nwWin.cookies.getAll({}, function (cookies) { + nwWin.cookies.getAll({}, function(cookies) { if (cookies.length > 0) { win.debug('Removing ' + cookies.length + ' cookies...'); for (var i = 0; i < cookies.length; i++) { @@ -257,7 +257,7 @@ var deleteCookies = function () { nwWin.cookies.remove({ url: lurl, name: cookie.name - }, function (result) { + }, function(result) { if (result) { if (!result.name) { result = result[0]; @@ -270,20 +270,20 @@ var deleteCookies = function () { } }; -win.on('resize', function (width, height) { +win.on('resize', function(width, height) { localStorage.width = Math.round(width); localStorage.height = Math.round(height); }); -win.on('move', function (x, y) { +win.on('move', function(x, y) { localStorage.posX = Math.round(x); localStorage.posY = Math.round(y); }); -var delCache = function () { +var delCache = function() { var reqDB = window.indexedDB.webkitGetDatabaseNames(); - reqDB.onsuccess = function (db) { + reqDB.onsuccess = function(db) { if (db.timeStamp && (new Date().valueOf() - db.timeStamp > 259200000)) { // 3 days old window.indexedDB.deleteDatabase('cache'); win.close(true); @@ -295,7 +295,7 @@ var delCache = function () { }; // Wipe the tmpFolder when closing the app (this frees up disk space) -win.on('close', function () { +win.on('close', function() { if (App.settings.deleteTmpOnClose) { deleteFolder(App.settings.tmpLocation); } @@ -309,40 +309,40 @@ win.on('close', function () { } }); -String.prototype.capitalize = function () { +String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); }; -String.prototype.capitalizeEach = function () { - return this.replace(/\w*/g, function (txt) { +String.prototype.capitalizeEach = function() { + return this.replace(/\w*/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }); }; -String.prototype.endsWith = function (suffix) { +String.prototype.endsWith = function(suffix) { return this.indexOf(suffix, this.length - suffix.length) !== -1; }; // Developer Shortcuts -Mousetrap.bindGlobal(['shift+f12', 'f12', 'command+0'], function (e) { +Mousetrap.bindGlobal(['shift+f12', 'f12', 'command+0'], function(e) { win.showDevTools(); }); -Mousetrap.bindGlobal(['shift+f10', 'f10', 'command+9'], function (e) { +Mousetrap.bindGlobal(['shift+f10', 'f10', 'command+9'], function(e) { win.debug('Opening: ' + App.settings['tmpLocation']); gui.Shell.openItem(App.settings['tmpLocation']); }); -Mousetrap.bind('mod+,', function (e) { +Mousetrap.bind('mod+,', function(e) { App.vent.trigger('about:close'); App.vent.trigger('settings:show'); }); -Mousetrap.bindGlobal('f11', function (e) { +Mousetrap.bindGlobal('f11', function(e) { Settings.deleteTmpOnClose = false; App.vent.trigger('restartPopcornTime'); }); -Mousetrap.bind(['?', '/', '\''], function (e) { +Mousetrap.bind(['?', '/', '\''], function(e) { e.preventDefault(); App.vent.trigger('keyboard:toggle'); }); -Mousetrap.bind('shift+up shift+up shift+down shift+down shift+left shift+right shift+left shift+right shift+b shift+a', function () { +Mousetrap.bind('shift+up shift+up shift+down shift+down shift+left shift+right shift+left shift+right shift+b shift+a', function() { var body = $('body'); if (body.hasClass('knm')) { @@ -351,11 +351,11 @@ Mousetrap.bind('shift+up shift+up shift+down shift+down shift+left shift+right s body.addClass('knm'); } }); -Mousetrap.bindGlobal(['command+ctrl+f', 'ctrl+alt+f'], function (e) { +Mousetrap.bindGlobal(['command+ctrl+f', 'ctrl+alt+f'], function(e) { e.preventDefault(); win.toggleFullscreen(); }); -Mousetrap.bind('shift+b', function (e) { +Mousetrap.bind('shift+b', function(e) { if (!ScreenResolution.SD) { if (App.settings.bigPicture) { win.zoomLevel = Settings.noBigPicture || 0; @@ -373,26 +373,26 @@ Mousetrap.bind('shift+b', function (e) { }); // Drag n' Drop Torrent Onto PT Window to start playing (ALPHA) -window.ondragenter = function (e) { +window.ondragenter = function(e) { $('#drop-mask').show(); var showDrag = true; var timeout = -1; $('#drop-mask').on('dragenter', - function (e) { + function(e) { $('.drop-indicator').show(); win.debug('Drag init'); }); $('#drop-mask').on('dragover', - function (e) { + function(e) { var showDrag = true; }); $('#drop-mask').on('dragleave', - function (e) { + function(e) { var showDrag = false; clearTimeout(timeout); - timeout = setTimeout(function () { + timeout = setTimeout(function() { if (!showDrag) { win.debug('Drag aborted'); $('.drop-indicator').hide(); @@ -402,10 +402,10 @@ window.ondragenter = function (e) { }); }; -var minimizeToTray = function () { +var minimizeToTray = function() { win.hide(); - var openFromTray = function () { + var openFromTray = function() { win.show(); tray.remove(); }; @@ -420,46 +420,46 @@ var minimizeToTray = function () { menu.append(new gui.MenuItem({ type: 'normal', label: i18n.__('Restore'), - click: function () { + click: function() { openFromTray(); } })); menu.append(new gui.MenuItem({ type: 'normal', label: i18n.__('Close'), - click: function () { + click: function() { win.close(); } })); tray.menu = menu; - tray.on('click', function () { + tray.on('click', function() { openFromTray(); }); - require('nw.gui').App.on('open', function (cmd) { + require('nw.gui').App.on('open', function(cmd) { openFromTray(); }); }; -var isVideo = function (file) { +var isVideo = function(file) { var ext = path.extname(file).toLowerCase(); switch (ext) { - case '.mp4': - case '.avi': - case '.mov': - case '.mkv': - case '.wmv': - return true; - default: - return false; + case '.mp4': + case '.avi': + case '.mov': + case '.mkv': + case '.wmv': + return true; + default: + return false; } }; -var handleVideoFile = function (file) { +var handleVideoFile = function(file) { // look for subtitles - var checkSubs = function () { + var checkSubs = function() { var _ext = path.extname(file.name); var toFind = file.path.replace(_ext, '.srt'); @@ -496,8 +496,13 @@ var handleVideoFile = function (file) { $('.eye-info-player').hide(); }; -var handleTorrent = function (torrent) { - torrent = unescape(url.parse(torrent, true).path); +var handleTorrent = function(torrent) { + //torrent = unescape(url.parse(torrent, true).path); + if (torrent.includes('magnet:')) { + var torrentUrl = new URL(torrent); + torrent = unescape(torrentUrl.protocol + torrentUrl.search); + } else + torrent = unescape(torrent); try { App.PlayerView.closePlayer(); } catch (err) { @@ -506,7 +511,7 @@ var handleTorrent = function (torrent) { App.Config.getProvider('torrentCache').resolve(torrent); }; -window.ondrop = function (e) { +window.ondrop = function(e) { e.preventDefault(); $('#drop-mask').hide(); win.debug('Drag completed'); @@ -516,7 +521,7 @@ window.ondrop = function (e) { if (file != null && (file.name.indexOf('.torrent') !== -1 || file.name.indexOf('.srt') !== -1)) { - fs.writeFile(path.join(App.settings.tmpLocation, file.name), fs.readFileSync(file.path), function (err) { + fs.writeFile(path.join(App.settings.tmpLocation, file.name), fs.readFileSync(file.path), function(err) { if (err) { App.PlayerView.closePlayer(); window.alert(i18n.__('Error Loading File') + ': ' + err); @@ -543,7 +548,7 @@ window.ondrop = function (e) { }; // Paste Magnet Link to start stream -$(document).on('paste', function (e) { +$(document).on('paste', function(e) { if (e.target.nodeName === 'INPUT' || e.target.nodeName === 'TEXTAREA') { return; @@ -561,14 +566,14 @@ $(document).on('paste', function (e) { var last_arg = gui.App.argv.pop(); if (last_arg && (last_arg.substring(0, 8) === 'magnet:?' || last_arg.substring(0, 7) === 'http://' || last_arg.endsWith('.torrent'))) { - App.vent.on('app:started', function () { + App.vent.on('app:started', function() { handleTorrent(last_arg); }); } // Play local files if (last_arg && (isVideo(last_arg))) { - App.vent.on('app:started', function () { + App.vent.on('app:started', function() { var fileModel = { path: last_arg, name: /([^\\]+)$/.exec(last_arg)[1] @@ -577,7 +582,7 @@ if (last_arg && (isVideo(last_arg))) { }); } -gui.App.on('open', function (cmd) { +gui.App.on('open', function(cmd) { var file; if (os.platform() === 'win32') { file = cmd.split('"'); @@ -609,14 +614,14 @@ if (gui.App.fullArgv.indexOf('-f') !== -1) { } // -m argument to open minimized to tray if (gui.App.fullArgv.indexOf('-m') !== -1) { - App.vent.on('app:started', function () { + App.vent.on('app:started', function() { minimizeToTray(); }); } // On uncaught exceptions, log to console. -process.on('uncaughtException', function (err) { +process.on('uncaughtException', function(err) { try { if (err.message.indexOf('[sprintf]') !== -1) { var currentLocale = App.Localization.langcodes[i18n.getLocale()].nativeName; @@ -627,4 +632,4 @@ process.on('uncaughtException', function (err) { } } catch (e) {} win.error(err, err.stack); -}); +}); \ No newline at end of file diff --git a/src/app/database.js b/src/app/database.js index a6710ce9..d9cf56f5 100644 --- a/src/app/database.js +++ b/src/app/database.js @@ -426,6 +426,8 @@ var Database = { .then(function () { App.Trakt = App.Config.getProvider('metadata'); App.TVShowTime = App.Config.getProvider('tvst'); + App.OpenSubtitlesMovies = App.Config.getProvider('subtitle'); + // check update var updater = new App.Updater(); diff --git a/src/app/images/icons/download-icon.png b/src/app/images/icons/download-icon.png new file mode 100644 index 00000000..a8c05a8b Binary files /dev/null and b/src/app/images/icons/download-icon.png differ diff --git a/src/app/images/icons/external-wmplayer-icon.png b/src/app/images/icons/external-wmplayer-icon.png new file mode 100644 index 00000000..0482240f Binary files /dev/null and b/src/app/images/icons/external-wmplayer-icon.png differ diff --git a/src/app/index.html b/src/app/index.html index 8bd4c221..bb54ada5 100644 --- a/src/app/index.html +++ b/src/app/index.html @@ -66,7 +66,10 @@ - + + @@ -99,7 +102,7 @@ - + diff --git a/src/app/language/da.json b/src/app/language/da.json index 24f9a971..40a528ae 100644 --- a/src/app/language/da.json +++ b/src/app/language/da.json @@ -1,490 +1,502 @@ { - "External Player": "Ekstern afspiller", - "Made with": "Lavet med", - "by a bunch of geeks from All Around The World": "af en flok nørder fra hele verden", - "Initializing PopcornTime. Please Wait...": "Vent venligst, mens Popcorn Time starter...", - "Status: Checking Database...": "Status: Tjekker database...", - "Movies": "Film", - "TV Series": "TV-serier", - "Anime": "Anime", - "Genre": "Genre", - "All": "Alle", - "Action": "Action", - "Adventure": "Eventyr", - "Animation": "Animation", - "Children": "For børn", - "Comedy": "Komedie", - "Crime": "Krimi", - "Documentary": "Dokumentar", - "Drama": "Drama", - "Family": "Familie", - "Fantasy": "Fantasy", - "Game Show": "Gameshow", - "Home And Garden": "Hus og have", - "Horror": "Gyser", - "Mini Series": "Miniserier", - "Mystery": "Mystik", - "News": "Nyheder", - "Reality": "Realityshow", - "Romance": "Romantik", - "Science Fiction": "Science fiction", - "Soap": "Sæbeopera", - "Special Interest": "Speciel Interesse", - "Sport": "Sport", - "Suspense": "Spænding", - "Talk Show": "Talkshow", - "Thriller": "Thriller", - "Western": "Western", - "Sort by": "Sortér efter", - "Popularity": "Popularitet", - "Updated": "Opdateret", - "Year": "År", - "Name": "Navn", - "Search": "Søg", - "Season": "Sæson", - "Seasons": "Sæsoner", - "Season %s": "Sæson %s", - "Load More": "Indlæs flere", - "Saved": "Gemt", - "Settings": "Indstillinger", - "Show advanced settings": "Vis avancerede indstillinger", - "User Interface": "Brugergrænseflade", - "Default Language": "Standardsprog", - "Theme": "Tema", - "Start Screen": "Startskærm", - "Favorites": "Favoritter", - "Show rating over covers": "Vis bedømmelse på cover", - "Always On Top": "Altid øverst", - "Watched Items": "Sete film/TV-serier", - "Show": "Vis", - "Fade": "Udton", - "Hide": "Skjul", - "Subtitles": "Undertekster", - "Default Subtitle": "Standardundertekster", - "Disabled": "Deaktiveret", - "Size": "Størrelse", - "Quality": "Kvalitet", - "Only list movies in": "Vis kun film i", - "Show movie quality on list": "Vis filmkvalitet på listen", - "Trakt.tv": "Trakt.tv", - "Enter your Trakt.tv details here to automatically 'scrobble' episodes you watch in Popcorn Time": "Indtast dine Trakt.tv oplysninger her, for automatisk at 'scrobble' de episoder du ser i Popcorn Time", - "Connect to %s to automatically 'scrobble' episodes you watch in %s": "Forbind til %s for automatisk at 'scrobble' episoder du ser i %s", - "Username": "Brugernavn", - "Password": "Adgangskode", - "Popcorn Time stores an encrypted hash of your password in your local database": "Popcorn Time gemmer en krypteret nøgle-værdi af din adgangskode i din lokale database", - "Remote Control": "Fjernbetjening", - "HTTP API Port": "HTTP API port", - "HTTP API Username": "HTTP API brugernavn", - "HTTP API Password": "HTTP API adgangskode", - "Connection": "Forbindelse", - "TV Show API Endpoint": "Endepunkt for TV-serie API", - "Movies API Endpoint": "Endepunkt for Film API", - "Connection Limit": "Max. antal forbindelser", - "DHT Limit": "DHT grænse", - "Port to stream on": "Port som streames fra", - "0 = Random": "0 = Tilfældig", - "Cache Directory": "Cache mappe", - "Clear Tmp Folder after closing app?": "Ryd den midlertidige mappe når programmet lukkes?", - "Database": "Database", - "Database Directory": "Database mappe", - "Import Database": "Importér database", - "Export Database": "Eksportér database", - "Flush bookmarks database": "Tøm favorit databasen", - "Flush subtitles cache": "Tøm undertekst cache", - "Flush all databases": "Tøm alle databaser", - "Reset to Default Settings": "Nulstil til standardindstillinger", - "Importing Database...": "Importerer database...", - "Please wait": "Vent venligst", - "Error": "Fejl", - "Biography": "Biografi", - "Film-Noir": "Film-Noir", - "History": "Historie", - "Music": "Musik", - "Musical": "Musical", - "Sci-Fi": "Sci-fi", - "Short": "Kortfilm", - "War": "Krig", - "Last Added": "Sidst tilføjet", - "Rating": "Bedømmelse", - "Open IMDb page": "Åbn IMDb-side", - "Health false": "Falskt helbred", - "Add to bookmarks": "Tilføj til favoritter", - "Watch Trailer": "Se Trailer", - "Watch Now": "Afspil Nu", - "Health Good": "Godt helbred", - "Ratio:": "Forhold:", - "Seeds:": "Seeds:", - "Peers:": "Peers:", - "Remove from bookmarks": "Fjern fra favoritter", - "Changelog": "Ændringslog", - "Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.": "Popcorn Time! er resultatet af mange udviklere og designere, som har sammensat nogle API'er for at gøre oplevelsen af at se torrent-film så enkelt som muligt.", - "We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.": "Vi er et open source projekt. Vi er fra hele verden. Vi elsker film. Og manner, hvor vi dog elsker popcorn.", - "Invalid PCT Database File Selected": "Ugyldig PCT-database-fil valgt", - "Health Unknown": "Ukendt helbred", - "Episodes": "Episoder", - "Episode %s": "Episode %s", - "Aired Date": "Først vist", - "Streaming to": "Streamer til", - "connecting": "Forbinder", - "Download": "Download", - "Upload": "Upload", - "Active Peers": "Aktive peers", - "Cancel": "Annullér", - "startingDownload": "Begynder download", - "downloading": "Downloader", - "ready": "Klar", - "playingExternally": "Afspiller eksternt", - "Custom...": "Brugerdefineret...", - "Volume": "Lydstyrke", - "Ended": "Afsluttet", - "Error loading data, try again later...": "Fejl ved indlæsning af data, prøv igen senere...", - "Miscellaneous": "Diverse", - "When opening TV Show Detail Jump to:": "Når du åbner TV-serie detaljer, gå til:", - "First Unwatched Episode": "Første ikke-sete episode", - "Next Episode In Series": "Næste episode i serie", - "When Opening TV Show Detail Jump To": "Når du åbner TV-serie detaljer, gå til", - "Flushing...": "Tømmer...", - "Are you sure?": "Er du sikker?", - "We are flushing your databases": "Vi tømmer dine databaser", - "Success": "Succes", - "Please restart your application": "Genstart venligst programmet", - "Restart": "Genstart", - "Terms of Service": "Vilkår for tjeneste", - "I Accept": "Jeg accepterer", - "Leave": "Forlad", - "When Opening TV Series Detail Jump To": "Når du åbner TV-serie detaljer, gå til", - "Health Medium": "Medium helbred", - "Playback": "Afspilning", - "Play next episode automatically": "Afspil næste episode automatisk", - "Generate Pairing QR code": "Opret QR-kode til parring", - "Playing Next Episode in": "Afspiller næste episode om", - "Play": "Afspil", - "Dismiss": "Afvis", - "waitingForSubtitles": "Venter på undertekster", - "Play Now": "Afspil Nu", - "Seconds": "Sekunder", - "You are currently authenticated to Trakt.tv as": "Du er forbundet til Trakt.tv som", - "You are currently connected to %s": "Du er i øjeblikket forbundet til %s", - "Disconnect account": "Afbryd konto", - "Sync With Trakt": "Synkronisér med Trakt", - "Syncing...": "Synkroniserer...", - "Done": "Færdig", - "Subtitles Offset": "Undertekst forskydning", - "secs": "sek.", - "We are flushing your database": "Vi tømmer din database", - "We are rebuilding the TV Show Database. Do not close the application.": "Vi genopbygger TV-serie databasen. Luk ikke programmet.", - "No shows found...": "Ingen TV-serier fundet...", - "No Favorites found...": "Ingen favoritter fundet...", - "Rebuild TV Shows Database": "Genopbyg TV-serie databasen", - "No movies found...": "Ingen film fundet...", - "Ratio": "Forhold", - "Health Excellent": "Fremragende helbred", - "Health Bad": "Dårligt helbred", - "Status: Creating Database...": "Status: Opretter database...", - "Status: Updating database...": "Status: Opdaterer database...", - "Status: Skipping synchronization TTL not met": "Status: Springer synkronisering over, TTL er ikke opfyldt", - "Advanced Settings": "Avancerede indstillinger", - "Clear Cache directory after closing app?": "Ryd cache mappe efter afslutning af programmet?", - "Tmp Folder": "Midlertidig mappe", - "Status: Downloading API archive...": "Status: Downloader API-arkiv...", - "Status: Archive downloaded successfully...": "Status: Arkiv downloadet med succes...", - "Status: Importing file": "Status: Importerer fil", - "Status: Imported successfully": "Status: Importeret med succes", - "Status: Launching applicaion... ": "Status: Åbner programmet...", - "URL of this stream was copied to the clipboard": "Genvejen til dette stream er kopieret til udklipsholderen", - "Error, database is probably corrupted. Try flushing the bookmarks in settings.": "Fejl, databasen er sandsynligvis beskadiget. Prøv at tømme favoritterne under indstillinger.", - "Flushing bookmarks...": "Tømmer favoritter...", - "Resetting...": "Nulstiller...", - "We are resetting the settings": "Nulstiller indstillinger", - "New version downloaded": "Ny version downloadet", - "Installed": "Installeret", - "Install Now": "Installér nu", - "Restart Now": "Genstart nu", - "We are flushing your subtitle cache": "Sletter undertekst cache", - "Subtitle cache deleted": "Undertekst cache slettet", - "Please select a file to play": "Vælg venligst en fil som skal afspilles", - "Test Login": "Test login", - "Testing...": "Tester...", - "Success!": "Succes!", - "Failed!": "Mislykkedes!", - "Global shortcuts": "Globale genveje", - "Video Player": "Videoafspiller", - "Toggle Fullscreen": "Aktivér fuld skærm", - "Play/Pause": "Afspil/Pause", - "Seek Forward": "Spol fremad", - "Increase Volume": "Skru op for lydstyrken", - "Set Volume to": "Sæt lydstyrken til", - "Offset Subtitles by": "Forskyd undertekster med", - "Toggle Mute": "Aktiver/deaktiver lyd", - "Movie Detail": "Filmdetaljer", - "Toggle Quality": "Skift kvalitet", - "Play Movie": "Afspil film", - "Exit Fullscreen": "Afslut fuld skærm", - "Seek Backward": "Spol tilbage", - "Decrease Volume": "Skru ned for lydstyrken", - "Show Stream URL": "Vis stream URL", - "TV Show Detail": "TV-serie detaljer", - "Toggle Watched": "Markér som set/ikke-set", - "Select Next Episode": "Vælg næste episode", - "Select Previous Episode": "Vælg forrige episode", - "Select Next Season": "Vælg næste sæson", - "Select Previous Season": "Vælg forrige sæson", - "Play Episode": "Afspil episode", - "space": "mellemrum", - "shift": "skift", - "ctrl": "ctrl", - "enter": "enter", - "esc": "esc", - "Keyboard Shortcuts": "Tastaturgenveje", - "Cut": "Klip", - "Copy": "Kopier", - "Paste": "Sæt ind", - "Help Section": "Hjælpesektion", - "Did you know?": "Vidste du?", - "What does Popcorn Time offer?": "Hvad kan Popcorn Time tilbyde?", - "With Popcorn Time, you can watch Movies and TV Series really easily. All you have to do is click on one of the covers, then click 'Watch Now'. But your experience is highly customizable:": "Med Popcorn Time kan du se Film og TV-serier uden besvær. Det eneste du skal gøre er at klikke på et af coverne og derefter klikke på 'Afspil'. Din oplevelse kan tilpasses på mange måder:", - "Our Movies collection only contains High-Definition movies, available in 720p and 1080p. To watch a movie, simply open Popcorn Time and navigate through the movies collection, reachable through the 'Movies' tab, in the navigation bar. The default view will show you all movies sorted by popularity, but you can apply your own filters, thanks to the 'Genre' and 'Sort by' filters. Once you have chosen a movie you want to watch, click its cover. Then click 'Watch Now'. Don't forget the popcorn!": "Vores film-samling består udelukkende af HD-film, som er tilgængelige i 720p og 1080p. For at se en film, skal du bare åbne Popcorn Time og navigere rundt i film-samlingen, som er tilgængelig via fanen 'Film'. Som standard vil film være sorteret efter popularitet, men du kan selv vælge at sortere efter andre parametre takket være filtrene 'Genre' og 'Sorter efter'. Når du har valgt hvilken film du vil se, klikker du på coveret til filmen. Nu skal du blot klikke 'Afspil Nu'. Glem ikke popcorn!", - "The TV Series tab, that you can reach by clicking 'TV Series' in the navigation bar, will show you all available series in our collection. You can also apply your own filters, same as the Movies, to help you decide what to watch. In this collection, also just click the cover: the new window that will appear will allow you to navigate through Seasons and Episodes. Once your mind is set, just click the 'Watch Now' button.": "TV-serie fanen, som du finder ved at klikke på 'TV-serier' i navigationsmenuen, viser dig alle tilgængelige serier i vores samling. Du kan også her, ligesom i film-samlingen, vælge dine egne filtre, for at finde hvad du ønsker. I denne samling skal du ligeledes klikke på coveret: I det nye vindue kan du bladre gennem sæsoner og episoder. Når du har fundet det ønskede afsnit trykker du blot på 'Afspil Nu'.", - "Choose quality": "Vælg kvalitet", - "A slider next to the 'Watch Now' button will let you choose the quality of the stream. You can also set a fixed quality in the Settings tab. Warning: a better quality equals more data to download.": "En skydeknap ved siden af 'Afspil'-knappen lader dig vælge afspilningskvaliteten. Du kan også sætte en standardkvalitet i Indstillingerne. Advarsel: Jo højere kvalitet du vælger des mere data skal downloades.", - "Most of our Movies and TV Series have subtitles in your language. You can set them in the Settings tab. For the Movies, you can even set them through the dropdown menu, in the Movie Details page.": "De fleste af vore film og TV-serier har undertekster på dit sprog. Du kan vælge danske undertekster som standard i Indstillingerne. For films vedkommende kan undertekst-sproget endda vælges i en rullemenu på filmdetalje-siden.", - "Clicking the heart icon on a cover will add the movie/show to your favorites. This collection is reachable through the heart-shaped icon, in the navigation bar. To remove an item from your collection, just click on the icon again! How simple is that?": "Ved at klikke på hjerte-ikonet på et cover kan du tilføje filmen/TV-serien til dine favoritter. Dine tilføjede favoritter finder du ved at klikke på hjertet i navigationsmenuen. For at fjerne noget fra dine favoritter klikker du blot på coverets hjerte-ikon igen. Hvor simpelt er det ikke lige?", - "Watched icon": "Set-ikon", - "Popcorn Time will keep in mind what you've already watched - a little help remembering doesn't cause any harm. You can also set an item as watched by clicking the eye-shaped icon on the covers. You can even build and synchronize your collection with Trakt.tv website, via the Settings tab.": "Popcorn Time hjælper med at holde styr på, hvad du allerede har set - en smule huskehjælp skader ikke. Du kan også markere noget som set ved at klikke på coverets øje-ikon. Du kan endda skabe og synkronisere din historik med Trakt.tv i Indstillingerne.", - "In Popcorn Time, you can use the magnifier icon to open the search. Type a Title, an Actor, a Director or even a Year, press 'Enter' and let us show you what we can offer to fill your needs. To close your current search, you can click on the 'X' located next to your entry or type something else in the field.": "I Popcorn Time kan du klikke på forstørrelsesglasset i navigationsmenuen for at søge. Indtast en titel, en skuespiller, en instruktør eller et årstal, tryk på 'Enter' og lad os vise dig hvad vi kan tilbyde, for at tilfredsstille dit behov. For at slette din søgning kan du trykke på 'X' til højre for din indtastning eller du kan skrive noget nyt i feltet.", - "External Players": "Eksterne afspillere", - "If you prefer to use a custom player instead of the built in one, you can do so by clicking the allocated icon on the 'Watch Now' button. A list of your installed players will be shown, select one and Popcorn Time will send everything to it. If your player isn't on the list, please report it to us.": "Hvis du foretrækker at bruge en anden afspiller end den indbyggede, kan du dette ved at klikke på det lille ikon i forlængelse af 'Afspil'-knappen. En rullemenu med dine installerede afspillere vil blive vist, vælg én og Popcorn Time vil åbne og afspille i denne i stedet. Hvis din afspiller ikke er på listen, vil vi venligst bede dig gøre os opmærksomme på det.", - "To push the customization even further, we offer you a large panel of options. To access the Settings, click the wheel-shaped icon in the navigation bar.": "For yderligere tilpasning tilbyder vi dig en lang række muligheder. For at tilgå Indstillingerne skal du klikke på tandhjul-ikonet i navigationsmenuen.", - "Keyboard Navigation": "Find vej med tastaturet", - "The entire list of keyboard shortcuts is available by pressing '?' on your keyboard, or through the keyboard-shaped icon in the Settings tab.": "Listen med alle tastaturgenvejene finder du ved at trykke '?' på dit tastatur eller ved at klikke på tastatur-ikonet i Indstillingerne.", - "Custom Torrents and Magnet Links": "Brugerdefinerede Torrents og Magnet Links", - "You can use custom torrents and magnets links in Popcorn Time. Simply drag and drop .torrent files into the application's window, and/or paste any magnet link.": "Du kan bruge brugerdefinerede torrents og magnet links i Popcorn Time. Du skal blot trække .torrent filerne ind i programmets vindue og/eller indsætte et hvilket som helst magnet link.", - "Torrent health": "Torrent helbred", - "On the details of Movies/TV Series, you can find a little circle, colored in grey, red, yellow or green. Those colors refer to the health of the torrent. A green torrent will be downloaded quickly, while a red torrent may not be downloaded at all, or very slowly. The color grey represents an error in the health calculation for Movies, and needs to be clicked in TV Series in order to display the health.": "På detaljesiden for en film/TV-serie ses en lille cirkel, som enten er grå, rød, gul eller grøn. Disse farver fortæller helbredet for den valgte torrent. Er den grøn downloades den hurtigt, men er den rød downloades den meget langsomt eller slet ikke. Den grå cirkel fortæller, at der er en fejl i udregningen af helbreddet for en film, hvorimod for en TV-serie fortæller den, at du skal klikke på cirklen, for at få vist helbreddet.", - "How does Popcorn Time work?": "Hvordan virker Popcorn Time?", - "Popcorn Time streams video content through torrents. Our movies are provided by %s and our TV Series by %s, while getting all metadata from %s. We don't host any content ourselves.": "Popcorn Time streamer videoer via torrenter. Vores film leveres af %s og vores TV-serier af %s, mens alle metadata hentes fra %s. Vi er ikke selv vært for noget indhold.", - "Torrent streaming? Well, torrents use Bittorrent protocol, which basically means that you download small parts of the content from another user's computer, while sending the parts you already downloaded to another user. Then, you watch those parts, while the next ones are being downloaded in the background. This exchange allows the content to stay healthy.": "Torrent streaming? Altså, torrents bruger Bittorrent-protokollen, som i bund og grund betyder, at du downloader små dele af indholdet fra andre brugeres computere imens du uploader de dele, du allerede har downloadet til andre brugere. Du afspiller herefter disse downloadede dele imens de næste downloades i baggrunden. Denne udveksling tillader, at indholdet forbliver brugbart.", - "Once the movie is fully downloaded, you continue to send parts to the other users. And everything is deleted from your computer when you close Popcorn Time. As simple as that.": "Når filmen er downloadet færdig fortsætter du med at uploade dele til andre brugere. Alt slettes fra din computer når du afslutter Popcorn Time. Så simpelt er det.", - "The application itself is built with Node-Webkit, HTML, CSS and Javascript. It works like the Google Chrome browser, except that you host the biggest part of the code on your computer. Yes, Popcorn Time works on the same technology as a regular website, like... let's say Wikipedia, or Youtube!": "Selve programmet er bygget med Node-Webkit, HTML, CSS og Javascript. Det fungerer ligesom Google Chrome browseren udover, at du er vært for den største del af koden på din computer. Ja, du læste rigtigt, Popcorn Time kører med den samme teknologi som en normal hjemmeside, som f.eks. Wikipedia eller YouTube!", - "I found a bug, how do I report it?": "Jeg har fundet en fejl, hvordan rapporterer jeg det?", - "No historics found...": "Ingen historik fundet...", - "Error, database is probably corrupted. Try flushing the history in settings.": "Fejl, databasen er formodentlig beskadiget. Prøv at tømme historikken i Indstillingerne.", - "You can paste magnet links anywhere in Popcorn Time with CTRL+V.": "Du kan indsætte magnet-links overalt i Popcorn Time med CTRL+V.", - "You can drag & drop a .torrent file into Popcorn Time.": "Du kan trække en .torrent fil ind i Popcorn Time.", - "The Popcorn Time project started in February 2014 and has already had 150 people that contributed more than 3000 times to it's development in August 2014.": "Popcorn Time projektet startede i Februar 2014 og allerede i August 2014 har flere end 150 mennesker tilsammen bidraget til udviklingen mere end 3000 gange.", - "The rule n°10 applies here.": "Regel nummer 10 gælder her.", - "If a subtitle for a TV series is missing, you can add it on %s. And the same way for a movie, but on %s.": "Hvis en undertekst mangler for en TV-serie, kan du tilføje en på %s. Det samme for Film, men på %s.", - "If you're experiencing connection drop issues, try to reduce the DHT Limit in settings.": "Hvis du oplever udsving i forbindelsen, kan du prøve at reducere 'DHT grænse' under Indstillinger.", - "If you search \"1998\", you can see all the movies or TV series that came out that year.": "Søg efter \"1998\" for at se alle de film eller TV-serier der udkom dét år.", - "You can login to Trakt.tv to save all your watched items, and synchronize them across multiple devices.": "Du kan logge ind på Trakt.tv for at gemme din historik og synkronisere dem på tværs af flere enheder.", - "Clicking on the rating stars will display a number instead.": "Klikker du på bedømmelses stjernerne vises et tal i stedet.", - "This application is entirely written in HTML5, CSS3 and Javascript.": "Dette program er udelukkende programmeret i HTML5, CSS3 og Javascript.", - "You can find out more about a movie or a TV series? Just click the IMDb icon.": "Vil du vide mere om en film eller en TV-serie? Klik blot på IMDb-ikonet.", - "Clicking twice on a \"Sort By\" filter reverses the order of the list.": "Tryk to gange på et 'Sorter efter' og det vil vende om på listens rækkefølge.", - "Switch to next tab": "Skift til næste fane", - "Switch to previous tab": "Skift til forrige fane", - "Switch to corresponding tab": "Skift til tilsvarende fane", - "through": "gennem", - "Enlarge Covers": "Forstørrer covere", - "Reduce Covers": "Formindsker covere", - "Open the Help Section": "Åbn hjælpesektionen", - "Open Item Details": "Åbn detaljer", - "Add Item to Favorites": "Tilføj til favoritter", - "Mark as Seen": "Markér som set", - "Open this screen": "Åbn denne skærm", - "Open Settings": "Åbn Indstillingerne", - "Posters Size": "Cover størrelse", - "This feature only works if you have your TraktTv account synced. Please go to Settings and enter your credentials.": "Denne funktion virker kun, hvis du har synkroniseret din Trakt.tv konto. Gå venligst til Indstillingerne og indtast dit Trakt.tv brugernavn og adgangskode.", - "Last Open": "Sidst åbnet", - "Exporting Database...": "Eksporterer database...", - "Database Successfully Exported": "Databasen er eksporteret med succes", - "Display": "Skærm", - "TV": "TV", - "Type": "Type", - "popularity": "Popularitet", - "date": "dato", - "year": "Årstal", - "rating": "Bedømmelse", - "updated": "Opdateret", - "name": "Navn", - "OVA": "OVA", - "ONA": "ONA", - "No anime found...": "Ingen anime fundet...", - "Movie": "Film", - "Special": "Speciel", - "No Watchlist found...": "Ingen sét-liste fundet", - "Watchlist": "Sét-liste", - "Resolving..": "Afklarer...", - "About": "Om", - "Open Cache Directory": "Åbn Cache Mappe", - "Open Database Directory": "Åbn Database Mappe", - "Mark as unseen": "Markér som ikke set", - "Playback rate": "Afspilningshastighed", - "Increase playback rate by %s": "Forøg afspilningshastigheden med %s", - "Decrease playback rate by %s": "Formindsk afspilningshastigheden med %s", - "Set playback rate to %s": "Sæt afspilningshastigheden til %s", - "Playback rate adjustment is not available for this video!": "Det er ikke muligt at ændre afspilningshastighed på denne video!", - "Color": "Farve", - "With Shadows": "Med skygger", - "Local IP Address": "Lokal IP-adresse", - "Japan": "Japan", - "Cars": "Biler", - "Dementia": "Demens", - "Demons": "Dæmoner", - "Ecchi": "Ecchi", - "Game": "Spil", - "Harem": "Harem", - "Historical": "Historisk", - "Josei": "Josei", - "Kids": "For børn", - "Magic": "Magi", - "Martial Arts": "Kampsport", - "Mecha": "Mecha", - "Military": "Militær", - "Parody": "Parodi", - "Police": "Politi", - "Psychological": "Psykisk", - "Samurai": "Samurai", - "School": "Skole", - "Seinen": "Seinen", - "Shoujo": "Shoujo", - "Shoujo Ai": "Shoujo Ai", - "Shounen": "Shounen", - "Shounen Ai": "Shounen Ai", - "Slice Of Life": "Slice of life", - "Slice of Life": "Slice of life", - "Space": "Rummet", - "Sports": "Sport", - "Super Power": "Superkraft", - "Supernatural": "Overnaturlig", - "Vampire": "Vampyr", - "Alphabet": "Alfabet", - "Automatically Sync on Start": "Synkroniser automatisk ved opstart", - "Setup VPN": "Opsæt VPN", - "VPN": "VPN", - "Install VPN Client": "Installér VPN klient", - "More Details": "Flere detaljer", - "Don't show me this VPN option anymore": "Vis ikke denne VPN indstilling mere", - "Activate automatic updating": "Aktivér automatisk opdatering", - "We are installing VPN client": "Vi installerer VPN klient", - "VPN Client Installed": "VPN klient installeret", - "Please wait...": "Vent venligst...", - "VPN.ht client is installed": "VPN.ht klient er installeret", - "Install again": "Installér igen", - "Connect": "Forbind", - "Create Account": "Opret bruger", - "Please, allow ~ 1 minute": "Vent venligts, der kan gå op til 1 minut", - "Status: Connecting to VPN...": "Status: Forbinder til VPN", - "Status: Monitoring connexion - ": "Status: Overvåger forbindelse -", - "Connect VPN": "Forbind VPN", - "Disconnect VPN": "Afbryd VPN", - "Celebrate various events": "Fejr forskellige arrangementer", - "ATTENTION! We need admin access to run this command.": "OPMÆRKSOM! Vi skal bruge administratorrettigheder for at køre denne kommando.", - "Your password is not saved": "Din adgangskode er ikke gemt", - "Enter sudo password :": "Indtast sudo adgangskode :", - "Status: Monitoring connection": "Status: Overvåger forbindelse", - "Status: Connected": "Status: Forbundet", - "Secure connection": "Sikker forbindelse", - "Your IP:": "Din IP:", - "Disconnect": "Afbryd", - "Downloaded": "Downloadet", - "Loading stuck ? Click here !": "Sidder fast? Tryk her!", - "Torrent Collection": "Torrentsamling", - "Drop Magnet or .torrent": "Slip magnet eller .torrent her", - "Remove this torrent": "Fjern denne torrent", - "Rename this torrent": "Omdøb torrent", - "Flush entire collection": "Tøm hele samlingen", - "Open Collection Directory": "Åbn samlingsmappe", - "Store this torrent": "Del denne torrent", - "Enter new name": "Indtast nyt navn", - "This name is already taken": "Dette navn er allerede i brug", - "Always start playing in fullscreen": "Start altid i fuldskærm", - "Allow torrents to be stored for further use": "Tillad torrent at blive gemt for senere brug", - "Hide VPN from the filter bar": "Skjul VPN fra filterbjælke", - "Magnet link": "Magnet link", - "Error resolving torrent.": "Fejl i at åbne torrent.", - "%s hour(s) remaining": "%s time(r) tilbage", - "%s minute(s) remaining": "%s minut(ter) tilbage", - "%s second(s) remaining": "%s sekund(er) tilbage", - "Unknown time remaining": "Ukendt resterende tid", - "Set player window to video resolution": "Indstil afspillerens vindue til videoens opløsning", - "Set player window to double of video resolution": "Indstil afspillerens vindue til det dobbelte af videoens opløsning", - "Set player window to half of video resolution": "Indstil afspillerens vindue til det halve af videoens opløsning", - "Retry": "Prøv igen", - "Import a Torrent": "Importér en Torrent", - "The remote movies API failed to respond, please check %s and try again later": "Det eksterne film API svarede ikke, kontrollér venligst %s og prøv igen senere", - "The remote shows API failed to respond, please check %s and try again later": "Det eksterne TV-serie API svarede ikke, kontrollér venligst %s og prøv igen senere", - "The remote anime API failed to respond, please check %s and try again later": "Det eksterne anime API svarede ikke, kontrollér venligst %s og prøv igen senere", - "Not Seen": "Ikke set", - "Seen": "Set", - "Title": "Titel", - "The video playback encountered an issue. Please try an external player like %s to view this content.": "Fejl ved afspilning af video. Prøv venligst en ekstern afspiller såsom %s for at se dette indhold.", - "Font": "Skrifttype", - "Decoration": "Dekoration", - "None": "Ingen", - "Outline": "Omrids", - "Opaque Background": "Uigennemsigtig baggrund", - "No thank you": "Nej tak", - "Report an issue": "Rapportér et problem", - "Log in into your GitLab account": "Log ind på din GitLab-konto", - "Email": "E-mail", - "Log in": "Log ind", - "Report anonymously": "Rapportér anonymt", - "Note regarding anonymous reports:": "Bemærkning om anonyme rapporter:", - "You will not be able to edit or delete your report once sent.": "Du vil ikke være i stand til at redigere eller slette din rapport når den er blevet sendt.", - "If any additionnal information is required, the report might be closed, as you won't be able to provide them.": "Hvis rapporten kræver yderligere oplysninger, kan det være at den bliver lukket, da du ikke vil være i stand til at give oplysningerne.", - "Step 1: Please look if the issue was already reported": "Trin 1: Se venligst om problemet allerede er blevet rapporteret", - "Enter keywords": "Indtast nøgleord", - "Already reported": "Allerede rapporteret", - "I want to report a new issue": "Jeg vil gerne rapportere et nyt problem", - "Step 2: Report a new issue": "Trin 2: Rapportér et nyt problem", - "Note: please don't use this form to contact us. It is limited to bug reports only.": "Bemærk: brug venligst ikke denne formular til at kontakte os. Den er kun til at rapportere fejl med.", - "The title of the issue": "Titlen på problemet", - "Description": "Beskrivelse", - "200 characters minimum": "Mindst 200 tegn", - "A short description of the issue. If suitable, include the steps required to reproduce the bug.": "En kort beskrivelse af problemet. Skriv eventuelt de trin som skal udføres for at genskabe fejlen.", - "Submit": "Send", - "Step 3: Thank you !": "Trin 3: Tak !", - "Your issue has been reported.": "Dit problem er blevet rapporteret.", - "Open in your browser": "Åbn i din browser", - "No issues found...": "Der blev ikke fundet nogen problemer...", - "First method": "Første metode", - "Use the in-app reporter": "Brug den indbyggede funktion til at rapportere", - "You can find it later on the About page": "Du kan finde det på et senere tidspunkt på Om-siden", - "Second method": "Anden metode", - "You can create an account on our %s repository, and click on %s.": "Du kan oprette en konto på vores %s repository, eller ved at klikke på %s.", - "Use the %s issue filter to search and check if the issue has already been reported or is already fixed.": "Brug %s filter til at søge efter problemer og for at se om problemet allerede er blevet rapporteret eller allerede er blevet rettet.", - "Include a screenshot if relevant - Is your issue about a design feature or a bug?": "Medsend et skærmbillede hvis det er relevant - Omhandler dit problem en design funktion eller en fejl?", - "A good bug report shouldn't leave others needing to chase you up for more information. Be sure to include the details of your environment.": "Ved en god fejlrapport bør det ikke være nødvendigt at lede efter dig for at få flere oplysninger. Sørg for at inkludere detaljer om dit system.", - "Warning: Always use English when contacting us, or we might not understand you.": "Advarsel: Skriv altid på engelsk når du kontakter os, da vi ellers muligvis ikke vil kunne forstå dig.", - "Search on %s": "Søg på %s", - "No results found": "Ingen resultater fundet", - "Invalid credentials": "Ugyldige loginoplysninger", - "Open Favorites": "Åbn favoritter", - "Open About": "Åbn 'Om'", - "Minimize to Tray": "Minimér til proceslinje", - "Close": "Luk", - "Restore": "Gendan", - "Resume Playback": "Fortsæt afspilning", - "Features": "Funktioner", - "Connect To %s": "Opret forbindelse til %s", - "The magnet link was copied to the clipboard": "Magnet-linket blev kopieret til udklipsholderen", - "Big Picture Mode": "'Big Picture' Tilstand", - "Big Picture Mode is unavailable on your current screen resolution": "'Big Picture' Tilstand er ikke tilgængelig med din nuværende skærmopløsning", - "Cannot be stored": "Kan ikke gemmes", - "%s reported this torrent as fake": "%s rapporterede denne torrent som værende uægte", - "%s could not verify this torrent": "%s kunne ikke verificere denne torrent", - "Randomize": "Bland", - "Randomize Button for Movies": "Blande-knap til Film", - "Overall Ratio": "Samlet forhold", - "Translate Synopsis": "Oversæt synopsis", - "Returning Series": "Tilbagevendende serie", - "In Production": "I produktion", - "Canceled": "Aflyst", - "N/A": "Utilgængelig", - "%s is not supposed to be run as administrator": "%s er ikke tiltænkt at skulle køres som administrator", - "Your disk is almost full.": "Din harddisk er næsten fuld.", - "You need to make more space available on your disk by deleting files.": "Du bliver nødt til at skaffe mere plads på din harddisk ved at slette filer.", - "Playing Next": "Afspiller næste", - "Trending": "Trending" + "External Player": "Ekstern afspiller", + "Made with": "Lavet med", + "by a bunch of geeks from All Around The World": "af en flok nørder fra hele verden", + "Initializing PopcornTime. Please Wait...": "Vent venligst, mens Popcorn Time starter...", + "Status: Checking Database...": "Status: Tjekker database...", + "Movies": "Film", + "TV Series": "TV-serier", + "Anime": "Anime", + "Genre": "Genre", + "All": "Alle", + "Action": "Action", + "Adventure": "Eventyr", + "Animation": "Animation", + "Children": "For børn", + "Comedy": "Komedie", + "Crime": "Krimi", + "Documentary": "Dokumentar", + "Drama": "Drama", + "Family": "Familie", + "Fantasy": "Fantasy", + "Game Show": "Gameshow", + "Home And Garden": "Hus og have", + "Horror": "Gyser", + "Mini Series": "Miniserier", + "Mystery": "Mystik", + "News": "Nyheder", + "Reality": "Realityshow", + "Romance": "Romantik", + "Science Fiction": "Science fiction", + "Soap": "Sæbeopera", + "Special Interest": "Speciel Interesse", + "Sport": "Sport", + "Suspense": "Spænding", + "Talk Show": "Talkshow", + "Thriller": "Thriller", + "Western": "Western", + "Sort by": "Sortér efter", + "Popularity": "Popularitet", + "Updated": "Opdateret", + "Year": "År", + "Name": "Navn", + "Search": "Søg", + "Season": "Sæson", + "Seasons": "Sæsoner", + "Season %s": "Sæson %s", + "Load More": "Indlæs flere", + "Saved": "Gemt", + "Settings": "Indstillinger", + "Show advanced settings": "Vis avancerede indstillinger", + "User Interface": "Brugergrænseflade", + "Default Language": "Standardsprog", + "Theme": "Tema", + "Start Screen": "Startskærm", + "Favorites": "Favoritter", + "Show rating over covers": "Vis bedømmelse på cover", + "Always On Top": "Altid øverst", + "Watched Items": "Sete film/TV-serier", + "Show": "Vis", + "Fade": "Udton", + "Hide": "Skjul", + "Subtitles": "Undertekster", + "Default Subtitle": "Standardundertekster", + "Disabled": "Deaktiveret", + "Size": "Størrelse", + "Quality": "Kvalitet", + "Only list movies in": "Vis kun film i", + "Show movie quality on list": "Vis filmkvalitet på listen", + "Trakt.tv": "Trakt.tv", + "Enter your Trakt.tv details here to automatically 'scrobble' episodes you watch in Popcorn Time": "Indtast dine Trakt.tv oplysninger her, for automatisk at 'scrobble' de episoder du ser i Popcorn Time", + "Connect to %s to automatically 'scrobble' episodes you watch in %s": "Forbind til %s for automatisk at 'scrobble' episoder du ser i %s", + "Username": "Brugernavn", + "Password": "Adgangskode", + "Popcorn Time stores an encrypted hash of your password in your local database": "Popcorn Time gemmer en krypteret nøgle-værdi af din adgangskode i din lokale database", + "Remote Control": "Fjernbetjening", + "HTTP API Port": "HTTP API port", + "HTTP API Username": "HTTP API brugernavn", + "HTTP API Password": "HTTP API adgangskode", + "Connection": "Forbindelse", + "TV Show API Endpoint": "Endepunkt for TV-serie API", + "Movies API Endpoint": "Endepunkt for Film API", + "Connection Limit": "Max. antal forbindelser", + "DHT Limit": "DHT grænse", + "Port to stream on": "Port som streames fra", + "0 = Random": "0 = Tilfældig", + "Cache Directory": "Cache mappe", + "Clear Tmp Folder after closing app?": "Ryd den midlertidige mappe når programmet lukkes?", + "Database": "Database", + "Database Directory": "Database mappe", + "Import Database": "Importér database", + "Export Database": "Eksportér database", + "Flush bookmarks database": "Tøm favorit databasen", + "Flush subtitles cache": "Tøm undertekst cache", + "Flush all databases": "Tøm alle databaser", + "Reset to Default Settings": "Nulstil til standardindstillinger", + "Importing Database...": "Importerer database...", + "Please wait": "Vent venligst", + "Error": "Fejl", + "Biography": "Biografi", + "Film-Noir": "Film-Noir", + "History": "Historie", + "Music": "Musik", + "Musical": "Musical", + "Sci-Fi": "Sci-fi", + "Short": "Kortfilm", + "War": "Krig", + "Last Added": "Sidst tilføjet", + "Rating": "Bedømmelse", + "Open IMDb page": "Åbn IMDb-side", + "Health false": "Falskt helbred", + "Add to bookmarks": "Tilføj til favoritter", + "Watch Trailer": "Se Trailer", + "Watch Now": "Afspil Nu", + "Health Good": "Godt helbred", + "Ratio:": "Forhold:", + "Seeds:": "Seeds:", + "Peers:": "Peers:", + "Remove from bookmarks": "Fjern fra favoritter", + "Changelog": "Ændringslog", + "Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.": "Popcorn Time! er resultatet af mange udviklere og designere, som har sammensat nogle API'er for at gøre oplevelsen af at se torrent-film så enkelt som muligt.", + "We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.": "Vi er et open source projekt. Vi er fra hele verden. Vi elsker film. Og manner, hvor vi dog elsker popcorn.", + "Invalid PCT Database File Selected": "Ugyldig PCT-database-fil valgt", + "Health Unknown": "Ukendt helbred", + "Episodes": "Episoder", + "Episode %s": "Episode %s", + "Aired Date": "Først vist", + "Streaming to": "Streamer til", + "connecting": "Forbinder", + "Download": "Download", + "Upload": "Upload", + "Active Peers": "Aktive peers", + "Cancel": "Annullér", + "startingDownload": "Begynder download", + "downloading": "Downloader", + "ready": "Klar", + "playingExternally": "Afspiller eksternt", + "Custom...": "Brugerdefineret...", + "Volume": "Lydstyrke", + "Ended": "Afsluttet", + "Error loading data, try again later...": "Fejl ved indlæsning af data, prøv igen senere...", + "Miscellaneous": "Diverse", + "When opening TV Show Detail Jump to:": "Når du åbner TV-serie detaljer, gå til:", + "First Unwatched Episode": "Første ikke-sete episode", + "Next Episode In Series": "Næste episode i serie", + "When Opening TV Show Detail Jump To": "Når du åbner TV-serie detaljer, gå til", + "Flushing...": "Tømmer...", + "Are you sure?": "Er du sikker?", + "We are flushing your databases": "Vi tømmer dine databaser", + "Success": "Succes", + "Please restart your application": "Genstart venligst programmet", + "Restart": "Genstart", + "Terms of Service": "Vilkår for tjeneste", + "I Accept": "Jeg accepterer", + "Leave": "Forlad", + "When Opening TV Series Detail Jump To": "Når du åbner TV-serie detaljer, gå til", + "Health Medium": "Medium helbred", + "Playback": "Afspilning", + "Play next episode automatically": "Afspil næste episode automatisk", + "Generate Pairing QR code": "Opret QR-kode til parring", + "Playing Next Episode in": "Afspiller næste episode om", + "Play": "Afspil", + "Dismiss": "Afvis", + "waitingForSubtitles": "Venter på undertekster", + "Play Now": "Afspil Nu", + "Seconds": "Sekunder", + "You are currently authenticated to Trakt.tv as": "Du er forbundet til Trakt.tv som", + "You are currently connected to %s": "Du er i øjeblikket forbundet til %s", + "Disconnect account": "Afbryd konto", + "Sync With Trakt": "Synkronisér med Trakt", + "Syncing...": "Synkroniserer...", + "Done": "Færdig", + "Subtitles Offset": "Undertekst forskydning", + "secs": "sek.", + "We are flushing your database": "Vi tømmer din database", + "We are rebuilding the TV Show Database. Do not close the application.": "Vi genopbygger TV-serie databasen. Luk ikke programmet.", + "No shows found...": "Ingen TV-serier fundet...", + "No Favorites found...": "Ingen favoritter fundet...", + "Rebuild TV Shows Database": "Genopbyg TV-serie databasen", + "No movies found...": "Ingen film fundet...", + "Ratio": "Forhold", + "Health Excellent": "Fremragende helbred", + "Health Bad": "Dårligt helbred", + "Status: Creating Database...": "Status: Opretter database...", + "Status: Updating database...": "Status: Opdaterer database...", + "Status: Skipping synchronization TTL not met": "Status: Springer synkronisering over, TTL er ikke opfyldt", + "Advanced Settings": "Avancerede indstillinger", + "Clear Cache directory after closing app?": "Ryd cache mappe efter afslutning af programmet?", + "Tmp Folder": "Midlertidig mappe", + "Status: Downloading API archive...": "Status: Downloader API-arkiv...", + "Status: Archive downloaded successfully...": "Status: Arkiv downloadet med succes...", + "Status: Importing file": "Status: Importerer fil", + "Status: Imported successfully": "Status: Importeret med succes", + "Status: Launching applicaion... ": "Status: Åbner programmet...", + "URL of this stream was copied to the clipboard": "Genvejen til dette stream er kopieret til udklipsholderen", + "Error, database is probably corrupted. Try flushing the bookmarks in settings.": "Fejl, databasen er sandsynligvis beskadiget. Prøv at tømme favoritterne under indstillinger.", + "Flushing bookmarks...": "Tømmer favoritter...", + "Resetting...": "Nulstiller...", + "We are resetting the settings": "Nulstiller indstillinger", + "New version downloaded": "Ny version downloadet", + "Installed": "Installeret", + "Install Now": "Installér nu", + "Restart Now": "Genstart nu", + "We are flushing your subtitle cache": "Sletter undertekst cache", + "Subtitle cache deleted": "Undertekst cache slettet", + "Please select a file to play": "Vælg venligst en fil som skal afspilles", + "Test Login": "Test login", + "Testing...": "Tester...", + "Success!": "Succes!", + "Failed!": "Mislykkedes!", + "Global shortcuts": "Globale genveje", + "Video Player": "Videoafspiller", + "Toggle Fullscreen": "Aktivér fuld skærm", + "Play/Pause": "Afspil/Pause", + "Seek Forward": "Spol fremad", + "Increase Volume": "Skru op for lydstyrken", + "Set Volume to": "Sæt lydstyrken til", + "Offset Subtitles by": "Forskyd undertekster med", + "Toggle Mute": "Aktiver/deaktiver lyd", + "Movie Detail": "Filmdetaljer", + "Toggle Quality": "Skift kvalitet", + "Play Movie": "Afspil film", + "Exit Fullscreen": "Afslut fuld skærm", + "Seek Backward": "Spol tilbage", + "Decrease Volume": "Skru ned for lydstyrken", + "Show Stream URL": "Vis stream URL", + "TV Show Detail": "TV-serie detaljer", + "Toggle Watched": "Markér som set/ikke-set", + "Select Next Episode": "Vælg næste episode", + "Select Previous Episode": "Vælg forrige episode", + "Select Next Season": "Vælg næste sæson", + "Select Previous Season": "Vælg forrige sæson", + "Play Episode": "Afspil episode", + "space": "mellemrum", + "shift": "skift", + "ctrl": "ctrl", + "enter": "enter", + "esc": "esc", + "Keyboard Shortcuts": "Tastaturgenveje", + "Cut": "Klip", + "Copy": "Kopier", + "Paste": "Sæt ind", + "Help Section": "Hjælpesektion", + "Did you know?": "Vidste du?", + "What does Popcorn Time offer?": "Hvad kan Popcorn Time tilbyde?", + "With Popcorn Time, you can watch Movies and TV Series really easily. All you have to do is click on one of the covers, then click 'Watch Now'. But your experience is highly customizable:": "Med Popcorn Time kan du se Film og TV-serier uden besvær. Det eneste du skal gøre er at klikke på et af coverne og derefter klikke på 'Afspil'. Din oplevelse kan tilpasses på mange måder:", + "Our Movies collection only contains High-Definition movies, available in 720p and 1080p. To watch a movie, simply open Popcorn Time and navigate through the movies collection, reachable through the 'Movies' tab, in the navigation bar. The default view will show you all movies sorted by popularity, but you can apply your own filters, thanks to the 'Genre' and 'Sort by' filters. Once you have chosen a movie you want to watch, click its cover. Then click 'Watch Now'. Don't forget the popcorn!": "Vores film-samling består udelukkende af HD-film, som er tilgængelige i 720p og 1080p. For at se en film, skal du bare åbne Popcorn Time og navigere rundt i film-samlingen, som er tilgængelig via fanen 'Film'. Som standard vil film være sorteret efter popularitet, men du kan selv vælge at sortere efter andre parametre takket være filtrene 'Genre' og 'Sorter efter'. Når du har valgt hvilken film du vil se, klikker du på coveret til filmen. Nu skal du blot klikke 'Afspil Nu'. Glem ikke popcorn!", + "The TV Series tab, that you can reach by clicking 'TV Series' in the navigation bar, will show you all available series in our collection. You can also apply your own filters, same as the Movies, to help you decide what to watch. In this collection, also just click the cover: the new window that will appear will allow you to navigate through Seasons and Episodes. Once your mind is set, just click the 'Watch Now' button.": "TV-serie fanen, som du finder ved at klikke på 'TV-serier' i navigationsmenuen, viser dig alle tilgængelige serier i vores samling. Du kan også her, ligesom i film-samlingen, vælge dine egne filtre, for at finde hvad du ønsker. I denne samling skal du ligeledes klikke på coveret: I det nye vindue kan du bladre gennem sæsoner og episoder. Når du har fundet det ønskede afsnit trykker du blot på 'Afspil Nu'.", + "Choose quality": "Vælg kvalitet", + "A slider next to the 'Watch Now' button will let you choose the quality of the stream. You can also set a fixed quality in the Settings tab. Warning: a better quality equals more data to download.": "En skydeknap ved siden af 'Afspil'-knappen lader dig vælge afspilningskvaliteten. Du kan også sætte en standardkvalitet i Indstillingerne. Advarsel: Jo højere kvalitet du vælger des mere data skal downloades.", + "Most of our Movies and TV Series have subtitles in your language. You can set them in the Settings tab. For the Movies, you can even set them through the dropdown menu, in the Movie Details page.": "De fleste af vore film og TV-serier har undertekster på dit sprog. Du kan vælge danske undertekster som standard i Indstillingerne. For films vedkommende kan undertekst-sproget endda vælges i en rullemenu på filmdetalje-siden.", + "Clicking the heart icon on a cover will add the movie/show to your favorites. This collection is reachable through the heart-shaped icon, in the navigation bar. To remove an item from your collection, just click on the icon again! How simple is that?": "Ved at klikke på hjerte-ikonet på et cover kan du tilføje filmen/TV-serien til dine favoritter. Dine tilføjede favoritter finder du ved at klikke på hjertet i navigationsmenuen. For at fjerne noget fra dine favoritter klikker du blot på coverets hjerte-ikon igen. Hvor simpelt er det ikke lige?", + "Watched icon": "Set-ikon", + "Popcorn Time will keep in mind what you've already watched - a little help remembering doesn't cause any harm. You can also set an item as watched by clicking the eye-shaped icon on the covers. You can even build and synchronize your collection with Trakt.tv website, via the Settings tab.": "Popcorn Time hjælper med at holde styr på, hvad du allerede har set - en smule huskehjælp skader ikke. Du kan også markere noget som set ved at klikke på coverets øje-ikon. Du kan endda skabe og synkronisere din historik med Trakt.tv i Indstillingerne.", + "In Popcorn Time, you can use the magnifier icon to open the search. Type a Title, an Actor, a Director or even a Year, press 'Enter' and let us show you what we can offer to fill your needs. To close your current search, you can click on the 'X' located next to your entry or type something else in the field.": "I Popcorn Time kan du klikke på forstørrelsesglasset i navigationsmenuen for at søge. Indtast en titel, en skuespiller, en instruktør eller et årstal, tryk på 'Enter' og lad os vise dig hvad vi kan tilbyde, for at tilfredsstille dit behov. For at slette din søgning kan du trykke på 'X' til højre for din indtastning eller du kan skrive noget nyt i feltet.", + "External Players": "Eksterne afspillere", + "If you prefer to use a custom player instead of the built in one, you can do so by clicking the allocated icon on the 'Watch Now' button. A list of your installed players will be shown, select one and Popcorn Time will send everything to it. If your player isn't on the list, please report it to us.": "Hvis du foretrækker at bruge en anden afspiller end den indbyggede, kan du dette ved at klikke på det lille ikon i forlængelse af 'Afspil'-knappen. En rullemenu med dine installerede afspillere vil blive vist, vælg én og Popcorn Time vil åbne og afspille i denne i stedet. Hvis din afspiller ikke er på listen, vil vi venligst bede dig gøre os opmærksomme på det.", + "To push the customization even further, we offer you a large panel of options. To access the Settings, click the wheel-shaped icon in the navigation bar.": "For yderligere tilpasning tilbyder vi dig en lang række muligheder. For at tilgå Indstillingerne skal du klikke på tandhjul-ikonet i navigationsmenuen.", + "Keyboard Navigation": "Find vej med tastaturet", + "The entire list of keyboard shortcuts is available by pressing '?' on your keyboard, or through the keyboard-shaped icon in the Settings tab.": "Listen med alle tastaturgenvejene finder du ved at trykke '?' på dit tastatur eller ved at klikke på tastatur-ikonet i Indstillingerne.", + "Custom Torrents and Magnet Links": "Brugerdefinerede Torrents og Magnet Links", + "You can use custom torrents and magnets links in Popcorn Time. Simply drag and drop .torrent files into the application's window, and/or paste any magnet link.": "Du kan bruge brugerdefinerede torrents og magnet links i Popcorn Time. Du skal blot trække .torrent filerne ind i programmets vindue og/eller indsætte et hvilket som helst magnet link.", + "Torrent health": "Torrent helbred", + "On the details of Movies/TV Series, you can find a little circle, colored in grey, red, yellow or green. Those colors refer to the health of the torrent. A green torrent will be downloaded quickly, while a red torrent may not be downloaded at all, or very slowly. The color grey represents an error in the health calculation for Movies, and needs to be clicked in TV Series in order to display the health.": "På detaljesiden for en film/TV-serie ses en lille cirkel, som enten er grå, rød, gul eller grøn. Disse farver fortæller helbredet for den valgte torrent. Er den grøn downloades den hurtigt, men er den rød downloades den meget langsomt eller slet ikke. Den grå cirkel fortæller, at der er en fejl i udregningen af helbreddet for en film, hvorimod for en TV-serie fortæller den, at du skal klikke på cirklen, for at få vist helbreddet.", + "How does Popcorn Time work?": "Hvordan virker Popcorn Time?", + "Popcorn Time streams video content through torrents. Our movies are provided by %s and our TV Series by %s, while getting all metadata from %s. We don't host any content ourselves.": "Popcorn Time streamer videoer via torrenter. Vores film leveres af %s og vores TV-serier af %s, mens alle metadata hentes fra %s. Vi er ikke selv vært for noget indhold.", + "Torrent streaming? Well, torrents use Bittorrent protocol, which basically means that you download small parts of the content from another user's computer, while sending the parts you already downloaded to another user. Then, you watch those parts, while the next ones are being downloaded in the background. This exchange allows the content to stay healthy.": "Torrent streaming? Altså, torrents bruger Bittorrent-protokollen, som i bund og grund betyder, at du downloader små dele af indholdet fra andre brugeres computere imens du uploader de dele, du allerede har downloadet til andre brugere. Du afspiller herefter disse downloadede dele imens de næste downloades i baggrunden. Denne udveksling tillader, at indholdet forbliver brugbart.", + "Once the movie is fully downloaded, you continue to send parts to the other users. And everything is deleted from your computer when you close Popcorn Time. As simple as that.": "Når filmen er downloadet færdig fortsætter du med at uploade dele til andre brugere. Alt slettes fra din computer når du afslutter Popcorn Time. Så simpelt er det.", + "The application itself is built with Node-Webkit, HTML, CSS and Javascript. It works like the Google Chrome browser, except that you host the biggest part of the code on your computer. Yes, Popcorn Time works on the same technology as a regular website, like... let's say Wikipedia, or Youtube!": "Selve programmet er bygget med Node-Webkit, HTML, CSS og Javascript. Det fungerer ligesom Google Chrome browseren udover, at du er vært for den største del af koden på din computer. Ja, du læste rigtigt, Popcorn Time kører med den samme teknologi som en normal hjemmeside, som f.eks. Wikipedia eller YouTube!", + "I found a bug, how do I report it?": "Jeg har fundet en fejl, hvordan rapporterer jeg det?", + "No historics found...": "Ingen historik fundet...", + "Error, database is probably corrupted. Try flushing the history in settings.": "Fejl, databasen er formodentlig beskadiget. Prøv at tømme historikken i Indstillingerne.", + "You can paste magnet links anywhere in Popcorn Time with CTRL+V.": "Du kan indsætte magnet-links overalt i Popcorn Time med CTRL+V.", + "You can drag & drop a .torrent file into Popcorn Time.": "Du kan trække en .torrent fil ind i Popcorn Time.", + "The Popcorn Time project started in February 2014 and has already had 150 people that contributed more than 3000 times to it's development in August 2014.": "Popcorn Time projektet startede i Februar 2014 og allerede i August 2014 har flere end 150 mennesker tilsammen bidraget til udviklingen mere end 3000 gange.", + "The rule n°10 applies here.": "Regel nummer 10 gælder her.", + "If a subtitle for a TV series is missing, you can add it on %s. And the same way for a movie, but on %s.": "Hvis en undertekst mangler for en TV-serie, kan du tilføje en på %s. Det samme for Film, men på %s.", + "If you're experiencing connection drop issues, try to reduce the DHT Limit in settings.": "Hvis du oplever udsving i forbindelsen, kan du prøve at reducere 'DHT grænse' under Indstillinger.", + "If you search \"1998\", you can see all the movies or TV series that came out that year.": "Søg efter \"1998\" for at se alle de film eller TV-serier der udkom dét år.", + "You can login to Trakt.tv to save all your watched items, and synchronize them across multiple devices.": "Du kan logge ind på Trakt.tv for at gemme din historik og synkronisere dem på tværs af flere enheder.", + "Clicking on the rating stars will display a number instead.": "Klikker du på bedømmelses stjernerne vises et tal i stedet.", + "This application is entirely written in HTML5, CSS3 and Javascript.": "Dette program er udelukkende programmeret i HTML5, CSS3 og Javascript.", + "You can find out more about a movie or a TV series? Just click the IMDb icon.": "Vil du vide mere om en film eller en TV-serie? Klik blot på IMDb-ikonet.", + "Clicking twice on a \"Sort By\" filter reverses the order of the list.": "Tryk to gange på et 'Sorter efter' og det vil vende om på listens rækkefølge.", + "Switch to next tab": "Skift til næste fane", + "Switch to previous tab": "Skift til forrige fane", + "Switch to corresponding tab": "Skift til tilsvarende fane", + "through": "gennem", + "Enlarge Covers": "Forstørrer covere", + "Reduce Covers": "Formindsker covere", + "Open the Help Section": "Åbn hjælpesektionen", + "Open Item Details": "Åbn detaljer", + "Add Item to Favorites": "Tilføj til favoritter", + "Mark as Seen": "Markér som set", + "Open this screen": "Åbn denne skærm", + "Open Settings": "Åbn Indstillingerne", + "Posters Size": "Cover størrelse", + "This feature only works if you have your TraktTv account synced. Please go to Settings and enter your credentials.": "Denne funktion virker kun, hvis du har synkroniseret din Trakt.tv konto. Gå venligst til Indstillingerne og indtast dit Trakt.tv brugernavn og adgangskode.", + "Last Open": "Sidst åbnet", + "Exporting Database...": "Eksporterer database...", + "Database Successfully Exported": "Databasen er eksporteret med succes", + "Display": "Skærm", + "TV": "TV", + "Type": "Type", + "popularity": "Popularitet", + "date": "dato", + "year": "Årstal", + "rating": "Bedømmelse", + "updated": "Opdateret", + "name": "Navn", + "OVA": "OVA", + "ONA": "ONA", + "No anime found...": "Ingen anime fundet...", + "Movie": "Film", + "Special": "Speciel", + "No Watchlist found...": "Ingen sét-liste fundet", + "Watchlist": "Sét-liste", + "Resolving..": "Afklarer...", + "About": "Om", + "Open Cache Directory": "Åbn Cache Mappe", + "Open Database Directory": "Åbn Database Mappe", + "Mark as unseen": "Markér som ikke set", + "Playback rate": "Afspilningshastighed", + "Increase playback rate by %s": "Forøg afspilningshastigheden med %s", + "Decrease playback rate by %s": "Formindsk afspilningshastigheden med %s", + "Set playback rate to %s": "Sæt afspilningshastigheden til %s", + "Playback rate adjustment is not available for this video!": "Det er ikke muligt at ændre afspilningshastighed på denne video!", + "Color": "Farve", + "With Shadows": "Med skygger", + "Local IP Address": "Lokal IP-adresse", + "Japan": "Japan", + "Cars": "Biler", + "Dementia": "Demens", + "Demons": "Dæmoner", + "Ecchi": "Ecchi", + "Game": "Spil", + "Harem": "Harem", + "Historical": "Historisk", + "Josei": "Josei", + "Kids": "For børn", + "Magic": "Magi", + "Martial Arts": "Kampsport", + "Mecha": "Mecha", + "Military": "Militær", + "Parody": "Parodi", + "Police": "Politi", + "Psychological": "Psykisk", + "Samurai": "Samurai", + "School": "Skole", + "Seinen": "Seinen", + "Shoujo": "Shoujo", + "Shoujo Ai": "Shoujo Ai", + "Shounen": "Shounen", + "Shounen Ai": "Shounen Ai", + "Slice Of Life": "Slice of life", + "Slice of Life": "Slice of life", + "Space": "Rummet", + "Sports": "Sport", + "Super Power": "Superkraft", + "Supernatural": "Overnaturlig", + "Vampire": "Vampyr", + "Alphabet": "Alfabet", + "Automatically Sync on Start": "Synkroniser automatisk ved opstart", + "Setup VPN": "Opsæt VPN", + "VPN": "VPN", + "Install VPN Client": "Installér VPN klient", + "More Details": "Flere detaljer", + "Don't show me this VPN option anymore": "Vis ikke denne VPN indstilling mere", + "Activate automatic updating": "Aktivér automatisk opdatering", + "We are installing VPN client": "Vi installerer VPN klient", + "VPN Client Installed": "VPN klient installeret", + "Please wait...": "Vent venligst...", + "VPN.ht client is installed": "VPN.ht klient er installeret", + "Install again": "Installér igen", + "Connect": "Forbind", + "Create Account": "Opret bruger", + "Please, allow ~ 1 minute": "Vent venligts, der kan gå op til 1 minut", + "Status: Connecting to VPN...": "Status: Forbinder til VPN", + "Status: Monitoring connexion - ": "Status: Overvåger forbindelse -", + "Connect VPN": "Forbind VPN", + "Disconnect VPN": "Afbryd VPN", + "Celebrate various events": "Fejr forskellige arrangementer", + "ATTENTION! We need admin access to run this command.": "OPMÆRKSOM! Vi skal bruge administratorrettigheder for at køre denne kommando.", + "Your password is not saved": "Din adgangskode er ikke gemt", + "Enter sudo password :": "Indtast sudo adgangskode :", + "Status: Monitoring connection": "Status: Overvåger forbindelse", + "Status: Connected": "Status: Forbundet", + "Secure connection": "Sikker forbindelse", + "Your IP:": "Din IP:", + "Disconnect": "Afbryd", + "Downloaded": "Downloadet", + "Loading stuck ? Click here !": "Sidder fast? Tryk her!", + "Torrent Collection": "Torrentsamling", + "Drop Magnet or .torrent": "Slip magnet eller .torrent her", + "Remove this torrent": "Fjern denne torrent", + "Rename this torrent": "Omdøb torrent", + "Flush entire collection": "Tøm hele samlingen", + "Open Collection Directory": "Åbn samlingsmappe", + "Store this torrent": "Del denne torrent", + "Enter new name": "Indtast nyt navn", + "This name is already taken": "Dette navn er allerede i brug", + "Always start playing in fullscreen": "Start altid i fuldskærm", + "Allow torrents to be stored for further use": "Tillad torrent at blive gemt for senere brug", + "Hide VPN from the filter bar": "Skjul VPN fra filterbjælke", + "Magnet link": "Magnet link", + "Error resolving torrent.": "Fejl i at åbne torrent.", + "%s hour(s) remaining": "%s time(r) tilbage", + "%s minute(s) remaining": "%s minut(ter) tilbage", + "%s second(s) remaining": "%s sekund(er) tilbage", + "Unknown time remaining": "Ukendt resterende tid", + "Set player window to video resolution": "Indstil afspillerens vindue til videoens opløsning", + "Set player window to double of video resolution": "Indstil afspillerens vindue til det dobbelte af videoens opløsning", + "Set player window to half of video resolution": "Indstil afspillerens vindue til det halve af videoens opløsning", + "Retry": "Prøv igen", + "Import a Torrent": "Importér en Torrent", + "The remote movies API failed to respond, please check %s and try again later": "Det eksterne film API svarede ikke, kontrollér venligst %s og prøv igen senere", + "The remote shows API failed to respond, please check %s and try again later": "Det eksterne TV-serie API svarede ikke, kontrollér venligst %s og prøv igen senere", + "The remote anime API failed to respond, please check %s and try again later": "Det eksterne anime API svarede ikke, kontrollér venligst %s og prøv igen senere", + "Not Seen": "Ikke set", + "Seen": "Set", + "Title": "Titel", + "The video playback encountered an issue. Please try an external player like %s to view this content.": "Fejl ved afspilning af video. Prøv venligst en ekstern afspiller såsom %s for at se dette indhold.", + "Font": "Skrifttype", + "Decoration": "Dekoration", + "None": "Ingen", + "Outline": "Omrids", + "Opaque Background": "Uigennemsigtig baggrund", + "No thank you": "Nej tak", + "Report an issue": "Rapportér et problem", + "Log in into your GitLab account": "Log ind på din GitLab-konto", + "Email": "E-mail", + "Log in": "Log ind", + "Report anonymously": "Rapportér anonymt", + "Note regarding anonymous reports:": "Bemærkning om anonyme rapporter:", + "You will not be able to edit or delete your report once sent.": "Du vil ikke være i stand til at redigere eller slette din rapport når den er blevet sendt.", + "If any additionnal information is required, the report might be closed, as you won't be able to provide them.": "Hvis rapporten kræver yderligere oplysninger, kan det være at den bliver lukket, da du ikke vil være i stand til at give oplysningerne.", + "Step 1: Please look if the issue was already reported": "Trin 1: Se venligst om problemet allerede er blevet rapporteret", + "Enter keywords": "Indtast nøgleord", + "Already reported": "Allerede rapporteret", + "I want to report a new issue": "Jeg vil gerne rapportere et nyt problem", + "Step 2: Report a new issue": "Trin 2: Rapportér et nyt problem", + "Note: please don't use this form to contact us. It is limited to bug reports only.": "Bemærk: brug venligst ikke denne formular til at kontakte os. Den er kun til at rapportere fejl med.", + "The title of the issue": "Titlen på problemet", + "Description": "Beskrivelse", + "200 characters minimum": "Mindst 200 tegn", + "A short description of the issue. If suitable, include the steps required to reproduce the bug.": "En kort beskrivelse af problemet. Skriv eventuelt de trin som skal udføres for at genskabe fejlen.", + "Submit": "Send", + "Step 3: Thank you !": "Trin 3: Tak !", + "Your issue has been reported.": "Dit problem er blevet rapporteret.", + "Open in your browser": "Åbn i din browser", + "No issues found...": "Der blev ikke fundet nogen problemer...", + "First method": "Første metode", + "Use the in-app reporter": "Brug den indbyggede funktion til at rapportere", + "You can find it later on the About page": "Du kan finde det på et senere tidspunkt på Om-siden", + "Second method": "Anden metode", + "You can create an account on our %s repository, and click on %s.": "Du kan oprette en konto på vores %s repository, eller ved at klikke på %s.", + "Use the %s issue filter to search and check if the issue has already been reported or is already fixed.": "Brug %s filter til at søge efter problemer og for at se om problemet allerede er blevet rapporteret eller allerede er blevet rettet.", + "Include a screenshot if relevant - Is your issue about a design feature or a bug?": "Medsend et skærmbillede hvis det er relevant - Omhandler dit problem en design funktion eller en fejl?", + "A good bug report shouldn't leave others needing to chase you up for more information. Be sure to include the details of your environment.": "Ved en god fejlrapport bør det ikke være nødvendigt at lede efter dig for at få flere oplysninger. Sørg for at inkludere detaljer om dit system.", + "Warning: Always use English when contacting us, or we might not understand you.": "Advarsel: Skriv altid på engelsk når du kontakter os, da vi ellers muligvis ikke vil kunne forstå dig.", + "Search on %s": "Søg på %s", + "No results found": "Ingen resultater fundet", + "Invalid credentials": "Ugyldige loginoplysninger", + "Open Favorites": "Åbn favoritter", + "Open About": "Åbn 'Om'", + "Minimize to Tray": "Minimér til proceslinje", + "Close": "Luk", + "Restore": "Gendan", + "Resume Playback": "Fortsæt afspilning", + "Features": "Funktioner", + "Connect To %s": "Opret forbindelse til %s", + "The magnet link was copied to the clipboard": "Magnet-linket blev kopieret til udklipsholderen", + "Big Picture Mode": "'Big Picture' Tilstand", + "Big Picture Mode is unavailable on your current screen resolution": "'Big Picture' Tilstand er ikke tilgængelig med din nuværende skærmopløsning", + "Cannot be stored": "Kan ikke gemmes", + "%s reported this torrent as fake": "%s rapporterede denne torrent som værende uægte", + "%s could not verify this torrent": "%s kunne ikke verificere denne torrent", + "Randomize": "Bland", + "Randomize Button for Movies": "Blande-knap til Film", + "Overall Ratio": "Samlet forhold", + "Translate Synopsis": "Oversæt synopsis", + "Returning Series": "Tilbagevendende serie", + "In Production": "I produktion", + "Canceled": "Aflyst", + "N/A": "Utilgængelig", + "%s is not supposed to be run as administrator": "%s er ikke tiltænkt at skulle køres som administrator", + "Your disk is almost full.": "Din harddisk er næsten fuld.", + "You need to make more space available on your disk by deleting files.": "Du bliver nødt til at skaffe mere plads på din harddisk ved at slette filer.", + "Playing Next": "Afspiller næste", + "Trending": "Trending", + "Downloads": "Downloads", + "Likes": "Likes", + "Movie Search": "Movie Search", + "This feature has a built-in kat.cr search, which allows you to stream any movies, series or anime torrents with automatic subtitle support. The casting option integrates features including Chromecast, Airplay and DLNA. This library also provides an Anti-Virus Scanner and a 'History' feature, that keeps track of all your downloaded KAT torrents": "This feature has a built-in kat.cr search, which allows you to stream any movies, series or anime torrents with automatic subtitle support. The casting option integrates features including Chromecast, Airplay and DLNA. This library also provides an Anti-Virus Scanner and a 'History' feature, that keeps track of all your downloaded KAT torrents", + "Plugins": "Plugins", + "OpenSubtitles Username": "OpenSubtitles Username", + "OpenSubtitles Password": "OpenSubtitles Password", + "Stream from Browser": "Stream from Browser", + "Torrent Link": "Torrent Link", + "Magnet Link": "Magnet Link", + "Movie API Endpoint": "Movie API Endpoint", + "Activate Google Analytics": "Activate Google Analytics" } \ No newline at end of file diff --git a/src/app/language/el.json b/src/app/language/el.json index d3e62173..9f5f95f4 100644 --- a/src/app/language/el.json +++ b/src/app/language/el.json @@ -1,490 +1,502 @@ { - "External Player": "Εξωτερικό πρόγραμμα αναπαραγωγής πολυμέσων", - "Made with": "Δημιουργήθηκε με", - "by a bunch of geeks from All Around The World": "από άτομα απ' όλο τον κόσμο", - "Initializing PopcornTime. Please Wait...": "Γίνεται εκκίνηση του PopcornTime. Παρακαλώ περιμένετε...", - "Status: Checking Database...": "Κατάσταση: Έλεγχος βάσης δεδομένων...", - "Movies": "Ταινίες", - "TV Series": "Τηλεοπτικές σειρές", - "Anime": "Άνιμε", - "Genre": "Είδος", - "All": "Όλα", - "Action": "Δράση", - "Adventure": "Περιπέτεια", - "Animation": "Κινούμενα σχέδια", - "Children": "Παιδικά", - "Comedy": "Κωμωδία", - "Crime": "Έγκλημα", - "Documentary": "Ντοκιμαντέρ", - "Drama": "Δράμα", - "Family": "Οικογένεια", - "Fantasy": "Φαντασία", - "Game Show": "Τηλεπαιχνίδια", - "Home And Garden": "Σπίτι και κήπος", - "Horror": "Τρόμος", - "Mini Series": "Μίνι σειρές", - "Mystery": "Μυστήριο", - "News": "Ειδήσεις", - "Reality": "Ριάλιτι", - "Romance": "Ρομάντζο", - "Science Fiction": "Επιστημονική φαντασία", - "Soap": "Σαπουνόπερα", - "Special Interest": "Ειδικού ενδιαφέροντος", - "Sport": "Αθλητικά", - "Suspense": "Αγωνία", - "Talk Show": "Τοκ σόου", - "Thriller": "Θρίλερ", - "Western": "Γουέστερν", - "Sort by": "Ταξινόμηση κατά", - "Popularity": "Δημοτικότητα", - "Updated": "Ενημέρωση", - "Year": "Χρονολογία", - "Name": "Ονομασία", - "Search": "Αναζήτηση", - "Season": "Κύκλος", - "Seasons": "Κύκλοι", - "Season %s": "Κύκλος %s", - "Load More": "Περισσότερα", - "Saved": "Αποθηκεύτηκε", - "Settings": "Ρυθμίσεις", - "Show advanced settings": "Εμφάνιση ρυθμίσεων για προχωρημένους", - "User Interface": "Περιβάλλον", - "Default Language": "Προκαθορισμένη γλώσσα", - "Theme": "Θέμα", - "Start Screen": "Οθόνη εκκίνησης", - "Favorites": "Αγαπημένα", - "Show rating over covers": "Εμφάνιση βαθμολογίας πάνω στα εξώφυλλα", - "Always On Top": "Πάντα στην κορυφή", - "Watched Items": "Προβληθέντα", - "Show": "Εμφάνιση", - "Fade": "Σκίαση", - "Hide": "Απόκρυψη", - "Subtitles": "Υπότιτλοι", - "Default Subtitle": "Προκαθορισμένοι υπότιτλοι", - "Disabled": "Απενεργοποιημένοι", - "Size": "Μέγεθος", - "Quality": "Ποιότητα", - "Only list movies in": "Εμφάνιση ταινιών μόνο σε", - "Show movie quality on list": "Εμφάνιση ποιότητας ταινιών στη λίστα", - "Trakt.tv": "Trakt.tv", - "Enter your Trakt.tv details here to automatically 'scrobble' episodes you watch in Popcorn Time": "Εισάγετε εδώ τα στοιχεία του Trakt.tv λογαριασμού σας, για να κάνετε αυτόματα «scrobble» επεισόδια που βλέπετε στο Popcorn Time.", - "Connect to %s to automatically 'scrobble' episodes you watch in %s": "Συνδεθείτε στο %s για να κάνετε αυτόματα «scrobble» επεισόδια που βλέπετε στο %s", - "Username": "Όνομα χρήστη", - "Password": "Κωδικός πρόσβασης", - "Popcorn Time stores an encrypted hash of your password in your local database": "Το Popcorn Time αποθηκεύει ένα κρυπτογραφημένο αρχείο κατακερματισμού του κωδικού σας στην τοπική βάση δεδομένων σας.", - "Remote Control": "Απομακρυσμένη διαχείριση", - "HTTP API Port": "HTTP API θύρα", - "HTTP API Username": "HTTP API Όνομα χρήστη", - "HTTP API Password": "HTTP API Κωδικός πρόσβασης", - "Connection": "Σύνδεση", - "TV Show API Endpoint": "API Endpoint για σειρές", - "Movies API Endpoint": "API Endpoint για ταινίες", - "Connection Limit": "Όριο σύνδεσης", - "DHT Limit": "Όριο DHT", - "Port to stream on": "Θύρα για ροή", - "0 = Random": "0 = Τυχαία", - "Cache Directory": "Φάκελος κρυφής μνήμης", - "Clear Tmp Folder after closing app?": "Καθαρισμός του φακέλου προσωρινής αποθήκευσης μετά το κλείσιμο της εφαρμογής;", - "Database": "Βάση δεδομένων", - "Database Directory": "Φάκελος βάσης δεδομένων", - "Import Database": "Εισαγωγή βάσης δεδομένων", - "Export Database": "Εξαγωγή βάσης δεδομένων", - "Flush bookmarks database": "Εκκαθάριση βάσης δεδομένων αγαπημένων", - "Flush subtitles cache": "Εκκαθάριση κρυφής μνήμης υποτίτλων", - "Flush all databases": "Εκκαθάριση όλων των βάσεων δεδομένων", - "Reset to Default Settings": "Επαναφορά στις προεπιλεγμένες ρυθμίσεις", - "Importing Database...": "Γίνεται εισαγωγή βάσης δεδομένων...", - "Please wait": "Παρακαλώ περιμένετε", - "Error": "Σφάλμα", - "Biography": "Βιογραφία", - "Film-Noir": "Φιλμ νουάρ", - "History": "Ιστορία", - "Music": "Μουσική", - "Musical": "Μιούζικαλ", - "Sci-Fi": "Επιστημονική φαντασία", - "Short": "Μικρού μήκους", - "War": "Πόλεμος", - "Last Added": "Τελευταία προσθήκη", - "Rating": "Βαθμολογία", - "Open IMDb page": "Άνοιγμα σελίδας IMDb", - "Health false": "Υγεία ψευδής", - "Add to bookmarks": "Προσθήκη στα αγαπημένα", - "Watch Trailer": "Προβολή τρέιλερ", - "Watch Now": "Προβολή τώρα", - "Health Good": "Υγεία καλή", - "Ratio:": "Αναλογία:", - "Seeds:": "Τροφοδότες:", - "Peers:": "Αποδέκτες:", - "Remove from bookmarks": "Αφαίρεση από τα αγαπημένα", - "Changelog": "Αρχείο αλλαγών", - "Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.": "Το Popcorn Time είναι το αποτέλεσμα πολλών προγραμματιστών και σχεδιαστών που χρησιμοποίησαν αρκετά API για να γίνει η εμπειρία της προβολής ταινιών μέσω torrent όσο το δυνατόν απλούστερη.", - "We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.": "Είμαστε ένα έργο ανοικτού κώδικα. Είμαστε από όλο τον κόσμο. Αγαπάμε τις ταινίες μας. Και φυσικά.. αγαπάμε το ποπκόρν.", - "Invalid PCT Database File Selected": "Επιλέχθηκε μη έγκυρο αρχείο βάσης δεδομένων PCT", - "Health Unknown": "Υγεία άγνωστη", - "Episodes": "Επεισόδια", - "Episode %s": "Επεισόδιο %s", - "Aired Date": "Ημερομηνία πρώτης προβολής", - "Streaming to": "Αναπαραγωγή στο", - "connecting": "Γίνεται σύνδεση", - "Download": "Λήψη", - "Upload": "Αποστολή", - "Active Peers": "Ενεργοί αποδέκτες", - "Cancel": "Ακύρωση", - "startingDownload": "Εκκίνηση λήψης", - "downloading": "Γίνεται λήψη", - "ready": "Έτοιμο", - "playingExternally": "Γίνεται αναπαραγωγή εξωτερικά", - "Custom...": "Επιλογή...", - "Volume": "Ένταση", - "Ended": "Τελείωσε", - "Error loading data, try again later...": "Σφάλμα κατά την φόρτωση δεδομένων, δοκιμάστε αργότερα...", - "Miscellaneous": "Διάφορα", - "When opening TV Show Detail Jump to:": "Με το άνοιγμα πληροφοριών μιας τηλεοπτικής σειράς πήγαινε στο:", - "First Unwatched Episode": "Πρώτο επεισόδιο που δεν έχει προβληθεί", - "Next Episode In Series": "Επόμενο επεισόδιο της σειράς", - "When Opening TV Show Detail Jump To": "Με το άνοιγμα πληροφοριών μιας τηλεοπτικής σειράς πήγαινε στο", - "Flushing...": "Εκκαθάριση...", - "Are you sure?": "Είστε σίγουροι;", - "We are flushing your databases": "Γίνεται εκκαθάριση των βάσεων δεδομένων", - "Success": "Επιτυχής", - "Please restart your application": "Παρακαλώ επανεκκινήστε την εφαρμογή", - "Restart": "Επανεκκίνηση", - "Terms of Service": "Όροι Χρήσης", - "I Accept": "Αποδέχομαι", - "Leave": "Αποχώρηση", - "When Opening TV Series Detail Jump To": "Με το άνοιγμα πληροφοριών μιας τηλεοπτικής σειράς πήγαινε στο", - "Health Medium": "Υγεία μέτρια", - "Playback": "Αναπαραγωγή", - "Play next episode automatically": "Αυτόματη αναπαραγωγή επόμενου επεισοδίου", - "Generate Pairing QR code": "Δημιουργία QR κωδικού", - "Playing Next Episode in": "Αναπαραγωγή επόμενου επεισοδίου σε", - "Play": "Αναπαραγωγή", - "Dismiss": "Απόρριψη", - "waitingForSubtitles": "Αναμονή για υπότιτλους", - "Play Now": "Αναπαραγωγή τώρα", - "Seconds": "Δευτερόλεπτα", - "You are currently authenticated to Trakt.tv as": "Είστε συνδεδεμένοι στο Trakt.tv ως", - "You are currently connected to %s": "Είστε συνδεδεμένοι στο %s", - "Disconnect account": "Αποσύνδεση λογαριασμού", - "Sync With Trakt": "Συγχρονισμός με Trakt", - "Syncing...": "Γίνεται συγχρονισμός...", - "Done": "Ολοκληρώθηκε", - "Subtitles Offset": "Αντιστάθμιση υποτίτλων", - "secs": "δεύτερα", - "We are flushing your database": "Γίνεται εκκαθάριση της βάσης δεδομένων σας", - "We are rebuilding the TV Show Database. Do not close the application.": "Γίνετε αναδιοργάνωση της βάσης δεδομένων τηλεοπτικών σειρών. Μην κλείσετε την εφαρμογή.", - "No shows found...": "Δεν βρέθηκαν σειρές...", - "No Favorites found...": "Δεν βρέθηκαν αγαπημένα...", - "Rebuild TV Shows Database": "Αναδιοργάνωση βάσης δεδομένων τηλεοπτικών σειρών", - "No movies found...": "Δεν βρέθηκαν ταινίες...", - "Ratio": "Αναλογία", - "Health Excellent": "Υγεία άριστη", - "Health Bad": "Υγεία κακή", - "Status: Creating Database...": "Κατάσταση: Δημιουργία βάσης δεδομένων...", - "Status: Updating database...": "Κατάσταση: Ανανέωση βάσης δεδομένων...", - "Status: Skipping synchronization TTL not met": "Κατάσταση: Παράλειψη συγχρονισμού TTL αδύνατη", - "Advanced Settings": "Προχωρημένες ρυθμίσεις", - "Clear Cache directory after closing app?": "Καθαρισμός του φακέλου κρυφής μνήμης μετά το κλείσιμο της εφαρμογής;", - "Tmp Folder": "Φάκελος προσωρινής αποθήκευσης", - "Status: Downloading API archive...": "Κατάσταση: Γίνεται λήψη αρχείου API...", - "Status: Archive downloaded successfully...": "Κατάσταση: Επιτυχής λήψη αρχείου...", - "Status: Importing file": "Κατάσταση: Γίνεται εισαγωγή αρχείου", - "Status: Imported successfully": "Κατάσταση: Επιτυχής εισαγωγή", - "Status: Launching applicaion... ": "Κατάσταση: Εκκίνηση εφαρμογής...", - "URL of this stream was copied to the clipboard": "Το URL της ροής αντιγράφηκε στο πρόχειρο", - "Error, database is probably corrupted. Try flushing the bookmarks in settings.": "Σφάλμα, η βάση δεδομένων είναι πιθανότατα κατεστραμμένη. Προσπαθήστε να εκκαθαρίσετε τα αγαπημένα στις ρυθμίσεις.", - "Flushing bookmarks...": "Γίνεται εκκαθάριση των αγαπημένων...", - "Resetting...": "Γίνεται επαναφορά...", - "We are resetting the settings": "Γίνεται επαναφορά των ρυθμίσεων", - "New version downloaded": "Έγινε λήψη νέας έκδοσης", - "Installed": "Εγκαταστάθηκε", - "Install Now": "Εγκατάσταση τώρα", - "Restart Now": "Επανεκκίνηση τώρα", - "We are flushing your subtitle cache": "Γίνεται εκκαθάριση της κρυφής μνήμης υποτίτλων", - "Subtitle cache deleted": "Έγινε εκκαθάριση της κρυφής μνήμης υποτίτλων", - "Please select a file to play": "Παρακαλώ επιλέξτε ένα αρχείο για αναπαραγωγή", - "Test Login": "Δοκιμή σύνδεσης", - "Testing...": "Γίνεται δοκιμή...", - "Success!": "Επιτυχής!", - "Failed!": "Αποτυχία!", - "Global shortcuts": "Γενικές συντομεύσεις", - "Video Player": "Πρόγραμμα αναπαραγωγής βίντεο", - "Toggle Fullscreen": "Εναλλαγή πλήρης οθόνης", - "Play/Pause": "Αναπαραγωγή/Πάυση", - "Seek Forward": "Μπροστά", - "Increase Volume": "Αύξηση έντασης", - "Set Volume to": "Ρύθμιση έντασης στο", - "Offset Subtitles by": "Αντιστάθμιση υποτίτλων κατά", - "Toggle Mute": "Εναλλαγή σίγασης", - "Movie Detail": "Πληροφορίες ταινίας", - "Toggle Quality": "Εναλλαγή ποιότητας", - "Play Movie": "Αναπαραγωγή ταινίας", - "Exit Fullscreen": "Έξοδος πλήρης οθόνης", - "Seek Backward": "Πίσω", - "Decrease Volume": "Μέιωση έντασης", - "Show Stream URL": "Εμφάνιση URL ροής", - "TV Show Detail": "Λεπτομέριες τηλεοπτικής σειράς", - "Toggle Watched": "Εναλλαγή προβληθέν", - "Select Next Episode": "Επιλογή επόμενου επισοδίου", - "Select Previous Episode": "Επιλογή προηγούμενου επεισοδίου", - "Select Next Season": "Επιλογή επόμενου κύκλου", - "Select Previous Season": "Επιλογή προηγούμενου κύκλου", - "Play Episode": "Αναπαραγωγή επεισοδίου", - "space": "space", - "shift": "shift", - "ctrl": "ctrl", - "enter": "enter", - "esc": "esc", - "Keyboard Shortcuts": "Συντομεύσεις πληκτρολογίου", - "Cut": "Αποκοπή", - "Copy": "Αντιγραφή", - "Paste": "Επικόλληση", - "Help Section": "Βοήθεια", - "Did you know?": "Το ξέρατε;", - "What does Popcorn Time offer?": "Τι προσφέρει το Popcorn Time;", - "With Popcorn Time, you can watch Movies and TV Series really easily. All you have to do is click on one of the covers, then click 'Watch Now'. But your experience is highly customizable:": "Με το Popcorn Time, μπορείτε να παρακολουθήσετε ταινίες και τηλεοπτικές σειρές πραγματικά εύκολα. Το μόνο που έχετε να κάνετε είναι να κάνετε κλικ σε ένα από τα εξώφυλλα και στη συνέχεια κλικ στη «Προβολή τώρα». Η εμπειρία σας όμως είναι υψηλά παραμετροποιήσιμη:", - "Our Movies collection only contains High-Definition movies, available in 720p and 1080p. To watch a movie, simply open Popcorn Time and navigate through the movies collection, reachable through the 'Movies' tab, in the navigation bar. The default view will show you all movies sorted by popularity, but you can apply your own filters, thanks to the 'Genre' and 'Sort by' filters. Once you have chosen a movie you want to watch, click its cover. Then click 'Watch Now'. Don't forget the popcorn!": "Η συλλογή ταινιών μας περιέχει μόνο ταινίες υψηλής ευκρίνειας, διαθέσιμες σε 720p και 1080p. Για να παρακολουθήσετε μια ταινία, απλά ανοίξτε το Popcorn Τime και περιηγηθείτε στη συλλογή ταινιών, προσβάσιμη από την καρτέλα «Ταινίες», στη γραμμή πλοήγησης. Η προεπιλεγμένη προβολή θα σας εμφανίσει όλες τις ταινίες ταξινομημένες κατά δημοτικότητα, αλλά μπορείτε να εφαρμόσετε τα δικά σας φίλτρα, χάρη στα φίλτρα «Είδος» και «Ταξινόμηση». Αφού έχετε επιλέξει μια ταινία που θέλετε να παρακολουθήσετε, κάντε κλικ στο εξώφυλλο του. Στη συνέχεια, κάντε κλικ στην επιλογή «Προβολή τώρα». Μη ξεχάσετε το ποπκόρν!", - "The TV Series tab, that you can reach by clicking 'TV Series' in the navigation bar, will show you all available series in our collection. You can also apply your own filters, same as the Movies, to help you decide what to watch. In this collection, also just click the cover: the new window that will appear will allow you to navigate through Seasons and Episodes. Once your mind is set, just click the 'Watch Now' button.": "Η καρτέλα των τηλεοπτικών σειρών, που μπορείτε να επισκεφθείτε κάνοντας κλικ στην επιλογή «Τηλεοπτικές σειρές» στη γραμμή πλοήγησης, θα σας εμφανίσει όλες τις διαθέσιμες σειρές στη συλλογή μας. Μπορείτε επίσης να εφαρμόσετε τα δικά σας φίλτρα, όπως στις ταινίες, για να σας βοηθήσουν να αποφασίσετε τι θα δείτε. Σε αυτή τη συλλογή, επίσης, απλά κάντε κλικ στο εξώφυλλο: το νέο παράθυρο που θα εμφανιστεί, θα σας επιτρέψει να πλοηγηθείτε σε κύκλους και επεισόδια. Όταν αποφασίσετε τι θέλετε να παρακολουθήσετε, απλά κάντε κλικ στο κουμπί «Προβολή τώρα».", - "Choose quality": "Επιλογή ποιότητας", - "A slider next to the 'Watch Now' button will let you choose the quality of the stream. You can also set a fixed quality in the Settings tab. Warning: a better quality equals more data to download.": "Ένας δρομέας δίπλα από το κουμπί «Προβολή τώρα» θα σας επιτρέψει να επιλέξετε την ποιότητα της ροής. Μπορείτε επίσης να ορίσετε μια σταθερή ποιότητα στην καρτέλα ρυθμίσεων. Προειδοποίηση: μια καλύτερη ποιότητα σημαίνει περισσότερα δεδομένα για λήψη.", - "Most of our Movies and TV Series have subtitles in your language. You can set them in the Settings tab. For the Movies, you can even set them through the dropdown menu, in the Movie Details page.": "Οι περισσότερες από τις ταινίες και τηλεοπτικές σειρές μας έχουν υπότιτλους στη γλώσσα σας. Μπορείτε να τους ορίσετε στην καρτέλα «Ρυθμίσεις». Για τις ταινίες, μπορείτε να τους ορίσετε ακόμη και από το αναπτυσσόμενο μενού, στη σελίδα λεπτομερειών της ταινίας.", - "Clicking the heart icon on a cover will add the movie/show to your favorites. This collection is reachable through the heart-shaped icon, in the navigation bar. To remove an item from your collection, just click on the icon again! How simple is that?": "Κάνοντας κλικ στο εικονίδιο της καρδιάς σε ένα εξώφυλλο θα προσθέσει την ταινία/σειρά στα αγαπημένα σας. Αυτή η συλλογή είναι προσβάσιμη μέσω του εικονιδίου σε σχήμα καρδιάς, στη γραμμή πλοήγησης. Για να αφαιρέσετε ένα στοιχείο από τη συλλογή σας, απλά κάντε κλικ στο εικονίδιο πάλι! Πόσο απλό είναι αυτό;", - "Watched icon": "Εικονίδιο προβολής", - "Popcorn Time will keep in mind what you've already watched - a little help remembering doesn't cause any harm. You can also set an item as watched by clicking the eye-shaped icon on the covers. You can even build and synchronize your collection with Trakt.tv website, via the Settings tab.": "Το Popcorn Time θα θυμάται τι έχετε ήδη παρακολουθήσει - μια μικρή βοήθεια για να θυμόμαστε δεν πειράζει. Μπορείτε επίσης να ορίσετε ένα στοιχείο ως προβληθέν κάνοντας κλικ στο εικονίδιο σε σχήμα ματιού. Μπορείτε ακόμα να δημιουργήσετε και να συγχρονίσετε τη συλλογή σας με την ιστοσελίδα Trakt.tv, μέσω της καρτέλας «Ρυθμίσεις».", - "In Popcorn Time, you can use the magnifier icon to open the search. Type a Title, an Actor, a Director or even a Year, press 'Enter' and let us show you what we can offer to fill your needs. To close your current search, you can click on the 'X' located next to your entry or type something else in the field.": "Στο Popcorn Time, μπορείτε να χρησιμοποιήσετε το εικονίδιο μεγεθυντικού φακού για να ανοίξετε την αναζήτηση. Πληκτρολογήστε έναν τίτλο, ηθοποιό, σκηνοθέτη ή ακόμα και μια χρονολογία, πατήστε το πλήκτρο «Enter» και αφήστε μας να σας δείξουμε τι μπορούμε να προσφέρουμε για να καλύψουμε τις ανάγκες σας. Για να κλείσετε την τρέχουσα αναζήτησή σας, μπορείτε να κάνετε κλικ στο «X» που βρίσκεται δίπλα από το πεδίο αναζήτησης ή να πληκτρολογήστε κάτι άλλο.", - "External Players": "Εξωτερικά προγράμματα αναπαραγωγής πολυμέσων", - "If you prefer to use a custom player instead of the built in one, you can do so by clicking the allocated icon on the 'Watch Now' button. A list of your installed players will be shown, select one and Popcorn Time will send everything to it. If your player isn't on the list, please report it to us.": "Αν προτιμάτε τη χρήση ενός εξωτερικού προγράμματος αναπαραγωγής πολυμέσων αντί του ενσωματωμένου, μπορείτε να το κάνετε πατώντας το εικονίδιο που βρίσκεται δίπλα από το κουμπί «Προβολή τώρα». Μία λίστα με τα εγκατεστημένα προγράμματα αναπαραγωγής πολυμέσων σας θα εμφανιστεί, επιλέξτε ένα και το Popcorn Time θα στείλει τα πάντα σε αυτό. Εάν το πρόγραμμα αναπαραγωγής πολυμέσων σας δεν είναι στη λίστα, παρακαλούμε να μας το αναφέρετε.", - "To push the customization even further, we offer you a large panel of options. To access the Settings, click the wheel-shaped icon in the navigation bar.": "Για να προσαρμόσετε την εφαρμογή ακόμη περισσότερο, σας προσφέρουμε ένα μεγάλο πίνακα επιλογών. Για να ανοίξετε τις «Ρυθμίσεις», κάντε κλικ στο εικονίδιο σε σχήμα γραναζιού από τη γραμμή πλοήγησης.", - "Keyboard Navigation": "Πλοήγηση με το πληκτρολόγιο", - "The entire list of keyboard shortcuts is available by pressing '?' on your keyboard, or through the keyboard-shaped icon in the Settings tab.": "Ολόκληρη η λίστα των συντομεύσεων πληκτρολογίου είναι διαθέσιμη πατώντας «?» στο πληκτρολόγιό σας, ή μέσω του εικονιδίου με σχήμα πληκτρολογίου στην καρτέλα «Ρυθμίσεις».", - "Custom Torrents and Magnet Links": "Προσαρμοσμένα torrent και σύνδεσμοι magnet", - "You can use custom torrents and magnets links in Popcorn Time. Simply drag and drop .torrent files into the application's window, and/or paste any magnet link.": "Μπορείτε να χρησιμοποιήσετε προσαρμοσμένα torrents και συνδέσμους magnet στο Popcorn Time. Απλά σύρετε και πετάξτε τα αρχεία με κατάληξη .torrent στο παράθυρο της εφαρμογής, και/ή κάντε επικόλληση ενός συνδέσμου magnet.", - "Torrent health": "Υγεία torrent", - "On the details of Movies/TV Series, you can find a little circle, colored in grey, red, yellow or green. Those colors refer to the health of the torrent. A green torrent will be downloaded quickly, while a red torrent may not be downloaded at all, or very slowly. The color grey represents an error in the health calculation for Movies, and needs to be clicked in TV Series in order to display the health.": "Στις λεπτομέρειες ταινιών/τηλεοπτικών σειρών, μπορείτε να βρείτε ένα μικρό κύκλο, χρωματισμένο με γκρι, κόκκινο, κίτρινο ή πράσινο. Τα χρώματα αυτά αναφέρονται στην υγεία του torrent. Ένα πράσινο torrent θα κατέβει γρήγορα, ενώ ένα κόκκινο torrent μπορεί να μην κατέβει καθόλου, ή πολύ αργά. Το γκρι χρώμα αντιπροσωπεύει ένα σφάλμα στον υπολογισμό της υγείας για τις ταινίες και θα πρέπει να κάνετε κλικ πάνω του για να εμφανίσετε την υγεία στις τηλεοπτικές σειρές.", - "How does Popcorn Time work?": "Πως δουλεύει το Popcorn Time;", - "Popcorn Time streams video content through torrents. Our movies are provided by %s and our TV Series by %s, while getting all metadata from %s. We don't host any content ourselves.": "Το Popcorn Time δουλεύει μέσω περιεχομένων βίντεου torrents. Οι ταινίες παρέχονται από το %s και οι τηλεοπτικές σειρές από το %s, ενώ όλες οι πληροφορίες από το %s. Εμείς δεν φιλοξενούμε κάποιο περιεχόμενο τους.", - "Torrent streaming? Well, torrents use Bittorrent protocol, which basically means that you download small parts of the content from another user's computer, while sending the parts you already downloaded to another user. Then, you watch those parts, while the next ones are being downloaded in the background. This exchange allows the content to stay healthy.": "Torrent streaming; Τα torrents χρησιμοποιούν το πρωτόκολλο Bittorrent, το οποίο ουσιαστικά σημαίνει ότι μπορείτε να κατεβάσετε μικρά τμήματα του περιεχομένου από τον υπολογιστή κάποιου άλλου χρήστη, ενώ στέλνετε τα τμήματα που έχετε ήδη λάβει σε άλλο χρήστη. Στη συνέχεια, μπορείτε να προβάλετε αυτά τα τμήματα, ενώ τα επόμενα λαμβάνονται στο παρασκήνιο. Αυτή η ανταλλαγή επιτρέπει το περιεχόμενο να παραμένει υγιές.", - "Once the movie is fully downloaded, you continue to send parts to the other users. And everything is deleted from your computer when you close Popcorn Time. As simple as that.": "Όταν η ταινία έχει ληφθεί πλήρως, συνεχίζετε να στέλνετε κομμάτια στους άλλους χρήστες και όλα διαγράφονται από τον υπολογιστή σας όταν κλείσετε το Popcorn Time. Τόσο απλό είναι.", - "The application itself is built with Node-Webkit, HTML, CSS and Javascript. It works like the Google Chrome browser, except that you host the biggest part of the code on your computer. Yes, Popcorn Time works on the same technology as a regular website, like... let's say Wikipedia, or Youtube!": "Η εφαρμογή είναι κατασκευασμένη με Node-Webkit, HTML, CSS και Javascript. Λειτουργεί όπως τον περιηγητή Google Chrome, με την εξαίρεση ότι το μεγαλύτερο μέρος του κώδικα φιλοξενείται στον υπολογιστή σας. Ναι, το Popcorn Time λειτουργεί με την ίδια τεχνολογία όπως μια κανονική ιστοσελίδα, όπως ... ας πούμε η Wikipedia, ή το YouTube!", - "I found a bug, how do I report it?": "Βρήκα ένα bug, πώς μπορώ να το αναφέρω;", - "No historics found...": "Δεν βρέθηκε ιστορικό...", - "Error, database is probably corrupted. Try flushing the history in settings.": "Σφάλμα, η βάση δεδομένων είναι πιθανότατα κατεστραμμένη. Προσπαθήστε να εκκαθαρίσετε το ιστορικό στις ρυθμίσεις.", - "You can paste magnet links anywhere in Popcorn Time with CTRL+V.": "Μπορείτε να επικολλήσετε συνδέσμους magnet οπουδήποτε μέσα στο Popcorn Time με CTRL+V.", - "You can drag & drop a .torrent file into Popcorn Time.": "Μπορείτε να σύρετε & να ρίξετε ένα αρχείο .torrent μέσα στο Popcorn Time.", - "The Popcorn Time project started in February 2014 and has already had 150 people that contributed more than 3000 times to it's development in August 2014.": "Το έργο Popcorn Time ξεκίνησε το Φεβρουάριο του 2014 και έχει ήδη 150 άτομα, τα οποία συνέβαλαν περισσότερο από 3000 φορές στην ανάπτυξή του τον Αύγουστο του 2014.", - "The rule n°10 applies here.": "Ο κανόνας n°10 ισχύει εδώ.", - "If a subtitle for a TV series is missing, you can add it on %s. And the same way for a movie, but on %s.": "Αν δεν υπάρχουν υπότιτλοι για μία σειρά, μπορείτε να τους ανεβάσετε στο %s. Το ίδιο ισχύει και για τις ταινίες, αλλά στο %s.", - "If you're experiencing connection drop issues, try to reduce the DHT Limit in settings.": "Αν αντιμετωπίζετε προβλήματα με πτώση σύνδεσης, δοκιμάστε να μειώστε το όριο DHT στις ρυθμίσεις.", - "If you search \"1998\", you can see all the movies or TV series that came out that year.": "Αν κάνετε την αναζήτηση «1998», θα δείτε όλες τις ταινίες ή τηλεοπτικές σειρές που βγήκαν εκείνη τη χρονιά.", - "You can login to Trakt.tv to save all your watched items, and synchronize them across multiple devices.": "Μπορείτε να συνδεθείτε στο Trakt.tv για να αποθηκεύσετε όλα όσα έχετε παρακολουθήσει στο Popcorn Time και να τα συγχρονίσετε σε πολλαπλές συσκευές.", - "Clicking on the rating stars will display a number instead.": "Κάνοντας κλικ στα αστέρια βαθμολογίας θα εμφανιστεί ένας αριθμός αντ' αυτών.", - "This application is entirely written in HTML5, CSS3 and Javascript.": "Η εφαρμογή αυτή είναι εξολοκλήρου γραμμένη σε HTML5, CSS3 και Javascript.", - "You can find out more about a movie or a TV series? Just click the IMDb icon.": "Θέλετε να μάθετε περισσότερα για μία ταινία ή μία τηλεοπτική σειρά; Απλά κάντε κλικ στο εικονίδιο του IMDb.", - "Clicking twice on a \"Sort By\" filter reverses the order of the list.": "Κάνοντας κλικ δύο φορές στο φίλτρο «Ταξινόμηση κατά» αντιστρέφει τη σειρά της λίστας", - "Switch to next tab": "Μετάβαση στην επόμενη καρτέλα", - "Switch to previous tab": "Μετάβαση στην προηγούμενη καρτέλα", - "Switch to corresponding tab": "Μετάβαση στην αντίστοιχη καρτέλα", - "through": "μέχρι", - "Enlarge Covers": "Μεγέθυνση των εξώφυλλων", - "Reduce Covers": "Σμίκρυνση των εξώφυλλων", - "Open the Help Section": "Άνοιγμα βοήθειας", - "Open Item Details": "Άνοιγμα πληροφοριών στοιχείου", - "Add Item to Favorites": "Προσθήκη στοιχείου στα αγαπημένα", - "Mark as Seen": "Επισήμανση ως προβληθέν", - "Open this screen": "Άνοιγμα αυτής της οθόνης", - "Open Settings": "Άνοιγμα ρυθμίσεων", - "Posters Size": "Μέγεθος εξώφυλλων", - "This feature only works if you have your TraktTv account synced. Please go to Settings and enter your credentials.": "Αυτό το χαρακτηριστικό λειτουργεί μόνο αν έχετε συγχρονίσει το λογαριασμό του TraktTv σας. Παρακαλώ πηγαίνετε στις Ρυθμίσεις και εισάγετε τα στοιχεία σας.", - "Last Open": "Τελευταία ανοιχτό", - "Exporting Database...": "Γίνεται εξαγωγή βάσης δεδομένων...", - "Database Successfully Exported": "Επιτυχής εξαγωγή βάσης δεδομένων", - "Display": "Οθόνη", - "TV": "Τηλεοπτικά", - "Type": "Τύπος", - "popularity": "δημοτικότητα", - "date": "ημερομηνία", - "year": "χρονολογία", - "rating": "βαθμολογία", - "updated": "ενημερωμένα", - "name": "όνομα", - "OVA": "OVA", - "ONA": "ONA", - "No anime found...": "Δεν βρέθηκε άνιμε...", - "Movie": "Ταινία", - "Special": "Ειδικό", - "No Watchlist found...": "Δεν βρέθηκε λίστα παρακολούθησης...", - "Watchlist": "Λίστα παρακολούθησης", - "Resolving..": "Επίλυση..", - "About": "Σχετικά", - "Open Cache Directory": "Άνοιγμα φακέλου κρυφής μνήμης", - "Open Database Directory": "Άνοιγμα φακέλου βάσης δεδομένων", - "Mark as unseen": "Επισήμανση ως μη προβληθέν", - "Playback rate": "Ρυθμός αναπαραγωγής", - "Increase playback rate by %s": "Άυξηση του ρυθμού αναπαραγωγής κατά %s", - "Decrease playback rate by %s": "Μείωση του ρυθμού αναπαραγωγής κατά %s", - "Set playback rate to %s": "Ορισμός του ρυθμού αναπαραγωγής στο %s", - "Playback rate adjustment is not available for this video!": "Η προσαρμογή του ρυθμού αναπαραγωγής δεν είναι διαθέσιμη για αυτό το βίντεο!", - "Color": "Χρώμα", - "With Shadows": "Με σκιές", - "Local IP Address": "Τοπική διεύθυνση IP", - "Japan": "Ιαπωνία", - "Cars": "Αυτοκίνητα", - "Dementia": "Dementia", - "Demons": "Δαίμονες", - "Ecchi": "Ecchi", - "Game": "Παιχνίδι", - "Harem": "Χάρεμ", - "Historical": "Ιστορικά", - "Josei": "Τζοσέι", - "Kids": "Παιδικά", - "Magic": "Μαγεία", - "Martial Arts": "Πολεμικές τέχνες", - "Mecha": "Μέκα", - "Military": "Στρατός", - "Parody": "Παρωδία", - "Police": "Αστυνομία", - "Psychological": "Ψυχολογικά", - "Samurai": "Σαμουράι", - "School": "Σχολείο", - "Seinen": "Σέινεν", - "Shoujo": "Σότζο", - "Shoujo Ai": "Σότζο άι", - "Shounen": "Σόνεν", - "Shounen Ai": "Σόνεν άι", - "Slice Of Life": "Slice of Life", - "Slice of Life": "Slice of life", - "Space": "Διάστημα", - "Sports": "Αθλήματα", - "Super Power": "Υπερδυνάμεις", - "Supernatural": "Υπερφυσικά", - "Vampire": "Βρυκόλακες", - "Alphabet": "Αλφαβητικά", - "Automatically Sync on Start": "Αυτόματος συγχρονισμός κατά την εκκίνηση", - "Setup VPN": "Ρύθμιση VPN", - "VPN": "VPN", - "Install VPN Client": "Εγκατάσταση VPN client", - "More Details": "Περισσότερες πληροφορίες", - "Don't show me this VPN option anymore": "Απόκρυψη αυτής της επιλογής VPN πλέον", - "Activate automatic updating": "Ενεργοποίηση αυτόματης αναβάθμισης", - "We are installing VPN client": "Γίνεται εγκατάσταση του VPN client", - "VPN Client Installed": "Ο VPN client εγκαταστάθηκε", - "Please wait...": "Παρακαλώ περιμένετε...", - "VPN.ht client is installed": "Ο VPN.ht client είναι εγκατεστημένος", - "Install again": "Επανάληψη εγκατάστασης", - "Connect": "Σύνδεση", - "Create Account": "Δημιουργία λογαριασμού", - "Please, allow ~ 1 minute": "Παρακαλώ, περιμένετε ~ 1 λεπτό", - "Status: Connecting to VPN...": "Κατάσταση: Γίνεται σύνδεση στο VPN...", - "Status: Monitoring connexion - ": "Κατάσταση: Παρακολούθηση σύνδεσης -", - "Connect VPN": "Σύνδεση VPN", - "Disconnect VPN": "Αποσύνδεση VPN", - "Celebrate various events": "Εορτασμός διαφόρων εκδηλώσεων", - "ATTENTION! We need admin access to run this command.": "ΠΡΟΣΟΧΗ! Χρειαζόμαστε πρόσβαση ως διαχειριστής για την εκτέλεση αυτής της εντολής.", - "Your password is not saved": "Ο κωδικός σας δεν είναι αποθηκευμένος", - "Enter sudo password :": "Εισαγωγή κωδικού sudo :", - "Status: Monitoring connection": "Κατάσταση: Παρακολούθηση σύνδεσης", - "Status: Connected": "Κατάσταση: Συνδεδεμένος", - "Secure connection": "Ασφαλής σύνδεση", - "Your IP:": "Η IP σας:", - "Disconnect": "Αποσύνδεση", - "Downloaded": "Έγινε λήψη", - "Loading stuck ? Click here !": "Κόλλησε στην αναμονή; Κάντε κλικ εδώ!", - "Torrent Collection": "Συλλογή torrent", - "Drop Magnet or .torrent": "Εισάγετε magnet ή .torrent", - "Remove this torrent": "Αφαίρεση του torrent", - "Rename this torrent": "Μετονομασία του torrent", - "Flush entire collection": "Εκκαθάριση όλης της συλλογής", - "Open Collection Directory": "Άνοιγμα φακέλου συλλογής", - "Store this torrent": "Αποθήκευση του torrent", - "Enter new name": "Εισαγωγή νέου ονόματος", - "This name is already taken": "Το όνομα αυτό υπάρχει ήδη", - "Always start playing in fullscreen": "Να γίνεται πάντα έναρξη αναπαραγωγής σε πλήρη οθόνη", - "Allow torrents to be stored for further use": "Να επιτρέπεται η αποθήκευση των torrent για μελλοντική χρήση", - "Hide VPN from the filter bar": "Απόκρυψη VPN από τη γραμμή φίλτρων", - "Magnet link": "Σύνδεσμος magnet", - "Error resolving torrent.": "Σφάλμα με την επίλυση του torrent", - "%s hour(s) remaining": "%s ώρες απομένουν", - "%s minute(s) remaining": "%s λεπτά απομένουν", - "%s second(s) remaining": "%s δευτερόλεπτα απομένουν", - "Unknown time remaining": "Απομένει άγνωστος χρόνος", - "Set player window to video resolution": "Ορισμός του παραθύρου αναπαραγωγής στην ανάλυση του βίντεο", - "Set player window to double of video resolution": "Ορισμός του παραθύρου αναπαραγωγής στο διπλάσιο της ανάλυσης του βίντεο", - "Set player window to half of video resolution": "Ορισμός του παραθύρου αναπαραγωγής στο μισό της ανάλυσης του βίντεο", - "Retry": "Δοκιμάστε ξανά", - "Import a Torrent": "Εισαγωγή torrent", - "The remote movies API failed to respond, please check %s and try again later": "Το απομακρυσμένο API ταινιών απέτυχε να ανταποκριθεί, παρακαλώ ελέγξτε το %s και δοκιμάστε ξανά αργότερα", - "The remote shows API failed to respond, please check %s and try again later": "Το απομακρυσμένο API σειρών απέτυχε να ανταποκριθεί, παρακαλώ ελέγξτε το %s και δοκιμάστε ξανά αργότερα", - "The remote anime API failed to respond, please check %s and try again later": "Το απομακρυσμένο API άνιμε απέτυχε να ανταποκριθεί, παρακαλώ ελέγξτε το %s και δοκιμάστε ξανά αργότερα", - "Not Seen": "Δεν έχει προβληθεί", - "Seen": "Έχει προβληθεί", - "Title": "Τίτλο", - "The video playback encountered an issue. Please try an external player like %s to view this content.": "Υπήρξε σφάλμα με την αναπαραγωγή του βίντεο. Παρακαλώ δοκιμάστε ένα εξωτερικό πρόγραμμα αναπαραγωγής πολυμέσων όπως το %s για να δείτε το περιεχόμενο αυτό.", - "Font": "Γραμματοσειρά", - "Decoration": "Διακόσμηση", - "None": "Καμία", - "Outline": "Περίγραμμα", - "Opaque Background": "Αδιαφανές φόντο", - "No thank you": "Όχι, ευχαριστώ", - "Report an issue": "Αναφορά προβλήματος", - "Log in into your GitLab account": "Συνδεθείτε στον GitLab λογαριασμό σας", - "Email": "Email", - "Log in": "Σύνδεση", - "Report anonymously": "Αναφορά ανώνυμα", - "Note regarding anonymous reports:": "Σημείωση περί ανώνυμων αναφορών:", - "You will not be able to edit or delete your report once sent.": "Δεν θα μπορείτε να επεξεργαστείτε ή να διαγράψετε την αναφορά σας αφού σταλεί.", - "If any additionnal information is required, the report might be closed, as you won't be able to provide them.": "Αν απαιτούνται επιπλέον πληροφορίες, η αναφορά μπορεί να κλείσει, αφού δεν θα μπορείτε να τις δώσετε.", - "Step 1: Please look if the issue was already reported": "Βήμα 1: Παρακαλώ κοιτάξτε αν το πρόβλημα έχει ήδη αναφερθεί", - "Enter keywords": "Εισαγωγή λέξεων-κλειδιών", - "Already reported": "Έχει ήδη αναφερθεί", - "I want to report a new issue": "Θέλω να αναφέρω ένα νέο πρόβλημα", - "Step 2: Report a new issue": "Βήμα 2: Αναφορά νέου προβλήματος", - "Note: please don't use this form to contact us. It is limited to bug reports only.": "Σημείωση: παρακαλώ μη χρησιμοποιείτε την φόρμα αυτή για να επικοινωνήσετε μαζί μας. Ο μοναδικός σκοπός της είναι για την αναφορά προβλημάτων.", - "The title of the issue": "Ο τίτλος του προβλήματος", - "Description": "Περιγραφή", - "200 characters minimum": "200 χαρακτήρες το ελάχιστο", - "A short description of the issue. If suitable, include the steps required to reproduce the bug.": "Μια μικρή περιγραφή του προβλήματος. Αν γίνεται, συμπεριλάβετε τα βήματα που απαιτούνται για την αναπαραγωγή του.", - "Submit": "Υποβολή", - "Step 3: Thank you !": "Βήμα 3: Ευχαριστούμε!", - "Your issue has been reported.": "Το πρόβλημα σας έχει αναφερθεί.", - "Open in your browser": "Άνοιγμα στον περιηγητή σας", - "No issues found...": "Δεν βρέθηκαν προβλήματα...", - "First method": "Πρώτη μέθοδος", - "Use the in-app reporter": "Χρήση της εσωτερικής φόρμα αναφοράς", - "You can find it later on the About page": "Μπορείτε να τη βρείτε αργότερα στη σελίδα «Σχετικά»", - "Second method": "Δεύτερη μέθοδος", - "You can create an account on our %s repository, and click on %s.": "Μπορείτε να δημιουργήσετε έναν λογαριασμό στο %s αποθετήριο μας και να κάνετε κλικ %s.", - "Use the %s issue filter to search and check if the issue has already been reported or is already fixed.": "Χρησιμοποιήστε το φίλτρο προβλήματος του %s για να αναζητήσετε και να ελέγξετε αν το πρόβλημα έχει αναφερθεί ή επιδιορθωθεί ήδη.", - "Include a screenshot if relevant - Is your issue about a design feature or a bug?": "Συμπεριλάβετε ένα στιγμιότυπο οθόνης αν είναι σχετικό - Είναι το πρόβλημα σας για ένα σχεδιαστικό χαρακτηριστικό ή για ένα bug;", - "A good bug report shouldn't leave others needing to chase you up for more information. Be sure to include the details of your environment.": "Μια καλή αναφορά προβλήματος δεν θα πρέπει να αφήνει άλλους να πρέπει να σας κυνηγάνε για περισσότερες πληροφορίες. Σιγουρευτείτε ότι συμπεριλάβατε τις λεπτομέρειες του περιβάλλοντος σας.", - "Warning: Always use English when contacting us, or we might not understand you.": "Προειδοποίηση: Πάντα χρησιμοποιείτε την αγγλική γλώσσα όταν επικοινωνείτε μαζί μας, αλλιώς μπορεί να μην σας καταλάβουμε.", - "Search on %s": "Αναζήτηση για %s", - "No results found": "Δεν βρέθηκαν αποτελέσματα", - "Invalid credentials": "Λάθος διαπιστευτήρια", - "Open Favorites": "Άνοιγμα αγαπημένων", - "Open About": "Άνοιγμα σελίδας περί", - "Minimize to Tray": "Ελαχιστοποίηση στην περιοχή ειδοποιήσεων", - "Close": "Κλείσιμο", - "Restore": "Επαναφορά", - "Resume Playback": "Συνέχιση αναπαραγωγής", - "Features": "Χαρακτηριστικά", - "Connect To %s": "Σύνδεση στο %s", - "The magnet link was copied to the clipboard": "Ο σύνδεσμος magnet αντιγράφηκε στο πρόχειρο", - "Big Picture Mode": "Λειτουργία μεγάλης οθόνης", - "Big Picture Mode is unavailable on your current screen resolution": "Η λειτουργία μεγάλης οθόνης δεν είναι διαθέσιμη στην τρέχουσα ανάλυση οθόνης σας.", - "Cannot be stored": "Δεν είναι δυνατή η αποθήκευση ", - "%s reported this torrent as fake": "Το %s ανέφερε αυτό το torrent ως ψεύτικο", - "%s could not verify this torrent": "Το %s δεν μπόρεσε να επαληθεύσει αυτό το torrent", - "Randomize": "Τυχαιοποίηση", - "Randomize Button for Movies": "Κουμπί τυχαιοποίησης για ταινίες", - "Overall Ratio": "Συνολική αναλογία", - "Translate Synopsis": "Μετάφραση περίληψης", - "Returning Series": "Σειρά που επιστρέφει", - "In Production": "Σε παραγωγή", - "Canceled": "Ακυρωμένη", - "N/A": "Δ/Υ", - "%s is not supposed to be run as administrator": "Το %s δεν θα πρέπει να εκτελείται ως διαχειριστής", - "Your disk is almost full.": "Ο δίσκος σας είναι σχεδόν πλήρης", - "You need to make more space available on your disk by deleting files.": "Πρέπει να κάνετε περισσότερο χώρο διαθέσιμο στον δίσκο σας διαγράφοντας αρχεία.", - "Playing Next": "Στη συνέχεια", - "Trending": "Τάσεις" + "External Player": "Εξωτερικό πρόγραμμα αναπαραγωγής πολυμέσων", + "Made with": "Δημιουργήθηκε με", + "by a bunch of geeks from All Around The World": "από άτομα απ' όλο τον κόσμο", + "Initializing PopcornTime. Please Wait...": "Γίνεται εκκίνηση του PopcornTime. Παρακαλώ περιμένετε...", + "Status: Checking Database...": "Κατάσταση: Έλεγχος βάσης δεδομένων...", + "Movies": "Ταινίες", + "TV Series": "Τηλεοπτικές σειρές", + "Anime": "Άνιμε", + "Genre": "Είδος", + "All": "Όλα", + "Action": "Δράση", + "Adventure": "Περιπέτεια", + "Animation": "Κινούμενα σχέδια", + "Children": "Παιδικά", + "Comedy": "Κωμωδία", + "Crime": "Έγκλημα", + "Documentary": "Ντοκιμαντέρ", + "Drama": "Δράμα", + "Family": "Οικογένεια", + "Fantasy": "Φαντασία", + "Game Show": "Τηλεπαιχνίδια", + "Home And Garden": "Σπίτι και κήπος", + "Horror": "Τρόμος", + "Mini Series": "Μίνι σειρές", + "Mystery": "Μυστήριο", + "News": "Ειδήσεις", + "Reality": "Ριάλιτι", + "Romance": "Ρομάντζο", + "Science Fiction": "Επιστημονική φαντασία", + "Soap": "Σαπουνόπερα", + "Special Interest": "Ειδικού ενδιαφέροντος", + "Sport": "Αθλητικά", + "Suspense": "Αγωνία", + "Talk Show": "Τοκ σόου", + "Thriller": "Θρίλερ", + "Western": "Γουέστερν", + "Sort by": "Ταξινόμηση κατά", + "Popularity": "Δημοτικότητα", + "Updated": "Ενημέρωση", + "Year": "Χρονολογία", + "Name": "Ονομασία", + "Search": "Αναζήτηση", + "Season": "Κύκλος", + "Seasons": "Κύκλοι", + "Season %s": "Κύκλος %s", + "Load More": "Περισσότερα", + "Saved": "Αποθηκεύτηκε", + "Settings": "Ρυθμίσεις", + "Show advanced settings": "Εμφάνιση ρυθμίσεων για προχωρημένους", + "User Interface": "Περιβάλλον", + "Default Language": "Προκαθορισμένη γλώσσα", + "Theme": "Θέμα", + "Start Screen": "Οθόνη εκκίνησης", + "Favorites": "Αγαπημένα", + "Show rating over covers": "Εμφάνιση βαθμολογίας πάνω στα εξώφυλλα", + "Always On Top": "Πάντα στην κορυφή", + "Watched Items": "Προβληθέντα", + "Show": "Εμφάνιση", + "Fade": "Σκίαση", + "Hide": "Απόκρυψη", + "Subtitles": "Υπότιτλοι", + "Default Subtitle": "Προκαθορισμένοι υπότιτλοι", + "Disabled": "Απενεργοποιημένοι", + "Size": "Μέγεθος", + "Quality": "Ποιότητα", + "Only list movies in": "Εμφάνιση ταινιών μόνο σε", + "Show movie quality on list": "Εμφάνιση ποιότητας ταινιών στη λίστα", + "Trakt.tv": "Trakt.tv", + "Enter your Trakt.tv details here to automatically 'scrobble' episodes you watch in Popcorn Time": "Εισάγετε εδώ τα στοιχεία του Trakt.tv λογαριασμού σας, για να κάνετε αυτόματα «scrobble» επεισόδια που βλέπετε στο Popcorn Time.", + "Connect to %s to automatically 'scrobble' episodes you watch in %s": "Συνδεθείτε στο %s για να κάνετε αυτόματα «scrobble» επεισόδια που βλέπετε στο %s", + "Username": "Όνομα χρήστη", + "Password": "Κωδικός πρόσβασης", + "Popcorn Time stores an encrypted hash of your password in your local database": "Το Popcorn Time αποθηκεύει ένα κρυπτογραφημένο αρχείο κατακερματισμού του κωδικού σας στην τοπική βάση δεδομένων σας.", + "Remote Control": "Απομακρυσμένη διαχείριση", + "HTTP API Port": "HTTP API θύρα", + "HTTP API Username": "HTTP API Όνομα χρήστη", + "HTTP API Password": "HTTP API Κωδικός πρόσβασης", + "Connection": "Σύνδεση", + "TV Show API Endpoint": "API Endpoint για σειρές", + "Movies API Endpoint": "API Endpoint για ταινίες", + "Connection Limit": "Όριο σύνδεσης", + "DHT Limit": "Όριο DHT", + "Port to stream on": "Θύρα για ροή", + "0 = Random": "0 = Τυχαία", + "Cache Directory": "Φάκελος κρυφής μνήμης", + "Clear Tmp Folder after closing app?": "Καθαρισμός του φακέλου προσωρινής αποθήκευσης μετά το κλείσιμο της εφαρμογής;", + "Database": "Βάση δεδομένων", + "Database Directory": "Φάκελος βάσης δεδομένων", + "Import Database": "Εισαγωγή βάσης δεδομένων", + "Export Database": "Εξαγωγή βάσης δεδομένων", + "Flush bookmarks database": "Εκκαθάριση βάσης δεδομένων αγαπημένων", + "Flush subtitles cache": "Εκκαθάριση κρυφής μνήμης υποτίτλων", + "Flush all databases": "Εκκαθάριση όλων των βάσεων δεδομένων", + "Reset to Default Settings": "Επαναφορά στις προεπιλεγμένες ρυθμίσεις", + "Importing Database...": "Γίνεται εισαγωγή βάσης δεδομένων...", + "Please wait": "Παρακαλώ περιμένετε", + "Error": "Σφάλμα", + "Biography": "Βιογραφία", + "Film-Noir": "Φιλμ νουάρ", + "History": "Ιστορία", + "Music": "Μουσική", + "Musical": "Μιούζικαλ", + "Sci-Fi": "Επιστημονική φαντασία", + "Short": "Μικρού μήκους", + "War": "Πόλεμος", + "Last Added": "Τελευταία προσθήκη", + "Rating": "Βαθμολογία", + "Open IMDb page": "Άνοιγμα σελίδας IMDb", + "Health false": "Υγεία ψευδής", + "Add to bookmarks": "Προσθήκη στα αγαπημένα", + "Watch Trailer": "Προβολή τρέιλερ", + "Watch Now": "Προβολή τώρα", + "Health Good": "Υγεία καλή", + "Ratio:": "Αναλογία:", + "Seeds:": "Τροφοδότες:", + "Peers:": "Αποδέκτες:", + "Remove from bookmarks": "Αφαίρεση από τα αγαπημένα", + "Changelog": "Αρχείο αλλαγών", + "Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.": "Το Popcorn Time είναι το αποτέλεσμα πολλών προγραμματιστών και σχεδιαστών που χρησιμοποίησαν αρκετά API για να γίνει η εμπειρία της προβολής ταινιών μέσω torrent όσο το δυνατόν απλούστερη.", + "We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.": "Είμαστε ένα έργο ανοικτού κώδικα. Είμαστε από όλο τον κόσμο. Αγαπάμε τις ταινίες μας. Και φυσικά.. αγαπάμε το ποπκόρν.", + "Invalid PCT Database File Selected": "Επιλέχθηκε μη έγκυρο αρχείο βάσης δεδομένων PCT", + "Health Unknown": "Υγεία άγνωστη", + "Episodes": "Επεισόδια", + "Episode %s": "Επεισόδιο %s", + "Aired Date": "Ημερομηνία πρώτης προβολής", + "Streaming to": "Αναπαραγωγή στο", + "connecting": "Γίνεται σύνδεση", + "Download": "Λήψη", + "Upload": "Αποστολή", + "Active Peers": "Ενεργοί αποδέκτες", + "Cancel": "Ακύρωση", + "startingDownload": "Εκκίνηση λήψης", + "downloading": "Γίνεται λήψη", + "ready": "Έτοιμο", + "playingExternally": "Γίνεται αναπαραγωγή εξωτερικά", + "Custom...": "Επιλογή...", + "Volume": "Ένταση", + "Ended": "Τελείωσε", + "Error loading data, try again later...": "Σφάλμα κατά την φόρτωση δεδομένων, δοκιμάστε αργότερα...", + "Miscellaneous": "Διάφορα", + "When opening TV Show Detail Jump to:": "Με το άνοιγμα πληροφοριών μιας τηλεοπτικής σειράς πήγαινε στο:", + "First Unwatched Episode": "Πρώτο επεισόδιο που δεν έχει προβληθεί", + "Next Episode In Series": "Επόμενο επεισόδιο της σειράς", + "When Opening TV Show Detail Jump To": "Με το άνοιγμα πληροφοριών μιας τηλεοπτικής σειράς πήγαινε στο", + "Flushing...": "Εκκαθάριση...", + "Are you sure?": "Είστε σίγουροι;", + "We are flushing your databases": "Γίνεται εκκαθάριση των βάσεων δεδομένων", + "Success": "Επιτυχής", + "Please restart your application": "Παρακαλώ επανεκκινήστε την εφαρμογή", + "Restart": "Επανεκκίνηση", + "Terms of Service": "Όροι Χρήσης", + "I Accept": "Αποδέχομαι", + "Leave": "Αποχώρηση", + "When Opening TV Series Detail Jump To": "Με το άνοιγμα πληροφοριών μιας τηλεοπτικής σειράς πήγαινε στο", + "Health Medium": "Υγεία μέτρια", + "Playback": "Αναπαραγωγή", + "Play next episode automatically": "Αυτόματη αναπαραγωγή επόμενου επεισοδίου", + "Generate Pairing QR code": "Δημιουργία QR κωδικού", + "Playing Next Episode in": "Αναπαραγωγή επόμενου επεισοδίου σε", + "Play": "Αναπαραγωγή", + "Dismiss": "Απόρριψη", + "waitingForSubtitles": "Αναμονή για υπότιτλους", + "Play Now": "Αναπαραγωγή τώρα", + "Seconds": "Δευτερόλεπτα", + "You are currently authenticated to Trakt.tv as": "Είστε συνδεδεμένοι στο Trakt.tv ως", + "You are currently connected to %s": "Είστε συνδεδεμένοι στο %s", + "Disconnect account": "Αποσύνδεση λογαριασμού", + "Sync With Trakt": "Συγχρονισμός με Trakt", + "Syncing...": "Γίνεται συγχρονισμός...", + "Done": "Ολοκληρώθηκε", + "Subtitles Offset": "Αντιστάθμιση υποτίτλων", + "secs": "δεύτερα", + "We are flushing your database": "Γίνεται εκκαθάριση της βάσης δεδομένων σας", + "We are rebuilding the TV Show Database. Do not close the application.": "Γίνετε αναδιοργάνωση της βάσης δεδομένων τηλεοπτικών σειρών. Μην κλείσετε την εφαρμογή.", + "No shows found...": "Δεν βρέθηκαν σειρές...", + "No Favorites found...": "Δεν βρέθηκαν αγαπημένα...", + "Rebuild TV Shows Database": "Αναδιοργάνωση βάσης δεδομένων τηλεοπτικών σειρών", + "No movies found...": "Δεν βρέθηκαν ταινίες...", + "Ratio": "Αναλογία", + "Health Excellent": "Υγεία άριστη", + "Health Bad": "Υγεία κακή", + "Status: Creating Database...": "Κατάσταση: Δημιουργία βάσης δεδομένων...", + "Status: Updating database...": "Κατάσταση: Ανανέωση βάσης δεδομένων...", + "Status: Skipping synchronization TTL not met": "Κατάσταση: Παράλειψη συγχρονισμού TTL αδύνατη", + "Advanced Settings": "Προχωρημένες ρυθμίσεις", + "Clear Cache directory after closing app?": "Καθαρισμός του φακέλου κρυφής μνήμης μετά το κλείσιμο της εφαρμογής;", + "Tmp Folder": "Φάκελος προσωρινής αποθήκευσης", + "Status: Downloading API archive...": "Κατάσταση: Γίνεται λήψη αρχείου API...", + "Status: Archive downloaded successfully...": "Κατάσταση: Επιτυχής λήψη αρχείου...", + "Status: Importing file": "Κατάσταση: Γίνεται εισαγωγή αρχείου", + "Status: Imported successfully": "Κατάσταση: Επιτυχής εισαγωγή", + "Status: Launching applicaion... ": "Κατάσταση: Εκκίνηση εφαρμογής...", + "URL of this stream was copied to the clipboard": "Το URL της ροής αντιγράφηκε στο πρόχειρο", + "Error, database is probably corrupted. Try flushing the bookmarks in settings.": "Σφάλμα, η βάση δεδομένων είναι πιθανότατα κατεστραμμένη. Προσπαθήστε να εκκαθαρίσετε τα αγαπημένα στις ρυθμίσεις.", + "Flushing bookmarks...": "Γίνεται εκκαθάριση των αγαπημένων...", + "Resetting...": "Γίνεται επαναφορά...", + "We are resetting the settings": "Γίνεται επαναφορά των ρυθμίσεων", + "New version downloaded": "Έγινε λήψη νέας έκδοσης", + "Installed": "Εγκαταστάθηκε", + "Install Now": "Εγκατάσταση τώρα", + "Restart Now": "Επανεκκίνηση τώρα", + "We are flushing your subtitle cache": "Γίνεται εκκαθάριση της κρυφής μνήμης υποτίτλων", + "Subtitle cache deleted": "Έγινε εκκαθάριση της κρυφής μνήμης υποτίτλων", + "Please select a file to play": "Παρακαλώ επιλέξτε ένα αρχείο για αναπαραγωγή", + "Test Login": "Δοκιμή σύνδεσης", + "Testing...": "Γίνεται δοκιμή...", + "Success!": "Επιτυχής!", + "Failed!": "Αποτυχία!", + "Global shortcuts": "Γενικές συντομεύσεις", + "Video Player": "Πρόγραμμα αναπαραγωγής βίντεο", + "Toggle Fullscreen": "Εναλλαγή πλήρης οθόνης", + "Play/Pause": "Αναπαραγωγή/Πάυση", + "Seek Forward": "Μπροστά", + "Increase Volume": "Αύξηση έντασης", + "Set Volume to": "Ρύθμιση έντασης στο", + "Offset Subtitles by": "Αντιστάθμιση υποτίτλων κατά", + "Toggle Mute": "Εναλλαγή σίγασης", + "Movie Detail": "Πληροφορίες ταινίας", + "Toggle Quality": "Εναλλαγή ποιότητας", + "Play Movie": "Αναπαραγωγή ταινίας", + "Exit Fullscreen": "Έξοδος πλήρης οθόνης", + "Seek Backward": "Πίσω", + "Decrease Volume": "Μέιωση έντασης", + "Show Stream URL": "Εμφάνιση URL ροής", + "TV Show Detail": "Λεπτομέριες τηλεοπτικής σειράς", + "Toggle Watched": "Εναλλαγή προβληθέν", + "Select Next Episode": "Επιλογή επόμενου επισοδίου", + "Select Previous Episode": "Επιλογή προηγούμενου επεισοδίου", + "Select Next Season": "Επιλογή επόμενου κύκλου", + "Select Previous Season": "Επιλογή προηγούμενου κύκλου", + "Play Episode": "Αναπαραγωγή επεισοδίου", + "space": "space", + "shift": "shift", + "ctrl": "ctrl", + "enter": "enter", + "esc": "esc", + "Keyboard Shortcuts": "Συντομεύσεις πληκτρολογίου", + "Cut": "Αποκοπή", + "Copy": "Αντιγραφή", + "Paste": "Επικόλληση", + "Help Section": "Βοήθεια", + "Did you know?": "Το ξέρατε;", + "What does Popcorn Time offer?": "Τι προσφέρει το Popcorn Time;", + "With Popcorn Time, you can watch Movies and TV Series really easily. All you have to do is click on one of the covers, then click 'Watch Now'. But your experience is highly customizable:": "Με το Popcorn Time, μπορείτε να παρακολουθήσετε ταινίες και τηλεοπτικές σειρές πραγματικά εύκολα. Το μόνο που έχετε να κάνετε είναι να κάνετε κλικ σε ένα από τα εξώφυλλα και στη συνέχεια κλικ στη «Προβολή τώρα». Η εμπειρία σας όμως είναι υψηλά παραμετροποιήσιμη:", + "Our Movies collection only contains High-Definition movies, available in 720p and 1080p. To watch a movie, simply open Popcorn Time and navigate through the movies collection, reachable through the 'Movies' tab, in the navigation bar. The default view will show you all movies sorted by popularity, but you can apply your own filters, thanks to the 'Genre' and 'Sort by' filters. Once you have chosen a movie you want to watch, click its cover. Then click 'Watch Now'. Don't forget the popcorn!": "Η συλλογή ταινιών μας περιέχει μόνο ταινίες υψηλής ευκρίνειας, διαθέσιμες σε 720p και 1080p. Για να παρακολουθήσετε μια ταινία, απλά ανοίξτε το Popcorn Τime και περιηγηθείτε στη συλλογή ταινιών, προσβάσιμη από την καρτέλα «Ταινίες», στη γραμμή πλοήγησης. Η προεπιλεγμένη προβολή θα σας εμφανίσει όλες τις ταινίες ταξινομημένες κατά δημοτικότητα, αλλά μπορείτε να εφαρμόσετε τα δικά σας φίλτρα, χάρη στα φίλτρα «Είδος» και «Ταξινόμηση». Αφού έχετε επιλέξει μια ταινία που θέλετε να παρακολουθήσετε, κάντε κλικ στο εξώφυλλο του. Στη συνέχεια, κάντε κλικ στην επιλογή «Προβολή τώρα». Μη ξεχάσετε το ποπκόρν!", + "The TV Series tab, that you can reach by clicking 'TV Series' in the navigation bar, will show you all available series in our collection. You can also apply your own filters, same as the Movies, to help you decide what to watch. In this collection, also just click the cover: the new window that will appear will allow you to navigate through Seasons and Episodes. Once your mind is set, just click the 'Watch Now' button.": "Η καρτέλα των τηλεοπτικών σειρών, που μπορείτε να επισκεφθείτε κάνοντας κλικ στην επιλογή «Τηλεοπτικές σειρές» στη γραμμή πλοήγησης, θα σας εμφανίσει όλες τις διαθέσιμες σειρές στη συλλογή μας. Μπορείτε επίσης να εφαρμόσετε τα δικά σας φίλτρα, όπως στις ταινίες, για να σας βοηθήσουν να αποφασίσετε τι θα δείτε. Σε αυτή τη συλλογή, επίσης, απλά κάντε κλικ στο εξώφυλλο: το νέο παράθυρο που θα εμφανιστεί, θα σας επιτρέψει να πλοηγηθείτε σε κύκλους και επεισόδια. Όταν αποφασίσετε τι θέλετε να παρακολουθήσετε, απλά κάντε κλικ στο κουμπί «Προβολή τώρα».", + "Choose quality": "Επιλογή ποιότητας", + "A slider next to the 'Watch Now' button will let you choose the quality of the stream. You can also set a fixed quality in the Settings tab. Warning: a better quality equals more data to download.": "Ένας δρομέας δίπλα από το κουμπί «Προβολή τώρα» θα σας επιτρέψει να επιλέξετε την ποιότητα της ροής. Μπορείτε επίσης να ορίσετε μια σταθερή ποιότητα στην καρτέλα ρυθμίσεων. Προειδοποίηση: μια καλύτερη ποιότητα σημαίνει περισσότερα δεδομένα για λήψη.", + "Most of our Movies and TV Series have subtitles in your language. You can set them in the Settings tab. For the Movies, you can even set them through the dropdown menu, in the Movie Details page.": "Οι περισσότερες από τις ταινίες και τηλεοπτικές σειρές μας έχουν υπότιτλους στη γλώσσα σας. Μπορείτε να τους ορίσετε στην καρτέλα «Ρυθμίσεις». Για τις ταινίες, μπορείτε να τους ορίσετε ακόμη και από το αναπτυσσόμενο μενού, στη σελίδα λεπτομερειών της ταινίας.", + "Clicking the heart icon on a cover will add the movie/show to your favorites. This collection is reachable through the heart-shaped icon, in the navigation bar. To remove an item from your collection, just click on the icon again! How simple is that?": "Κάνοντας κλικ στο εικονίδιο της καρδιάς σε ένα εξώφυλλο θα προσθέσει την ταινία/σειρά στα αγαπημένα σας. Αυτή η συλλογή είναι προσβάσιμη μέσω του εικονιδίου σε σχήμα καρδιάς, στη γραμμή πλοήγησης. Για να αφαιρέσετε ένα στοιχείο από τη συλλογή σας, απλά κάντε κλικ στο εικονίδιο πάλι! Πόσο απλό είναι αυτό;", + "Watched icon": "Εικονίδιο προβολής", + "Popcorn Time will keep in mind what you've already watched - a little help remembering doesn't cause any harm. You can also set an item as watched by clicking the eye-shaped icon on the covers. You can even build and synchronize your collection with Trakt.tv website, via the Settings tab.": "Το Popcorn Time θα θυμάται τι έχετε ήδη παρακολουθήσει - μια μικρή βοήθεια για να θυμόμαστε δεν πειράζει. Μπορείτε επίσης να ορίσετε ένα στοιχείο ως προβληθέν κάνοντας κλικ στο εικονίδιο σε σχήμα ματιού. Μπορείτε ακόμα να δημιουργήσετε και να συγχρονίσετε τη συλλογή σας με την ιστοσελίδα Trakt.tv, μέσω της καρτέλας «Ρυθμίσεις».", + "In Popcorn Time, you can use the magnifier icon to open the search. Type a Title, an Actor, a Director or even a Year, press 'Enter' and let us show you what we can offer to fill your needs. To close your current search, you can click on the 'X' located next to your entry or type something else in the field.": "Στο Popcorn Time, μπορείτε να χρησιμοποιήσετε το εικονίδιο μεγεθυντικού φακού για να ανοίξετε την αναζήτηση. Πληκτρολογήστε έναν τίτλο, ηθοποιό, σκηνοθέτη ή ακόμα και μια χρονολογία, πατήστε το πλήκτρο «Enter» και αφήστε μας να σας δείξουμε τι μπορούμε να προσφέρουμε για να καλύψουμε τις ανάγκες σας. Για να κλείσετε την τρέχουσα αναζήτησή σας, μπορείτε να κάνετε κλικ στο «X» που βρίσκεται δίπλα από το πεδίο αναζήτησης ή να πληκτρολογήστε κάτι άλλο.", + "External Players": "Εξωτερικά προγράμματα αναπαραγωγής πολυμέσων", + "If you prefer to use a custom player instead of the built in one, you can do so by clicking the allocated icon on the 'Watch Now' button. A list of your installed players will be shown, select one and Popcorn Time will send everything to it. If your player isn't on the list, please report it to us.": "Αν προτιμάτε τη χρήση ενός εξωτερικού προγράμματος αναπαραγωγής πολυμέσων αντί του ενσωματωμένου, μπορείτε να το κάνετε πατώντας το εικονίδιο που βρίσκεται δίπλα από το κουμπί «Προβολή τώρα». Μία λίστα με τα εγκατεστημένα προγράμματα αναπαραγωγής πολυμέσων σας θα εμφανιστεί, επιλέξτε ένα και το Popcorn Time θα στείλει τα πάντα σε αυτό. Εάν το πρόγραμμα αναπαραγωγής πολυμέσων σας δεν είναι στη λίστα, παρακαλούμε να μας το αναφέρετε.", + "To push the customization even further, we offer you a large panel of options. To access the Settings, click the wheel-shaped icon in the navigation bar.": "Για να προσαρμόσετε την εφαρμογή ακόμη περισσότερο, σας προσφέρουμε ένα μεγάλο πίνακα επιλογών. Για να ανοίξετε τις «Ρυθμίσεις», κάντε κλικ στο εικονίδιο σε σχήμα γραναζιού από τη γραμμή πλοήγησης.", + "Keyboard Navigation": "Πλοήγηση με το πληκτρολόγιο", + "The entire list of keyboard shortcuts is available by pressing '?' on your keyboard, or through the keyboard-shaped icon in the Settings tab.": "Ολόκληρη η λίστα των συντομεύσεων πληκτρολογίου είναι διαθέσιμη πατώντας «?» στο πληκτρολόγιό σας, ή μέσω του εικονιδίου με σχήμα πληκτρολογίου στην καρτέλα «Ρυθμίσεις».", + "Custom Torrents and Magnet Links": "Προσαρμοσμένα torrent και σύνδεσμοι magnet", + "You can use custom torrents and magnets links in Popcorn Time. Simply drag and drop .torrent files into the application's window, and/or paste any magnet link.": "Μπορείτε να χρησιμοποιήσετε προσαρμοσμένα torrents και συνδέσμους magnet στο Popcorn Time. Απλά σύρετε και πετάξτε τα αρχεία με κατάληξη .torrent στο παράθυρο της εφαρμογής, και/ή κάντε επικόλληση ενός συνδέσμου magnet.", + "Torrent health": "Υγεία torrent", + "On the details of Movies/TV Series, you can find a little circle, colored in grey, red, yellow or green. Those colors refer to the health of the torrent. A green torrent will be downloaded quickly, while a red torrent may not be downloaded at all, or very slowly. The color grey represents an error in the health calculation for Movies, and needs to be clicked in TV Series in order to display the health.": "Στις λεπτομέρειες ταινιών/τηλεοπτικών σειρών, μπορείτε να βρείτε ένα μικρό κύκλο, χρωματισμένο με γκρι, κόκκινο, κίτρινο ή πράσινο. Τα χρώματα αυτά αναφέρονται στην υγεία του torrent. Ένα πράσινο torrent θα κατέβει γρήγορα, ενώ ένα κόκκινο torrent μπορεί να μην κατέβει καθόλου, ή πολύ αργά. Το γκρι χρώμα αντιπροσωπεύει ένα σφάλμα στον υπολογισμό της υγείας για τις ταινίες και θα πρέπει να κάνετε κλικ πάνω του για να εμφανίσετε την υγεία στις τηλεοπτικές σειρές.", + "How does Popcorn Time work?": "Πως δουλεύει το Popcorn Time;", + "Popcorn Time streams video content through torrents. Our movies are provided by %s and our TV Series by %s, while getting all metadata from %s. We don't host any content ourselves.": "Το Popcorn Time δουλεύει μέσω περιεχομένων βίντεου torrents. Οι ταινίες παρέχονται από το %s και οι τηλεοπτικές σειρές από το %s, ενώ όλες οι πληροφορίες από το %s. Εμείς δεν φιλοξενούμε κάποιο περιεχόμενο τους.", + "Torrent streaming? Well, torrents use Bittorrent protocol, which basically means that you download small parts of the content from another user's computer, while sending the parts you already downloaded to another user. Then, you watch those parts, while the next ones are being downloaded in the background. This exchange allows the content to stay healthy.": "Torrent streaming; Τα torrents χρησιμοποιούν το πρωτόκολλο Bittorrent, το οποίο ουσιαστικά σημαίνει ότι μπορείτε να κατεβάσετε μικρά τμήματα του περιεχομένου από τον υπολογιστή κάποιου άλλου χρήστη, ενώ στέλνετε τα τμήματα που έχετε ήδη λάβει σε άλλο χρήστη. Στη συνέχεια, μπορείτε να προβάλετε αυτά τα τμήματα, ενώ τα επόμενα λαμβάνονται στο παρασκήνιο. Αυτή η ανταλλαγή επιτρέπει το περιεχόμενο να παραμένει υγιές.", + "Once the movie is fully downloaded, you continue to send parts to the other users. And everything is deleted from your computer when you close Popcorn Time. As simple as that.": "Όταν η ταινία έχει ληφθεί πλήρως, συνεχίζετε να στέλνετε κομμάτια στους άλλους χρήστες και όλα διαγράφονται από τον υπολογιστή σας όταν κλείσετε το Popcorn Time. Τόσο απλό είναι.", + "The application itself is built with Node-Webkit, HTML, CSS and Javascript. It works like the Google Chrome browser, except that you host the biggest part of the code on your computer. Yes, Popcorn Time works on the same technology as a regular website, like... let's say Wikipedia, or Youtube!": "Η εφαρμογή είναι κατασκευασμένη με Node-Webkit, HTML, CSS και Javascript. Λειτουργεί όπως τον περιηγητή Google Chrome, με την εξαίρεση ότι το μεγαλύτερο μέρος του κώδικα φιλοξενείται στον υπολογιστή σας. Ναι, το Popcorn Time λειτουργεί με την ίδια τεχνολογία όπως μια κανονική ιστοσελίδα, όπως ... ας πούμε η Wikipedia, ή το YouTube!", + "I found a bug, how do I report it?": "Βρήκα ένα bug, πώς μπορώ να το αναφέρω;", + "No historics found...": "Δεν βρέθηκε ιστορικό...", + "Error, database is probably corrupted. Try flushing the history in settings.": "Σφάλμα, η βάση δεδομένων είναι πιθανότατα κατεστραμμένη. Προσπαθήστε να εκκαθαρίσετε το ιστορικό στις ρυθμίσεις.", + "You can paste magnet links anywhere in Popcorn Time with CTRL+V.": "Μπορείτε να επικολλήσετε συνδέσμους magnet οπουδήποτε μέσα στο Popcorn Time με CTRL+V.", + "You can drag & drop a .torrent file into Popcorn Time.": "Μπορείτε να σύρετε & να ρίξετε ένα αρχείο .torrent μέσα στο Popcorn Time.", + "The Popcorn Time project started in February 2014 and has already had 150 people that contributed more than 3000 times to it's development in August 2014.": "Το έργο Popcorn Time ξεκίνησε το Φεβρουάριο του 2014 και έχει ήδη 150 άτομα, τα οποία συνέβαλαν περισσότερο από 3000 φορές στην ανάπτυξή του τον Αύγουστο του 2014.", + "The rule n°10 applies here.": "Ο κανόνας n°10 ισχύει εδώ.", + "If a subtitle for a TV series is missing, you can add it on %s. And the same way for a movie, but on %s.": "Αν δεν υπάρχουν υπότιτλοι για μία σειρά, μπορείτε να τους ανεβάσετε στο %s. Το ίδιο ισχύει και για τις ταινίες, αλλά στο %s.", + "If you're experiencing connection drop issues, try to reduce the DHT Limit in settings.": "Αν αντιμετωπίζετε προβλήματα με πτώση σύνδεσης, δοκιμάστε να μειώστε το όριο DHT στις ρυθμίσεις.", + "If you search \"1998\", you can see all the movies or TV series that came out that year.": "Αν κάνετε την αναζήτηση «1998», θα δείτε όλες τις ταινίες ή τηλεοπτικές σειρές που βγήκαν εκείνη τη χρονιά.", + "You can login to Trakt.tv to save all your watched items, and synchronize them across multiple devices.": "Μπορείτε να συνδεθείτε στο Trakt.tv για να αποθηκεύσετε όλα όσα έχετε παρακολουθήσει στο Popcorn Time και να τα συγχρονίσετε σε πολλαπλές συσκευές.", + "Clicking on the rating stars will display a number instead.": "Κάνοντας κλικ στα αστέρια βαθμολογίας θα εμφανιστεί ένας αριθμός αντ' αυτών.", + "This application is entirely written in HTML5, CSS3 and Javascript.": "Η εφαρμογή αυτή είναι εξολοκλήρου γραμμένη σε HTML5, CSS3 και Javascript.", + "You can find out more about a movie or a TV series? Just click the IMDb icon.": "Θέλετε να μάθετε περισσότερα για μία ταινία ή μία τηλεοπτική σειρά; Απλά κάντε κλικ στο εικονίδιο του IMDb.", + "Clicking twice on a \"Sort By\" filter reverses the order of the list.": "Κάνοντας κλικ δύο φορές στο φίλτρο «Ταξινόμηση κατά» αντιστρέφει τη σειρά της λίστας", + "Switch to next tab": "Μετάβαση στην επόμενη καρτέλα", + "Switch to previous tab": "Μετάβαση στην προηγούμενη καρτέλα", + "Switch to corresponding tab": "Μετάβαση στην αντίστοιχη καρτέλα", + "through": "μέχρι", + "Enlarge Covers": "Μεγέθυνση των εξώφυλλων", + "Reduce Covers": "Σμίκρυνση των εξώφυλλων", + "Open the Help Section": "Άνοιγμα βοήθειας", + "Open Item Details": "Άνοιγμα πληροφοριών στοιχείου", + "Add Item to Favorites": "Προσθήκη στοιχείου στα αγαπημένα", + "Mark as Seen": "Επισήμανση ως προβληθέν", + "Open this screen": "Άνοιγμα αυτής της οθόνης", + "Open Settings": "Άνοιγμα ρυθμίσεων", + "Posters Size": "Μέγεθος εξώφυλλων", + "This feature only works if you have your TraktTv account synced. Please go to Settings and enter your credentials.": "Αυτό το χαρακτηριστικό λειτουργεί μόνο αν έχετε συγχρονίσει το λογαριασμό του TraktTv σας. Παρακαλώ πηγαίνετε στις Ρυθμίσεις και εισάγετε τα στοιχεία σας.", + "Last Open": "Τελευταία ανοιχτό", + "Exporting Database...": "Γίνεται εξαγωγή βάσης δεδομένων...", + "Database Successfully Exported": "Επιτυχής εξαγωγή βάσης δεδομένων", + "Display": "Οθόνη", + "TV": "Τηλεοπτικά", + "Type": "Τύπος", + "popularity": "δημοτικότητα", + "date": "ημερομηνία", + "year": "χρονολογία", + "rating": "βαθμολογία", + "updated": "ενημερωμένα", + "name": "όνομα", + "OVA": "OVA", + "ONA": "ONA", + "No anime found...": "Δεν βρέθηκε άνιμε...", + "Movie": "Ταινία", + "Special": "Ειδικό", + "No Watchlist found...": "Δεν βρέθηκε λίστα παρακολούθησης...", + "Watchlist": "Λίστα παρακολούθησης", + "Resolving..": "Επίλυση..", + "About": "Σχετικά", + "Open Cache Directory": "Άνοιγμα φακέλου κρυφής μνήμης", + "Open Database Directory": "Άνοιγμα φακέλου βάσης δεδομένων", + "Mark as unseen": "Επισήμανση ως μη προβληθέν", + "Playback rate": "Ρυθμός αναπαραγωγής", + "Increase playback rate by %s": "Άυξηση του ρυθμού αναπαραγωγής κατά %s", + "Decrease playback rate by %s": "Μείωση του ρυθμού αναπαραγωγής κατά %s", + "Set playback rate to %s": "Ορισμός του ρυθμού αναπαραγωγής στο %s", + "Playback rate adjustment is not available for this video!": "Η προσαρμογή του ρυθμού αναπαραγωγής δεν είναι διαθέσιμη για αυτό το βίντεο!", + "Color": "Χρώμα", + "With Shadows": "Με σκιές", + "Local IP Address": "Τοπική διεύθυνση IP", + "Japan": "Ιαπωνία", + "Cars": "Αυτοκίνητα", + "Dementia": "Dementia", + "Demons": "Δαίμονες", + "Ecchi": "Ecchi", + "Game": "Παιχνίδι", + "Harem": "Χάρεμ", + "Historical": "Ιστορικά", + "Josei": "Τζοσέι", + "Kids": "Παιδικά", + "Magic": "Μαγεία", + "Martial Arts": "Πολεμικές τέχνες", + "Mecha": "Μέκα", + "Military": "Στρατός", + "Parody": "Παρωδία", + "Police": "Αστυνομία", + "Psychological": "Ψυχολογικά", + "Samurai": "Σαμουράι", + "School": "Σχολείο", + "Seinen": "Σέινεν", + "Shoujo": "Σότζο", + "Shoujo Ai": "Σότζο άι", + "Shounen": "Σόνεν", + "Shounen Ai": "Σόνεν άι", + "Slice Of Life": "Slice of Life", + "Slice of Life": "Slice of life", + "Space": "Διάστημα", + "Sports": "Αθλήματα", + "Super Power": "Υπερδυνάμεις", + "Supernatural": "Υπερφυσικά", + "Vampire": "Βρυκόλακες", + "Alphabet": "Αλφαβητικά", + "Automatically Sync on Start": "Αυτόματος συγχρονισμός κατά την εκκίνηση", + "Setup VPN": "Ρύθμιση VPN", + "VPN": "VPN", + "Install VPN Client": "Εγκατάσταση VPN client", + "More Details": "Περισσότερες πληροφορίες", + "Don't show me this VPN option anymore": "Απόκρυψη αυτής της επιλογής VPN πλέον", + "Activate automatic updating": "Ενεργοποίηση αυτόματης αναβάθμισης", + "We are installing VPN client": "Γίνεται εγκατάσταση του VPN client", + "VPN Client Installed": "Ο VPN client εγκαταστάθηκε", + "Please wait...": "Παρακαλώ περιμένετε...", + "VPN.ht client is installed": "Ο VPN.ht client είναι εγκατεστημένος", + "Install again": "Επανάληψη εγκατάστασης", + "Connect": "Σύνδεση", + "Create Account": "Δημιουργία λογαριασμού", + "Please, allow ~ 1 minute": "Παρακαλώ, περιμένετε ~ 1 λεπτό", + "Status: Connecting to VPN...": "Κατάσταση: Γίνεται σύνδεση στο VPN...", + "Status: Monitoring connexion - ": "Κατάσταση: Παρακολούθηση σύνδεσης -", + "Connect VPN": "Σύνδεση VPN", + "Disconnect VPN": "Αποσύνδεση VPN", + "Celebrate various events": "Εορτασμός διαφόρων εκδηλώσεων", + "ATTENTION! We need admin access to run this command.": "ΠΡΟΣΟΧΗ! Χρειαζόμαστε πρόσβαση ως διαχειριστής για την εκτέλεση αυτής της εντολής.", + "Your password is not saved": "Ο κωδικός σας δεν είναι αποθηκευμένος", + "Enter sudo password :": "Εισαγωγή κωδικού sudo :", + "Status: Monitoring connection": "Κατάσταση: Παρακολούθηση σύνδεσης", + "Status: Connected": "Κατάσταση: Συνδεδεμένος", + "Secure connection": "Ασφαλής σύνδεση", + "Your IP:": "Η IP σας:", + "Disconnect": "Αποσύνδεση", + "Downloaded": "Έγινε λήψη", + "Loading stuck ? Click here !": "Κόλλησε στην αναμονή; Κάντε κλικ εδώ!", + "Torrent Collection": "Συλλογή torrent", + "Drop Magnet or .torrent": "Εισάγετε magnet ή .torrent", + "Remove this torrent": "Αφαίρεση του torrent", + "Rename this torrent": "Μετονομασία του torrent", + "Flush entire collection": "Εκκαθάριση όλης της συλλογής", + "Open Collection Directory": "Άνοιγμα φακέλου συλλογής", + "Store this torrent": "Αποθήκευση του torrent", + "Enter new name": "Εισαγωγή νέου ονόματος", + "This name is already taken": "Το όνομα αυτό υπάρχει ήδη", + "Always start playing in fullscreen": "Να γίνεται πάντα έναρξη αναπαραγωγής σε πλήρη οθόνη", + "Allow torrents to be stored for further use": "Να επιτρέπεται η αποθήκευση των torrent για μελλοντική χρήση", + "Hide VPN from the filter bar": "Απόκρυψη VPN από τη γραμμή φίλτρων", + "Magnet link": "Σύνδεσμος magnet", + "Error resolving torrent.": "Σφάλμα με την επίλυση του torrent", + "%s hour(s) remaining": "%s ώρες απομένουν", + "%s minute(s) remaining": "%s λεπτά απομένουν", + "%s second(s) remaining": "%s δευτερόλεπτα απομένουν", + "Unknown time remaining": "Απομένει άγνωστος χρόνος", + "Set player window to video resolution": "Ορισμός του παραθύρου αναπαραγωγής στην ανάλυση του βίντεο", + "Set player window to double of video resolution": "Ορισμός του παραθύρου αναπαραγωγής στο διπλάσιο της ανάλυσης του βίντεο", + "Set player window to half of video resolution": "Ορισμός του παραθύρου αναπαραγωγής στο μισό της ανάλυσης του βίντεο", + "Retry": "Δοκιμάστε ξανά", + "Import a Torrent": "Εισαγωγή torrent", + "The remote movies API failed to respond, please check %s and try again later": "Το απομακρυσμένο API ταινιών απέτυχε να ανταποκριθεί, παρακαλώ ελέγξτε το %s και δοκιμάστε ξανά αργότερα", + "The remote shows API failed to respond, please check %s and try again later": "Το απομακρυσμένο API σειρών απέτυχε να ανταποκριθεί, παρακαλώ ελέγξτε το %s και δοκιμάστε ξανά αργότερα", + "The remote anime API failed to respond, please check %s and try again later": "Το απομακρυσμένο API άνιμε απέτυχε να ανταποκριθεί, παρακαλώ ελέγξτε το %s και δοκιμάστε ξανά αργότερα", + "Not Seen": "Δεν έχει προβληθεί", + "Seen": "Έχει προβληθεί", + "Title": "Τίτλο", + "The video playback encountered an issue. Please try an external player like %s to view this content.": "Υπήρξε σφάλμα με την αναπαραγωγή του βίντεο. Παρακαλώ δοκιμάστε ένα εξωτερικό πρόγραμμα αναπαραγωγής πολυμέσων όπως το %s για να δείτε το περιεχόμενο αυτό.", + "Font": "Γραμματοσειρά", + "Decoration": "Διακόσμηση", + "None": "Καμία", + "Outline": "Περίγραμμα", + "Opaque Background": "Αδιαφανές φόντο", + "No thank you": "Όχι, ευχαριστώ", + "Report an issue": "Αναφορά προβλήματος", + "Log in into your GitLab account": "Συνδεθείτε στον GitLab λογαριασμό σας", + "Email": "Email", + "Log in": "Σύνδεση", + "Report anonymously": "Αναφορά ανώνυμα", + "Note regarding anonymous reports:": "Σημείωση περί ανώνυμων αναφορών:", + "You will not be able to edit or delete your report once sent.": "Δεν θα μπορείτε να επεξεργαστείτε ή να διαγράψετε την αναφορά σας αφού σταλεί.", + "If any additionnal information is required, the report might be closed, as you won't be able to provide them.": "Αν απαιτούνται επιπλέον πληροφορίες, η αναφορά μπορεί να κλείσει, αφού δεν θα μπορείτε να τις δώσετε.", + "Step 1: Please look if the issue was already reported": "Βήμα 1: Παρακαλώ κοιτάξτε αν το πρόβλημα έχει ήδη αναφερθεί", + "Enter keywords": "Εισαγωγή λέξεων-κλειδιών", + "Already reported": "Έχει ήδη αναφερθεί", + "I want to report a new issue": "Θέλω να αναφέρω ένα νέο πρόβλημα", + "Step 2: Report a new issue": "Βήμα 2: Αναφορά νέου προβλήματος", + "Note: please don't use this form to contact us. It is limited to bug reports only.": "Σημείωση: παρακαλώ μη χρησιμοποιείτε την φόρμα αυτή για να επικοινωνήσετε μαζί μας. Ο μοναδικός σκοπός της είναι για την αναφορά προβλημάτων.", + "The title of the issue": "Ο τίτλος του προβλήματος", + "Description": "Περιγραφή", + "200 characters minimum": "200 χαρακτήρες το ελάχιστο", + "A short description of the issue. If suitable, include the steps required to reproduce the bug.": "Μια μικρή περιγραφή του προβλήματος. Αν γίνεται, συμπεριλάβετε τα βήματα που απαιτούνται για την αναπαραγωγή του.", + "Submit": "Υποβολή", + "Step 3: Thank you !": "Βήμα 3: Ευχαριστούμε!", + "Your issue has been reported.": "Το πρόβλημα σας έχει αναφερθεί.", + "Open in your browser": "Άνοιγμα στον περιηγητή σας", + "No issues found...": "Δεν βρέθηκαν προβλήματα...", + "First method": "Πρώτη μέθοδος", + "Use the in-app reporter": "Χρήση της εσωτερικής φόρμα αναφοράς", + "You can find it later on the About page": "Μπορείτε να τη βρείτε αργότερα στη σελίδα «Σχετικά»", + "Second method": "Δεύτερη μέθοδος", + "You can create an account on our %s repository, and click on %s.": "Μπορείτε να δημιουργήσετε έναν λογαριασμό στο %s αποθετήριο μας και να κάνετε κλικ %s.", + "Use the %s issue filter to search and check if the issue has already been reported or is already fixed.": "Χρησιμοποιήστε το φίλτρο προβλήματος του %s για να αναζητήσετε και να ελέγξετε αν το πρόβλημα έχει αναφερθεί ή επιδιορθωθεί ήδη.", + "Include a screenshot if relevant - Is your issue about a design feature or a bug?": "Συμπεριλάβετε ένα στιγμιότυπο οθόνης αν είναι σχετικό - Είναι το πρόβλημα σας για ένα σχεδιαστικό χαρακτηριστικό ή για ένα bug;", + "A good bug report shouldn't leave others needing to chase you up for more information. Be sure to include the details of your environment.": "Μια καλή αναφορά προβλήματος δεν θα πρέπει να αφήνει άλλους να πρέπει να σας κυνηγάνε για περισσότερες πληροφορίες. Σιγουρευτείτε ότι συμπεριλάβατε τις λεπτομέρειες του περιβάλλοντος σας.", + "Warning: Always use English when contacting us, or we might not understand you.": "Προειδοποίηση: Πάντα χρησιμοποιείτε την αγγλική γλώσσα όταν επικοινωνείτε μαζί μας, αλλιώς μπορεί να μην σας καταλάβουμε.", + "Search on %s": "Αναζήτηση για %s", + "No results found": "Δεν βρέθηκαν αποτελέσματα", + "Invalid credentials": "Λάθος διαπιστευτήρια", + "Open Favorites": "Άνοιγμα αγαπημένων", + "Open About": "Άνοιγμα σελίδας περί", + "Minimize to Tray": "Ελαχιστοποίηση στην περιοχή ειδοποιήσεων", + "Close": "Κλείσιμο", + "Restore": "Επαναφορά", + "Resume Playback": "Συνέχιση αναπαραγωγής", + "Features": "Χαρακτηριστικά", + "Connect To %s": "Σύνδεση στο %s", + "The magnet link was copied to the clipboard": "Ο σύνδεσμος magnet αντιγράφηκε στο πρόχειρο", + "Big Picture Mode": "Λειτουργία μεγάλης οθόνης", + "Big Picture Mode is unavailable on your current screen resolution": "Η λειτουργία μεγάλης οθόνης δεν είναι διαθέσιμη στην τρέχουσα ανάλυση οθόνης σας.", + "Cannot be stored": "Δεν είναι δυνατή η αποθήκευση ", + "%s reported this torrent as fake": "Το %s ανέφερε αυτό το torrent ως ψεύτικο", + "%s could not verify this torrent": "Το %s δεν μπόρεσε να επαληθεύσει αυτό το torrent", + "Randomize": "Τυχαιοποίηση", + "Randomize Button for Movies": "Κουμπί τυχαιοποίησης για ταινίες", + "Overall Ratio": "Συνολική αναλογία", + "Translate Synopsis": "Μετάφραση περίληψης", + "Returning Series": "Σειρά που επιστρέφει", + "In Production": "Σε παραγωγή", + "Canceled": "Ακυρωμένη", + "N/A": "Δ/Υ", + "%s is not supposed to be run as administrator": "Το %s δεν θα πρέπει να εκτελείται ως διαχειριστής", + "Your disk is almost full.": "Ο δίσκος σας είναι σχεδόν πλήρης", + "You need to make more space available on your disk by deleting files.": "Πρέπει να κάνετε περισσότερο χώρο διαθέσιμο στον δίσκο σας διαγράφοντας αρχεία.", + "Playing Next": "Στη συνέχεια", + "Trending": "Τάσεις", + "Downloads": "Downloads", + "Likes": "Likes", + "Movie Search": "Movie Search", + "This feature has a built-in kat.cr search, which allows you to stream any movies, series or anime torrents with automatic subtitle support. The casting option integrates features including Chromecast, Airplay and DLNA. This library also provides an Anti-Virus Scanner and a 'History' feature, that keeps track of all your downloaded KAT torrents": "This feature has a built-in kat.cr search, which allows you to stream any movies, series or anime torrents with automatic subtitle support. The casting option integrates features including Chromecast, Airplay and DLNA. This library also provides an Anti-Virus Scanner and a 'History' feature, that keeps track of all your downloaded KAT torrents", + "Plugins": "Plugins", + "OpenSubtitles Username": "OpenSubtitles Username", + "OpenSubtitles Password": "OpenSubtitles Password", + "Stream from Browser": "Stream from Browser", + "Torrent Link": "Torrent Link", + "Magnet Link": "Magnet Link", + "Movie API Endpoint": "Movie API Endpoint", + "Activate Google Analytics": "Activate Google Analytics" } \ No newline at end of file diff --git a/src/app/language/en.json b/src/app/language/en.json index f320d8c4..bfcb4b3b 100644 --- a/src/app/language/en.json +++ b/src/app/language/en.json @@ -532,5 +532,20 @@ " Action": " Action", "comedy": " Comedy", "western": " Western", - "YTS.ph Search": "YTS.ph Search" + "YTS.ph Search": "YTS.ph Search", + "OpenSubtitles Username": "OpenSubtitles Username", + "OpenSubtitles Password": "OpenSubtitles Password", + "You should save the content of the old directory, then delete it": "You should save the content of the old directory, then delete it", + "OpenSubtitles.org Username": "OpenSubtitles.org Username", + "OpenSubtitles.org Password": "OpenSubtitles.org Password", + "Incorrect Username or Password": "Incorrect Username or Password", + "Show Password": "Show Password", + "Create a new account ": "Create a new account ", + "www.opensubtitles.org": "www.opensubtitles.org", + "Create a new account at ": "Create a new account at ", + "Create an account at": "Create an account at", + "fantasy": "fantasy", + "documentary": "documentary", + "Subtitles are provided by": "Subtitles are provided by", + "Unable to create new Download directory": "Unable to create new Download directory" } \ No newline at end of file diff --git a/src/app/language/es.json b/src/app/language/es.json index 583bfa7d..ff12ab1a 100644 --- a/src/app/language/es.json +++ b/src/app/language/es.json @@ -1,490 +1,502 @@ { - "External Player": "Reproductor externo", - "Made with": "Hecho con", - "by a bunch of geeks from All Around The World": "por un grupo de geeks de todas partes del mundo", - "Initializing PopcornTime. Please Wait...": "Iniciando Popcorn Time. Por favor, espera...", - "Status: Checking Database...": "Estado: Verificando la base de datos...", - "Movies": "Películas", - "TV Series": "Series", - "Anime": "Anime", - "Genre": "Género", - "All": "Todos", - "Action": "Acción", - "Adventure": "Aventura", - "Animation": "Animación", - "Children": "Infantil", - "Comedy": "Comedia", - "Crime": "Crimen", - "Documentary": "Documental", - "Drama": "Drama", - "Family": "Familiar", - "Fantasy": "Fantasía", - "Game Show": "Concursos", - "Home And Garden": "Casa y jardín", - "Horror": "Terror", - "Mini Series": "Mini series", - "Mystery": "Misterio", - "News": "Noticias", - "Reality": "Reality", - "Romance": "Romance", - "Science Fiction": "Ciencia ficción", - "Soap": "Novela", - "Special Interest": "Interés especial", - "Sport": "Deportes", - "Suspense": "Suspense", - "Talk Show": "Entrevistas", - "Thriller": "Thriller", - "Western": "Western", - "Sort by": "Ordenar por", - "Popularity": "Popularidad", - "Updated": "Actualización", - "Year": "Año", - "Name": "Nombre", - "Search": "Buscar", - "Season": "Temporada", - "Seasons": "Temporadas", - "Season %s": "Temporada %s", - "Load More": "Cargar más", - "Saved": "Guardado", - "Settings": "Configuración", - "Show advanced settings": "Mostrar configuración avanzada", - "User Interface": "Interfaz de usuario", - "Default Language": "Idioma predeterminado", - "Theme": "Apariencia", - "Start Screen": "Pantalla de inicio", - "Favorites": "Favoritos", - "Show rating over covers": "Mostrar valoración en las portadas", - "Always On Top": "Siempre encima", - "Watched Items": "Elementos vistos", - "Show": "Mostrar", - "Fade": "Desvanecer", - "Hide": "Ocultar", - "Subtitles": "Subtítulos", - "Default Subtitle": "Subtítulos predeterminados", - "Disabled": "Desactivados", - "Size": "Tamaño", - "Quality": "Calidad", - "Only list movies in": "Solo mostrar películas en", - "Show movie quality on list": "Mostrar calidad de las películas en la lista", - "Trakt.tv": "Trakt.tv", - "Enter your Trakt.tv details here to automatically 'scrobble' episodes you watch in Popcorn Time": "Introduce aquí tus datos de acceso a Trak.tv para sincronizar automáticamente los episodios que ves en Popcorn Time", - "Connect to %s to automatically 'scrobble' episodes you watch in %s": "Conecta a %s para sincronizar en %s los episodios que ves", - "Username": "Usuario", - "Password": "Contraseña", - "Popcorn Time stores an encrypted hash of your password in your local database": "Popcorn Time guarda tu contraseña de forma encriptada en tu base de datos local", - "Remote Control": "Control remoto", - "HTTP API Port": "Puerto (API HTTP)", - "HTTP API Username": "Usuario (API HTTP)", - "HTTP API Password": "Contraseña (API HTTP)", - "Connection": "Conexión", - "TV Show API Endpoint": "API Endpoint de las Series", - "Movies API Endpoint": "API Endpoint de Películas", - "Connection Limit": "Límite de conexiones", - "DHT Limit": "Límite DHT", - "Port to stream on": "Puerto para la transmisión", - "0 = Random": "0 = Aleatorio", - "Cache Directory": "Directorio caché", - "Clear Tmp Folder after closing app?": "¿Eliminar archivos temporales al cerrar la aplicación?", - "Database": "Base de datos", - "Database Directory": "Directorio de la base de datos", - "Import Database": "Importar base de datos", - "Export Database": "Exportar base de datos", - "Flush bookmarks database": "Limpiar favoritos", - "Flush subtitles cache": "Limpiar caché de subtítulos", - "Flush all databases": "Limpiar todas las bases de datos", - "Reset to Default Settings": "Restablecer la configuración predeterminada", - "Importing Database...": "Importando base de datos...", - "Please wait": "Por favor, espera...", - "Error": "Error", - "Biography": "Biográfica", - "Film-Noir": "Cine negro", - "History": "Histórica", - "Music": "Música", - "Musical": "Musical", - "Sci-Fi": "Ciencia ficción", - "Short": "Corto", - "War": "Bélica", - "Last Added": "Últimas Añadidas", - "Rating": "Valoración", - "Open IMDb page": "Abrir la página en IMDb", - "Health false": "Salud - error", - "Add to bookmarks": "Añadir a favoritos", - "Watch Trailer": "Ver trailer", - "Watch Now": "Ver ahora", - "Health Good": "Salud buena", - "Ratio:": "Proporción:", - "Seeds:": "Semillas:", - "Peers:": "Pares:", - "Remove from bookmarks": "Eliminar de favoritos", - "Changelog": "Registro de cambios", - "Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.": "Popcorn Time es el resultado de un montón de desarrolladores y diseñadores que juntaron varias APIs para hacer la experiencia de ver películas por torrent lo más simple posible.", - "We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.": "Somos un proyecto de código abierto. Somos de todas partes del mundo. Nos encantan las películas. Y por supuesto, amamos las palomitas de maíz.", - "Invalid PCT Database File Selected": "Archivo seleccionado de base de datos PCT inválido", - "Health Unknown": "Salud desconocida", - "Episodes": "Episodios", - "Episode %s": "Episodio %s", - "Aired Date": "Fecha de emisión", - "Streaming to": "Transmitiendo a", - "connecting": "Conectando", - "Download": "Descarga", - "Upload": "Subida", - "Active Peers": "Pares activos", - "Cancel": "Cancelar", - "startingDownload": "Iniciando descarga", - "downloading": "Descargando", - "ready": "Listo", - "playingExternally": "Reproduciendo externamente", - "Custom...": "Añadir...", - "Volume": "Volumen", - "Ended": "Finalizada", - "Error loading data, try again later...": "Error al cargar los datos, inténtalo de nuevo más tarde...", - "Miscellaneous": "Miscelánea", - "When opening TV Show Detail Jump to:": "Al abrir la ficha de una serie, ir a:", - "First Unwatched Episode": "Primer episodio no visto", - "Next Episode In Series": "Siguiente episodio de la serie", - "When Opening TV Show Detail Jump To": "Al abrir la ficha de una serie, ir a", - "Flushing...": "Limpiando...", - "Are you sure?": "¿Estás seguro?", - "We are flushing your databases": "Estamos limpiando las bases de datos", - "Success": "Éxito", - "Please restart your application": "Por favor, reinicia la aplicación", - "Restart": "Reiniciar", - "Terms of Service": "Condiciones de uso", - "I Accept": "Acepto", - "Leave": "Salir", - "When Opening TV Series Detail Jump To": "Al abrir la ficha de una serie, ir a", - "Health Medium": "Salud media", - "Playback": "Reproducir", - "Play next episode automatically": "Reproducir el siguiente episodio automáticamente", - "Generate Pairing QR code": "Generar código QR de emparejamiento", - "Playing Next Episode in": "Reproduciendo el siguiente episodio en", - "Play": "Reproducir", - "Dismiss": "Descartar", - "waitingForSubtitles": "Esperando subtítulos", - "Play Now": "Reproducir ahora", - "Seconds": "Segundos", - "You are currently authenticated to Trakt.tv as": "Has iniciado sesión en Trakt.tv como", - "You are currently connected to %s": "Estás actualmente conectado a %s", - "Disconnect account": "Desconectar", - "Sync With Trakt": "Sincronizar con Trakt", - "Syncing...": "Sincronizando...", - "Done": "Listo", - "Subtitles Offset": "Desfase de los subtítulos", - "secs": "segs", - "We are flushing your database": "Estamos limpiando la base de datos", - "We are rebuilding the TV Show Database. Do not close the application.": "Estamos reconstruyendo la base de datos de las series. No cierres el programa.", - "No shows found...": "No se ha encontrado ninguna serie...", - "No Favorites found...": "No se ha encontrado ningún elemento en tus Favoritos...", - "Rebuild TV Shows Database": "Reconstruir la base de datos de las series", - "No movies found...": "No se ha encontrado ninguna película...", - "Ratio": "Proporción", - "Health Excellent": "Salud excelente", - "Health Bad": "Salud mala", - "Status: Creating Database...": "Estado: Creando base de datos...", - "Status: Updating database...": "Estado: Actualizando base de datos...", - "Status: Skipping synchronization TTL not met": "Estado: Ignorando sincronización. No se cumple TTL.", - "Advanced Settings": "Configuración avanzada", - "Clear Cache directory after closing app?": "¿Borrar el directorio caché al cerrar la aplicación?", - "Tmp Folder": "Carpeta temporal", - "Status: Downloading API archive...": "Estado: Descargando archivo API...", - "Status: Archive downloaded successfully...": "Estado: Archivo descargado correctamente...", - "Status: Importing file": "Estado: Importando archivo", - "Status: Imported successfully": "Estado: Importado correctamente", - "Status: Launching applicaion... ": "Estado: Cargando aplicación...", - "URL of this stream was copied to the clipboard": "La URL de esta transmisión fue copiada al portapapeles", - "Error, database is probably corrupted. Try flushing the bookmarks in settings.": "Error. Es posible que la base de datos esté corrupta. Intenta limpiar los favoritos desde la página de Configuración.", - "Flushing bookmarks...": "Limpiando favoritos...", - "Resetting...": "Restableciendo...", - "We are resetting the settings": "Estamos restableciendo la configuración", - "New version downloaded": "Nueva versión descargada", - "Installed": "Instalada", - "Install Now": "Instalar ahora", - "Restart Now": "Reiniciar ahora", - "We are flushing your subtitle cache": "Estamos limpiando la caché de subtítulos", - "Subtitle cache deleted": "Caché de subtítulos borrada", - "Please select a file to play": "Por favor selecciona un archivo a reproducir", - "Test Login": "Probando inicio de sesión", - "Testing...": "Probando...", - "Success!": "¡Éxito!", - "Failed!": "¡Fallo!", - "Global shortcuts": "Atajos globales", - "Video Player": "Reproductor de vídeo", - "Toggle Fullscreen": "Activar pantalla completa", - "Play/Pause": "Reproducir/Pausa", - "Seek Forward": "Avanzar", - "Increase Volume": "Subir volumen un", - "Set Volume to": "Fijar volumen en", - "Offset Subtitles by": "Ajustar subtítulos en", - "Toggle Mute": "Silenciar", - "Movie Detail": "Ficha de la película", - "Toggle Quality": "Cambiar calidad", - "Play Movie": "Reproducir película", - "Exit Fullscreen": "Salir de pantalla completa", - "Seek Backward": "Retroceder", - "Decrease Volume": "Bajar volumen un", - "Show Stream URL": "Mostrar la URL de la transmisión del programa", - "TV Show Detail": "Ficha de la serie", - "Toggle Watched": "Marcar/Desmarcar como \"Visto\"", - "Select Next Episode": "Seleccionar episodio siguiente", - "Select Previous Episode": "Seleccionar episodio anterior", - "Select Next Season": "Seleccionar temporada siguiente", - "Select Previous Season": "Seleccionar temporada anterior", - "Play Episode": "Reproducir episodio", - "space": "espacio", - "shift": "shift", - "ctrl": "ctrl", - "enter": "enter", - "esc": "esc", - "Keyboard Shortcuts": "Atajos de teclado", - "Cut": "Cortar", - "Copy": "Copiar", - "Paste": "Pegar", - "Help Section": "Ayuda", - "Did you know?": "¿Sabías que...?", - "What does Popcorn Time offer?": "¿Qué ofrece Popcorn Time?", - "With Popcorn Time, you can watch Movies and TV Series really easily. All you have to do is click on one of the covers, then click 'Watch Now'. But your experience is highly customizable:": "Con Popcorn Time puedes ver películas y series de televisión muy fácilmente. Todo lo que tienes que hacer clic en una de las portadas y después en \"Ver ahora\". Además, la experiencia es totalmente personalizable:", - "Our Movies collection only contains High-Definition movies, available in 720p and 1080p. To watch a movie, simply open Popcorn Time and navigate through the movies collection, reachable through the 'Movies' tab, in the navigation bar. The default view will show you all movies sorted by popularity, but you can apply your own filters, thanks to the 'Genre' and 'Sort by' filters. Once you have chosen a movie you want to watch, click its cover. Then click 'Watch Now'. Don't forget the popcorn!": "Nuestra colección de películas se compone únicamente de contenido en alta definición, disponible en 720p y 1080p. Para ver una película, simplemente abre Popcorn Time y navega por la lista, accesible a través de la pestaña \"Películas\", en la barra de navegación. La vista predeterminada mostrará todas las películas ordenadas según su popularidad, pero puedes aplicar tus propios criterios de ordenación gracias a los filtros \"Género\" y \"Ordenar por\". Una vez hayas elegido la película que quieres ver, haz clic en su portada y después en \"Ver ahora\". ¡No olvides las palomitas de maíz!", - "The TV Series tab, that you can reach by clicking 'TV Series' in the navigation bar, will show you all available series in our collection. You can also apply your own filters, same as the Movies, to help you decide what to watch. In this collection, also just click the cover: the new window that will appear will allow you to navigate through Seasons and Episodes. Once your mind is set, just click the 'Watch Now' button.": "La pestaña \"Series\", accesible desde la barra de navegación, te mostrará todas las series disponibles en nuestra colección. Aquí también puedes aplicar tus propios filtros, como en las películas, para ayudarte a elegir qué ver. En esta colección, igualmente, sólo tienes que hacer clic sobre una portada: se abrirá una nueva ventana donde elegir temporadas y capítulos. Cuando hayas decidido, tan solo tienes que hacer clic en \"Ver ahora\".", - "Choose quality": "Elegir calidad", - "A slider next to the 'Watch Now' button will let you choose the quality of the stream. You can also set a fixed quality in the Settings tab. Warning: a better quality equals more data to download.": "Un control cerca del botón \"Ver ahora\" te permitirá elegir la calidad del contenido. También puedes establecer una calidad predeterminada en la página de Configuración. Advertencia: una mejor calidad implica que se tengan que descargar más datos.", - "Most of our Movies and TV Series have subtitles in your language. You can set them in the Settings tab. For the Movies, you can even set them through the dropdown menu, in the Movie Details page.": "La mayoría de nuestras películas y series cuentan con subtítulos en tu idioma. Puedes predefinirlos desde la página de Configuración. Para las películas, también puedes seleccionarlos mediante el menú desplegable que encontrarás en la ficha de la película.", - "Clicking the heart icon on a cover will add the movie/show to your favorites. This collection is reachable through the heart-shaped icon, in the navigation bar. To remove an item from your collection, just click on the icon again! How simple is that?": "Hacer clic en el icono de corazón de una portada añadirá la película o serie a tus favoritos. Esta colección es accesible mediante el icono con forma de corazón de la barra de navegación. Para eliminar un elemento de tu colección, ¡simplemente haz clic en el icono otra vez! Fácil, ¿verdad?", - "Watched icon": "Icono \"Visto\"", - "Popcorn Time will keep in mind what you've already watched - a little help remembering doesn't cause any harm. You can also set an item as watched by clicking the eye-shaped icon on the covers. You can even build and synchronize your collection with Trakt.tv website, via the Settings tab.": "Popcorn Time llevará la cuenta de lo que hayas visto, ¡un poco de ayuda para recordar no hace daño! También puedes marcar un elemento como visto haciendo clic en el icono con forma de ojo de las portadas. Además, puedes crear y sincronizar tu colección con el sitio web Trakt.tv, desde la página de Configuración.", - "In Popcorn Time, you can use the magnifier icon to open the search. Type a Title, an Actor, a Director or even a Year, press 'Enter' and let us show you what we can offer to fill your needs. To close your current search, you can click on the 'X' located next to your entry or type something else in the field.": "En Popcorn Time, puedes utilizar el icono de lupa para iniciar una búsqueda. Inserta un título, un actor, un director o incluso un año, presiona 'Enter' y déjanos mostrarte lo que podemos ofrecerte. Para cerrar la búsqueda, haz clic en la 'X' situada en el campo de búsqueda o escribe otra cosa.", - "External Players": "Reproductores externos", - "If you prefer to use a custom player instead of the built in one, you can do so by clicking the allocated icon on the 'Watch Now' button. A list of your installed players will be shown, select one and Popcorn Time will send everything to it. If your player isn't on the list, please report it to us.": "Si prefieres usar tu propio reproductor en vez del incorporado, puedes hacerlo seleccionando el icono correspondiente en el boton \"Ver ahora\". Se mostrará una lista con tus reproductores; selecciona uno y Popcorn Time retransmitirá todo. Si tu reproductor no aparece en la lista, por favor, comunícanoslo.", - "To push the customization even further, we offer you a large panel of options. To access the Settings, click the wheel-shaped icon in the navigation bar.": "Para llevar la personalización aún más allá, te ofrecemos un gran panel de opciones. Para acceder a la página de Configuración, haz clic en el icono con forma de engranaje en la barra de navegación.", - "Keyboard Navigation": "Navegación con el teclado", - "The entire list of keyboard shortcuts is available by pressing '?' on your keyboard, or through the keyboard-shaped icon in the Settings tab.": "La lista completa de atajos de teclado está disponible presionando la tecla '?' en tu teclado, o mediante el icono con forma de teclado en la página de Configuración.", - "Custom Torrents and Magnet Links": "Torrents personalizados y enlaces magnet", - "You can use custom torrents and magnets links in Popcorn Time. Simply drag and drop .torrent files into the application's window, and/or paste any magnet link.": "Es posible utilizar torrents y enlaces magnéticos con Popcorn Time. Simplemente, arrastra y suelta un archivo .torrent en la ventana de la aplicación, y/o pega cualquier enlace magnet.", - "Torrent health": "Salud del Torrent", - "On the details of Movies/TV Series, you can find a little circle, colored in grey, red, yellow or green. Those colors refer to the health of the torrent. A green torrent will be downloaded quickly, while a red torrent may not be downloaded at all, or very slowly. The color grey represents an error in the health calculation for Movies, and needs to be clicked in TV Series in order to display the health.": "En las fichas de las películas o series, encontrarás un pequeño círculo de color gris, rojo, amarillo o verde. Esos colores hacen referencia a la salud del torrent. Un torrent verde se descargará rápidamente mientras que un torrent rojo no se descargará en absoluto o lo hará muy lentamente. El color gris representa un error en el cálculo de la salud para la películas, y para las series necesita un clic de tu parte con el fin de mostrar la salud del torrent.", - "How does Popcorn Time work?": "¿Cómo funciona Popcorn Time?", - "Popcorn Time streams video content through torrents. Our movies are provided by %s and our TV Series by %s, while getting all metadata from %s. We don't host any content ourselves.": "Popcorn Time transmite contenido de vídeo a través de archivos torrent. Nuestras películas son proporcionadas por %s y nuestras series de TV por %s, mientras que obtenemos todos los metadatos de %s. No alojamos ningún contenido nosotros mismos.", - "Torrent streaming? Well, torrents use Bittorrent protocol, which basically means that you download small parts of the content from another user's computer, while sending the parts you already downloaded to another user. Then, you watch those parts, while the next ones are being downloaded in the background. This exchange allows the content to stay healthy.": "¿Transmisión por torrents? Bueno, los archivos torrent utilizan el protocolo Bittorrent que, básicamente, significa que se descargan pequeñas partes del contenido, el video, del ordenador de un usuario, mientras envía las que ya ha descargado a otro usuario. Así, puedes ver esas partes mientras las siguientes se descargan en segundo plano. Este intercambio de datos permite que el contenido se mantenga sano.", - "Once the movie is fully downloaded, you continue to send parts to the other users. And everything is deleted from your computer when you close Popcorn Time. As simple as that.": "Una vez se ha descargado completamente la película, continúas enviando partes a otros usuarios. Y cuando cierras Popcorn Time, se elimina todo. Así de sencillo.", - "The application itself is built with Node-Webkit, HTML, CSS and Javascript. It works like the Google Chrome browser, except that you host the biggest part of the code on your computer. Yes, Popcorn Time works on the same technology as a regular website, like... let's say Wikipedia, or Youtube!": "La aplicación en si está construida con Node-Webkit, HTML, CSS y Javascript. Funciona igual que el navegador Google Chrome, excepto por el hecho de que la mayor parte del código se aloja en tu propio ordenador. Sí, Popcorn Time funciona con la misma tecnología que una página web normal, como... digamos, ¡Wikipedia o Youtube!", - "I found a bug, how do I report it?": "Encontré un error, ¿cómo lo puedo notificar?", - "No historics found...": "No se ha encontrado ningún histórico...", - "Error, database is probably corrupted. Try flushing the history in settings.": "Error. La base de datos probablemente esté corrupta. Prueba a limpiar los favoritos en la página de Configuración.", - "You can paste magnet links anywhere in Popcorn Time with CTRL+V.": "Puedes pegar enlaces magnet en cualquier lugar de Popcorn Time con CTRL+V.", - "You can drag & drop a .torrent file into Popcorn Time.": "Puedes arrastrar y soltar un archivo torrent sobre Popcorn Time.", - "The Popcorn Time project started in February 2014 and has already had 150 people that contributed more than 3000 times to it's development in August 2014.": "En el proyecto Popcorn Time, que se inició en febrero de 2014, ya han habido 150 personas que han contribuído a su desarrollo más de 3000 veces, sólo en agosto de 2014.", - "The rule n°10 applies here.": "Se aplica la regla número 10.", - "If a subtitle for a TV series is missing, you can add it on %s. And the same way for a movie, but on %s.": "Si falta algún subtitulo de una serie, puedes añadirlo en %s. Y lo mismo para las películas, pero en %s.", - "If you're experiencing connection drop issues, try to reduce the DHT Limit in settings.": "Si estás experimentando problemas de conexión, prueba a reducir el límite DHT en la página de Configuración.", - "If you search \"1998\", you can see all the movies or TV series that came out that year.": "Si buscas \"1998\", podrás ver todas las películas o series que se estrenaron ese año.", - "You can login to Trakt.tv to save all your watched items, and synchronize them across multiple devices.": "Puedes acceder a Trakt.tv para guardar todos tus elementos vistos y sincronizarlos a través de múltiples dispositivos.", - "Clicking on the rating stars will display a number instead.": "Al hacer clic en las estrellas de valoración se mostrará un número en su lugar.", - "This application is entirely written in HTML5, CSS3 and Javascript.": "Esta aplicación está completamente escrita en HTML5, CSS3 y Javascript.", - "You can find out more about a movie or a TV series? Just click the IMDb icon.": "¿Quieres saber más sobre una película o una serie? Sólo tienes que hacer clicl en el icono de IMDb.", - "Clicking twice on a \"Sort By\" filter reverses the order of the list.": "Al hacer doble clic en el filtro \"Ordenar por\", se invierte el orden de la lista", - "Switch to next tab": "Ir a la pestaña siguiente", - "Switch to previous tab": "Ir a la pestaña anterior", - "Switch to corresponding tab": "Ir a la pestaña correspondiente", - "through": "hasta", - "Enlarge Covers": "Agrandar las portadas", - "Reduce Covers": "Reducir las portadas", - "Open the Help Section": "Abre la sección de ayuda", - "Open Item Details": "Abre la ficha del elemento", - "Add Item to Favorites": "Añadir a Favoritos", - "Mark as Seen": "Marcar como visto", - "Open this screen": "Abre esta página", - "Open Settings": "Abre la página de Configuración", - "Posters Size": "Tamaño de los carteles", - "This feature only works if you have your TraktTv account synced. Please go to Settings and enter your credentials.": "Esta característica sólo funciona si tienes sincronizada tu cuenta de Trakt.tv; por favor, introduce tus credenciales de acceso en la página de Configuración.", - "Last Open": "Último abierto", - "Exporting Database...": "Exportando base de datos...", - "Database Successfully Exported": "Base de datos exportada correctamente.", - "Display": "Visualizar", - "TV": "TV", - "Type": "Tipo", - "popularity": "Popularidad", - "date": "fecha", - "year": "Año", - "rating": "Valoración", - "updated": "Actualización", - "name": "Nombre", - "OVA": "OVA", - "ONA": "ONA", - "No anime found...": "No se ha encontrado ningún anime...", - "Movie": "Película", - "Special": "Especial", - "No Watchlist found...": "No se ha encontrado ningun elemento en tu Lista de Visionado...", - "Watchlist": "Lista de Visionado", - "Resolving..": "Resolviendo...", - "About": "Acerca de", - "Open Cache Directory": "Abrir el directorio caché", - "Open Database Directory": "Abrir el directorio de base de datos", - "Mark as unseen": "Marcar como no visto", - "Playback rate": "Velocidad de reproducción", - "Increase playback rate by %s": "Aumentar velocidad de reproducción por %s", - "Decrease playback rate by %s": "Disminuir velocidad de reproducción por %s", - "Set playback rate to %s": "Establecer velocidad de reproducción en %s", - "Playback rate adjustment is not available for this video!": "¡El ajuste de la velocidad de reproducción no está disponible para este vídeo!", - "Color": "Color", - "With Shadows": "Con sombras", - "Local IP Address": "Dirección IP local", - "Japan": "Japón", - "Cars": "Coches", - "Dementia": "Demencia", - "Demons": "Demonios", - "Ecchi": "Ecchi", - "Game": "Juego", - "Harem": "Harem", - "Historical": "Histórico", - "Josei": "Josei", - "Kids": "Niños", - "Magic": "Magia", - "Martial Arts": "Artes marciales", - "Mecha": "Mecha", - "Military": "Militar", - "Parody": "Parodia", - "Police": "Policiaca", - "Psychological": "Psicológica", - "Samurai": "Samurai", - "School": "Escuela", - "Seinen": "Seinen", - "Shoujo": "Shoujo", - "Shoujo Ai": "Shoujo Ai", - "Shounen": "Shounen", - "Shounen Ai": "Shounen Ai", - "Slice Of Life": "Recuento de la vida", - "Slice of Life": "Recuentos de la vida", - "Space": "Espacio", - "Sports": "Deportes", - "Super Power": "Superpoderes", - "Supernatural": "Sobrenatural", - "Vampire": "Vampiros", - "Alphabet": "Orden alfabético", - "Automatically Sync on Start": "Sincronizar automáticamente al inicio", - "Setup VPN": "Configurar VPN", - "VPN": "VPN", - "Install VPN Client": "Instalar cliente VPN", - "More Details": "Más información", - "Don't show me this VPN option anymore": "No volver a mostrar esta opción VPN", - "Activate automatic updating": "Activar actualización automática", - "We are installing VPN client": "Estamos instalando el cliente VPN", - "VPN Client Installed": "Cliente VPN instalado", - "Please wait...": "Por favor, espera...", - "VPN.ht client is installed": "El cliente VPN.ht está instalado", - "Install again": "Reinstalar", - "Connect": "Conectar", - "Create Account": "Crear cuenta", - "Please, allow ~ 1 minute": "Por favor, concede ~ 1 minuto", - "Status: Connecting to VPN...": "Estado: Conectando VPN...", - "Status: Monitoring connexion - ": "Estado: Monitorizando conexión -", - "Connect VPN": "Conectar VPN", - "Disconnect VPN": "Desconectar VPN", - "Celebrate various events": "Aplicar temas para eventos y festividades", - "ATTENTION! We need admin access to run this command.": "¡ATENCIÓN! Se necesitan permisos de administrador para ejecutar este comando.", - "Your password is not saved": "Tu contraseña no se ha guardado", - "Enter sudo password :": "Introduce la contraseña de superusuario:", - "Status: Monitoring connection": "Estado: Monitorizando conexión", - "Status: Connected": "Estado: Conectado", - "Secure connection": "Conexión segura", - "Your IP:": "Tu IP:", - "Disconnect": "Desconectar", - "Downloaded": "Descargado", - "Loading stuck ? Click here !": "¿Se ha detenido la carga? ¡Haz clic aquí!", - "Torrent Collection": "Colección de torrents", - "Drop Magnet or .torrent": "Soltar enlace magnet o .torrent", - "Remove this torrent": "Eliminar este torrent", - "Rename this torrent": "Renombrar este torrent", - "Flush entire collection": "Eliminar toda la colección", - "Open Collection Directory": "Abrir el directorio de la colección", - "Store this torrent": "Guardar este torrent", - "Enter new name": "Introducir nuevo nombre", - "This name is already taken": "Este nombre ya está en uso", - "Always start playing in fullscreen": "Siempre iniciar la reproducción en pantalla completa", - "Allow torrents to be stored for further use": "Permitir que los torrents se guarden para un uso posterior", - "Hide VPN from the filter bar": "Ocultar icono VPN de la barra de filtros", - "Magnet link": "Enlace magnet", - "Error resolving torrent.": "Error resolviendo torrent.", - "%s hour(s) remaining": "%s hora(s) restantes", - "%s minute(s) remaining": "%s minuto(s) restantes", - "%s second(s) remaining": "%s segundo(s) restantes", - "Unknown time remaining": "Tiempo restante desconocido", - "Set player window to video resolution": "Ajustar ventana del reproductor a la resolución del vídeo", - "Set player window to double of video resolution": "Ajustar ventana del reproductor al doble de la resolución del vídeo", - "Set player window to half of video resolution": "Ajustar ventana del reproductor a la mitad de la resolución del vídeo", - "Retry": "Reintentar", - "Import a Torrent": "Importar torrent", - "The remote movies API failed to respond, please check %s and try again later": "La API remota de las películas no ha respondido, por favor, comprueba %s e inténtalo de nuevo más tarde", - "The remote shows API failed to respond, please check %s and try again later": "La API remota de las series no ha respondido, por favor, comprueba %s e inténtalo de nuevo más tarde", - "The remote anime API failed to respond, please check %s and try again later": "La API remota de anime no ha respondido, por favor, comprueba %s e inténtalo de nuevo más tarde", - "Not Seen": "No visto", - "Seen": "Visto", - "Title": "Título", - "The video playback encountered an issue. Please try an external player like %s to view this content.": "La reproducción del video encontró un problema. Para ver este contenido, por favor intenta con un reproductor externo, como %s.", - "Font": "Fuente", - "Decoration": "Efecto", - "None": "Ninguno", - "Outline": "Contorno", - "Opaque Background": "Fondo opaco", - "No thank you": "No, gracias", - "Report an issue": "Notificar una incidencia", - "Log in into your GitLab account": "Acceder a su cuenta GitLab", - "Email": "Email", - "Log in": "Acceder", - "Report anonymously": "Informar anónimamente", - "Note regarding anonymous reports:": "Nota relativa a informes anónimos:", - "You will not be able to edit or delete your report once sent.": "No podrás editar o eliminar tu informe una vez enviado.", - "If any additionnal information is required, the report might be closed, as you won't be able to provide them.": "Si se requiere cualquier información adicional, el informe podría ser cerrado, ya que no podrás proporcionarla.", - "Step 1: Please look if the issue was already reported": "Paso 1: Por favor, mire si la incidencia ya se informó anteriormente", - "Enter keywords": "Introducir palabras clave", - "Already reported": "Ya ha sido informada", - "I want to report a new issue": "Quiero informar de una nueva incidencia", - "Step 2: Report a new issue": "Paso 2: Informar de una nueva incidencia", - "Note: please don't use this form to contact us. It is limited to bug reports only.": "Nota: por favor, no utilice este formulario para contactar con nosotros. Está limitado a sólo informar de errores.", - "The title of the issue": "Título de la incidencia", - "Description": "Descripción", - "200 characters minimum": "Mínimo 200 caracteres", - "A short description of the issue. If suitable, include the steps required to reproduce the bug.": "Una breve descripción del problema. Si es apropiado, incluya los pasos necesarios para reproducir el error.", - "Submit": "Enviar", - "Step 3: Thank you !": "Paso 3: ¡Gracias!", - "Your issue has been reported.": "Su incidencia ha sido notificada.", - "Open in your browser": "Abrir en su navegador", - "No issues found...": "No se han encontrado incidencias...", - "First method": "Primer método", - "Use the in-app reporter": "Usar el informador integrado", - "You can find it later on the About page": "Podrás encontrarlo más tarde en la página \"Acerca de\"", - "Second method": "Segundo método", - "You can create an account on our %s repository, and click on %s.": "Puedes crear una cuenta en nuestro repositorio %s y hacer clic en %s", - "Use the %s issue filter to search and check if the issue has already been reported or is already fixed.": "Usa el %s del filtro de errores para buscar y revisar si el problema ya ha sido informado o si ya está solucionado.", - "Include a screenshot if relevant - Is your issue about a design feature or a bug?": "Incluye una captura de pantalla si es relevante - ¿Tu problema es sobre una característica del diseño o es un error del programa?", - "A good bug report shouldn't leave others needing to chase you up for more information. Be sure to include the details of your environment.": "Un buen informe de errores no debería dejar a otras personas con la necesidad de tener que localizarte para obtener más información. Asegúrate de incluir todos los detalles de tu entorno.", - "Warning: Always use English when contacting us, or we might not understand you.": "Aviso: Usa siempre el inglés cuando nos contactes o no podremos entenderte.", - "Search on %s": "Buscar en %s", - "No results found": "No se encontraron resultados", - "Invalid credentials": "Credenciales no válidas", - "Open Favorites": "Abrir Favoritos", - "Open About": "Abrir acerca de", - "Minimize to Tray": "Minimizar a la bandeja del sistema", - "Close": "Cerrar", - "Restore": "Restablecer", - "Resume Playback": "Reanudar Reproducción", - "Features": "Características", - "Connect To %s": "Conectar A %s", - "The magnet link was copied to the clipboard": "El magnet link fue copiado al portapapeles", - "Big Picture Mode": "Modo \"Big Picture\"", - "Big Picture Mode is unavailable on your current screen resolution": "El modo \"Big Picture\" no está disponible en tu resolución de pantalla actual", - "Cannot be stored": "No puede ser guardado", - "%s reported this torrent as fake": "%s reportaron que este Torrent es falso", - "%s could not verify this torrent": "%s no pudieron verificar este torrent", - "Randomize": "Selección Aleatoria", - "Randomize Button for Movies": "Botón de Selección Aleatoria para películas", - "Overall Ratio": "Ratio General", - "Translate Synopsis": "Traducir Sinopsis", - "Returning Series": "En Emisión", - "In Production": "En Producción", - "Canceled": "Canceladas", - "N/A": "No Disponible", - "%s is not supposed to be run as administrator": "%s no se supone que se pueda ejecutar como administrador", - "Your disk is almost full.": "Tu disco duro está casi lleno.", - "You need to make more space available on your disk by deleting files.": "Es necesario que dispongas de más espacio disponible en el disco eliminando archivos.", - "Playing Next": "Reproducir Siguiente", - "Trending": "Tendencias" + "External Player": "Reproductor externo", + "Made with": "Hecho con", + "by a bunch of geeks from All Around The World": "por un grupo de geeks de todas partes del mundo", + "Initializing PopcornTime. Please Wait...": "Iniciando Popcorn Time. Por favor, espera...", + "Status: Checking Database...": "Estado: Verificando la base de datos...", + "Movies": "Películas", + "TV Series": "Series", + "Anime": "Anime", + "Genre": "Género", + "All": "Todos", + "Action": "Acción", + "Adventure": "Aventura", + "Animation": "Animación", + "Children": "Infantil", + "Comedy": "Comedia", + "Crime": "Crimen", + "Documentary": "Documental", + "Drama": "Drama", + "Family": "Familiar", + "Fantasy": "Fantasía", + "Game Show": "Concursos", + "Home And Garden": "Casa y jardín", + "Horror": "Terror", + "Mini Series": "Mini series", + "Mystery": "Misterio", + "News": "Noticias", + "Reality": "Reality", + "Romance": "Romance", + "Science Fiction": "Ciencia ficción", + "Soap": "Novela", + "Special Interest": "Interés especial", + "Sport": "Deportes", + "Suspense": "Suspense", + "Talk Show": "Entrevistas", + "Thriller": "Thriller", + "Western": "Western", + "Sort by": "Ordenar por", + "Popularity": "Popularidad", + "Updated": "Actualización", + "Year": "Año", + "Name": "Nombre", + "Search": "Buscar", + "Season": "Temporada", + "Seasons": "Temporadas", + "Season %s": "Temporada %s", + "Load More": "Cargar más", + "Saved": "Guardado", + "Settings": "Configuración", + "Show advanced settings": "Mostrar configuración avanzada", + "User Interface": "Interfaz de usuario", + "Default Language": "Idioma predeterminado", + "Theme": "Apariencia", + "Start Screen": "Pantalla de inicio", + "Favorites": "Favoritos", + "Show rating over covers": "Mostrar valoración en las portadas", + "Always On Top": "Siempre encima", + "Watched Items": "Elementos vistos", + "Show": "Mostrar", + "Fade": "Desvanecer", + "Hide": "Ocultar", + "Subtitles": "Subtítulos", + "Default Subtitle": "Subtítulos predeterminados", + "Disabled": "Desactivados", + "Size": "Tamaño", + "Quality": "Calidad", + "Only list movies in": "Solo mostrar películas en", + "Show movie quality on list": "Mostrar calidad de las películas en la lista", + "Trakt.tv": "Trakt.tv", + "Enter your Trakt.tv details here to automatically 'scrobble' episodes you watch in Popcorn Time": "Introduce aquí tus datos de acceso a Trak.tv para sincronizar automáticamente los episodios que ves en Popcorn Time", + "Connect to %s to automatically 'scrobble' episodes you watch in %s": "Conecta a %s para sincronizar en %s los episodios que ves", + "Username": "Usuario", + "Password": "Contraseña", + "Popcorn Time stores an encrypted hash of your password in your local database": "Popcorn Time guarda tu contraseña de forma encriptada en tu base de datos local", + "Remote Control": "Control remoto", + "HTTP API Port": "Puerto (API HTTP)", + "HTTP API Username": "Usuario (API HTTP)", + "HTTP API Password": "Contraseña (API HTTP)", + "Connection": "Conexión", + "TV Show API Endpoint": "API Endpoint de las Series", + "Movies API Endpoint": "API Endpoint de Películas", + "Connection Limit": "Límite de conexiones", + "DHT Limit": "Límite DHT", + "Port to stream on": "Puerto para la transmisión", + "0 = Random": "0 = Aleatorio", + "Cache Directory": "Directorio caché", + "Clear Tmp Folder after closing app?": "¿Eliminar archivos temporales al cerrar la aplicación?", + "Database": "Base de datos", + "Database Directory": "Directorio de la base de datos", + "Import Database": "Importar base de datos", + "Export Database": "Exportar base de datos", + "Flush bookmarks database": "Limpiar favoritos", + "Flush subtitles cache": "Limpiar caché de subtítulos", + "Flush all databases": "Limpiar todas las bases de datos", + "Reset to Default Settings": "Restablecer la configuración predeterminada", + "Importing Database...": "Importando base de datos...", + "Please wait": "Por favor, espera...", + "Error": "Error", + "Biography": "Biográfica", + "Film-Noir": "Cine negro", + "History": "Histórica", + "Music": "Música", + "Musical": "Musical", + "Sci-Fi": "Ciencia ficción", + "Short": "Corto", + "War": "Bélica", + "Last Added": "Últimas Añadidas", + "Rating": "Valoración", + "Open IMDb page": "Abrir la página en IMDb", + "Health false": "Salud - error", + "Add to bookmarks": "Añadir a favoritos", + "Watch Trailer": "Ver trailer", + "Watch Now": "Ver ahora", + "Health Good": "Salud buena", + "Ratio:": "Proporción:", + "Seeds:": "Semillas:", + "Peers:": "Pares:", + "Remove from bookmarks": "Eliminar de favoritos", + "Changelog": "Registro de cambios", + "Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.": "Popcorn Time es el resultado de un montón de desarrolladores y diseñadores que juntaron varias APIs para hacer la experiencia de ver películas por torrent lo más simple posible.", + "We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.": "Somos un proyecto de código abierto. Somos de todas partes del mundo. Nos encantan las películas. Y por supuesto, amamos las palomitas de maíz.", + "Invalid PCT Database File Selected": "Archivo seleccionado de base de datos PCT inválido", + "Health Unknown": "Salud desconocida", + "Episodes": "Episodios", + "Episode %s": "Episodio %s", + "Aired Date": "Fecha de emisión", + "Streaming to": "Transmitiendo a", + "connecting": "Conectando", + "Download": "Descarga", + "Upload": "Subida", + "Active Peers": "Pares activos", + "Cancel": "Cancelar", + "startingDownload": "Iniciando descarga", + "downloading": "Descargando", + "ready": "Listo", + "playingExternally": "Reproduciendo externamente", + "Custom...": "Añadir...", + "Volume": "Volumen", + "Ended": "Finalizada", + "Error loading data, try again later...": "Error al cargar los datos, inténtalo de nuevo más tarde...", + "Miscellaneous": "Miscelánea", + "When opening TV Show Detail Jump to:": "Al abrir la ficha de una serie, ir a:", + "First Unwatched Episode": "Primer episodio no visto", + "Next Episode In Series": "Siguiente episodio de la serie", + "When Opening TV Show Detail Jump To": "Al abrir la ficha de una serie, ir a", + "Flushing...": "Limpiando...", + "Are you sure?": "¿Estás seguro?", + "We are flushing your databases": "Estamos limpiando las bases de datos", + "Success": "Éxito", + "Please restart your application": "Por favor, reinicia la aplicación", + "Restart": "Reiniciar", + "Terms of Service": "Condiciones de uso", + "I Accept": "Acepto", + "Leave": "Salir", + "When Opening TV Series Detail Jump To": "Al abrir la ficha de una serie, ir a", + "Health Medium": "Salud media", + "Playback": "Reproducir", + "Play next episode automatically": "Reproducir el siguiente episodio automáticamente", + "Generate Pairing QR code": "Generar código QR de emparejamiento", + "Playing Next Episode in": "Reproduciendo el siguiente episodio en", + "Play": "Reproducir", + "Dismiss": "Descartar", + "waitingForSubtitles": "Esperando subtítulos", + "Play Now": "Reproducir ahora", + "Seconds": "Segundos", + "You are currently authenticated to Trakt.tv as": "Has iniciado sesión en Trakt.tv como", + "You are currently connected to %s": "Estás actualmente conectado a %s", + "Disconnect account": "Desconectar", + "Sync With Trakt": "Sincronizar con Trakt", + "Syncing...": "Sincronizando...", + "Done": "Listo", + "Subtitles Offset": "Desfase de los subtítulos", + "secs": "segs", + "We are flushing your database": "Estamos limpiando la base de datos", + "We are rebuilding the TV Show Database. Do not close the application.": "Estamos reconstruyendo la base de datos de las series. No cierres el programa.", + "No shows found...": "No se ha encontrado ninguna serie...", + "No Favorites found...": "No se ha encontrado ningún elemento en tus Favoritos...", + "Rebuild TV Shows Database": "Reconstruir la base de datos de las series", + "No movies found...": "No se ha encontrado ninguna película...", + "Ratio": "Proporción", + "Health Excellent": "Salud excelente", + "Health Bad": "Salud mala", + "Status: Creating Database...": "Estado: Creando base de datos...", + "Status: Updating database...": "Estado: Actualizando base de datos...", + "Status: Skipping synchronization TTL not met": "Estado: Ignorando sincronización. No se cumple TTL.", + "Advanced Settings": "Configuración avanzada", + "Clear Cache directory after closing app?": "¿Borrar el directorio caché al cerrar la aplicación?", + "Tmp Folder": "Carpeta temporal", + "Status: Downloading API archive...": "Estado: Descargando archivo API...", + "Status: Archive downloaded successfully...": "Estado: Archivo descargado correctamente...", + "Status: Importing file": "Estado: Importando archivo", + "Status: Imported successfully": "Estado: Importado correctamente", + "Status: Launching applicaion... ": "Estado: Cargando aplicación...", + "URL of this stream was copied to the clipboard": "La URL de esta transmisión fue copiada al portapapeles", + "Error, database is probably corrupted. Try flushing the bookmarks in settings.": "Error. Es posible que la base de datos esté corrupta. Intenta limpiar los favoritos desde la página de Configuración.", + "Flushing bookmarks...": "Limpiando favoritos...", + "Resetting...": "Restableciendo...", + "We are resetting the settings": "Estamos restableciendo la configuración", + "New version downloaded": "Nueva versión descargada", + "Installed": "Instalada", + "Install Now": "Instalar ahora", + "Restart Now": "Reiniciar ahora", + "We are flushing your subtitle cache": "Estamos limpiando la caché de subtítulos", + "Subtitle cache deleted": "Caché de subtítulos borrada", + "Please select a file to play": "Por favor selecciona un archivo a reproducir", + "Test Login": "Probando inicio de sesión", + "Testing...": "Probando...", + "Success!": "¡Éxito!", + "Failed!": "¡Fallo!", + "Global shortcuts": "Atajos globales", + "Video Player": "Reproductor de vídeo", + "Toggle Fullscreen": "Activar pantalla completa", + "Play/Pause": "Reproducir/Pausa", + "Seek Forward": "Avanzar", + "Increase Volume": "Subir volumen un", + "Set Volume to": "Fijar volumen en", + "Offset Subtitles by": "Ajustar subtítulos en", + "Toggle Mute": "Silenciar", + "Movie Detail": "Ficha de la película", + "Toggle Quality": "Cambiar calidad", + "Play Movie": "Reproducir película", + "Exit Fullscreen": "Salir de pantalla completa", + "Seek Backward": "Retroceder", + "Decrease Volume": "Bajar volumen un", + "Show Stream URL": "Mostrar la URL de la transmisión del programa", + "TV Show Detail": "Ficha de la serie", + "Toggle Watched": "Marcar/Desmarcar como \"Visto\"", + "Select Next Episode": "Seleccionar episodio siguiente", + "Select Previous Episode": "Seleccionar episodio anterior", + "Select Next Season": "Seleccionar temporada siguiente", + "Select Previous Season": "Seleccionar temporada anterior", + "Play Episode": "Reproducir episodio", + "space": "espacio", + "shift": "shift", + "ctrl": "ctrl", + "enter": "enter", + "esc": "esc", + "Keyboard Shortcuts": "Atajos de teclado", + "Cut": "Cortar", + "Copy": "Copiar", + "Paste": "Pegar", + "Help Section": "Ayuda", + "Did you know?": "¿Sabías que...?", + "What does Popcorn Time offer?": "¿Qué ofrece Popcorn Time?", + "With Popcorn Time, you can watch Movies and TV Series really easily. All you have to do is click on one of the covers, then click 'Watch Now'. But your experience is highly customizable:": "Con Popcorn Time puedes ver películas y series de televisión muy fácilmente. Todo lo que tienes que hacer clic en una de las portadas y después en \"Ver ahora\". Además, la experiencia es totalmente personalizable:", + "Our Movies collection only contains High-Definition movies, available in 720p and 1080p. To watch a movie, simply open Popcorn Time and navigate through the movies collection, reachable through the 'Movies' tab, in the navigation bar. The default view will show you all movies sorted by popularity, but you can apply your own filters, thanks to the 'Genre' and 'Sort by' filters. Once you have chosen a movie you want to watch, click its cover. Then click 'Watch Now'. Don't forget the popcorn!": "Nuestra colección de películas se compone únicamente de contenido en alta definición, disponible en 720p y 1080p. Para ver una película, simplemente abre Popcorn Time y navega por la lista, accesible a través de la pestaña \"Películas\", en la barra de navegación. La vista predeterminada mostrará todas las películas ordenadas según su popularidad, pero puedes aplicar tus propios criterios de ordenación gracias a los filtros \"Género\" y \"Ordenar por\". Una vez hayas elegido la película que quieres ver, haz clic en su portada y después en \"Ver ahora\". ¡No olvides las palomitas de maíz!", + "The TV Series tab, that you can reach by clicking 'TV Series' in the navigation bar, will show you all available series in our collection. You can also apply your own filters, same as the Movies, to help you decide what to watch. In this collection, also just click the cover: the new window that will appear will allow you to navigate through Seasons and Episodes. Once your mind is set, just click the 'Watch Now' button.": "La pestaña \"Series\", accesible desde la barra de navegación, te mostrará todas las series disponibles en nuestra colección. Aquí también puedes aplicar tus propios filtros, como en las películas, para ayudarte a elegir qué ver. En esta colección, igualmente, sólo tienes que hacer clic sobre una portada: se abrirá una nueva ventana donde elegir temporadas y capítulos. Cuando hayas decidido, tan solo tienes que hacer clic en \"Ver ahora\".", + "Choose quality": "Elegir calidad", + "A slider next to the 'Watch Now' button will let you choose the quality of the stream. You can also set a fixed quality in the Settings tab. Warning: a better quality equals more data to download.": "Un control cerca del botón \"Ver ahora\" te permitirá elegir la calidad del contenido. También puedes establecer una calidad predeterminada en la página de Configuración. Advertencia: una mejor calidad implica que se tengan que descargar más datos.", + "Most of our Movies and TV Series have subtitles in your language. You can set them in the Settings tab. For the Movies, you can even set them through the dropdown menu, in the Movie Details page.": "La mayoría de nuestras películas y series cuentan con subtítulos en tu idioma. Puedes predefinirlos desde la página de Configuración. Para las películas, también puedes seleccionarlos mediante el menú desplegable que encontrarás en la ficha de la película.", + "Clicking the heart icon on a cover will add the movie/show to your favorites. This collection is reachable through the heart-shaped icon, in the navigation bar. To remove an item from your collection, just click on the icon again! How simple is that?": "Hacer clic en el icono de corazón de una portada añadirá la película o serie a tus favoritos. Esta colección es accesible mediante el icono con forma de corazón de la barra de navegación. Para eliminar un elemento de tu colección, ¡simplemente haz clic en el icono otra vez! Fácil, ¿verdad?", + "Watched icon": "Icono \"Visto\"", + "Popcorn Time will keep in mind what you've already watched - a little help remembering doesn't cause any harm. You can also set an item as watched by clicking the eye-shaped icon on the covers. You can even build and synchronize your collection with Trakt.tv website, via the Settings tab.": "Popcorn Time llevará la cuenta de lo que hayas visto, ¡un poco de ayuda para recordar no hace daño! También puedes marcar un elemento como visto haciendo clic en el icono con forma de ojo de las portadas. Además, puedes crear y sincronizar tu colección con el sitio web Trakt.tv, desde la página de Configuración.", + "In Popcorn Time, you can use the magnifier icon to open the search. Type a Title, an Actor, a Director or even a Year, press 'Enter' and let us show you what we can offer to fill your needs. To close your current search, you can click on the 'X' located next to your entry or type something else in the field.": "En Popcorn Time, puedes utilizar el icono de lupa para iniciar una búsqueda. Inserta un título, un actor, un director o incluso un año, presiona 'Enter' y déjanos mostrarte lo que podemos ofrecerte. Para cerrar la búsqueda, haz clic en la 'X' situada en el campo de búsqueda o escribe otra cosa.", + "External Players": "Reproductores externos", + "If you prefer to use a custom player instead of the built in one, you can do so by clicking the allocated icon on the 'Watch Now' button. A list of your installed players will be shown, select one and Popcorn Time will send everything to it. If your player isn't on the list, please report it to us.": "Si prefieres usar tu propio reproductor en vez del incorporado, puedes hacerlo seleccionando el icono correspondiente en el boton \"Ver ahora\". Se mostrará una lista con tus reproductores; selecciona uno y Popcorn Time retransmitirá todo. Si tu reproductor no aparece en la lista, por favor, comunícanoslo.", + "To push the customization even further, we offer you a large panel of options. To access the Settings, click the wheel-shaped icon in the navigation bar.": "Para llevar la personalización aún más allá, te ofrecemos un gran panel de opciones. Para acceder a la página de Configuración, haz clic en el icono con forma de engranaje en la barra de navegación.", + "Keyboard Navigation": "Navegación con el teclado", + "The entire list of keyboard shortcuts is available by pressing '?' on your keyboard, or through the keyboard-shaped icon in the Settings tab.": "La lista completa de atajos de teclado está disponible presionando la tecla '?' en tu teclado, o mediante el icono con forma de teclado en la página de Configuración.", + "Custom Torrents and Magnet Links": "Torrents personalizados y enlaces magnet", + "You can use custom torrents and magnets links in Popcorn Time. Simply drag and drop .torrent files into the application's window, and/or paste any magnet link.": "Es posible utilizar torrents y enlaces magnéticos con Popcorn Time. Simplemente, arrastra y suelta un archivo .torrent en la ventana de la aplicación, y/o pega cualquier enlace magnet.", + "Torrent health": "Salud del Torrent", + "On the details of Movies/TV Series, you can find a little circle, colored in grey, red, yellow or green. Those colors refer to the health of the torrent. A green torrent will be downloaded quickly, while a red torrent may not be downloaded at all, or very slowly. The color grey represents an error in the health calculation for Movies, and needs to be clicked in TV Series in order to display the health.": "En las fichas de las películas o series, encontrarás un pequeño círculo de color gris, rojo, amarillo o verde. Esos colores hacen referencia a la salud del torrent. Un torrent verde se descargará rápidamente mientras que un torrent rojo no se descargará en absoluto o lo hará muy lentamente. El color gris representa un error en el cálculo de la salud para la películas, y para las series necesita un clic de tu parte con el fin de mostrar la salud del torrent.", + "How does Popcorn Time work?": "¿Cómo funciona Popcorn Time?", + "Popcorn Time streams video content through torrents. Our movies are provided by %s and our TV Series by %s, while getting all metadata from %s. We don't host any content ourselves.": "Popcorn Time transmite contenido de vídeo a través de archivos torrent. Nuestras películas son proporcionadas por %s y nuestras series de TV por %s, mientras que obtenemos todos los metadatos de %s. No alojamos ningún contenido nosotros mismos.", + "Torrent streaming? Well, torrents use Bittorrent protocol, which basically means that you download small parts of the content from another user's computer, while sending the parts you already downloaded to another user. Then, you watch those parts, while the next ones are being downloaded in the background. This exchange allows the content to stay healthy.": "¿Transmisión por torrents? Bueno, los archivos torrent utilizan el protocolo Bittorrent que, básicamente, significa que se descargan pequeñas partes del contenido, el video, del ordenador de un usuario, mientras envía las que ya ha descargado a otro usuario. Así, puedes ver esas partes mientras las siguientes se descargan en segundo plano. Este intercambio de datos permite que el contenido se mantenga sano.", + "Once the movie is fully downloaded, you continue to send parts to the other users. And everything is deleted from your computer when you close Popcorn Time. As simple as that.": "Una vez se ha descargado completamente la película, continúas enviando partes a otros usuarios. Y cuando cierras Popcorn Time, se elimina todo. Así de sencillo.", + "The application itself is built with Node-Webkit, HTML, CSS and Javascript. It works like the Google Chrome browser, except that you host the biggest part of the code on your computer. Yes, Popcorn Time works on the same technology as a regular website, like... let's say Wikipedia, or Youtube!": "La aplicación en si está construida con Node-Webkit, HTML, CSS y Javascript. Funciona igual que el navegador Google Chrome, excepto por el hecho de que la mayor parte del código se aloja en tu propio ordenador. Sí, Popcorn Time funciona con la misma tecnología que una página web normal, como... digamos, ¡Wikipedia o Youtube!", + "I found a bug, how do I report it?": "Encontré un error, ¿cómo lo puedo notificar?", + "No historics found...": "No se ha encontrado ningún histórico...", + "Error, database is probably corrupted. Try flushing the history in settings.": "Error. La base de datos probablemente esté corrupta. Prueba a limpiar los favoritos en la página de Configuración.", + "You can paste magnet links anywhere in Popcorn Time with CTRL+V.": "Puedes pegar enlaces magnet en cualquier lugar de Popcorn Time con CTRL+V.", + "You can drag & drop a .torrent file into Popcorn Time.": "Puedes arrastrar y soltar un archivo torrent sobre Popcorn Time.", + "The Popcorn Time project started in February 2014 and has already had 150 people that contributed more than 3000 times to it's development in August 2014.": "En el proyecto Popcorn Time, que se inició en febrero de 2014, ya han habido 150 personas que han contribuído a su desarrollo más de 3000 veces, sólo en agosto de 2014.", + "The rule n°10 applies here.": "Se aplica la regla número 10.", + "If a subtitle for a TV series is missing, you can add it on %s. And the same way for a movie, but on %s.": "Si falta algún subtitulo de una serie, puedes añadirlo en %s. Y lo mismo para las películas, pero en %s.", + "If you're experiencing connection drop issues, try to reduce the DHT Limit in settings.": "Si estás experimentando problemas de conexión, prueba a reducir el límite DHT en la página de Configuración.", + "If you search \"1998\", you can see all the movies or TV series that came out that year.": "Si buscas \"1998\", podrás ver todas las películas o series que se estrenaron ese año.", + "You can login to Trakt.tv to save all your watched items, and synchronize them across multiple devices.": "Puedes acceder a Trakt.tv para guardar todos tus elementos vistos y sincronizarlos a través de múltiples dispositivos.", + "Clicking on the rating stars will display a number instead.": "Al hacer clic en las estrellas de valoración se mostrará un número en su lugar.", + "This application is entirely written in HTML5, CSS3 and Javascript.": "Esta aplicación está completamente escrita en HTML5, CSS3 y Javascript.", + "You can find out more about a movie or a TV series? Just click the IMDb icon.": "¿Quieres saber más sobre una película o una serie? Sólo tienes que hacer clicl en el icono de IMDb.", + "Clicking twice on a \"Sort By\" filter reverses the order of the list.": "Al hacer doble clic en el filtro \"Ordenar por\", se invierte el orden de la lista", + "Switch to next tab": "Ir a la pestaña siguiente", + "Switch to previous tab": "Ir a la pestaña anterior", + "Switch to corresponding tab": "Ir a la pestaña correspondiente", + "through": "hasta", + "Enlarge Covers": "Agrandar las portadas", + "Reduce Covers": "Reducir las portadas", + "Open the Help Section": "Abre la sección de ayuda", + "Open Item Details": "Abre la ficha del elemento", + "Add Item to Favorites": "Añadir a Favoritos", + "Mark as Seen": "Marcar como visto", + "Open this screen": "Abre esta página", + "Open Settings": "Abre la página de Configuración", + "Posters Size": "Tamaño de los carteles", + "This feature only works if you have your TraktTv account synced. Please go to Settings and enter your credentials.": "Esta característica sólo funciona si tienes sincronizada tu cuenta de Trakt.tv; por favor, introduce tus credenciales de acceso en la página de Configuración.", + "Last Open": "Último abierto", + "Exporting Database...": "Exportando base de datos...", + "Database Successfully Exported": "Base de datos exportada correctamente.", + "Display": "Visualizar", + "TV": "TV", + "Type": "Tipo", + "popularity": "Popularidad", + "date": "fecha", + "year": "Año", + "rating": "Valoración", + "updated": "Actualización", + "name": "Nombre", + "OVA": "OVA", + "ONA": "ONA", + "No anime found...": "No se ha encontrado ningún anime...", + "Movie": "Película", + "Special": "Especial", + "No Watchlist found...": "No se ha encontrado ningun elemento en tu Lista de Visionado...", + "Watchlist": "Lista de Visionado", + "Resolving..": "Resolviendo...", + "About": "Acerca de", + "Open Cache Directory": "Abrir el directorio caché", + "Open Database Directory": "Abrir el directorio de base de datos", + "Mark as unseen": "Marcar como no visto", + "Playback rate": "Velocidad de reproducción", + "Increase playback rate by %s": "Aumentar velocidad de reproducción por %s", + "Decrease playback rate by %s": "Disminuir velocidad de reproducción por %s", + "Set playback rate to %s": "Establecer velocidad de reproducción en %s", + "Playback rate adjustment is not available for this video!": "¡El ajuste de la velocidad de reproducción no está disponible para este vídeo!", + "Color": "Color", + "With Shadows": "Con sombras", + "Local IP Address": "Dirección IP local", + "Japan": "Japón", + "Cars": "Coches", + "Dementia": "Demencia", + "Demons": "Demonios", + "Ecchi": "Ecchi", + "Game": "Juego", + "Harem": "Harem", + "Historical": "Histórico", + "Josei": "Josei", + "Kids": "Niños", + "Magic": "Magia", + "Martial Arts": "Artes marciales", + "Mecha": "Mecha", + "Military": "Militar", + "Parody": "Parodia", + "Police": "Policiaca", + "Psychological": "Psicológica", + "Samurai": "Samurai", + "School": "Escuela", + "Seinen": "Seinen", + "Shoujo": "Shoujo", + "Shoujo Ai": "Shoujo Ai", + "Shounen": "Shounen", + "Shounen Ai": "Shounen Ai", + "Slice Of Life": "Recuento de la vida", + "Slice of Life": "Recuentos de la vida", + "Space": "Espacio", + "Sports": "Deportes", + "Super Power": "Superpoderes", + "Supernatural": "Sobrenatural", + "Vampire": "Vampiros", + "Alphabet": "Orden alfabético", + "Automatically Sync on Start": "Sincronizar automáticamente al inicio", + "Setup VPN": "Configurar VPN", + "VPN": "VPN", + "Install VPN Client": "Instalar cliente VPN", + "More Details": "Más información", + "Don't show me this VPN option anymore": "No volver a mostrar esta opción VPN", + "Activate automatic updating": "Activar actualización automática", + "We are installing VPN client": "Estamos instalando el cliente VPN", + "VPN Client Installed": "Cliente VPN instalado", + "Please wait...": "Por favor, espera...", + "VPN.ht client is installed": "El cliente VPN.ht está instalado", + "Install again": "Reinstalar", + "Connect": "Conectar", + "Create Account": "Crear cuenta", + "Please, allow ~ 1 minute": "Por favor, concede ~ 1 minuto", + "Status: Connecting to VPN...": "Estado: Conectando VPN...", + "Status: Monitoring connexion - ": "Estado: Monitorizando conexión -", + "Connect VPN": "Conectar VPN", + "Disconnect VPN": "Desconectar VPN", + "Celebrate various events": "Aplicar temas para eventos y festividades", + "ATTENTION! We need admin access to run this command.": "¡ATENCIÓN! Se necesitan permisos de administrador para ejecutar este comando.", + "Your password is not saved": "Tu contraseña no se ha guardado", + "Enter sudo password :": "Introduce la contraseña de superusuario:", + "Status: Monitoring connection": "Estado: Monitorizando conexión", + "Status: Connected": "Estado: Conectado", + "Secure connection": "Conexión segura", + "Your IP:": "Tu IP:", + "Disconnect": "Desconectar", + "Downloaded": "Descargado", + "Loading stuck ? Click here !": "¿Se ha detenido la carga? ¡Haz clic aquí!", + "Torrent Collection": "Colección de torrents", + "Drop Magnet or .torrent": "Soltar enlace magnet o .torrent", + "Remove this torrent": "Eliminar este torrent", + "Rename this torrent": "Renombrar este torrent", + "Flush entire collection": "Eliminar toda la colección", + "Open Collection Directory": "Abrir el directorio de la colección", + "Store this torrent": "Guardar este torrent", + "Enter new name": "Introducir nuevo nombre", + "This name is already taken": "Este nombre ya está en uso", + "Always start playing in fullscreen": "Siempre iniciar la reproducción en pantalla completa", + "Allow torrents to be stored for further use": "Permitir que los torrents se guarden para un uso posterior", + "Hide VPN from the filter bar": "Ocultar icono VPN de la barra de filtros", + "Magnet link": "Enlace magnet", + "Error resolving torrent.": "Error resolviendo torrent.", + "%s hour(s) remaining": "%s hora(s) restantes", + "%s minute(s) remaining": "%s minuto(s) restantes", + "%s second(s) remaining": "%s segundo(s) restantes", + "Unknown time remaining": "Tiempo restante desconocido", + "Set player window to video resolution": "Ajustar ventana del reproductor a la resolución del vídeo", + "Set player window to double of video resolution": "Ajustar ventana del reproductor al doble de la resolución del vídeo", + "Set player window to half of video resolution": "Ajustar ventana del reproductor a la mitad de la resolución del vídeo", + "Retry": "Reintentar", + "Import a Torrent": "Importar torrent", + "The remote movies API failed to respond, please check %s and try again later": "La API remota de las películas no ha respondido, por favor, comprueba %s e inténtalo de nuevo más tarde", + "The remote shows API failed to respond, please check %s and try again later": "La API remota de las series no ha respondido, por favor, comprueba %s e inténtalo de nuevo más tarde", + "The remote anime API failed to respond, please check %s and try again later": "La API remota de anime no ha respondido, por favor, comprueba %s e inténtalo de nuevo más tarde", + "Not Seen": "No visto", + "Seen": "Visto", + "Title": "Título", + "The video playback encountered an issue. Please try an external player like %s to view this content.": "La reproducción del video encontró un problema. Para ver este contenido, por favor intenta con un reproductor externo, como %s.", + "Font": "Fuente", + "Decoration": "Efecto", + "None": "Ninguno", + "Outline": "Contorno", + "Opaque Background": "Fondo opaco", + "No thank you": "No, gracias", + "Report an issue": "Notificar una incidencia", + "Log in into your GitLab account": "Acceder a su cuenta GitLab", + "Email": "Email", + "Log in": "Acceder", + "Report anonymously": "Informar anónimamente", + "Note regarding anonymous reports:": "Nota relativa a informes anónimos:", + "You will not be able to edit or delete your report once sent.": "No podrás editar o eliminar tu informe una vez enviado.", + "If any additionnal information is required, the report might be closed, as you won't be able to provide them.": "Si se requiere cualquier información adicional, el informe podría ser cerrado, ya que no podrás proporcionarla.", + "Step 1: Please look if the issue was already reported": "Paso 1: Por favor, mire si la incidencia ya se informó anteriormente", + "Enter keywords": "Introducir palabras clave", + "Already reported": "Ya ha sido informada", + "I want to report a new issue": "Quiero informar de una nueva incidencia", + "Step 2: Report a new issue": "Paso 2: Informar de una nueva incidencia", + "Note: please don't use this form to contact us. It is limited to bug reports only.": "Nota: por favor, no utilice este formulario para contactar con nosotros. Está limitado a sólo informar de errores.", + "The title of the issue": "Título de la incidencia", + "Description": "Descripción", + "200 characters minimum": "Mínimo 200 caracteres", + "A short description of the issue. If suitable, include the steps required to reproduce the bug.": "Una breve descripción del problema. Si es apropiado, incluya los pasos necesarios para reproducir el error.", + "Submit": "Enviar", + "Step 3: Thank you !": "Paso 3: ¡Gracias!", + "Your issue has been reported.": "Su incidencia ha sido notificada.", + "Open in your browser": "Abrir en su navegador", + "No issues found...": "No se han encontrado incidencias...", + "First method": "Primer método", + "Use the in-app reporter": "Usar el informador integrado", + "You can find it later on the About page": "Podrás encontrarlo más tarde en la página \"Acerca de\"", + "Second method": "Segundo método", + "You can create an account on our %s repository, and click on %s.": "Puedes crear una cuenta en nuestro repositorio %s y hacer clic en %s", + "Use the %s issue filter to search and check if the issue has already been reported or is already fixed.": "Usa el %s del filtro de errores para buscar y revisar si el problema ya ha sido informado o si ya está solucionado.", + "Include a screenshot if relevant - Is your issue about a design feature or a bug?": "Incluye una captura de pantalla si es relevante - ¿Tu problema es sobre una característica del diseño o es un error del programa?", + "A good bug report shouldn't leave others needing to chase you up for more information. Be sure to include the details of your environment.": "Un buen informe de errores no debería dejar a otras personas con la necesidad de tener que localizarte para obtener más información. Asegúrate de incluir todos los detalles de tu entorno.", + "Warning: Always use English when contacting us, or we might not understand you.": "Aviso: Usa siempre el inglés cuando nos contactes o no podremos entenderte.", + "Search on %s": "Buscar en %s", + "No results found": "No se encontraron resultados", + "Invalid credentials": "Credenciales no válidas", + "Open Favorites": "Abrir Favoritos", + "Open About": "Abrir acerca de", + "Minimize to Tray": "Minimizar a la bandeja del sistema", + "Close": "Cerrar", + "Restore": "Restablecer", + "Resume Playback": "Reanudar Reproducción", + "Features": "Características", + "Connect To %s": "Conectar A %s", + "The magnet link was copied to the clipboard": "El magnet link fue copiado al portapapeles", + "Big Picture Mode": "Modo \"Big Picture\"", + "Big Picture Mode is unavailable on your current screen resolution": "El modo \"Big Picture\" no está disponible en tu resolución de pantalla actual", + "Cannot be stored": "No puede ser guardado", + "%s reported this torrent as fake": "%s reportaron que este Torrent es falso", + "%s could not verify this torrent": "%s no pudieron verificar este torrent", + "Randomize": "Selección Aleatoria", + "Randomize Button for Movies": "Botón de Selección Aleatoria para películas", + "Overall Ratio": "Ratio General", + "Translate Synopsis": "Traducir Sinopsis", + "Returning Series": "En Emisión", + "In Production": "En Producción", + "Canceled": "Canceladas", + "N/A": "No Disponible", + "%s is not supposed to be run as administrator": "%s no se supone que se pueda ejecutar como administrador", + "Your disk is almost full.": "Tu disco duro está casi lleno.", + "You need to make more space available on your disk by deleting files.": "Es necesario que dispongas de más espacio disponible en el disco eliminando archivos.", + "Playing Next": "Reproducir Siguiente", + "Trending": "Tendencias", + "Downloads": "Downloads", + "Likes": "Likes", + "Movie Search": "Movie Search", + "This feature has a built-in kat.cr search, which allows you to stream any movies, series or anime torrents with automatic subtitle support. The casting option integrates features including Chromecast, Airplay and DLNA. This library also provides an Anti-Virus Scanner and a 'History' feature, that keeps track of all your downloaded KAT torrents": "This feature has a built-in kat.cr search, which allows you to stream any movies, series or anime torrents with automatic subtitle support. The casting option integrates features including Chromecast, Airplay and DLNA. This library also provides an Anti-Virus Scanner and a 'History' feature, that keeps track of all your downloaded KAT torrents", + "Plugins": "Plugins", + "OpenSubtitles Username": "OpenSubtitles Username", + "OpenSubtitles Password": "OpenSubtitles Password", + "Stream from Browser": "Stream from Browser", + "Torrent Link": "Torrent Link", + "Magnet Link": "Magnet Link", + "Movie API Endpoint": "Movie API Endpoint", + "Activate Google Analytics": "Activate Google Analytics" } \ No newline at end of file diff --git a/src/app/language/fr.json b/src/app/language/fr.json index 168c2f5a..5c8e4561 100644 --- a/src/app/language/fr.json +++ b/src/app/language/fr.json @@ -1,490 +1,502 @@ { - "External Player": "Lecteur externe", - "Made with": "Créé avec", - "by a bunch of geeks from All Around The World": "par une bande de geeks venant du monde entier", - "Initializing PopcornTime. Please Wait...": "Démarrage de Popcorn Time. Veuillez patienter…", - "Status: Checking Database...": "Statut : Vérification de la base de données…", - "Movies": "Films", - "TV Series": "Séries TV", - "Anime": "Anime", - "Genre": "Genre", - "All": "Tous", - "Action": "Action", - "Adventure": "Aventure", - "Animation": "Animation", - "Children": "Enfants", - "Comedy": "Comédie", - "Crime": "Crime", - "Documentary": "Documentaire", - "Drama": "Drame", - "Family": "Famille", - "Fantasy": "Fantastique", - "Game Show": "Jeu télévisé", - "Home And Garden": "Maison et jardin", - "Horror": "Horreur", - "Mini Series": "Mini séries", - "Mystery": "Mystère", - "News": "Actualités", - "Reality": "Réalité", - "Romance": "Romance", - "Science Fiction": "Science-Fiction", - "Soap": "Feuilleton", - "Special Interest": "Intérêt spécial", - "Sport": "Sport", - "Suspense": "Suspens", - "Talk Show": "Emission télévisée", - "Thriller": "Thriller", - "Western": "Western", - "Sort by": "Trier par", - "Popularity": "Popularité", - "Updated": "Mise à jour", - "Year": "Année", - "Name": "Nom", - "Search": "Recherche", - "Season": "Saison", - "Seasons": "Saisons", - "Season %s": "Saison %s", - "Load More": "Voir plus", - "Saved": "Enregistré", - "Settings": "Réglages", - "Show advanced settings": "Montrer les réglages avancés", - "User Interface": "Interface", - "Default Language": "Langue par défaut", - "Theme": "Thème", - "Start Screen": "Écran d'accueil", - "Favorites": "Favoris", - "Show rating over covers": "Montrer la note sur les affiches", - "Always On Top": "Toujours au premier plan", - "Watched Items": "Éléments visionnés", - "Show": "Montrer", - "Fade": "Décolorer", - "Hide": "Cacher", - "Subtitles": "Sous-titres", - "Default Subtitle": "Sous-titres par défaut", - "Disabled": "Désactivés", - "Size": "Taille", - "Quality": "Qualité", - "Only list movies in": "Uniquement les films en", - "Show movie quality on list": "Afficher la qualité des films dans la liste", - "Trakt.tv": "Trakt.tv", - "Enter your Trakt.tv details here to automatically 'scrobble' episodes you watch in Popcorn Time": "Entrez vos identifiants Trakt.tv pour 'scrobbler' automatiquement les épisodes regardés avec Popcorn Time", - "Connect to %s to automatically 'scrobble' episodes you watch in %s": "Connectez-vous à %s pour 'scrobbler' automatiquement les épisodes regardés avec %s", - "Username": "Nom d'utilisateur", - "Password": "Mot de passe", - "Popcorn Time stores an encrypted hash of your password in your local database": "Popcorn Time conserve une empreinte chiffrée du mot de passe dans votre base de données locale", - "Remote Control": "Contrôle à distance", - "HTTP API Port": "Port HTTP", - "HTTP API Username": "Nom d'utilisateur", - "HTTP API Password": "Mot de passe", - "Connection": "Connexion", - "TV Show API Endpoint": "Adresse de l'API Séries", - "Movies API Endpoint": "Adresse de l'API Films", - "Connection Limit": "Limite de connexion", - "DHT Limit": "Limite DHT", - "Port to stream on": "Port de diffusion", - "0 = Random": "0 = Aléatoire", - "Cache Directory": "Dossier temporaire", - "Clear Tmp Folder after closing app?": "Nettoyer le dossier temporaire à la fermeture", - "Database": "Base de données", - "Database Directory": "Dossier utilisé", - "Import Database": "Importer une base de données", - "Export Database": "Exporter une base de données", - "Flush bookmarks database": "Vider la base de données des favoris", - "Flush subtitles cache": "Vider le cache des sous-titres", - "Flush all databases": "Vider les bases de données", - "Reset to Default Settings": "Rétablir les réglages par défaut", - "Importing Database...": "Importation de la base de données...", - "Please wait": "Veuillez patienter", - "Error": "Erreur", - "Biography": "Biographie", - "Film-Noir": "Film Noir", - "History": "Histoire", - "Music": "Musique", - "Musical": "Comédie Musicale", - "Sci-Fi": "Science-Fiction", - "Short": "Court métrage", - "War": "Guerre", - "Last Added": "Derniers ajouts", - "Rating": "Note", - "Open IMDb page": "Ouvrir la page IMDb", - "Health false": "Santé - erreur", - "Add to bookmarks": "Ajouter aux favoris", - "Watch Trailer": "Voir la bande-annonce", - "Watch Now": "Visionner maintenant", - "Health Good": "Bonne santé", - "Ratio:": "Ratio :", - "Seeds:": "Sources :", - "Peers:": "Clients :", - "Remove from bookmarks": "Retirer des favoris", - "Changelog": "Historique des modifications", - "Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.": "Popcorn Time est le fruit de nombreux développeurs et de graphistes qui ont rassemblé plusieurs API dans le but de rendre l'expérience du streaming via torrent la plus simple possible.", - "We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.": "Nous construisons ce projet en open source depuis les quatre coins du monde. Nous adorons le cinéma… et le popcorn !", - "Invalid PCT Database File Selected": "Fichier de base de données Popcorn Time sélectionné invalide", - "Health Unknown": "Santé - inconnue", - "Episodes": "Épisodes", - "Episode %s": "Épisode %s", - "Aired Date": "Date de diffusion", - "Streaming to": "Joué via", - "connecting": "Connexion…", - "Download": "Téléchargement", - "Upload": "Envoi", - "Active Peers": "Clients actifs", - "Cancel": "Annuler", - "startingDownload": "Démarrage du téléchargement…", - "downloading": "Téléchargement…", - "ready": "Prêt", - "playingExternally": "En lecture externe", - "Custom...": "Ajouter…", - "Volume": "Volume", - "Ended": "Terminé", - "Error loading data, try again later...": "Erreur lors du chargement des données, réessayez plus tard…", - "Miscellaneous": "Divers", - "When opening TV Show Detail Jump to:": "À l'ouverture d'une fiche de série TV aller au :", - "First Unwatched Episode": "Premier épisode non visionné", - "Next Episode In Series": "Prochain épisode", - "When Opening TV Show Detail Jump To": "À l'ouverture d'une fiche de série TV aller au", - "Flushing...": "Suppression…", - "Are you sure?": "Confirmer ?", - "We are flushing your databases": "Nous vidons les bases de données", - "Success": "Réussite", - "Please restart your application": "Veuillez redémarrer l'application", - "Restart": "Redémarrer", - "Terms of Service": "Conditions d'utilisation", - "I Accept": "J'accepte", - "Leave": "Quitter", - "When Opening TV Series Detail Jump To": "Au chargement des détails de séries, sélectionner", - "Health Medium": "Santé moyenne", - "Playback": "Lecture", - "Play next episode automatically": "Jouer l'épisode suivant automatiquement", - "Generate Pairing QR code": "Générer un code QR", - "Playing Next Episode in": "Prochain épisode dans", - "Play": "Lire", - "Dismiss": "Rejeter", - "waitingForSubtitles": "En attente des sous-titres…", - "Play Now": "Lire maintenant", - "Seconds": "Secondes", - "You are currently authenticated to Trakt.tv as": "Vous êtes actuellement identifié sur Trakt.tv en tant que", - "You are currently connected to %s": "Vous êtes actuellement connecté à %s", - "Disconnect account": "Se déconnecter", - "Sync With Trakt": "Synchroniser avec Trakt", - "Syncing...": "Synchronisation…", - "Done": "Terminé", - "Subtitles Offset": "Décalage des sous-titres", - "secs": "secs", - "We are flushing your database": "Nous vidons la base de données", - "We are rebuilding the TV Show Database. Do not close the application.": "Nous reconstruisons la base de données des séries TV. Ne pas fermer l'application.", - "No shows found...": "Aucune série trouvée…", - "No Favorites found...": "Aucun favori trouvé…", - "Rebuild TV Shows Database": "Reconstruire la base de données des séries TV", - "No movies found...": "Aucun film trouvé…", - "Ratio": "Ratio", - "Health Excellent": "Excellente santé", - "Health Bad": "Mauvaise santé", - "Status: Creating Database...": "Statut : Création de la base de données…", - "Status: Updating database...": "Statut : Mise à jour de la base de données…", - "Status: Skipping synchronization TTL not met": "Statut : Saut de synchronisation TTL non rencontré", - "Advanced Settings": "Réglages avancés", - "Clear Cache directory after closing app?": "Nettoyer le dossier temporaire à la fermeture", - "Tmp Folder": "Dossier temporaire", - "Status: Downloading API archive...": "Statut : Téléchargement de l'archive API…", - "Status: Archive downloaded successfully...": "Statut : Archive téléchargée avec succès", - "Status: Importing file": "Statut : Importation du fichier", - "Status: Imported successfully": "Statut : Importation réussie", - "Status: Launching applicaion... ": "Statut : Lancement de l'application", - "URL of this stream was copied to the clipboard": "L'URL de ce flux a été copiée dans le presse-papier", - "Error, database is probably corrupted. Try flushing the bookmarks in settings.": "Erreur, la base de données est probablement corrompue. Essayez de vider les favoris dans Réglages.", - "Flushing bookmarks...": "Suppression des favoris…", - "Resetting...": "Réinitialisation…", - "We are resetting the settings": "Nous réinitialisons les réglages…", - "New version downloaded": "Nouvelle version téléchargée", - "Installed": "Installée", - "Install Now": "Installer maintenant", - "Restart Now": "Redémarrer maintenant", - "We are flushing your subtitle cache": "Nous vidons le cache des sous-titres", - "Subtitle cache deleted": "Cache des sous-titres supprimé.", - "Please select a file to play": "Veuillez sélectionner un fichier à lire", - "Test Login": "Tester l'identification", - "Testing...": "Test en cours…", - "Success!": "Réussi !", - "Failed!": "Échec !", - "Global shortcuts": "Raccourcis globaux", - "Video Player": "Lecteur vidéo", - "Toggle Fullscreen": "Plein écran", - "Play/Pause": "Lecture / Pause", - "Seek Forward": "Avancer de", - "Increase Volume": "Augmenter le volume de", - "Set Volume to": "Régler le volume à", - "Offset Subtitles by": "Décaler les sous-titres de", - "Toggle Mute": "Couper le son", - "Movie Detail": "Fiche du film", - "Toggle Quality": "Changer la qualité", - "Play Movie": "Lire le film", - "Exit Fullscreen": "Sortir du plein écran", - "Seek Backward": "Reculer de", - "Decrease Volume": "Diminuer le volume de", - "Show Stream URL": "Montrer l'URL du flux", - "TV Show Detail": "Fiche de la série TV", - "Toggle Watched": "Marquer comme vu", - "Select Next Episode": "Épisode suivant", - "Select Previous Episode": "Épisode précédent", - "Select Next Season": "Saison suivante", - "Select Previous Season": "Saison précédente", - "Play Episode": "Lire l'épisode", - "space": "espace", - "shift": "maj", - "ctrl": "ctrl", - "enter": "entrée", - "esc": "esc", - "Keyboard Shortcuts": "Raccourcis clavier", - "Cut": "Couper", - "Copy": "Copier", - "Paste": "Coller", - "Help Section": "Aide", - "Did you know?": "Le saviez-vous ?", - "What does Popcorn Time offer?": "Que propose Popcorn Time ?", - "With Popcorn Time, you can watch Movies and TV Series really easily. All you have to do is click on one of the covers, then click 'Watch Now'. But your experience is highly customizable:": "Avec Popcorn Time, vous pouvez aisément regarder des films et des séries TV. Tout ce que vous avez à faire, c'est de cliquer sur une des affiches, puis sur 'Visionner Maintenant'. De plus, l'expérience est totalement personnalisable :", - "Our Movies collection only contains High-Definition movies, available in 720p and 1080p. To watch a movie, simply open Popcorn Time and navigate through the movies collection, reachable through the 'Movies' tab, in the navigation bar. The default view will show you all movies sorted by popularity, but you can apply your own filters, thanks to the 'Genre' and 'Sort by' filters. Once you have chosen a movie you want to watch, click its cover. Then click 'Watch Now'. Don't forget the popcorn!": "Notre collection de films est constituée uniquement de contenu Haute Définition, disponibles en 720p ou 1080p. Pour visionner un film, ouvrez simplement Popcorn Time et naviguez dans la liste, accessible via l'onglet 'Films', dans la barre de navigation. Par défaut, tous les films sont proposés, triés par ordre de popularité, mais vous pouvez appliquer vos propres filtres, grâce à 'Genre' et 'Trier par'. Une fois un film choisi, cliquez sur son affiche, puis sur 'Visionner Maintenant'. N'oubliez pas le popcorn !", - "The TV Series tab, that you can reach by clicking 'TV Series' in the navigation bar, will show you all available series in our collection. You can also apply your own filters, same as the Movies, to help you decide what to watch. In this collection, also just click the cover: the new window that will appear will allow you to navigate through Seasons and Episodes. Once your mind is set, just click the 'Watch Now' button.": "L'onglet Séries TV, accessible via la barre de navigation, vous présentera toutes les séries disponibles dans notre collection. Vous pouvez ici aussi appliquez vos propres filtres, comme pour les films. Dans cette liste, cliquez également sur l'affiche : la nouvelle fenêtre qui apparaîtra vous permettra de naviguer dans les différents épisodes et saisons. Une fois une série choisie, cliquez simplement sur le bouton 'Visionner maintenant'.", - "Choose quality": "Choisir la qualité", - "A slider next to the 'Watch Now' button will let you choose the quality of the stream. You can also set a fixed quality in the Settings tab. Warning: a better quality equals more data to download.": "Le curseur situé près du bouton 'Visionner maintenant' permet de choisir la qualité du contenu. Vous pouvez également définir une qualité donnée dans l'onglet Réglages. Avertissement : une meilleure qualité signifie plus de données à télécharger.", - "Most of our Movies and TV Series have subtitles in your language. You can set them in the Settings tab. For the Movies, you can even set them through the dropdown menu, in the Movie Details page.": "La plupart de nos films et séries TV ont des sous-titres pour votre langue. Vous pouvez définir les sous-titres dans l'onglet Réglages. Pour les films, il est aussi possible de choisir un sous-titre dans un menu déroulant prévu à cet effet sur la page du film.", - "Clicking the heart icon on a cover will add the movie/show to your favorites. This collection is reachable through the heart-shaped icon, in the navigation bar. To remove an item from your collection, just click on the icon again! How simple is that?": "Cliquer sur l'icône en forme de coeur, sur une affiche, va ajouter le film / la série à vos favoris. Cette collection est accessible via l'icône en forme de coeur située dans la barre de navigation. Pour retirer un élément des favoris, cliquez simplement sur le coeur à nouveau ! Plutôt simple, non ?", - "Watched icon": "Icône 'visionné'", - "Popcorn Time will keep in mind what you've already watched - a little help remembering doesn't cause any harm. You can also set an item as watched by clicking the eye-shaped icon on the covers. You can even build and synchronize your collection with Trakt.tv website, via the Settings tab.": "Popcorn Time va se souvenir de ce que vous avez déjà visionné - un peu d'aide ne fait de mal à personne. Vous pouvez également marquer un élément comme visionné en cliquant sur l'icône en forme d'oeil sur les affiches. De plus, vous pouvez vous construire une collection puis la synchroniser avec le site Trakt.tv, via l'onglet Réglages.", - "In Popcorn Time, you can use the magnifier icon to open the search. Type a Title, an Actor, a Director or even a Year, press 'Enter' and let us show you what we can offer to fill your needs. To close your current search, you can click on the 'X' located next to your entry or type something else in the field.": "Dans Popcorn Time, vous pouvez utiliser l'icône en forme de loupe pour lancer une recherche. Entrez un titre, un acteur, un réalisateur ou même une année, appuyez sur 'Entrée' et laissez-nous vous montrer ce qu'on peut vous proposer. Pour clore une recherche, cliquez sur le 'X' situé à côté du mot-clé ou lancez une autre recherche.", - "External Players": "Lecteurs externes", - "If you prefer to use a custom player instead of the built in one, you can do so by clicking the allocated icon on the 'Watch Now' button. A list of your installed players will be shown, select one and Popcorn Time will send everything to it. If your player isn't on the list, please report it to us.": "Si vous préférez utiliser un lecteur externe à la place de celui par défaut, vous le pouvez en cliquant sur l'icône prévue à cet effet sur le bouton 'Visionner maintenant'. Une liste des lecteurs disponibles s'affichera: sélectionnez-en un et Popcorn Time lui enverra tout le nécessaire. Si votre lecteur n'est pas repris dans la liste, veuillez s'il vous plait nous le signaler.", - "To push the customization even further, we offer you a large panel of options. To access the Settings, click the wheel-shaped icon in the navigation bar.": "Pour pousser la personnalisation encore plus loin, nous vous proposons un large panel d'options. Pour accéder aux Réglages, cliquez sur l'icône en forme de rouage dans la barre de navigation.", - "Keyboard Navigation": "Navigation au clavier", - "The entire list of keyboard shortcuts is available by pressing '?' on your keyboard, or through the keyboard-shaped icon in the Settings tab.": "La liste complète des raccourcis clavier est disponible par une pression sur '?' sur votre clavier, ou via l'icône en forme de clavier dans l'onglet Réglages.", - "Custom Torrents and Magnet Links": "Torrents personnels et liens Magnet", - "You can use custom torrents and magnets links in Popcorn Time. Simply drag and drop .torrent files into the application's window, and/or paste any magnet link.": "Il est possible d'utiliser des torrents et liens magnet avec Popcorn Time. Glissez et déposez simplement un fichier .torrent dans la fenêtre de l'application, et/ou collez un lien magnet.", - "Torrent health": "Santé des torrents", - "On the details of Movies/TV Series, you can find a little circle, colored in grey, red, yellow or green. Those colors refer to the health of the torrent. A green torrent will be downloaded quickly, while a red torrent may not be downloaded at all, or very slowly. The color grey represents an error in the health calculation for Movies, and needs to be clicked in TV Series in order to display the health.": "Sur la page des films/séries, vous trouverez un petit cercle, coloré en gris, rouge, jaune ou vert. Ces couleurs représentent la santé du torrent. Un torrent vert sera téléchargé rapidement, et un torrent rouge pourrait ne jamais être téléchargé, ou être d'une lenteur incroyable. La couleur grise indique une erreur dans le calcul de santé, pour les films, et nécessite un clic de votre part dans les séries TV afin d'afficher la santé du torrent.", - "How does Popcorn Time work?": "Comment fonctionne Popcorn Time ?", - "Popcorn Time streams video content through torrents. Our movies are provided by %s and our TV Series by %s, while getting all metadata from %s. We don't host any content ourselves.": "Popcorn Time joue du contenu vidéo via des torrents. Nos films sont fournis par %s et nos séries TV par %s. Les métadonnées sont récupérées depuis %s. Nous n'hébergeons aucun contenu.", - "Torrent streaming? Well, torrents use Bittorrent protocol, which basically means that you download small parts of the content from another user's computer, while sending the parts you already downloaded to another user. Then, you watch those parts, while the next ones are being downloaded in the background. This exchange allows the content to stay healthy.": "Du streaming via des torrents ? En fait, les torrents utilisent le protocole Bittorent, ce qui signifie (en gros) que vous téléchargez des petites parties de contenu depuis l'ordinateur d'un tiers, tout en envoyant les parties que vous avez déjà téléchargées à un autre tiers. Vous pouvez alors visionner ces parties pendant que les suivantes sont téléchargées en arrière-plan. Cet échange de données permet au contenu de rester vivant et en bonne santé.", - "Once the movie is fully downloaded, you continue to send parts to the other users. And everything is deleted from your computer when you close Popcorn Time. As simple as that.": "Une fois le film entier téléchargé, vous continuez à envoyer des parties aux autres utilisateurs. Et tout disparaît de votre ordinateur à la fermeture de Popcorn Time. C'est aussi simple que cela.", - "The application itself is built with Node-Webkit, HTML, CSS and Javascript. It works like the Google Chrome browser, except that you host the biggest part of the code on your computer. Yes, Popcorn Time works on the same technology as a regular website, like... let's say Wikipedia, or Youtube!": "L'application elle-même est construite avec Node-Webkit et écrite en HTML, CSS et Javascript. Cela fonctionne un peu comme le navigateur Google Chrome, sauf que vous hébergez localement la grosse majorité du code. Eh oui, Popcorn Time fonctionne de la même façon qu'un site web comme... disons Wikipedia, ou Youtube !", - "I found a bug, how do I report it?": "J'ai trouvé un bug, comment le signaler ?", - "No historics found...": "Aucun historique...", - "Error, database is probably corrupted. Try flushing the history in settings.": "Erreur, la base de donnée est probablement corrompue. Essayez de vider l'historique dans Réglages.", - "You can paste magnet links anywhere in Popcorn Time with CTRL+V.": "Vous pouvez coller un lien magnet n'importe où dans Popcorn Time avec CTRL+V", - "You can drag & drop a .torrent file into Popcorn Time.": "Vous pouvez glisser et déposer un .torrent dans Popcorn Time", - "The Popcorn Time project started in February 2014 and has already had 150 people that contributed more than 3000 times to it's development in August 2014.": "Le projet Popcorn Time a commencé en février 2014 et 150 personnes avaient déjà contribué plus de 3000 fois à son développement en août 2014.", - "The rule n°10 applies here.": "La règle n°10 est d'application.", - "If a subtitle for a TV series is missing, you can add it on %s. And the same way for a movie, but on %s.": "Lorsqu'un sous-titre pour une série TV est manquant, vous pouvez l'ajouter sur %s. Il en va de même pour les films, sur %s", - "If you're experiencing connection drop issues, try to reduce the DHT Limit in settings.": "Si vous rencontrez des problèmes de perte de connexion, essayez de réduire la limite DHT dans Réglages", - "If you search \"1998\", you can see all the movies or TV series that came out that year.": "Recherchez \"1998\" pour trouver tous les films publiés cette année-là", - "You can login to Trakt.tv to save all your watched items, and synchronize them across multiple devices.": "Vous pouvez vous identifier à Trakt.tv pour sauvegarder les éléments visionnés, et les synchroniser sur plusieurs appareils.", - "Clicking on the rating stars will display a number instead.": "Un clic sur les étoiles de notation affiche un nombre à la place.", - "This application is entirely written in HTML5, CSS3 and Javascript.": "Cette application est entièrement écrite en HTML5, CSS3 et Javascript", - "You can find out more about a movie or a TV series? Just click the IMDb icon.": "Envie d'en savoir plus sur un film ou une série TV ? Cliquez simplement sur l'icône IMDb.", - "Clicking twice on a \"Sort By\" filter reverses the order of the list.": "Cliquer deux fois sur un des filtres \"Trier par\" inverse l'ordre de présentation.", - "Switch to next tab": "Aller à l'onglet suivant", - "Switch to previous tab": "Aller à l'onglet précédent", - "Switch to corresponding tab": "Aller à l'onglet correspondant", - "through": "à", - "Enlarge Covers": "Agrandir les affiches", - "Reduce Covers": "Diminuer les affiches", - "Open the Help Section": "Afficher l'Aide", - "Open Item Details": "Ouvrir la fiche de l'élément", - "Add Item to Favorites": "Ajouter aux favoris", - "Mark as Seen": "Marquer comme vu", - "Open this screen": "Afficher cette page", - "Open Settings": "Ouvrir les Réglages", - "Posters Size": "Taille des affiches", - "This feature only works if you have your TraktTv account synced. Please go to Settings and enter your credentials.": "Cette fonctionnalité n'est accessible qu'à ceux ayant un compte TraktTv synchronisé. Veuillez vous rendre dans les réglages pour entrer vos identifiants.", - "Last Open": "Dernier ouvert", - "Exporting Database...": "Exportation de la base de données...", - "Database Successfully Exported": "Base de données exportée avec succès", - "Display": "Affichage", - "TV": "Séries", - "Type": "Type", - "popularity": "popularité", - "date": "date", - "year": "année", - "rating": "note", - "updated": "mis à jour", - "name": "nom", - "OVA": "OAV", - "ONA": "ONA", - "No anime found...": "Aucun anime trouvé...", - "Movie": "Film", - "Special": "Spécial", - "No Watchlist found...": "Aucune liste de visionnage trouvée...", - "Watchlist": "Liste de visionnage", - "Resolving..": "Résolution...", - "About": "À propos", - "Open Cache Directory": "Ouvrir le dossier temporaire", - "Open Database Directory": "Ouvrir le dossier de la base de données", - "Mark as unseen": "Marquer comme non vu", - "Playback rate": "Vitesse de lecture", - "Increase playback rate by %s": "Augmenter la vitesse de lecture de %s", - "Decrease playback rate by %s": "Diminuer la vitesse de lecture de %s", - "Set playback rate to %s": "Régler la vitesse de lecture à %s", - "Playback rate adjustment is not available for this video!": "L'ajustement de la vitesse de lecture n'est pas disponible pour cette vidéo !", - "Color": "Couleur", - "With Shadows": "Ajouter une ombre", - "Local IP Address": "Adresse IP locale", - "Japan": "Japon", - "Cars": "Voitures", - "Dementia": "Psychologique", - "Demons": "Démons", - "Ecchi": "Ecchi", - "Game": "Jeu", - "Harem": "Harem", - "Historical": "Historique", - "Josei": "Josei", - "Kids": "Enfants", - "Magic": "Magie", - "Martial Arts": "Arts martiaux", - "Mecha": "Mecha", - "Military": "Militaire", - "Parody": "Parodie", - "Police": "Policier", - "Psychological": "Psychologique", - "Samurai": "Samouraï", - "School": "École", - "Seinen": "Seinen", - "Shoujo": "Shojo", - "Shoujo Ai": "Shojo-Ai", - "Shounen": "Shonen", - "Shounen Ai": "Shonen-Ai", - "Slice Of Life": "Tranche de vie", - "Slice of Life": "Tranche de vie", - "Space": "Espace", - "Sports": "Sports", - "Super Power": "Super-pouvoir", - "Supernatural": "Surnaturel", - "Vampire": "Vampire", - "Alphabet": "Titre", - "Automatically Sync on Start": "Synchroniser automatiquement au lancement", - "Setup VPN": "Configurer le VPN", - "VPN": "VPN", - "Install VPN Client": "Installer le client VPN", - "More Details": "Plus d'informations", - "Don't show me this VPN option anymore": "Je ne veux plus voir d'option VPN à l'avenir", - "Activate automatic updating": "Activer les mises à jour automatiques", - "We are installing VPN client": "Nous installons le client VPN", - "VPN Client Installed": "Le client VPN a été installé", - "Please wait...": "Veuillez patienter...", - "VPN.ht client is installed": "Le client VPN.ht est installé", - "Install again": "Réinstaller", - "Connect": "Connexion", - "Create Account": "Créer un compte", - "Please, allow ~ 1 minute": "Veuillez patienter ~ 1 minute", - "Status: Connecting to VPN...": "Statut : Connexion au VPN en cours...", - "Status: Monitoring connexion - ": "Statut : Contrôle de la connexion -", - "Connect VPN": "Connecter le VPN", - "Disconnect VPN": "Déconnecter le VPN", - "Celebrate various events": "Célébrer divers événements festifs", - "ATTENTION! We need admin access to run this command.": "ATTENTION ! Les droits d'administration sont requis pour lancer cette commande.", - "Your password is not saved": "Votre mot de passe n'est pas enregistré", - "Enter sudo password :": "Veuillez entrer votre mot de passe 'sudo' :", - "Status: Monitoring connection": "Statut : Contrôle de la connexion", - "Status: Connected": "Statut : Connecté", - "Secure connection": "Connexion sécurisée", - "Your IP:": "Votre IP :", - "Disconnect": "Déconnexion", - "Downloaded": "En cours", - "Loading stuck ? Click here !": "Chargement bloqué ? Cliquez ici !", - "Torrent Collection": "Collection de torrents", - "Drop Magnet or .torrent": "Déposez un magnet ou .torrent", - "Remove this torrent": "Supprimer ce torrent", - "Rename this torrent": "Renommer ce torrent", - "Flush entire collection": "Vider toute la collection", - "Open Collection Directory": "Ouvrir le dossier de la collection", - "Store this torrent": "Conserver ce torrent", - "Enter new name": "Entrez le nouveau nom", - "This name is already taken": "Ce nom est déjà utilisé", - "Always start playing in fullscreen": "Toujours commencer la lecture en mode plein écran", - "Allow torrents to be stored for further use": "Permettre aux torrents d'être conservés pour un usage ultérieur", - "Hide VPN from the filter bar": "Cacher l'option VPN", - "Magnet link": "Lien magnet", - "Error resolving torrent.": "Erreur lors de la résolution du torrent", - "%s hour(s) remaining": "%s heure(s) restante(s)", - "%s minute(s) remaining": "%s minute(s) restante(s)", - "%s second(s) remaining": "%s seconde(s) restante(s)", - "Unknown time remaining": "Temps restant indéterminé", - "Set player window to video resolution": "Définir la taille du lecteur à la résolution de la vidéo", - "Set player window to double of video resolution": "Définir la taille du lecteur au double de la résolution de la vidéo", - "Set player window to half of video resolution": "Définir la taille du lecteur à la moitié de la résolution de la vidéo", - "Retry": "Réessayer", - "Import a Torrent": "Importer un torrent", - "The remote movies API failed to respond, please check %s and try again later": "L'API Films ne répond pas, consultez %s et réessayez plus tard", - "The remote shows API failed to respond, please check %s and try again later": "L'API Séries ne répond pas, consultez %s et réessayez plus tard", - "The remote anime API failed to respond, please check %s and try again later": "L'API Anime ne répond pas, consultez %s et réessayez plus tard", - "Not Seen": "Non vu", - "Seen": "Vu", - "Title": "Titre", - "The video playback encountered an issue. Please try an external player like %s to view this content.": "La lecture de la vidéo a rencontré un problème. Veuillez essayez un lecteur externe, comme %s, pour visionner ce contenu.", - "Font": "Police", - "Decoration": "Habillage", - "None": "Aucun", - "Outline": "Tracer les contours", - "Opaque Background": "Assombrir l'arrière-plan", - "No thank you": "Non merci", - "Report an issue": "Rapporter un problème", - "Log in into your GitLab account": "Se connecter à un compte GitLab", - "Email": "Adresse email", - "Log in": "Se connecter", - "Report anonymously": "Rapport anonyme", - "Note regarding anonymous reports:": "À propos des rapports anonymes :", - "You will not be able to edit or delete your report once sent.": "Vous ne pourrez pas éditer ou supprimer le rapport une fois envoyé.", - "If any additionnal information is required, the report might be closed, as you won't be able to provide them.": "Si des précisions supplémentaires sont nécessaires, la rapport pourrait être fermé, puisque vous ne pourrez pas fournir ces informations.", - "Step 1: Please look if the issue was already reported": "Étape 1 : Vérifiez si le problème a déjà été rapporté", - "Enter keywords": "Entrez des mots-clés", - "Already reported": "Déjà rapporté", - "I want to report a new issue": "Je veux rapporter un nouveau problème", - "Step 2: Report a new issue": "Étape 2 : Rapporter un nouveau problème", - "Note: please don't use this form to contact us. It is limited to bug reports only.": "Note : s'il vous plait, n'utilisez pas ce formulaire pour nous contacter. Il est limité aux rapports d'erreurs.", - "The title of the issue": "Le titre du rapport", - "Description": "Description", - "200 characters minimum": "200 caractères minimum", - "A short description of the issue. If suitable, include the steps required to reproduce the bug.": "Une courte description du problème. Si nécessaire, n'hésitez pas à inclure les étapes requises pour reproduire le problème.", - "Submit": "Envoyer", - "Step 3: Thank you !": "Étape 3 : Merci !", - "Your issue has been reported.": "Votre rapport d'erreur a été envoyé.", - "Open in your browser": "Ouvrir dans un navigateur", - "No issues found...": "Aucune correspondance trouvée...", - "First method": "Première méthode", - "Use the in-app reporter": "Utilisez la fonctionnalité dédiée", - "You can find it later on the About page": "Vous pouvez retrouver cette fonction plus tard sur la page À Propos", - "Second method": "Deuxième méthode", - "You can create an account on our %s repository, and click on %s.": "Vous pouvez créer un compte sur notre site %s, puis cliquer sur l'onglet %s.", - "Use the %s issue filter to search and check if the issue has already been reported or is already fixed.": "Utilisez les filtres de recherche %s pour vérifier si le problème a déjà été rapporté ou s'il a déjà été corrigé.", - "Include a screenshot if relevant - Is your issue about a design feature or a bug?": "N'hésitez pas à inclure une capture d'écran si vous le jugez utile - Votre problème est-il d'ordre visuel ou technique ?", - "A good bug report shouldn't leave others needing to chase you up for more information. Be sure to include the details of your environment.": "Un bon rapport d'erreur ne devrait pas laisser de place aux questionnements et demandes d'informations supplémentaires. N'oubliez pas d'inclure tous les détails sur votre environnement informatique.", - "Warning: Always use English when contacting us, or we might not understand you.": "Faites attention de toujours vous adresser à nous en Anglais, sans cela nous pourrions ne pas vous comprendre.", - "Search on %s": "Recherche %s", - "No results found": "Aucun résultat trouvé", - "Invalid credentials": "Identifiants non valides", - "Open Favorites": "Ouvrir les favoris", - "Open About": "Ouvrir À Propos", - "Minimize to Tray": "Réduire dans la zone de notification", - "Close": "Fermer", - "Restore": "Restaurer", - "Resume Playback": "Reprendre la lecture après interruption", - "Features": "Fonctionnalités", - "Connect To %s": "Connecter %s", - "The magnet link was copied to the clipboard": "Le lien magnet a été copié dans le presse-papier", - "Big Picture Mode": "Mode Big Picture", - "Big Picture Mode is unavailable on your current screen resolution": "Le mode Big Picture n'est pas compatible avec votre résolution d'écran", - "Cannot be stored": "Impossible à sauvegarder", - "%s reported this torrent as fake": "%s a identifié ce torrent comme factice", - "%s could not verify this torrent": "%s n'a pas pu vérifier ce torrent", - "Randomize": "Aléatoire", - "Randomize Button for Movies": "Bouton \"Aléatoire\" pour les films", - "Overall Ratio": "Ratio global", - "Translate Synopsis": "Traduire les synopsis", - "Returning Series": "En cours", - "In Production": "En production", - "Canceled": "Annulé", - "N/A": "N/A", - "%s is not supposed to be run as administrator": "%s ne devrait pas être exécuté en tant qu'administrateur", - "Your disk is almost full.": "Votre disque dur est presque plein.", - "You need to make more space available on your disk by deleting files.": "Vous devez libérer de l'espace sur votre disque dur en supprimant des fichiers.", - "Playing Next": "Épisode suivant", - "Trending": "Tendance" + "External Player": "Lecteur externe", + "Made with": "Créé avec", + "by a bunch of geeks from All Around The World": "par une bande de geeks venant du monde entier", + "Initializing PopcornTime. Please Wait...": "Démarrage de Popcorn Time. Veuillez patienter…", + "Status: Checking Database...": "Statut : Vérification de la base de données…", + "Movies": "Films", + "TV Series": "Séries TV", + "Anime": "Anime", + "Genre": "Genre", + "All": "Tous", + "Action": "Action", + "Adventure": "Aventure", + "Animation": "Animation", + "Children": "Enfants", + "Comedy": "Comédie", + "Crime": "Crime", + "Documentary": "Documentaire", + "Drama": "Drame", + "Family": "Famille", + "Fantasy": "Fantastique", + "Game Show": "Jeu télévisé", + "Home And Garden": "Maison et jardin", + "Horror": "Horreur", + "Mini Series": "Mini séries", + "Mystery": "Mystère", + "News": "Actualités", + "Reality": "Réalité", + "Romance": "Romance", + "Science Fiction": "Science-Fiction", + "Soap": "Feuilleton", + "Special Interest": "Intérêt spécial", + "Sport": "Sport", + "Suspense": "Suspens", + "Talk Show": "Emission télévisée", + "Thriller": "Thriller", + "Western": "Western", + "Sort by": "Trier par", + "Popularity": "Popularité", + "Updated": "Mise à jour", + "Year": "Année", + "Name": "Nom", + "Search": "Recherche", + "Season": "Saison", + "Seasons": "Saisons", + "Season %s": "Saison %s", + "Load More": "Voir plus", + "Saved": "Enregistré", + "Settings": "Réglages", + "Show advanced settings": "Montrer les réglages avancés", + "User Interface": "Interface", + "Default Language": "Langue par défaut", + "Theme": "Thème", + "Start Screen": "Écran d'accueil", + "Favorites": "Favoris", + "Show rating over covers": "Montrer la note sur les affiches", + "Always On Top": "Toujours au premier plan", + "Watched Items": "Éléments visionnés", + "Show": "Montrer", + "Fade": "Décolorer", + "Hide": "Cacher", + "Subtitles": "Sous-titres", + "Default Subtitle": "Sous-titres par défaut", + "Disabled": "Désactivés", + "Size": "Taille", + "Quality": "Qualité", + "Only list movies in": "Uniquement les films en", + "Show movie quality on list": "Afficher la qualité des films dans la liste", + "Trakt.tv": "Trakt.tv", + "Enter your Trakt.tv details here to automatically 'scrobble' episodes you watch in Popcorn Time": "Entrez vos identifiants Trakt.tv pour 'scrobbler' automatiquement les épisodes regardés avec Popcorn Time", + "Connect to %s to automatically 'scrobble' episodes you watch in %s": "Connectez-vous à %s pour 'scrobbler' automatiquement les épisodes regardés avec %s", + "Username": "Nom d'utilisateur", + "Password": "Mot de passe", + "Popcorn Time stores an encrypted hash of your password in your local database": "Popcorn Time conserve une empreinte chiffrée du mot de passe dans votre base de données locale", + "Remote Control": "Contrôle à distance", + "HTTP API Port": "Port HTTP", + "HTTP API Username": "Nom d'utilisateur", + "HTTP API Password": "Mot de passe", + "Connection": "Connexion", + "TV Show API Endpoint": "Adresse de l'API Séries", + "Movies API Endpoint": "Adresse de l'API Films", + "Connection Limit": "Limite de connexion", + "DHT Limit": "Limite DHT", + "Port to stream on": "Port de diffusion", + "0 = Random": "0 = Aléatoire", + "Cache Directory": "Dossier temporaire", + "Clear Tmp Folder after closing app?": "Nettoyer le dossier temporaire à la fermeture", + "Database": "Base de données", + "Database Directory": "Dossier utilisé", + "Import Database": "Importer une base de données", + "Export Database": "Exporter une base de données", + "Flush bookmarks database": "Vider la base de données des favoris", + "Flush subtitles cache": "Vider le cache des sous-titres", + "Flush all databases": "Vider les bases de données", + "Reset to Default Settings": "Rétablir les réglages par défaut", + "Importing Database...": "Importation de la base de données...", + "Please wait": "Veuillez patienter", + "Error": "Erreur", + "Biography": "Biographie", + "Film-Noir": "Film Noir", + "History": "Histoire", + "Music": "Musique", + "Musical": "Comédie Musicale", + "Sci-Fi": "Science-Fiction", + "Short": "Court métrage", + "War": "Guerre", + "Last Added": "Derniers ajouts", + "Rating": "Note", + "Open IMDb page": "Ouvrir la page IMDb", + "Health false": "Santé - erreur", + "Add to bookmarks": "Ajouter aux favoris", + "Watch Trailer": "Voir la bande-annonce", + "Watch Now": "Visionner maintenant", + "Health Good": "Bonne santé", + "Ratio:": "Ratio :", + "Seeds:": "Sources :", + "Peers:": "Clients :", + "Remove from bookmarks": "Retirer des favoris", + "Changelog": "Historique des modifications", + "Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.": "Popcorn Time est le fruit de nombreux développeurs et de graphistes qui ont rassemblé plusieurs API dans le but de rendre l'expérience du streaming via torrent la plus simple possible.", + "We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.": "Nous construisons ce projet en open source depuis les quatre coins du monde. Nous adorons le cinéma… et le popcorn !", + "Invalid PCT Database File Selected": "Fichier de base de données Popcorn Time sélectionné invalide", + "Health Unknown": "Santé - inconnue", + "Episodes": "Épisodes", + "Episode %s": "Épisode %s", + "Aired Date": "Date de diffusion", + "Streaming to": "Joué via", + "connecting": "Connexion…", + "Download": "Téléchargement", + "Upload": "Envoi", + "Active Peers": "Clients actifs", + "Cancel": "Annuler", + "startingDownload": "Démarrage du téléchargement…", + "downloading": "Téléchargement…", + "ready": "Prêt", + "playingExternally": "En lecture externe", + "Custom...": "Ajouter…", + "Volume": "Volume", + "Ended": "Terminé", + "Error loading data, try again later...": "Erreur lors du chargement des données, réessayez plus tard…", + "Miscellaneous": "Divers", + "When opening TV Show Detail Jump to:": "À l'ouverture d'une fiche de série TV aller au :", + "First Unwatched Episode": "Premier épisode non visionné", + "Next Episode In Series": "Prochain épisode", + "When Opening TV Show Detail Jump To": "À l'ouverture d'une fiche de série TV aller au", + "Flushing...": "Suppression…", + "Are you sure?": "Confirmer ?", + "We are flushing your databases": "Nous vidons les bases de données", + "Success": "Réussite", + "Please restart your application": "Veuillez redémarrer l'application", + "Restart": "Redémarrer", + "Terms of Service": "Conditions d'utilisation", + "I Accept": "J'accepte", + "Leave": "Quitter", + "When Opening TV Series Detail Jump To": "Au chargement des détails de séries, sélectionner", + "Health Medium": "Santé moyenne", + "Playback": "Lecture", + "Play next episode automatically": "Jouer l'épisode suivant automatiquement", + "Generate Pairing QR code": "Générer un code QR", + "Playing Next Episode in": "Prochain épisode dans", + "Play": "Lire", + "Dismiss": "Rejeter", + "waitingForSubtitles": "En attente des sous-titres…", + "Play Now": "Lire maintenant", + "Seconds": "Secondes", + "You are currently authenticated to Trakt.tv as": "Vous êtes actuellement identifié sur Trakt.tv en tant que", + "You are currently connected to %s": "Vous êtes actuellement connecté à %s", + "Disconnect account": "Se déconnecter", + "Sync With Trakt": "Synchroniser avec Trakt", + "Syncing...": "Synchronisation…", + "Done": "Terminé", + "Subtitles Offset": "Décalage des sous-titres", + "secs": "secs", + "We are flushing your database": "Nous vidons la base de données", + "We are rebuilding the TV Show Database. Do not close the application.": "Nous reconstruisons la base de données des séries TV. Ne pas fermer l'application.", + "No shows found...": "Aucune série trouvée…", + "No Favorites found...": "Aucun favori trouvé…", + "Rebuild TV Shows Database": "Reconstruire la base de données des séries TV", + "No movies found...": "Aucun film trouvé…", + "Ratio": "Ratio", + "Health Excellent": "Excellente santé", + "Health Bad": "Mauvaise santé", + "Status: Creating Database...": "Statut : Création de la base de données…", + "Status: Updating database...": "Statut : Mise à jour de la base de données…", + "Status: Skipping synchronization TTL not met": "Statut : Saut de synchronisation TTL non rencontré", + "Advanced Settings": "Réglages avancés", + "Clear Cache directory after closing app?": "Nettoyer le dossier temporaire à la fermeture", + "Tmp Folder": "Dossier temporaire", + "Status: Downloading API archive...": "Statut : Téléchargement de l'archive API…", + "Status: Archive downloaded successfully...": "Statut : Archive téléchargée avec succès", + "Status: Importing file": "Statut : Importation du fichier", + "Status: Imported successfully": "Statut : Importation réussie", + "Status: Launching applicaion... ": "Statut : Lancement de l'application", + "URL of this stream was copied to the clipboard": "L'URL de ce flux a été copiée dans le presse-papier", + "Error, database is probably corrupted. Try flushing the bookmarks in settings.": "Erreur, la base de données est probablement corrompue. Essayez de vider les favoris dans Réglages.", + "Flushing bookmarks...": "Suppression des favoris…", + "Resetting...": "Réinitialisation…", + "We are resetting the settings": "Nous réinitialisons les réglages…", + "New version downloaded": "Nouvelle version téléchargée", + "Installed": "Installée", + "Install Now": "Installer maintenant", + "Restart Now": "Redémarrer maintenant", + "We are flushing your subtitle cache": "Nous vidons le cache des sous-titres", + "Subtitle cache deleted": "Cache des sous-titres supprimé.", + "Please select a file to play": "Veuillez sélectionner un fichier à lire", + "Test Login": "Tester l'identification", + "Testing...": "Test en cours…", + "Success!": "Réussi !", + "Failed!": "Échec !", + "Global shortcuts": "Raccourcis globaux", + "Video Player": "Lecteur vidéo", + "Toggle Fullscreen": "Plein écran", + "Play/Pause": "Lecture / Pause", + "Seek Forward": "Avancer de", + "Increase Volume": "Augmenter le volume de", + "Set Volume to": "Régler le volume à", + "Offset Subtitles by": "Décaler les sous-titres de", + "Toggle Mute": "Couper le son", + "Movie Detail": "Fiche du film", + "Toggle Quality": "Changer la qualité", + "Play Movie": "Lire le film", + "Exit Fullscreen": "Sortir du plein écran", + "Seek Backward": "Reculer de", + "Decrease Volume": "Diminuer le volume de", + "Show Stream URL": "Montrer l'URL du flux", + "TV Show Detail": "Fiche de la série TV", + "Toggle Watched": "Marquer comme vu", + "Select Next Episode": "Épisode suivant", + "Select Previous Episode": "Épisode précédent", + "Select Next Season": "Saison suivante", + "Select Previous Season": "Saison précédente", + "Play Episode": "Lire l'épisode", + "space": "espace", + "shift": "maj", + "ctrl": "ctrl", + "enter": "entrée", + "esc": "esc", + "Keyboard Shortcuts": "Raccourcis clavier", + "Cut": "Couper", + "Copy": "Copier", + "Paste": "Coller", + "Help Section": "Aide", + "Did you know?": "Le saviez-vous ?", + "What does Popcorn Time offer?": "Que propose Popcorn Time ?", + "With Popcorn Time, you can watch Movies and TV Series really easily. All you have to do is click on one of the covers, then click 'Watch Now'. But your experience is highly customizable:": "Avec Popcorn Time, vous pouvez aisément regarder des films et des séries TV. Tout ce que vous avez à faire, c'est de cliquer sur une des affiches, puis sur 'Visionner Maintenant'. De plus, l'expérience est totalement personnalisable :", + "Our Movies collection only contains High-Definition movies, available in 720p and 1080p. To watch a movie, simply open Popcorn Time and navigate through the movies collection, reachable through the 'Movies' tab, in the navigation bar. The default view will show you all movies sorted by popularity, but you can apply your own filters, thanks to the 'Genre' and 'Sort by' filters. Once you have chosen a movie you want to watch, click its cover. Then click 'Watch Now'. Don't forget the popcorn!": "Notre collection de films est constituée uniquement de contenu Haute Définition, disponibles en 720p ou 1080p. Pour visionner un film, ouvrez simplement Popcorn Time et naviguez dans la liste, accessible via l'onglet 'Films', dans la barre de navigation. Par défaut, tous les films sont proposés, triés par ordre de popularité, mais vous pouvez appliquer vos propres filtres, grâce à 'Genre' et 'Trier par'. Une fois un film choisi, cliquez sur son affiche, puis sur 'Visionner Maintenant'. N'oubliez pas le popcorn !", + "The TV Series tab, that you can reach by clicking 'TV Series' in the navigation bar, will show you all available series in our collection. You can also apply your own filters, same as the Movies, to help you decide what to watch. In this collection, also just click the cover: the new window that will appear will allow you to navigate through Seasons and Episodes. Once your mind is set, just click the 'Watch Now' button.": "L'onglet Séries TV, accessible via la barre de navigation, vous présentera toutes les séries disponibles dans notre collection. Vous pouvez ici aussi appliquez vos propres filtres, comme pour les films. Dans cette liste, cliquez également sur l'affiche : la nouvelle fenêtre qui apparaîtra vous permettra de naviguer dans les différents épisodes et saisons. Une fois une série choisie, cliquez simplement sur le bouton 'Visionner maintenant'.", + "Choose quality": "Choisir la qualité", + "A slider next to the 'Watch Now' button will let you choose the quality of the stream. You can also set a fixed quality in the Settings tab. Warning: a better quality equals more data to download.": "Le curseur situé près du bouton 'Visionner maintenant' permet de choisir la qualité du contenu. Vous pouvez également définir une qualité donnée dans l'onglet Réglages. Avertissement : une meilleure qualité signifie plus de données à télécharger.", + "Most of our Movies and TV Series have subtitles in your language. You can set them in the Settings tab. For the Movies, you can even set them through the dropdown menu, in the Movie Details page.": "La plupart de nos films et séries TV ont des sous-titres pour votre langue. Vous pouvez définir les sous-titres dans l'onglet Réglages. Pour les films, il est aussi possible de choisir un sous-titre dans un menu déroulant prévu à cet effet sur la page du film.", + "Clicking the heart icon on a cover will add the movie/show to your favorites. This collection is reachable through the heart-shaped icon, in the navigation bar. To remove an item from your collection, just click on the icon again! How simple is that?": "Cliquer sur l'icône en forme de coeur, sur une affiche, va ajouter le film / la série à vos favoris. Cette collection est accessible via l'icône en forme de coeur située dans la barre de navigation. Pour retirer un élément des favoris, cliquez simplement sur le coeur à nouveau ! Plutôt simple, non ?", + "Watched icon": "Icône 'visionné'", + "Popcorn Time will keep in mind what you've already watched - a little help remembering doesn't cause any harm. You can also set an item as watched by clicking the eye-shaped icon on the covers. You can even build and synchronize your collection with Trakt.tv website, via the Settings tab.": "Popcorn Time va se souvenir de ce que vous avez déjà visionné - un peu d'aide ne fait de mal à personne. Vous pouvez également marquer un élément comme visionné en cliquant sur l'icône en forme d'oeil sur les affiches. De plus, vous pouvez vous construire une collection puis la synchroniser avec le site Trakt.tv, via l'onglet Réglages.", + "In Popcorn Time, you can use the magnifier icon to open the search. Type a Title, an Actor, a Director or even a Year, press 'Enter' and let us show you what we can offer to fill your needs. To close your current search, you can click on the 'X' located next to your entry or type something else in the field.": "Dans Popcorn Time, vous pouvez utiliser l'icône en forme de loupe pour lancer une recherche. Entrez un titre, un acteur, un réalisateur ou même une année, appuyez sur 'Entrée' et laissez-nous vous montrer ce qu'on peut vous proposer. Pour clore une recherche, cliquez sur le 'X' situé à côté du mot-clé ou lancez une autre recherche.", + "External Players": "Lecteurs externes", + "If you prefer to use a custom player instead of the built in one, you can do so by clicking the allocated icon on the 'Watch Now' button. A list of your installed players will be shown, select one and Popcorn Time will send everything to it. If your player isn't on the list, please report it to us.": "Si vous préférez utiliser un lecteur externe à la place de celui par défaut, vous le pouvez en cliquant sur l'icône prévue à cet effet sur le bouton 'Visionner maintenant'. Une liste des lecteurs disponibles s'affichera: sélectionnez-en un et Popcorn Time lui enverra tout le nécessaire. Si votre lecteur n'est pas repris dans la liste, veuillez s'il vous plait nous le signaler.", + "To push the customization even further, we offer you a large panel of options. To access the Settings, click the wheel-shaped icon in the navigation bar.": "Pour pousser la personnalisation encore plus loin, nous vous proposons un large panel d'options. Pour accéder aux Réglages, cliquez sur l'icône en forme de rouage dans la barre de navigation.", + "Keyboard Navigation": "Navigation au clavier", + "The entire list of keyboard shortcuts is available by pressing '?' on your keyboard, or through the keyboard-shaped icon in the Settings tab.": "La liste complète des raccourcis clavier est disponible par une pression sur '?' sur votre clavier, ou via l'icône en forme de clavier dans l'onglet Réglages.", + "Custom Torrents and Magnet Links": "Torrents personnels et liens Magnet", + "You can use custom torrents and magnets links in Popcorn Time. Simply drag and drop .torrent files into the application's window, and/or paste any magnet link.": "Il est possible d'utiliser des torrents et liens magnet avec Popcorn Time. Glissez et déposez simplement un fichier .torrent dans la fenêtre de l'application, et/ou collez un lien magnet.", + "Torrent health": "Santé des torrents", + "On the details of Movies/TV Series, you can find a little circle, colored in grey, red, yellow or green. Those colors refer to the health of the torrent. A green torrent will be downloaded quickly, while a red torrent may not be downloaded at all, or very slowly. The color grey represents an error in the health calculation for Movies, and needs to be clicked in TV Series in order to display the health.": "Sur la page des films/séries, vous trouverez un petit cercle, coloré en gris, rouge, jaune ou vert. Ces couleurs représentent la santé du torrent. Un torrent vert sera téléchargé rapidement, et un torrent rouge pourrait ne jamais être téléchargé, ou être d'une lenteur incroyable. La couleur grise indique une erreur dans le calcul de santé, pour les films, et nécessite un clic de votre part dans les séries TV afin d'afficher la santé du torrent.", + "How does Popcorn Time work?": "Comment fonctionne Popcorn Time ?", + "Popcorn Time streams video content through torrents. Our movies are provided by %s and our TV Series by %s, while getting all metadata from %s. We don't host any content ourselves.": "Popcorn Time joue du contenu vidéo via des torrents. Nos films sont fournis par %s et nos séries TV par %s. Les métadonnées sont récupérées depuis %s. Nous n'hébergeons aucun contenu.", + "Torrent streaming? Well, torrents use Bittorrent protocol, which basically means that you download small parts of the content from another user's computer, while sending the parts you already downloaded to another user. Then, you watch those parts, while the next ones are being downloaded in the background. This exchange allows the content to stay healthy.": "Du streaming via des torrents ? En fait, les torrents utilisent le protocole Bittorent, ce qui signifie (en gros) que vous téléchargez des petites parties de contenu depuis l'ordinateur d'un tiers, tout en envoyant les parties que vous avez déjà téléchargées à un autre tiers. Vous pouvez alors visionner ces parties pendant que les suivantes sont téléchargées en arrière-plan. Cet échange de données permet au contenu de rester vivant et en bonne santé.", + "Once the movie is fully downloaded, you continue to send parts to the other users. And everything is deleted from your computer when you close Popcorn Time. As simple as that.": "Une fois le film entier téléchargé, vous continuez à envoyer des parties aux autres utilisateurs. Et tout disparaît de votre ordinateur à la fermeture de Popcorn Time. C'est aussi simple que cela.", + "The application itself is built with Node-Webkit, HTML, CSS and Javascript. It works like the Google Chrome browser, except that you host the biggest part of the code on your computer. Yes, Popcorn Time works on the same technology as a regular website, like... let's say Wikipedia, or Youtube!": "L'application elle-même est construite avec Node-Webkit et écrite en HTML, CSS et Javascript. Cela fonctionne un peu comme le navigateur Google Chrome, sauf que vous hébergez localement la grosse majorité du code. Eh oui, Popcorn Time fonctionne de la même façon qu'un site web comme... disons Wikipedia, ou Youtube !", + "I found a bug, how do I report it?": "J'ai trouvé un bug, comment le signaler ?", + "No historics found...": "Aucun historique...", + "Error, database is probably corrupted. Try flushing the history in settings.": "Erreur, la base de donnée est probablement corrompue. Essayez de vider l'historique dans Réglages.", + "You can paste magnet links anywhere in Popcorn Time with CTRL+V.": "Vous pouvez coller un lien magnet n'importe où dans Popcorn Time avec CTRL+V", + "You can drag & drop a .torrent file into Popcorn Time.": "Vous pouvez glisser et déposer un .torrent dans Popcorn Time", + "The Popcorn Time project started in February 2014 and has already had 150 people that contributed more than 3000 times to it's development in August 2014.": "Le projet Popcorn Time a commencé en février 2014 et 150 personnes avaient déjà contribué plus de 3000 fois à son développement en août 2014.", + "The rule n°10 applies here.": "La règle n°10 est d'application.", + "If a subtitle for a TV series is missing, you can add it on %s. And the same way for a movie, but on %s.": "Lorsqu'un sous-titre pour une série TV est manquant, vous pouvez l'ajouter sur %s. Il en va de même pour les films, sur %s", + "If you're experiencing connection drop issues, try to reduce the DHT Limit in settings.": "Si vous rencontrez des problèmes de perte de connexion, essayez de réduire la limite DHT dans Réglages", + "If you search \"1998\", you can see all the movies or TV series that came out that year.": "Recherchez \"1998\" pour trouver tous les films publiés cette année-là", + "You can login to Trakt.tv to save all your watched items, and synchronize them across multiple devices.": "Vous pouvez vous identifier à Trakt.tv pour sauvegarder les éléments visionnés, et les synchroniser sur plusieurs appareils.", + "Clicking on the rating stars will display a number instead.": "Un clic sur les étoiles de notation affiche un nombre à la place.", + "This application is entirely written in HTML5, CSS3 and Javascript.": "Cette application est entièrement écrite en HTML5, CSS3 et Javascript", + "You can find out more about a movie or a TV series? Just click the IMDb icon.": "Envie d'en savoir plus sur un film ou une série TV ? Cliquez simplement sur l'icône IMDb.", + "Clicking twice on a \"Sort By\" filter reverses the order of the list.": "Cliquer deux fois sur un des filtres \"Trier par\" inverse l'ordre de présentation.", + "Switch to next tab": "Aller à l'onglet suivant", + "Switch to previous tab": "Aller à l'onglet précédent", + "Switch to corresponding tab": "Aller à l'onglet correspondant", + "through": "à", + "Enlarge Covers": "Agrandir les affiches", + "Reduce Covers": "Diminuer les affiches", + "Open the Help Section": "Afficher l'Aide", + "Open Item Details": "Ouvrir la fiche de l'élément", + "Add Item to Favorites": "Ajouter aux favoris", + "Mark as Seen": "Marquer comme vu", + "Open this screen": "Afficher cette page", + "Open Settings": "Ouvrir les Réglages", + "Posters Size": "Taille des affiches", + "This feature only works if you have your TraktTv account synced. Please go to Settings and enter your credentials.": "Cette fonctionnalité n'est accessible qu'à ceux ayant un compte TraktTv synchronisé. Veuillez vous rendre dans les réglages pour entrer vos identifiants.", + "Last Open": "Dernier ouvert", + "Exporting Database...": "Exportation de la base de données...", + "Database Successfully Exported": "Base de données exportée avec succès", + "Display": "Affichage", + "TV": "Séries", + "Type": "Type", + "popularity": "popularité", + "date": "date", + "year": "année", + "rating": "note", + "updated": "mis à jour", + "name": "nom", + "OVA": "OAV", + "ONA": "ONA", + "No anime found...": "Aucun anime trouvé...", + "Movie": "Film", + "Special": "Spécial", + "No Watchlist found...": "Aucune liste de visionnage trouvée...", + "Watchlist": "Liste de visionnage", + "Resolving..": "Résolution...", + "About": "À propos", + "Open Cache Directory": "Ouvrir le dossier temporaire", + "Open Database Directory": "Ouvrir le dossier de la base de données", + "Mark as unseen": "Marquer comme non vu", + "Playback rate": "Vitesse de lecture", + "Increase playback rate by %s": "Augmenter la vitesse de lecture de %s", + "Decrease playback rate by %s": "Diminuer la vitesse de lecture de %s", + "Set playback rate to %s": "Régler la vitesse de lecture à %s", + "Playback rate adjustment is not available for this video!": "L'ajustement de la vitesse de lecture n'est pas disponible pour cette vidéo !", + "Color": "Couleur", + "With Shadows": "Ajouter une ombre", + "Local IP Address": "Adresse IP locale", + "Japan": "Japon", + "Cars": "Voitures", + "Dementia": "Psychologique", + "Demons": "Démons", + "Ecchi": "Ecchi", + "Game": "Jeu", + "Harem": "Harem", + "Historical": "Historique", + "Josei": "Josei", + "Kids": "Enfants", + "Magic": "Magie", + "Martial Arts": "Arts martiaux", + "Mecha": "Mecha", + "Military": "Militaire", + "Parody": "Parodie", + "Police": "Policier", + "Psychological": "Psychologique", + "Samurai": "Samouraï", + "School": "École", + "Seinen": "Seinen", + "Shoujo": "Shojo", + "Shoujo Ai": "Shojo-Ai", + "Shounen": "Shonen", + "Shounen Ai": "Shonen-Ai", + "Slice Of Life": "Tranche de vie", + "Slice of Life": "Tranche de vie", + "Space": "Espace", + "Sports": "Sports", + "Super Power": "Super-pouvoir", + "Supernatural": "Surnaturel", + "Vampire": "Vampire", + "Alphabet": "Titre", + "Automatically Sync on Start": "Synchroniser automatiquement au lancement", + "Setup VPN": "Configurer le VPN", + "VPN": "VPN", + "Install VPN Client": "Installer le client VPN", + "More Details": "Plus d'informations", + "Don't show me this VPN option anymore": "Je ne veux plus voir d'option VPN à l'avenir", + "Activate automatic updating": "Activer les mises à jour automatiques", + "We are installing VPN client": "Nous installons le client VPN", + "VPN Client Installed": "Le client VPN a été installé", + "Please wait...": "Veuillez patienter...", + "VPN.ht client is installed": "Le client VPN.ht est installé", + "Install again": "Réinstaller", + "Connect": "Connexion", + "Create Account": "Créer un compte", + "Please, allow ~ 1 minute": "Veuillez patienter ~ 1 minute", + "Status: Connecting to VPN...": "Statut : Connexion au VPN en cours...", + "Status: Monitoring connexion - ": "Statut : Contrôle de la connexion -", + "Connect VPN": "Connecter le VPN", + "Disconnect VPN": "Déconnecter le VPN", + "Celebrate various events": "Célébrer divers événements festifs", + "ATTENTION! We need admin access to run this command.": "ATTENTION ! Les droits d'administration sont requis pour lancer cette commande.", + "Your password is not saved": "Votre mot de passe n'est pas enregistré", + "Enter sudo password :": "Veuillez entrer votre mot de passe 'sudo' :", + "Status: Monitoring connection": "Statut : Contrôle de la connexion", + "Status: Connected": "Statut : Connecté", + "Secure connection": "Connexion sécurisée", + "Your IP:": "Votre IP :", + "Disconnect": "Déconnexion", + "Downloaded": "En cours", + "Loading stuck ? Click here !": "Chargement bloqué ? Cliquez ici !", + "Torrent Collection": "Collection de torrents", + "Drop Magnet or .torrent": "Déposez un magnet ou .torrent", + "Remove this torrent": "Supprimer ce torrent", + "Rename this torrent": "Renommer ce torrent", + "Flush entire collection": "Vider toute la collection", + "Open Collection Directory": "Ouvrir le dossier de la collection", + "Store this torrent": "Conserver ce torrent", + "Enter new name": "Entrez le nouveau nom", + "This name is already taken": "Ce nom est déjà utilisé", + "Always start playing in fullscreen": "Toujours commencer la lecture en mode plein écran", + "Allow torrents to be stored for further use": "Permettre aux torrents d'être conservés pour un usage ultérieur", + "Hide VPN from the filter bar": "Cacher l'option VPN", + "Magnet link": "Lien magnet", + "Error resolving torrent.": "Erreur lors de la résolution du torrent", + "%s hour(s) remaining": "%s heure(s) restante(s)", + "%s minute(s) remaining": "%s minute(s) restante(s)", + "%s second(s) remaining": "%s seconde(s) restante(s)", + "Unknown time remaining": "Temps restant indéterminé", + "Set player window to video resolution": "Définir la taille du lecteur à la résolution de la vidéo", + "Set player window to double of video resolution": "Définir la taille du lecteur au double de la résolution de la vidéo", + "Set player window to half of video resolution": "Définir la taille du lecteur à la moitié de la résolution de la vidéo", + "Retry": "Réessayer", + "Import a Torrent": "Importer un torrent", + "The remote movies API failed to respond, please check %s and try again later": "L'API Films ne répond pas, consultez %s et réessayez plus tard", + "The remote shows API failed to respond, please check %s and try again later": "L'API Séries ne répond pas, consultez %s et réessayez plus tard", + "The remote anime API failed to respond, please check %s and try again later": "L'API Anime ne répond pas, consultez %s et réessayez plus tard", + "Not Seen": "Non vu", + "Seen": "Vu", + "Title": "Titre", + "The video playback encountered an issue. Please try an external player like %s to view this content.": "La lecture de la vidéo a rencontré un problème. Veuillez essayez un lecteur externe, comme %s, pour visionner ce contenu.", + "Font": "Police", + "Decoration": "Habillage", + "None": "Aucun", + "Outline": "Tracer les contours", + "Opaque Background": "Assombrir l'arrière-plan", + "No thank you": "Non merci", + "Report an issue": "Rapporter un problème", + "Log in into your GitLab account": "Se connecter à un compte GitLab", + "Email": "Adresse email", + "Log in": "Se connecter", + "Report anonymously": "Rapport anonyme", + "Note regarding anonymous reports:": "À propos des rapports anonymes :", + "You will not be able to edit or delete your report once sent.": "Vous ne pourrez pas éditer ou supprimer le rapport une fois envoyé.", + "If any additionnal information is required, the report might be closed, as you won't be able to provide them.": "Si des précisions supplémentaires sont nécessaires, la rapport pourrait être fermé, puisque vous ne pourrez pas fournir ces informations.", + "Step 1: Please look if the issue was already reported": "Étape 1 : Vérifiez si le problème a déjà été rapporté", + "Enter keywords": "Entrez des mots-clés", + "Already reported": "Déjà rapporté", + "I want to report a new issue": "Je veux rapporter un nouveau problème", + "Step 2: Report a new issue": "Étape 2 : Rapporter un nouveau problème", + "Note: please don't use this form to contact us. It is limited to bug reports only.": "Note : s'il vous plait, n'utilisez pas ce formulaire pour nous contacter. Il est limité aux rapports d'erreurs.", + "The title of the issue": "Le titre du rapport", + "Description": "Description", + "200 characters minimum": "200 caractères minimum", + "A short description of the issue. If suitable, include the steps required to reproduce the bug.": "Une courte description du problème. Si nécessaire, n'hésitez pas à inclure les étapes requises pour reproduire le problème.", + "Submit": "Envoyer", + "Step 3: Thank you !": "Étape 3 : Merci !", + "Your issue has been reported.": "Votre rapport d'erreur a été envoyé.", + "Open in your browser": "Ouvrir dans un navigateur", + "No issues found...": "Aucune correspondance trouvée...", + "First method": "Première méthode", + "Use the in-app reporter": "Utilisez la fonctionnalité dédiée", + "You can find it later on the About page": "Vous pouvez retrouver cette fonction plus tard sur la page À Propos", + "Second method": "Deuxième méthode", + "You can create an account on our %s repository, and click on %s.": "Vous pouvez créer un compte sur notre site %s, puis cliquer sur l'onglet %s.", + "Use the %s issue filter to search and check if the issue has already been reported or is already fixed.": "Utilisez les filtres de recherche %s pour vérifier si le problème a déjà été rapporté ou s'il a déjà été corrigé.", + "Include a screenshot if relevant - Is your issue about a design feature or a bug?": "N'hésitez pas à inclure une capture d'écran si vous le jugez utile - Votre problème est-il d'ordre visuel ou technique ?", + "A good bug report shouldn't leave others needing to chase you up for more information. Be sure to include the details of your environment.": "Un bon rapport d'erreur ne devrait pas laisser de place aux questionnements et demandes d'informations supplémentaires. N'oubliez pas d'inclure tous les détails sur votre environnement informatique.", + "Warning: Always use English when contacting us, or we might not understand you.": "Faites attention de toujours vous adresser à nous en Anglais, sans cela nous pourrions ne pas vous comprendre.", + "Search on %s": "Recherche %s", + "No results found": "Aucun résultat trouvé", + "Invalid credentials": "Identifiants non valides", + "Open Favorites": "Ouvrir les favoris", + "Open About": "Ouvrir À Propos", + "Minimize to Tray": "Réduire dans la zone de notification", + "Close": "Fermer", + "Restore": "Restaurer", + "Resume Playback": "Reprendre la lecture après interruption", + "Features": "Fonctionnalités", + "Connect To %s": "Connecter %s", + "The magnet link was copied to the clipboard": "Le lien magnet a été copié dans le presse-papier", + "Big Picture Mode": "Mode Big Picture", + "Big Picture Mode is unavailable on your current screen resolution": "Le mode Big Picture n'est pas compatible avec votre résolution d'écran", + "Cannot be stored": "Impossible à sauvegarder", + "%s reported this torrent as fake": "%s a identifié ce torrent comme factice", + "%s could not verify this torrent": "%s n'a pas pu vérifier ce torrent", + "Randomize": "Aléatoire", + "Randomize Button for Movies": "Bouton \"Aléatoire\" pour les films", + "Overall Ratio": "Ratio global", + "Translate Synopsis": "Traduire les synopsis", + "Returning Series": "En cours", + "In Production": "En production", + "Canceled": "Annulé", + "N/A": "N/A", + "%s is not supposed to be run as administrator": "%s ne devrait pas être exécuté en tant qu'administrateur", + "Your disk is almost full.": "Votre disque dur est presque plein.", + "You need to make more space available on your disk by deleting files.": "Vous devez libérer de l'espace sur votre disque dur en supprimant des fichiers.", + "Playing Next": "Épisode suivant", + "Trending": "Tendance", + "Downloads": "Downloads", + "Likes": "Likes", + "Movie Search": "Movie Search", + "This feature has a built-in kat.cr search, which allows you to stream any movies, series or anime torrents with automatic subtitle support. The casting option integrates features including Chromecast, Airplay and DLNA. This library also provides an Anti-Virus Scanner and a 'History' feature, that keeps track of all your downloaded KAT torrents": "This feature has a built-in kat.cr search, which allows you to stream any movies, series or anime torrents with automatic subtitle support. The casting option integrates features including Chromecast, Airplay and DLNA. This library also provides an Anti-Virus Scanner and a 'History' feature, that keeps track of all your downloaded KAT torrents", + "Plugins": "Plugins", + "OpenSubtitles Username": "OpenSubtitles Username", + "OpenSubtitles Password": "OpenSubtitles Password", + "Stream from Browser": "Stream from Browser", + "Torrent Link": "Torrent Link", + "Magnet Link": "Magnet Link", + "Movie API Endpoint": "Movie API Endpoint", + "Activate Google Analytics": "Activate Google Analytics" } \ No newline at end of file diff --git a/src/app/language/it.json b/src/app/language/it.json index 9a5be798..242a0b12 100644 --- a/src/app/language/it.json +++ b/src/app/language/it.json @@ -1,490 +1,502 @@ { - "External Player": "Player Esterno", - "Made with": "Fatto con", - "by a bunch of geeks from All Around The World": "da un gruppo di smanettoni provenienti da tutto il mondo", - "Initializing PopcornTime. Please Wait...": "Inizializzazione di PopcornTime. Attendere prego...", - "Status: Checking Database...": "Stato: controllo del database in corso...", - "Movies": "Film", - "TV Series": "Serie TV", - "Anime": "Anime", - "Genre": "Genere", - "All": "Tutti", - "Action": "Azione", - "Adventure": "Avventura", - "Animation": "Animazione", - "Children": "Per Bambini", - "Comedy": "Commedia", - "Crime": "Crimine", - "Documentary": "Documentario", - "Drama": "Drammatico", - "Family": "Per famiglie", - "Fantasy": "Fantasy", - "Game Show": "Quiz televisivo", - "Home And Garden": "Casa e Giardinaggio", - "Horror": "Horror", - "Mini Series": "Miniserie", - "Mystery": "Mistero", - "News": "Notizie", - "Reality": "Reality", - "Romance": "Romantico", - "Science Fiction": "Fantascienza", - "Soap": "Soap Opera", - "Special Interest": "Di interesse Speciale", - "Sport": "Sport", - "Suspense": "Suspense", - "Talk Show": "Talk Show", - "Thriller": "Thriller", - "Western": "Western", - "Sort by": "Ordina per", - "Popularity": "Popolarità", - "Updated": "Aggiornato", - "Year": "Anno", - "Name": "Nome", - "Search": "Cerca", - "Season": "Stagione", - "Seasons": "Stagioni", - "Season %s": "Stagione %s", - "Load More": "Mostra altri", - "Saved": "Salvato", - "Settings": "Impostazioni", - "Show advanced settings": "Mostra le impostazioni avanzate", - "User Interface": "Interfaccia utente", - "Default Language": "Lingua predefinita", - "Theme": "Tema", - "Start Screen": "Schermata iniziale", - "Favorites": "Preferiti", - "Show rating over covers": "Mostra la valutazione dei film sulle locandine", - "Always On Top": "Sempre in primo piano", - "Watched Items": "Elementi guardati", - "Show": "Mostra", - "Fade": "Sfuma", - "Hide": "Nascondi", - "Subtitles": "Sottotitoli", - "Default Subtitle": "Sottotitoli predefiniti", - "Disabled": "Disabilitato", - "Size": "Dimensione", - "Quality": "Qualità", - "Only list movies in": "Mostra solo i film in", - "Show movie quality on list": "Mostra la qualità video del film nella lista", - "Trakt.tv": "Trakt.tv", - "Enter your Trakt.tv details here to automatically 'scrobble' episodes you watch in Popcorn Time": "Inserisci qui i tuoi dati di accesso a Trakt.tv per aggiungere automaticamente gli episodi che guardi in Popcorn Time", - "Connect to %s to automatically 'scrobble' episodes you watch in %s": "Connect to %s to automatically 'scrobble' episodes you watch in %s", - "Username": "Nome utente", - "Password": "Password", - "Popcorn Time stores an encrypted hash of your password in your local database": "Popcorn Time conserva un hash crittografico della tua password nel database locale", - "Remote Control": "Controllo remoto", - "HTTP API Port": "Porta HTTP API", - "HTTP API Username": "Nome Utente HTTP API", - "HTTP API Password": "Password HTTP API", - "Connection": "Connessione", - "TV Show API Endpoint": "Indirizzo API Serie TV", - "Movies API Endpoint": "Punto finale delle API Film", - "Connection Limit": "Limite connessioni", - "DHT Limit": "Limite DHT", - "Port to stream on": "Porta sulla quale avviare lo stream", - "0 = Random": "0 = Casuale", - "Cache Directory": "Directory della cache", - "Clear Tmp Folder after closing app?": "Svuotare la Cartella Temporanea dopo la chiusura dell'app?", - "Database": "Database", - "Database Directory": "Cartella del Database", - "Import Database": "Importa Database", - "Export Database": "Esporta Database", - "Flush bookmarks database": "Svuota l'archivio dei segnalibri", - "Flush subtitles cache": "Svuota la cache dei sottotitoli", - "Flush all databases": "Svuota tutti i database", - "Reset to Default Settings": "Ripristina alle impostazione di default", - "Importing Database...": "Importazione del Database in corso...", - "Please wait": "Attendere prego", - "Error": "Errore", - "Biography": "Biografia", - "Film-Noir": "Noir", - "History": "Storico", - "Music": "Musica", - "Musical": "Musical", - "Sci-Fi": "Fantascienza", - "Short": "Corto", - "War": "Guerra", - "Last Added": "Ultimo Aggiunto", - "Rating": "Valutazione", - "Open IMDb page": "Apri pagina di IMDB", - "Health false": "Salute Sconosciuta", - "Add to bookmarks": "Aggiungi ai segnalibri", - "Watch Trailer": "Guarda Trailer", - "Watch Now": "Guarda ora", - "Health Good": "Salute Buona", - "Ratio:": "Rapporto:", - "Seeds:": "Seeds:", - "Peers:": "Peers:", - "Remove from bookmarks": "Rimuovi dai segnalibri", - "Changelog": "Registro delle modifiche", - "Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.": "Popcorn Time! è il risultato di tanti sviluppatori che hanno lavorato alle API insieme per rendere l'esperienza di vedere i film in torrent più semplice possibile.", - "We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.": "Siamo un progetto open source. Veniamo da tutto il mondo. Amiamo i nostri film. E diamine se amiamo i popcorn.", - "Invalid PCT Database File Selected": "Hai selezionato un file PCT invalido", - "Health Unknown": "Salute sconosciuta", - "Episodes": "Episodi", - "Episode %s": "Episodio %s", - "Aired Date": "Trasmesso il", - "Streaming to": "Streaming a", - "connecting": "Connessione in corso...", - "Download": "Scarica", - "Upload": "Carica online", - "Active Peers": "Peer attivi", - "Cancel": "Annulla", - "startingDownload": "Inizio download", - "downloading": "Download in corso", - "ready": "Pronto", - "playingExternally": "Riproducendo esternamente", - "Custom...": "Personalizzato...", - "Volume": "Volume", - "Ended": "Concluso", - "Error loading data, try again later...": "Errore caricamento dati, riprova più tardi...", - "Miscellaneous": "Misto", - "When opening TV Show Detail Jump to:": "Quando accedi ai dettagli dello Show salta a:", - "First Unwatched Episode": "Primo episodio non visto", - "Next Episode In Series": "Prossimo episodio nella serie", - "When Opening TV Show Detail Jump To": "Quando accedi ai dettagli dello Show salta a", - "Flushing...": "Pulizia in corso...", - "Are you sure?": "Sei sicuro?", - "We are flushing your databases": "Pulizia dei tuoi database in corso", - "Success": "Operazione eseguita con successo", - "Please restart your application": "Si prega di riavviare l'applicazione", - "Restart": "Riavvia", - "Terms of Service": "Condizioni d'uso", - "I Accept": "Accetto", - "Leave": "Esci", - "When Opening TV Series Detail Jump To": "Quando accedi ai dettagli delle Serie TV salta a", - "Health Medium": "Salute Media", - "Playback": "Playback", - "Play next episode automatically": "Guarda il prossimo episodio automaticamente", - "Generate Pairing QR code": "Genera QR code", - "Playing Next Episode in": "Il prossimo episodio verrà riprodotto tra", - "Play": "Riproduci", - "Dismiss": "Scarta", - "waitingForSubtitles": "Aspettando i sottotitoli...", - "Play Now": "Guarda ora", - "Seconds": "Secondi", - "You are currently authenticated to Trakt.tv as": "Al momento sei autenticato su Trakt.tv come", - "You are currently connected to %s": "Sei connesso a %s", - "Disconnect account": "Disconnetti account", - "Sync With Trakt": "Sincronizza con Trakt", - "Syncing...": "Sincronizzazione in corso...", - "Done": "Fatto", - "Subtitles Offset": "Ritardo sottotitoli", - "secs": "secondi", - "We are flushing your database": "Pulizia del tuo database in corso", - "We are rebuilding the TV Show Database. Do not close the application.": "Stiamo aggiornando il database delle Serie TV. Non chiudere l'applicazione.", - "No shows found...": "Nessuna serie trovata...", - "No Favorites found...": "Nessun preferito trovato...", - "Rebuild TV Shows Database": "Aggiorna il Database delle Serie TV", - "No movies found...": "Nessun film trovato...", - "Ratio": "Rapporto video", - "Health Excellent": "Salute Eccellente", - "Health Bad": "Salute Scarsa", - "Status: Creating Database...": "Stato: creazione del database in corso...", - "Status: Updating database...": "Stato: aggiornamento del database in corso...", - "Status: Skipping synchronization TTL not met": "Stato: sincronizzazione ignorata (controllo TTL non soddisfatto)", - "Advanced Settings": "Impostazioni Avanzate", - "Clear Cache directory after closing app?": "Svuotare la Cartella della Cache dopo la chiusura dell'app?", - "Tmp Folder": "Cartella Temporanea", - "Status: Downloading API archive...": "Stato: Download dell'archivio API", - "Status: Archive downloaded successfully...": "Stato: Archivio scaricato con successo", - "Status: Importing file": "Stato: Sto importando il file", - "Status: Imported successfully": "Stato: Importato correttamente", - "Status: Launching applicaion... ": "Stato: Sto lanciando l'applicazione...", - "URL of this stream was copied to the clipboard": "L'indirizzo di questo stream è stato copiato negli appunti", - "Error, database is probably corrupted. Try flushing the bookmarks in settings.": "Errore, probabilmente il database è corrotto. Prova a cancellare i preferiti nelle impostazioni.", - "Flushing bookmarks...": "Pulizia dei preferiti in corso...", - "Resetting...": "Ripristino...", - "We are resetting the settings": "Stiamo resettando le impostazioni", - "New version downloaded": "Nuova versione scaricata", - "Installed": "Installata", - "Install Now": "Installa ora", - "Restart Now": "Riavvia ora", - "We are flushing your subtitle cache": "Pulizia del database dei sottotitoli in corso", - "Subtitle cache deleted": "Cache dei sottotitoli eliminata", - "Please select a file to play": "Per favore selezionare un file da riprodurre", - "Test Login": "Prova di Login", - "Testing...": "Prova...", - "Success!": "Successo!", - "Failed!": "Fallito!", - "Global shortcuts": "Shortcut Globali", - "Video Player": "Riproduttore Video", - "Toggle Fullscreen": "Attiva Schermo Intero", - "Play/Pause": "Play/Pausa", - "Seek Forward": "Ricerca Avanti", - "Increase Volume": "Aumenta il Volume", - "Set Volume to": "Imposta il Volume a", - "Offset Subtitles by": "Ritarda sottotitoli di", - "Toggle Mute": "Metti in Muto", - "Movie Detail": "Dettagli Film", - "Toggle Quality": "Imposta Qualità", - "Play Movie": "Riproduci Film", - "Exit Fullscreen": "Esci da Schermo Intero", - "Seek Backward": "Ricerca Indietro", - "Decrease Volume": "Abbassa il Volume", - "Show Stream URL": "Mostra l'indirizzo dello stream", - "TV Show Detail": "Dettagli Serie TV", - "Toggle Watched": "Visto", - "Select Next Episode": "Seleziona l'Episodio Successivo", - "Select Previous Episode": "Seleziona Episodio Precedente", - "Select Next Season": "Seleziona Prossima Stagione", - "Select Previous Season": "Seleziona Stagione Precedente", - "Play Episode": "Riproduci Episodio", - "space": "spazio", - "shift": "shift", - "ctrl": "ctrl", - "enter": "invio", - "esc": "esc", - "Keyboard Shortcuts": "Shortcut Tastiera", - "Cut": "Taglia", - "Copy": "Copia", - "Paste": "Incolla", - "Help Section": "Sezione Aiuto", - "Did you know?": "Lo sapevi?", - "What does Popcorn Time offer?": "Cosa offre Popcorn Time?", - "With Popcorn Time, you can watch Movies and TV Series really easily. All you have to do is click on one of the covers, then click 'Watch Now'. But your experience is highly customizable:": "Con Popcorn Time puoi guardare Film e serie TV con grande facilità. Tutto ciò che devi fare è cliccare su una delle locandine e poi su \"Guarda Ora\". Ma la tua esperienza è altamente personalizzabile:", - "Our Movies collection only contains High-Definition movies, available in 720p and 1080p. To watch a movie, simply open Popcorn Time and navigate through the movies collection, reachable through the 'Movies' tab, in the navigation bar. The default view will show you all movies sorted by popularity, but you can apply your own filters, thanks to the 'Genre' and 'Sort by' filters. Once you have chosen a movie you want to watch, click its cover. Then click 'Watch Now'. Don't forget the popcorn!": "La nostra collezione di film contiene solo pellicole in alta definizione, disponibili in 720p e 1080p. Per vedere un film, apri semplicemente Popcorn Time e naviga nella collezione di film, raggiungibile attraverso la scheda \"Film\", nella barra di navigazione. La visualizzazione standard mostrerà tutti i film ordinati per popolarità, ma puoi applicare i tuoi filtri personali, grazie ai filtri \"Genere\" e \"Ordina per\". Una volta che hai scelto un FIlm da vedere, clicca la sua locandina. poi clicca \"Guarda Ora\".\nNon dimenticarti i popcorn!", - "The TV Series tab, that you can reach by clicking 'TV Series' in the navigation bar, will show you all available series in our collection. You can also apply your own filters, same as the Movies, to help you decide what to watch. In this collection, also just click the cover: the new window that will appear will allow you to navigate through Seasons and Episodes. Once your mind is set, just click the 'Watch Now' button.": "La scheda delle Serie TV, che puoi raggiungere cliccando \"Serie TV\" nella barra di navigazione, ti mostrerà tutte le serie disponibili nella nostra collezione. Puoi anche applicare i tuoi filtri personali, allo stesso modo dei Film, per aiutarti a decidere cosa guardare. Anche in questa collezione, ti basterà cliccare sulla locandina: la nuova finestra che apparirà ti consentirà di navigare tra Stagioni ed Episodi. Dopo che hai deciso, clicca semplicemete il pulsante \"Guarda Ora\".", - "Choose quality": "Seleziona Qualità", - "A slider next to the 'Watch Now' button will let you choose the quality of the stream. You can also set a fixed quality in the Settings tab. Warning: a better quality equals more data to download.": "Una barra di scorrimento a fianco del pulsante \"Guarda Ora\" ti lascerà scegliere la qualità del filmato. Puoi anche selezionare una qualità fissa nella scheda Impostazioni. Attento: una migliore qualità significa una quantità maggiore di dati da scaricare.", - "Most of our Movies and TV Series have subtitles in your language. You can set them in the Settings tab. For the Movies, you can even set them through the dropdown menu, in the Movie Details page.": "Gran parte dei nostri Film e Serie TV sono disponibili con sottotitoli nella tua lingua. Puoi impostarli nella scheda Impostazioni. Per i Film puoi anche impostarli tramite il menù a tendina, nella pagina dei Dettagli del FIlm", - "Clicking the heart icon on a cover will add the movie/show to your favorites. This collection is reachable through the heart-shaped icon, in the navigation bar. To remove an item from your collection, just click on the icon again! How simple is that?": "Cliccare l'icona a cuore su una copertina aggiungerà il film/la serie ai tuoi preferiti. Questa collezione è raggiungibile attraverso l'icona a forma di cuore, nella barra di navigazione. Per rimuovere un elemento dalla tua collezione, clicca semplicemente di nuovo sull'icona! Semplicissimo, vero?", - "Watched icon": "Icona \"Guardato\"", - "Popcorn Time will keep in mind what you've already watched - a little help remembering doesn't cause any harm. You can also set an item as watched by clicking the eye-shaped icon on the covers. You can even build and synchronize your collection with Trakt.tv website, via the Settings tab.": "Popcorn Time ricorderà tutto ciò che hai già visto - un aiuto nel ricordare non fa mai male.\nPuoi anche impostare un elemento come Guardato, cliccando sull'icona a forma di occhio sulle locandine. Puoi anche creare e sincronizzare la tua collezione con il sito Trak.tv, attraverso la scheda Impostazioni.", - "In Popcorn Time, you can use the magnifier icon to open the search. Type a Title, an Actor, a Director or even a Year, press 'Enter' and let us show you what we can offer to fill your needs. To close your current search, you can click on the 'X' located next to your entry or type something else in the field.": "In Popcorn Time, puoi usare l'icona della lente d'ingrandimento per aprire il motore di ricerca. Digita un titolo, un attore, un regista o addirittura un anno, premi 'Invio' e lascia che ti mostriamo cosa abbiamo da offrirti per soddisfare le tue necessità. Per chiudere la ricerca puoi cliccare sulla 'X' situata a fianco di ciò che hai scritto, o puoi digitare qualcos'altro nel campo di ricerca.", - "External Players": "Riproduttori Esterni", - "If you prefer to use a custom player instead of the built in one, you can do so by clicking the allocated icon on the 'Watch Now' button. A list of your installed players will be shown, select one and Popcorn Time will send everything to it. If your player isn't on the list, please report it to us.": "Se preferisci utilizzare un riproduttore personale al posto di quello preinstallato, puoi farlo cliccando l'icona apposita sul pulsante \"Guarda Ora\". Comparirà una lista dei riproduttori installati sul tuo computer, selezionane uno e Popcorn Time gli invierà tutto. Se il tuo player non si trova sulla lista, per favore faccelo sapere.", - "To push the customization even further, we offer you a large panel of options. To access the Settings, click the wheel-shaped icon in the navigation bar.": "Per permetterti di personalizzare ulteriormente la tua esperienza, offriamo un vasto numero di opzioni. Per accedere alle Impostazioni, clicca l'icona a forma di ingranaggio nella barra di navigazione.", - "Keyboard Navigation": "Navigazione con Tastiera", - "The entire list of keyboard shortcuts is available by pressing '?' on your keyboard, or through the keyboard-shaped icon in the Settings tab.": "L'intera lista di scorciatoie da tastiera è disponibile premendo il tasto '?' sulla tua tastiera, o tramite l'icona a forma di tastiera nella scheda Impostazioni.", - "Custom Torrents and Magnet Links": "Torrent e Magnet Link personali", - "You can use custom torrents and magnets links in Popcorn Time. Simply drag and drop .torrent files into the application's window, and/or paste any magnet link.": "In Popcorn Time puoi usare i torrent e i magnet link personali. Trascina e rilascia semplicemente i file .torrent nella finestra dell'applicazione, e/o copia qualsiasi magnet link.", - "Torrent health": "Salute del Torrent", - "On the details of Movies/TV Series, you can find a little circle, colored in grey, red, yellow or green. Those colors refer to the health of the torrent. A green torrent will be downloaded quickly, while a red torrent may not be downloaded at all, or very slowly. The color grey represents an error in the health calculation for Movies, and needs to be clicked in TV Series in order to display the health.": "Tra i dettagli di Film/Serie TV puoi trovare un piccolo cerchio, colorato di grigio, rosso, giallo o verde. Questi colori fanno riferimento alla salute del torrent. Un torrent verde verrà scaricato rapidamente, mentre un torrent rosso potrebbe non riuscire ad essere scaricato affatto, o potrebbe impiegarci molto tempo. Il colore grigio rappresenta un errore nel calcolo della salute per i Film, e deve essere cliccato nelle Serie TV affinché mostri la salute.", - "How does Popcorn Time work?": "Come funziona Popcorn Time?", - "Popcorn Time streams video content through torrents. Our movies are provided by %s and our TV Series by %s, while getting all metadata from %s. We don't host any content ourselves.": "Popcorn Time divulga in streaming contenuti video sfruttando i torrent. I nostri film sono procurati da YTS %s e le nostre serie TV da %s. Mentre prende i metadati da %s. Non postiamo alcun contenuto per nostro conto.", - "Torrent streaming? Well, torrents use Bittorrent protocol, which basically means that you download small parts of the content from another user's computer, while sending the parts you already downloaded to another user. Then, you watch those parts, while the next ones are being downloaded in the background. This exchange allows the content to stay healthy.": "Streaming in torrent? Dunque, i torrent usano un protocollo Bittorrent, che essenzialmente significa che tu scarichi piccole parti del contenuto dal computer di un utente, mentre nel contempo invii le parti che hai già scaricato ad un altro utente. Poi guardi quelle parti mentre quelle successive vengono scaricate in background. Questo scambio permette al contenuto di rimanere salutare.", - "Once the movie is fully downloaded, you continue to send parts to the other users. And everything is deleted from your computer when you close Popcorn Time. As simple as that.": "Quando il filmato è stato scaricato completamente, continui ad inviare parti ad altri utenti, e tutto viene cancellato dal tuo computer quando chiudi Popcorn Time. Tutto qui.", - "The application itself is built with Node-Webkit, HTML, CSS and Javascript. It works like the Google Chrome browser, except that you host the biggest part of the code on your computer. Yes, Popcorn Time works on the same technology as a regular website, like... let's say Wikipedia, or Youtube!": "L'applicazione in sé è stata costruita con Node-Webkit, HTML, CSS e Javascript. Funziona come il browser Google Chrome, con l'eccezione che in questo caso detieni gran parte del codice sul tuo computer. Sì, Popcorn Time funziona con la stessa tecnologia di un normale sito web, come... diciamo Wikipedia, o Youtube!", - "I found a bug, how do I report it?": "Ho trovato un errore, come lo comunico?", - "No historics found...": "Nessuna cronologia trovata...", - "Error, database is probably corrupted. Try flushing the history in settings.": "Errore, il database è probabilmente corrotto. Prova ad eliminare la cronologia nelle Impostazioni.", - "You can paste magnet links anywhere in Popcorn Time with CTRL+V.": "Puoi incollare i magnet link ovunque in Popcorn Time con CTRL+V.", - "You can drag & drop a .torrent file into Popcorn Time.": "Puoi trascinare e rilasciare qualunque file .torrent su Popcorn Time.", - "The Popcorn Time project started in February 2014 and has already had 150 people that contributed more than 3000 times to it's development in August 2014.": "Il progetto Popcorn Time è partito nel Febbraio 2014, e ad Agosto 2014 aveva già 150 persone che avevano contribuito più di 3000 volte al suo sviluppo.", - "The rule n°10 applies here.": "Qui vale la regola n°10.", - "If a subtitle for a TV series is missing, you can add it on %s. And the same way for a movie, but on %s.": "Se manca un sottotitolo per una serie TV, puoi aggiungerlo su %s. E allo stesso modo per un film, ma su %s.", - "If you're experiencing connection drop issues, try to reduce the DHT Limit in settings.": "Se stai riscontrando problemi di cali di connessione, prova a ridurre il limite DHT nelle impostazioni.", - "If you search \"1998\", you can see all the movies or TV series that came out that year.": "Se cerchi \"1998\" puoi vedere tutti i film/serie TV usciti in quell'anno.", - "You can login to Trakt.tv to save all your watched items, and synchronize them across multiple devices.": "Puoi accedere a Trakt.tv per salvare tutti gli elementi guardati e sincronizzarli su molteplici dispositivi.", - "Clicking on the rating stars will display a number instead.": "Cliccando sulle stelle di valutazione verrà mostrato un numero al loro posto.", - "This application is entirely written in HTML5, CSS3 and Javascript.": "Questa applicazione è interamente scritta in HTML5, CSS3 e Javascript.", - "You can find out more about a movie or a TV series? Just click the IMDb icon.": "Vuoi saperne di più riguardo a un film o una serie TV? Clicca sull'icona di IMDb.", - "Clicking twice on a \"Sort By\" filter reverses the order of the list.": "Cliccare due volte su un filtro \"Ordina Per\" inverte l'ordine della lista.", - "Switch to next tab": "Passa alla prossima scheda", - "Switch to previous tab": "Passa alla scheda precedente", - "Switch to corresponding tab": "Passa alla scheda corrispondente", - "through": "attraverso", - "Enlarge Covers": "Ingrandisci locandine", - "Reduce Covers": "Riduci locandine", - "Open the Help Section": "Apri la sezione Aiuto", - "Open Item Details": "Apri i dettagli dell'elemento", - "Add Item to Favorites": "Aggiungi elemento ai Preferiti", - "Mark as Seen": "Segna come Guardato", - "Open this screen": "Apri questa schermata", - "Open Settings": "Apri le Impostazioni", - "Posters Size": "Dimensione dei Poster", - "This feature only works if you have your TraktTv account synced. Please go to Settings and enter your credentials.": "Questa funzione è utilizzabile solo se il tuo account TraktTv è sincronizzato. Si prega di andare in Impostazioni e inserire le proprie credenziali.", - "Last Open": "Aperto l'ultima volta", - "Exporting Database...": "Esportazione Database...", - "Database Successfully Exported": "Database esportato", - "Display": "Schermo", - "TV": "TV", - "Type": "Tipo", - "popularity": "Popolarità", - "date": "Data", - "year": "Anno", - "rating": "Valutazione", - "updated": "Aggiornato", - "name": "Nome", - "OVA": "OVA", - "ONA": "ONA", - "No anime found...": "Nessun Anime trovato...", - "Movie": "Film", - "Special": "Speciale", - "No Watchlist found...": "Nessuna lista \"da vedere\" trovata...", - "Watchlist": "Da vedere", - "Resolving..": "Risoluzione in corso...", - "About": "Riguardo a", - "Open Cache Directory": "Apri cartella Cache", - "Open Database Directory": "Apri cartella Database", - "Mark as unseen": "Segna come non visto", - "Playback rate": "Velocità di Riproduzione", - "Increase playback rate by %s": "Aumenta Velocità di riproduzione di %s", - "Decrease playback rate by %s": "Diminuisci Velocità di riproduzione di %s", - "Set playback rate to %s": "Imposta Velocità di riproduzione a %s", - "Playback rate adjustment is not available for this video!": "Non è possibile modificare la velocità di riproduzione per questo video!", - "Color": "Colore", - "With Shadows": "Con ombreggiatura", - "Local IP Address": "Indirizzo IP Locale", - "Japan": "Giappone", - "Cars": "Macchine", - "Dementia": "Demenza", - "Demons": "Demoni", - "Ecchi": "Ecchi", - "Game": "Gioco", - "Harem": "Harem", - "Historical": "Storico", - "Josei": "Josei", - "Kids": "Per bambini", - "Magic": "Magia", - "Martial Arts": "Arti Marziali", - "Mecha": "Mecha", - "Military": "Militare", - "Parody": "Parodia", - "Police": "Polizia", - "Psychological": "Psicologico", - "Samurai": "Samurai", - "School": "Scuola", - "Seinen": "Seinen", - "Shoujo": "Shoujo", - "Shoujo Ai": "Shoujo Ai", - "Shounen": "Shounen", - "Shounen Ai": "Shounen Ai", - "Slice Of Life": "Slice Of Life", - "Slice of Life": "Fetta di Vita", - "Space": "Spazio", - "Sports": "Sport", - "Super Power": "Superpoteri", - "Supernatural": "Sovrannaturale", - "Vampire": "Vampiri", - "Alphabet": "Alfabeto", - "Automatically Sync on Start": "Sincronizza automaticamente all'avvio", - "Setup VPN": "Impostare VPN", - "VPN": "VPN", - "Install VPN Client": "Installa Client VPN", - "More Details": "Maggiori Dettagli", - "Don't show me this VPN option anymore": "Non mostrarmi più questa opzione VPN", - "Activate automatic updating": "Attivare aggiornamento automatico", - "We are installing VPN client": "Stiamo installato il client VPN", - "VPN Client Installed": "Client VPN Installato", - "Please wait...": "Attendere prego...", - "VPN.ht client is installed": "Client VPN.ht installato", - "Install again": "Installa ancora", - "Connect": "Connetti", - "Create Account": "Crea Account", - "Please, allow ~ 1 minute": "Per favore, attendi circa 1 minuto", - "Status: Connecting to VPN...": "Stato: Connessione alla VPN...", - "Status: Monitoring connexion - ": "Stato: Monitoraggio connessione -", - "Connect VPN": "Connetti VPN", - "Disconnect VPN": "Disconnetti VPN", - "Celebrate various events": "Celebrare vari eventi", - "ATTENTION! We need admin access to run this command.": "ATTENZIONE! Abbiamo bisogno dell'autorizzazione dell'admin per eseguire questo comando", - "Your password is not saved": "La tua password non è stata salvata", - "Enter sudo password :": "Inserisci Password sudo", - "Status: Monitoring connection": "Stato: Controllando connessione", - "Status: Connected": "Stato: Connesso", - "Secure connection": "Connessione sicura", - "Your IP:": "Il tuo IP", - "Disconnect": "Disconnetti", - "Downloaded": "Scaricato", - "Loading stuck ? Click here !": "Caricamento Bloccato? Clicca qui!", - "Torrent Collection": "Collezione Torrent", - "Drop Magnet or .torrent": "Lascia Magnet o Torrent", - "Remove this torrent": "Rimuovi questo torrent", - "Rename this torrent": "Rinomina questo torrent", - "Flush entire collection": "Svuota l'intera collezione", - "Open Collection Directory": "Apri la cartella della collezione", - "Store this torrent": "Conserva questo Torrent", - "Enter new name": "Inserisci nuovo nome", - "This name is already taken": "Questo nome è già stato preso", - "Always start playing in fullscreen": "Fai partire sempre a schermo intero", - "Allow torrents to be stored for further use": "permetti ai torrent di essere conservati per ulteriore uso", - "Hide VPN from the filter bar": "Nascondi il VPN dalla barra dei filtri", - "Magnet link": "Link Magnet", - "Error resolving torrent.": "Errore nello svolgimento del Torrent", - "%s hour(s) remaining": "%s ora(e) alla fine", - "%s minute(s) remaining": "%s minuto(i) alla fine", - "%s second(s) remaining": "%s Secondo(i) alla fine", - "Unknown time remaining": "Tempo rimanente sconosciuto", - "Set player window to video resolution": "Imposta il lettore alla risoluzione attuale", - "Set player window to double of video resolution": "Imposta il lettore al doppio della risoluzione video", - "Set player window to half of video resolution": "Imposta il lettore a metà della risoluzione video", - "Retry": "Riprova", - "Import a Torrent": "Importa un torrent", - "The remote movies API failed to respond, please check %s and try again later": "Le API remote per i Film non rispondono. per favore controlla %s e prova di nuovo più tardi", - "The remote shows API failed to respond, please check %s and try again later": "Le API remote per le serie non rispondono. per favore controlla %s e prova di nuovo più tardi", - "The remote anime API failed to respond, please check %s and try again later": "Le API remote per gli anime non rispondono. per favore controlla %s e prova di nuovo più tardi", - "Not Seen": "Non guardato", - "Seen": "Guardato", - "Title": "Titolo", - "The video playback encountered an issue. Please try an external player like %s to view this content.": "C'è stato un problema con la riproduzione del video. Per favore prova un riproduttore esterno come %s per visualizzare questo contenuto", - "Font": "Font", - "Decoration": "Decorazione", - "None": "Nessuno", - "Outline": "Contorno", - "Opaque Background": "Sfondo Opaco", - "No thank you": "No grazie", - "Report an issue": "Segnala un bug", - "Log in into your GitLab account": "Accedi al tuo account GitLab", - "Email": "Email", - "Log in": "Log in", - "Report anonymously": "Segnala anonimamente", - "Note regarding anonymous reports:": "Note riguardo alle segnalazioni anonime:", - "You will not be able to edit or delete your report once sent.": "Non sarai in grado di modificare o eliminare la tua segnalazione una volta inviata.", - "If any additionnal information is required, the report might be closed, as you won't be able to provide them.": "Se fosse richiesta qualche informazione aggiuntiva, la segnalazione potrebbe essere chiusa e potresti non essere in grado di fornirle.", - "Step 1: Please look if the issue was already reported": "Passo 1: Per favore, controlla se l'errore è già stato segnalato in precedenza.", - "Enter keywords": "Inserisci le parole chiave", - "Already reported": "Già segnalato", - "I want to report a new issue": "Voglio segnalare un nuovo errore", - "Step 2: Report a new issue": "Passo 2: Segnala un nuovo errore", - "Note: please don't use this form to contact us. It is limited to bug reports only.": "Nota: Per favore, non usare questo modulo per contattarci. Serve solamente a segnalare i bug.", - "The title of the issue": "Titolo dell'errore", - "Description": "Descrizione", - "200 characters minimum": "Minimo 200 caratteri", - "A short description of the issue. If suitable, include the steps required to reproduce the bug.": "Una breve descrizione dell'errore. Se possibile, includere i passaggi richiesti per riprodurre il bug.", - "Submit": "Invia", - "Step 3: Thank you !": "Passo 3: Grazie!", - "Your issue has been reported.": "Il tuo errore è stato segnalato.", - "Open in your browser": "Apri il tuo browser", - "No issues found...": "Nessun errore trovato...", - "First method": "Primo metodo", - "Use the in-app reporter": "Usa il segnalatore integrato", - "You can find it later on the About page": "Lo puoi trovare dopo nella pagina info", - "Second method": "Secondo metodo", - "You can create an account on our %s repository, and click on %s.": "Puoi creare un account sul nostro reposity %s, e cliccare su %s.", - "Use the %s issue filter to search and check if the issue has already been reported or is already fixed.": "Usa il filtro errori %s per cercare e controllare se l'errore è già stato riportato o fixato.", - "Include a screenshot if relevant - Is your issue about a design feature or a bug?": "Includi uno screenshot se serve - La tua segnalazione riguarda un errore nel design o un bug?", - "A good bug report shouldn't leave others needing to chase you up for more information. Be sure to include the details of your environment.": "Una buona segnalazione non dovrebbe obbligare a cercare ulteriori informazioni. Sii sicuro di includere i dettagli sul tuo sistema.", - "Warning: Always use English when contacting us, or we might not understand you.": "Attenzione: Usa sempre l'inglese quando ci contatti, o protemmo non capirti.", - "Search on %s": "Cerca su %s", - "No results found": "Nessun risultato trovato", - "Invalid credentials": "Credenziali errate", - "Open Favorites": "Apri i preferiti", - "Open About": "Apri le info", - "Minimize to Tray": "Minimize to Tray", - "Close": "Chiudi", - "Restore": "Restore", - "Resume Playback": "Riprendi la riproduzione", - "Features": "Caratteristiche", - "Connect To %s": "Connetti a %s", - "The magnet link was copied to the clipboard": "Il magnet link è stato copiato negli appunti ", - "Big Picture Mode": "Modalità \"grande schermo\"", - "Big Picture Mode is unavailable on your current screen resolution": "La modalità \"grande schermo\" non è disponibile nella tua risoluzione schermo corrente", - "Cannot be stored": "Non può essere memorizzato", - "%s reported this torrent as fake": "%s ha segnalato questo torrent come fake", - "%s could not verify this torrent": "%s non può controllare questo torrent ", - "Randomize": "Casuale", - "Randomize Button for Movies": "Pulsante casuale per i film", - "Overall Ratio": "rapporto complessivo", - "Translate Synopsis": "Traduci Synopsis", - "Returning Series": "Serie in corso", - "In Production": "In produzione", - "Canceled": "Cancellato", - "N/A": " N/A", - "%s is not supposed to be run as administrator": "%s non è previsto per essere eseguito come amministratore", - "Your disk is almost full.": "Il tuo disco è quasi pieno.", - "You need to make more space available on your disk by deleting files.": "Devi fare più spazio sul disco cancellando alcuni files", - "Playing Next": "Esecuz. Successivo", - "Trending": "Di tendenza" + "External Player": "Player Esterno", + "Made with": "Fatto con", + "by a bunch of geeks from All Around The World": "da un gruppo di smanettoni provenienti da tutto il mondo", + "Initializing PopcornTime. Please Wait...": "Inizializzazione di PopcornTime. Attendere prego...", + "Status: Checking Database...": "Stato: controllo del database in corso...", + "Movies": "Film", + "TV Series": "Serie TV", + "Anime": "Anime", + "Genre": "Genere", + "All": "Tutti", + "Action": "Azione", + "Adventure": "Avventura", + "Animation": "Animazione", + "Children": "Per Bambini", + "Comedy": "Commedia", + "Crime": "Crimine", + "Documentary": "Documentario", + "Drama": "Drammatico", + "Family": "Per famiglie", + "Fantasy": "Fantasy", + "Game Show": "Quiz televisivo", + "Home And Garden": "Casa e Giardinaggio", + "Horror": "Horror", + "Mini Series": "Miniserie", + "Mystery": "Mistero", + "News": "Notizie", + "Reality": "Reality", + "Romance": "Romantico", + "Science Fiction": "Fantascienza", + "Soap": "Soap Opera", + "Special Interest": "Di interesse Speciale", + "Sport": "Sport", + "Suspense": "Suspense", + "Talk Show": "Talk Show", + "Thriller": "Thriller", + "Western": "Western", + "Sort by": "Ordina per", + "Popularity": "Popolarità", + "Updated": "Aggiornato", + "Year": "Anno", + "Name": "Nome", + "Search": "Cerca", + "Season": "Stagione", + "Seasons": "Stagioni", + "Season %s": "Stagione %s", + "Load More": "Mostra altri", + "Saved": "Salvato", + "Settings": "Impostazioni", + "Show advanced settings": "Mostra le impostazioni avanzate", + "User Interface": "Interfaccia utente", + "Default Language": "Lingua predefinita", + "Theme": "Tema", + "Start Screen": "Schermata iniziale", + "Favorites": "Preferiti", + "Show rating over covers": "Mostra la valutazione dei film sulle locandine", + "Always On Top": "Sempre in primo piano", + "Watched Items": "Elementi guardati", + "Show": "Mostra", + "Fade": "Sfuma", + "Hide": "Nascondi", + "Subtitles": "Sottotitoli", + "Default Subtitle": "Sottotitoli predefiniti", + "Disabled": "Disabilitato", + "Size": "Dimensione", + "Quality": "Qualità", + "Only list movies in": "Mostra solo i film in", + "Show movie quality on list": "Mostra la qualità video del film nella lista", + "Trakt.tv": "Trakt.tv", + "Enter your Trakt.tv details here to automatically 'scrobble' episodes you watch in Popcorn Time": "Inserisci qui i tuoi dati di accesso a Trakt.tv per aggiungere automaticamente gli episodi che guardi in Popcorn Time", + "Connect to %s to automatically 'scrobble' episodes you watch in %s": "Connect to %s to automatically 'scrobble' episodes you watch in %s", + "Username": "Nome utente", + "Password": "Password", + "Popcorn Time stores an encrypted hash of your password in your local database": "Popcorn Time conserva un hash crittografico della tua password nel database locale", + "Remote Control": "Controllo remoto", + "HTTP API Port": "Porta HTTP API", + "HTTP API Username": "Nome Utente HTTP API", + "HTTP API Password": "Password HTTP API", + "Connection": "Connessione", + "TV Show API Endpoint": "Indirizzo API Serie TV", + "Movies API Endpoint": "Punto finale delle API Film", + "Connection Limit": "Limite connessioni", + "DHT Limit": "Limite DHT", + "Port to stream on": "Porta sulla quale avviare lo stream", + "0 = Random": "0 = Casuale", + "Cache Directory": "Directory della cache", + "Clear Tmp Folder after closing app?": "Svuotare la Cartella Temporanea dopo la chiusura dell'app?", + "Database": "Database", + "Database Directory": "Cartella del Database", + "Import Database": "Importa Database", + "Export Database": "Esporta Database", + "Flush bookmarks database": "Svuota l'archivio dei segnalibri", + "Flush subtitles cache": "Svuota la cache dei sottotitoli", + "Flush all databases": "Svuota tutti i database", + "Reset to Default Settings": "Ripristina alle impostazione di default", + "Importing Database...": "Importazione del Database in corso...", + "Please wait": "Attendere prego", + "Error": "Errore", + "Biography": "Biografia", + "Film-Noir": "Noir", + "History": "Storico", + "Music": "Musica", + "Musical": "Musical", + "Sci-Fi": "Fantascienza", + "Short": "Corto", + "War": "Guerra", + "Last Added": "Ultimo Aggiunto", + "Rating": "Valutazione", + "Open IMDb page": "Apri pagina di IMDB", + "Health false": "Salute Sconosciuta", + "Add to bookmarks": "Aggiungi ai segnalibri", + "Watch Trailer": "Guarda Trailer", + "Watch Now": "Guarda ora", + "Health Good": "Salute Buona", + "Ratio:": "Rapporto:", + "Seeds:": "Seeds:", + "Peers:": "Peers:", + "Remove from bookmarks": "Rimuovi dai segnalibri", + "Changelog": "Registro delle modifiche", + "Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.": "Popcorn Time! è il risultato di tanti sviluppatori che hanno lavorato alle API insieme per rendere l'esperienza di vedere i film in torrent più semplice possibile.", + "We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.": "Siamo un progetto open source. Veniamo da tutto il mondo. Amiamo i nostri film. E diamine se amiamo i popcorn.", + "Invalid PCT Database File Selected": "Hai selezionato un file PCT invalido", + "Health Unknown": "Salute sconosciuta", + "Episodes": "Episodi", + "Episode %s": "Episodio %s", + "Aired Date": "Trasmesso il", + "Streaming to": "Streaming a", + "connecting": "Connessione in corso...", + "Download": "Scarica", + "Upload": "Carica online", + "Active Peers": "Peer attivi", + "Cancel": "Annulla", + "startingDownload": "Inizio download", + "downloading": "Download in corso", + "ready": "Pronto", + "playingExternally": "Riproducendo esternamente", + "Custom...": "Personalizzato...", + "Volume": "Volume", + "Ended": "Concluso", + "Error loading data, try again later...": "Errore caricamento dati, riprova più tardi...", + "Miscellaneous": "Misto", + "When opening TV Show Detail Jump to:": "Quando accedi ai dettagli dello Show salta a:", + "First Unwatched Episode": "Primo episodio non visto", + "Next Episode In Series": "Prossimo episodio nella serie", + "When Opening TV Show Detail Jump To": "Quando accedi ai dettagli dello Show salta a", + "Flushing...": "Pulizia in corso...", + "Are you sure?": "Sei sicuro?", + "We are flushing your databases": "Pulizia dei tuoi database in corso", + "Success": "Operazione eseguita con successo", + "Please restart your application": "Si prega di riavviare l'applicazione", + "Restart": "Riavvia", + "Terms of Service": "Condizioni d'uso", + "I Accept": "Accetto", + "Leave": "Esci", + "When Opening TV Series Detail Jump To": "Quando accedi ai dettagli delle Serie TV salta a", + "Health Medium": "Salute Media", + "Playback": "Playback", + "Play next episode automatically": "Guarda il prossimo episodio automaticamente", + "Generate Pairing QR code": "Genera QR code", + "Playing Next Episode in": "Il prossimo episodio verrà riprodotto tra", + "Play": "Riproduci", + "Dismiss": "Scarta", + "waitingForSubtitles": "Aspettando i sottotitoli...", + "Play Now": "Guarda ora", + "Seconds": "Secondi", + "You are currently authenticated to Trakt.tv as": "Al momento sei autenticato su Trakt.tv come", + "You are currently connected to %s": "Sei connesso a %s", + "Disconnect account": "Disconnetti account", + "Sync With Trakt": "Sincronizza con Trakt", + "Syncing...": "Sincronizzazione in corso...", + "Done": "Fatto", + "Subtitles Offset": "Ritardo sottotitoli", + "secs": "secondi", + "We are flushing your database": "Pulizia del tuo database in corso", + "We are rebuilding the TV Show Database. Do not close the application.": "Stiamo aggiornando il database delle Serie TV. Non chiudere l'applicazione.", + "No shows found...": "Nessuna serie trovata...", + "No Favorites found...": "Nessun preferito trovato...", + "Rebuild TV Shows Database": "Aggiorna il Database delle Serie TV", + "No movies found...": "Nessun film trovato...", + "Ratio": "Rapporto video", + "Health Excellent": "Salute Eccellente", + "Health Bad": "Salute Scarsa", + "Status: Creating Database...": "Stato: creazione del database in corso...", + "Status: Updating database...": "Stato: aggiornamento del database in corso...", + "Status: Skipping synchronization TTL not met": "Stato: sincronizzazione ignorata (controllo TTL non soddisfatto)", + "Advanced Settings": "Impostazioni Avanzate", + "Clear Cache directory after closing app?": "Svuotare la Cartella della Cache dopo la chiusura dell'app?", + "Tmp Folder": "Cartella Temporanea", + "Status: Downloading API archive...": "Stato: Download dell'archivio API", + "Status: Archive downloaded successfully...": "Stato: Archivio scaricato con successo", + "Status: Importing file": "Stato: Sto importando il file", + "Status: Imported successfully": "Stato: Importato correttamente", + "Status: Launching applicaion... ": "Stato: Sto lanciando l'applicazione...", + "URL of this stream was copied to the clipboard": "L'indirizzo di questo stream è stato copiato negli appunti", + "Error, database is probably corrupted. Try flushing the bookmarks in settings.": "Errore, probabilmente il database è corrotto. Prova a cancellare i preferiti nelle impostazioni.", + "Flushing bookmarks...": "Pulizia dei preferiti in corso...", + "Resetting...": "Ripristino...", + "We are resetting the settings": "Stiamo resettando le impostazioni", + "New version downloaded": "Nuova versione scaricata", + "Installed": "Installata", + "Install Now": "Installa ora", + "Restart Now": "Riavvia ora", + "We are flushing your subtitle cache": "Pulizia del database dei sottotitoli in corso", + "Subtitle cache deleted": "Cache dei sottotitoli eliminata", + "Please select a file to play": "Per favore selezionare un file da riprodurre", + "Test Login": "Prova di Login", + "Testing...": "Prova...", + "Success!": "Successo!", + "Failed!": "Fallito!", + "Global shortcuts": "Shortcut Globali", + "Video Player": "Riproduttore Video", + "Toggle Fullscreen": "Attiva Schermo Intero", + "Play/Pause": "Play/Pausa", + "Seek Forward": "Ricerca Avanti", + "Increase Volume": "Aumenta il Volume", + "Set Volume to": "Imposta il Volume a", + "Offset Subtitles by": "Ritarda sottotitoli di", + "Toggle Mute": "Metti in Muto", + "Movie Detail": "Dettagli Film", + "Toggle Quality": "Imposta Qualità", + "Play Movie": "Riproduci Film", + "Exit Fullscreen": "Esci da Schermo Intero", + "Seek Backward": "Ricerca Indietro", + "Decrease Volume": "Abbassa il Volume", + "Show Stream URL": "Mostra l'indirizzo dello stream", + "TV Show Detail": "Dettagli Serie TV", + "Toggle Watched": "Visto", + "Select Next Episode": "Seleziona l'Episodio Successivo", + "Select Previous Episode": "Seleziona Episodio Precedente", + "Select Next Season": "Seleziona Prossima Stagione", + "Select Previous Season": "Seleziona Stagione Precedente", + "Play Episode": "Riproduci Episodio", + "space": "spazio", + "shift": "shift", + "ctrl": "ctrl", + "enter": "invio", + "esc": "esc", + "Keyboard Shortcuts": "Shortcut Tastiera", + "Cut": "Taglia", + "Copy": "Copia", + "Paste": "Incolla", + "Help Section": "Sezione Aiuto", + "Did you know?": "Lo sapevi?", + "What does Popcorn Time offer?": "Cosa offre Popcorn Time?", + "With Popcorn Time, you can watch Movies and TV Series really easily. All you have to do is click on one of the covers, then click 'Watch Now'. But your experience is highly customizable:": "Con Popcorn Time puoi guardare Film e serie TV con grande facilità. Tutto ciò che devi fare è cliccare su una delle locandine e poi su \"Guarda Ora\". Ma la tua esperienza è altamente personalizzabile:", + "Our Movies collection only contains High-Definition movies, available in 720p and 1080p. To watch a movie, simply open Popcorn Time and navigate through the movies collection, reachable through the 'Movies' tab, in the navigation bar. The default view will show you all movies sorted by popularity, but you can apply your own filters, thanks to the 'Genre' and 'Sort by' filters. Once you have chosen a movie you want to watch, click its cover. Then click 'Watch Now'. Don't forget the popcorn!": "La nostra collezione di film contiene solo pellicole in alta definizione, disponibili in 720p e 1080p. Per vedere un film, apri semplicemente Popcorn Time e naviga nella collezione di film, raggiungibile attraverso la scheda \"Film\", nella barra di navigazione. La visualizzazione standard mostrerà tutti i film ordinati per popolarità, ma puoi applicare i tuoi filtri personali, grazie ai filtri \"Genere\" e \"Ordina per\". Una volta che hai scelto un FIlm da vedere, clicca la sua locandina. poi clicca \"Guarda Ora\".\nNon dimenticarti i popcorn!", + "The TV Series tab, that you can reach by clicking 'TV Series' in the navigation bar, will show you all available series in our collection. You can also apply your own filters, same as the Movies, to help you decide what to watch. In this collection, also just click the cover: the new window that will appear will allow you to navigate through Seasons and Episodes. Once your mind is set, just click the 'Watch Now' button.": "La scheda delle Serie TV, che puoi raggiungere cliccando \"Serie TV\" nella barra di navigazione, ti mostrerà tutte le serie disponibili nella nostra collezione. Puoi anche applicare i tuoi filtri personali, allo stesso modo dei Film, per aiutarti a decidere cosa guardare. Anche in questa collezione, ti basterà cliccare sulla locandina: la nuova finestra che apparirà ti consentirà di navigare tra Stagioni ed Episodi. Dopo che hai deciso, clicca semplicemete il pulsante \"Guarda Ora\".", + "Choose quality": "Seleziona Qualità", + "A slider next to the 'Watch Now' button will let you choose the quality of the stream. You can also set a fixed quality in the Settings tab. Warning: a better quality equals more data to download.": "Una barra di scorrimento a fianco del pulsante \"Guarda Ora\" ti lascerà scegliere la qualità del filmato. Puoi anche selezionare una qualità fissa nella scheda Impostazioni. Attento: una migliore qualità significa una quantità maggiore di dati da scaricare.", + "Most of our Movies and TV Series have subtitles in your language. You can set them in the Settings tab. For the Movies, you can even set them through the dropdown menu, in the Movie Details page.": "Gran parte dei nostri Film e Serie TV sono disponibili con sottotitoli nella tua lingua. Puoi impostarli nella scheda Impostazioni. Per i Film puoi anche impostarli tramite il menù a tendina, nella pagina dei Dettagli del FIlm", + "Clicking the heart icon on a cover will add the movie/show to your favorites. This collection is reachable through the heart-shaped icon, in the navigation bar. To remove an item from your collection, just click on the icon again! How simple is that?": "Cliccare l'icona a cuore su una copertina aggiungerà il film/la serie ai tuoi preferiti. Questa collezione è raggiungibile attraverso l'icona a forma di cuore, nella barra di navigazione. Per rimuovere un elemento dalla tua collezione, clicca semplicemente di nuovo sull'icona! Semplicissimo, vero?", + "Watched icon": "Icona \"Guardato\"", + "Popcorn Time will keep in mind what you've already watched - a little help remembering doesn't cause any harm. You can also set an item as watched by clicking the eye-shaped icon on the covers. You can even build and synchronize your collection with Trakt.tv website, via the Settings tab.": "Popcorn Time ricorderà tutto ciò che hai già visto - un aiuto nel ricordare non fa mai male.\nPuoi anche impostare un elemento come Guardato, cliccando sull'icona a forma di occhio sulle locandine. Puoi anche creare e sincronizzare la tua collezione con il sito Trak.tv, attraverso la scheda Impostazioni.", + "In Popcorn Time, you can use the magnifier icon to open the search. Type a Title, an Actor, a Director or even a Year, press 'Enter' and let us show you what we can offer to fill your needs. To close your current search, you can click on the 'X' located next to your entry or type something else in the field.": "In Popcorn Time, puoi usare l'icona della lente d'ingrandimento per aprire il motore di ricerca. Digita un titolo, un attore, un regista o addirittura un anno, premi 'Invio' e lascia che ti mostriamo cosa abbiamo da offrirti per soddisfare le tue necessità. Per chiudere la ricerca puoi cliccare sulla 'X' situata a fianco di ciò che hai scritto, o puoi digitare qualcos'altro nel campo di ricerca.", + "External Players": "Riproduttori Esterni", + "If you prefer to use a custom player instead of the built in one, you can do so by clicking the allocated icon on the 'Watch Now' button. A list of your installed players will be shown, select one and Popcorn Time will send everything to it. If your player isn't on the list, please report it to us.": "Se preferisci utilizzare un riproduttore personale al posto di quello preinstallato, puoi farlo cliccando l'icona apposita sul pulsante \"Guarda Ora\". Comparirà una lista dei riproduttori installati sul tuo computer, selezionane uno e Popcorn Time gli invierà tutto. Se il tuo player non si trova sulla lista, per favore faccelo sapere.", + "To push the customization even further, we offer you a large panel of options. To access the Settings, click the wheel-shaped icon in the navigation bar.": "Per permetterti di personalizzare ulteriormente la tua esperienza, offriamo un vasto numero di opzioni. Per accedere alle Impostazioni, clicca l'icona a forma di ingranaggio nella barra di navigazione.", + "Keyboard Navigation": "Navigazione con Tastiera", + "The entire list of keyboard shortcuts is available by pressing '?' on your keyboard, or through the keyboard-shaped icon in the Settings tab.": "L'intera lista di scorciatoie da tastiera è disponibile premendo il tasto '?' sulla tua tastiera, o tramite l'icona a forma di tastiera nella scheda Impostazioni.", + "Custom Torrents and Magnet Links": "Torrent e Magnet Link personali", + "You can use custom torrents and magnets links in Popcorn Time. Simply drag and drop .torrent files into the application's window, and/or paste any magnet link.": "In Popcorn Time puoi usare i torrent e i magnet link personali. Trascina e rilascia semplicemente i file .torrent nella finestra dell'applicazione, e/o copia qualsiasi magnet link.", + "Torrent health": "Salute del Torrent", + "On the details of Movies/TV Series, you can find a little circle, colored in grey, red, yellow or green. Those colors refer to the health of the torrent. A green torrent will be downloaded quickly, while a red torrent may not be downloaded at all, or very slowly. The color grey represents an error in the health calculation for Movies, and needs to be clicked in TV Series in order to display the health.": "Tra i dettagli di Film/Serie TV puoi trovare un piccolo cerchio, colorato di grigio, rosso, giallo o verde. Questi colori fanno riferimento alla salute del torrent. Un torrent verde verrà scaricato rapidamente, mentre un torrent rosso potrebbe non riuscire ad essere scaricato affatto, o potrebbe impiegarci molto tempo. Il colore grigio rappresenta un errore nel calcolo della salute per i Film, e deve essere cliccato nelle Serie TV affinché mostri la salute.", + "How does Popcorn Time work?": "Come funziona Popcorn Time?", + "Popcorn Time streams video content through torrents. Our movies are provided by %s and our TV Series by %s, while getting all metadata from %s. We don't host any content ourselves.": "Popcorn Time divulga in streaming contenuti video sfruttando i torrent. I nostri film sono procurati da YTS %s e le nostre serie TV da %s. Mentre prende i metadati da %s. Non postiamo alcun contenuto per nostro conto.", + "Torrent streaming? Well, torrents use Bittorrent protocol, which basically means that you download small parts of the content from another user's computer, while sending the parts you already downloaded to another user. Then, you watch those parts, while the next ones are being downloaded in the background. This exchange allows the content to stay healthy.": "Streaming in torrent? Dunque, i torrent usano un protocollo Bittorrent, che essenzialmente significa che tu scarichi piccole parti del contenuto dal computer di un utente, mentre nel contempo invii le parti che hai già scaricato ad un altro utente. Poi guardi quelle parti mentre quelle successive vengono scaricate in background. Questo scambio permette al contenuto di rimanere salutare.", + "Once the movie is fully downloaded, you continue to send parts to the other users. And everything is deleted from your computer when you close Popcorn Time. As simple as that.": "Quando il filmato è stato scaricato completamente, continui ad inviare parti ad altri utenti, e tutto viene cancellato dal tuo computer quando chiudi Popcorn Time. Tutto qui.", + "The application itself is built with Node-Webkit, HTML, CSS and Javascript. It works like the Google Chrome browser, except that you host the biggest part of the code on your computer. Yes, Popcorn Time works on the same technology as a regular website, like... let's say Wikipedia, or Youtube!": "L'applicazione in sé è stata costruita con Node-Webkit, HTML, CSS e Javascript. Funziona come il browser Google Chrome, con l'eccezione che in questo caso detieni gran parte del codice sul tuo computer. Sì, Popcorn Time funziona con la stessa tecnologia di un normale sito web, come... diciamo Wikipedia, o Youtube!", + "I found a bug, how do I report it?": "Ho trovato un errore, come lo comunico?", + "No historics found...": "Nessuna cronologia trovata...", + "Error, database is probably corrupted. Try flushing the history in settings.": "Errore, il database è probabilmente corrotto. Prova ad eliminare la cronologia nelle Impostazioni.", + "You can paste magnet links anywhere in Popcorn Time with CTRL+V.": "Puoi incollare i magnet link ovunque in Popcorn Time con CTRL+V.", + "You can drag & drop a .torrent file into Popcorn Time.": "Puoi trascinare e rilasciare qualunque file .torrent su Popcorn Time.", + "The Popcorn Time project started in February 2014 and has already had 150 people that contributed more than 3000 times to it's development in August 2014.": "Il progetto Popcorn Time è partito nel Febbraio 2014, e ad Agosto 2014 aveva già 150 persone che avevano contribuito più di 3000 volte al suo sviluppo.", + "The rule n°10 applies here.": "Qui vale la regola n°10.", + "If a subtitle for a TV series is missing, you can add it on %s. And the same way for a movie, but on %s.": "Se manca un sottotitolo per una serie TV, puoi aggiungerlo su %s. E allo stesso modo per un film, ma su %s.", + "If you're experiencing connection drop issues, try to reduce the DHT Limit in settings.": "Se stai riscontrando problemi di cali di connessione, prova a ridurre il limite DHT nelle impostazioni.", + "If you search \"1998\", you can see all the movies or TV series that came out that year.": "Se cerchi \"1998\" puoi vedere tutti i film/serie TV usciti in quell'anno.", + "You can login to Trakt.tv to save all your watched items, and synchronize them across multiple devices.": "Puoi accedere a Trakt.tv per salvare tutti gli elementi guardati e sincronizzarli su molteplici dispositivi.", + "Clicking on the rating stars will display a number instead.": "Cliccando sulle stelle di valutazione verrà mostrato un numero al loro posto.", + "This application is entirely written in HTML5, CSS3 and Javascript.": "Questa applicazione è interamente scritta in HTML5, CSS3 e Javascript.", + "You can find out more about a movie or a TV series? Just click the IMDb icon.": "Vuoi saperne di più riguardo a un film o una serie TV? Clicca sull'icona di IMDb.", + "Clicking twice on a \"Sort By\" filter reverses the order of the list.": "Cliccare due volte su un filtro \"Ordina Per\" inverte l'ordine della lista.", + "Switch to next tab": "Passa alla prossima scheda", + "Switch to previous tab": "Passa alla scheda precedente", + "Switch to corresponding tab": "Passa alla scheda corrispondente", + "through": "attraverso", + "Enlarge Covers": "Ingrandisci locandine", + "Reduce Covers": "Riduci locandine", + "Open the Help Section": "Apri la sezione Aiuto", + "Open Item Details": "Apri i dettagli dell'elemento", + "Add Item to Favorites": "Aggiungi elemento ai Preferiti", + "Mark as Seen": "Segna come Guardato", + "Open this screen": "Apri questa schermata", + "Open Settings": "Apri le Impostazioni", + "Posters Size": "Dimensione dei Poster", + "This feature only works if you have your TraktTv account synced. Please go to Settings and enter your credentials.": "Questa funzione è utilizzabile solo se il tuo account TraktTv è sincronizzato. Si prega di andare in Impostazioni e inserire le proprie credenziali.", + "Last Open": "Aperto l'ultima volta", + "Exporting Database...": "Esportazione Database...", + "Database Successfully Exported": "Database esportato", + "Display": "Schermo", + "TV": "TV", + "Type": "Tipo", + "popularity": "Popolarità", + "date": "Data", + "year": "Anno", + "rating": "Valutazione", + "updated": "Aggiornato", + "name": "Nome", + "OVA": "OVA", + "ONA": "ONA", + "No anime found...": "Nessun Anime trovato...", + "Movie": "Film", + "Special": "Speciale", + "No Watchlist found...": "Nessuna lista \"da vedere\" trovata...", + "Watchlist": "Da vedere", + "Resolving..": "Risoluzione in corso...", + "About": "Riguardo a", + "Open Cache Directory": "Apri cartella Cache", + "Open Database Directory": "Apri cartella Database", + "Mark as unseen": "Segna come non visto", + "Playback rate": "Velocità di Riproduzione", + "Increase playback rate by %s": "Aumenta Velocità di riproduzione di %s", + "Decrease playback rate by %s": "Diminuisci Velocità di riproduzione di %s", + "Set playback rate to %s": "Imposta Velocità di riproduzione a %s", + "Playback rate adjustment is not available for this video!": "Non è possibile modificare la velocità di riproduzione per questo video!", + "Color": "Colore", + "With Shadows": "Con ombreggiatura", + "Local IP Address": "Indirizzo IP Locale", + "Japan": "Giappone", + "Cars": "Macchine", + "Dementia": "Demenza", + "Demons": "Demoni", + "Ecchi": "Ecchi", + "Game": "Gioco", + "Harem": "Harem", + "Historical": "Storico", + "Josei": "Josei", + "Kids": "Per bambini", + "Magic": "Magia", + "Martial Arts": "Arti Marziali", + "Mecha": "Mecha", + "Military": "Militare", + "Parody": "Parodia", + "Police": "Polizia", + "Psychological": "Psicologico", + "Samurai": "Samurai", + "School": "Scuola", + "Seinen": "Seinen", + "Shoujo": "Shoujo", + "Shoujo Ai": "Shoujo Ai", + "Shounen": "Shounen", + "Shounen Ai": "Shounen Ai", + "Slice Of Life": "Slice Of Life", + "Slice of Life": "Fetta di Vita", + "Space": "Spazio", + "Sports": "Sport", + "Super Power": "Superpoteri", + "Supernatural": "Sovrannaturale", + "Vampire": "Vampiri", + "Alphabet": "Alfabeto", + "Automatically Sync on Start": "Sincronizza automaticamente all'avvio", + "Setup VPN": "Impostare VPN", + "VPN": "VPN", + "Install VPN Client": "Installa Client VPN", + "More Details": "Maggiori Dettagli", + "Don't show me this VPN option anymore": "Non mostrarmi più questa opzione VPN", + "Activate automatic updating": "Attivare aggiornamento automatico", + "We are installing VPN client": "Stiamo installato il client VPN", + "VPN Client Installed": "Client VPN Installato", + "Please wait...": "Attendere prego...", + "VPN.ht client is installed": "Client VPN.ht installato", + "Install again": "Installa ancora", + "Connect": "Connetti", + "Create Account": "Crea Account", + "Please, allow ~ 1 minute": "Per favore, attendi circa 1 minuto", + "Status: Connecting to VPN...": "Stato: Connessione alla VPN...", + "Status: Monitoring connexion - ": "Stato: Monitoraggio connessione -", + "Connect VPN": "Connetti VPN", + "Disconnect VPN": "Disconnetti VPN", + "Celebrate various events": "Celebrare vari eventi", + "ATTENTION! We need admin access to run this command.": "ATTENZIONE! Abbiamo bisogno dell'autorizzazione dell'admin per eseguire questo comando", + "Your password is not saved": "La tua password non è stata salvata", + "Enter sudo password :": "Inserisci Password sudo", + "Status: Monitoring connection": "Stato: Controllando connessione", + "Status: Connected": "Stato: Connesso", + "Secure connection": "Connessione sicura", + "Your IP:": "Il tuo IP", + "Disconnect": "Disconnetti", + "Downloaded": "Scaricato", + "Loading stuck ? Click here !": "Caricamento Bloccato? Clicca qui!", + "Torrent Collection": "Collezione Torrent", + "Drop Magnet or .torrent": "Lascia Magnet o Torrent", + "Remove this torrent": "Rimuovi questo torrent", + "Rename this torrent": "Rinomina questo torrent", + "Flush entire collection": "Svuota l'intera collezione", + "Open Collection Directory": "Apri la cartella della collezione", + "Store this torrent": "Conserva questo Torrent", + "Enter new name": "Inserisci nuovo nome", + "This name is already taken": "Questo nome è già stato preso", + "Always start playing in fullscreen": "Fai partire sempre a schermo intero", + "Allow torrents to be stored for further use": "permetti ai torrent di essere conservati per ulteriore uso", + "Hide VPN from the filter bar": "Nascondi il VPN dalla barra dei filtri", + "Magnet link": "Link Magnet", + "Error resolving torrent.": "Errore nello svolgimento del Torrent", + "%s hour(s) remaining": "%s ora(e) alla fine", + "%s minute(s) remaining": "%s minuto(i) alla fine", + "%s second(s) remaining": "%s Secondo(i) alla fine", + "Unknown time remaining": "Tempo rimanente sconosciuto", + "Set player window to video resolution": "Imposta il lettore alla risoluzione attuale", + "Set player window to double of video resolution": "Imposta il lettore al doppio della risoluzione video", + "Set player window to half of video resolution": "Imposta il lettore a metà della risoluzione video", + "Retry": "Riprova", + "Import a Torrent": "Importa un torrent", + "The remote movies API failed to respond, please check %s and try again later": "Le API remote per i Film non rispondono. per favore controlla %s e prova di nuovo più tardi", + "The remote shows API failed to respond, please check %s and try again later": "Le API remote per le serie non rispondono. per favore controlla %s e prova di nuovo più tardi", + "The remote anime API failed to respond, please check %s and try again later": "Le API remote per gli anime non rispondono. per favore controlla %s e prova di nuovo più tardi", + "Not Seen": "Non guardato", + "Seen": "Guardato", + "Title": "Titolo", + "The video playback encountered an issue. Please try an external player like %s to view this content.": "C'è stato un problema con la riproduzione del video. Per favore prova un riproduttore esterno come %s per visualizzare questo contenuto", + "Font": "Font", + "Decoration": "Decorazione", + "None": "Nessuno", + "Outline": "Contorno", + "Opaque Background": "Sfondo Opaco", + "No thank you": "No grazie", + "Report an issue": "Segnala un bug", + "Log in into your GitLab account": "Accedi al tuo account GitLab", + "Email": "Email", + "Log in": "Log in", + "Report anonymously": "Segnala anonimamente", + "Note regarding anonymous reports:": "Note riguardo alle segnalazioni anonime:", + "You will not be able to edit or delete your report once sent.": "Non sarai in grado di modificare o eliminare la tua segnalazione una volta inviata.", + "If any additionnal information is required, the report might be closed, as you won't be able to provide them.": "Se fosse richiesta qualche informazione aggiuntiva, la segnalazione potrebbe essere chiusa e potresti non essere in grado di fornirle.", + "Step 1: Please look if the issue was already reported": "Passo 1: Per favore, controlla se l'errore è già stato segnalato in precedenza.", + "Enter keywords": "Inserisci le parole chiave", + "Already reported": "Già segnalato", + "I want to report a new issue": "Voglio segnalare un nuovo errore", + "Step 2: Report a new issue": "Passo 2: Segnala un nuovo errore", + "Note: please don't use this form to contact us. It is limited to bug reports only.": "Nota: Per favore, non usare questo modulo per contattarci. Serve solamente a segnalare i bug.", + "The title of the issue": "Titolo dell'errore", + "Description": "Descrizione", + "200 characters minimum": "Minimo 200 caratteri", + "A short description of the issue. If suitable, include the steps required to reproduce the bug.": "Una breve descrizione dell'errore. Se possibile, includere i passaggi richiesti per riprodurre il bug.", + "Submit": "Invia", + "Step 3: Thank you !": "Passo 3: Grazie!", + "Your issue has been reported.": "Il tuo errore è stato segnalato.", + "Open in your browser": "Apri il tuo browser", + "No issues found...": "Nessun errore trovato...", + "First method": "Primo metodo", + "Use the in-app reporter": "Usa il segnalatore integrato", + "You can find it later on the About page": "Lo puoi trovare dopo nella pagina info", + "Second method": "Secondo metodo", + "You can create an account on our %s repository, and click on %s.": "Puoi creare un account sul nostro reposity %s, e cliccare su %s.", + "Use the %s issue filter to search and check if the issue has already been reported or is already fixed.": "Usa il filtro errori %s per cercare e controllare se l'errore è già stato riportato o fixato.", + "Include a screenshot if relevant - Is your issue about a design feature or a bug?": "Includi uno screenshot se serve - La tua segnalazione riguarda un errore nel design o un bug?", + "A good bug report shouldn't leave others needing to chase you up for more information. Be sure to include the details of your environment.": "Una buona segnalazione non dovrebbe obbligare a cercare ulteriori informazioni. Sii sicuro di includere i dettagli sul tuo sistema.", + "Warning: Always use English when contacting us, or we might not understand you.": "Attenzione: Usa sempre l'inglese quando ci contatti, o protemmo non capirti.", + "Search on %s": "Cerca su %s", + "No results found": "Nessun risultato trovato", + "Invalid credentials": "Credenziali errate", + "Open Favorites": "Apri i preferiti", + "Open About": "Apri le info", + "Minimize to Tray": "Minimize to Tray", + "Close": "Chiudi", + "Restore": "Restore", + "Resume Playback": "Riprendi la riproduzione", + "Features": "Caratteristiche", + "Connect To %s": "Connetti a %s", + "The magnet link was copied to the clipboard": "Il magnet link è stato copiato negli appunti ", + "Big Picture Mode": "Modalità \"grande schermo\"", + "Big Picture Mode is unavailable on your current screen resolution": "La modalità \"grande schermo\" non è disponibile nella tua risoluzione schermo corrente", + "Cannot be stored": "Non può essere memorizzato", + "%s reported this torrent as fake": "%s ha segnalato questo torrent come fake", + "%s could not verify this torrent": "%s non può controllare questo torrent ", + "Randomize": "Casuale", + "Randomize Button for Movies": "Pulsante casuale per i film", + "Overall Ratio": "rapporto complessivo", + "Translate Synopsis": "Traduci Synopsis", + "Returning Series": "Serie in corso", + "In Production": "In produzione", + "Canceled": "Cancellato", + "N/A": " N/A", + "%s is not supposed to be run as administrator": "%s non è previsto per essere eseguito come amministratore", + "Your disk is almost full.": "Il tuo disco è quasi pieno.", + "You need to make more space available on your disk by deleting files.": "Devi fare più spazio sul disco cancellando alcuni files", + "Playing Next": "Esecuz. Successivo", + "Trending": "Di tendenza", + "Downloads": "Downloads", + "Likes": "Likes", + "Movie Search": "Movie Search", + "This feature has a built-in kat.cr search, which allows you to stream any movies, series or anime torrents with automatic subtitle support. The casting option integrates features including Chromecast, Airplay and DLNA. This library also provides an Anti-Virus Scanner and a 'History' feature, that keeps track of all your downloaded KAT torrents": "This feature has a built-in kat.cr search, which allows you to stream any movies, series or anime torrents with automatic subtitle support. The casting option integrates features including Chromecast, Airplay and DLNA. This library also provides an Anti-Virus Scanner and a 'History' feature, that keeps track of all your downloaded KAT torrents", + "Plugins": "Plugins", + "OpenSubtitles Username": "OpenSubtitles Username", + "OpenSubtitles Password": "OpenSubtitles Password", + "Stream from Browser": "Stream from Browser", + "Torrent Link": "Torrent Link", + "Magnet Link": "Magnet Link", + "Movie API Endpoint": "Movie API Endpoint", + "Activate Google Analytics": "Activate Google Analytics" } \ No newline at end of file diff --git a/src/app/lib/cache.js b/src/app/lib/cache.js index b0d04d7b..cdc326d1 100644 --- a/src/app/lib/cache.js +++ b/src/app/lib/cache.js @@ -14,9 +14,9 @@ win.debug('New database version'); _.each(cache.tables, function (table) { - tx.executeSql('DROP TABLE IF EXISTS ' + table, [], function () { + tx.executeSql('DROP TABLE IF EXISTS ' + table, [], function(_, result){ win.debug('Create table ' + table); - tx.executeSql('CREATE TABLE ' + table + ' (' + tableStruct + ')'); + tx.executeSql('CREATE TABLE ' + table + ' (' + tableStruct + ')',[], function(_, result) {}); }, function (tx, err) { win.error('Ceating db table', err); }); @@ -46,14 +46,14 @@ db.transaction(function (tx) { // Select item in db var query = 'SELECT * FROM ' + self.table + ' WHERE ' + buildWhereIn(ids); - tx.executeSql(query, ids, function (tx, results) { + tx.executeSql(query, ids, function(tx, result) { var cachedData = {}; var expiredData = []; var now = +new Date(); // Filter expired item - for (var i = 0; i < results.rows.length; i++) { - var row = results.rows.item(i); + for (var i = 0; i < result.rows.length; i++) { + var row = result.rows.item(i); var data = JSON.parse(row.data); if (row.ttl !== 0 && row.ttl < now - row.date_saved) { @@ -93,14 +93,14 @@ db.transaction(function (tx) { _.each(cachedData, function (item, id) { var data = JSON.stringify(item); - tx.executeSql('UPDATE ' + self.table + ' SET data = ?, ttl = ?, date_saved = ? WHERE id = ?', [data, ttl, now, id]); + tx.executeSql('UPDATE ' + self.table + ' SET data = ?, ttl = ?, date_saved = ? WHERE id = ?', [data, ttl, now, id], function(_, result) {}); }); var missedData = _.difference(_.keys(items), _.keys(cachedData)); _.each(missedData, function (id) { var data = JSON.stringify(items[id]); var query = 'INSERT INTO ' + self.table + ' VALUES (?, ?, ?, ?)'; - tx.executeSql(query, [id, data, ttl, now]); + tx.executeSql(query, [id, data, ttl, now], function(_, result) {}); }); }, function (err) { win.error('db.transaction()', err); @@ -112,7 +112,7 @@ var self = this; db.transaction(function (tx) { var query = 'DELETE FROM ' + self.table + ' WHERE ' + buildWhereIn(ids); - tx.executeSql(query, ids, function () {}); + tx.executeSql(query, ids, function(_, result) {}); }); }, @@ -122,7 +122,7 @@ return Q.Promise(function (resolve, reject) { db.transaction(function (tx) { var query = 'DELETE FROM ' + self.table; - tx.executeSql(query, function () {}); + tx.executeSql(query, [], function(_, result) {}); resolve(); }); }); diff --git a/src/app/lib/device/downloadonly.js b/src/app/lib/device/downloadonly.js new file mode 100644 index 00000000..ed4912ad --- /dev/null +++ b/src/app/lib/device/downloadonly.js @@ -0,0 +1,22 @@ +(function (App) { + + 'use strict'; + var collection = App.Device.Collection; + + var Downloadonly = App.Device.Generic.extend({ + stop: function () {}, + }); + + //if (this.model.get('google_video')) { + collection.add(new Downloadonly({ + id: 'downloadonly', + type: 'download', //icon + typeFamily: 'internal', + name: 'Download Only' + })); + //} + + +App.Device.Downloadonly = Downloadonly; + +})(window.App); diff --git a/src/app/lib/device/ext-player.js b/src/app/lib/device/ext-player.js index 1b33efb6..4663ca17 100644 --- a/src/app/lib/device/ext-player.js +++ b/src/app/lib/device/ext-player.js @@ -227,7 +227,13 @@ switches: '', subswitch: '', fs: '' - } + }, + 'WMPlayer': { + type: 'wmplayer', + switches: '', + subswitch: '', + fs: '/fullscreen' + }// wmplayer /fullscreen }; /* map name back into the object as we use it in match */ @@ -256,7 +262,31 @@ // win32 addPath(process.env.SystemDrive + '\\Program Files\\'); addPath(process.env.SystemDrive + '\\Program Files (x86)\\'); + + // win7+ + /* + "LOCALAPPDATA": "C:\\Users\\{username}\\AppData\\Local", + "ProgramData": "C:\\ProgramData", + "ProgramFiles": "C:\\Program Files", + "ProgramFiles(x86)": "C:\\Program Files (x86)", + "ProgramW6432": "C:\\Program Files", + "SystemDrive": "C:", + "SystemRoot": "C:\\WINDOWS", + */ + addPath(process.env.ProgramFiles); + + addPath(process.env.LOCALAPPDATA); + addPath(process.env.LOCALAPPDATA + '\\Programs'); addPath(process.env.LOCALAPPDATA + '\\Apps\\2.0\\'); + + /* + win.debug("SystemDrive:"+process.env.SystemDrive); + win.debug("LOCALAPPDATA:"+process.env.LOCALAPPDATA); + win.debug("HOMEPATH:"+process.env.HOMEPATH); + win.debug("HOME:"+process.env.HOME); + + win.debug(JSON.stringify(process.env)); + */ var folderName = ''; var birthtimes = {}; @@ -270,6 +300,7 @@ depth: 3 }); fileStream.on('data', function(d) { + var app = d.name.replace('.app', '').replace('.exe', '').toLowerCase(); var match = _.filter(players, function(v, k) { return k.toLowerCase() === app; diff --git a/src/app/lib/providers/opensubtitlesmovies.js b/src/app/lib/providers/opensubtitlesmovies.js index 1fa869f7..db7e3ed9 100644 --- a/src/app/lib/providers/opensubtitlesmovies.js +++ b/src/app/lib/providers/opensubtitlesmovies.js @@ -1,18 +1,27 @@ -(function (App) { +(function(App) { 'use strict'; var _ = require('underscore'); var request = require('request'); var Q = require('q'); var OpenSubtitlesApi = require('opensubtitles-api'); + + //Default non-authenicated login var OS = new OpenSubtitlesApi({ useragent: 'Popcorn Time v1' }); - var TTL = 1000 * 60 * 60 * 8; // 8 hours + var TTL = 1000 * 60 * 60 * 24; // 24 hours - var OpenSubtitlesMovies = function () { + var OpenSubtitlesMovies = function() { + win.debug('OpenSubtitles Init') App.Providers.CacheProvider.call(this, 'subtitle', TTL); + + //Login with Default Values + this.authenticated = false; + + this.authenticate(App.settings.opensubtitlesUsername,App.settings.opensubtitlesPassword); + }; OpenSubtitlesMovies.prototype = Object.create(App.Providers.CacheProvider.prototype); @@ -63,46 +72,142 @@ 'vietnamese': 'vi' }; - var querySubtitles = function (imdbIds) { - //win.debug(imdbIds); + OpenSubtitlesMovies.prototype.authenticate = function(username, password, callback) { + win.debug("Opensubtitles Authenicate") + + var deferred = Q.defer(); - if (_.isEmpty(imdbIds)) { - return {}; + //Login with Default Values + this.authenticated = false; + + if (username != "" || password != "") { + OS = new OpenSubtitlesApi({ + useragent: 'Popcorn Time v1', + username: username, + password: password, + ssl: true + }); + OS.login() + .then(res => { + //win.debug(res.token); + //win.debug(res.userinfo); + this.authenticated = true; + win.debug("OpenSubtitles API Login Successful"); + + ga('send', { + hitType: 'event', + eventCategory: 'OpenSubtitles', + eventAction: 'OpenSubtitles Login Successful', + eventLabel: 'OpenSubtitles Login Successful' + }); + + deferred.resolve(this.authenticated); + }) + .catch(err => { + win.error(err); + OS = new OpenSubtitlesApi({ + useragent: 'Popcorn Time v1' + }); + this.authenticated = false; + win.debug("OpenSubtitles API Login Unsuccessful"); + ga('send', { + hitType: 'event', + eventCategory: 'OpenSubtitles', + eventAction: 'OpenSubtitles Login Unsuccessful', + eventLabel: 'OpenSubtitles: '+err + }); + deferred.resolve(this.authenticated); + }); + + } else { + OS = new OpenSubtitlesApi({ + useragent: 'Popcorn Time v1' + }); + this.authenticated = false; + win.debug("OpenSubtitles API Login Unsuccessful"); + ga('send', { + hitType: 'event', + eventCategory: 'OpenSubtitles', + eventAction: 'OpenSubtitles Login Anonymous', + eventLabel: 'OpenSubtitles Login Anonymous' + }); + deferred.resolve(this.authenticated); } + return deferred.promise; + }; + OpenSubtitlesMovies.prototype.disconnect = function(callback) { + //reset API to non-authenicated user + OS = new OpenSubtitlesApi({ + useragent: 'Popcorn Time v1' + }); + this.authenticated = false; + win.debug("Opensubtitles API Logout"); + ga('send', { + hitType: 'event', + eventCategory: 'OpenSubtitles', + eventAction: 'OpenSubtitles Disconnect', + eventLabel: 'OpenSubtitles Disconnect' + }); + callback(); + }; + + var querySubtitles = function(imdbIds) { var deferred = Q.defer(); + if (_.isEmpty(imdbIds)) { + //subtitles is blank + deferred.resolve({}); + return deferred.promise; + } + + //win.debug("querySubtitles: " + imdbIds); + //Cycle through each imdbId then return the sublist //Search for imdbId + var i = _.size(imdbIds); + + if (i < 10) { + i = 0; + } + return Q.all( - _.map(imdbIds, function (id) { + _.map(imdbIds, function(id) { var deferred = Q.defer(); - - OS.search({ - imdbid: id, - gzip: false - }).then(subtitles => { - if (subtitles) { - deferred.resolve({ - [id]: subtitles - }); - } else { + setTimeout(function() { + //win.debug("Search Start: "+id); + OS.search({ + imdbid: id, + gzip: false + }).then(subtitles => { + //win.debug("OS:Subtitles: "+JSON.stringify(subtitles)); + if (subtitles) { + deferred.resolve({ + [id]: subtitles + }); + } else { + //subtitles is blank + deferred.resolve({}); + } + }).catch(err => { + win.error("OpenSubtitlesMovies API Error: "+id+" " + err); //subtitles is blank deferred.resolve({}); - } - }).catch(err => { - win.error("OpenSubtitles API Error: " + err); - deferred.resolve({}); - }); + }); + }, 400 * (i)); + //win.debug("Subtitle IMDB ID: " + id + " Time: "+300*i+"ms"); + if (i > 0) { + i = i - 1 + } return deferred.promise; })).then(data => { //Create subtitleList Array and return based on the input list var subtitleList = {}; subtitleList.subs = {}; - _.each(data, function (item) { + _.each(data, function(item) { for (var name in item) { - win.debug("Subtitle IMDB ID: " + name); + //win.debug("Subtitle IMDB ID: " + name); subtitleList.subs[name] = item[name]; } }); @@ -110,7 +215,7 @@ }); }; - var normalizeLangCodes = function (data) { + var normalizeLangCodes = function(data) { if ('pb' in data) { data['pt-br'] = data['pb']; delete data['pb']; @@ -118,20 +223,20 @@ return data; }; - var formatForPopcorn = function (data) { + var formatForPopcorn = function(data) { //win.debug("formatForPopcorn:data: " + JSON.stringify(data)); var allSubs = {}; // Iterate each movie - _.each(data.subs, function (langs, imdbId) { + _.each(data.subs, function(langs, imdbId) { var movieSubs = {}; langs = normalizeLangCodes(langs); // Iterate each language - _.each(langs, function (subs, lang) { + _.each(langs, function(subs, lang) { // Pick highest rated var langCode = lang; var ratedSub = _.max({ subs - }, function (s) { + }, function(s) { return s.score; }); movieSubs[langCode] = ratedSub.url; @@ -147,8 +252,8 @@ return Common.sanitize(allSubs); }; - OpenSubtitlesMovies.prototype.query = function (ids) { - return Q.when(querySubtitles(ids)).then(formatForPopcorn); + OpenSubtitlesMovies.prototype.query = function(ids) { + return querySubtitles(ids).then(formatForPopcorn); }; App.Providers.OpenSubtitlesMovies = OpenSubtitlesMovies; diff --git a/src/app/lib/streamer.js b/src/app/lib/streamer.js index 9eb3f0ae..1f48af94 100644 --- a/src/app/lib/streamer.js +++ b/src/app/lib/streamer.js @@ -1,11 +1,11 @@ -(function (App) { +(function(App) { 'use strict'; var STREAM_PORT = 21584; // 'PT'! //var BUFFERING_SIZE = 10 * 1024 * 1024; var BUFFERING_SIZE = Settings.bufferSize; - - var readTorrent = require('read-torrent'); + //var readTorrent = require('read-torrent'); + var parseTorrent = require('parse-torrent'); var peerflix = require('peerflix'); var webtorrent = require('webtorrent'); var path = require('path'); @@ -14,7 +14,7 @@ var engine = null; var preload_engine = null; var statsUpdater = null; - var active = function (wire) { + var active = function(wire) { return !wire.peerChoking; }; var subtitles = null; @@ -23,7 +23,7 @@ var subtitleDownloading = false; var serverStarting = false; - var watchState = function (stateModel) { + var watchState = function(stateModel) { if (engine !== null) { @@ -57,7 +57,7 @@ if (stateModel.get('streamInfo').get('torrent').defaultSubtitle && stateModel.get('streamInfo').get('torrent').defaultSubtitle !== 'none' && hasSubtitles && subtitles !== null && swarm.files[0] && !downloadedSubtitles && !subtitleDownloading) { subtitleDownloading = true; - swarm.files = _.sortBy(swarm.files, function (fl) { + swarm.files = _.sortBy(swarm.files, function(fl) { return fl.length; }); swarm.files.reverse(); @@ -75,7 +75,7 @@ } }; - var handleTorrent = function (torrent, stateModel) { + var handleTorrent = function(torrent, stateModel) { var tmpFilename = torrent.info.infoHash; tmpFilename = tmpFilename.replace(/([^a-zA-Z0-9-_])/g, '_'); // +'-'+ (new Date()*1); @@ -125,16 +125,16 @@ engine.piecesGot = 0; engine.cachedDownload = 0; - engineTorrent.on('warning', function (err) { + engineTorrent.on('warning', function(err) { win.warn(err); }); - engineTorrent.on('ready', function () { + engineTorrent.on('ready', function() { win.debug("torrent:ready"); App.vent.trigger('stream:server', stateModel); }); - engineTorrent.on('metadata', function () { + engineTorrent.on('metadata', function() { win.debug("torrent:metadata"); var streamInfo = stateModel.get('streamInfo'); @@ -149,7 +149,7 @@ if (streamInfo.get('file_index')) { size = this.files[streamInfo.get('file_index')].length; // torrent with multi-files } else { - this.files.forEach(function (file, index) { // pct torrent + this.files.forEach(function(file, index) { // pct torrent win.debug("file.length: " + file.length); size += file.length || 0; if (file.length >= maxSize) { @@ -180,7 +180,7 @@ stateModel.set('state', 'connecting'); watchState(stateModel); - App.vent.on('stream:server', function (stateModel) { + App.vent.on('stream:server', function(stateModel) { if (engine.server.listening == false && serverStarting == false) { win.debug("stream:server"); @@ -189,7 +189,7 @@ var ips = [], ifaces = require('os').networkInterfaces(); for (var dev in ifaces) { - ifaces[dev].forEach(function (details) { + ifaces[dev].forEach(function(details) { if (!details.internal) { ips.push(details.address); } @@ -212,11 +212,11 @@ }); // Supports both IPv4 and IPv6 comparison - var _sequentialPartsInCommon = function (ip1, ip2) { + var _sequentialPartsInCommon = function(ip1, ip2) { var separator = (ip1.indexOf('.') > -1) ? '.' : ':'; var ip2Parts = ip2.split(separator), partsCount = 0; - ip1.split(separator).every(function (ip1Part, idx) { + ip1.split(separator).every(function(ip1Part, idx) { var isEqual = (ip1Part === ip2Parts[idx]); if (isEqual) { ++partsCount; @@ -226,13 +226,13 @@ return partsCount; }; - var _getClosestIP = function (ips, targetIp) { - return _.max(ips, function (ip) { + var _getClosestIP = function(ips, targetIp) { + return _.max(ips, function(ip) { return _sequentialPartsInCommon(ip, targetIp); }); }; - var checkReady = function () { + var checkReady = function() { win.debug("engine:checkready"); if (stateModel.get('state') === 'ready') { if (stateModel.get('state') === 'ready' && stateModel.get('streamInfo').get('player') && stateModel.get('streamInfo').get('player').id !== 'local') { @@ -246,20 +246,20 @@ // clear downloaded so change:downloaded gets triggered for the first time streamInfo.set('downloaded', 0); - if (AdvSettings.get('chosenPlayer') != 'html5') { + if (AdvSettings.get('chosenPlayer') != 'html5' && AdvSettings.get('chosenPlayer') != 'downloadonly') { App.vent.trigger('stream:ready', streamInfo); stateModel.destroy(); } } }; - App.vent.on('subtitle:downloaded', function (sub) { + App.vent.on('subtitle:downloaded', function(sub) { if (sub) { stateModel.get('streamInfo').set('subFile', sub); App.vent.trigger('subtitle:convert', { path: sub, language: torrent.defaultSubtitle - }, function (err, res) { + }, function(err, res) { if (err) { win.error('error converting subtitles', err); stateModel.get('streamInfo').set('subFile', null); @@ -271,7 +271,7 @@ downloadedSubtitles = true; }); - engine.server.on('listening', function () { + engine.server.on('listening', function() { if (engine) { win.debug("engine:listening"); win.debug(`Server running at ` + engine.server.address().address + ":" + engine.server.address().port); @@ -294,14 +294,14 @@ }); - engine.on('uninterested', function () { + engine.on('uninterested', function() { if (engine) { engine.pause(); } }); - engine.on('interested', function () { + engine.on('interested', function() { if (engine) { engine.resume(); } @@ -311,7 +311,7 @@ var Preload = { - start: function (model) { + start: function(model) { if (Streamer.currentTorrent && model.get('torrent') === Streamer.currentTorrent.get('torrent')) { return; @@ -321,8 +321,8 @@ win.debug('Preloading model:', model.get('title')); var torrent_url = model.get('torrent'); - readTorrent(torrent_url, function (err, torrent) { - + //readTorrent(torrent_url, function (err, torrent) { + parseTorrent.remote(torrent_url, function(err, torrent) { win.debug('Preloading torrent:', torrent.name); var tmpFilename = torrent.infoHash; tmpFilename = tmpFilename.replace(/([^a-zA-Z0-9-_])/g, '_'); // +'-'+ (new Date()*1); @@ -348,7 +348,7 @@ }, - stop: function () { + stop: function() { if (preload_engine) { if (preload_engine.server._handle) { @@ -364,7 +364,7 @@ var Streamer = { - start: function (model) { + start: function(model) { var torrentUrl = model.get('torrent'); var torrent_read = false; if (model.get('torrent_read')) { @@ -386,7 +386,7 @@ this.stop_ = false; var that = this; - var doTorrent = function (err, torrent) { + var doTorrent = function(err, torrent) { // Return if streaming was cancelled while loading torrent if (that.stop_) { return; @@ -399,12 +399,12 @@ // did we need to extract subtitle ? var extractSubtitle = model.get('extract_subtitle'); - var getSubtitles = function (data) { + var getSubtitles = function(data) { win.debug('Subtitles data request:', data); var subtitleProvider = App.Config.getProvider('tvshowsubtitle'); - subtitleProvider.fetch(data).then(function (subs) { + subtitleProvider.fetch(data).then(function(subs) { if (subs && Object.keys(subs).length > 0) { subtitles = subs; win.info(Object.keys(subs).length + ' subtitles found'); @@ -415,7 +415,7 @@ win.warn('No subtitles returned'); } hasSubtitles = true; - }).catch(function (err) { + }).catch(function(err) { subtitles = null; hasSubtitles = true; downloadedSubtitles = true; @@ -423,7 +423,7 @@ }); }; - var handleTorrent_fnc = function () { + var handleTorrent_fnc = function() { // TODO: We should passe the movie / tvshow imdbid instead // and read from the player // so from there we can use the previous next etc @@ -483,7 +483,7 @@ } } if (torrent.files && torrent.files.length > 0 && !model.get('file_index') && model.get('file_index') !== 0) { - torrent.files = $.grep(torrent.files, function (n) { + torrent.files = $.grep(torrent.files, function(n) { return (n); }); var fileModel = new Backbone.Model({ @@ -500,7 +500,7 @@ torrentMetadata = torrent.info.name.toString(); } Common.matchTorrent(torrent.name, torrentMetadata) - .then(function (res) { + .then(function(res) { if (res.error) { win.warn(res.error); sub_data.filename = res.filename; @@ -509,34 +509,34 @@ handleTorrent_fnc(); } else { switch (res.type) { - case 'movie': - $('.loading-background').css('background-image', 'url(' + res.movie.image + ')'); - sub_data.imdbid = res.movie.imdbid; - model.set('quality', res.quality); - model.set('imdb_id', sub_data.imdbid); - title = res.movie.title; - break; - case 'episode': - $('.loading-background').css('background-image', 'url(' + res.show.episode.image + ')'); - sub_data.imdbid = res.show.imdbid; - sub_data.season = res.show.episode.season; - sub_data.episode = res.show.episode.episode; - model.set('quality', res.quality); - model.set('tvdb_id', res.show.tvdbid); - model.set('episode_id', res.show.episode.tvdbid); - model.set('imdb_id', res.show.imdbid); - model.set('episode', sub_data.episode); - model.set('season', sub_data.season); - title = res.show.title + ' - ' + i18n.__('Season %s', res.show.episode.season) + ', ' + i18n.__('Episode %s', res.show.episode.episode) + ' - ' + res.show.episode.title; - break; - default: - sub_data.filename = res.filename; + case 'movie': + $('.loading-background').css('background-image', 'url(' + res.movie.image + ')'); + sub_data.imdbid = res.movie.imdbid; + model.set('quality', res.quality); + model.set('imdb_id', sub_data.imdbid); + title = res.movie.title; + break; + case 'episode': + $('.loading-background').css('background-image', 'url(' + res.show.episode.image + ')'); + sub_data.imdbid = res.show.imdbid; + sub_data.season = res.show.episode.season; + sub_data.episode = res.show.episode.episode; + model.set('quality', res.quality); + model.set('tvdb_id', res.show.tvdbid); + model.set('episode_id', res.show.episode.tvdbid); + model.set('imdb_id', res.show.imdbid); + model.set('episode', sub_data.episode); + model.set('season', sub_data.season); + title = res.show.title + ' - ' + i18n.__('Season %s', res.show.episode.season) + ', ' + i18n.__('Episode %s', res.show.episode.episode) + ' - ' + res.show.episode.title; + break; + default: + sub_data.filename = res.filename; } getSubtitles(sub_data); handleTorrent_fnc(); } }) - .catch(function (err) { + .catch(function(err) { title = $.trim(torrent.name.replace('[rartv]', '').replace('[PublicHD]', '').replace('[ettv]', '').replace('[eztv]', '')).replace(/[\s]/g, '.'); sub_data.filename = title; win.error('An error occured while trying to get metadata and subtitles', err); @@ -557,10 +557,11 @@ // HACK(xaiki): we need to go through parse torrent // if we have a torrent and not an http source, this // is fragile as shit. - if (typeof (torrentUrl) === 'string' && torrentUrl.substring(0, 7) === 'http://' && !torrentUrl.match('\\.torrent') && !torrentUrl.match('\\.php?')) { + if (typeof(torrentUrl) === 'string' && torrentUrl.substring(0, 7) === 'http://' && !torrentUrl.match('\\.torrent') && !torrentUrl.match('\\.php?')) { return Streamer.startStream(model, torrentUrl, stateModel); } else if (!torrent_read) { - readTorrent(torrentUrl, doTorrent); //preload torrent + //readTorrent(torrentUrl, doTorrent); //preload torrent + parseTorrent.remote(torrentUrl, doTorrent); } else { doTorrent(null, model.get('torrent')); //normal torrent } @@ -569,7 +570,7 @@ }, - startStream: function (model, url, stateModel) { + startStream: function(model, url, stateModel) { var si = new App.Model.StreamInfo({}); si.set('title', url); si.set('subtitle', {}); @@ -583,7 +584,7 @@ App.vent.trigger('stream:ready', si); }, - stop: function () { + stop: function() { this.stop_ = true; if (engine) { // update ratio diff --git a/src/app/lib/subtitle/generic.js b/src/app/lib/subtitle/generic.js index 8848fda5..d8671c51 100644 --- a/src/app/lib/subtitle/generic.js +++ b/src/app/lib/subtitle/generic.js @@ -79,6 +79,7 @@ //Download URL from Butter Project var downloadFromUrl = function(data) { + win.debug("downloadfromUrl"); return new Promise(function(resolve, reject) { var vpath = data.path; // video file path var vext = path.extname(vpath); // video extension @@ -132,6 +133,7 @@ } else if (fgz) { require('zlib').unzip(fs.readFileSync(fpath + ext), (error, buffer) => { if (error) { + win.error(error); reject(error); } else { var charset = charsetDetect.detect(buffer); @@ -189,7 +191,7 @@ download: function(data) { if (data.path && data.url) { win.debug('Subtitles download url:', data.url); - console.log('save subtitles to AdvSettings ' + data.url); + win.debug('Save subtitles to AdvSettings ' + data.url); AdvSettings.set('LastSubtitle', data.url); var fileFolder = path.dirname(data.path); diff --git a/src/app/lib/views/player/player.js b/src/app/lib/views/player/player.js index 4cf229d9..48d35b2e 100644 --- a/src/app/lib/views/player/player.js +++ b/src/app/lib/views/player/player.js @@ -630,7 +630,7 @@ // multimedia keys // Change when mousetrap can be extended - $('body').bind('keydown', function (e) { + $('body').on('keydown', function (e) { if (e.keyCode === 179) { $('.vjs-play-control').click(); } else if (e.keyCode === 177) { @@ -712,7 +712,7 @@ // multimedia keys // Change when mousetrap can be extended - $('body').unbind('keydown'); + $('body').off('keydown'); document.removeEventListener('mousewheel', _this.mouseScroll); }, diff --git a/src/app/lib/views/register.js b/src/app/lib/views/register.js index 36a9960c..4678a05f 100644 --- a/src/app/lib/views/register.js +++ b/src/app/lib/views/register.js @@ -36,6 +36,7 @@ switch (field.attr('name')) { case 'rememberRegister': + break; //case 'chosenPlayer': //AdvSettings.set('chosenPlayer', 'html5'); default: @@ -52,7 +53,7 @@ value: value }); - that.syncSetting(field.attr('name'), value); + this.syncSetting(field.attr('name'), value); }, syncSetting: function (setting, value) { diff --git a/src/app/lib/views/settings_container.js b/src/app/lib/views/settings_container.js index b1abad47..d85560e9 100644 --- a/src/app/lib/views/settings_container.js +++ b/src/app/lib/views/settings_container.js @@ -36,6 +36,8 @@ 'click #unauthTrakt': 'disconnectTrakt', 'click #connect-with-tvst': 'connectWithTvst', 'click #disconnect-tvst': 'disconnectTvst', + 'click .connect-opensubtitles': 'connectWithOpensubtitles', + 'click #disconnect-opensubtitles': 'disconnectOpenSubtitles', 'click .reset-ytsAPI': 'resetMovieAPI', 'click .reset-tvAPI': 'resetTVShowAPI', 'change #tmpLocation': 'updateCacheDirectory', @@ -131,13 +133,14 @@ resetMovieAPI: function() { var value = [{ - url: 'http://yts.am/', - strictSSL: true - }, - { - url: 'https://yts.ag/', - strictSSL: true - }]; + url: 'http://yts.am/', + strictSSL: true + }, + { + url: 'https://yts.ag/', + strictSSL: true + } + ]; App.settings['ytsAPI'] = value; //save to db App.db.writeSetting({ @@ -152,14 +155,11 @@ resetTVShowAPI: function() { var value = [{ - url: 'https://popcorntime.ws/api/eztv/', + url: 'https://api-fetch.website/tv/', strictSSL: true }, { url: 'http://eztvapi.ml/', strictSSL: true - }, { - url: 'https://popcornwvnbg7jev.onion.to/', - strictSSL: true }]; App.settings['tvAPI'] = value; //save to db @@ -237,6 +237,12 @@ strictSSL: value.substr(0, 8) === 'https://' }]; break; + case 'opensubtitlesUsername': + value = field.val(); + break; + case 'opensubtitlesPassword': + value = field.val(); //require('crypto').createHash('md5').update(field.val()).digest('hex'); + break; case 'subtitle_size': case 'stream_browser': if ($('option:selected', field).val() === 'Torrent Link') { @@ -257,7 +263,7 @@ if ($('option:selected', field).val() === 'Last Open') { AdvSettings.set('lastTab', App.currentview); } - /* falls through */ + /* falls through */ case 'watchedCovers': case 'theme': value = $('option:selected', field).val(); @@ -278,17 +284,18 @@ case 'automaticUpdating': case 'events': case 'alwaysFullscreen': + case 'showPassword': case 'minimizeToTray': case 'bigPicture': - case 'analytics': - value = field.is(':checked'); - window['ga-disable-' + AdvSettings.get('gaCode')] = !value; - break; case 'activateTorrentCollection': case 'activateAutoplay': case 'activateRandomize': value = field.is(':checked'); break; + case 'analytics': + value = field.is(':checked'); + window['ga-disable-' + AdvSettings.get('gaCode')] = !value; + break; case 'httpApiUsername': case 'httpApiPassword': apiDataChanged = true; @@ -311,8 +318,11 @@ default: win.warn('Setting not defined: ' + field.attr('name')); } - win.info('Setting changed: ' + field.attr('name') + ' - ' + value); + if (field.attr('name') != 'opensubtitlesPassword') { + win.info('Setting changed: ' + field.attr('name') + ' - ' + value); + } else + win.info('Setting changed: ' + field.attr('name')); // update active session App.settings[field.attr('name')] = value; @@ -323,7 +333,7 @@ // move tmp folder safely if (tmpLocationChanged) { - that.moveTmpLocation(value); + value = that.moveTmpLocation(value); } //save to db @@ -394,6 +404,7 @@ case 'movies_quality': case 'translateSynopsis': App.Providers.delete('Yts'); + opensubtitlesPassword App.vent.trigger('movies:list'); App.vent.trigger('settings:show'); break; @@ -407,6 +418,10 @@ App.vent.trigger('movies:list'); App.vent.trigger('settings:show'); break; + case 'opensubtitles': + App.vent.trigger('movies:list'); + App.vent.trigger('settings:show'); + break; case 'bigPicture': if (!ScreenResolution.SD) { if (App.settings.bigPicture) { @@ -424,6 +439,16 @@ $('.notification_alert').show().text(i18n.__('Big Picture Mode is unavailable on your current screen resolution')).delay(2500).fadeOut(400); } break; + case 'showPassword': + { + var x = document.getElementById("opensubtitlesPassword"); + if (x.type === "password") { + x.type = "text"; + } else { + x.type = "password"; + } + } + break; default: } }, @@ -516,9 +541,86 @@ disconnectTvst: function() { var self = this; - App.TVShowTime.disconnect(function() { + App.OpenSubtitlesMovies.disconnect(function() { + self.render(); + }); + }, + + connectWithOpensubtitles: function() { + + $('.loading-spinner').show(); + + var username = App.settings.opensubtitlesUsername; + var password = require('crypto').createHash('md5').update(App.settings.opensubtitlesPassword).digest('hex'); + + App.OpenSubtitlesMovies.authenticate(username, password).then(function(value) { + if (value == false) { + that.alertMessageFailed(i18n.__("Incorrect Username or Password")); + } + ga('send', { + hitType: 'event', + eventCategory: 'Settings', + eventAction: 'OpenSubtitles Login Incorrect', + eventLabel: 'OpenSubtitles Login Incorrect' + }); + return value; + }).then(function(value) { + if (value == true) { + App.db.writeSetting({ + key: 'opensubtitlesUsername', + value: username + }).then(function() { + return App.db.writeSetting({ + key: 'opensubtitlesPassword', + value: password + }); + }); + that.ui.success_alert.show().delay(3000).fadeOut(400); + that.syncSetting('opensubtitles', ""); + //GA: Player Launched + ga('send', { + hitType: 'event', + eventCategory: 'Settings', + eventAction: 'OpenSubtitles Login Successful', + eventLabel: 'OpenSubtitles Login Successful' + }); + self.render(); + } + }); + }, + + disconnectOpenSubtitles: function(e) { + var self = this; + + App.settings['opensubtitlesUsername'] = ''; + App.settings['opensubtitlesPassword'] = ''; + + App.db.writeSetting({ + key: 'opensubtitlesUsername', + value: '' + }).then(function() { + return App.db.writeSetting({ + key: 'opensubtitlesPassword', + value: '' + }); + }).then(function() { + that.ui.success_alert.show().delay(3000).fadeOut(400); + that.syncSetting('opensubtitles', ""); + }); + + //GA: Player Launched + ga('send', { + hitType: 'event', + eventCategory: 'Settings', + eventAction: 'OpenSubtitles Disconnect', + eventLabel: 'OpenSubtitles Disconnect' + }); + + App.OpenSubtitlesMovies.disconnect(function() { self.render(); }); + + }, flushBookmarks: function(e) { @@ -600,17 +702,32 @@ }, moveTmpLocation: function(location) { - if (!fs.existsSync(location)) { - fs.mkdir(location); - } - if (App.settings['deleteTmpOnClose']) { - deleteFolder(oldTmpLocation); - } else { - $('.notification_alert').show().text(i18n.__('You should save the content of the old directory, then delete it')).delay(5000).fadeOut(400); - gui.Shell.openItem(oldTmpLocation); + try { + if (!fs.existsSync(location)) { + fs.mkdirSync(location); + } + if (App.settings['deleteTmpOnClose']) { + deleteFolder(oldTmpLocation); + } else { + $('.notification_alert').show().text(i18n.__('You should save the content of the old directory, then delete it')).delay(5000).fadeOut(400); + gui.Shell.openItem(oldTmpLocation); + } + return location; + } catch (err) { + if (err.code !== 'EEXIST'){ + $('.notification_alert').show().text(i18n.__('Unable to create new Download directory')).delay(5000).fadeOut(400); + return this.resetTmpLocation(); + } } }, + resetTmpLocation: function(){ + var value = path.join(os.tmpDir(), 'Popcorn-Time'); + $('#tmpLocation').val(value); + this.render(); + return value; + }, + openDatabaseFolder: function() { win.debug('Opening: ' + App.settings['databaseLocation']); gui.Shell.openItem(App.settings['databaseLocation']); @@ -655,7 +772,7 @@ areYouSure: function(btn, waitDesc) { if (!btn.hasClass('confirm')) { - btn.addClass('confirm warning').css('width', btn.css('width')).text(i18n.__('Are you sure?')); + btn.addClass('confirm warning').text(i18n.__('Are you sure?')); return false; } btn.text(waitDesc).addClass('disabled').prop('disabled', true); diff --git a/src/app/settings.js b/src/app/settings.js index 41e3af2f..3ea70c09 100644 --- a/src/app/settings.js +++ b/src/app/settings.js @@ -67,8 +67,8 @@ Settings.traktPlayback = true; Settings.tvstAccessToken = ''; // Advanced options -Settings.connectionLimit = 200; -Settings.dhtLimit = 500; +Settings.connectionLimit = 100; +Settings.dhtLimit = 50; Settings.streamPort = 0; // 0 = Random Settings.tmpLocation = path.join(os.tmpDir(), 'Popcorn-Time'); Settings.databaseLocation = path.join(data_path, 'data'); @@ -107,19 +107,20 @@ Settings.vpn = false; Settings.vpnUsername = ''; Settings.vpnPassword = ''; -// OpenSubtitles Login +// OpenSubtitles Settings.opensubtitles = true; -Settings.opsUsername = ''; -Settings.opsPassword = ''; +Settings.opensubtitlesAutoUpload = true; +Settings.opensubtitlesAuthenticated = false; +Settings.opensubtitlesUsername = ""; +Settings.opensubtitlesPassword = ""; Settings.tvAPI = [{ - url: 'https://eztvapi.ml/', + url: 'https://api-fetch.website/tv/', strictSSL: true }, { - url: 'https://api-fetch.website/tv/', + url: 'http://eztvapi.ml/', strictSSL: true -} -]; +}]; Settings.ytsAPI = [{ url: 'http://yts.am/', @@ -127,8 +128,7 @@ Settings.ytsAPI = [{ }, { url: 'http://yts.ag/', strictSSL: true -} -]; +}]; Settings.updateEndpoint = { url: 'http://popcorntime.ag/', @@ -146,17 +146,17 @@ Settings.trackersList = ['https://raw.githubusercontent.com/ngosang/trackerslist Settings.trackers = [ 'udp://glotorrents.pw:6969/announce', - 'udp://tracker.coppersurfer.tk:6969/announce', - 'udp://tracker.leechers-paradise.org:6969/announce', - 'udp://tracker.internetwarriors.net:1337/announce', - 'udp://tracker.openbittorrent.com:80/announce', - 'udp://p4p.arenabg.ch:1337/announce', + 'udp://tracker.coppersurfer.tk:6969', + 'udp://tracker.leechers-paradise.org:6969', + 'udp://tracker.internetwarriors.net:1337', + 'udp://tracker.openbittorrent.com:80', + 'udp://p4p.arenabg.ch:1337', 'udp://open.demonii.com:1337/announce', 'udp://tracker.opentrackr.org:1337/announce', 'udp://torrent.gresille.org:80/announce', 'udp://public.popcorn-tracker.org:6969/announce', - 'udp://9.rarbg.com:2710/announce', - 'udp://p4p.arenabg.com:1337' + 'udp://9.rarbg.me:2710/announce', + 'udp://p4p.arenabg.com:1337', ]; // App Settings @@ -212,9 +212,9 @@ var AdvSettings = { set: function(variable, newValue) { Database.writeSetting({ - key: variable, - value: newValue - }) + key: variable, + value: newValue + }) .then(function() { Settings[variable] = newValue; }); @@ -381,8 +381,8 @@ var AdvSettings = { var cacheDb = openDatabase('cachedb', '', 'Cache database', 50 * 1024 * 1024); cacheDb.transaction(function(tx) { - tx.executeSql('DELETE FROM subtitle'); - tx.executeSql('DELETE FROM metadata'); + tx.executeSql('DELETE FROM subtitle',[], function(_, result) {}); + tx.executeSql('DELETE FROM metadata',[], function(_, result) {}); }); // Add an upgrade flag diff --git a/src/app/templates/about.tpl b/src/app/templates/about.tpl index ec64f345..83f9b32f 100644 --- a/src/app/templates/about.tpl +++ b/src/app/templates/about.tpl @@ -19,7 +19,8 @@
<%= i18n.__("Popcorn Time! is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.") %>
- <%= i18n.__("We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.") %> + <%= i18n.__("We are an open source project. We are from all over the world. We love our movies. And boy, do we love popcorn.") %>
+ <%= i18n.__("Subtitles are provided by")%> opensubtitles.org.
diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index 52ca074c..56b0c510 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -120,7 +120,7 @@ -
+
<%= i18n.__("Subtitles") %>
@@ -143,7 +143,6 @@ - - - -
-

<%= i18n.__("Color") %>

- - - - - - - - - +

<%= i18n.__("Color") %>

+ + + + + + + + +
- + <% if (App.OpenSubtitlesMovies.authenticated) { %> + + <%= i18n.__("You are currently connected to %s", "Opensubtitles.org") %>. + <%= i18n.__("Disconnect account") %> + + <% } else { %> + + <%= i18n.__("Create an account at")%> <%= i18n.__("www.opensubtitles.org") %> + + +    + + + +    + + + + + + + +
+
+    + <%= i18n.__("Connect To %s", "OpenSubtitles.org") %> +
+ +
+ <% } %>
@@ -521,6 +546,7 @@
+
<%= i18n.__("Miscellaneous") %> diff --git a/src/app/vendor/jquery/dist/jquery.js b/src/app/vendor/jquery/dist/jquery.js deleted file mode 100644 index eed17778..00000000 --- a/src/app/vendor/jquery/dist/jquery.js +++ /dev/null @@ -1,9210 +0,0 @@ -/*! - * jQuery JavaScript Library v2.1.4 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2015-04-28T16:01Z - */ - -(function( global, factory ) { - - if ( typeof module === "object" && typeof module.exports === "object" ) { - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Support: Firefox 18+ -// Can't be in strict mode, several libs including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// - -var arr = []; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var support = {}; - - - -var - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - - version = "2.1.4", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android<4.1 - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return all the elements in a clean array - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - // adding 1 corrects loss of precision from parseFloat (#15100) - return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; - }, - - isPlainObject: function( obj ) { - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.constructor && - !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { - return false; - } - - // If the function hasn't returned already, we're confident that - // |obj| is a plain object, created by {} or constructed with new Object - return true; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - // Support: Android<4.0, iOS<6 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call(obj) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf("use strict") === 1 ) { - script = document.createElement("script"); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE9-11+ - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - // Support: Android<4.1 - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - - // Support: iOS 8.2 (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.2.0-pre - * http://sizzlejs.com/ - * - * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2014-12-16 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // http://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + characterEncoding + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - nodeType = context.nodeType; - - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - if ( !seed && documentIsHTML ) { - - // Try to shortcut find operations when possible (e.g., not under DocumentFragment) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document (jQuery #6963) - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType !== 1 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, parent, - doc = node ? node.ownerDocument || node : preferredDoc; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - parent = doc.defaultView; - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent !== parent.top ) { - // IE11 does not have attachEvent, so all must suffer - if ( parent.addEventListener ) { - parent.addEventListener( "unload", unloadHandler, false ); - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", unloadHandler ); - } - } - - /* Support tests - ---------------------------------------------------------------------- */ - documentIsHTML = !isXML( doc ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [ m ] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - docElem.appendChild( div ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ - if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibing-combinator selector` fails - if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( div ) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (oldCache = outerCache[ dir ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - outerCache[ dir ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context !== document && context; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is no seed and only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; - }); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); -}; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - len = this.length, - ret = [], - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -}); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function( selector, context ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Support: Blackberry 4.6 - // gEBID returns nodes no longer in the document (#6963) - if ( elem && elem.parentNode ) { - // Inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return typeof rootjQuery.ready !== "undefined" ? - rootjQuery.ready( selector ) : - // Execute immediately if ready is not present - selector( jQuery ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.extend({ - dir: function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }, - - sibling: function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - } -}); - -jQuery.fn.extend({ - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter(function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.unique( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.unique( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -}); -var rnotwhite = (/\S+/g); - - - -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // Add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // If we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); - - -// The deferred used on DOM ready -var readyList; - -jQuery.fn.ready = function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; -}; - -jQuery.extend({ - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.triggerHandler ) { - jQuery( document ).triggerHandler( "ready" ); - jQuery( document ).off( "ready" ); - } - } -}); - -/** - * The ready event handler and self cleanup method - */ -function completed() { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - jQuery.ready(); -} - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // We once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - } - } - return readyList.promise( obj ); -}; - -// Kick off the DOM ready check even if the user does not -jQuery.ready.promise(); - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - len ? fn( elems[0], key ) : emptyGet; -}; - - -/** - * Determines whether an object can have data - */ -jQuery.acceptData = function( owner ) { - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - /* jshint -W018 */ - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - -function Data() { - // Support: Android<4, - // Old WebKit does not have Object.preventExtensions/freeze method, - // return new empty object instead with no [[set]] accessor - Object.defineProperty( this.cache = {}, 0, { - get: function() { - return {}; - } - }); - - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; -Data.accepts = jQuery.acceptData; - -Data.prototype = { - key: function( owner ) { - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return the key for a frozen object. - if ( !Data.accepts( owner ) ) { - return 0; - } - - var descriptor = {}, - // Check if the owner object already has a cache key - unlock = owner[ this.expando ]; - - // If not, create one - if ( !unlock ) { - unlock = Data.uid++; - - // Secure it in a non-enumerable, non-writable property - try { - descriptor[ this.expando ] = { value: unlock }; - Object.defineProperties( owner, descriptor ); - - // Support: Android<4 - // Fallback to a less secure definition - } catch ( e ) { - descriptor[ this.expando ] = unlock; - jQuery.extend( owner, descriptor ); - } - } - - // Ensure the cache object - if ( !this.cache[ unlock ] ) { - this.cache[ unlock ] = {}; - } - - return unlock; - }, - set: function( owner, data, value ) { - var prop, - // There may be an unlock assigned to this node, - // if there is no entry for this "owner", create one inline - // and set the unlock as though an owner entry had always existed - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - // Fresh assignments by object are shallow copied - if ( jQuery.isEmptyObject( cache ) ) { - jQuery.extend( this.cache[ unlock ], data ); - // Otherwise, copy the properties one-by-one to the cache object - } else { - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - } - return cache; - }, - get: function( owner, key ) { - // Either a valid cache is found, or will be created. - // New caches will be created and the unlock returned, - // allowing direct access to the newly created - // empty data object. A valid owner object must be provided. - var cache = this.cache[ this.key( owner ) ]; - - return key === undefined ? - cache : cache[ key ]; - }, - access: function( owner, key, value ) { - var stored; - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ((key && typeof key === "string") && value === undefined) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase(key) ); - } - - // [*]When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - if ( key === undefined ) { - this.cache[ unlock ] = {}; - - } else { - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( rnotwhite ) || [] ); - } - } - - i = name.length; - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - }, - hasData: function( owner ) { - return !jQuery.isEmptyObject( - this.cache[ owner[ this.expando ] ] || {} - ); - }, - discard: function( owner ) { - if ( owner[ this.expando ] ) { - delete this.cache[ owner[ this.expando ] ]; - } - } -}; -var data_priv = new Data(); - -var data_user = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - data_user.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend({ - hasData: function( elem ) { - return data_user.hasData( elem ) || data_priv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return data_user.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - data_user.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to data_priv methods, these can be deprecated. - _data: function( elem, name, data ) { - return data_priv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - data_priv.remove( elem, name ); - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = data_user.get( elem ); - - if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE11+ - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - data_priv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - data_user.set( this, key ); - }); - } - - return access( this, function( value ) { - var data, - camelKey = jQuery.camelCase( key ); - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - // Attempt to get data from the cache - // with the key as-is - data = data_user.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to get data from the cache - // with the key camelized - data = data_user.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each(function() { - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = data_user.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - data_user.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf("-") !== -1 && data !== undefined ) { - data_user.set( this, key, value ); - } - }); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each(function() { - data_user.remove( this, key ); - }); - } -}); - - -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = data_priv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = data_priv.access( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return data_priv.get( elem, key ) || data_priv.access( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - data_priv.remove( elem, [ type + "queue", key ] ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = data_priv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHidden = function( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); - }; - -var rcheckableType = (/^(?:checkbox|radio)$/i); - - - -(function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Safari<=5.1 - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Safari<=5.1, Android<4.2 - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<=11+ - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -})(); -var strundefined = typeof undefined; - - - -support.focusinBubbles = "onfocusin" in window; - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.hasData( elem ) && data_priv.get( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - data_priv.remove( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && jQuery.acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.disabled !== true || event.type !== "click" ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome<28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } -}; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - // Support: Android<4.0 - src.returnValue === false ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && e.preventDefault ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && e.stopPropagation ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && e.stopImmediatePropagation ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// Support: Chrome 15+ -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// Support: Firefox, Chrome, Safari -// Create "bubbling" focus and blur events -if ( !support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - data_priv.remove( doc, fix ); - - } else { - data_priv.access( doc, fix, attaches ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); - - -var - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rhtml = /<|&#?\w+;/, - rnoInnerhtml = /<(?:script|style|link)/i, - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /^$|\/(?:java|ecma)script/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - - // Support: IE9 - option: [ 1, "" ], - - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] - }; - -// Support: IE9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: 1.x compatibility -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute("type"); - } - - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - data_priv.set( - elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) - ); - } -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( data_priv.hasData( src ) ) { - pdataOld = data_priv.access( src ); - pdataCur = data_priv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( data_user.hasData( src ) ) { - udataOld = data_user.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - data_user.set( dest, udataCur ); - } -} - -function getAll( context, tag ) { - var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : - context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - // Support: QtWebKit, PhantomJS - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: QtWebKit, PhantomJS - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - }, - - cleanData: function( elems ) { - var data, elem, type, key, - special = jQuery.event.special, - i = 0; - - for ( ; (elem = elems[ i ]) !== undefined; i++ ) { - if ( jQuery.acceptData( elem ) ) { - key = elem[ data_priv.expando ]; - - if ( key && (data = data_priv.cache[ key ]) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - if ( data_priv.cache[ key ] ) { - // Discard any remaining `private` data - delete data_priv.cache[ key ]; - } - } - } - // Discard any remaining `user` data - delete data_user.cache[ elem[ data_user.expando ] ]; - } - } -}); - -jQuery.fn.extend({ - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each(function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - }); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - remove: function( selector, keepData /* Internal Use Only */ ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map(function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var arg = arguments[ 0 ]; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - arg = this.parentNode; - - jQuery.cleanData( getAll( this ) ); - - if ( arg ) { - arg.replaceChild( elem, this ); - } - }); - - // Force removal if there was no new content (e.g., from empty arguments) - return arg && (arg.length || arg.nodeType) ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - self.domManip( args, callback ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - // Support: QtWebKit - // jQuery.merge because push.apply(_, arraylike) throws - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return this; - } -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because push.apply(_, arraylike) throws - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - - -var iframe, - elemdisplay = {}; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var style, - elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - // getDefaultComputedStyle might be reliably used only on attached element - display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? - - // Use of this method is a temporary fix (more like optimization) until something better comes along, - // since it was removed from specification and supported only in FF - style.display : jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = (iframe || jQuery( "