diff --git a/.eslintignore b/.eslintignore index 8e3aee83fb..74b18ddcf6 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,4 +2,3 @@ node_modules dist .idea .vscode -src/libraries diff --git a/.eslintrc.js b/.eslintrc.js index 98fa2b817f..7de812ea6e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,5 @@ +const restrictedGlobals = require('confusing-browser-globals'); + module.exports = { root: true, plugins: [ @@ -29,7 +31,7 @@ module.exports = { ], rules: { 'block-spacing': ['error'], - 'brace-style': ['error', "1tbs", { "allowSingleLine": true }], + 'brace-style': ['error', '1tbs', { 'allowSingleLine': true }], 'comma-dangle': ['error', 'never'], 'comma-spacing': ['error'], 'eol-last': ['error'], @@ -39,13 +41,15 @@ module.exports = { 'no-floating-decimal': ['error'], 'no-multi-spaces': ['error'], 'no-multiple-empty-lines': ['error', { 'max': 1 }], + 'no-restricted-globals': ['error'].concat(restrictedGlobals), 'no-trailing-spaces': ['error'], - 'no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], - "no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }], + '@babel/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], + //'no-unused-vars': ['error', { 'vars': 'all', 'args': 'none', 'ignoreRestSiblings': true }], 'one-var': ['error', 'never'], 'padded-blocks': ['error', 'never'], + //'prefer-const': ['error', {'destructuring': 'all'}], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], - 'semi': ['error'], + '@babel/semi': ['error'], 'space-before-blocks': ['error'], 'space-infix-ops': 'error', 'yoda': 'error' @@ -105,6 +109,7 @@ module.exports = { // TODO: Fix warnings and remove these rules 'no-redeclare': ['off'], 'no-useless-escape': ['off'], + 'no-unused-vars': ['off'], // TODO: Remove after ES6 migration is complete 'import/no-unresolved': ['off'] }, diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index c51cd6b31f..46c40b6c99 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -35,6 +35,7 @@ - [Thibault Nocchi](https://github.com/ThibaultNocchi) - [MrTimscampi](https://github.com/MrTimscampi) - [Sarab Singh](https://github.com/sarab97) + - [GuilhermeHideki](https://github.com/GuilhermeHideki) - [Andrei Oanca](https://github.com/OancaAndrei) - [Cromefire_](https://github.com/cromefire) diff --git a/package.json b/package.json index b91d1004f6..39c7937bd7 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "^7.11.0", - "@babel/eslint-parser": "^7.11.0", - "@babel/eslint-plugin": "^7.11.0", + "@babel/core": "^7.11.4", + "@babel/eslint-parser": "^7.11.4", + "@babel/eslint-plugin": "^7.11.3", "@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-private-methods": "^7.10.1", "@babel/plugin-transform-modules-amd": "^7.10.5", @@ -16,11 +16,12 @@ "autoprefixer": "^9.8.6", "babel-loader": "^8.0.6", "browser-sync": "^2.26.12", + "confusing-browser-globals": "^1.0.9", "copy-webpack-plugin": "^5.1.1", - "css-loader": "^4.2.0", + "css-loader": "^4.2.2", "cssnano": "^4.1.10", "del": "^5.1.0", - "eslint": "^6.8.0", + "eslint": "^7.7.0", "eslint-plugin-compat": "^3.5.1", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-import": "^2.21.2", @@ -38,7 +39,7 @@ "gulp-postcss": "^8.0.0", "gulp-sass": "^4.0.2", "gulp-sourcemaps": "^2.6.5", - "gulp-terser": "^1.2.1", + "gulp-terser": "^1.4.0", "html-webpack-plugin": "^4.3.0", "lazypipe": "^1.0.2", "node-sass": "^4.13.1", @@ -51,19 +52,19 @@ "stylelint-order": "^4.1.0", "webpack": "^4.44.1", "webpack-merge": "^4.2.2", - "webpack-stream": "^5.2.1" + "webpack-stream": "^6.0.0" }, "dependencies": { "alameda": "^1.4.0", "blurhash": "^1.1.3", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "core-js": "^3.6.5", - "date-fns": "^2.15.0", + "date-fns": "^2.16.0", "epubjs": "^0.3.85", "fast-text-encoding": "^1.0.3", "flv.js": "^1.5.0", "headroom.js": "^0.11.0", - "hls.js": "^0.14.7", + "hls.js": "^0.14.10", "howler": "^2.2.0", "intersection-observer": "^0.11.0", "jellyfin-apiclient": "^1.4.1", @@ -80,7 +81,7 @@ "sortablejs": "^1.10.2", "swiper": "^6.1.1", "webcomponents.js": "^0.7.24", - "whatwg-fetch": "^3.2.0" + "whatwg-fetch": "^3.4.0" }, "babel": { "presets": [ @@ -95,6 +96,8 @@ "src/components/alert.js", "src/components/alphaPicker/alphaPicker.js", "src/components/appFooter/appFooter.js", + "src/components/apphost.js", + "src/components/appRouter.js", "src/components/autoFocuser.js", "src/components/backdrop/backdrop.js", "src/components/cardbuilder/cardBuilder.js", @@ -107,9 +110,14 @@ "src/components/dialogHelper/dialogHelper.js", "src/components/directorybrowser/directorybrowser.js", "src/components/displaySettings/displaySettings.js", + "src/components/favoriteitems.js", "src/components/fetchhelper.js", "src/components/filterdialog/filterdialog.js", + "src/components/filtermenu/filtermenu.js", + "src/components/focusManager.js", "src/components/groupedcards.js", + "src/components/guide/guide.js", + "src/components/guide/guide-settings.js", "src/components/homeScreenSettings/homeScreenSettings.js", "src/components/homesections/homesections.js", "src/components/htmlMediaHelper.js", @@ -123,9 +131,12 @@ "src/components/itemHelper.js", "src/components/itemidentifier/itemidentifier.js", "src/components/itemMediaInfo/itemMediaInfo.js", + "src/components/itemsrefresher.js", + "src/components/layoutManager.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", "src/components/libraryoptionseditor/libraryoptionseditor.js", "src/components/listview/listview.js", + "src/components/loading/loading.js", "src/components/maintabsmanager.js", "src/components/mediainfo/mediainfo.js", "src/components/mediaLibraryCreator/mediaLibraryCreator.js", @@ -133,11 +144,14 @@ "src/components/metadataEditor/metadataEditor.js", "src/components/metadataEditor/personEditor.js", "src/components/multiSelect/multiSelect.js", + "src/components/notifications/notifications.js", "src/components/nowPlayingBar/nowPlayingBar.js", + "src/components/packageManager.js", "src/components/playback/brightnessosd.js", "src/components/playback/mediasession.js", "src/components/playback/nowplayinghelper.js", "src/components/playback/playbackorientation.js", + "src/components/playback/playbackmanager.js", "src/components/playback/playerSelectionMenu.js", "src/components/playback/playersettingsmenu.js", "src/components/playback/playmethodhelper.js", @@ -148,21 +162,52 @@ "src/components/playerstats/playerstats.js", "src/components/playlisteditor/playlisteditor.js", "src/components/playmenu.js", + "src/components/pluginManager.js", "src/components/prompt/prompt.js", + "src/components/recordingcreator/recordingbutton.js", + "src/components/recordingcreator/recordingcreator.js", + "src/components/recordingcreator/seriesrecordingeditor.js", + "src/components/recordingcreator/recordinghelper.js", "src/components/refreshdialog/refreshdialog.js", + "src/components/recordingcreator/recordingeditor.js", + "src/components/recordingcreator/recordingfields.js", + "src/components/qualityOptions.js", + "src/components/remotecontrol/remotecontrol.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", + "src/plugins/experimentalWarnings/plugin.js", + "src/plugins/sessionPlayer/plugin.js", + "src/plugins/htmlAudioPlayer/plugin.js", + "src/plugins/chromecastPlayer/plugin.js", + "src/components/slideshow/slideshow.js", + "src/components/sortmenu/sortmenu.js", "src/plugins/htmlVideoPlayer/plugin.js", + "src/plugins/logoScreensaver/plugin.js", + "src/plugins/playAccessValidation/plugin.js", "src/components/search/searchfields.js", "src/components/search/searchresults.js", "src/components/settingshelper.js", "src/components/shortcuts.js", + "src/components/subtitleeditor/subtitleeditor.js", + "src/components/subtitlesync/subtitlesync.js", "src/components/subtitlesettings/subtitleappearancehelper.js", "src/components/subtitlesettings/subtitlesettings.js", "src/components/syncPlay/groupSelectionMenu.js", "src/components/syncPlay/playbackPermissionManager.js", "src/components/syncPlay/syncPlayManager.js", "src/components/syncPlay/timeSyncManager.js", + "src/components/themeMediaPlayer.js", + "src/components/tabbedview/tabbedview.js", + "src/components/viewManager/viewManager.js", + "src/components/tvproviders/schedulesdirect.js", + "src/components/tvproviders/xmltv.js", + "src/components/toast/toast.js", + "src/components/tunerPicker.js", + "src/components/upnextdialog/upnextdialog.js", + "src/components/userdatabuttons/userdatabuttons.js", + "src/components/viewContainer.js", + "src/components/viewSettings/viewSettings.js", + "src/components/castSenderApi.js", "src/controllers/session/addServer/index.js", "src/controllers/session/forgotPassword/index.js", "src/controllers/session/redeemPassword/index.js", @@ -185,11 +230,16 @@ "src/controllers/music/musicplaylists.js", "src/controllers/music/musicrecommended.js", "src/controllers/music/songs.js", - "src/controllers/dashboard/mediaLibrary.js", + "src/controllers/dashboard/library.js", "src/controllers/dashboard/metadataImages.js", "src/controllers/dashboard/metadatanfo.js", "src/controllers/dashboard/networking.js", + "src/controllers/dashboard/notifications/notification/index.js", + "src/controllers/dashboard/notifications/notifications/index.js", "src/controllers/dashboard/playback.js", + "src/controllers/dashboard/plugins/add/index.js", + "src/controllers/dashboard/plugins/installed/index.js", + "src/controllers/dashboard/plugins/available/index.js", "src/controllers/dashboard/plugins/repositories/index.js", "src/controllers/dashboard/scheduledtasks/scheduledtask.js", "src/controllers/dashboard/scheduledtasks/scheduledtasks.js", @@ -201,12 +251,32 @@ "src/controllers/dashboard/users/userparentalcontrol.js", "src/controllers/dashboard/users/userpasswordpage.js", "src/controllers/dashboard/users/userprofilespage.js", + "src/controllers/home.js", + "src/controllers/list.js", + "src/controllers/edititemmetadata.js", + "src/controllers/favorites.js", + "src/controllers/hometab.js", + "src/controllers/movies/moviecollections.js", + "src/controllers/movies/moviegenres.js", + "src/controllers/movies/movies.js", + "src/controllers/movies/moviesrecommended.js", + "src/controllers/movies/movietrailers.js", + "src/controllers/playback/nowplaying.js", + "src/controllers/playback/videoosd.js", "src/controllers/itemDetails/index.js", "src/controllers/playback/queue/index.js", "src/controllers/playback/video/index.js", "src/controllers/searchpage.js", + "src/controllers/livetv/livetvguide.js", "src/controllers/livetvtuner.js", + "src/controllers/livetv/livetvsuggested.js", "src/controllers/livetvstatus.js", + "src/controllers/livetvguideprovider.js", + "src/controllers/livetvsettings.js", + "src/controllers/livetv/livetvrecordings.js", + "src/controllers/livetv/livetvschedule.js", + "src/controllers/livetv/livetvseriestimers.js", + "src/controllers/livetv/livetvchannels.js", "src/controllers/shows/episodes.js", "src/controllers/shows/tvgenres.js", "src/controllers/shows/tvlatest.js", @@ -245,14 +315,19 @@ "src/elements/emby-tabs/emby-tabs.js", "src/elements/emby-textarea/emby-textarea.js", "src/elements/emby-toggle/emby-toggle.js", + "src/libraries/screensavermanager.js", + "src/libraries/navdrawer/navdrawer.js", + "src/libraries/scroller.js", "src/plugins/backdropScreensaver/plugin.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContents.js", + "src/plugins/chromecastPlayer/chromecastHelper.js", "src/plugins/photoPlayer/plugin.js", "src/plugins/youtubePlayer/plugin.js", "src/scripts/alphanumericshortcuts.js", "src/scripts/autoBackdrops.js", "src/scripts/browser.js", + "src/scripts/clientUtils.js", "src/scripts/datetime.js", "src/scripts/deleteHelper.js", "src/scripts/dfnshelper.js", @@ -262,14 +337,24 @@ "src/scripts/filesystem.js", "src/scripts/globalize.js", "src/scripts/imagehelper.js", + "src/scripts/itembynamedetailpage.js", "src/scripts/inputManager.js", + "src/scripts/autoThemes.js", + "src/scripts/themeManager.js", "src/scripts/keyboardNavigation.js", + "src/scripts/libraryMenu.js", "src/scripts/libraryBrowser.js", + "src/scripts/livetvcomponents.js", + "src/scripts/mouseManager.js", "src/scripts/multiDownload.js", "src/scripts/playlists.js", + "src/scripts/scrollHelper.js", + "src/scripts/serverNotifications.js", + "src/scripts/routes.js", "src/scripts/settings/appSettings.js", "src/scripts/settings/userSettings.js", "src/scripts/settings/webSettings.js", + "src/scripts/shell.js", "src/scripts/taskbutton.js", "src/scripts/themeLoader.js", "src/scripts/touchHelper.js" @@ -299,6 +384,7 @@ "Firefox ESR" ], "scripts": { + "start": "yarn serve", "serve": "gulp serve --development", "prepare": "gulp --production", "build:development": "gulp --development", diff --git a/scripts/duplicates.py b/scripts/duplicates.py new file mode 100644 index 0000000000..2daad94682 --- /dev/null +++ b/scripts/duplicates.py @@ -0,0 +1,33 @@ +import sys +import os +import json + +# load every string in the source language +# print all duplicate values to a file + +cwd = os.getcwd() +source = cwd + '/../src/strings/en-us.json' + +reverse = {} +duplicates = {} + +with open(source) as en: + strings = json.load(en) + for key, value in strings.items(): + if value not in reverse: + reverse[value] = [key] + else: + reverse[value].append(key) + +for key, value in reverse.items(): + if len(value) > 1: + duplicates[key] = value + +print('LENGTH: ' + str(len(duplicates))) +with open('duplicates.txt', 'w') as out: + for item in duplicates: + out.write(json.dumps(item) + ': ') + out.write(json.dumps(duplicates[item]) + '\n') + out.close() + +print('DONE') diff --git a/scripts/scrm.py b/scripts/remove.py similarity index 95% rename from scripts/scrm.py rename to scripts/remove.py index 9bd5bc2a48..dba48537aa 100644 --- a/scripts/scrm.py +++ b/scripts/remove.py @@ -11,7 +11,7 @@ langlst = os.listdir(langdir) keys = [] -with open('scout.txt', 'r') as f: +with open('unused.txt', 'r') as f: for line in f: keys.append(line.strip('\n')) diff --git a/scripts/scdup.py b/scripts/source.py similarity index 100% rename from scripts/scdup.py rename to scripts/source.py diff --git a/scripts/scgen.py b/scripts/unused.py similarity index 100% rename from scripts/scgen.py rename to scripts/unused.py diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 047ae0a1c6..643fb9ca97 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -236,12 +236,6 @@ text-align: center; } -.layout-desktop .searchTabButton, -.layout-mobile .searchTabButton, -.layout-tv .headerSearchButton { - display: none !important; -} - .mainDrawer-scrollContainer { padding-bottom: 10vh; } diff --git a/src/assets/css/videoosd.css b/src/assets/css/videoosd.css index 50cb41021b..808915e58b 100644 --- a/src/assets/css/videoosd.css +++ b/src/assets/css/videoosd.css @@ -7,7 +7,6 @@ } .osdPoster img, -.pageContainer, .videoOsdBottom { bottom: 0; left: 0; @@ -248,14 +247,7 @@ animation: spin 4s linear infinite; } -.pageContainer { - top: 0; - position: fixed; -} - @media all and (max-width: 30em) { - .btnFastForward, - .btnRewind, .osdMediaInfo, .osdPoster { display: none !important; diff --git a/src/bundle.js b/src/bundle.js index 3c21ed66a6..41164b8287 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -2,159 +2,159 @@ * require.js module definitions bundled by webpack */ // Use define from require.js not webpack's define -var _define = window.define; +const _define = window.define; // fetch -var fetch = require('whatwg-fetch'); +const fetch = require('whatwg-fetch'); _define('fetch', function() { return fetch; }); // Blurhash -var blurhash = require('blurhash'); +const blurhash = require('blurhash'); _define('blurhash', function() { return blurhash; }); // query-string -var query = require('query-string'); +const query = require('query-string'); _define('queryString', function() { return query; }); // flvjs -var flvjs = require('flv.js/dist/flv').default; +const flvjs = require('flv.js/dist/flv').default; _define('flvjs', function() { return flvjs; }); // jstree -var jstree = require('jstree'); +const jstree = require('jstree'); require('jstree/dist/themes/default/style.css'); _define('jstree', function() { return jstree; }); // jquery -var jquery = require('jquery'); +const jquery = require('jquery'); _define('jQuery', function() { return jquery; }); // hlsjs -var hlsjs = require('hls.js'); +const hlsjs = require('hls.js'); _define('hlsjs', function() { return hlsjs; }); // howler -var howler = require('howler'); +const howler = require('howler'); _define('howler', function() { return howler; }); // resize-observer-polyfill -var resize = require('resize-observer-polyfill').default; +const resize = require('resize-observer-polyfill').default; _define('resize-observer-polyfill', function() { return resize; }); // swiper -var swiper = require('swiper/swiper-bundle'); +const swiper = require('swiper/swiper-bundle'); require('swiper/swiper-bundle.css'); _define('swiper', function() { return swiper; }); // sortable -var sortable = require('sortablejs').default; +const sortable = require('sortablejs').default; _define('sortable', function() { return sortable; }); // webcomponents -var webcomponents = require('webcomponents.js/webcomponents-lite'); +const webcomponents = require('webcomponents.js/webcomponents-lite'); _define('webcomponents', function() { return webcomponents; }); // libass-wasm -var libassWasm = require('libass-wasm'); +const libassWasm = require('libass-wasm'); _define('JavascriptSubtitlesOctopus', function() { return libassWasm; }); // material-icons -var materialIcons = require('material-design-icons-iconfont/dist/material-design-icons.css'); +const materialIcons = require('material-design-icons-iconfont/dist/material-design-icons.css'); _define('material-icons', function() { return materialIcons; }); // noto font -var noto = require('jellyfin-noto'); +const noto = require('jellyfin-noto'); _define('jellyfin-noto', function () { return noto; }); -var epubjs = require('epubjs'); +const epubjs = require('epubjs'); _define('epubjs', function () { return epubjs; }); // page.js -var page = require('page'); +const page = require('page'); _define('page', function() { return page; }); // core-js -var polyfill = require('@babel/polyfill/dist/polyfill'); +const polyfill = require('@babel/polyfill/dist/polyfill'); _define('polyfill', function () { return polyfill; }); // domtokenlist-shim -var classlist = require('classlist.js'); +const classlist = require('classlist.js'); _define('classlist-polyfill', function () { return classlist; }); // Date-FNS -var dateFns = require('date-fns'); +const dateFns = require('date-fns'); _define('date-fns', function () { return dateFns; }); -var dateFnsLocale = require('date-fns/locale'); +const dateFnsLocale = require('date-fns/locale'); _define('date-fns/locale', function () { return dateFnsLocale; }); -var fast_text_encoding = require('fast-text-encoding'); +const fast_text_encoding = require('fast-text-encoding'); _define('fast-text-encoding', function () { return fast_text_encoding; }); // intersection-observer -var intersection_observer = require('intersection-observer'); +const intersection_observer = require('intersection-observer'); _define('intersection-observer', function () { return intersection_observer; }); // screenfull -var screenfull = require('screenfull'); +const screenfull = require('screenfull'); _define('screenfull', function () { return screenfull; }); // headroom.js -var headroom = require('headroom.js/dist/headroom'); +const headroom = require('headroom.js/dist/headroom'); _define('headroom', function () { return headroom; }); // apiclient -var apiclient = require('jellyfin-apiclient'); +const apiclient = require('jellyfin-apiclient'); _define('apiclient', function () { return apiclient.ApiClient; diff --git a/src/components/accessSchedule/accessSchedule.js b/src/components/accessSchedule/accessSchedule.js index 6b96aad1d4..b513766d0b 100644 --- a/src/components/accessSchedule/accessSchedule.js +++ b/src/components/accessSchedule/accessSchedule.js @@ -49,7 +49,7 @@ import 'formDialogStyle'; }; if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) { - return void alert(globalize.translate('ErrorMessageStartHourGreaterThanEnd')); + return void alert(globalize.translate('ErrorStartHourGreaterThanEnd')); } context.submitted = true; diff --git a/src/components/accessSchedule/accessSchedule.template.html b/src/components/accessSchedule/accessSchedule.template.html index 493150ae5e..c0f83ccec6 100644 --- a/src/components/accessSchedule/accessSchedule.template.html +++ b/src/components/accessSchedule/accessSchedule.template.html @@ -1,5 +1,5 @@
-

@@ -12,13 +12,13 @@
`; html += '
'; if (!readOnlyAttribute) { - html += ``; + html += ``; } html += '

'; if (!readOnlyAttribute) { @@ -166,10 +166,10 @@ import 'emby-button'; return apiClient.ajax({ type: 'POST', url: apiClient.getUrl('Environment/ValidatePath'), - data: { + data: JSON.stringify({ ValidateWriteable: validateWriteable, Path: path - } + }) }).catch(response => { if (response) { if (response.status === 404) { diff --git a/src/components/displaySettings/displaySettings.js b/src/components/displaySettings/displaySettings.js index ba78ab99e1..ae7647f98b 100644 --- a/src/components/displaySettings/displaySettings.js +++ b/src/components/displaySettings/displaySettings.js @@ -1,6 +1,5 @@ import browser from 'browser'; import layoutManager from 'layoutManager'; -import appSettings from 'appSettings'; import pluginManager from 'pluginManager'; import appHost from 'apphost'; import focusManager from 'focusManager'; @@ -16,17 +15,22 @@ import 'emby-button'; /* eslint-disable indent */ - function fillThemes(select, isDashboard) { - select.innerHTML = skinManager.getThemes().map(t => { - let value = t.id; - if (t.isDefault && !isDashboard) { - value = ''; - } else if (t.isDefaultServerDashboard && isDashboard) { - value = ''; - } + function fillThemes(context, userSettings) { + const select = context.querySelector('#selectTheme'); - return ``; - }).join(''); + skinManager.getThemes().then(themes => { + select.innerHTML = themes.map(t => { + return ``; + }).join(''); + + // get default theme + var defaultTheme = themes.find(theme => { + return theme.default; + }); + + // set the current theme + select.value = userSettings.theme() || defaultTheme.id; + }); } function loadScreensavers(context, userSettings) { @@ -46,6 +50,7 @@ import 'emby-button'; selectScreensaver.innerHTML = options.map(o => { return ``; }).join(''); + selectScreensaver.value = userSettings.screensaver(); if (!selectScreensaver.value) { @@ -54,57 +59,6 @@ import 'emby-button'; } } - function loadSoundEffects(context, userSettings) { - const selectSoundEffects = context.querySelector('.selectSoundEffects'); - const options = pluginManager.ofType('soundeffects').map(plugin => { - return { - name: plugin.name, - value: plugin.id - }; - }); - - options.unshift({ - name: globalize.translate('None'), - value: 'none' - }); - - selectSoundEffects.innerHTML = options.map(o => { - return ``; - }).join(''); - selectSoundEffects.value = userSettings.soundEffects(); - - if (!selectSoundEffects.value) { - // TODO: set the default instead of none - selectSoundEffects.value = 'none'; - } - } - - function loadSkins(context, userSettings) { - const selectSkin = context.querySelector('.selectSkin'); - - const options = pluginManager.ofType('skin').map(plugin => { - return { - name: plugin.name, - value: plugin.id - }; - }); - - selectSkin.innerHTML = options.map(o => { - return ``; - }).join(''); - selectSkin.value = userSettings.skin(); - - if (!selectSkin.value && options.length) { - selectSkin.value = options[0].value; - } - - if (options.length > 1 && appHost.supports('skins')) { - context.querySelector('.selectSkinContainer').classList.remove('hide'); - } else { - context.querySelector('.selectSkinContainer').classList.add('hide'); - } - } - function showOrHideMissingEpisodesField(context) { if (browser.tizen || browser.web0s) { context.querySelector('.fldDisplayMissingEpisodes').classList.add('hide'); @@ -115,12 +69,6 @@ import 'emby-button'; } function loadForm(context, user, userSettings) { - if (user.Policy.IsAdministrator) { - context.querySelector('.selectDashboardThemeContainer').classList.remove('hide'); - } else { - context.querySelector('.selectDashboardThemeContainer').classList.add('hide'); - } - if (appHost.supports('displaylanguage')) { context.querySelector('.languageSection').classList.remove('hide'); } else { @@ -139,18 +87,6 @@ import 'emby-button'; context.querySelector('.learnHowToContributeContainer').classList.add('hide'); } - if (appHost.supports('runatstartup')) { - context.querySelector('.fldAutorun').classList.remove('hide'); - } else { - context.querySelector('.fldAutorun').classList.add('hide'); - } - - if (appHost.supports('soundeffects')) { - context.querySelector('.fldSoundEffects').classList.remove('hide'); - } else { - context.querySelector('.fldSoundEffects').classList.add('hide'); - } - if (appHost.supports('screensaver')) { context.querySelector('.selectScreensaverContainer').classList.remove('hide'); } else { @@ -173,16 +109,8 @@ import 'emby-button'; context.querySelector('.fldThemeVideo').classList.add('hide'); } - context.querySelector('.chkRunAtStartup').checked = appSettings.runAtStartup(); - - const selectTheme = context.querySelector('#selectTheme'); - const selectDashboardTheme = context.querySelector('#selectDashboardTheme'); - - fillThemes(selectTheme); - fillThemes(selectDashboardTheme, true); + fillThemes(context, userSettings); loadScreensavers(context, userSettings); - loadSoundEffects(context, userSettings); - loadSkins(context, userSettings); context.querySelector('.chkDisplayMissingEpisodes').checked = user.Configuration.DisplayMissingEpisodes || false; @@ -198,9 +126,6 @@ import 'emby-button'; context.querySelector('#txtLibraryPageSize').value = userSettings.libraryPageSize(); - selectDashboardTheme.value = userSettings.dashboardTheme() || ''; - selectTheme.value = userSettings.theme() || ''; - context.querySelector('.selectLayout').value = layoutManager.getSavedLayout() || ''; showOrHideMissingEpisodesField(context); @@ -209,8 +134,6 @@ import 'emby-button'; } function saveUser(context, user, userSettingsInstance, apiClient) { - appSettings.runAtStartup(context.querySelector('.chkRunAtStartup').checked); - user.Configuration.DisplayMissingEpisodes = context.querySelector('.chkDisplayMissingEpisodes').checked; if (appHost.supports('displaylanguage')) { @@ -221,15 +144,11 @@ import 'emby-button'; userSettingsInstance.enableThemeSongs(context.querySelector('#chkThemeSong').checked); userSettingsInstance.enableThemeVideos(context.querySelector('#chkThemeVideo').checked); - userSettingsInstance.dashboardTheme(context.querySelector('#selectDashboardTheme').value); userSettingsInstance.theme(context.querySelector('#selectTheme').value); - userSettingsInstance.soundEffects(context.querySelector('.selectSoundEffects').value); userSettingsInstance.screensaver(context.querySelector('.selectScreensaver').value); userSettingsInstance.libraryPageSize(context.querySelector('#txtLibraryPageSize').value); - userSettingsInstance.skin(context.querySelector('.selectSkin').value); - userSettingsInstance.enableFastFadein(context.querySelector('#chkFadein').checked); userSettingsInstance.enableBlurhash(context.querySelector('#chkBlurhash').checked); userSettingsInstance.enableBackdrops(context.querySelector('#chkBackdrops').checked); diff --git a/src/components/displaySettings/displaySettings.template.html b/src/components/displaySettings/displaySettings.template.html index ab01b4b6ae..1b9bf00376 100644 --- a/src/components/displaySettings/displaySettings.template.html +++ b/src/components/displaySettings/displaySettings.template.html @@ -1,5 +1,4 @@
-

${Display}

@@ -123,26 +122,14 @@
${LabelPleaseRestart}
-
- -
-
-
- -
-
-
- -
-
${LabelLibraryPageSizeHelp}
@@ -159,9 +146,9 @@
-
${EnableBlurhashHelp}
+
${EnableBlurHashHelp}
@@ -175,7 +162,7 @@
${EnableBackdropsHelp}
@@ -183,7 +170,7 @@
${EnableThemeSongsHelp}
@@ -191,18 +178,11 @@
${EnableThemeVideosHelp}
-
- -
-
'; } @@ -291,13 +291,13 @@ import 'emby-input'; const btnSortable = elem.querySelector('.btnSortable'); const inner = btnSortable.querySelector('.material-icons'); if (elem.previousSibling) { - btnSortable.title = globalize.translate('ButtonUp'); + btnSortable.title = globalize.translate('Up'); btnSortable.classList.add('btnSortableMoveUp'); btnSortable.classList.remove('btnSortableMoveDown'); inner.classList.remove('keyboard_arrow_down'); inner.classList.add('keyboard_arrow_up'); } else { - btnSortable.title = globalize.translate('ButtonDown'); + btnSortable.title = globalize.translate('Down'); btnSortable.classList.remove('btnSortableMoveUp'); btnSortable.classList.add('btnSortableMoveDown'); inner.classList.remove('keyboard_arrow_up'); diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.template.html b/src/components/libraryoptionseditor/libraryoptionseditor.template.html index 92cebc9da4..3aa57f2432 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.template.html +++ b/src/components/libraryoptionseditor/libraryoptionseditor.template.html @@ -88,7 +88,7 @@
${ImportMissingEpisodesHelp}
diff --git a/src/components/loading/loading.js b/src/components/loading/loading.js index 9f86ba452f..8237611373 100644 --- a/src/components/loading/loading.js +++ b/src/components/loading/loading.js @@ -1,78 +1,74 @@ -define(['css!./loading'], function () { - 'use strict'; +import 'css!./loading'; - var loadingElem; - var layer1; - var layer2; - var layer3; - var layer4; - var circleLefts; - var circleRights; +let loadingElem; +let layer1; +let layer2; +let layer3; +let layer4; +let circleLefts; +let circleRights; - return { - show: function () { - var elem = loadingElem; +export function show() { + let elem = loadingElem; - if (!elem) { - elem = document.createElement('div'); - loadingElem = elem; + if (!elem) { + elem = document.createElement('div'); + loadingElem = elem; - elem.classList.add('docspinner'); - elem.classList.add('mdl-spinner'); + elem.classList.add('docspinner'); + elem.classList.add('mdl-spinner'); - elem.innerHTML = '
'; + elem.innerHTML = '
'; - document.body.appendChild(elem); + document.body.appendChild(elem); - layer1 = elem.querySelector('.mdl-spinner__layer-1'); - layer2 = elem.querySelector('.mdl-spinner__layer-2'); - layer3 = elem.querySelector('.mdl-spinner__layer-3'); - layer4 = elem.querySelector('.mdl-spinner__layer-4'); + layer1 = elem.querySelector('.mdl-spinner__layer-1'); + layer2 = elem.querySelector('.mdl-spinner__layer-2'); + layer3 = elem.querySelector('.mdl-spinner__layer-3'); + layer4 = elem.querySelector('.mdl-spinner__layer-4'); - circleLefts = elem.querySelectorAll('.mdl-spinner__circleLeft'); - circleRights = elem.querySelectorAll('.mdl-spinner__circleRight'); - } + circleLefts = elem.querySelectorAll('.mdl-spinner__circleLeft'); + circleRights = elem.querySelectorAll('.mdl-spinner__circleRight'); + } - elem.classList.add('mdlSpinnerActive'); + elem.classList.add('mdlSpinnerActive'); - layer1.classList.add('mdl-spinner__layer-1-active'); - layer2.classList.add('mdl-spinner__layer-2-active'); - layer3.classList.add('mdl-spinner__layer-3-active'); - layer4.classList.add('mdl-spinner__layer-4-active'); + layer1.classList.add('mdl-spinner__layer-1-active'); + layer2.classList.add('mdl-spinner__layer-2-active'); + layer3.classList.add('mdl-spinner__layer-3-active'); + layer4.classList.add('mdl-spinner__layer-4-active'); - var i; - var length; + for (let i = 0, length = circleLefts.length; i < length; i++) { + circleLefts[i].classList.add('mdl-spinner__circleLeft-active'); + } - for (i = 0, length = circleLefts.length; i < length; i++) { - circleLefts[i].classList.add('mdl-spinner__circleLeft-active'); - } + for (let i = 0, length = circleRights.length; i < length; i++) { + circleRights[i].classList.add('mdl-spinner__circleRight-active'); + } +} - for (i = 0, length = circleRights.length; i < length; i++) { - circleRights[i].classList.add('mdl-spinner__circleRight-active'); - } - }, - hide: function () { - var elem = loadingElem; +export function hide() { + const elem = loadingElem; - if (elem) { - elem.classList.remove('mdlSpinnerActive'); + if (elem) { + elem.classList.remove('mdlSpinnerActive'); - elem.classList.remove('mdl-spinner__layer-1-active'); - elem.classList.remove('mdl-spinner__layer-2-active'); - elem.classList.remove('mdl-spinner__layer-3-active'); - elem.classList.remove('mdl-spinner__layer-4-active'); + elem.classList.remove('mdl-spinner__layer-1-active'); + elem.classList.remove('mdl-spinner__layer-2-active'); + elem.classList.remove('mdl-spinner__layer-3-active'); + elem.classList.remove('mdl-spinner__layer-4-active'); - var i; - var length; - - for (i = 0, length = circleLefts.length; i < length; i++) { - circleLefts[i].classList.remove('mdl-spinner__circleLeft-active'); - } - - for (i = 0, length = circleRights.length; i < length; i++) { - circleRights[i].classList.remove('mdl-spinner__circleRight-active'); - } - } + for (let i = 0, length = circleLefts.length; i < length; i++) { + circleLefts[i].classList.remove('mdl-spinner__circleLeft-active'); } - }; -}); + + for (let i = 0, length = circleRights.length; i < length; i++) { + circleRights[i].classList.remove('mdl-spinner__circleRight-active'); + } + } +} + +export default { + show: show, + hide: hide +}; diff --git a/src/components/mediaLibraryCreator/mediaLibraryCreator.template.html b/src/components/mediaLibraryCreator/mediaLibraryCreator.template.html index f92a63e403..4d84544d06 100644 --- a/src/components/mediaLibraryCreator/mediaLibraryCreator.template.html +++ b/src/components/mediaLibraryCreator/mediaLibraryCreator.template.html @@ -24,8 +24,8 @@
-

${HeadersFolders}

-
diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js index b04f632055..13d264f4c9 100644 --- a/src/components/mediaLibraryEditor/mediaLibraryEditor.js +++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js @@ -76,7 +76,7 @@ import 'flexStyles'; confirm({ title: globalize.translate('HeaderRemoveMediaLocation'), text: globalize.translate('MessageConfirmRemoveMediaLocation'), - confirmText: globalize.translate('ButtonDelete'), + confirmText: globalize.translate('Delete'), primary: 'delete' }).then(() => { const refreshAfterChange = currentOptions.refresh; @@ -85,7 +85,7 @@ import 'flexStyles'; refreshLibraryFromServer(dom.parentWithClass(button, 'dlg-libraryeditor')); }, () => { import('toast').then(({default: toast}) => { - toast(globalize.translate('DefaultErrorMessage')); + toast(globalize.translate('ErrorDefault')); }); }); }); diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.template.html b/src/components/mediaLibraryEditor/mediaLibraryEditor.template.html index 6c814cf2dd..1f2581612d 100644 --- a/src/components/mediaLibraryEditor/mediaLibraryEditor.template.html +++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.template.html @@ -18,8 +18,8 @@
-

${HeadersFolders}

-
diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index 53982040b8..1d78d490a2 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -9,7 +9,6 @@ import 'programStyles'; import 'emby-button'; /* eslint-disable indent */ - function getTimerIndicator(item) { let status; @@ -208,7 +207,7 @@ import 'emby-button'; }); } else if (item.IsSeries && !item.IsRepeat) { miscInfo.push({ - html: `
${globalize.translate('AttributeNew')}
` + html: `
${globalize.translate('New')}
` }); } else if (item.IsSeries && item.IsRepeat) { miscInfo.push({ diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index be44e86b44..82b3c66f53 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -6,7 +6,6 @@ import loading from 'loading'; import focusManager from 'focusManager'; import connectionManager from 'connectionManager'; import globalize from 'globalize'; -import require from 'require'; import shell from 'shell'; import 'emby-checkbox'; import 'emby-input'; @@ -37,7 +36,7 @@ import 'flexStyles'; function submitUpdatedItem(form, item) { function afterContentTypeUpdated() { - require(['toast'], function (toast) { + import('toast').then(({default: toast}) => { toast(globalize.translate('MessageItemSaved')); }); @@ -227,7 +226,7 @@ import 'flexStyles'; } function editPerson(context, person, index) { - require(['personEditor'], function (personEditor) { + import('personEditor').then(({default: personEditor}) => { personEditor.show(person).then(function (updatedPerson) { const isNew = index === -1; @@ -246,14 +245,14 @@ import 'flexStyles'; if (parentId) { reload(context, parentId, item.ServerId); } else { - require(['appRouter'], function (appRouter) { + import('appRouter').then(({default: appRouter}) => { appRouter.goHome(); }); } } function showMoreMenu(context, button, user) { - require(['itemContextMenu'], function (itemContextMenu) { + import('itemContextMenu').then(({default: itemContextMenu}) => { var item = currentItem; itemContextMenu.show({ @@ -907,7 +906,7 @@ import 'flexStyles'; } function populatePeople(context, people) { - let lastType = ''; + const lastType = ''; let html = ''; const elem = context.querySelector('#peopleList'); diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js index d922aee84a..fdce40ab86 100644 --- a/src/components/multiSelect/multiSelect.js +++ b/src/components/multiSelect/multiSelect.js @@ -198,7 +198,7 @@ import 'css!./multiSelect'; if (user.Policy.EnableContentDownloading && appHost.supports('filedownload')) { menuItems.push({ - name: globalize.translate('ButtonDownload'), + name: globalize.translate('Download'), id: 'download', icon: 'file_download' }); diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index b4647bbf25..020d9953ef 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -1,179 +1,181 @@ -define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'require'], function (serverNotifications, playbackManager, events, globalize, require) { - 'use strict'; +import serverNotifications from 'serverNotifications'; +import playbackManager from 'playbackManager'; +import events from 'events'; +import globalize from 'globalize'; - function onOneDocumentClick() { - document.removeEventListener('click', onOneDocumentClick); - document.removeEventListener('keydown', onOneDocumentClick); +function onOneDocumentClick() { + document.removeEventListener('click', onOneDocumentClick); + document.removeEventListener('keydown', onOneDocumentClick); - // don't request notification permissions if they're already granted or denied - if (window.Notification && window.Notification.permission === 'default') { - /* eslint-disable-next-line compat/compat */ - Notification.requestPermission(); - } - } - - document.addEventListener('click', onOneDocumentClick); - document.addEventListener('keydown', onOneDocumentClick); - - var serviceWorkerRegistration; - - function closeAfter(notification, timeoutMs) { - setTimeout(function () { - if (notification.close) { - notification.close(); - } else if (notification.cancel) { - notification.cancel(); - } - }, timeoutMs); - } - - function resetRegistration() { + // don't request notification permissions if they're already granted or denied + if (window.Notification && window.Notification.permission === 'default') { /* eslint-disable-next-line compat/compat */ - var serviceWorker = navigator.serviceWorker; - if (serviceWorker) { - serviceWorker.ready.then(function (registration) { - serviceWorkerRegistration = registration; - }); + Notification.requestPermission(); + } +} + +document.addEventListener('click', onOneDocumentClick); +document.addEventListener('keydown', onOneDocumentClick); + +let serviceWorkerRegistration; + +function closeAfter(notification, timeoutMs) { + setTimeout(function () { + if (notification.close) { + notification.close(); + } else if (notification.cancel) { + notification.cancel(); + } + }, timeoutMs); +} + +function resetRegistration() { + /* eslint-disable-next-line compat/compat */ + let serviceWorker = navigator.serviceWorker; + if (serviceWorker) { + serviceWorker.ready.then(function (registration) { + serviceWorkerRegistration = registration; + }); + } +} + +resetRegistration(); + +function showPersistentNotification(title, options, timeoutMs) { + serviceWorkerRegistration.showNotification(title, options); +} + +function showNonPersistentNotification(title, options, timeoutMs) { + try { + let notif = new Notification(title, options); /* eslint-disable-line compat/compat */ + + if (notif.show) { + notif.show(); + } + + if (timeoutMs) { + closeAfter(notif, timeoutMs); + } + } catch (err) { + if (options.actions) { + options.actions = []; + showNonPersistentNotification(title, options, timeoutMs); + } else { + throw err; } } +} + +function showNotification(options, timeoutMs, apiClient) { + let title = options.title; + + options.data = options.data || {}; + options.data.serverId = apiClient.serverInfo().Id; + options.icon = options.icon || getIconUrl(); + options.badge = options.badge || getIconUrl('badge.png'); resetRegistration(); - function showPersistentNotification(title, options, timeoutMs) { - serviceWorkerRegistration.showNotification(title, options); + if (serviceWorkerRegistration) { + showPersistentNotification(title, options, timeoutMs); + return; } - function showNonPersistentNotification(title, options, timeoutMs) { - try { - var notif = new Notification(title, options); /* eslint-disable-line compat/compat */ + showNonPersistentNotification(title, options, timeoutMs); +} - if (notif.show) { - notif.show(); - } - - if (timeoutMs) { - closeAfter(notif, timeoutMs); - } - } catch (err) { - if (options.actions) { - options.actions = []; - showNonPersistentNotification(title, options, timeoutMs); - } else { - throw err; - } - } +function showNewItemNotification(item, apiClient) { + if (playbackManager.isPlayingLocally(['Video'])) { + return; } - function showNotification(options, timeoutMs, apiClient) { - var title = options.title; + let body = item.Name; - options.data = options.data || {}; - options.data.serverId = apiClient.serverInfo().Id; - options.icon = options.icon || getIconUrl(); - options.badge = options.badge || getIconUrl('badge.png'); - - resetRegistration(); - - if (serviceWorkerRegistration) { - showPersistentNotification(title, options, timeoutMs); - return; - } - - showNonPersistentNotification(title, options, timeoutMs); + if (item.SeriesName) { + body = item.SeriesName + ' - ' + body; } - function showNewItemNotification(item, apiClient) { - if (playbackManager.isPlayingLocally(['Video'])) { - return; - } + let notification = { + title: 'New ' + item.Type, + body: body, + vibrate: true, + tag: 'newItem' + item.Id, + data: {} + }; - var body = item.Name; + let imageTags = item.ImageTags || {}; - if (item.SeriesName) { - body = item.SeriesName + ' - ' + body; - } - - var notification = { - title: 'New ' + item.Type, - body: body, - vibrate: true, - tag: 'newItem' + item.Id, - data: {} - }; - - var imageTags = item.ImageTags || {}; - - if (imageTags.Primary) { - notification.icon = apiClient.getScaledImageUrl(item.Id, { - width: 80, - tag: imageTags.Primary, - type: 'Primary' - }); - } - - showNotification(notification, 15000, apiClient); - } - - function onLibraryChanged(data, apiClient) { - var newItems = data.ItemsAdded; - - if (!newItems.length) { - return; - } - - // Don't put a massive number of Id's onto the query string - if (newItems.length > 12) { - newItems.length = 12; - } - - apiClient.getItems(apiClient.getCurrentUserId(), { - - Recursive: true, - Limit: 3, - Filters: 'IsNotFolder', - SortBy: 'DateCreated', - SortOrder: 'Descending', - Ids: newItems.join(','), - MediaTypes: 'Audio,Video', - EnableTotalRecordCount: false - - }).then(function (result) { - var items = result.Items; - - for (var i = 0, length = items.length ; i < length; i++) { - showNewItemNotification(items[i], apiClient); - } + if (imageTags.Primary) { + notification.icon = apiClient.getScaledImageUrl(item.Id, { + width: 80, + tag: imageTags.Primary, + type: 'Primary' }); } - function getIconUrl(name) { - name = name || 'notificationicon.png'; - return require.toUrl('.').split('?')[0] + '/' + name; + showNotification(notification, 15000, apiClient); +} + +function onLibraryChanged(data, apiClient) { + let newItems = data.ItemsAdded; + + if (!newItems.length) { + return; } - function showPackageInstallNotification(apiClient, installation, status) { - apiClient.getCurrentUser().then(function (user) { - if (!user.Policy.IsAdministrator) { - return; - } + // Don't put a massive number of Id's onto the query string + if (newItems.length > 12) { + newItems.length = 12; + } - var notification = { - tag: 'install' + installation.Id, - data: {} - }; + apiClient.getItems(apiClient.getCurrentUserId(), { - if (status === 'completed') { - notification.title = globalize.translate('PackageInstallCompleted', installation.Name, installation.Version); - notification.vibrate = true; - } else if (status === 'cancelled') { - notification.title = globalize.translate('PackageInstallCancelled', installation.Name, installation.Version); - } else if (status === 'failed') { - notification.title = globalize.translate('PackageInstallFailed', installation.Name, installation.Version); - notification.vibrate = true; - } else if (status === 'progress') { - notification.title = globalize.translate('InstallingPackage', installation.Name, installation.Version); + Recursive: true, + Limit: 3, + Filters: 'IsNotFolder', + SortBy: 'DateCreated', + SortOrder: 'Descending', + Ids: newItems.join(','), + MediaTypes: 'Audio,Video', + EnableTotalRecordCount: false - notification.actions = + }).then(function (result) { + let items = result.Items; + + for (const item of items) { + showNewItemNotification(item, apiClient); + } + }); +} + +function getIconUrl(name) { + name = name || 'notificationicon.png'; + return './components/notifications/' + name; +} + +function showPackageInstallNotification(apiClient, installation, status) { + apiClient.getCurrentUser().then(function (user) { + if (!user.Policy.IsAdministrator) { + return; + } + + let notification = { + tag: 'install' + installation.Id, + data: {} + }; + + if (status === 'completed') { + notification.title = globalize.translate('PackageInstallCompleted', installation.Name, installation.Version); + notification.vibrate = true; + } else if (status === 'cancelled') { + notification.title = globalize.translate('PackageInstallCancelled', installation.Name, installation.Version); + } else if (status === 'failed') { + notification.title = globalize.translate('PackageInstallFailed', installation.Name, installation.Version); + notification.vibrate = true; + } else if (status === 'progress') { + notification.title = globalize.translate('InstallingPackage', installation.Name, installation.Version); + + notification.actions = [ { action: 'cancel-install', @@ -182,67 +184,67 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir } ]; - notification.data.id = installation.id; - } + notification.data.id = installation.id; + } - if (status === 'progress') { - var percentComplete = Math.round(installation.PercentComplete || 0); + if (status === 'progress') { + let percentComplete = Math.round(installation.PercentComplete || 0); - notification.body = percentComplete + '% complete.'; - } + notification.body = percentComplete + '% complete.'; + } - var timeout = status === 'cancelled' ? 5000 : 0; + let timeout = status === 'cancelled' ? 5000 : 0; - showNotification(notification, timeout, apiClient); - }); - } - - events.on(serverNotifications, 'LibraryChanged', function (e, apiClient, data) { - onLibraryChanged(data, apiClient); + showNotification(notification, timeout, apiClient); }); +} - events.on(serverNotifications, 'PackageInstallationCompleted', function (e, apiClient, data) { - showPackageInstallNotification(apiClient, data, 'completed'); - }); +events.on(serverNotifications, 'LibraryChanged', function (e, apiClient, data) { + onLibraryChanged(data, apiClient); +}); - events.on(serverNotifications, 'PackageInstallationFailed', function (e, apiClient, data) { - showPackageInstallNotification(apiClient, data, 'failed'); - }); +events.on(serverNotifications, 'PackageInstallationCompleted', function (e, apiClient, data) { + showPackageInstallNotification(apiClient, data, 'completed'); +}); - events.on(serverNotifications, 'PackageInstallationCancelled', function (e, apiClient, data) { - showPackageInstallNotification(apiClient, data, 'cancelled'); - }); +events.on(serverNotifications, 'PackageInstallationFailed', function (e, apiClient, data) { + showPackageInstallNotification(apiClient, data, 'failed'); +}); - events.on(serverNotifications, 'PackageInstalling', function (e, apiClient, data) { - showPackageInstallNotification(apiClient, data, 'progress'); - }); +events.on(serverNotifications, 'PackageInstallationCancelled', function (e, apiClient, data) { + showPackageInstallNotification(apiClient, data, 'cancelled'); +}); - events.on(serverNotifications, 'ServerShuttingDown', function (e, apiClient, data) { - var serverId = apiClient.serverInfo().Id; - var notification = { - tag: 'restart' + serverId, - title: globalize.translate('ServerNameIsShuttingDown', apiClient.serverInfo().Name) - }; - showNotification(notification, 0, apiClient); - }); +events.on(serverNotifications, 'PackageInstalling', function (e, apiClient, data) { + showPackageInstallNotification(apiClient, data, 'progress'); +}); - events.on(serverNotifications, 'ServerRestarting', function (e, apiClient, data) { - var serverId = apiClient.serverInfo().Id; - var notification = { - tag: 'restart' + serverId, - title: globalize.translate('ServerNameIsRestarting', apiClient.serverInfo().Name) - }; - showNotification(notification, 0, apiClient); - }); +events.on(serverNotifications, 'ServerShuttingDown', function (e, apiClient, data) { + let serverId = apiClient.serverInfo().Id; + let notification = { + tag: 'restart' + serverId, + title: globalize.translate('ServerNameIsShuttingDown', apiClient.serverInfo().Name) + }; + showNotification(notification, 0, apiClient); +}); - events.on(serverNotifications, 'RestartRequired', function (e, apiClient) { - var serverId = apiClient.serverInfo().Id; - var notification = { - tag: 'restart' + serverId, - title: globalize.translate('PleaseRestartServerName', apiClient.serverInfo().Name) - }; +events.on(serverNotifications, 'ServerRestarting', function (e, apiClient, data) { + let serverId = apiClient.serverInfo().Id; + let notification = { + tag: 'restart' + serverId, + title: globalize.translate('ServerNameIsRestarting', apiClient.serverInfo().Name) + }; + showNotification(notification, 0, apiClient); +}); - notification.actions = +events.on(serverNotifications, 'RestartRequired', function (e, apiClient) { + let serverId = apiClient.serverInfo().Id; + let notification = { + tag: 'restart' + serverId, + title: globalize.translate('PleaseRestartServerName', apiClient.serverInfo().Name) + }; + + notification.actions = [ { action: 'restart', @@ -251,6 +253,6 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir } ]; - showNotification(notification, 0, apiClient); - }); + showNotification(notification, 0, apiClient); }); + diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index d411dcc620..7aa8c623b3 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -500,20 +500,20 @@ import 'emby-ratingbutton'; const textLines = nowPlayingItem ? nowPlayingHelper.getNowPlayingNames(nowPlayingItem) : []; nowPlayingTextElement.innerHTML = ''; if (textLines) { - let itemText = document.createElement('div'); - let secondaryText = document.createElement('div'); + const itemText = document.createElement('div'); + const secondaryText = document.createElement('div'); secondaryText.classList.add('nowPlayingBarSecondaryText'); if (textLines.length > 1) { textLines[1].secondary = true; if (textLines[1].text) { - let text = document.createElement('a'); + const text = document.createElement('a'); text.innerHTML = textLines[1].text; secondaryText.appendChild(text); } } if (textLines[0].text) { - let text = document.createElement('a'); + const text = document.createElement('a'); text.innerHTML = textLines[0].text; itemText.appendChild(text); } @@ -555,10 +555,10 @@ import 'emby-ratingbutton'; if (!layoutManager.mobile) { let contextButton = nowPlayingBarElement.querySelector('.btnToggleContextMenu'); // We remove the previous event listener by replacing the item in each update event - let contextButtonClone = contextButton.cloneNode(true); + const contextButtonClone = contextButton.cloneNode(true); contextButton.parentNode.replaceChild(contextButtonClone, contextButton); contextButton = nowPlayingBarElement.querySelector('.btnToggleContextMenu'); - let options = { + const options = { play: false, queue: false, clearQueue: true, @@ -600,10 +600,10 @@ import 'emby-ratingbutton'; return; } - let shuffleMode = playbackManager.getQueueShuffleMode(); - let context = nowPlayingBarElement; + const shuffleMode = playbackManager.getQueueShuffleMode(); + const context = nowPlayingBarElement; const cssClass = 'buttonActive'; - let toggleShuffleButton = context.querySelector('.btnShuffleQueue'); + const toggleShuffleButton = context.querySelector('.btnShuffleQueue'); switch (shuffleMode) { case 'Shuffle': toggleShuffleButton.classList.add(cssClass); diff --git a/src/components/packageManager.js b/src/components/packageManager.js index 936f5a4029..2a15a14f34 100644 --- a/src/components/packageManager.js +++ b/src/components/packageManager.js @@ -1,134 +1,140 @@ -define(['appSettings', 'pluginManager'], function (appSettings, pluginManager) { - 'use strict'; +import appSettings from 'appSettings'; +import pluginManager from 'pluginManager'; +/* eslint-disable indent */ - var settingsKey = 'installedpackages1'; + class PackageManager { + #packagesList = []; + #settingsKey = 'installedpackages1'; - function addPackage(packageManager, pkg) { - packageManager.packagesList = packageManager.packagesList.filter(function (p) { - return p.name !== pkg.name; - }); + init() { + console.groupCollapsed('loading packages'); + var manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]'); - packageManager.packagesList.push(pkg); - } + return Promise.all(manifestUrls.map((url) => { + return this.loadPackage(url); + })) + .then(() => { + console.debug('finished loading packages'); + return Promise.resolve(); + }) + .catch(() => { + return Promise.resolve(); + }).finally(() => { + console.groupEnd('loading packages'); + }); + } - function removeUrl(url) { - var manifestUrls = JSON.parse(appSettings.get(settingsKey) || '[]'); + get packages() { + return this.#packagesList.slice(0); + } - manifestUrls = manifestUrls.filter(function (i) { - return i !== url; - }); + install(url) { + return this.loadPackage(url, true).then((pkg) => { + var manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]'); - appSettings.set(settingsKey, JSON.stringify(manifestUrls)); - } - - function loadPackage(packageManager, url, throwError) { - return new Promise(function (resolve, reject) { - var xhr = new XMLHttpRequest(); - var originalUrl = url; - url += url.indexOf('?') === -1 ? '?' : '&'; - url += 't=' + new Date().getTime(); - - xhr.open('GET', url, true); - - var onError = function () { - if (throwError === true) { - reject(); - } else { - removeUrl(originalUrl); - resolve(); + if (!manifestUrls.includes(url)) { + manifestUrls.push(url); + appSettings.set(this.#settingsKey, JSON.stringify(manifestUrls)); } - }; - xhr.onload = function (e) { - if (this.status < 400) { - var pkg = JSON.parse(this.response); - pkg.url = originalUrl; + return pkg; + }); + } - addPackage(packageManager, pkg); + uninstall(name) { + var pkg = this.#packagesList.filter((p) => { + return p.name === name; + })[0]; - var plugins = pkg.plugins || []; - if (pkg.plugin) { - plugins.push(pkg.plugin); - } - var promises = plugins.map(function (pluginUrl) { - return pluginManager.loadPlugin(packageManager.mapPath(pkg, pluginUrl)); - }); - Promise.all(promises).then(resolve, resolve); - } else { - onError(); - } - }; + if (pkg) { + this.#packagesList = this.#packagesList.filter((p) => { + return p.name !== name; + }); - xhr.onerror = onError; - - xhr.send(); - }); - } - - function PackageManager() { - this.packagesList = []; - } - - PackageManager.prototype.init = function () { - var manifestUrls = JSON.parse(appSettings.get(settingsKey) || '[]'); - - var instance = this; - return Promise.all(manifestUrls.map(function (u) { - return loadPackage(instance, u); - })).then(function () { - return Promise.resolve(); - }, function () { - return Promise.resolve(); - }); - }; - - PackageManager.prototype.packages = function () { - return this.packagesList.slice(0); - }; - - PackageManager.prototype.install = function (url) { - return loadPackage(this, url, true).then(function (pkg) { - var manifestUrls = JSON.parse(appSettings.get(settingsKey) || '[]'); - - if (manifestUrls.indexOf(url) === -1) { - manifestUrls.push(url); - appSettings.set(settingsKey, JSON.stringify(manifestUrls)); + this.removeUrl(pkg.url); } - return pkg; - }); - }; + return Promise.resolve(); + } - PackageManager.prototype.uninstall = function (name) { - var pkg = this.packagesList.filter(function (p) { - return p.name === name; - })[0]; + mapPath(pkg, pluginUrl) { + var urlLower = pluginUrl.toLowerCase(); + if (urlLower.startsWith('http:') || urlLower.startsWith('https:') || urlLower.startsWith('file:')) { + return pluginUrl; + } - if (pkg) { - this.packagesList = this.packagesList.filter(function (p) { - return p.name !== name; + var packageUrl = pkg.url; + packageUrl = packageUrl.substring(0, packageUrl.lastIndexOf('/')); + + packageUrl += '/'; + packageUrl += pluginUrl; + + return packageUrl; + } + + addPackage(pkg) { + this.#packagesList = this.#packagesList.filter((p) => { + return p.name !== pkg.name; }); - removeUrl(pkg.url); + this.#packagesList.push(pkg); } - return Promise.resolve(); - }; + removeUrl(url) { + var manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]'); - PackageManager.prototype.mapPath = function (pkg, pluginUrl) { - var urlLower = pluginUrl.toLowerCase(); - if (urlLower.indexOf('http:') === 0 || urlLower.indexOf('https:') === 0 || urlLower.indexOf('file:') === 0) { - return pluginUrl; + manifestUrls = manifestUrls.filter((i) => { + return i !== url; + }); + + appSettings.set(this.#settingsKey, JSON.stringify(manifestUrls)); } - var packageUrl = pkg.url; - packageUrl = packageUrl.substring(0, packageUrl.lastIndexOf('/')); + loadPackage(url, throwError = false) { + return new Promise((resolve, reject) => { + var xhr = new XMLHttpRequest(); + var originalUrl = url; + url += url.indexOf('?') === -1 ? '?' : '&'; + url += 't=' + new Date().getTime(); - packageUrl += '/'; - packageUrl += pluginUrl; + xhr.open('GET', url, true); - return packageUrl; - }; + var onError = () => { + if (throwError === true) { + reject(); + } else { + this.removeUrl(originalUrl); + resolve(); + } + }; - return new PackageManager(); -}); + xhr.onload = () => { + if (this.status < 400) { + var pkg = JSON.parse(this.response); + pkg.url = originalUrl; + + this.addPackage(pkg); + + var plugins = pkg.plugins || []; + if (pkg.plugin) { + plugins.push(pkg.plugin); + } + var promises = plugins.map((pluginUrl) => { + return pluginManager.loadPlugin(this.mapPath(pkg, pluginUrl)); + }); + Promise.all(promises).then(resolve, resolve); + } else { + onError(); + } + }; + + xhr.onerror = onError; + + xhr.send(); + }); + } + } + +/* eslint-enable indent */ + +export default new PackageManager(); diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js index 0f275c88f7..5c7ddf45dd 100644 --- a/src/components/playback/mediasession.js +++ b/src/components/playback/mediasession.js @@ -127,7 +127,7 @@ import connectionManager from 'connectionManager'; artwork: getImageUrls(item) }); } else { - let itemImageUrl = seriesImageUrl(item, { maxHeight: 3000 }) || imageUrl(item, { maxHeight: 3000 }); + const itemImageUrl = seriesImageUrl(item, { maxHeight: 3000 }) || imageUrl(item, { maxHeight: 3000 }); window.NativeShell.updateMediaSession({ action: eventName, @@ -244,10 +244,10 @@ import connectionManager from 'connectionManager'; /* eslint-disable-next-line compat/compat */ navigator.mediaSession.setActionHandler('seekto', function (object) { - let item = playbackManager.getPlayerState(currentPlayer).NowPlayingItem; + const item = playbackManager.getPlayerState(currentPlayer).NowPlayingItem; // Convert to ms - let duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0); - let wantedTime = object.seekTime * 1000; + const duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0); + const wantedTime = object.seekTime * 1000; playbackManager.seekPercent(wantedTime / duration * 100, currentPlayer); }); } diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 1d74cd69f5..3b4099d540 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1,729 +1,738 @@ -define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'playQueueManager', 'userSettings', 'globalize', 'connectionManager', 'loading', 'apphost', 'screenfull'], function (events, datetime, appSettings, itemHelper, pluginManager, PlayQueueManager, userSettings, globalize, connectionManager, loading, apphost, screenfull) { - 'use strict'; - - PlayQueueManager = PlayQueueManager.default || PlayQueueManager; - - function enableLocalPlaylistManagement(player) { - if (player.getPlaylist) { - return false; - } - - if (player.isLocalPlayer) { - return true; - } +import events from 'events'; +import datetime from 'datetime'; +import appSettings from 'appSettings'; +import itemHelper from 'itemHelper'; +import pluginManager from 'pluginManager'; +import PlayQueueManager from 'playQueueManager'; +import * as userSettings from 'userSettings'; +import globalize from 'globalize'; +import connectionManager from 'connectionManager'; +import loading from 'loading'; +import appHost from 'apphost'; +import screenfull from 'screenfull'; +function enableLocalPlaylistManagement(player) { + if (player.getPlaylist) { return false; } - function bindToFullscreenChange(player) { - if (screenfull.isEnabled) { - screenfull.on('change', function () { - events.trigger(player, 'fullscreenchange'); - }); - } else { - // iOS Safari - document.addEventListener('webkitfullscreenchange', function () { - events.trigger(player, 'fullscreenchange'); - }, false); - } - } - - function triggerPlayerChange(playbackManagerInstance, newPlayer, newTarget, previousPlayer, previousTargetInfo) { - if (!newPlayer && !previousPlayer) { - return; - } - - if (newTarget && previousTargetInfo) { - if (newTarget.id === previousTargetInfo.id) { - return; - } - } - - events.trigger(playbackManagerInstance, 'playerchange', [newPlayer, newTarget, previousPlayer]); - } - - function reportPlayback(playbackManagerInstance, state, player, reportPlaylist, serverId, method, progressEventName) { - if (!serverId) { - // Not a server item - // We can expand on this later and possibly report them - events.trigger(playbackManagerInstance, 'reportplayback', [false]); - return; - } - - var info = Object.assign({}, state.PlayState); - info.ItemId = state.NowPlayingItem.Id; - - if (progressEventName) { - info.EventName = progressEventName; - } - - if (reportPlaylist) { - addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId); - } - - var apiClient = connectionManager.getApiClient(serverId); - var reportPlaybackPromise = apiClient[method](info); - // Notify that report has been sent - reportPlaybackPromise.then(() => { - events.trigger(playbackManagerInstance, 'reportplayback', [true]); - }); - } - - function getPlaylistSync(playbackManagerInstance, player) { - player = player || playbackManagerInstance._currentPlayer; - if (player && !enableLocalPlaylistManagement(player)) { - return player.getPlaylistSync(); - } - - return playbackManagerInstance._playQueueManager.getPlaylist(); - } - - function addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId) { - info.NowPlayingQueue = getPlaylistSync(playbackManagerInstance, player).map(function (i) { - var itemInfo = { - Id: i.Id, - PlaylistItemId: i.PlaylistItemId - }; - - if (i.ServerId !== serverId) { - itemInfo.ServerId = i.ServerId; - } - - return itemInfo; - }); - } - - function normalizeName(t) { - return t.toLowerCase().replace(' ', ''); - } - - function getItemsForPlayback(serverId, query) { - var apiClient = connectionManager.getApiClient(serverId); - - if (query.Ids && query.Ids.split(',').length === 1) { - var itemId = query.Ids.split(','); - - return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { - return { - Items: [item], - TotalRecordCount: 1 - }; - }); - } else { - query.Limit = query.Limit || 300; - query.Fields = 'Chapters'; - query.ExcludeLocationTypes = 'Virtual'; - query.EnableTotalRecordCount = false; - query.CollapseBoxSetItems = false; - - return apiClient.getItems(apiClient.getCurrentUserId(), query); - } - } - - function createStreamInfoFromUrlItem(item) { - // Check item.Path for games - return { - url: item.Url || item.Path, - playMethod: 'DirectPlay', - item: item, - textTracks: [], - mediaType: item.MediaType - }; - } - - function mergePlaybackQueries(obj1, obj2) { - var query = Object.assign(obj1, obj2); - - var filters = query.Filters ? query.Filters.split(',') : []; - if (filters.indexOf('IsNotFolder') === -1) { - filters.push('IsNotFolder'); - } - query.Filters = filters.join(','); - return query; - } - - function backdropImageUrl(apiClient, item, options) { - options = options || {}; - options.type = options.type || 'Backdrop'; - - // If not resizing, get the original image - if (!options.maxWidth && !options.width && !options.maxHeight && !options.height) { - options.quality = 100; - } - - if (item.BackdropImageTags && item.BackdropImageTags.length) { - options.tag = item.BackdropImageTags[0]; - return apiClient.getScaledImageUrl(item.Id, options); - } - - if (item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { - options.tag = item.ParentBackdropImageTags[0]; - return apiClient.getScaledImageUrl(item.ParentBackdropItemId, options); - } - - return null; - } - - function getMimeType(type, container) { - container = (container || '').toLowerCase(); - - if (type === 'audio') { - if (container === 'opus') { - return 'audio/ogg'; - } - if (container === 'webma') { - return 'audio/webm'; - } - if (container === 'm4a') { - return 'audio/mp4'; - } - } else if (type === 'video') { - if (container === 'mkv') { - return 'video/x-matroska'; - } - if (container === 'm4v') { - return 'video/mp4'; - } - if (container === 'mov') { - return 'video/quicktime'; - } - if (container === 'mpg') { - return 'video/mpeg'; - } - if (container === 'flv') { - return 'video/x-flv'; - } - } - - return type + '/' + container; - } - - function getParam(name, url) { - name = name.replace(/[\[]/, '\\\[').replace(/[\]]/, '\\\]'); - var regexS = '[\\?&]' + name + '=([^&#]*)'; - var regex = new RegExp(regexS, 'i'); - - var results = regex.exec(url); - if (results == null) { - return ''; - } else { - return decodeURIComponent(results[1].replace(/\+/g, ' ')); - } - } - - function isAutomaticPlayer(player) { - if (player.isLocalPlayer) { - return true; - } - - return false; - } - - function getAutomaticPlayers(instance, forceLocalPlayer) { - if (!forceLocalPlayer) { - var player = instance._currentPlayer; - if (player && !isAutomaticPlayer(player)) { - return [player]; - } - } - - return instance.getPlayers().filter(isAutomaticPlayer); - } - - function isServerItem(item) { - if (!item.Id) { - return false; - } + if (player.isLocalPlayer) { return true; } - function enableIntros(item) { - if (item.MediaType !== 'Video') { - return false; - } - if (item.Type === 'TvChannel') { - return false; - } - // disable for in-progress recordings - if (item.Status === 'InProgress') { - return false; - } + return false; +} - return isServerItem(item); +function bindToFullscreenChange(player) { + if (screenfull.isEnabled) { + screenfull.on('change', function () { + events.trigger(player, 'fullscreenchange'); + }); + } else { + // iOS Safari + document.addEventListener('webkitfullscreenchange', function () { + events.trigger(player, 'fullscreenchange'); + }, false); + } +} + +function triggerPlayerChange(playbackManagerInstance, newPlayer, newTarget, previousPlayer, previousTargetInfo) { + if (!newPlayer && !previousPlayer) { + return; } - function getIntros(firstItem, apiClient, options) { - if (options.startPositionTicks || options.startIndex || options.fullscreen === false || !enableIntros(firstItem) || !userSettings.enableCinemaMode()) { - return Promise.resolve({ - Items: [] - }); + if (newTarget && previousTargetInfo) { + if (newTarget.id === previousTargetInfo.id) { + return; } - - return apiClient.getIntros(firstItem.Id).then(function (result) { - return result; - }, function (err) { - return Promise.resolve({ - Items: [] - }); - }); } - function getAudioMaxValues(deviceProfile) { - // TODO - this could vary per codec and should be done on the server using the entire profile - var maxAudioSampleRate = null; - var maxAudioBitDepth = null; - var maxAudioBitrate = null; + events.trigger(playbackManagerInstance, 'playerchange', [newPlayer, newTarget, previousPlayer]); +} - deviceProfile.CodecProfiles.map(function (codecProfile) { - if (codecProfile.Type === 'Audio') { - (codecProfile.Conditions || []).map(function (condition) { - if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitDepth') { - return maxAudioBitDepth = condition.Value; - } else if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioSampleRate') { - return maxAudioSampleRate = condition.Value; - } else if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitrate') { - return maxAudioBitrate = condition.Value; - } - }); - } - }); +function reportPlayback(playbackManagerInstance, state, player, reportPlaylist, serverId, method, progressEventName) { + if (!serverId) { + // Not a server item + // We can expand on this later and possibly report them + events.trigger(playbackManagerInstance, 'reportplayback', [false]); + return; + } - return { - maxAudioSampleRate: maxAudioSampleRate, - maxAudioBitDepth: maxAudioBitDepth, - maxAudioBitrate: maxAudioBitrate + const info = Object.assign({}, state.PlayState); + info.ItemId = state.NowPlayingItem.Id; + + if (progressEventName) { + info.EventName = progressEventName; + } + + if (reportPlaylist) { + addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId); + } + + const apiClient = connectionManager.getApiClient(serverId); + const reportPlaybackPromise = apiClient[method](info); + // Notify that report has been sent + reportPlaybackPromise.then(() => { + events.trigger(playbackManagerInstance, 'reportplayback', [true]); + }); +} + +function getPlaylistSync(playbackManagerInstance, player) { + player = player || playbackManagerInstance._currentPlayer; + if (player && !enableLocalPlaylistManagement(player)) { + return player.getPlaylistSync(); + } + + return playbackManagerInstance._playQueueManager.getPlaylist(); +} + +function addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId) { + info.NowPlayingQueue = getPlaylistSync(playbackManagerInstance, player).map(function (i) { + const itemInfo = { + Id: i.Id, + PlaylistItemId: i.PlaylistItemId }; + + if (i.ServerId !== serverId) { + itemInfo.ServerId = i.ServerId; + } + + return itemInfo; + }); +} + +function normalizeName(t) { + return t.toLowerCase().replace(' ', ''); +} + +function getItemsForPlayback(serverId, query) { + const apiClient = connectionManager.getApiClient(serverId); + + if (query.Ids && query.Ids.split(',').length === 1) { + const itemId = query.Ids.split(','); + + return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { + return { + Items: [item], + TotalRecordCount: 1 + }; + }); + } else { + query.Limit = query.Limit || 300; + query.Fields = 'Chapters'; + query.ExcludeLocationTypes = 'Virtual'; + query.EnableTotalRecordCount = false; + query.CollapseBoxSetItems = false; + + return apiClient.getItems(apiClient.getCurrentUserId(), query); + } +} + +function createStreamInfoFromUrlItem(item) { + // Check item.Path for games + return { + url: item.Url || item.Path, + playMethod: 'DirectPlay', + item: item, + textTracks: [], + mediaType: item.MediaType + }; +} + +function mergePlaybackQueries(obj1, obj2) { + const query = Object.assign(obj1, obj2); + + const filters = query.Filters ? query.Filters.split(',') : []; + if (filters.indexOf('IsNotFolder') === -1) { + filters.push('IsNotFolder'); + } + query.Filters = filters.join(','); + return query; +} + +function backdropImageUrl(apiClient, item, options) { + options = options || {}; + options.type = options.type || 'Backdrop'; + + // If not resizing, get the original image + if (!options.maxWidth && !options.width && !options.maxHeight && !options.height) { + options.quality = 100; } - var startingPlaySession = new Date().getTime(); - function getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxAudioSampleRate, maxAudioBitDepth, maxAudioBitrate, startPosition) { - var url = 'Audio/' + item.Id + '/universal'; + if (item.BackdropImageTags && item.BackdropImageTags.length) { + options.tag = item.BackdropImageTags[0]; + return apiClient.getScaledImageUrl(item.Id, options); + } - startingPlaySession++; - return apiClient.getUrl(url, { - UserId: apiClient.getCurrentUserId(), - DeviceId: apiClient.deviceId(), - MaxStreamingBitrate: maxAudioBitrate || maxBitrate, - Container: directPlayContainers, - TranscodingContainer: transcodingProfile.Container || null, - TranscodingProtocol: transcodingProfile.Protocol || null, - AudioCodec: transcodingProfile.AudioCodec, - MaxAudioSampleRate: maxAudioSampleRate, - MaxAudioBitDepth: maxAudioBitDepth, - api_key: apiClient.accessToken(), - PlaySessionId: startingPlaySession, - StartTimeTicks: startPosition || 0, - EnableRedirection: true, - EnableRemoteMedia: apphost.supports('remoteaudio') + if (item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { + options.tag = item.ParentBackdropImageTags[0]; + return apiClient.getScaledImageUrl(item.ParentBackdropItemId, options); + } + + return null; +} + +function getMimeType(type, container) { + container = (container || '').toLowerCase(); + + if (type === 'audio') { + if (container === 'opus') { + return 'audio/ogg'; + } + if (container === 'webma') { + return 'audio/webm'; + } + if (container === 'm4a') { + return 'audio/mp4'; + } + } else if (type === 'video') { + if (container === 'mkv') { + return 'video/x-matroska'; + } + if (container === 'm4v') { + return 'video/mp4'; + } + if (container === 'mov') { + return 'video/quicktime'; + } + if (container === 'mpg') { + return 'video/mpeg'; + } + if (container === 'flv') { + return 'video/x-flv'; + } + } + + return type + '/' + container; +} + +function getParam(name, url) { + name = name.replace(/[\[]/, '\\\[').replace(/[\]]/, '\\\]'); + const regexS = '[\\?&]' + name + '=([^&#]*)'; + const regex = new RegExp(regexS, 'i'); + + const results = regex.exec(url); + if (results == null) { + return ''; + } else { + return decodeURIComponent(results[1].replace(/\+/g, ' ')); + } +} + +function isAutomaticPlayer(player) { + if (player.isLocalPlayer) { + return true; + } + + return false; +} + +function getAutomaticPlayers(instance, forceLocalPlayer) { + if (!forceLocalPlayer) { + const player = instance._currentPlayer; + if (player && !isAutomaticPlayer(player)) { + return [player]; + } + } + + return instance.getPlayers().filter(isAutomaticPlayer); +} + +function isServerItem(item) { + if (!item.Id) { + return false; + } + return true; +} + +function enableIntros(item) { + if (item.MediaType !== 'Video') { + return false; + } + if (item.Type === 'TvChannel') { + return false; + } + // disable for in-progress recordings + if (item.Status === 'InProgress') { + return false; + } + + return isServerItem(item); +} + +function getIntros(firstItem, apiClient, options) { + if (options.startPositionTicks || options.startIndex || options.fullscreen === false || !enableIntros(firstItem) || !userSettings.enableCinemaMode()) { + return Promise.resolve({ + Items: [] }); } - function getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, apiClient, startPosition) { - var transcodingProfile = deviceProfile.TranscodingProfiles.filter(function (p) { - return p.Type === 'Audio' && p.Context === 'Streaming'; + return apiClient.getIntros(firstItem.Id).then(function (result) { + return result; + }, function (err) { + return Promise.resolve({ + Items: [] + }); + }); +} + +function getAudioMaxValues(deviceProfile) { + // TODO - this could vary per codec and should be done on the server using the entire profile + let maxAudioSampleRate = null; + let maxAudioBitDepth = null; + let maxAudioBitrate = null; + + deviceProfile.CodecProfiles.map(function (codecProfile) { + if (codecProfile.Type === 'Audio') { + (codecProfile.Conditions || []).map(function (condition) { + if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitDepth') { + return maxAudioBitDepth = condition.Value; + } else if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioSampleRate') { + return maxAudioSampleRate = condition.Value; + } else if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitrate') { + return maxAudioBitrate = condition.Value; + } + }); + } + }); + + return { + maxAudioSampleRate: maxAudioSampleRate, + maxAudioBitDepth: maxAudioBitDepth, + maxAudioBitrate: maxAudioBitrate + }; +} + +let startingPlaySession = new Date().getTime(); +function getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxAudioSampleRate, maxAudioBitDepth, maxAudioBitrate, startPosition) { + const url = 'Audio/' + item.Id + '/universal'; + + startingPlaySession++; + return apiClient.getUrl(url, { + UserId: apiClient.getCurrentUserId(), + DeviceId: apiClient.deviceId(), + MaxStreamingBitrate: maxAudioBitrate || maxBitrate, + Container: directPlayContainers, + TranscodingContainer: transcodingProfile.Container || null, + TranscodingProtocol: transcodingProfile.Protocol || null, + AudioCodec: transcodingProfile.AudioCodec, + MaxAudioSampleRate: maxAudioSampleRate, + MaxAudioBitDepth: maxAudioBitDepth, + api_key: apiClient.accessToken(), + PlaySessionId: startingPlaySession, + StartTimeTicks: startPosition || 0, + EnableRedirection: true, + EnableRemoteMedia: appHost.supports('remoteaudio') + }); +} + +function getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, apiClient, startPosition) { + const transcodingProfile = deviceProfile.TranscodingProfiles.filter(function (p) { + return p.Type === 'Audio' && p.Context === 'Streaming'; + })[0]; + + let directPlayContainers = ''; + + deviceProfile.DirectPlayProfiles.map(function (p) { + if (p.Type === 'Audio') { + if (directPlayContainers) { + directPlayContainers += ',' + p.Container; + } else { + directPlayContainers = p.Container; + } + + if (p.AudioCodec) { + directPlayContainers += '|' + p.AudioCodec; + } + } + }); + + const maxValues = getAudioMaxValues(deviceProfile); + + return getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition); +} + +function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) { + const audioTranscodingProfile = deviceProfile.TranscodingProfiles.filter(function (p) { + return p.Type === 'Audio' && p.Context === 'Streaming'; + })[0]; + + let audioDirectPlayContainers = ''; + + deviceProfile.DirectPlayProfiles.map(function (p) { + if (p.Type === 'Audio') { + if (audioDirectPlayContainers) { + audioDirectPlayContainers += ',' + p.Container; + } else { + audioDirectPlayContainers = p.Container; + } + + if (p.AudioCodec) { + audioDirectPlayContainers += '|' + p.AudioCodec; + } + } + }); + + const maxValues = getAudioMaxValues(deviceProfile); + + const streamUrls = []; + + for (let i = 0, length = items.length; i < length; i++) { + const item = items[i]; + let streamUrl; + + if (item.MediaType === 'Audio' && !itemHelper.isLocalItem(item)) { + streamUrl = getAudioStreamUrl(item, audioTranscodingProfile, audioDirectPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition); + } + + streamUrls.push(streamUrl || ''); + + if (i === 0) { + startPosition = 0; + } + } + + return Promise.resolve(streamUrls); +} + +function setStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) { + return getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition).then(function (streamUrls) { + for (let i = 0, length = items.length; i < length; i++) { + const item = items[i]; + const streamUrl = streamUrls[i]; + + if (streamUrl) { + item.PresetMediaSource = { + StreamUrl: streamUrl, + Id: item.Id, + MediaStreams: [], + RunTimeTicks: item.RunTimeTicks + }; + } + } + }); +} + +function getPlaybackInfo(player, + apiClient, + item, + deviceProfile, + maxBitrate, + startPosition, + isPlayback, + mediaSourceId, + audioStreamIndex, + subtitleStreamIndex, + liveStreamId, + enableDirectPlay, + enableDirectStream, + allowVideoStreamCopy, + allowAudioStreamCopy) { + if (!itemHelper.isLocalItem(item) && item.MediaType === 'Audio') { + return Promise.resolve({ + MediaSources: [ + { + StreamUrl: getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, apiClient, startPosition), + Id: item.Id, + MediaStreams: [], + RunTimeTicks: item.RunTimeTicks + }] + }); + } + + if (item.PresetMediaSource) { + return Promise.resolve({ + MediaSources: [item.PresetMediaSource] + }); + } + + const itemId = item.Id; + + const query = { + UserId: apiClient.getCurrentUserId(), + StartTimeTicks: startPosition || 0 + }; + + if (isPlayback) { + query.IsPlayback = true; + query.AutoOpenLiveStream = true; + } else { + query.IsPlayback = false; + query.AutoOpenLiveStream = false; + } + + if (audioStreamIndex != null) { + query.AudioStreamIndex = audioStreamIndex; + } + if (subtitleStreamIndex != null) { + query.SubtitleStreamIndex = subtitleStreamIndex; + } + if (enableDirectPlay != null) { + query.EnableDirectPlay = enableDirectPlay; + } + + if (enableDirectStream != null) { + query.EnableDirectStream = enableDirectStream; + } + if (allowVideoStreamCopy != null) { + query.AllowVideoStreamCopy = allowVideoStreamCopy; + } + if (allowAudioStreamCopy != null) { + query.AllowAudioStreamCopy = allowAudioStreamCopy; + } + if (mediaSourceId) { + query.MediaSourceId = mediaSourceId; + } + if (liveStreamId) { + query.LiveStreamId = liveStreamId; + } + if (maxBitrate) { + query.MaxStreamingBitrate = maxBitrate; + } + if (player.enableMediaProbe && !player.enableMediaProbe(item)) { + query.EnableMediaProbe = false; + } + + // lastly, enforce player overrides for special situations + if (query.EnableDirectStream !== false) { + if (player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item)) { + query.EnableDirectStream = false; + } + } + + if (player.getDirectPlayProtocols) { + query.DirectPlayProtocols = player.getDirectPlayProtocols(); + } + + return apiClient.getPlaybackInfo(itemId, query, deviceProfile); +} + +function getOptimalMediaSource(apiClient, item, versions) { + const promises = versions.map(function (v) { + return supportsDirectPlay(apiClient, item, v); + }); + + if (!promises.length) { + return Promise.reject(); + } + + return Promise.all(promises).then(function (results) { + for (let i = 0, length = versions.length; i < length; i++) { + versions[i].enableDirectPlay = results[i] || false; + } + let optimalVersion = versions.filter(function (v) { + return v.enableDirectPlay; })[0]; - var directPlayContainers = ''; + if (!optimalVersion) { + optimalVersion = versions.filter(function (v) { + return v.SupportsDirectStream; + })[0]; + } - deviceProfile.DirectPlayProfiles.map(function (p) { - if (p.Type === 'Audio') { - if (directPlayContainers) { - directPlayContainers += ',' + p.Container; - } else { - directPlayContainers = p.Container; - } - - if (p.AudioCodec) { - directPlayContainers += '|' + p.AudioCodec; - } - } - }); - - var maxValues = getAudioMaxValues(deviceProfile); - - return getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition); - } - - function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) { - var audioTranscodingProfile = deviceProfile.TranscodingProfiles.filter(function (p) { - return p.Type === 'Audio' && p.Context === 'Streaming'; + optimalVersion = optimalVersion || versions.filter(function (s) { + return s.SupportsTranscoding; })[0]; - var audioDirectPlayContainers = ''; + return optimalVersion || versions[0]; + }); +} - deviceProfile.DirectPlayProfiles.map(function (p) { - if (p.Type === 'Audio') { - if (audioDirectPlayContainers) { - audioDirectPlayContainers += ',' + p.Container; - } else { - audioDirectPlayContainers = p.Container; - } +function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, maxBitrate, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex) { + const postData = { + DeviceProfile: deviceProfile, + OpenToken: mediaSource.OpenToken + }; - if (p.AudioCodec) { - audioDirectPlayContainers += '|' + p.AudioCodec; + const query = { + UserId: apiClient.getCurrentUserId(), + StartTimeTicks: startPosition || 0, + ItemId: item.Id, + PlaySessionId: playSessionId + }; + + if (maxBitrate) { + query.MaxStreamingBitrate = maxBitrate; + } + if (audioStreamIndex != null) { + query.AudioStreamIndex = audioStreamIndex; + } + if (subtitleStreamIndex != null) { + query.SubtitleStreamIndex = subtitleStreamIndex; + } + + // lastly, enforce player overrides for special situations + if (query.EnableDirectStream !== false) { + if (player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item)) { + query.EnableDirectStream = false; + } + } + + return apiClient.ajax({ + url: apiClient.getUrl('LiveStreams/Open', query), + type: 'POST', + data: JSON.stringify(postData), + contentType: 'application/json', + dataType: 'json' + + }); +} + +function isHostReachable(mediaSource, apiClient) { + if (mediaSource.IsRemote) { + return Promise.resolve(true); + } + + return apiClient.getEndpointInfo().then(function (endpointInfo) { + if (endpointInfo.IsInNetwork) { + if (!endpointInfo.IsLocal) { + const path = (mediaSource.Path || '').toLowerCase(); + if (path.indexOf('localhost') !== -1 || path.indexOf('127.0.0.1') !== -1) { + // This will only work if the app is on the same machine as the server + return Promise.resolve(false); } } - }); - var maxValues = getAudioMaxValues(deviceProfile); - - var streamUrls = []; - - for (var i = 0, length = items.length; i < length; i++) { - var item = items[i]; - var streamUrl; - - if (item.MediaType === 'Audio' && !itemHelper.isLocalItem(item)) { - streamUrl = getAudioStreamUrl(item, audioTranscodingProfile, audioDirectPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition); - } - - streamUrls.push(streamUrl || ''); - - if (i === 0) { - startPosition = 0; - } - } - - return Promise.resolve(streamUrls); - } - - function setStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) { - return getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition).then(function (streamUrls) { - for (var i = 0, length = items.length; i < length; i++) { - var item = items[i]; - var streamUrl = streamUrls[i]; - - if (streamUrl) { - item.PresetMediaSource = { - StreamUrl: streamUrl, - Id: item.Id, - MediaStreams: [], - RunTimeTicks: item.RunTimeTicks - }; - } - } - }); - } - - function getPlaybackInfo(player, - apiClient, - item, - deviceProfile, - maxBitrate, - startPosition, - isPlayback, - mediaSourceId, - audioStreamIndex, - subtitleStreamIndex, - liveStreamId, - enableDirectPlay, - enableDirectStream, - allowVideoStreamCopy, - allowAudioStreamCopy) { - if (!itemHelper.isLocalItem(item) && item.MediaType === 'Audio') { - return Promise.resolve({ - MediaSources: [ - { - StreamUrl: getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, apiClient, startPosition), - Id: item.Id, - MediaStreams: [], - RunTimeTicks: item.RunTimeTicks - }] - }); - } - - if (item.PresetMediaSource) { - return Promise.resolve({ - MediaSources: [item.PresetMediaSource] - }); - } - - var itemId = item.Id; - - var query = { - UserId: apiClient.getCurrentUserId(), - StartTimeTicks: startPosition || 0 - }; - - if (isPlayback) { - query.IsPlayback = true; - query.AutoOpenLiveStream = true; - } else { - query.IsPlayback = false; - query.AutoOpenLiveStream = false; - } - - if (audioStreamIndex != null) { - query.AudioStreamIndex = audioStreamIndex; - } - if (subtitleStreamIndex != null) { - query.SubtitleStreamIndex = subtitleStreamIndex; - } - if (enableDirectPlay != null) { - query.EnableDirectPlay = enableDirectPlay; - } - - if (enableDirectStream != null) { - query.EnableDirectStream = enableDirectStream; - } - if (allowVideoStreamCopy != null) { - query.AllowVideoStreamCopy = allowVideoStreamCopy; - } - if (allowAudioStreamCopy != null) { - query.AllowAudioStreamCopy = allowAudioStreamCopy; - } - if (mediaSourceId) { - query.MediaSourceId = mediaSourceId; - } - if (liveStreamId) { - query.LiveStreamId = liveStreamId; - } - if (maxBitrate) { - query.MaxStreamingBitrate = maxBitrate; - } - if (player.enableMediaProbe && !player.enableMediaProbe(item)) { - query.EnableMediaProbe = false; - } - - // lastly, enforce player overrides for special situations - if (query.EnableDirectStream !== false) { - if (player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item)) { - query.EnableDirectStream = false; - } - } - - if (player.getDirectPlayProtocols) { - query.DirectPlayProtocols = player.getDirectPlayProtocols(); - } - - return apiClient.getPlaybackInfo(itemId, query, deviceProfile); - } - - function getOptimalMediaSource(apiClient, item, versions) { - var promises = versions.map(function (v) { - return supportsDirectPlay(apiClient, item, v); - }); - - if (!promises.length) { - return Promise.reject(); - } - - return Promise.all(promises).then(function (results) { - for (var i = 0, length = versions.length; i < length; i++) { - versions[i].enableDirectPlay = results[i] || false; - } - var optimalVersion = versions.filter(function (v) { - return v.enableDirectPlay; - })[0]; - - if (!optimalVersion) { - optimalVersion = versions.filter(function (v) { - return v.SupportsDirectStream; - })[0]; - } - - optimalVersion = optimalVersion || versions.filter(function (s) { - return s.SupportsTranscoding; - })[0]; - - return optimalVersion || versions[0]; - }); - } - - function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, maxBitrate, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex) { - var postData = { - DeviceProfile: deviceProfile, - OpenToken: mediaSource.OpenToken - }; - - var query = { - UserId: apiClient.getCurrentUserId(), - StartTimeTicks: startPosition || 0, - ItemId: item.Id, - PlaySessionId: playSessionId - }; - - if (maxBitrate) { - query.MaxStreamingBitrate = maxBitrate; - } - if (audioStreamIndex != null) { - query.AudioStreamIndex = audioStreamIndex; - } - if (subtitleStreamIndex != null) { - query.SubtitleStreamIndex = subtitleStreamIndex; - } - - // lastly, enforce player overrides for special situations - if (query.EnableDirectStream !== false) { - if (player.supportsPlayMethod && !player.supportsPlayMethod('DirectStream', item)) { - query.EnableDirectStream = false; - } - } - - return apiClient.ajax({ - url: apiClient.getUrl('LiveStreams/Open', query), - type: 'POST', - data: JSON.stringify(postData), - contentType: 'application/json', - dataType: 'json' - - }); - } - - function isHostReachable(mediaSource, apiClient) { - if (mediaSource.IsRemote) { return Promise.resolve(true); } - return apiClient.getEndpointInfo().then(function (endpointInfo) { - if (endpointInfo.IsInNetwork) { - if (!endpointInfo.IsLocal) { - var path = (mediaSource.Path || '').toLowerCase(); - if (path.indexOf('localhost') !== -1 || path.indexOf('127.0.0.1') !== -1) { - // This will only work if the app is on the same machine as the server - return Promise.resolve(false); - } - } + // media source is in network, but connection is out of network + return Promise.resolve(false); + }); +} - return Promise.resolve(true); - } +function supportsDirectPlay(apiClient, item, mediaSource) { + // folder rip hacks due to not yet being supported by the stream building engine + const isFolderRip = mediaSource.VideoType === 'BluRay' || mediaSource.VideoType === 'Dvd' || mediaSource.VideoType === 'HdDvd'; - // media source is in network, but connection is out of network + if (mediaSource.SupportsDirectPlay || isFolderRip) { + if (mediaSource.IsRemote && !appHost.supports('remotevideo')) { return Promise.resolve(false); - }); - } + } - function supportsDirectPlay(apiClient, item, mediaSource) { - // folder rip hacks due to not yet being supported by the stream building engine - var isFolderRip = mediaSource.VideoType === 'BluRay' || mediaSource.VideoType === 'Dvd' || mediaSource.VideoType === 'HdDvd'; - - if (mediaSource.SupportsDirectPlay || isFolderRip) { - if (mediaSource.IsRemote && !apphost.supports('remotevideo')) { - return Promise.resolve(false); + if (mediaSource.Protocol === 'Http' && !mediaSource.RequiredHttpHeaders.length) { + // If this is the only way it can be played, then allow it + if (!mediaSource.SupportsDirectStream && !mediaSource.SupportsTranscoding) { + return Promise.resolve(true); + } else { + return isHostReachable(mediaSource, apiClient); } + } else if (mediaSource.Protocol === 'File') { + return new Promise(function (resolve, reject) { + // Determine if the file can be accessed directly + import('filesystem').then((filesystem) => { + const method = isFolderRip ? + 'directoryExists' : + 'fileExists'; - if (mediaSource.Protocol === 'Http' && !mediaSource.RequiredHttpHeaders.length) { - // If this is the only way it can be played, then allow it - if (!mediaSource.SupportsDirectStream && !mediaSource.SupportsTranscoding) { - return Promise.resolve(true); - } else { - return isHostReachable(mediaSource, apiClient); - } - } else if (mediaSource.Protocol === 'File') { - return new Promise(function (resolve, reject) { - // Determine if the file can be accessed directly - require(['filesystem'], function (filesystem) { - var method = isFolderRip ? - 'directoryExists' : - 'fileExists'; - - filesystem[method](mediaSource.Path).then(function () { - resolve(true); - }, function () { - resolve(false); - }); + filesystem[method](mediaSource.Path).then(function () { + resolve(true); + }, function () { + resolve(false); }); }); - } - } - - return Promise.resolve(false); - } - - function validatePlaybackInfoResult(instance, result) { - if (result.ErrorCode) { - showPlaybackInfoErrorMessage(instance, result.ErrorCode); - return false; - } - - return true; - } - - function showPlaybackInfoErrorMessage(instance, errorCode, playNextTrack) { - require(['alert'], function (alert) { - alert.default({ - text: globalize.translate('PlaybackError' + errorCode), - title: globalize.translate('HeaderPlaybackError') - }).then(function () { - if (playNextTrack) { - instance.nextTrack(); - } }); + } + } + + return Promise.resolve(false); +} + +function validatePlaybackInfoResult(instance, result) { + if (result.ErrorCode) { + showPlaybackInfoErrorMessage(instance, result.ErrorCode); + return false; + } + + return true; +} + +function showPlaybackInfoErrorMessage(instance, errorCode, playNextTrack) { + import('alert').then(({ default: alert }) => { + alert({ + text: globalize.translate('PlaybackError' + errorCode), + title: globalize.translate('HeaderPlaybackError') + }).then(function () { + if (playNextTrack) { + instance.nextTrack(); + } }); + }); +} + +function normalizePlayOptions(playOptions) { + playOptions.fullscreen = playOptions.fullscreen !== false; +} + +function truncatePlayOptions(playOptions) { + return { + fullscreen: playOptions.fullscreen, + mediaSourceId: playOptions.mediaSourceId, + audioStreamIndex: playOptions.audioStreamIndex, + subtitleStreamIndex: playOptions.subtitleStreamIndex, + startPositionTicks: playOptions.startPositionTicks + }; +} + +function getNowPlayingItemForReporting(player, item, mediaSource) { + const nowPlayingItem = Object.assign({}, item); + + if (mediaSource) { + nowPlayingItem.RunTimeTicks = mediaSource.RunTimeTicks; + nowPlayingItem.MediaStreams = mediaSource.MediaStreams; + + // not needed + nowPlayingItem.MediaSources = null; } - function normalizePlayOptions(playOptions) { - playOptions.fullscreen = playOptions.fullscreen !== false; + nowPlayingItem.RunTimeTicks = nowPlayingItem.RunTimeTicks || player.duration() * 10000; + + return nowPlayingItem; +} + +function displayPlayerIndividually(player) { + return !player.isLocalPlayer; +} + +function createTarget(instance, player) { + return { + name: player.name, + id: player.id, + playerName: player.name, + playableMediaTypes: ['Audio', 'Video', 'Photo', 'Book'].map(player.canPlayMediaType), + isLocalPlayer: player.isLocalPlayer, + supportedCommands: instance.getSupportedCommands(player) + }; +} + +function getPlayerTargets(player) { + if (player.getTargets) { + return player.getTargets(); } - function truncatePlayOptions(playOptions) { - return { - fullscreen: playOptions.fullscreen, - mediaSourceId: playOptions.mediaSourceId, - audioStreamIndex: playOptions.audioStreamIndex, - subtitleStreamIndex: playOptions.subtitleStreamIndex, - startPositionTicks: playOptions.startPositionTicks - }; - } + return Promise.resolve([createTarget(player)]); +} - function getNowPlayingItemForReporting(player, item, mediaSource) { - var nowPlayingItem = Object.assign({}, item); +function sortPlayerTargets(a, b) { + let aVal = a.isLocalPlayer ? 0 : 1; + let bVal = b.isLocalPlayer ? 0 : 1; - if (mediaSource) { - nowPlayingItem.RunTimeTicks = mediaSource.RunTimeTicks; - nowPlayingItem.MediaStreams = mediaSource.MediaStreams; + aVal = aVal.toString() + a.name; + bVal = bVal.toString() + b.name; - // not needed - nowPlayingItem.MediaSources = null; - } + return aVal.localeCompare(bVal); +} - nowPlayingItem.RunTimeTicks = nowPlayingItem.RunTimeTicks || player.duration() * 10000; +class PlaybackManager { + constructor() { + const self = this; - return nowPlayingItem; - } - - function displayPlayerIndividually(player) { - return !player.isLocalPlayer; - } - - function createTarget(instance, player) { - return { - name: player.name, - id: player.id, - playerName: player.name, - playableMediaTypes: ['Audio', 'Video', 'Photo', 'Book'].map(player.canPlayMediaType), - isLocalPlayer: player.isLocalPlayer, - supportedCommands: instance.getSupportedCommands(player) - }; - } - - function getPlayerTargets(player) { - if (player.getTargets) { - return player.getTargets(); - } - - return Promise.resolve([createTarget(player)]); - } - - function sortPlayerTargets(a, b) { - var aVal = a.isLocalPlayer ? 0 : 1; - var bVal = b.isLocalPlayer ? 0 : 1; - - aVal = aVal.toString() + a.name; - bVal = bVal.toString() + b.name; - - return aVal.localeCompare(bVal); - } - - function PlaybackManager() { - var self = this; - - var players = []; - var currentTargetInfo; - var currentPairingId = null; + const players = []; + let currentTargetInfo; + let currentPairingId = null; this._playNextAfterEnded = true; - var playerStates = {}; + const playerStates = {}; this._playQueueManager = new PlayQueueManager(); @@ -736,7 +745,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.currentItem(); } - var data = getPlayerData(player); + const data = getPlayerData(player); return data.streamInfo ? data.streamInfo.item : null; }; @@ -749,7 +758,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.currentMediaSource(); } - var data = getPlayerData(player); + const data = getPlayerData(player); return data.streamInfo ? data.streamInfo.mediaSource : null; }; @@ -762,7 +771,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.playMethod(); } - var data = getPlayerData(player); + const data = getPlayerData(player); return data.streamInfo ? data.streamInfo.playMethod : null; }; @@ -775,21 +784,20 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.playSessionId(); } - var data = getPlayerData(player); + const data = getPlayerData(player); return data.streamInfo ? data.streamInfo.playSessionId : null; }; self.getPlayerInfo = function () { - var player = self._currentPlayer; + const player = self._currentPlayer; if (!player) { return null; } - var target = currentTargetInfo || {}; + const target = currentTargetInfo || {}; return { - name: player.name, isLocalPlayer: player.isLocalPlayer, id: target.id, @@ -845,7 +853,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla currentPairingId = targetInfo.id; - var promise = player.tryPair ? + const promise = player.tryPair ? player.tryPair(targetInfo) : Promise.resolve(); @@ -863,11 +871,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla }; self.getTargets = function () { - var promises = players.filter(displayPlayerIndividually).map(getPlayerTargets); + const promises = players.filter(displayPlayerIndividually).map(getPlayerTargets); return Promise.all(promises).then(function (responses) { return connectionManager.currentApiClient().getCurrentUser().then(function (user) { - var targets = []; + const targets = []; targets.push({ name: globalize.translate('HeaderMyDevice'), @@ -881,10 +889,10 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla user: user }); - for (var i = 0; i < responses.length; i++) { - var subTargets = responses[i]; + for (let i = 0; i < responses.length; i++) { + const subTargets = responses[i]; - for (var j = 0; j < subTargets.length; j++) { + for (let j = 0; j < subTargets.length; j++) { targets.push(subTargets[j]); } } @@ -899,7 +907,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla throw new Error('player cannot be null'); } - var index = getPlayerData(player).subtitleStreamIndex; + const index = getPlayerData(player).subtitleStreamIndex; if (index == null || index === -1) { return null; @@ -928,7 +936,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla }; function removeCurrentPlayer(player) { - var previousPlayer = self._currentPlayer; + const previousPlayer = self._currentPlayer; if (!previousPlayer || player.id === previousPlayer.id) { setCurrentPlayerInternal(null); @@ -936,8 +944,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function setCurrentPlayerInternal(player, targetInfo) { - var previousPlayer = self._currentPlayer; - var previousTargetInfo = currentTargetInfo; + const previousPlayer = self._currentPlayer; + const previousTargetInfo = currentTargetInfo; if (player && !targetInfo && player.isLocalPlayer) { targetInfo = createTarget(self, player); @@ -988,7 +996,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } if (self.isPlaying(player)) { - var playerData = getPlayerData(player); + const playerData = getPlayerData(player); return playerData.streamInfo.mediaType === mediaType; } @@ -1027,7 +1035,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } self.canPlay = function (item) { - var itemType = item.Type; + const itemType = item.Type; if (itemType === 'PhotoAlbum' || itemType === 'MusicGenre' || itemType === 'Season' || itemType === 'Series' || itemType === 'BoxSet' || itemType === 'MusicAlbum' || itemType === 'MusicArtist' || itemType === 'Playlist') { return true; @@ -1057,12 +1065,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla player = player || self._currentPlayer; if (player) { - var current = self.getAspectRatio(player); + const current = self.getAspectRatio(player); - var supported = self.getSupportedAspectRatios(player); + const supported = self.getSupportedAspectRatios(player); - var index = -1; - for (var i = 0, length = supported.length; i < length; i++) { + let index = -1; + for (let i = 0, length = supported.length; i < length; i++) { if (supported[i].id === current) { index = i; break; @@ -1104,7 +1112,53 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } }; - var brightnessOsdLoaded; + self.increasePlaybackRate = function (player) { + player = player || self._currentPlayer; + if (player) { + let current = self.getPlaybackRate(player); + let supported = self.getSupportedPlaybackRates(player); + + let index = -1; + for (let i = 0, length = supported.length; i < length; i++) { + if (supported[i].id === current) { + index = i; + break; + } + } + + index = Math.min(index + 1, supported.length - 1); + self.setPlaybackRate(supported[index].id, player); + } + }; + + self.decreasePlaybackRate = function (player) { + player = player || self._currentPlayer; + if (player) { + let current = self.getPlaybackRate(player); + let supported = self.getSupportedPlaybackRates(player); + + let index = -1; + for (let i = 0, length = supported.length; i < length; i++) { + if (supported[i].id === current) { + index = i; + break; + } + } + + index = Math.max(index - 1, 0); + self.setPlaybackRate(supported[index].id, player); + } + }; + + self.getSupportedPlaybackRates = function (player) { + player = player || self._currentPlayer; + if (player && player.getSupportedPlaybackRates) { + return player.getSupportedPlaybackRates(); + } + return []; + }; + + let brightnessOsdLoaded; self.setBrightness = function (val, player) { player = player || self._currentPlayer; @@ -1112,7 +1166,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla if (!brightnessOsdLoaded) { brightnessOsdLoaded = true; // TODO: Have this trigger an event instead to get the osd out of here - require(['brightnessOsd']); + import('brightnessOsd').then(); } player.setBrightness(val); } @@ -1168,11 +1222,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return; } - var currentMediaSource = self.currentMediaSource(player); - var mediaStreams = []; - var i; - var length; - for (i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) { + const currentMediaSource = self.currentMediaSource(player); + const mediaStreams = []; + for (let i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) { if (currentMediaSource.MediaStreams[i].Type === 'Audio') { mediaStreams.push(currentMediaSource.MediaStreams[i]); } @@ -1183,16 +1235,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return; } - var currentStreamIndex = self.getAudioStreamIndex(player); - var indexInList = -1; - for (i = 0, length = mediaStreams.length; i < length; i++) { + const currentStreamIndex = self.getAudioStreamIndex(player); + let indexInList = -1; + for (let i = 0, length = mediaStreams.length; i < length; i++) { if (mediaStreams[i].Index === currentStreamIndex) { indexInList = i; break; } } - var nextIndex = indexInList + 1; + let nextIndex = indexInList + 1; if (nextIndex >= mediaStreams.length) { nextIndex = 0; } @@ -1212,11 +1264,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return; } - var currentMediaSource = self.currentMediaSource(player); - var mediaStreams = []; - var i; - var length; - for (i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) { + const currentMediaSource = self.currentMediaSource(player); + const mediaStreams = []; + for (let i = 0, length = currentMediaSource.MediaStreams.length; i < length; i++) { if (currentMediaSource.MediaStreams[i].Type === 'Subtitle') { mediaStreams.push(currentMediaSource.MediaStreams[i]); } @@ -1227,16 +1277,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return; } - var currentStreamIndex = self.getSubtitleStreamIndex(player); - var indexInList = -1; - for (i = 0, length = mediaStreams.length; i < length; i++) { + const currentStreamIndex = self.getSubtitleStreamIndex(player); + let indexInList = -1; + for (let i = 0, length = mediaStreams.length; i < length; i++) { if (mediaStreams[i].Index === currentStreamIndex) { indexInList = i; break; } } - var nextIndex = indexInList + 1; + let nextIndex = indexInList + 1; if (nextIndex >= mediaStreams.length) { nextIndex = -1; } @@ -1256,12 +1306,10 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla }; function isAudioStreamSupported(mediaSource, index, deviceProfile) { - var mediaStream; - var i; - var length; - var mediaStreams = mediaSource.MediaStreams; + let mediaStream; + const mediaStreams = mediaSource.MediaStreams; - for (i = 0, length = mediaStreams.length; i < length; i++) { + for (let i = 0, length = mediaStreams.length; i < length; i++) { if (mediaStreams[i].Type === 'Audio' && mediaStreams[i].Index === index) { mediaStream = mediaStreams[i]; break; @@ -1272,13 +1320,13 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return false; } - var codec = (mediaStream.Codec || '').toLowerCase(); + const codec = (mediaStream.Codec || '').toLowerCase(); if (!codec) { return false; } - var profiles = deviceProfile.DirectPlayProfiles || []; + const profiles = deviceProfile.DirectPlayProfiles || []; return profiles.filter(function (p) { if (p.Type === 'Video') { @@ -1327,7 +1375,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla apiClient = connectionManager.currentApiClient(); } - var endpointInfo = apiClient.getSavedEndpointInfo() || {}; + const endpointInfo = apiClient.getSavedEndpointInfo() || {}; return appSettings.maxStreamingBitrate(endpointInfo.IsInNetwork, mediaType); } @@ -1338,16 +1386,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.getMaxStreamingBitrate(); } - var playerData = getPlayerData(player); + const playerData = getPlayerData(player); if (playerData.maxStreamingBitrate) { return playerData.maxStreamingBitrate; } - var mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null; - var currentItem = self.currentItem(player); + const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null; + const currentItem = self.currentItem(player); - var apiClient = currentItem ? connectionManager.getApiClient(currentItem.ServerId) : connectionManager.currentApiClient(); + const apiClient = currentItem ? connectionManager.getApiClient(currentItem.ServerId) : connectionManager.currentApiClient(); return getSavedMaxStreamingBitrate(apiClient, mediaType); }; @@ -1357,12 +1405,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.enableAutomaticBitrateDetection(); } - var playerData = getPlayerData(player); - var mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null; - var currentItem = self.currentItem(player); + const playerData = getPlayerData(player); + const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null; + const currentItem = self.currentItem(player); - var apiClient = currentItem ? connectionManager.getApiClient(currentItem.ServerId) : connectionManager.currentApiClient(); - var endpointInfo = apiClient.getSavedEndpointInfo() || {}; + const apiClient = currentItem ? connectionManager.getApiClient(currentItem.ServerId) : connectionManager.currentApiClient(); + const endpointInfo = apiClient.getSavedEndpointInfo() || {}; return appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType); }; @@ -1373,13 +1421,13 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.setMaxStreamingBitrate(options); } - var apiClient = connectionManager.getApiClient(self.currentItem(player).ServerId); + const apiClient = connectionManager.getApiClient(self.currentItem(player).ServerId); apiClient.getEndpointInfo().then(function (endpointInfo) { - var playerData = getPlayerData(player); - var mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null; + const playerData = getPlayerData(player); + const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null; - var promise; + let promise; if (options.enableAutomaticBitrateDetection) { appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType, true); promise = apiClient.detectBitrate(true); @@ -1414,8 +1462,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla self.toggleFullscreen = function (player) { player = player || self._currentPlayer; - if (!player.isLocalPlayer || player.toggleFulscreen) { - return player.toggleFulscreen(); + if (!player.isLocalPlayer || player.toggleFullscreen) { + return player.toggleFullscreen(); } if (screenfull.isEnabled) { @@ -1472,17 +1520,17 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.setSubtitleStreamIndex(index); } - var currentStream = getCurrentSubtitleStream(player); + const currentStream = getCurrentSubtitleStream(player); - var newStream = getSubtitleStream(player, index); + const newStream = getSubtitleStream(player, index); if (!currentStream && !newStream) { return; } - var selectedTrackElementIndex = -1; + let selectedTrackElementIndex = -1; - var currentPlayMethod = self.playMethod(player); + const currentPlayMethod = self.playMethod(player); if (currentStream && !newStream) { if (getDeliveryMethod(currentStream) === 'Encode' || (getDeliveryMethod(currentStream) === 'Embed' && currentPlayMethod === 'Transcode')) { @@ -1519,30 +1567,30 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla getPlayerData(player).subtitleStreamIndex = index; }; - self.supportSubtitleOffset = function(player) { + self.supportSubtitleOffset = function (player) { player = player || self._currentPlayer; return player && 'setSubtitleOffset' in player; }; - self.enableShowingSubtitleOffset = function(player) { + self.enableShowingSubtitleOffset = function (player) { player = player || self._currentPlayer; player.enableShowingSubtitleOffset(); }; - self.disableShowingSubtitleOffset = function(player) { + self.disableShowingSubtitleOffset = function (player) { player = player || self._currentPlayer; if (player.disableShowingSubtitleOffset) { player.disableShowingSubtitleOffset(); } }; - self.isShowingSubtitleOffsetEnabled = function(player) { + self.isShowingSubtitleOffsetEnabled = function (player) { player = player || self._currentPlayer; return player.isShowingSubtitleOffsetEnabled(); }; - self.isSubtitleStreamExternal = function(index, player) { - var stream = getSubtitleStream(player, index); + self.isSubtitleStreamExternal = function (index, player) { + const stream = getSubtitleStream(player, index); return stream ? getDeliveryMethod(stream) === 'External' : false; }; @@ -1553,15 +1601,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } }; - self.getPlayerSubtitleOffset = function(player) { + self.getPlayerSubtitleOffset = function (player) { player = player || self._currentPlayer; if (player.getSubtitleOffset) { return player.getSubtitleOffset(); } }; - self.canHandleOffsetOnCurrentSubtitle = function(player) { - var index = self.getSubtitleStreamIndex(player); + self.canHandleOffsetOnCurrentSubtitle = function (player) { + const index = self.getSubtitleStreamIndex(player); return index !== -1 && self.isSubtitleStreamExternal(index, player); }; @@ -1590,7 +1638,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } } - var ticks = getCurrentTicks(player) + offsetTicks; + const ticks = getCurrentTicks(player) + offsetTicks; return this.seek(ticks, player); }; @@ -1600,9 +1648,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla throw new Error('player cannot be null'); } - var playerData = getPlayerData(player); + const playerData = getPlayerData(player); - var currentSrc = (playerData.streamInfo.url || '').toLowerCase(); + const currentSrc = (playerData.streamInfo.url || '').toLowerCase(); if (currentSrc.indexOf('.m3u8') !== -1) { return true; @@ -1612,7 +1660,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.seekable(); } - var isPlayMethodTranscode = self.playMethod(player) === 'Transcode'; + const isPlayMethodTranscode = self.playMethod(player) === 'Transcode'; if (isPlayMethodTranscode) { return false; @@ -1629,37 +1677,35 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla params = params || {}; - var liveStreamId = getPlayerData(player).streamInfo.liveStreamId; - var lastMediaInfoQuery = getPlayerData(player).streamInfo.lastMediaInfoQuery; + const liveStreamId = getPlayerData(player).streamInfo.liveStreamId; + const lastMediaInfoQuery = getPlayerData(player).streamInfo.lastMediaInfoQuery; - var playSessionId = self.playSessionId(player); + const playSessionId = self.playSessionId(player); - var currentItem = self.currentItem(player); + const currentItem = self.currentItem(player); player.getDeviceProfile(currentItem, { - isRetry: params.EnableDirectPlay === false - }).then(function (deviceProfile) { - var audioStreamIndex = params.AudioStreamIndex == null ? getPlayerData(player).audioStreamIndex : params.AudioStreamIndex; - var subtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).subtitleStreamIndex : params.SubtitleStreamIndex; + const audioStreamIndex = params.AudioStreamIndex == null ? getPlayerData(player).audioStreamIndex : params.AudioStreamIndex; + const subtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).subtitleStreamIndex : params.SubtitleStreamIndex; - var currentMediaSource = self.currentMediaSource(player); - var apiClient = connectionManager.getApiClient(currentItem.ServerId); + let currentMediaSource = self.currentMediaSource(player); + const apiClient = connectionManager.getApiClient(currentItem.ServerId); if (ticks) { ticks = parseInt(ticks); } - var maxBitrate = params.MaxStreamingBitrate || self.getMaxStreamingBitrate(player); + const maxBitrate = params.MaxStreamingBitrate || self.getMaxStreamingBitrate(player); - var currentPlayOptions = currentItem.playOptions || getDefaultPlayOptions(); + const currentPlayOptions = currentItem.playOptions || getDefaultPlayOptions(); getPlaybackInfo(player, apiClient, currentItem, deviceProfile, maxBitrate, ticks, true, currentMediaSource.Id, audioStreamIndex, subtitleStreamIndex, liveStreamId, params.EnableDirectPlay, params.EnableDirectStream, params.AllowVideoStreamCopy, params.AllowAudioStreamCopy).then(function (result) { if (validatePlaybackInfoResult(self, result)) { currentMediaSource = result.MediaSources[0]; - var streamInfo = createStreamInfo(apiClient, currentItem.MediaType, currentItem, currentMediaSource, ticks); + const streamInfo = createStreamInfo(apiClient, currentItem.MediaType, currentItem, currentMediaSource, ticks); streamInfo.fullscreen = currentPlayOptions.fullscreen; streamInfo.lastMediaInfoQuery = lastMediaInfoQuery; @@ -1679,14 +1725,14 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function changeStreamToUrl(apiClient, player, playSessionId, streamInfo, newPositionTicks) { - var playerData = getPlayerData(player); + const playerData = getPlayerData(player); playerData.isChangingStream = true; if (playerData.streamInfo && playSessionId) { apiClient.stopActiveEncodings(playSessionId).then(function () { // Stop the first transcoding afterwards because the player may still send requests to the original url - var afterSetSrc = function () { + const afterSetSrc = function () { apiClient.stopActiveEncodings(playSessionId); }; setSrcIntoPlayer(apiClient, player, streamInfo).then(afterSetSrc, afterSetSrc); @@ -1698,7 +1744,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla function setSrcIntoPlayer(apiClient, player, streamInfo) { return player.play(streamInfo).then(function () { - var playerData = getPlayerData(player); + const playerData = getPlayerData(player); playerData.isChangingStream = false; playerData.streamInfo = streamInfo; @@ -1707,7 +1753,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla sendProgressUpdate(player, 'timeupdate'); }, function (e) { - var playerData = getPlayerData(player); + const playerData = getPlayerData(player); playerData.isChangingStream = false; onPlaybackError.call(player, e, { @@ -1725,12 +1771,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla }); } - var firstItem = items[0]; - var promise; + const firstItem = items[0]; + let promise; - var serverId = firstItem.ServerId; + const serverId = firstItem.ServerId; - var queryOptions = options.queryOptions || {}; + const queryOptions = options.queryOptions || {}; if (firstItem.Type === 'Program') { promise = getItemsForPlayback(serverId, { @@ -1758,9 +1804,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla SortBy: options.shuffle ? 'Random' : 'SortName', MediaTypes: 'Photo,Video' }).then(function (result) { - var items = result.Items; + const items = result.Items; - var index = items.map(function (i) { + let index = items.map(function (i) { return i.Id; }).indexOf(firstItem.Id); @@ -1781,7 +1827,6 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla SortBy: options.shuffle ? 'Random' : 'SortName', MediaTypes: 'Photo,Video', Limit: 1000 - }); } else if (firstItem.Type === 'MusicGenre') { promise = getItemsForPlayback(serverId, { @@ -1793,18 +1838,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla }); } else if (firstItem.IsFolder) { promise = getItemsForPlayback(serverId, mergePlaybackQueries({ - ParentId: firstItem.Id, Filters: 'IsNotFolder', Recursive: true, // These are pre-sorted SortBy: options.shuffle ? 'Random' : (['BoxSet'].indexOf(firstItem.Type) === -1 ? 'SortName' : null), MediaTypes: 'Audio,Video' - }, queryOptions)); } else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) { promise = new Promise(function (resolve, reject) { - var apiClient = connectionManager.getApiClient(firstItem.ServerId); + const apiClient = connectionManager.getApiClient(firstItem.ServerId); apiClient.getCurrentUser().then(function (user) { if (!user.Configuration.EnableNextEpisodeAutoPlay || !firstItem.SeriesId) { @@ -1817,9 +1860,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla IsMissing: false, UserId: apiClient.getCurrentUserId(), Fields: 'Chapters' - }).then(function (episodesResult) { - var foundItem = false; + let foundItem = false; episodesResult.Items = episodesResult.Items.filter(function (e) { if (foundItem) { return true; @@ -1874,9 +1916,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } return getItemsForPlayback(options.serverId, { - Ids: options.ids.join(',') - }).then(function (result) { return translateItemsForPlayback(result.Items, options).then(function (items) { return playWithIntros(items, options); @@ -1892,7 +1932,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla if (!player.name) { throw new Error('player name cannot be null'); } - var state = playerStates[player.name]; + let state = playerStates[player.name]; if (!state) { playerStates[player.name] = {}; @@ -1916,7 +1956,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla item = item || self.currentItem(player); mediaSource = mediaSource || self.currentMediaSource(player); - var state = { + const state = { PlayState: {} }; @@ -1974,13 +2014,13 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla throw new Error('player cannot be null'); } - var mediaSource = self.currentMediaSource(player); + const mediaSource = self.currentMediaSource(player); if (mediaSource && mediaSource.RunTimeTicks) { return mediaSource.RunTimeTicks; } - var playerDuration = player.duration(); + let playerDuration = player.duration(); if (playerDuration) { playerDuration *= 10000; @@ -1994,9 +2034,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla throw new Error('player cannot be null'); } - var playerTime = Math.floor(10000 * (player || self._currentPlayer).currentTime()); + let playerTime = Math.floor(10000 * (player).currentTime()); - var streamInfo = getPlayerData(player).streamInfo; + const streamInfo = getPlayerData(player).streamInfo; if (streamInfo) { playerTime += getPlayerData(player).streamInfo.transcodingOffsetTicks || 0; } @@ -2008,8 +2048,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla self.getCurrentTicks = getCurrentTicks; function playOther(items, options, user) { - var playStartIndex = options.startIndex || 0; - var player = getPlayer(items[playStartIndex], options); + const playStartIndex = options.startIndex || 0; + const player = getPlayer(items[playStartIndex], options); loading.hide(); @@ -2019,8 +2059,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function playWithIntros(items, options, user) { - var playStartIndex = options.startIndex || 0; - var firstItem = items[playStartIndex]; + let playStartIndex = options.startIndex || 0; + let firstItem = items[playStartIndex]; // If index was bad, reset it if (!firstItem) { @@ -2038,11 +2078,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return playOther(items, options, user); } - var apiClient = connectionManager.getApiClient(firstItem.ServerId); + const apiClient = connectionManager.getApiClient(firstItem.ServerId); return getIntros(firstItem, apiClient, options).then(function (introsResult) { - var introItems = introsResult.Items; - var introPlayOptions; + const introItems = introsResult.Items; + let introPlayOptions; firstItem.playOptions = truncatePlayOptions(options); @@ -2098,9 +2138,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } // TODO: This should be the media type requested, not the original media type - var mediaType = item.MediaType; + const mediaType = item.MediaType; - var onBitrateDetectionFailure = function () { + const onBitrateDetectionFailure = function () { return playAfterBitrateDetect(getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType), item, playOptions, onPlaybackStartedFn); }; @@ -2108,7 +2148,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return onBitrateDetectionFailure(); } - var apiClient = connectionManager.getApiClient(item.ServerId); + const apiClient = connectionManager.getApiClient(item.ServerId); apiClient.getEndpointInfo().then(function (endpointInfo) { if ((mediaType === 'Video' || mediaType === 'Audio') && appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType)) { return apiClient.detectBitrate().then(function (bitrate) { @@ -2124,7 +2164,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function onInterceptorRejection() { - var player = self._currentPlayer; + const player = self._currentPlayer; if (player) { destroyPlayer(player); @@ -2142,7 +2182,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla function runInterceptors(item, playOptions) { return new Promise(function (resolve, reject) { - var interceptors = pluginManager.ofType('preplayintercept'); + const interceptors = pluginManager.ofType('preplayintercept'); interceptors.sort(function (a, b) { return (a.order || 0) - (b.order || 0); @@ -2155,7 +2195,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla loading.hide(); - var options = Object.assign({}, playOptions); + const options = Object.assign({}, playOptions); options.mediaType = item.MediaType; options.item = item; @@ -2170,7 +2210,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return; } - var interceptor = interceptors[index]; + const interceptor = interceptors[index]; interceptor.intercept(options).then(function () { runNextPrePlay(interceptors, index + 1, options, resolve, reject); @@ -2193,12 +2233,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function playAfterBitrateDetect(maxBitrate, item, playOptions, onPlaybackStartedFn) { - var startPosition = playOptions.startPositionTicks; + const startPosition = playOptions.startPositionTicks; - var player = getPlayer(item, playOptions); - var activePlayer = self._currentPlayer; + const player = getPlayer(item, playOptions); + const activePlayer = self._currentPlayer; - var promise; + let promise; if (activePlayer) { // TODO: if changing players within the same playlist, this will cause nextItem to be null @@ -2210,7 +2250,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla if (!isServerItem(item) || item.MediaType === 'Book') { return promise.then(function () { - var streamInfo = createStreamInfoFromUrlItem(item); + const streamInfo = createStreamInfoFromUrlItem(item); streamInfo.fullscreen = playOptions.fullscreen; getPlayerData(player).isChangingStream = false; return player.play(streamInfo).then(function () { @@ -2225,13 +2265,13 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } return Promise.all([promise, player.getDeviceProfile(item)]).then(function (responses) { - var deviceProfile = responses[1]; + const deviceProfile = responses[1]; - var apiClient = connectionManager.getApiClient(item.ServerId); + const apiClient = connectionManager.getApiClient(item.ServerId); - var mediaSourceId = playOptions.mediaSourceId; - var audioStreamIndex = playOptions.audioStreamIndex; - var subtitleStreamIndex = playOptions.subtitleStreamIndex; + const mediaSourceId = playOptions.mediaSourceId; + const audioStreamIndex = playOptions.audioStreamIndex; + const subtitleStreamIndex = playOptions.subtitleStreamIndex; if (player && !enableLocalPlaylistManagement(player)) { return sendPlaybackListToPlayer(player, playOptions.items, deviceProfile, maxBitrate, apiClient, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex, playOptions.startIndex); @@ -2241,7 +2281,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla playOptions.items = null; return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex).then(function (mediaSource) { - var streamInfo = createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition); + const streamInfo = createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition); streamInfo.fullscreen = playOptions.fullscreen; @@ -2269,14 +2309,14 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla self.getPlaybackInfo = function (item, options) { options = options || {}; - var startPosition = options.startPositionTicks || 0; - var mediaType = options.mediaType || item.MediaType; - var player = getPlayer(item, options); - var apiClient = connectionManager.getApiClient(item.ServerId); + const startPosition = options.startPositionTicks || 0; + const mediaType = options.mediaType || item.MediaType; + const player = getPlayer(item, options); + const apiClient = connectionManager.getApiClient(item.ServerId); // Call this just to ensure the value is recorded, it is needed with getSavedMaxStreamingBitrate return apiClient.getEndpointInfo().then(function () { - var maxBitrate = getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType); + const maxBitrate = getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType); return player.getDeviceProfile(item).then(function (deviceProfile) { return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, options.mediaSourceId, options.audioStreamIndex, options.subtitleStreamIndex).then(function (mediaSource) { @@ -2288,15 +2328,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla self.getPlaybackMediaSources = function (item, options) { options = options || {}; - var startPosition = options.startPositionTicks || 0; - var mediaType = options.mediaType || item.MediaType; + const startPosition = options.startPositionTicks || 0; + const mediaType = options.mediaType || item.MediaType; // TODO: Remove the true forceLocalPlayer hack - var player = getPlayer(item, options, true); - var apiClient = connectionManager.getApiClient(item.ServerId); + const player = getPlayer(item, options, true); + const apiClient = connectionManager.getApiClient(item.ServerId); // Call this just to ensure the value is recorded, it is needed with getSavedMaxStreamingBitrate return apiClient.getEndpointInfo().then(function () { - var maxBitrate = getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType); + const maxBitrate = getSavedMaxStreamingBitrate(connectionManager.getApiClient(item.ServerId), mediaType); return player.getDeviceProfile(item).then(function (deviceProfile) { return getPlaybackInfo(player, apiClient, item, deviceProfile, maxBitrate, startPosition, false, null, null, null, null).then(function (playbackInfoResult) { @@ -2307,16 +2347,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla }; function createStreamInfo(apiClient, type, item, mediaSource, startPosition) { - var mediaUrl; - var contentType; - var transcodingOffsetTicks = 0; - var playerStartPositionTicks = startPosition; - var liveStreamId = mediaSource.LiveStreamId; + let mediaUrl; + let contentType; + let transcodingOffsetTicks = 0; + const playerStartPositionTicks = startPosition; + const liveStreamId = mediaSource.LiveStreamId; - var playMethod = 'Transcode'; + let playMethod = 'Transcode'; - var mediaSourceContainer = (mediaSource.Container || '').toLowerCase(); - var directOptions; + const mediaSourceContainer = (mediaSource.Container || '').toLowerCase(); + let directOptions; if (type === 'Video' || type === 'Audio') { contentType = getMimeType(type.toLowerCase(), mediaSourceContainer); @@ -2345,7 +2385,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla directOptions.LiveStreamId = mediaSource.LiveStreamId; } - var prefix = type === 'Video' ? 'Videos' : 'Audio'; + const prefix = type === 'Video' ? 'Videos' : 'Audio'; mediaUrl = apiClient.getUrl(prefix + '/' + item.Id + '/stream.' + mediaSourceContainer, directOptions); playMethod = 'DirectStream'; @@ -2374,7 +2414,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla playMethod = 'DirectPlay'; } - var resultInfo = { + const resultInfo = { url: mediaUrl, mimeType: contentType, transcodingOffsetTicks: transcodingOffsetTicks, @@ -2391,7 +2431,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla title: item.Name }; - var backdropUrl = backdropImageUrl(apiClient, item, {}); + const backdropUrl = backdropImageUrl(apiClient, item, {}); if (backdropUrl) { resultInfo.backdropUrl = backdropUrl; } @@ -2400,19 +2440,19 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function getTextTracks(apiClient, item, mediaSource) { - var subtitleStreams = mediaSource.MediaStreams.filter(function (s) { + const subtitleStreams = mediaSource.MediaStreams.filter(function (s) { return s.Type === 'Subtitle'; }); - var textStreams = subtitleStreams.filter(function (s) { + const textStreams = subtitleStreams.filter(function (s) { return s.DeliveryMethod === 'External'; }); - var tracks = []; + const tracks = []; - for (var i = 0, length = textStreams.length; i < length; i++) { - var textStream = textStreams[i]; - var textStreamUrl; + for (let i = 0, length = textStreams.length; i < length; i++) { + const textStream = textStreams[i]; + let textStreamUrl; if (itemHelper.isLocalItem(item)) { textStreamUrl = textStream.Path; @@ -2459,7 +2499,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function getPlayer(item, playOptions, forceLocalPlayers) { - var serverItem = isServerItem(item); + const serverItem = isServerItem(item); return getAutomaticPlayers(self, forceLocalPlayers).filter(function (p) { if (p.canPlayMediaType(item.MediaType)) { if (serverItem) { @@ -2482,11 +2522,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.setCurrentPlaylistItem(playlistItemId); } - var newItem; - var newItemIndex; - var playlist = self._playQueueManager.getPlaylist(); + let newItem; + let newItemIndex; + const playlist = self._playQueueManager.getPlaylist(); - for (var i = 0, length = playlist.length; i < length; i++) { + for (let i = 0, length = playlist.length; i < length; i++) { if (playlist[i].PlaylistItemId === playlistItemId) { newItem = playlist[i]; newItemIndex = i; @@ -2495,7 +2535,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } if (newItem) { - var newItemPlayOptions = newItem.playOptions || getDefaultPlayOptions(); + const newItemPlayOptions = newItem.playOptions || getDefaultPlayOptions(); playInternal(newItem, newItemPlayOptions, function () { setPlaylistState(newItem.PlaylistItemId, newItemIndex); @@ -2513,18 +2553,19 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.removeFromPlaylist(playlistItemIds); } - var removeResult = self._playQueueManager.removeFromPlaylist(playlistItemIds); + const removeResult = self._playQueueManager.removeFromPlaylist(playlistItemIds); if (removeResult.result === 'empty') { return self.stop(player); } - var isCurrentIndex = removeResult.isCurrentIndex; + const isCurrentIndex = removeResult.isCurrentIndex; events.trigger(player, 'playlistitemremove', [ { playlistItemIds: playlistItemIds - }]); + } + ]); if (isCurrentIndex) { return self.setCurrentPlaylistItem(self._playQueueManager.getPlaylist()[0].PlaylistItemId, player); @@ -2539,7 +2580,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.movePlaylistItem(playlistItemId, newIndex); } - var moveResult = self._playQueueManager.movePlaylistItem(playlistItemId, newIndex); + const moveResult = self._playQueueManager.movePlaylistItem(playlistItemId, newIndex); if (moveResult.result === 'noop') { return; @@ -2549,7 +2590,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla { playlistItemId: moveResult.playlistItemId, newIndex: moveResult.newIndex - }]); + } + ]); }; self.getCurrentPlaylistIndex = function (player) { @@ -2586,12 +2628,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.nextTrack(); } - var newItemInfo = self._playQueueManager.getNextItemInfo(); + const newItemInfo = self._playQueueManager.getNextItemInfo(); if (newItemInfo) { console.debug('playing next track'); - var newItemPlayOptions = newItemInfo.item.playOptions || getDefaultPlayOptions(); + const newItemPlayOptions = newItemInfo.item.playOptions || getDefaultPlayOptions(); playInternal(newItemInfo.item, newItemPlayOptions, function () { setPlaylistState(newItemInfo.item.PlaylistItemId, newItemInfo.index); @@ -2605,13 +2647,13 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.previousTrack(); } - var newIndex = self.getCurrentPlaylistIndex(player) - 1; + const newIndex = self.getCurrentPlaylistIndex(player) - 1; if (newIndex >= 0) { - var playlist = self._playQueueManager.getPlaylist(); - var newItem = playlist[newIndex]; + const playlist = self._playQueueManager.getPlaylist(); + const newItem = playlist[newIndex]; if (newItem) { - var newItemPlayOptions = newItem.playOptions || getDefaultPlayOptions(); + const newItemPlayOptions = newItem.playOptions || getDefaultPlayOptions(); newItemPlayOptions.startPositionTicks = 0; playInternal(newItem, newItemPlayOptions, function () { @@ -2647,9 +2689,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } return getItemsForPlayback(options.serverId, { - Ids: options.ids.join(',') - }).then(function (result) { return translateItemsForPlayback(result.Items, options).then(function (items) { // TODO: Handle options.startIndex for photos @@ -2677,10 +2717,10 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return; } - var queueDirectToPlayer = player && !enableLocalPlaylistManagement(player); + const queueDirectToPlayer = player && !enableLocalPlaylistManagement(player); if (queueDirectToPlayer) { - var apiClient = connectionManager.getApiClient(items[0].ServerId); + const apiClient = connectionManager.getApiClient(items[0].ServerId); player.getDeviceProfile(items[0]).then(function (profile) { setStreamUrls(items, profile, self.getMaxStreamingBitrate(player), apiClient, 0).then(function () { @@ -2704,7 +2744,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function onPlayerProgressInterval() { - var player = this; + const player = this; sendProgressUpdate(player, 'timeupdate'); } @@ -2728,7 +2768,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla setCurrentPlayerInternal(player); - var playerData = getPlayerData(player); + const playerData = getPlayerData(player); playerData.streamInfo = streamInfo; @@ -2743,10 +2783,10 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } self._playNextAfterEnded = true; - var isFirstItem = playOptions.isFirstItem; - var fullscreen = playOptions.fullscreen; + const isFirstItem = playOptions.isFirstItem; + const fullscreen = playOptions.fullscreen; - var state = self.getPlayerState(player, streamInfo.item, streamInfo.mediaSource); + const state = self.getPlayerState(player, streamInfo.item, streamInfo.mediaSource); reportPlayback(self, state, player, true, state.NowPlayingItem.ServerId, 'reportPlaybackStart'); @@ -2762,22 +2802,22 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function onPlaybackStartedFromSelfManagingPlayer(e, item, mediaSource) { - var player = this; + const player = this; setCurrentPlayerInternal(player); - var playOptions = item.playOptions || getDefaultPlayOptions(); - var isFirstItem = playOptions.isFirstItem; - var fullscreen = playOptions.fullscreen; + const playOptions = item.playOptions || getDefaultPlayOptions(); + const isFirstItem = playOptions.isFirstItem; + const fullscreen = playOptions.fullscreen; playOptions.isFirstItem = false; - var playerData = getPlayerData(player); + const playerData = getPlayerData(player); playerData.streamInfo = {}; - var streamInfo = playerData.streamInfo; + const streamInfo = playerData.streamInfo; streamInfo.playbackStartTimeTicks = new Date().getTime() * 10000; - var state = self.getPlayerState(player, item, mediaSource); + const state = self.getPlayerState(player, item, mediaSource); reportPlayback(self, state, player, true, state.NowPlayingItem.ServerId, 'reportPlaybackStart'); @@ -2793,15 +2833,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function onPlaybackStoppedFromSelfManagingPlayer(e, playerStopInfo) { - var player = this; + const player = this; stopPlaybackProgressTimer(player); - var state = self.getPlayerState(player, playerStopInfo.item, playerStopInfo.mediaSource); + const state = self.getPlayerState(player, playerStopInfo.item, playerStopInfo.mediaSource); - var nextItem = playerStopInfo.nextItem; - var nextMediaType = playerStopInfo.nextMediaType; + const nextItem = playerStopInfo.nextItem; + const nextMediaType = playerStopInfo.nextMediaType; - var playbackStopInfo = { + const playbackStopInfo = { player: player, state: state, nextItem: (nextItem ? nextItem.item : null), @@ -2810,7 +2850,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla state.NextMediaType = nextMediaType; - var streamInfo = getPlayerData(player).streamInfo; + const streamInfo = getPlayerData(player).streamInfo; // only used internally as a safeguard to avoid reporting other events to the server after playback stopped streamInfo.ended = true; @@ -2826,8 +2866,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla events.trigger(player, 'playbackstop', [state]); events.trigger(self, 'playbackstop', [playbackStopInfo]); - var nextItemPlayOptions = nextItem ? (nextItem.item.playOptions || getDefaultPlayOptions()) : getDefaultPlayOptions(); - var newPlayer = nextItem ? getPlayer(nextItem.item, nextItemPlayOptions) : null; + const nextItemPlayOptions = nextItem ? (nextItem.item.playOptions || getDefaultPlayOptions()) : getDefaultPlayOptions(); + const newPlayer = nextItem ? getPlayer(nextItem.item, nextItemPlayOptions) : null; if (newPlayer !== player) { destroyPlayer(player); @@ -2837,7 +2877,6 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla function enablePlaybackRetryWithTranscoding(streamInfo, errorType, currentlyPreventsVideoStreamCopy, currentlyPreventsAudioStreamCopy) { // mediadecodeerror, medianotsupported, network, servererror - if (streamInfo.mediaSource.SupportsTranscoding && (!currentlyPreventsVideoStreamCopy || !currentlyPreventsAudioStreamCopy)) { return true; } @@ -2846,46 +2885,44 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function onPlaybackError(e, error) { - var player = this; + const player = this; error = error || {}; // network // mediadecodeerror // medianotsupported - var errorType = error.type; + const errorType = error.type; console.debug('playbackmanager playback error type: ' + (errorType || '')); - var streamInfo = error.streamInfo || getPlayerData(player).streamInfo; + const streamInfo = error.streamInfo || getPlayerData(player).streamInfo; if (streamInfo) { - var currentlyPreventsVideoStreamCopy = streamInfo.url.toLowerCase().indexOf('allowvideostreamcopy=false') !== -1; - var currentlyPreventsAudioStreamCopy = streamInfo.url.toLowerCase().indexOf('allowaudiostreamcopy=false') !== -1; + const currentlyPreventsVideoStreamCopy = streamInfo.url.toLowerCase().indexOf('allowvideostreamcopy=false') !== -1; + const currentlyPreventsAudioStreamCopy = streamInfo.url.toLowerCase().indexOf('allowaudiostreamcopy=false') !== -1; // Auto switch to transcoding if (enablePlaybackRetryWithTranscoding(streamInfo, errorType, currentlyPreventsVideoStreamCopy, currentlyPreventsAudioStreamCopy)) { - var startTime = getCurrentTicks(player) || streamInfo.playerStartPositionTicks; + const startTime = getCurrentTicks(player) || streamInfo.playerStartPositionTicks; changeStream(player, startTime, { - // force transcoding EnableDirectPlay: false, EnableDirectStream: false, AllowVideoStreamCopy: false, AllowAudioStreamCopy: currentlyPreventsAudioStreamCopy || currentlyPreventsVideoStreamCopy ? false : null - }); return; } } - var displayErrorCode = 'NoCompatibleStream'; + const displayErrorCode = 'NoCompatibleStream'; onPlaybackStopped.call(player, e, displayErrorCode); } function onPlaybackStopped(e, displayErrorCode) { - var player = this; + const player = this; if (getPlayerData(player).isChangingStream) { return; @@ -2894,15 +2931,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla stopPlaybackProgressTimer(player); // User clicked stop or content ended - var state = self.getPlayerState(player); - var data = getPlayerData(player); - var streamInfo = data.streamInfo; + const state = self.getPlayerState(player); + const data = getPlayerData(player); + const streamInfo = data.streamInfo; - var nextItem = self._playNextAfterEnded ? self._playQueueManager.getNextItemInfo() : null; + const nextItem = self._playNextAfterEnded ? self._playQueueManager.getNextItemInfo() : null; - var nextMediaType = (nextItem ? nextItem.item.MediaType : null); + const nextMediaType = (nextItem ? nextItem.item.MediaType : null); - var playbackStopInfo = { + const playbackStopInfo = { player: player, state: state, nextItem: (nextItem ? nextItem.item : null), @@ -2931,8 +2968,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla events.trigger(player, 'playbackstop', [state]); events.trigger(self, 'playbackstop', [playbackStopInfo]); - var nextItemPlayOptions = nextItem ? (nextItem.item.playOptions || getDefaultPlayOptions()) : getDefaultPlayOptions(); - var newPlayer = nextItem ? getPlayer(nextItem.item, nextItemPlayOptions) : null; + const nextItemPlayOptions = nextItem ? (nextItem.item.playOptions || getDefaultPlayOptions()) : getDefaultPlayOptions(); + const newPlayer = nextItem ? getPlayer(nextItem.item, nextItemPlayOptions) : null; if (newPlayer !== player) { destroyPlayer(player); @@ -2950,12 +2987,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function onPlaybackChanging(activePlayer, newPlayer, newItem) { - var state = self.getPlayerState(activePlayer); + const state = self.getPlayerState(activePlayer); - var serverId = self.currentItem(activePlayer).ServerId; + const serverId = self.currentItem(activePlayer).ServerId; // User started playing something new while existing content is playing - var promise; + let promise; stopPlaybackProgressTimer(activePlayer); unbindStopped(activePlayer); @@ -2992,47 +3029,47 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function onPlaybackTimeUpdate(e) { - var player = this; + const player = this; sendProgressUpdate(player, 'timeupdate'); } function onPlaybackPause(e) { - var player = this; + const player = this; sendProgressUpdate(player, 'pause'); } function onPlaybackUnpause(e) { - var player = this; + const player = this; sendProgressUpdate(player, 'unpause'); } function onPlaybackVolumeChange(e) { - var player = this; + const player = this; sendProgressUpdate(player, 'volumechange'); } function onRepeatModeChange(e) { - var player = this; + const player = this; sendProgressUpdate(player, 'repeatmodechange'); } function onShuffleQueueModeChange() { - var player = this; + const player = this; sendProgressUpdate(player, 'shufflequeuemodechange'); } function onPlaylistItemMove(e) { - var player = this; + const player = this; sendProgressUpdate(player, 'playlistitemmove', true); } function onPlaylistItemRemove(e) { - var player = this; + const player = this; sendProgressUpdate(player, 'playlistitemremove', true); } function onPlaylistItemAdd(e) { - var player = this; + const player = this; sendProgressUpdate(player, 'playlistitemadd', true); } @@ -3109,12 +3146,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla throw new Error('player cannot be null'); } - var state = self.getPlayerState(player); + const state = self.getPlayerState(player); if (state.NowPlayingItem) { - var serverId = state.NowPlayingItem.ServerId; + const serverId = state.NowPlayingItem.ServerId; - var streamInfo = getPlayerData(player).streamInfo; + const streamInfo = getPlayerData(player).streamInfo; if (streamInfo && streamInfo.started && !streamInfo.ended) { reportPlayback(self, state, player, reportPlaylist, serverId, 'reportPlaybackProgress', progressEventName); @@ -3133,7 +3170,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla streamInfo.lastMediaInfoQuery = new Date().getTime(); - var apiClient = connectionManager.getApiClient(serverId); + const apiClient = connectionManager.getApiClient(serverId); if (!apiClient.isMinServerVersion('3.2.70.7')) { return; @@ -3143,12 +3180,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla mediaSource.MediaStreams = info.MediaStreams; events.trigger(player, 'mediastreamschange'); }, function () { - }); } self.onAppClose = function () { - var player = this._currentPlayer; + const player = this._currentPlayer; // Try to report playback stopped before the app closes if (player && this.isPlaying(player)) { @@ -3157,89 +3193,80 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } }; - self.playbackStartTime = function (player) { - player = player || this._currentPlayer; + self.playbackStartTime = function (player = this._currentPlayer) { if (player && !enableLocalPlaylistManagement(player) && !player.isLocalPlayer) { return player.playbackStartTime(); } - var streamInfo = getPlayerData(player).streamInfo; + const streamInfo = getPlayerData(player).streamInfo; return streamInfo ? streamInfo.playbackStartTimeTicks : null; }; - if (apphost.supports('remotecontrol')) { - require(['serverNotifications'], function (serverNotifications) { + if (appHost.supports('remotecontrol')) { + import('serverNotifications').then(({ default: serverNotifications }) => { events.on(serverNotifications, 'ServerShuttingDown', self.setDefaultPlayerActive.bind(self)); events.on(serverNotifications, 'ServerRestarting', self.setDefaultPlayerActive.bind(self)); }); } } - PlaybackManager.prototype.getCurrentPlayer = function () { + getCurrentPlayer() { return this._currentPlayer; - }; + } - PlaybackManager.prototype.currentTime = function (player) { - player = player || this._currentPlayer; + currentTime(player = this._currentPlayer) { if (player && !enableLocalPlaylistManagement(player) && !player.isLocalPlayer) { return player.currentTime(); } return this.getCurrentTicks(player); - }; - - PlaybackManager.prototype.nextItem = function (player) { - player = player || this._currentPlayer; + } + nextItem(player = this._currentPlayer) { if (player && !enableLocalPlaylistManagement(player)) { return player.nextItem(); } - var nextItem = this._playQueueManager.getNextItemInfo(); + const nextItem = this._playQueueManager.getNextItemInfo(); if (!nextItem || !nextItem.item) { return Promise.reject(); } - var apiClient = connectionManager.getApiClient(nextItem.item.ServerId); + const apiClient = connectionManager.getApiClient(nextItem.item.ServerId); return apiClient.getItem(apiClient.getCurrentUserId(), nextItem.item.Id); - }; + } - PlaybackManager.prototype.canQueue = function (item) { + canQueue(item) { if (item.Type === 'MusicAlbum' || item.Type === 'MusicArtist' || item.Type === 'MusicGenre') { return this.canQueueMediaType('Audio'); } return this.canQueueMediaType(item.MediaType); - }; + } - PlaybackManager.prototype.canQueueMediaType = function (mediaType) { + canQueueMediaType(mediaType) { if (this._currentPlayer) { return this._currentPlayer.canPlayMediaType(mediaType); } return false; - }; - - PlaybackManager.prototype.isMuted = function (player) { - player = player || this._currentPlayer; + } + isMuted(player = this._currentPlayer) { if (player) { return player.isMuted(); } return false; - }; - - PlaybackManager.prototype.setMute = function (mute, player) { - player = player || this._currentPlayer; + } + setMute(mute, player = this._currentPlayer) { if (player) { player.setMute(mute); } - }; + } - PlaybackManager.prototype.toggleMute = function (mute, player) { - player = player || this._currentPlayer; + toggleMute(mute, player = this._currentPlayer) { if (player) { if (player.toggleMute) { player.toggleMute(); @@ -3247,29 +3274,28 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla player.setMute(!player.isMuted()); } } - }; + } - PlaybackManager.prototype.toggleDisplayMirroring = function () { + toggleDisplayMirroring() { this.enableDisplayMirroring(!this.enableDisplayMirroring()); - }; + } - PlaybackManager.prototype.enableDisplayMirroring = function (enabled) { + enableDisplayMirroring(enabled) { if (enabled != null) { - var val = enabled ? '1' : '0'; + const val = enabled ? '1' : '0'; appSettings.set('displaymirror', val); return; } return (appSettings.get('displaymirror') || '') !== '0'; - }; + } - PlaybackManager.prototype.nextChapter = function (player) { - player = player || this._currentPlayer; - var item = this.currentItem(player); + nextChapter(player = this._currentPlayer) { + const item = this.currentItem(player); - var ticks = this.getCurrentTicks(player); + const ticks = this.getCurrentTicks(player); - var nextChapter = (item.Chapters || []).filter(function (i) { + const nextChapter = (item.Chapters || []).filter(function (i) { return i.StartPositionTicks > ticks; })[0]; @@ -3278,13 +3304,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } else { this.nextTrack(player); } - }; + } - PlaybackManager.prototype.previousChapter = function (player) { - player = player || this._currentPlayer; - var item = this.currentItem(player); + previousChapter(player = this._currentPlayer) { + const item = this.currentItem(player); - var ticks = this.getCurrentTicks(player); + let ticks = this.getCurrentTicks(player); // Go back 10 seconds ticks -= 100000000; @@ -3294,7 +3319,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla ticks = Math.max(ticks, 0); } - var previousChapters = (item.Chapters || []).filter(function (i) { + const previousChapters = (item.Chapters || []).filter(function (i) { return i.StartPositionTicks <= ticks; }); @@ -3303,63 +3328,55 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } else { this.previousTrack(player); } - }; - - PlaybackManager.prototype.fastForward = function (player) { - player = player || this._currentPlayer; + } + fastForward(player = this._currentPlayer) { if (player.fastForward != null) { player.fastForward(userSettings.skipForwardLength()); return; } // Go back 15 seconds - var offsetTicks = userSettings.skipForwardLength() * 10000; + const offsetTicks = userSettings.skipForwardLength() * 10000; this.seekRelative(offsetTicks, player); - }; - - PlaybackManager.prototype.rewind = function (player) { - player = player || this._currentPlayer; + } + rewind(player = this._currentPlayer) { if (player.rewind != null) { player.rewind(userSettings.skipBackLength()); return; } // Go back 15 seconds - var offsetTicks = 0 - (userSettings.skipBackLength() * 10000); + const offsetTicks = 0 - (userSettings.skipBackLength() * 10000); this.seekRelative(offsetTicks, player); - }; + } - PlaybackManager.prototype.seekPercent = function (percent, player) { - player = player || this._currentPlayer; - - var ticks = this.duration(player) || 0; + seekPercent(percent, player = this._currentPlayer) { + let ticks = this.duration(player) || 0; percent /= 100; ticks *= percent; this.seek(parseInt(ticks), player); - }; + } - PlaybackManager.prototype.seekMs = function (ms, player) { - player = player || this._currentPlayer; - - var ticks = ms * 10000; + seekMs(ms, player = this._currentPlayer) { + const ticks = ms * 10000; this.seek(ticks, player); - }; + } - PlaybackManager.prototype.playTrailers = function (item) { - var player = this._currentPlayer; + playTrailers(item) { + const player = this._currentPlayer; if (player && player.playTrailers) { return player.playTrailers(item); } - var apiClient = connectionManager.getApiClient(item.ServerId); + const apiClient = connectionManager.getApiClient(item.ServerId); - var instance = this; + const instance = this; if (item.LocalTrailerCount) { return apiClient.getLocalTrailers(apiClient.getCurrentUserId(), item.Id).then(function (result) { @@ -3368,7 +3385,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla }); }); } else { - var remoteTrailers = item.RemoteTrailers || []; + const remoteTrailers = item.RemoteTrailers || []; if (!remoteTrailers.length) { return Promise.reject(); @@ -3386,17 +3403,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla }) }); } - }; + } - PlaybackManager.prototype.getSubtitleUrl = function (textStream, serverId) { - var apiClient = connectionManager.getApiClient(serverId); + getSubtitleUrl(textStream, serverId) { + const apiClient = connectionManager.getApiClient(serverId); return !textStream.IsExternalUrl ? apiClient.getUrl(textStream.DeliveryUrl) : textStream.DeliveryUrl; - }; + } - PlaybackManager.prototype.stop = function (player) { + stop(player) { player = player || this._currentPlayer; - if (player) { if (enableLocalPlaylistManagement(player)) { this._playNextAfterEnded = false; @@ -3407,11 +3423,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } return Promise.resolve(); - }; - - PlaybackManager.prototype.getBufferedRanges = function (player) { - player = player || this._currentPlayer; + } + getBufferedRanges(player = this._currentPlayer) { if (player) { if (player.getBufferedRanges) { return player.getBufferedRanges(); @@ -3419,11 +3433,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } return []; - }; - - PlaybackManager.prototype.playPause = function (player) { - player = player || this._currentPlayer; + } + playPause(player = this._currentPlayer) { if (player) { if (player.playPause) { return player.playPause(); @@ -3435,115 +3447,105 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return this.pause(player); } } - }; - - PlaybackManager.prototype.paused = function (player) { - player = player || this._currentPlayer; + } + paused(player = this._currentPlayer) { if (player) { return player.paused(); } - }; - - PlaybackManager.prototype.pause = function (player) { - player = player || this._currentPlayer; + } + pause(player = this._currentPlayer) { if (player) { player.pause(); } - }; - - PlaybackManager.prototype.unpause = function (player) { - player = player || this._currentPlayer; + } + unpause(player = this._currentPlayer) { if (player) { player.unpause(); } - }; + } - PlaybackManager.prototype.setPlaybackRate = function (value, player = this._currentPlayer) { + setPlaybackRate(value, player = this._currentPlayer) { if (player && player.setPlaybackRate) { player.setPlaybackRate(value); } - }; + } - PlaybackManager.prototype.getPlaybackRate = function (player = this._currentPlayer) { + getPlaybackRate(player = this._currentPlayer) { if (player && player.getPlaybackRate) { return player.getPlaybackRate(); } return null; - }; + } - PlaybackManager.prototype.instantMix = function (item, player) { - player = player || this._currentPlayer; + instantMix(item, player = this._currentPlayer) { if (player && player.instantMix) { return player.instantMix(item); } - var apiClient = connectionManager.getApiClient(item.ServerId); + const apiClient = connectionManager.getApiClient(item.ServerId); - var options = {}; + const options = {}; options.UserId = apiClient.getCurrentUserId(); options.Limit = 200; - var instance = this; + const instance = this; apiClient.getInstantMixFromItem(item.Id, options).then(function (result) { instance.play({ items: result.Items }); }); - }; + } - PlaybackManager.prototype.shuffle = function (shuffleItem, player) { - player = player || this._currentPlayer; + shuffle(shuffleItem, player = this._currentPlayer) { if (player && player.shuffle) { return player.shuffle(shuffleItem); } return this.play({ items: [shuffleItem], shuffle: true }); - }; + } - PlaybackManager.prototype.audioTracks = function (player) { - player = player || this._currentPlayer; + audioTracks(player = this._currentPlayer) { if (player.audioTracks) { - var result = player.audioTracks(); + const result = player.audioTracks(); if (result) { return result; } } - var mediaSource = this.currentMediaSource(player); + const mediaSource = this.currentMediaSource(player); - var mediaStreams = (mediaSource || {}).MediaStreams || []; + const mediaStreams = (mediaSource || {}).MediaStreams || []; return mediaStreams.filter(function (s) { return s.Type === 'Audio'; }); - }; + } - PlaybackManager.prototype.subtitleTracks = function (player) { - player = player || this._currentPlayer; + subtitleTracks(player = this._currentPlayer) { if (player.subtitleTracks) { - var result = player.subtitleTracks(); + const result = player.subtitleTracks(); if (result) { return result; } } - var mediaSource = this.currentMediaSource(player); + const mediaSource = this.currentMediaSource(player); - var mediaStreams = (mediaSource || {}).MediaStreams || []; + const mediaStreams = (mediaSource || {}).MediaStreams || []; return mediaStreams.filter(function (s) { return s.Type === 'Subtitle'; }); - }; + } - PlaybackManager.prototype.getSupportedCommands = function (player) { + getSupportedCommands(player) { player = player || this._currentPlayer || { isLocalPlayer: true }; if (player.isLocalPlayer) { - var list = [ + const list = [ 'GoHome', 'GoToSettings', 'VolumeUp', @@ -3564,7 +3566,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla 'PlayTrailers' ]; - if (apphost.supports('fullscreenchange')) { + if (appHost.supports('fullscreenchange')) { list.push('ToggleFullscreen'); } @@ -3589,45 +3591,45 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return list; } - var info = this.getPlayerInfo(); + const info = this.getPlayerInfo(); return info ? info.supportedCommands : []; - }; + } - PlaybackManager.prototype.setRepeatMode = function (value, player = this._currentPlayer) { + setRepeatMode(value, player = this._currentPlayer) { if (player && !enableLocalPlaylistManagement(player)) { return player.setRepeatMode(value); } this._playQueueManager.setRepeatMode(value); events.trigger(player, 'repeatmodechange'); - }; + } - PlaybackManager.prototype.getRepeatMode = function (player = this._currentPlayer) { + getRepeatMode(player = this._currentPlayer) { if (player && !enableLocalPlaylistManagement(player)) { return player.getRepeatMode(); } return this._playQueueManager.getRepeatMode(); - }; + } - PlaybackManager.prototype.setQueueShuffleMode = function (value, player = this._currentPlayer) { + setQueueShuffleMode(value, player = this._currentPlayer) { if (player && !enableLocalPlaylistManagement(player)) { return player.setQueueShuffleMode(value); } this._playQueueManager.setShuffleMode(value); events.trigger(player, 'shufflequeuemodechange'); - }; + } - PlaybackManager.prototype.getQueueShuffleMode = function (player = this._currentPlayer) { + getQueueShuffleMode(player = this._currentPlayer) { if (player && !enableLocalPlaylistManagement(player)) { return player.getQueueShuffleMode(); } return this._playQueueManager.getShuffleMode(); - }; + } - PlaybackManager.prototype.toggleQueueShuffleMode = function (player = this._currentPlayer) { + toggleQueueShuffleMode(player = this._currentPlayer) { let currentvalue; if (player && !enableLocalPlaylistManagement(player)) { currentvalue = player.getQueueShuffleMode(); @@ -3645,23 +3647,23 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla this._playQueueManager.toggleShuffleMode(); } events.trigger(player, 'shufflequeuemodechange'); - }; + } - PlaybackManager.prototype.clearQueue = function (clearCurrentItem = false, player = this._currentPlayer) { + clearQueue(clearCurrentItem = false, player = this._currentPlayer) { if (player && !enableLocalPlaylistManagement(player)) { return player.clearQueue(clearCurrentItem); } this._playQueueManager.clearPlaylist(clearCurrentItem); events.trigger(player, 'playlistitemremove'); - }; + } - PlaybackManager.prototype.trySetActiveDeviceName = function (name) { + trySetActiveDeviceName(name) { name = normalizeName(name); - var instance = this; + const instance = this; instance.getTargets().then(function (result) { - var target = result.filter(function (p) { + const target = result.filter(function (p) { return normalizeName(p.name) === name; })[0]; @@ -3669,50 +3671,49 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla instance.trySetActivePlayer(target.playerName, target); } }); - }; + } - PlaybackManager.prototype.displayContent = function (options, player) { - player = player || this._currentPlayer; + displayContent(options, player = this._currentPlayer) { if (player && player.displayContent) { player.displayContent(options); } - }; + } - PlaybackManager.prototype.beginPlayerUpdates = function (player) { + beginPlayerUpdates(player) { if (player.beginPlayerUpdates) { player.beginPlayerUpdates(); } - }; + } - PlaybackManager.prototype.endPlayerUpdates = function (player) { + endPlayerUpdates(player) { if (player.endPlayerUpdates) { player.endPlayerUpdates(); } - }; + } - PlaybackManager.prototype.setDefaultPlayerActive = function () { + setDefaultPlayerActive() { this.setActivePlayer('localplayer'); - }; + } - PlaybackManager.prototype.removeActivePlayer = function (name) { - var playerInfo = this.getPlayerInfo(); + removeActivePlayer(name) { + const playerInfo = this.getPlayerInfo(); if (playerInfo) { if (playerInfo.name === name) { this.setDefaultPlayerActive(); } } - }; + } - PlaybackManager.prototype.removeActiveTarget = function (id) { - var playerInfo = this.getPlayerInfo(); + removeActiveTarget(id) { + const playerInfo = this.getPlayerInfo(); if (playerInfo) { if (playerInfo.id === id) { this.setDefaultPlayerActive(); } } - }; + } - PlaybackManager.prototype.sendCommand = function (cmd, player) { + sendCommand(cmd, player) { console.debug('MediaController received command: ' + cmd.Name); switch (cmd.Name) { case 'SetRepeatMode': @@ -3742,6 +3743,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla case 'SetAspectRatio': this.setAspectRatio(cmd.Arguments.AspectRatio, player); break; + case 'PlaybackRate': + this.setPlaybackRate(cmd.Arguments.PlaybackRate, player); + break; case 'SetBrightness': this.setBrightness(cmd.Arguments.Brightness, player); break; @@ -3763,7 +3767,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } break; } - }; + } +} - return new PlaybackManager(); -}); +export default new PlaybackManager(); diff --git a/src/components/playback/playbackorientation.js b/src/components/playback/playbackorientation.js index 1aa939da04..b73377bade 100644 --- a/src/components/playback/playbackorientation.js +++ b/src/components/playback/playbackorientation.js @@ -18,7 +18,7 @@ events.on(playbackManager, 'playbackstart', function (e, player, state) { if (isLocalVideo && layoutManager.mobile) { /* eslint-disable-next-line compat/compat */ - var lockOrientation = screen.lockOrientation || screen.mozLockOrientation || screen.msLockOrientation || (screen.orientation && screen.orientation.lock); + var lockOrientation = window.screen.lockOrientation || window.screen.mozLockOrientation || window.screen.msLockOrientation || (window.screen.orientation && window.screen.orientation.lock); if (lockOrientation) { try { @@ -39,7 +39,7 @@ events.on(playbackManager, 'playbackstart', function (e, player, state) { events.on(playbackManager, 'playbackstop', function (e, playbackStopInfo) { if (orientationLocked && !playbackStopInfo.nextMediaType) { /* eslint-disable-next-line compat/compat */ - var unlockOrientation = screen.unlockOrientation || screen.mozUnlockOrientation || screen.msUnlockOrientation || (screen.orientation && screen.orientation.unlock); + var unlockOrientation = window.screen.unlockOrientation || window.screen.mozUnlockOrientation || window.screen.msUnlockOrientation || (window.screen.orientation && window.screen.orientation.unlock); if (unlockOrientation) { try { diff --git a/src/components/playback/playersettingsmenu.js b/src/components/playback/playersettingsmenu.js index 71dd7a86ff..cd227afcb4 100644 --- a/src/components/playback/playersettingsmenu.js +++ b/src/components/playback/playersettingsmenu.js @@ -149,6 +149,28 @@ function showAspectRatioMenu(player, btn) { }); } +function showPlaybackRateMenu(player, btn) { + // each has a name and id + const currentId = playbackManager.getPlaybackRate(player); + const menuItems = playbackManager.getSupportedPlaybackRates(player).map(i => ({ + id: i.id, + name: i.name, + selected: i.id === currentId + })); + + return actionsheet.show({ + items: menuItems, + positionTo: btn + }).then(function (id) { + if (id) { + playbackManager.setPlaybackRate(id, player); + return Promise.resolve(); + } + + return Promise.reject(); + }); +} + function showWithUser(options, player, user) { var supportedCommands = playbackManager.getSupportedCommands(player); @@ -166,6 +188,17 @@ function showWithUser(options, player, user) { }); } + if (supportedCommands.indexOf('PlaybackRate') !== -1) { + const currentPlaybackRateId = playbackManager.getPlaybackRate(player); + const currentPlaybackRate = playbackManager.getSupportedPlaybackRates(player).filter(i => i.id === currentPlaybackRateId)[0]; + + menuItems.push({ + name: globalize.translate('PlaybackRate'), + id: 'playbackrate', + asideText: currentPlaybackRate ? currentPlaybackRate.name : null + }); + } + if (user && user.Policy.EnableVideoPlaybackTranscoding) { var secondaryQualityText = getQualitySecondaryText(player); @@ -230,6 +263,8 @@ function handleSelectedOption(id, options, player) { return showQualityMenu(player, options.positionTo); case 'aspectratio': return showAspectRatioMenu(player, options.positionTo); + case 'playbackrate': + return showPlaybackRateMenu(player, options.positionTo); case 'repeatmode': return showRepeatModeMenu(player, options.positionTo); case 'stats': diff --git a/src/components/playbackSettings/playbackSettings.template.html b/src/components/playbackSettings/playbackSettings.template.html index 700215223d..d10b069bb2 100644 --- a/src/components/playbackSettings/playbackSettings.template.html +++ b/src/components/playbackSettings/playbackSettings.template.html @@ -99,6 +99,6 @@
diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index 7b1e915e1f..78f0cf3dec 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -210,7 +210,7 @@ import 'emby-button'; } function centerFocus(elem, horiz, on) { - import('scrollHelper').then(scrollHelper => { + import('scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index df4a0c42b7..55a5c230ff 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -1,37 +1,38 @@ -define(['events', 'globalize'], function (events, globalize) { - 'use strict'; +import events from 'events'; +import globalize from 'globalize'; +/* eslint-disable indent */ // TODO: replace with each plugin version var cacheParam = new Date().getTime(); - function loadStrings(plugin) { - var strings = plugin.getTranslations ? plugin.getTranslations() : []; - return globalize.loadStrings({ - name: plugin.id || plugin.packageName, - strings: strings - }); - } + class PluginManager { + pluginsList = []; - function definePluginRoute(pluginManager, route, plugin) { - route.contentPath = pluginManager.mapPath(plugin, route.path); - route.path = pluginManager.mapRoute(plugin, route); + get plugins() { + return this.pluginsList; + } - Emby.App.defineRoute(route, plugin.id); - } + #loadStrings(plugin) { + var strings = plugin.getTranslations ? plugin.getTranslations() : []; + return globalize.loadStrings({ + name: plugin.id || plugin.packageName, + strings: strings + }); + } - function PluginManager() { - this.pluginsList = []; - } + #definePluginRoute(route, plugin) { + route.contentPath = this.mapPath(plugin, route.path); + route.path = this.#mapRoute(plugin, route); - PluginManager.prototype.loadPlugin = function(pluginSpec) { - var instance = this; + Emby.App.defineRoute(route, plugin.id); + } - function registerPlugin(plugin) { - instance.register(plugin); + #registerPlugin(plugin) { + this.#register(plugin); if (plugin.getRoutes) { - plugin.getRoutes().forEach(function (route) { - definePluginRoute(instance, route, plugin); + plugin.getRoutes().forEach((route) => { + this.#definePluginRoute(route, plugin); }); } @@ -40,7 +41,7 @@ define(['events', 'globalize'], function (events, globalize) { return Promise.resolve(plugin); } else { return new Promise((resolve, reject) => { - loadStrings(plugin) + this.#loadStrings(plugin) .then(function () { resolve(plugin); }) @@ -49,103 +50,102 @@ define(['events', 'globalize'], function (events, globalize) { } } - if (typeof pluginSpec === 'string') { - console.debug('Loading plugin (via deprecated requirejs method): ' + pluginSpec); + loadPlugin(pluginSpec) { + if (typeof pluginSpec === 'string') { + console.debug('Loading plugin (via deprecated requirejs method): ' + pluginSpec); - return new Promise(function (resolve, reject) { - require([pluginSpec], (pluginFactory) => { - var plugin = pluginFactory.default ? new pluginFactory.default() : new pluginFactory(); + return new Promise((resolve, reject) => { + require([pluginSpec], (pluginFactory) => { + var plugin = pluginFactory.default ? new pluginFactory.default() : new pluginFactory(); - // See if it's already installed - var existing = instance.pluginsList.filter(function (p) { - return p.id === plugin.id; - })[0]; + // See if it's already installed + var existing = this.pluginsList.filter(function (p) { + return p.id === plugin.id; + })[0]; - if (existing) { - resolve(pluginSpec); - } + if (existing) { + resolve(pluginSpec); + } - plugin.installUrl = pluginSpec; + plugin.installUrl = pluginSpec; - var separatorIndex = Math.max(pluginSpec.lastIndexOf('/'), pluginSpec.lastIndexOf('\\')); - plugin.baseUrl = pluginSpec.substring(0, separatorIndex); + var separatorIndex = Math.max(pluginSpec.lastIndexOf('/'), pluginSpec.lastIndexOf('\\')); + plugin.baseUrl = pluginSpec.substring(0, separatorIndex); - var paths = {}; - paths[plugin.id] = plugin.baseUrl; + var paths = {}; + paths[plugin.id] = plugin.baseUrl; - requirejs.config({ - waitSeconds: 0, - paths: paths + requirejs.config({ + waitSeconds: 0, + paths: paths + }); + + this.#registerPlugin(plugin).then(resolve).catch(reject); }); - - registerPlugin(plugin).then(resolve).catch(reject); }); + } else if (pluginSpec.then) { + return pluginSpec.then(pluginBuilder => { + return pluginBuilder(); + }).then((plugin) => { + console.debug(`Plugin loaded: ${plugin.id}`); + return this.#registerPlugin(plugin); + }); + } else { + const err = new TypeError('Plugins have to be a Promise that resolves to a plugin builder function or a RequireJS url (deprecated)'); + console.error(err); + return Promise.reject(err); + } + } + + // In lieu of automatic discovery, plugins will register dynamic objects + // Each object will have the following properties: + // name + // type (skin, screensaver, etc) + #register(obj) { + this.pluginsList.push(obj); + events.trigger(this, 'registered', [obj]); + } + + ofType(type) { + return this.pluginsList.filter((o) => { + return o.type === type; }); - } else if (pluginSpec.then) { - return pluginSpec.then(pluginBuilder => { - return pluginBuilder(); - }).then(plugin => { - console.debug(`Plugin loaded: ${plugin.id}`); - return registerPlugin(plugin); - }); - } else { - const err = new Error('Plugins have to be a Promise that resolves to a plugin builder function or a requirejs urls (deprecated)'); - console.error(err); - return Promise.reject(err); - } - }; - - // In lieu of automatic discovery, plugins will register dynamic objects - // Each object will have the following properties: - // name - // type (skin, screensaver, etc) - PluginManager.prototype.register = function (obj) { - this.pluginsList.push(obj); - events.trigger(this, 'registered', [obj]); - }; - - PluginManager.prototype.ofType = function (type) { - return this.pluginsList.filter(function (o) { - return o.type === type; - }); - }; - - PluginManager.prototype.plugins = function () { - return this.pluginsList; - }; - - PluginManager.prototype.mapRoute = function (plugin, route) { - if (typeof plugin === 'string') { - plugin = this.pluginsList.filter(function (p) { - return (p.id || p.packageName) === plugin; - })[0]; } - route = route.path || route; + #mapRoute(plugin, route) { + if (typeof plugin === 'string') { + plugin = this.pluginsList.filter((p) => { + return (p.id || p.packageName) === plugin; + })[0]; + } - if (route.toLowerCase().indexOf('http') === 0) { - return route; + route = route.path || route; + + if (route.toLowerCase().startsWith('http')) { + return route; + } + + return '/plugins/' + plugin.id + '/' + route; } - return '/plugins/' + plugin.id + '/' + route; - }; + mapPath(plugin, path, addCacheParam) { + if (typeof plugin === 'string') { + plugin = this.pluginsList.filter((p) => { + return (p.id || p.packageName) === plugin; + })[0]; + } - PluginManager.prototype.mapPath = function (plugin, path, addCacheParam) { - if (typeof plugin === 'string') { - plugin = this.pluginsList.filter(function (p) { - return (p.id || p.packageName) === plugin; - })[0]; + var url = plugin.baseUrl + '/' + path; + + if (addCacheParam) { + url += url.includes('?') ? '&' : '?'; + url += 'v=' + cacheParam; + } + + return url; } + } - var url = plugin.baseUrl + '/' + path; +/* eslint-enable indent */ - if (addCacheParam) { - url += url.indexOf('?') === -1 ? '?' : '&'; - url += 'v=' + cacheParam; - } - - return url; - }; - - return new PluginManager(); -}); +export default new PluginManager(); diff --git a/src/components/qualityOptions.js b/src/components/qualityOptions.js index 10a5df39ba..63d9557c7b 100644 --- a/src/components/qualityOptions.js +++ b/src/components/qualityOptions.js @@ -1,160 +1,158 @@ -define(['globalize'], function (globalize) { - 'use strict'; +import globalize from 'globalize'; - function getVideoQualityOptions(options) { - var maxStreamingBitrate = options.currentMaxBitrate; - var videoWidth = options.videoWidth; - var videoHeight = options.videoHeight; +export function getVideoQualityOptions(options) { + var maxStreamingBitrate = options.currentMaxBitrate; + var videoWidth = options.videoWidth; + var videoHeight = options.videoHeight; - // If the aspect ratio is less than 16/9 (1.77), set the width as if it were pillarboxed. - // 4:3 1440x1080 -> 1920x1080 - if (videoWidth / videoHeight < 16 / 9) { - videoWidth = videoHeight * (16 / 9); - } - - var maxAllowedWidth = videoWidth || 4096; - - var qualityOptions = []; - - if (maxAllowedWidth >= 3800) { - qualityOptions.push({ name: '4K - 120 Mbps', maxHeight: 2160, bitrate: 120000000 }); - qualityOptions.push({ name: '4K - 100 Mbps', maxHeight: 2160, bitrate: 100000000 }); - qualityOptions.push({ name: '4K - 80 Mbps', maxHeight: 2160, bitrate: 80000000 }); - } - - // Some 1080- videos are reported as 1912? - if (maxAllowedWidth >= 1900) { - qualityOptions.push({ name: '1080p - 60 Mbps', maxHeight: 1080, bitrate: 60000000 }); - qualityOptions.push({ name: '1080p - 50 Mbps', maxHeight: 1080, bitrate: 50000000 }); - qualityOptions.push({ name: '1080p - 40 Mbps', maxHeight: 1080, bitrate: 40000000 }); - qualityOptions.push({ name: '1080p - 30 Mbps', maxHeight: 1080, bitrate: 30000000 }); - qualityOptions.push({ name: '1080p - 25 Mbps', maxHeight: 1080, bitrate: 25000000 }); - qualityOptions.push({ name: '1080p - 20 Mbps', maxHeight: 1080, bitrate: 20000000 }); - qualityOptions.push({ name: '1080p - 15 Mbps', maxHeight: 1080, bitrate: 15000000 }); - qualityOptions.push({ name: '1080p - 10 Mbps', maxHeight: 1080, bitrate: 10000001 }); - qualityOptions.push({ name: '1080p - 8 Mbps', maxHeight: 1080, bitrate: 8000001 }); - qualityOptions.push({ name: '1080p - 6 Mbps', maxHeight: 1080, bitrate: 6000001 }); - qualityOptions.push({ name: '1080p - 5 Mbps', maxHeight: 1080, bitrate: 5000001 }); - qualityOptions.push({ name: '1080p - 4 Mbps', maxHeight: 1080, bitrate: 4000002 }); - } else if (maxAllowedWidth >= 1260) { - qualityOptions.push({ name: '720p - 10 Mbps', maxHeight: 720, bitrate: 10000000 }); - qualityOptions.push({ name: '720p - 8 Mbps', maxHeight: 720, bitrate: 8000000 }); - qualityOptions.push({ name: '720p - 6 Mbps', maxHeight: 720, bitrate: 6000000 }); - qualityOptions.push({ name: '720p - 5 Mbps', maxHeight: 720, bitrate: 5000000 }); - } else if (maxAllowedWidth >= 620) { - qualityOptions.push({ name: '480p - 4 Mbps', maxHeight: 480, bitrate: 4000001 }); - qualityOptions.push({ name: '480p - 3 Mbps', maxHeight: 480, bitrate: 3000001 }); - qualityOptions.push({ name: '480p - 2.5 Mbps', maxHeight: 480, bitrate: 2500000 }); - qualityOptions.push({ name: '480p - 2 Mbps', maxHeight: 480, bitrate: 2000001 }); - qualityOptions.push({ name: '480p - 1.5 Mbps', maxHeight: 480, bitrate: 1500001 }); - } - - if (maxAllowedWidth >= 1260) { - qualityOptions.push({ name: '720p - 4 Mbps', maxHeight: 720, bitrate: 4000000 }); - qualityOptions.push({ name: '720p - 3 Mbps', maxHeight: 720, bitrate: 3000000 }); - qualityOptions.push({ name: '720p - 2 Mbps', maxHeight: 720, bitrate: 2000000 }); - - // The extra 1 is because they're keyed off the bitrate value - qualityOptions.push({ name: '720p - 1.5 Mbps', maxHeight: 720, bitrate: 1500000 }); - qualityOptions.push({ name: '720p - 1 Mbps', maxHeight: 720, bitrate: 1000001 }); - } - - qualityOptions.push({ name: '480p - 1 Mbps', maxHeight: 480, bitrate: 1000000 }); - qualityOptions.push({ name: '480p - 720 kbps', maxHeight: 480, bitrate: 720000 }); - qualityOptions.push({ name: '480p - 420 kbps', maxHeight: 480, bitrate: 420000 }); - qualityOptions.push({ name: '360p', maxHeight: 360, bitrate: 400000 }); - qualityOptions.push({ name: '240p', maxHeight: 240, bitrate: 320000 }); - qualityOptions.push({ name: '144p', maxHeight: 144, bitrate: 192000 }); - - var autoQualityOption = { - name: globalize.translate('Auto'), - bitrate: 0, - selected: options.isAutomaticBitrateEnabled - }; - - if (options.enableAuto) { - qualityOptions.push(autoQualityOption); - } - - if (maxStreamingBitrate) { - var selectedIndex = -1; - for (var i = 0, length = qualityOptions.length; i < length; i++) { - var option = qualityOptions[i]; - - if (selectedIndex === -1 && option.bitrate <= maxStreamingBitrate) { - selectedIndex = i; - } - } - - if (selectedIndex === -1) { - selectedIndex = qualityOptions.length - 1; - } - - var currentQualityOption = qualityOptions[selectedIndex]; - - if (!options.isAutomaticBitrateEnabled) { - currentQualityOption.selected = true; - } else { - autoQualityOption.autoText = currentQualityOption.name; - } - } - - return qualityOptions; + // If the aspect ratio is less than 16/9 (1.77), set the width as if it were pillarboxed. + // 4:3 1440x1080 -> 1920x1080 + if (videoWidth / videoHeight < 16 / 9) { + videoWidth = videoHeight * (16 / 9); } - function getAudioQualityOptions(options) { - var maxStreamingBitrate = options.currentMaxBitrate; + var maxAllowedWidth = videoWidth || 4096; - var qualityOptions = []; + var qualityOptions = []; - qualityOptions.push({ name: '2 Mbps', bitrate: 2000000 }); - qualityOptions.push({ name: '1.5 Mbps', bitrate: 1500000 }); - qualityOptions.push({ name: '1 Mbps', bitrate: 1000000 }); - qualityOptions.push({ name: '320 kbps', bitrate: 320000 }); - qualityOptions.push({ name: '256 kbps', bitrate: 256000 }); - qualityOptions.push({ name: '192 kbps', bitrate: 192000 }); - qualityOptions.push({ name: '128 kbps', bitrate: 128000 }); - qualityOptions.push({ name: '96 kbps', bitrate: 96000 }); - qualityOptions.push({ name: '64 kbps', bitrate: 64000 }); - - var autoQualityOption = { - name: globalize.translate('Auto'), - bitrate: 0, - selected: options.isAutomaticBitrateEnabled - }; - - if (options.enableAuto) { - qualityOptions.push(autoQualityOption); - } - - if (maxStreamingBitrate) { - var selectedIndex = -1; - for (var i = 0, length = qualityOptions.length; i < length; i++) { - var option = qualityOptions[i]; - - if (selectedIndex === -1 && option.bitrate <= maxStreamingBitrate) { - selectedIndex = i; - } - } - - if (selectedIndex === -1) { - selectedIndex = qualityOptions.length - 1; - } - - var currentQualityOption = qualityOptions[selectedIndex]; - - if (!options.isAutomaticBitrateEnabled) { - currentQualityOption.selected = true; - } else { - autoQualityOption.autoText = currentQualityOption.name; - } - } - - return qualityOptions; + if (maxAllowedWidth >= 3800) { + qualityOptions.push({ name: '4K - 120 Mbps', maxHeight: 2160, bitrate: 120000000 }); + qualityOptions.push({ name: '4K - 100 Mbps', maxHeight: 2160, bitrate: 100000000 }); + qualityOptions.push({ name: '4K - 80 Mbps', maxHeight: 2160, bitrate: 80000000 }); } - return { - getVideoQualityOptions: getVideoQualityOptions, - getAudioQualityOptions: getAudioQualityOptions + // Some 1080- videos are reported as 1912? + if (maxAllowedWidth >= 1900) { + qualityOptions.push({ name: '1080p - 60 Mbps', maxHeight: 1080, bitrate: 60000000 }); + qualityOptions.push({ name: '1080p - 50 Mbps', maxHeight: 1080, bitrate: 50000000 }); + qualityOptions.push({ name: '1080p - 40 Mbps', maxHeight: 1080, bitrate: 40000000 }); + qualityOptions.push({ name: '1080p - 30 Mbps', maxHeight: 1080, bitrate: 30000000 }); + qualityOptions.push({ name: '1080p - 25 Mbps', maxHeight: 1080, bitrate: 25000000 }); + qualityOptions.push({ name: '1080p - 20 Mbps', maxHeight: 1080, bitrate: 20000000 }); + qualityOptions.push({ name: '1080p - 15 Mbps', maxHeight: 1080, bitrate: 15000000 }); + qualityOptions.push({ name: '1080p - 10 Mbps', maxHeight: 1080, bitrate: 10000001 }); + qualityOptions.push({ name: '1080p - 8 Mbps', maxHeight: 1080, bitrate: 8000001 }); + qualityOptions.push({ name: '1080p - 6 Mbps', maxHeight: 1080, bitrate: 6000001 }); + qualityOptions.push({ name: '1080p - 5 Mbps', maxHeight: 1080, bitrate: 5000001 }); + qualityOptions.push({ name: '1080p - 4 Mbps', maxHeight: 1080, bitrate: 4000002 }); + } else if (maxAllowedWidth >= 1260) { + qualityOptions.push({ name: '720p - 10 Mbps', maxHeight: 720, bitrate: 10000000 }); + qualityOptions.push({ name: '720p - 8 Mbps', maxHeight: 720, bitrate: 8000000 }); + qualityOptions.push({ name: '720p - 6 Mbps', maxHeight: 720, bitrate: 6000000 }); + qualityOptions.push({ name: '720p - 5 Mbps', maxHeight: 720, bitrate: 5000000 }); + } else if (maxAllowedWidth >= 620) { + qualityOptions.push({ name: '480p - 4 Mbps', maxHeight: 480, bitrate: 4000001 }); + qualityOptions.push({ name: '480p - 3 Mbps', maxHeight: 480, bitrate: 3000001 }); + qualityOptions.push({ name: '480p - 2.5 Mbps', maxHeight: 480, bitrate: 2500000 }); + qualityOptions.push({ name: '480p - 2 Mbps', maxHeight: 480, bitrate: 2000001 }); + qualityOptions.push({ name: '480p - 1.5 Mbps', maxHeight: 480, bitrate: 1500001 }); + } + + if (maxAllowedWidth >= 1260) { + qualityOptions.push({ name: '720p - 4 Mbps', maxHeight: 720, bitrate: 4000000 }); + qualityOptions.push({ name: '720p - 3 Mbps', maxHeight: 720, bitrate: 3000000 }); + qualityOptions.push({ name: '720p - 2 Mbps', maxHeight: 720, bitrate: 2000000 }); + + // The extra 1 is because they're keyed off the bitrate value + qualityOptions.push({ name: '720p - 1.5 Mbps', maxHeight: 720, bitrate: 1500000 }); + qualityOptions.push({ name: '720p - 1 Mbps', maxHeight: 720, bitrate: 1000001 }); + } + + qualityOptions.push({ name: '480p - 1 Mbps', maxHeight: 480, bitrate: 1000000 }); + qualityOptions.push({ name: '480p - 720 kbps', maxHeight: 480, bitrate: 720000 }); + qualityOptions.push({ name: '480p - 420 kbps', maxHeight: 480, bitrate: 420000 }); + qualityOptions.push({ name: '360p', maxHeight: 360, bitrate: 400000 }); + qualityOptions.push({ name: '240p', maxHeight: 240, bitrate: 320000 }); + qualityOptions.push({ name: '144p', maxHeight: 144, bitrate: 192000 }); + + var autoQualityOption = { + name: globalize.translate('Auto'), + bitrate: 0, + selected: options.isAutomaticBitrateEnabled }; -}); + + if (options.enableAuto) { + qualityOptions.push(autoQualityOption); + } + + if (maxStreamingBitrate) { + var selectedIndex = -1; + for (var i = 0, length = qualityOptions.length; i < length; i++) { + var option = qualityOptions[i]; + + if (selectedIndex === -1 && option.bitrate <= maxStreamingBitrate) { + selectedIndex = i; + } + } + + if (selectedIndex === -1) { + selectedIndex = qualityOptions.length - 1; + } + + var currentQualityOption = qualityOptions[selectedIndex]; + + if (!options.isAutomaticBitrateEnabled) { + currentQualityOption.selected = true; + } else { + autoQualityOption.autoText = currentQualityOption.name; + } + } + + return qualityOptions; +} + +export function getAudioQualityOptions(options) { + var maxStreamingBitrate = options.currentMaxBitrate; + + var qualityOptions = []; + + qualityOptions.push({ name: '2 Mbps', bitrate: 2000000 }); + qualityOptions.push({ name: '1.5 Mbps', bitrate: 1500000 }); + qualityOptions.push({ name: '1 Mbps', bitrate: 1000000 }); + qualityOptions.push({ name: '320 kbps', bitrate: 320000 }); + qualityOptions.push({ name: '256 kbps', bitrate: 256000 }); + qualityOptions.push({ name: '192 kbps', bitrate: 192000 }); + qualityOptions.push({ name: '128 kbps', bitrate: 128000 }); + qualityOptions.push({ name: '96 kbps', bitrate: 96000 }); + qualityOptions.push({ name: '64 kbps', bitrate: 64000 }); + + var autoQualityOption = { + name: globalize.translate('Auto'), + bitrate: 0, + selected: options.isAutomaticBitrateEnabled + }; + + if (options.enableAuto) { + qualityOptions.push(autoQualityOption); + } + + if (maxStreamingBitrate) { + var selectedIndex = -1; + for (var i = 0, length = qualityOptions.length; i < length; i++) { + var option = qualityOptions[i]; + + if (selectedIndex === -1 && option.bitrate <= maxStreamingBitrate) { + selectedIndex = i; + } + } + + if (selectedIndex === -1) { + selectedIndex = qualityOptions.length - 1; + } + + var currentQualityOption = qualityOptions[selectedIndex]; + + if (!options.isAutomaticBitrateEnabled) { + currentQualityOption.selected = true; + } else { + autoQualityOption.autoText = currentQualityOption.name; + } + } + + return qualityOptions; +} + +export default { + getVideoQualityOptions, + getAudioQualityOptions +}; diff --git a/src/components/recordingcreator/recordingbutton.js b/src/components/recordingcreator/recordingbutton.js index 3ad4ffa594..9f102e2f9c 100644 --- a/src/components/recordingcreator/recordingbutton.js +++ b/src/components/recordingcreator/recordingbutton.js @@ -1,35 +1,40 @@ -define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button', 'css!./recordingfields'], function (globalize, connectionManager, require, loading, appHost, dom, recordingHelper, events) { - 'use strict'; +import connectionManager from 'connectionManager'; +import dom from 'dom'; +import recordingHelper from 'recordingHelper'; +import 'paper-icon-button-light'; +import 'emby-button'; +import 'css!./recordingfields'; - function onRecordingButtonClick(e) { - var item = this.item; +function onRecordingButtonClick(e) { + const item = this.item; - if (item) { - var serverId = item.ServerId; - var programId = item.Id; - var timerId = item.TimerId; - var timerStatus = item.Status; - var seriesTimerId = item.SeriesTimerId; + if (item) { + const serverId = item.ServerId; + const programId = item.Id; + const timerId = item.TimerId; + const timerStatus = item.Status; + const seriesTimerId = item.SeriesTimerId; - var instance = this; + const instance = this; - recordingHelper.toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId).then(function () { - instance.refresh(serverId, programId); - }); - } + recordingHelper.toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId).then(function () { + instance.refresh(serverId, programId); + }); } +} - function setButtonIcon(button, icon) { - var inner = button.querySelector('.material-icons'); - inner.classList.remove('fiber_smart_record'); - inner.classList.remove('fiber_manual_record'); - inner.classList.add(icon); - } +function setButtonIcon(button, icon) { + const inner = button.querySelector('.material-icons'); + inner.classList.remove('fiber_smart_record'); + inner.classList.remove('fiber_manual_record'); + inner.classList.add(icon); +} - function RecordingButton(options) { +class RecordingButton { + constructor(options) { this.options = options; - var button = options.button; + const button = options.button; setButtonIcon(button, 'fiber_manual_record'); @@ -39,7 +44,7 @@ define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom' this.refresh(options.itemId, options.serverId); } - var clickFn = onRecordingButtonClick.bind(this); + const clickFn = onRecordingButtonClick.bind(this); this.clickFn = clickFn; dom.addEventListener(button, 'click', clickFn, { @@ -47,39 +52,17 @@ define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom' }); } - function getIndicatorIcon(item) { - var status; - - if (item.Type === 'SeriesTimer') { - return 'fiber_smart_record'; - } else if (item.TimerId || item.SeriesTimerId) { - status = item.Status || 'Cancelled'; - } else if (item.Type === 'Timer') { - status = item.Status; - } else { - return 'fiber_manual_record'; - } - - if (item.SeriesTimerId) { - if (status !== 'Cancelled') { - return 'fiber_smart_record'; - } - } - - return 'fiber_manual_record'; - } - - RecordingButton.prototype.refresh = function (serverId, itemId) { - var apiClient = connectionManager.getApiClient(serverId); - var self = this; + refresh(serverId, itemId) { + const apiClient = connectionManager.getApiClient(serverId); + const self = this; apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { self.refreshItem(item); }); - }; + } - RecordingButton.prototype.refreshItem = function (item) { - var options = this.options; - var button = options.button; + refreshItem(item) { + const options = this.options; + const button = options.button; this.item = item; setButtonIcon(button, getIndicatorIcon(item)); @@ -88,15 +71,15 @@ define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom' } else { button.classList.remove('recordingIcon-active'); } - }; + } - RecordingButton.prototype.destroy = function () { - var options = this.options; + destroy() { + const options = this.options; if (options) { - var button = options.button; + const button = options.button; - var clickFn = this.clickFn; + const clickFn = this.clickFn; if (clickFn) { dom.removeEventListener(button, 'click', clickFn, { @@ -107,7 +90,29 @@ define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom' this.options = null; this.item = null; - }; + } +} - return RecordingButton; -}); +function getIndicatorIcon(item) { + let status; + + if (item.Type === 'SeriesTimer') { + return 'fiber_smart_record'; + } else if (item.TimerId || item.SeriesTimerId) { + status = item.Status || 'Cancelled'; + } else if (item.Type === 'Timer') { + status = item.Status; + } else { + return 'fiber_manual_record'; + } + + if (item.SeriesTimerId) { + if (status !== 'Cancelled') { + return 'fiber_smart_record'; + } + } + + return 'fiber_manual_record'; +} + +export default RecordingButton; diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js index f330e54156..9cb4e41d2e 100644 --- a/src/components/recordingcreator/recordingcreator.js +++ b/src/components/recordingcreator/recordingcreator.js @@ -1,187 +1,204 @@ -define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'datetime', 'imageLoader', 'recordingFields', 'events', 'emby-checkbox', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, datetime, imageLoader, recordingFields, events) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import globalize from 'globalize'; +import layoutManager from 'layoutManager'; +import mediaInfo from 'mediaInfo'; +import connectionManager from 'connectionManager'; +import require from 'require'; +import loading from 'loading'; +import scrollHelper from 'scrollHelper'; +import datetime from 'datetime'; +import imageLoader from 'imageLoader'; +import recordingFields from 'recordingFields'; +import events from 'events'; +import 'emby-checkbox'; +import 'emby-button'; +import 'emby-collapse'; +import 'emby-input'; +import 'paper-icon-button-light'; +import 'css!./../formdialog'; +import 'css!./recordingcreator'; +import 'material-icons'; - var currentDialog; - var closeAction; - var currentRecordingFields; +let currentDialog; +let closeAction; +let currentRecordingFields; - function closeDialog() { - dialogHelper.close(currentDialog); +function closeDialog() { + dialogHelper.close(currentDialog); +} + +function init(context) { + context.querySelector('.btnPlay').addEventListener('click', function () { + closeAction = 'play'; + closeDialog(); + }); + + context.querySelector('.btnCancel').addEventListener('click', function () { + closeAction = null; + closeDialog(); + }); +} + +function getImageUrl(item, apiClient, imageHeight) { + const imageTags = item.ImageTags || {}; + + if (item.PrimaryImageTag) { + imageTags.Primary = item.PrimaryImageTag; } - function init(context) { - context.querySelector('.btnPlay').addEventListener('click', function () { - closeAction = 'play'; - closeDialog(); + if (imageTags.Primary) { + return apiClient.getScaledImageUrl(item.Id, { + type: 'Primary', + maxHeight: imageHeight, + tag: item.ImageTags.Primary }); - - context.querySelector('.btnCancel').addEventListener('click', function () { - closeAction = null; - closeDialog(); + } else if (imageTags.Thumb) { + return apiClient.getScaledImageUrl(item.Id, { + type: 'Thumb', + maxHeight: imageHeight, + tag: item.ImageTags.Thumb }); } - function getImageUrl(item, apiClient, imageHeight) { - var imageTags = item.ImageTags || {}; + return null; +} - if (item.PrimaryImageTag) { - imageTags.Primary = item.PrimaryImageTag; +function renderRecording(context, defaultTimer, program, apiClient, refreshRecordingStateOnly) { + if (!refreshRecordingStateOnly) { + const imgUrl = getImageUrl(program, apiClient, 200); + const imageContainer = context.querySelector('.recordingDialog-imageContainer'); + + if (imgUrl) { + imageContainer.innerHTML = ''; + imageContainer.classList.remove('hide'); + + imageLoader.lazyChildren(imageContainer); + } else { + imageContainer.innerHTML = ''; + imageContainer.classList.add('hide'); } - if (imageTags.Primary) { - return apiClient.getScaledImageUrl(item.Id, { - type: 'Primary', - maxHeight: imageHeight, - tag: item.ImageTags.Primary - }); - } else if (imageTags.Thumb) { - return apiClient.getScaledImageUrl(item.Id, { - type: 'Thumb', - maxHeight: imageHeight, - tag: item.ImageTags.Thumb - }); + context.querySelector('.recordingDialog-itemName').innerHTML = program.Name; + context.querySelector('.formDialogHeaderTitle').innerHTML = program.Name; + context.querySelector('.itemGenres').innerHTML = (program.Genres || []).join(' / '); + context.querySelector('.itemOverview').innerHTML = program.Overview || ''; + + const formDialogFooter = context.querySelector('.formDialogFooter'); + const now = new Date(); + if (now >= datetime.parseISO8601Date(program.StartDate, true) && now < datetime.parseISO8601Date(program.EndDate, true)) { + formDialogFooter.classList.remove('hide'); + } else { + formDialogFooter.classList.add('hide'); } - return null; + context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program); } - function renderRecording(context, defaultTimer, program, apiClient, refreshRecordingStateOnly) { - if (!refreshRecordingStateOnly) { - var imgUrl = getImageUrl(program, apiClient, 200); - var imageContainer = context.querySelector('.recordingDialog-imageContainer'); + context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program, { + }); - if (imgUrl) { - imageContainer.innerHTML = ''; - imageContainer.classList.remove('hide'); + loading.hide(); +} - imageLoader.lazyChildren(imageContainer); - } else { - imageContainer.innerHTML = ''; - imageContainer.classList.add('hide'); - } +function reload(context, programId, serverId, refreshRecordingStateOnly) { + loading.show(); - context.querySelector('.recordingDialog-itemName').innerHTML = program.Name; - context.querySelector('.formDialogHeaderTitle').innerHTML = program.Name; - context.querySelector('.itemGenres').innerHTML = (program.Genres || []).join(' / '); - context.querySelector('.itemOverview').innerHTML = program.Overview || ''; + const apiClient = connectionManager.getApiClient(serverId); - var formDialogFooter = context.querySelector('.formDialogFooter'); - var now = new Date(); - if (now >= datetime.parseISO8601Date(program.StartDate, true) && now < datetime.parseISO8601Date(program.EndDate, true)) { - formDialogFooter.classList.remove('hide'); - } else { - formDialogFooter.classList.add('hide'); - } + const promise1 = apiClient.getNewLiveTvTimerDefaults({ programId: programId }); + const promise2 = apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()); - context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program); - } + Promise.all([promise1, promise2]).then(function (responses) { + const defaults = responses[0]; + const program = responses[1]; - context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program, { - }); + renderRecording(context, defaults, program, apiClient, refreshRecordingStateOnly); + }); +} - loading.hide(); - } +function executeCloseAction(action, programId, serverId) { + if (action === 'play') { + import('playbackManager').then(({ default: playbackManager }) => { + const apiClient = connectionManager.getApiClient(serverId); - function reload(context, programId, serverId, refreshRecordingStateOnly) { - loading.show(); - - var apiClient = connectionManager.getApiClient(serverId); - - var promise1 = apiClient.getNewLiveTvTimerDefaults({ programId: programId }); - var promise2 = apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()); - - Promise.all([promise1, promise2]).then(function (responses) { - var defaults = responses[0]; - var program = responses[1]; - - renderRecording(context, defaults, program, apiClient, refreshRecordingStateOnly); - }); - } - - function executeCloseAction(action, programId, serverId) { - if (action === 'play') { - require(['playbackManager'], function (playbackManager) { - var apiClient = connectionManager.getApiClient(serverId); - - apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) { - playbackManager.play({ - ids: [item.ChannelId], - serverId: serverId - }); - }); - }); - return; - } - } - - function showEditor(itemId, serverId) { - return new Promise(function (resolve, reject) { - closeAction = null; - - loading.show(); - - require(['text!./recordingcreator.template.html'], function (template) { - var dialogOptions = { - removeOnClose: true, - scrollY: false - }; - - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; - } else { - dialogOptions.size = 'small'; - } - - var dlg = dialogHelper.createDialog(dialogOptions); - - dlg.classList.add('formDialog'); - dlg.classList.add('recordingDialog'); - - var html = ''; - - html += globalize.translateHtml(template, 'core'); - - dlg.innerHTML = html; - - currentDialog = dlg; - - function onRecordingChanged() { - reload(dlg, itemId, serverId, true); - } - - dlg.addEventListener('close', function () { - events.off(currentRecordingFields, 'recordingchanged', onRecordingChanged); - executeCloseAction(closeAction, itemId, serverId); - - if (currentRecordingFields && currentRecordingFields.hasChanged()) { - resolve(); - } else { - reject(); - } - }); - - if (layoutManager.tv) { - scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); - } - - init(dlg); - - reload(dlg, itemId, serverId); - - currentRecordingFields = new recordingFields({ - parent: dlg.querySelector('.recordingFields'), - programId: itemId, + apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) { + playbackManager.play({ + ids: [item.ChannelId], serverId: serverId }); - - events.on(currentRecordingFields, 'recordingchanged', onRecordingChanged); - - dialogHelper.open(dlg); }); }); + return; } +} - return { - show: showEditor - }; -}); +function showEditor(itemId, serverId) { + return new Promise(function (resolve, reject) { + closeAction = null; + + loading.show(); + + import('text!./recordingcreator.template.html').then(({ default: template }) => { + const dialogOptions = { + removeOnClose: true, + scrollY: false + }; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + } else { + dialogOptions.size = 'small'; + } + + const dlg = dialogHelper.createDialog(dialogOptions); + + dlg.classList.add('formDialog'); + dlg.classList.add('recordingDialog'); + + let html = ''; + + html += globalize.translateHtml(template, 'core'); + + dlg.innerHTML = html; + + currentDialog = dlg; + + function onRecordingChanged() { + reload(dlg, itemId, serverId, true); + } + + dlg.addEventListener('close', function () { + events.off(currentRecordingFields, 'recordingchanged', onRecordingChanged); + executeCloseAction(closeAction, itemId, serverId); + + if (currentRecordingFields && currentRecordingFields.hasChanged()) { + resolve(); + } else { + reject(); + } + }); + + if (layoutManager.tv) { + scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); + } + + init(dlg); + + reload(dlg, itemId, serverId); + + currentRecordingFields = new recordingFields({ + parent: dlg.querySelector('.recordingFields'), + programId: itemId, + serverId: serverId + }); + + events.on(currentRecordingFields, 'recordingchanged', onRecordingChanged); + + dialogHelper.open(dlg); + }); + }); +} + +export default { + show: showEditor +}; diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js index 3797cde370..096ea3b62c 100644 --- a/src/components/recordingcreator/recordingeditor.js +++ b/src/components/recordingcreator/recordingeditor.js @@ -1,145 +1,155 @@ -define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import globalize from 'globalize'; +import layoutManager from 'layoutManager'; +import connectionManager from 'connectionManager'; +import loading from 'loading'; +import scrollHelper from 'scrollHelper'; +import 'scrollStyles'; +import 'emby-button'; +import 'emby-collapse'; +import 'emby-input'; +import 'paper-icon-button-light'; +import 'css!./../formdialog'; +import 'css!./recordingcreator'; +import 'material-icons'; +import 'flexStyles'; - var currentDialog; - var recordingDeleted = false; - var currentItemId; - var currentServerId; - var currentResolve; +let currentDialog; +let recordingDeleted = false; +let currentItemId; +let currentServerId; +let currentResolve; - function deleteTimer(apiClient, timerId) { - return new Promise(function (resolve, reject) { - require(['recordingHelper'], function (recordingHelper) { - recordingHelper.cancelTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject); - }); +function deleteTimer(apiClient, timerId) { + return import('recordingHelper').then(({ default: recordingHelper }) => { + recordingHelper.cancelTimerWithConfirmation(timerId, apiClient.serverId()); + }); +} + +function renderTimer(context, item, apiClient) { + context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60; + context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60; + + loading.hide(); +} + +function closeDialog(isDeleted) { + recordingDeleted = isDeleted; + dialogHelper.close(currentDialog); +} + +function onSubmit(e) { + const form = this; + + const apiClient = connectionManager.getApiClient(currentServerId); + + apiClient.getLiveTvTimer(currentItemId).then(function (item) { + item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; + item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60; + apiClient.updateLiveTvTimer(item).then(currentResolve); + }); + + e.preventDefault(); + + // Disable default form submission + return false; +} + +function init(context) { + context.querySelector('.btnCancel').addEventListener('click', function () { + closeDialog(false); + }); + + context.querySelector('.btnCancelRecording').addEventListener('click', function () { + const apiClient = connectionManager.getApiClient(currentServerId); + + deleteTimer(apiClient, currentItemId).then(function () { + closeDialog(true); }); - } + }); - function renderTimer(context, item, apiClient) { - context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60; - context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60; + context.querySelector('form').addEventListener('submit', onSubmit); +} +function reload(context, id) { + loading.show(); + currentItemId = id; + + const apiClient = connectionManager.getApiClient(currentServerId); + apiClient.getLiveTvTimer(id).then(function (result) { + renderTimer(context, result, apiClient); loading.hide(); - } + }); +} - function closeDialog(isDeleted) { - recordingDeleted = isDeleted; - - dialogHelper.close(currentDialog); - } - - function onSubmit(e) { - var form = this; - - var apiClient = connectionManager.getApiClient(currentServerId); - - apiClient.getLiveTvTimer(currentItemId).then(function (item) { - item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; - item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60; - apiClient.updateLiveTvTimer(item).then(currentResolve); - }); - - e.preventDefault(); - - // Disable default form submission - return false; - } - - function init(context) { - context.querySelector('.btnCancel').addEventListener('click', function () { - closeDialog(false); - }); - - context.querySelector('.btnCancelRecording').addEventListener('click', function () { - var apiClient = connectionManager.getApiClient(currentServerId); - deleteTimer(apiClient, currentItemId).then(function () { - closeDialog(true); - }); - }); - - context.querySelector('form').addEventListener('submit', onSubmit); - } - - function reload(context, id) { +function showEditor(itemId, serverId, options) { + return new Promise(function (resolve, reject) { + recordingDeleted = false; + currentServerId = serverId; loading.show(); - currentItemId = id; + options = options || {}; + currentResolve = resolve; - var apiClient = connectionManager.getApiClient(currentServerId); - apiClient.getLiveTvTimer(id).then(function (result) { - renderTimer(context, result, apiClient); - loading.hide(); - }); - } + import('text!./recordingeditor.template.html').then(({default: template}) => { + const dialogOptions = { + removeOnClose: true, + scrollY: false + }; - function showEditor(itemId, serverId, options) { - return new Promise(function (resolve, reject) { - recordingDeleted = false; - currentServerId = serverId; - loading.show(); - options = options || {}; - currentResolve = resolve; + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + } - require(['text!./recordingeditor.template.html'], function (template) { - var dialogOptions = { - removeOnClose: true, - scrollY: false - }; + const dlg = dialogHelper.createDialog(dialogOptions); - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; + dlg.classList.add('formDialog'); + dlg.classList.add('recordingDialog'); + + if (!layoutManager.tv) { + dlg.style['min-width'] = '20%'; + dlg.classList.add('dialog-fullscreen-lowres'); + } + + let html = ''; + + html += globalize.translateHtml(template, 'core'); + + dlg.innerHTML = html; + + if (options.enableCancel === false) { + dlg.querySelector('.formDialogFooter').classList.add('hide'); + } + + currentDialog = dlg; + + dlg.addEventListener('closing', function () { + if (!recordingDeleted) { + dlg.querySelector('.btnSubmit').click(); } - - var dlg = dialogHelper.createDialog(dialogOptions); - - dlg.classList.add('formDialog'); - dlg.classList.add('recordingDialog'); - - if (!layoutManager.tv) { - dlg.style['min-width'] = '20%'; - dlg.classList.add('dialog-fullscreen-lowres'); - } - - var html = ''; - - html += globalize.translateHtml(template, 'core'); - - dlg.innerHTML = html; - - if (options.enableCancel === false) { - dlg.querySelector('.formDialogFooter').classList.add('hide'); - } - - currentDialog = dlg; - - dlg.addEventListener('closing', function () { - if (!recordingDeleted) { - dlg.querySelector('.btnSubmit').click(); - } - }); - - dlg.addEventListener('close', function () { - if (recordingDeleted) { - resolve({ - updated: true, - deleted: true - }); - } - }); - - if (layoutManager.tv) { - scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); - } - - init(dlg); - - reload(dlg, itemId); - - dialogHelper.open(dlg); }); - }); - } - return { - show: showEditor - }; -}); + dlg.addEventListener('close', function () { + if (recordingDeleted) { + resolve({ + updated: true, + deleted: true + }); + } + }); + + if (layoutManager.tv) { + scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); + } + + init(dlg); + + reload(dlg, itemId); + + dialogHelper.open(dlg); + }); + }); +} + +export default { + show: showEditor +}; diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js index 2534eafe6a..d9d7c0098c 100644 --- a/src/components/recordingcreator/recordingfields.js +++ b/src/components/recordingcreator/recordingfields.js @@ -1,219 +1,126 @@ -define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button', 'css!./recordingfields', 'flexStyles'], function (globalize, connectionManager, serverNotifications, require, loading, appHost, dom, recordingHelper, events) { - 'use strict'; +import globalize from 'globalize'; +import connectionManager from 'connectionManager'; +import serverNotifications from 'serverNotifications'; +import loading from 'loading'; +import dom from 'dom'; +import recordingHelper from 'recordingHelper'; +import events from 'events'; +import 'paper-icon-button-light'; +import 'emby-button'; +import 'css!./recordingfields'; +import 'flexStyles'; - function loadData(parent, program, apiClient) { - if (program.IsSeries) { - parent.querySelector('.recordSeriesContainer').classList.remove('hide'); +/*eslint prefer-const: "error"*/ + +function loadData(parent, program, apiClient) { + if (program.IsSeries) { + parent.querySelector('.recordSeriesContainer').classList.remove('hide'); + } else { + parent.querySelector('.recordSeriesContainer').classList.add('hide'); + } + + if (program.SeriesTimerId) { + parent.querySelector('.btnManageSeriesRecording').classList.remove('hide'); + parent.querySelector('.seriesRecordingButton .recordingIcon').classList.add('recordingIcon-active'); + parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('CancelSeries'); + } else { + parent.querySelector('.btnManageSeriesRecording').classList.add('hide'); + parent.querySelector('.seriesRecordingButton .recordingIcon').classList.remove('recordingIcon-active'); + parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('RecordSeries'); + } + + if (program.TimerId && program.Status !== 'Cancelled') { + parent.querySelector('.btnManageRecording').classList.remove('hide'); + parent.querySelector('.singleRecordingButton .recordingIcon').classList.add('recordingIcon-active'); + if (program.Status === 'InProgress') { + parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('StopRecording'); } else { - parent.querySelector('.recordSeriesContainer').classList.add('hide'); + parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('DoNotRecord'); } + } else { + parent.querySelector('.btnManageRecording').classList.add('hide'); + parent.querySelector('.singleRecordingButton .recordingIcon').classList.remove('recordingIcon-active'); + parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('Record'); + } +} - if (program.SeriesTimerId) { - parent.querySelector('.btnManageSeriesRecording').classList.remove('hide'); - parent.querySelector('.seriesRecordingButton .recordingIcon').classList.add('recordingIcon-active'); - parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('CancelSeries'); - } else { - parent.querySelector('.btnManageSeriesRecording').classList.add('hide'); - parent.querySelector('.seriesRecordingButton .recordingIcon').classList.remove('recordingIcon-active'); - parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('RecordSeries'); +function fetchData(instance) { + const options = instance.options; + const apiClient = connectionManager.getApiClient(options.serverId); + + options.parent.querySelector('.recordingFields').classList.remove('hide'); + return apiClient.getLiveTvProgram(options.programId, apiClient.getCurrentUserId()).then(function (program) { + instance.TimerId = program.TimerId; + instance.Status = program.Status; + instance.SeriesTimerId = program.SeriesTimerId; + loadData(options.parent, program, apiClient); + }); +} + +function onTimerChangedExternally(e, apiClient, data) { + const options = this.options; + let refresh = false; + + if (data.Id) { + if (this.TimerId === data.Id) { + refresh = true; } - - if (program.TimerId && program.Status !== 'Cancelled') { - parent.querySelector('.btnManageRecording').classList.remove('hide'); - parent.querySelector('.singleRecordingButton .recordingIcon').classList.add('recordingIcon-active'); - if (program.Status === 'InProgress') { - parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('StopRecording'); - } else { - parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('DoNotRecord'); - } - } else { - parent.querySelector('.btnManageRecording').classList.add('hide'); - parent.querySelector('.singleRecordingButton .recordingIcon').classList.remove('recordingIcon-active'); - parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('Record'); + } + if (data.ProgramId && options) { + if (options.programId === data.ProgramId) { + refresh = true; } } - function fetchData(instance) { - var options = instance.options; - var apiClient = connectionManager.getApiClient(options.serverId); - - options.parent.querySelector('.recordingFields').classList.remove('hide'); - return apiClient.getLiveTvProgram(options.programId, apiClient.getCurrentUserId()).then(function (program) { - instance.TimerId = program.TimerId; - instance.Status = program.Status; - instance.SeriesTimerId = program.SeriesTimerId; - loadData(options.parent, program, apiClient); - }); + if (refresh) { + this.refresh(); } +} - function onTimerChangedExternally(e, apiClient, data) { - var options = this.options; - var refresh = false; +function onSeriesTimerChangedExternally(e, apiClient, data) { + const options = this.options; + let refresh = false; - if (data.Id) { - if (this.TimerId === data.Id) { - refresh = true; - } + if (data.Id) { + if (this.SeriesTimerId === data.Id) { + refresh = true; } - if (data.ProgramId && options) { - if (options.programId === data.ProgramId) { - refresh = true; - } - } - - if (refresh) { - this.refresh(); + } + if (data.ProgramId && options) { + if (options.programId === data.ProgramId) { + refresh = true; } } - function onSeriesTimerChangedExternally(e, apiClient, data) { - var options = this.options; - var refresh = false; - - if (data.Id) { - if (this.SeriesTimerId === data.Id) { - refresh = true; - } - } - if (data.ProgramId && options) { - if (options.programId === data.ProgramId) { - refresh = true; - } - } - - if (refresh) { - this.refresh(); - } + if (refresh) { + this.refresh(); } +} - function RecordingEditor(options) { +class RecordingEditor { + constructor(options) { this.options = options; this.embed(); - var timerChangedHandler = onTimerChangedExternally.bind(this); + const timerChangedHandler = onTimerChangedExternally.bind(this); this.timerChangedHandler = timerChangedHandler; events.on(serverNotifications, 'TimerCreated', timerChangedHandler); events.on(serverNotifications, 'TimerCancelled', timerChangedHandler); - var seriesTimerChangedHandler = onSeriesTimerChangedExternally.bind(this); + const seriesTimerChangedHandler = onSeriesTimerChangedExternally.bind(this); this.seriesTimerChangedHandler = seriesTimerChangedHandler; events.on(serverNotifications, 'SeriesTimerCreated', seriesTimerChangedHandler); events.on(serverNotifications, 'SeriesTimerCancelled', seriesTimerChangedHandler); } - function onManageRecordingClick(e) { - var options = this.options; - if (!this.TimerId || this.Status === 'Cancelled') { - return; - } - - var self = this; - require(['recordingEditor'], function (recordingEditor) { - recordingEditor.show(self.TimerId, options.serverId, { - enableCancel: false - }).then(function () { - self.changed = true; - }); - }); - } - - function onManageSeriesRecordingClick(e) { - var options = this.options; - - if (!this.SeriesTimerId) { - return; - } - - var self = this; - - require(['seriesRecordingEditor'], function (seriesRecordingEditor) { - seriesRecordingEditor.show(self.SeriesTimerId, options.serverId, { - - enableCancel: false - - }).then(function () { - self.changed = true; - }); - }); - } - - function onRecordChange(e) { - this.changed = true; - - var self = this; - var options = this.options; - var apiClient = connectionManager.getApiClient(options.serverId); - - var button = dom.parentWithTag(e.target, 'BUTTON'); - var isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active'); - - var hasEnabledTimer = this.TimerId && this.Status !== 'Cancelled'; - - if (isChecked) { - if (!hasEnabledTimer) { - loading.show(); - recordingHelper.createRecording(apiClient, options.programId, false).then(function () { - events.trigger(self, 'recordingchanged'); - fetchData(self); - loading.hide(); - }); - } - } else { - if (hasEnabledTimer) { - loading.show(); - recordingHelper.cancelTimer(apiClient, this.TimerId, true).then(function () { - events.trigger(self, 'recordingchanged'); - fetchData(self); - loading.hide(); - }); - } - } - } - - function sendToast(msg) { - require(['toast'], function (toast) { - toast(msg); - }); - } - - function onRecordSeriesChange(e) { - this.changed = true; - - var self = this; - var options = this.options; - var apiClient = connectionManager.getApiClient(options.serverId); - - var button = dom.parentWithTag(e.target, 'BUTTON'); - var isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active'); - - if (isChecked) { - options.parent.querySelector('.recordSeriesContainer').classList.remove('hide'); - if (!this.SeriesTimerId) { - var promise = this.TimerId ? - recordingHelper.changeRecordingToSeries(apiClient, this.TimerId, options.programId) : - recordingHelper.createRecording(apiClient, options.programId, true); - promise.then(function () { - fetchData(self); - }); - } - } else { - if (this.SeriesTimerId) { - apiClient.cancelLiveTvSeriesTimer(this.SeriesTimerId).then(function () { - sendToast(globalize.translate('RecordingCancelled')); - fetchData(self); - }); - } - } - } - - RecordingEditor.prototype.embed = function () { - var self = this; + embed() { + const self = this; return new Promise(function (resolve, reject) { - require(['text!./recordingfields.template.html'], function (template) { - var options = self.options; - var context = options.parent; + import('text!./recordingfields.template.html').then(({default: template}) => { + const options = self.options; + const context = options.parent; context.innerHTML = globalize.translateHtml(template, 'core'); context.querySelector('.singleRecordingButton').addEventListener('click', onRecordChange.bind(self)); @@ -224,29 +131,134 @@ define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loa fetchData(self).then(resolve); }); }); - }; + } - RecordingEditor.prototype.hasChanged = function () { + hasChanged() { return this.changed; - }; + } - RecordingEditor.prototype.refresh = function () { + refresh() { fetchData(this); - }; + } - RecordingEditor.prototype.destroy = function () { - var timerChangedHandler = this.timerChangedHandler; + destroy() { + const timerChangedHandler = this.timerChangedHandler; this.timerChangedHandler = null; events.off(serverNotifications, 'TimerCreated', timerChangedHandler); events.off(serverNotifications, 'TimerCancelled', timerChangedHandler); - var seriesTimerChangedHandler = this.seriesTimerChangedHandler; + const seriesTimerChangedHandler = this.seriesTimerChangedHandler; this.seriesTimerChangedHandler = null; events.off(serverNotifications, 'SeriesTimerCreated', seriesTimerChangedHandler); events.off(serverNotifications, 'SeriesTimerCancelled', seriesTimerChangedHandler); - }; + } +} - return RecordingEditor; -}); +function onManageRecordingClick(e) { + const options = this.options; + if (!this.TimerId || this.Status === 'Cancelled') { + return; + } + + const self = this; + import('recordingEditor').then(({default: recordingEditor}) => { + recordingEditor.show(self.TimerId, options.serverId, { + enableCancel: false + }).then(function () { + self.changed = true; + }); + }); +} + +function onManageSeriesRecordingClick(e) { + const options = this.options; + + if (!this.SeriesTimerId) { + return; + } + + const self = this; + + import('seriesRecordingEditor').then(({default: seriesRecordingEditor}) => { + seriesRecordingEditor.show(self.SeriesTimerId, options.serverId, { + + enableCancel: false + + }).then(function () { + self.changed = true; + }); + }); +} + +function onRecordChange(e) { + this.changed = true; + + const self = this; + const options = this.options; + const apiClient = connectionManager.getApiClient(options.serverId); + + const button = dom.parentWithTag(e.target, 'BUTTON'); + const isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active'); + + const hasEnabledTimer = this.TimerId && this.Status !== 'Cancelled'; + + if (isChecked) { + if (!hasEnabledTimer) { + loading.show(); + recordingHelper.createRecording(apiClient, options.programId, false).then(function () { + events.trigger(self, 'recordingchanged'); + fetchData(self); + loading.hide(); + }); + } + } else { + if (hasEnabledTimer) { + loading.show(); + recordingHelper.cancelTimer(apiClient, this.TimerId, true).then(function () { + events.trigger(self, 'recordingchanged'); + fetchData(self); + loading.hide(); + }); + } + } +} + +function sendToast(msg) { + import('toast').then(({default: toast}) => { + toast(msg); + }); +} + +function onRecordSeriesChange(e) { + this.changed = true; + + const self = this; + const options = this.options; + const apiClient = connectionManager.getApiClient(options.serverId); + + const button = dom.parentWithTag(e.target, 'BUTTON'); + const isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active'); + + if (isChecked) { + options.parent.querySelector('.recordSeriesContainer').classList.remove('hide'); + if (!this.SeriesTimerId) { + const promise = this.TimerId ? + recordingHelper.changeRecordingToSeries(apiClient, this.TimerId, options.programId) : + recordingHelper.createRecording(apiClient, options.programId, true); + promise.then(function () { + fetchData(self); + }); + } + } else { + if (this.SeriesTimerId) { + apiClient.cancelLiveTvSeriesTimer(this.SeriesTimerId).then(function () { + sendToast(globalize.translate('RecordingCancelled')); + fetchData(self); + }); + } + } +} + +export default RecordingEditor; diff --git a/src/components/recordingcreator/recordinghelper.js b/src/components/recordingcreator/recordinghelper.js index 4a0bdd9b01..13359de2bc 100644 --- a/src/components/recordingcreator/recordinghelper.js +++ b/src/components/recordingcreator/recordinghelper.js @@ -1,192 +1,195 @@ -define(['globalize', 'loading', 'connectionManager'], function (globalize, loading, connectionManager) { - 'use strict'; +import globalize from 'globalize'; +import loading from 'loading'; +import connectionManager from 'connectionManager'; - function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) { - loading.show(); +/*eslint prefer-const: "error"*/ - return apiClient.getItem(apiClient.getCurrentUserId(), programId).then(function (item) { - if (item.IsSeries) { - // create series - return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (timerDefaults) { - return apiClient.createLiveTvSeriesTimer(timerDefaults).then(function () { - loading.hide(); - sendToast(globalize.translate('SeriesRecordingScheduled')); +function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) { + loading.show(); + + return apiClient.getItem(apiClient.getCurrentUserId(), programId).then(function (item) { + if (item.IsSeries) { + // create series + return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (timerDefaults) { + return apiClient.createLiveTvSeriesTimer(timerDefaults).then(function () { + loading.hide(); + sendToast(globalize.translate('SeriesRecordingScheduled')); + }); + }); + } else { + // cancel + if (confirmTimerCancellation) { + return cancelTimerWithConfirmation(timerId, apiClient.serverId()); + } + + return cancelTimer(apiClient.serverId(), timerId, true); + } + }); +} + +function cancelTimerWithConfirmation(timerId, serverId) { + return new Promise(function (resolve, reject) { + import('confirm').then(({ default: confirm }) => { + confirm.default({ + + text: globalize.translate('MessageConfirmRecordingCancellation'), + primary: 'delete', + confirmText: globalize.translate('HeaderCancelRecording'), + cancelText: globalize.translate('HeaderKeepRecording') + + }).then(function () { + loading.show(); + + const apiClient = connectionManager.getApiClient(serverId); + cancelTimer(apiClient, timerId, true).then(resolve, reject); + }, reject); + }); + }); +} + +function cancelSeriesTimerWithConfirmation(timerId, serverId) { + return new Promise(function (resolve, reject) { + import('confirm').then(({ default: confirm }) => { + confirm.default({ + + text: globalize.translate('MessageConfirmRecordingCancellation'), + primary: 'delete', + confirmText: globalize.translate('HeaderCancelSeries'), + cancelText: globalize.translate('HeaderKeepSeries') + + }).then(function () { + loading.show(); + + const apiClient = connectionManager.getApiClient(serverId); + apiClient.cancelLiveTvSeriesTimer(timerId).then(function () { + import('toast').then(({default: toast}) => { + toast(globalize.translate('SeriesCancelled')); }); + + loading.hide(); + resolve(); + }, reject); + }, reject); + }); + }); +} + +function cancelTimer(apiClient, timerId, hideLoading) { + loading.show(); + return apiClient.cancelLiveTvTimer(timerId).then(function () { + if (hideLoading !== false) { + loading.hide(); + sendToast(globalize.translate('RecordingCancelled')); + } + }); +} + +function createRecording(apiClient, programId, isSeries) { + loading.show(); + return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) { + const promise = isSeries ? + apiClient.createLiveTvSeriesTimer(item) : + apiClient.createLiveTvTimer(item); + + return promise.then(function () { + loading.hide(); + sendToast(globalize.translate('RecordingScheduled')); + }); + }); +} + +function sendToast(msg) { + import('toast').then(({ default: toast }) => { + toast(msg); + }); +} + +function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId) { + return new Promise(function (resolve, reject) { + import('dialog').then(({ default: dialog }) => { + const items = []; + + items.push({ + name: globalize.translate('HeaderKeepRecording'), + id: 'cancel', + type: 'submit' + }); + + if (timerStatus === 'InProgress') { + items.push({ + name: globalize.translate('HeaderStopRecording'), + id: 'canceltimer', + type: 'cancel' }); } else { - // cancel - if (confirmTimerCancellation) { - return cancelTimerWithConfirmation(timerId, apiClient.serverId()); - } - - return cancelTimer(apiClient.serverId(), timerId, true); + items.push({ + name: globalize.translate('HeaderCancelRecording'), + id: 'canceltimer', + type: 'cancel' + }); } - }); - } - function cancelTimerWithConfirmation(timerId, serverId) { - return new Promise(function (resolve, reject) { - require(['confirm'], function (confirm) { - confirm.default({ - - text: globalize.translate('MessageConfirmRecordingCancellation'), - primary: 'delete', - confirmText: globalize.translate('HeaderCancelRecording'), - cancelText: globalize.translate('HeaderKeepRecording') - - }).then(function () { - loading.show(); - - var apiClient = connectionManager.getApiClient(serverId); - cancelTimer(apiClient, timerId, true).then(resolve, reject); - }, reject); + items.push({ + name: globalize.translate('HeaderCancelSeries'), + id: 'cancelseriestimer', + type: 'cancel' }); - }); - } - function cancelSeriesTimerWithConfirmation(timerId, serverId) { - return new Promise(function (resolve, reject) { - require(['confirm'], function (confirm) { - confirm.default({ + dialog({ - text: globalize.translate('MessageConfirmRecordingCancellation'), - primary: 'delete', - confirmText: globalize.translate('HeaderCancelSeries'), - cancelText: globalize.translate('HeaderKeepSeries') + text: globalize.translate('MessageConfirmRecordingCancellation'), + buttons: items - }).then(function () { + }).then(function (result) { + const apiClient = connectionManager.getApiClient(serverId); + + if (result === 'canceltimer') { loading.show(); - var apiClient = connectionManager.getApiClient(serverId); - apiClient.cancelLiveTvSeriesTimer(timerId).then(function () { - require(['toast'], function (toast) { + cancelTimer(apiClient, timerId, true).then(resolve, reject); + } else if (result === 'cancelseriestimer') { + loading.show(); + + apiClient.cancelLiveTvSeriesTimer(seriesTimerId).then(function () { + import('toast').then(({ default: toast }) => { toast(globalize.translate('SeriesCancelled')); }); loading.hide(); resolve(); }, reject); - }, reject); - }); - }); - } - - function cancelTimer(apiClient, timerId, hideLoading) { - loading.show(); - return apiClient.cancelLiveTvTimer(timerId).then(function () { - if (hideLoading !== false) { - loading.hide(); - sendToast(globalize.translate('RecordingCancelled')); - } - }); - } - - function createRecording(apiClient, programId, isSeries) { - loading.show(); - return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) { - var promise = isSeries ? - apiClient.createLiveTvSeriesTimer(item) : - apiClient.createLiveTvTimer(item); - - return promise.then(function () { - loading.hide(); - sendToast(globalize.translate('RecordingScheduled')); - }); - }); - } - - function sendToast(msg) { - require(['toast'], function (toast) { - toast(msg); - }); - } - - function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId) { - return new Promise(function (resolve, reject) { - require(['dialog'], function (dialog) { - var items = []; - - items.push({ - name: globalize.translate('HeaderKeepRecording'), - id: 'cancel', - type: 'submit' - }); - - if (timerStatus === 'InProgress') { - items.push({ - name: globalize.translate('HeaderStopRecording'), - id: 'canceltimer', - type: 'cancel' - }); } else { - items.push({ - name: globalize.translate('HeaderCancelRecording'), - id: 'canceltimer', - type: 'cancel' - }); + resolve(); } - - items.push({ - name: globalize.translate('HeaderCancelSeries'), - id: 'cancelseriestimer', - type: 'cancel' - }); - - dialog({ - - text: globalize.translate('MessageConfirmRecordingCancellation'), - buttons: items - - }).then(function (result) { - var apiClient = connectionManager.getApiClient(serverId); - - if (result === 'canceltimer') { - loading.show(); - - cancelTimer(apiClient, timerId, true).then(resolve, reject); - } else if (result === 'cancelseriestimer') { - loading.show(); - - apiClient.cancelLiveTvSeriesTimer(seriesTimerId).then(function () { - require(['toast'], function (toast) { - toast(globalize.translate('SeriesCancelled')); - }); - - loading.hide(); - resolve(); - }, reject); - } else { - resolve(); - } - }, reject); - }); + }, reject); }); - } + }); +} - function toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId) { - var apiClient = connectionManager.getApiClient(serverId); - var hasTimer = timerId && timerStatus !== 'Cancelled'; - if (seriesTimerId && hasTimer) { - // cancel - return showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId); - } else if (hasTimer && programId) { - // change to series recording, if possible - // otherwise cancel individual recording - return changeRecordingToSeries(apiClient, timerId, programId, true); - } else if (programId) { - // schedule recording - return createRecording(apiClient, programId); - } else { - return Promise.reject(); - } +function toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId) { + const apiClient = connectionManager.getApiClient(serverId); + const hasTimer = timerId && timerStatus !== 'Cancelled'; + if (seriesTimerId && hasTimer) { + // cancel + return showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId); + } else if (hasTimer && programId) { + // change to series recording, if possible + // otherwise cancel individual recording + return changeRecordingToSeries(apiClient, timerId, programId, true); + } else if (programId) { + // schedule recording + return createRecording(apiClient, programId); + } else { + return Promise.reject(); } +} + +export default { + cancelTimer: cancelTimer, + createRecording: createRecording, + changeRecordingToSeries: changeRecordingToSeries, + toggleRecording: toggleRecording, + cancelTimerWithConfirmation: cancelTimerWithConfirmation, + cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation +}; - return { - cancelTimer: cancelTimer, - createRecording: createRecording, - changeRecordingToSeries: changeRecordingToSeries, - toggleRecording: toggleRecording, - cancelTimerWithConfirmation: cancelTimerWithConfirmation, - cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation - }; -}); diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js index ea20c7267d..48fbbcf22c 100644 --- a/src/components/recordingcreator/seriesrecordingeditor.js +++ b/src/components/recordingcreator/seriesrecordingeditor.js @@ -1,141 +1,200 @@ -define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'datetime', 'scrollStyles', 'emby-button', 'emby-checkbox', 'emby-input', 'emby-select', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader, datetime) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import globalize from 'globalize'; +import layoutManager from 'layoutManager'; +import connectionManager from 'connectionManager'; +import loading from 'loading'; +import scrollHelper from 'scrollHelper'; +import datetime from 'datetime'; +import 'scrollStyles'; +import 'emby-button'; +import 'emby-checkbox'; +import 'emby-input'; +import 'emby-select'; +import 'paper-icon-button-light'; +import 'css!./../formdialog'; +import 'css!./recordingcreator'; +import 'material-icons'; +import 'flexStyles'; - var currentDialog; - var recordingUpdated = false; - var recordingDeleted = false; - var currentItemId; - var currentServerId; +/*eslint prefer-const: "error"*/ - function deleteTimer(apiClient, timerId) { - return new Promise(function (resolve, reject) { - require(['recordingHelper'], function (recordingHelper) { - recordingHelper.cancelSeriesTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject); - }); +let currentDialog; +let recordingUpdated = false; +let recordingDeleted = false; +let currentItemId; +let currentServerId; + +function deleteTimer(apiClient, timerId) { + return new Promise(function (resolve, reject) { + import('recordingHelper').then(({ default: recordingHelper }) => { + recordingHelper.cancelSeriesTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject); }); + }); +} + +function renderTimer(context, item) { + context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60; + context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60; + + context.querySelector('.selectChannels').value = item.RecordAnyChannel ? 'all' : 'one'; + context.querySelector('.selectAirTime').value = item.RecordAnyTime ? 'any' : 'original'; + + context.querySelector('.selectShowType').value = item.RecordNewOnly ? 'new' : 'all'; + context.querySelector('.chkSkipEpisodesInLibrary').checked = item.SkipEpisodesInLibrary; + context.querySelector('.selectKeepUpTo').value = item.KeepUpTo || 0; + + if (item.ChannelName || item.ChannelNumber) { + context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('ChannelNameOnly', item.ChannelName || item.ChannelNumber); + } else { + context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('OneChannel'); } - function renderTimer(context, item, apiClient) { - context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60; - context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60; + context.querySelector('.optionAroundTime').innerHTML = globalize.translate('AroundTime', datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate))); - context.querySelector('.selectChannels').value = item.RecordAnyChannel ? 'all' : 'one'; - context.querySelector('.selectAirTime').value = item.RecordAnyTime ? 'any' : 'original'; + loading.hide(); +} - context.querySelector('.selectShowType').value = item.RecordNewOnly ? 'new' : 'all'; - context.querySelector('.chkSkipEpisodesInLibrary').checked = item.SkipEpisodesInLibrary; - context.querySelector('.selectKeepUpTo').value = item.KeepUpTo || 0; +function closeDialog(isDeleted) { + recordingUpdated = true; + recordingDeleted = isDeleted; - if (item.ChannelName || item.ChannelNumber) { - context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('ChannelNameOnly', item.ChannelName || item.ChannelNumber); - } else { - context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('OneChannel'); - } + dialogHelper.close(currentDialog); +} - context.querySelector('.optionAroundTime').innerHTML = globalize.translate('AroundTime', datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate))); +function onSubmit(e) { + const form = this; + const apiClient = connectionManager.getApiClient(currentServerId); + + apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) { + item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; + item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60; + item.RecordAnyChannel = form.querySelector('.selectChannels').value === 'all'; + item.RecordAnyTime = form.querySelector('.selectAirTime').value === 'any'; + item.RecordNewOnly = form.querySelector('.selectShowType').value === 'new'; + item.SkipEpisodesInLibrary = form.querySelector('.chkSkipEpisodesInLibrary').checked; + item.KeepUpTo = form.querySelector('.selectKeepUpTo').value; + + apiClient.updateLiveTvSeriesTimer(item); + }); + + e.preventDefault(); + + // Disable default form submission + return false; +} + +function init(context) { + fillKeepUpTo(context); + + context.querySelector('.btnCancel').addEventListener('click', function () { + closeDialog(false); + }); + + context.querySelector('.btnCancelRecording').addEventListener('click', function () { + const apiClient = connectionManager.getApiClient(currentServerId); + deleteTimer(apiClient, currentItemId).then(function () { + closeDialog(true); + }); + }); + + context.querySelector('form').addEventListener('submit', onSubmit); +} + +function reload(context, id) { + const apiClient = connectionManager.getApiClient(currentServerId); + + loading.show(); + if (typeof id === 'string') { + currentItemId = id; + + apiClient.getLiveTvSeriesTimer(id).then(function (result) { + renderTimer(context, result); + loading.hide(); + }); + } else if (id) { + currentItemId = id.Id; + + renderTimer(context, id); loading.hide(); } +} - function closeDialog(isDeleted) { - recordingUpdated = true; - recordingDeleted = isDeleted; +function fillKeepUpTo(context) { + let html = ''; - dialogHelper.close(currentDialog); - } + for (let i = 0; i <= 50; i++) { + let text; - function onSubmit(e) { - var form = this; - - var apiClient = connectionManager.getApiClient(currentServerId); - - apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) { - item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; - item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60; - item.RecordAnyChannel = form.querySelector('.selectChannels').value === 'all'; - item.RecordAnyTime = form.querySelector('.selectAirTime').value === 'any'; - item.RecordNewOnly = form.querySelector('.selectShowType').value === 'new'; - item.SkipEpisodesInLibrary = form.querySelector('.chkSkipEpisodesInLibrary').checked; - item.KeepUpTo = form.querySelector('.selectKeepUpTo').value; - - apiClient.updateLiveTvSeriesTimer(item); - }); - - e.preventDefault(); - - // Disable default form submission - return false; - } - - function init(context) { - fillKeepUpTo(context); - - context.querySelector('.btnCancel').addEventListener('click', function () { - closeDialog(false); - }); - - context.querySelector('.btnCancelRecording').addEventListener('click', function () { - var apiClient = connectionManager.getApiClient(currentServerId); - deleteTimer(apiClient, currentItemId).then(function () { - closeDialog(true); - }); - }); - - context.querySelector('form').addEventListener('submit', onSubmit); - } - - function reload(context, id) { - var apiClient = connectionManager.getApiClient(currentServerId); - - loading.show(); - if (typeof id === 'string') { - currentItemId = id; - - apiClient.getLiveTvSeriesTimer(id).then(function (result) { - renderTimer(context, result, apiClient); - loading.hide(); - }); - } else if (id) { - currentItemId = id.Id; - - renderTimer(context, id, apiClient); - loading.hide(); - } - } - - function fillKeepUpTo(context) { - var html = ''; - - for (var i = 0; i <= 50; i++) { - var text; - - if (i === 0) { - text = globalize.translate('AsManyAsPossible'); - } else if (i === 1) { - text = globalize.translate('ValueOneEpisode'); - } else { - text = globalize.translate('ValueEpisodeCount', i); - } - - html += ''; + if (i === 0) { + text = globalize.translate('AsManyAsPossible'); + } else if (i === 1) { + text = globalize.translate('ValueOneEpisode'); + } else { + text = globalize.translate('ValueEpisodeCount', i); } - context.querySelector('.selectKeepUpTo').innerHTML = html; + html += ''; } - function onFieldChange(e) { - this.querySelector('.btnSubmit').click(); - } + context.querySelector('.selectKeepUpTo').innerHTML = html; +} - function embed(itemId, serverId, options) { +function onFieldChange() { + this.querySelector('.btnSubmit').click(); +} + +function embed(itemId, serverId, options) { + recordingUpdated = false; + recordingDeleted = false; + currentServerId = serverId; + loading.show(); + options = options || {}; + + import('text!./seriesrecordingeditor.template.html').then(({ default: template }) => { + const dialogOptions = { + removeOnClose: true, + scrollY: false + }; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + } else { + dialogOptions.size = 'small'; + } + + const dlg = options.context; + + dlg.classList.add('hide'); + dlg.innerHTML = globalize.translateHtml(template, 'core'); + + dlg.querySelector('.formDialogHeader').classList.add('hide'); + dlg.querySelector('.formDialogFooter').classList.add('hide'); + dlg.querySelector('.formDialogContent').className = ''; + dlg.querySelector('.dialogContentInner').className = ''; + dlg.classList.remove('hide'); + + dlg.removeEventListener('change', onFieldChange); + dlg.addEventListener('change', onFieldChange); + + currentDialog = dlg; + + init(dlg); + + reload(dlg, itemId); + }); +} + +function showEditor(itemId, serverId, options) { + return new Promise(function (resolve, reject) { recordingUpdated = false; recordingDeleted = false; currentServerId = serverId; loading.show(); options = options || {}; - require(['text!./seriesrecordingeditor.template.html'], function (template) { - var dialogOptions = { + import('text!./seriesrecordingeditor.template.html').then(({ default: template }) => { + const dialogOptions = { removeOnClose: true, scrollY: false }; @@ -146,101 +205,58 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c dialogOptions.size = 'small'; } - var dlg = options.context; + const dlg = dialogHelper.createDialog(dialogOptions); - dlg.classList.add('hide'); - dlg.innerHTML = globalize.translateHtml(template, 'core'); + dlg.classList.add('formDialog'); + dlg.classList.add('recordingDialog'); - dlg.querySelector('.formDialogHeader').classList.add('hide'); - dlg.querySelector('.formDialogFooter').classList.add('hide'); - dlg.querySelector('.formDialogContent').className = ''; - dlg.querySelector('.dialogContentInner').className = ''; - dlg.classList.remove('hide'); + if (!layoutManager.tv) { + dlg.style['min-width'] = '20%'; + } - dlg.removeEventListener('change', onFieldChange); - dlg.addEventListener('change', onFieldChange); + let html = ''; + + html += globalize.translateHtml(template, 'core'); + + dlg.innerHTML = html; + + if (options.enableCancel === false) { + dlg.querySelector('.formDialogFooter').classList.add('hide'); + } currentDialog = dlg; + dlg.addEventListener('closing', function () { + if (!recordingDeleted) { + this.querySelector('.btnSubmit').click(); + } + }); + + dlg.addEventListener('close', function () { + if (recordingUpdated) { + resolve({ + updated: true, + deleted: recordingDeleted + }); + } else { + reject(); + } + }); + + if (layoutManager.tv) { + scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); + } + init(dlg); reload(dlg, itemId); + + dialogHelper.open(dlg); }); - } + }); +} - function showEditor(itemId, serverId, options) { - return new Promise(function (resolve, reject) { - recordingUpdated = false; - recordingDeleted = false; - currentServerId = serverId; - loading.show(); - options = options || {}; - - require(['text!./seriesrecordingeditor.template.html'], function (template) { - var dialogOptions = { - removeOnClose: true, - scrollY: false - }; - - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; - } else { - dialogOptions.size = 'small'; - } - - var dlg = dialogHelper.createDialog(dialogOptions); - - dlg.classList.add('formDialog'); - dlg.classList.add('recordingDialog'); - - if (!layoutManager.tv) { - dlg.style['min-width'] = '20%'; - } - - var html = ''; - - html += globalize.translateHtml(template, 'core'); - - dlg.innerHTML = html; - - if (options.enableCancel === false) { - dlg.querySelector('.formDialogFooter').classList.add('hide'); - } - - currentDialog = dlg; - - dlg.addEventListener('closing', function () { - if (!recordingDeleted) { - this.querySelector('.btnSubmit').click(); - } - }); - - dlg.addEventListener('close', function () { - if (recordingUpdated) { - resolve({ - updated: true, - deleted: recordingDeleted - }); - } else { - reject(); - } - }); - - if (layoutManager.tv) { - scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); - } - - init(dlg); - - reload(dlg, itemId); - - dialogHelper.open(dlg); - }); - }); - } - - return { - show: showEditor, - embed: embed - }; -}); +export default { + show: showEditor, + embed: embed +}; diff --git a/src/components/remotecontrol/remotecontrol.css b/src/components/remotecontrol/remotecontrol.css index c260799585..1c31b4382b 100644 --- a/src/components/remotecontrol/remotecontrol.css +++ b/src/components/remotecontrol/remotecontrol.css @@ -222,18 +222,10 @@ margin: 0; } -.layout-mobile .nowPlayingSecondaryButtons .btnShuffleQueue { - display: none; -} - .layout-mobile .nowPlayingSecondaryButtons .volumecontrol { display: none; } -.layout-mobile .nowPlayingSecondaryButtons .btnRepeat { - display: none; -} - .layout-desktop .nowPlayingInfoButtons .btnRepeat, .layout-tv .nowPlayingInfoButtons .btnRepeat { display: none; @@ -362,7 +354,8 @@ border-radius: 0; } - .nowPlayingInfoButtons .btnRepeat { + .nowPlayingInfoButtons .btnRepeat, + .nowPlayingInfoButtons .btnRewind { position: absolute; left: 0; margin-left: 0; @@ -370,7 +363,8 @@ font-size: smaller; } - .nowPlayingInfoButtons .btnShuffleQueue { + .nowPlayingInfoButtons .btnShuffleQueue, + .nowPlayingInfoButtons .btnFastForward { position: absolute; right: 0; margin-right: 0; @@ -468,7 +462,6 @@ } @media all and (max-width: 63em) { - .nowPlayingSecondaryButtons .repeatToggleButton, .nowPlayingInfoButtons .playlist .listItemMediaInfo, .nowPlayingInfoButtons .btnStop { display: none !important; diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 54e09def84..8d6c53cead 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -1,933 +1,958 @@ -define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageLoader', 'playbackManager', 'nowPlayingHelper', 'events', 'connectionManager', 'apphost', 'globalize', 'layoutManager', 'userSettings', 'cardBuilder', 'itemContextMenu', 'cardStyle', 'emby-itemscontainer', 'css!./remotecontrol.css', 'emby-ratingbutton'], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize, layoutManager, userSettings, cardBuilder, itemContextMenu) { - 'use strict'; - var showMuteButton = true; - var showVolumeSlider = true; +import datetime from 'datetime'; +import backdrop from 'backdrop'; +import listView from 'listView'; +import imageLoader from 'imageLoader'; +import playbackManager from 'playbackManager'; +import nowPlayingHelper from 'nowPlayingHelper'; +import events from 'events'; +import connectionManager from 'connectionManager'; +import appHost from 'apphost'; +import globalize from 'globalize'; +import layoutManager from 'layoutManager'; +import * as userSettings from 'userSettings'; +import cardBuilder from 'cardBuilder'; +import itemContextMenu from 'itemContextMenu'; +import 'cardStyle'; +import 'emby-itemscontainer'; +import 'css!./remotecontrol.css'; +import 'emby-ratingbutton'; - function showAudioMenu(context, player, button, item) { - var currentIndex = playbackManager.getAudioStreamIndex(player); - var streams = playbackManager.audioTracks(player); - var menuItems = streams.map(function (s) { - var menuItem = { - name: s.DisplayTitle, - id: s.Index - }; +/*eslint prefer-const: "error"*/ - if (s.Index == currentIndex) { - menuItem.selected = true; - } +let showMuteButton = true; +let showVolumeSlider = true; - return menuItem; - }); +function showAudioMenu(context, player, button, item) { + const currentIndex = playbackManager.getAudioStreamIndex(player); + const streams = playbackManager.audioTracks(player); + const menuItems = streams.map(function (s) { + const menuItem = { + name: s.DisplayTitle, + id: s.Index + }; - require(['actionsheet'], function (actionsheet) { - actionsheet.show({ - items: menuItems, - positionTo: button, - callback: function (id) { - playbackManager.setAudioStreamIndex(parseInt(id), player); - } - }); - }); - } - - function showSubtitleMenu(context, player, button, item) { - var currentIndex = playbackManager.getSubtitleStreamIndex(player); - var streams = playbackManager.subtitleTracks(player); - var menuItems = streams.map(function (s) { - var menuItem = { - name: s.DisplayTitle, - id: s.Index - }; - - if (s.Index == currentIndex) { - menuItem.selected = true; - } - - return menuItem; - }); - menuItems.unshift({ - id: -1, - name: globalize.translate('ButtonOff'), - selected: currentIndex == null - }); - - require(['actionsheet'], function (actionsheet) { - actionsheet.show({ - items: menuItems, - positionTo: button, - callback: function (id) { - playbackManager.setSubtitleStreamIndex(parseInt(id), player); - } - }); - }); - } - - function getNowPlayingNameHtml(nowPlayingItem, includeNonNameInfo) { - return nowPlayingHelper.getNowPlayingNames(nowPlayingItem, includeNonNameInfo).map(function (i) { - return i.text; - }).join('
'); - } - - function seriesImageUrl(item, options) { - if (item.Type !== 'Episode') { - return null; + if (s.Index == currentIndex) { + menuItem.selected = true; } - options = options || {}; - options.type = options.type || 'Primary'; - if (options.type === 'Primary' && item.SeriesPrimaryImageTag) { - options.tag = item.SeriesPrimaryImageTag; + return menuItem; + }); + + import('actionsheet').then(({ default: actionsheet }) => { + actionsheet.show({ + items: menuItems, + positionTo: button, + callback: function (id) { + playbackManager.setAudioStreamIndex(parseInt(id), player); + } + }); + }); +} + +function showSubtitleMenu(context, player, button, item) { + const currentIndex = playbackManager.getSubtitleStreamIndex(player); + const streams = playbackManager.subtitleTracks(player); + const menuItems = streams.map(function (s) { + const menuItem = { + name: s.DisplayTitle, + id: s.Index + }; + + if (s.Index == currentIndex) { + menuItem.selected = true; + } + + return menuItem; + }); + menuItems.unshift({ + id: -1, + name: globalize.translate('Off'), + selected: currentIndex == null + }); + + import('actionsheet').then(({ default: actionsheet }) => { + actionsheet.show({ + items: menuItems, + positionTo: button, + callback: function (id) { + playbackManager.setSubtitleStreamIndex(parseInt(id), player); + } + }); + }); +} + +function getNowPlayingNameHtml(nowPlayingItem, includeNonNameInfo) { + return nowPlayingHelper.getNowPlayingNames(nowPlayingItem, includeNonNameInfo).map(function (i) { + return i.text; + }).join('
'); +} + +function seriesImageUrl(item, options) { + if (item.Type !== 'Episode') { + return null; + } + + options = options || {}; + options.type = options.type || 'Primary'; + if (options.type === 'Primary' && item.SeriesPrimaryImageTag) { + options.tag = item.SeriesPrimaryImageTag; + return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); + } + + if (options.type === 'Thumb') { + if (item.SeriesThumbImageTag) { + options.tag = item.SeriesThumbImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } - if (options.type === 'Thumb') { - if (item.SeriesThumbImageTag) { - options.tag = item.SeriesThumbImageTag; - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); - } - - if (item.ParentThumbImageTag) { - options.tag = item.ParentThumbImageTag; - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); - } + if (item.ParentThumbImageTag) { + options.tag = item.ParentThumbImageTag; + return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); } - - return null; } - function imageUrl(item, options) { - options = options || {}; - options.type = options.type || 'Primary'; + return null; +} - if (item.ImageTags && item.ImageTags[options.type]) { - options.tag = item.ImageTags[options.type]; - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); - } +function imageUrl(item, options) { + options = options || {}; + options.type = options.type || 'Primary'; - if (item.AlbumId && item.AlbumPrimaryImageTag) { - options.tag = item.AlbumPrimaryImageTag; - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); - } - - return null; + if (item.ImageTags && item.ImageTags[options.type]) { + options.tag = item.ImageTags[options.type]; + return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); } - function updateNowPlayingInfo(context, state, serverId) { - var item = state.NowPlayingItem; - var displayName = item ? getNowPlayingNameHtml(item).replace('
', ' - ') : ''; - if (typeof item !== 'undefined') { - var nowPlayingServerId = (item.ServerId || serverId); - if (item.Type == 'Audio' || item.MediaStreams[0].Type == 'Audio') { - var songName = item.Name; - if (item.Album != null && item.Artists != null) { - var artistsSeries = ''; - var albumName = item.Album; - if (item.ArtistItems != null) { - for (const artist of item.ArtistItems) { - let artistName = artist.Name; - let artistId = artist.Id; - artistsSeries += `${artistName}`; - if (artist !== item.ArtistItems.slice(-1)[0]) { - artistsSeries += ', '; - } - } - } else if (item.Artists) { - // For some reason, Chromecast Player doesn't return a item.ArtistItems object, so we need to fallback - // to normal item.Artists item. - // TODO: Normalise fields returned by all the players - for (const artist of item.Artists) { - artistsSeries += `${artist}`; - if (artist !== item.Artists.slice(-1)[0]) { - artistsSeries += ', '; - } + if (item.AlbumId && item.AlbumPrimaryImageTag) { + options.tag = item.AlbumPrimaryImageTag; + return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); + } + + return null; +} + +function updateNowPlayingInfo(context, state, serverId) { + const item = state.NowPlayingItem; + const displayName = item ? getNowPlayingNameHtml(item).replace('
', ' - ') : ''; + if (item) { + const nowPlayingServerId = (item.ServerId || serverId); + if (item.Type == 'Audio' || item.MediaStreams[0].Type == 'Audio') { + const songName = item.Name; + let artistsSeries = ''; + let albumName = ''; + if (item.Artists != null) { + if (item.ArtistItems != null) { + for (const artist of item.ArtistItems) { + const artistName = artist.Name; + const artistId = artist.Id; + artistsSeries += `${artistName}`; + if (artist !== item.ArtistItems.slice(-1)[0]) { + artistsSeries += ', '; } } - context.querySelector('.nowPlayingArtist').innerHTML = artistsSeries; - context.querySelector('.nowPlayingAlbum').innerHTML = '${albumName}`; - } - context.querySelector('.nowPlayingSongName').innerHTML = songName; - } else if (item.Type == 'Episode') { - if (item.SeasonName != null) { - var seasonName = item.SeasonName; - context.querySelector('.nowPlayingSeason').innerHTML = '${seasonName}`; - } - if (item.SeriesName != null) { - var seriesName = item.SeriesName; - if (item.SeriesId != null) { - context.querySelector('.nowPlayingSerie').innerHTML = '${seriesName}`; - } else { - context.querySelector('.nowPlayingSerie').innerHTML = seriesName; - } - } - context.querySelector('.nowPlayingEpisode').innerHTML = item.Name; - } else { - context.querySelector('.nowPlayingPageTitle').innerHTML = displayName; - } - - if (displayName.length > 0 && item.Type != 'Audio' && item.Type != 'Episode') { - context.querySelector('.nowPlayingPageTitle').classList.remove('hide'); - } else { - context.querySelector('.nowPlayingPageTitle').classList.add('hide'); - } - - var url = item ? seriesImageUrl(item, { - maxHeight: 300 - }) || imageUrl(item, { - maxHeight: 300 - }) : null; - - let contextButton = context.querySelector('.btnToggleContextMenu'); - // We remove the previous event listener by replacing the item in each update event - const autoFocusContextButton = document.activeElement === contextButton; - let contextButtonClone = contextButton.cloneNode(true); - contextButton.parentNode.replaceChild(contextButtonClone, contextButton); - contextButton = context.querySelector('.btnToggleContextMenu'); - if (autoFocusContextButton) { - contextButton.focus(); - } - const stopPlayback = !!layoutManager.mobile; - var options = { - play: false, - queue: false, - stopPlayback: stopPlayback, - clearQueue: true, - openAlbum: false, - positionTo: contextButton - }; - var apiClient = connectionManager.getApiClient(item.ServerId); - apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) { - apiClient.getCurrentUser().then(function (user) { - contextButton.addEventListener('click', function () { - itemContextMenu.show(Object.assign({ - item: fullItem, - user: user - }, options)); - }); - }); - }); - setImageUrl(context, state, url); - if (item) { - backdrop.setBackdrops([item]); - apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) { - var userData = fullItem.UserData || {}; - var likes = userData.Likes == null ? '' : userData.Likes; - context.querySelector('.nowPlayingPageUserDataButtonsTitle').innerHTML = ''; - context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = ''; - }); - } else { - backdrop.clearBackdrop(); - context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = ''; - } - } - } - - function setImageUrl(context, state, url) { - var item = state.NowPlayingItem; - var imgContainer = context.querySelector('.nowPlayingPageImageContainer'); - - if (url) { - imgContainer.innerHTML = ''; - if (item.Type == 'Audio') { - context.querySelector('.nowPlayingPageImage').classList.add('nowPlayingPageImageAudio'); - context.querySelector('.nowPlayingPageImageContainer').classList.remove('nowPlayingPageImageAudio'); - } else { - context.querySelector('.nowPlayingPageImageContainer').classList.add('nowPlayingPageImagePoster'); - context.querySelector('.nowPlayingPageImage').classList.remove('nowPlayingPageImageAudio'); - } - } else { - imgContainer.innerHTML = '
'; - } - } - - function buttonVisible(btn, enabled) { - if (enabled) { - btn.classList.remove('hide'); - } else { - btn.classList.add('hide'); - } - } - - function updateSupportedCommands(context, commands) { - var all = context.querySelectorAll('.btnCommand'); - - for (var i = 0, length = all.length; i < length; i++) { - var enableButton = commands.indexOf(all[i].getAttribute('data-command')) !== -1; - all[i].disabled = !enableButton; - } - } - - return function () { - function toggleRepeat() { - switch (playbackManager.getRepeatMode()) { - case 'RepeatAll': - playbackManager.setRepeatMode('RepeatOne'); - break; - case 'RepeatOne': - playbackManager.setRepeatMode('RepeatNone'); - break; - case 'RepeatNone': - playbackManager.setRepeatMode('RepeatAll'); - } - } - - function updatePlayerState(player, context, state) { - lastPlayerState = state; - var item = state.NowPlayingItem; - var playerInfo = playbackManager.getPlayerInfo(); - var supportedCommands = playerInfo.supportedCommands; - currentPlayerSupportedCommands = supportedCommands; - var playState = state.PlayState || {}; - var isSupportedCommands = supportedCommands.includes('DisplayMessage') || supportedCommands.includes('SendString') || supportedCommands.includes('Select'); - buttonVisible(context.querySelector('.btnToggleFullscreen'), item && item.MediaType == 'Video' && supportedCommands.includes('ToggleFullscreen')); - updateAudioTracksDisplay(player, context); - updateSubtitleTracksDisplay(player, context); - - if (supportedCommands.includes('DisplayMessage') && !currentPlayer.isLocalPlayer) { - context.querySelector('.sendMessageSection').classList.remove('hide'); - } else { - context.querySelector('.sendMessageSection').classList.add('hide'); - } - - if (supportedCommands.includes('SendString') && !currentPlayer.isLocalPlayer) { - context.querySelector('.sendTextSection').classList.remove('hide'); - } else { - context.querySelector('.sendTextSection').classList.add('hide'); - } - - if (supportedCommands.includes('Select') && !currentPlayer.isLocalPlayer) { - context.querySelector('.navigationSection').classList.remove('hide'); - } else { - context.querySelector('.navigationSection').classList.add('hide'); - } - - if (isSupportedCommands && !currentPlayer.isLocalPlayer) { - context.querySelector('.remoteControlSection').classList.remove('hide'); - } else { - context.querySelector('.remoteControlSection').classList.add('hide'); - } - - buttonVisible(context.querySelector('.btnStop'), item != null); - buttonVisible(context.querySelector('.btnNextTrack'), item != null); - buttonVisible(context.querySelector('.btnPreviousTrack'), item != null); - if (layoutManager.mobile) { - buttonVisible(context.querySelector('.btnRewind'), false); - buttonVisible(context.querySelector('.btnFastForward'), false); - } else { - buttonVisible(context.querySelector('.btnRewind'), item != null); - buttonVisible(context.querySelector('.btnFastForward'), item != null); - } - var positionSlider = context.querySelector('.nowPlayingPositionSlider'); - - if (positionSlider && item && item.RunTimeTicks) { - positionSlider.setKeyboardSteps(userSettings.skipBackLength() * 1000000 / item.RunTimeTicks, - userSettings.skipForwardLength() * 1000000 / item.RunTimeTicks); - } - - if (positionSlider && !positionSlider.dragging) { - positionSlider.disabled = !playState.CanSeek; - var isProgressClear = state.MediaSource && state.MediaSource.RunTimeTicks == null; - positionSlider.setIsClear(isProgressClear); - } - - updatePlayPauseState(playState.IsPaused, item != null); - updateTimeDisplay(playState.PositionTicks, item ? item.RunTimeTicks : null); - updatePlayerVolumeState(context, playState.IsMuted, playState.VolumeLevel); - - if (item && item.MediaType == 'Video') { - context.classList.remove('hideVideoButtons'); - } else { - context.classList.add('hideVideoButtons'); - } - - updateRepeatModeDisplay(playbackManager.getRepeatMode()); - onShuffleQueueModeChange(false); - updateNowPlayingInfo(context, state); - } - - function updateAudioTracksDisplay(player, context) { - var supportedCommands = currentPlayerSupportedCommands; - buttonVisible(context.querySelector('.btnAudioTracks'), playbackManager.audioTracks(player).length > 1 && supportedCommands.indexOf('SetAudioStreamIndex') != -1); - } - - function updateSubtitleTracksDisplay(player, context) { - var supportedCommands = currentPlayerSupportedCommands; - buttonVisible(context.querySelector('.btnSubtitles'), playbackManager.subtitleTracks(player).length && supportedCommands.indexOf('SetSubtitleStreamIndex') != -1); - } - - function updateRepeatModeDisplay(repeatMode) { - var context = dlg; - let toggleRepeatButtons = context.querySelectorAll('.repeatToggleButton'); - const cssClass = 'buttonActive'; - let innHtml = ''; - let repeatOn = true; - - switch (repeatMode) { - case 'RepeatAll': - break; - case 'RepeatOne': - innHtml = ''; - break; - case 'RepeatNone': - default: - repeatOn = false; - break; - } - - for (const toggleRepeatButton of toggleRepeatButtons) { - toggleRepeatButton.classList.toggle(cssClass, repeatOn); - toggleRepeatButton.innerHTML = innHtml; - } - } - - function updatePlayerVolumeState(context, isMuted, volumeLevel) { - var view = context; - var supportedCommands = currentPlayerSupportedCommands; - - if (supportedCommands.indexOf('Mute') === -1) { - showMuteButton = false; - } - - if (supportedCommands.indexOf('SetVolume') === -1) { - showVolumeSlider = false; - } - - if (currentPlayer.isLocalPlayer && appHost.supports('physicalvolumecontrol')) { - showMuteButton = false; - showVolumeSlider = false; - } - - const buttonMute = view.querySelector('.buttonMute'); - const buttonMuteIcon = buttonMute.querySelector('.material-icons'); - - buttonMuteIcon.classList.remove('volume_off', 'volume_up'); - - if (isMuted) { - buttonMute.setAttribute('title', globalize.translate('Unmute')); - buttonMuteIcon.classList.add('volume_off'); - } else { - buttonMute.setAttribute('title', globalize.translate('Mute')); - buttonMuteIcon.classList.add('volume_up'); - } - - if (!showMuteButton && !showVolumeSlider) { - context.querySelector('.volumecontrol').classList.add('hide'); - } else { - buttonMute.classList.toggle('hide', !showMuteButton); - - var nowPlayingVolumeSlider = context.querySelector('.nowPlayingVolumeSlider'); - var nowPlayingVolumeSliderContainer = context.querySelector('.nowPlayingVolumeSliderContainer'); - - if (nowPlayingVolumeSlider) { - nowPlayingVolumeSliderContainer.classList.toggle('hide', !showVolumeSlider); - - if (!nowPlayingVolumeSlider.dragging) { - nowPlayingVolumeSlider.value = volumeLevel || 0; + } else if (item.Artists) { + // For some reason, Chromecast Player doesn't return a item.ArtistItems object, so we need to fallback + // to normal item.Artists item. + // TODO: Normalise fields returned by all the players + for (const artist of item.Artists) { + artistsSeries += `${artist}`; + if (artist !== item.Artists.slice(-1)[0]) { + artistsSeries += ', '; + } } } } - } - - function updatePlayPauseState(isPaused, isActive) { - var context = dlg; - var btnPlayPause = context.querySelector('.btnPlayPause'); - const btnPlayPauseIcon = btnPlayPause.querySelector('.material-icons'); - - btnPlayPauseIcon.classList.remove('play_circle_filled', 'pause_circle_filled'); - btnPlayPauseIcon.classList.add(isPaused ? 'play_circle_filled' : 'pause_circle_filled'); - - buttonVisible(btnPlayPause, isActive); - } - - function updateTimeDisplay(positionTicks, runtimeTicks) { - var context = dlg; - var positionSlider = context.querySelector('.nowPlayingPositionSlider'); - - if (positionSlider && !positionSlider.dragging) { - if (runtimeTicks) { - var pct = positionTicks / runtimeTicks; - pct *= 100; - positionSlider.value = pct; + if (item.Album != null) { + albumName = '` + item.Album + ''; + } + context.querySelector('.nowPlayingAlbum').innerHTML = albumName; + context.querySelector('.nowPlayingArtist').innerHTML = artistsSeries; + context.querySelector('.nowPlayingSongName').innerHTML = songName; + } else if (item.Type == 'Episode') { + if (item.SeasonName != null) { + const seasonName = item.SeasonName; + context.querySelector('.nowPlayingSeason').innerHTML = '${seasonName}`; + } + if (item.SeriesName != null) { + const seriesName = item.SeriesName; + if (item.SeriesId != null) { + context.querySelector('.nowPlayingSerie').innerHTML = '${seriesName}`; } else { - positionSlider.value = 0; + context.querySelector('.nowPlayingSerie').innerHTML = seriesName; } } - - context.querySelector('.positionTime').innerHTML = positionTicks == null ? '--:--' : datetime.getDisplayRunningTime(positionTicks); - context.querySelector('.runtime').innerHTML = runtimeTicks != null ? datetime.getDisplayRunningTime(runtimeTicks) : '--:--'; + context.querySelector('.nowPlayingEpisode').innerHTML = item.Name; + } else { + context.querySelector('.nowPlayingPageTitle').innerHTML = displayName; } - function getPlaylistItems(player) { - return playbackManager.getPlaylist(player); + if (displayName.length > 0 && item.Type != 'Audio' && item.Type != 'Episode') { + context.querySelector('.nowPlayingPageTitle').classList.remove('hide'); + } else { + context.querySelector('.nowPlayingPageTitle').classList.add('hide'); } - function loadPlaylist(context, player) { - getPlaylistItems(player).then(function (items) { - var html = ''; - let favoritesEnabled = true; - if (layoutManager.mobile) { - if (items.length > 0) { - context.querySelector('.btnTogglePlaylist').classList.remove('hide'); - } else { - context.querySelector('.btnTogglePlaylist').classList.add('hide'); - } - favoritesEnabled = false; - } + const url = seriesImageUrl(item, { + maxHeight: 300 + }) || imageUrl(item, { + maxHeight: 300 + }); - html += listView.getListViewHtml({ - items: items, - smallIcon: true, - action: 'setplaylistindex', - enableUserDataButtons: favoritesEnabled, - rightButtons: [{ - icon: 'remove_circle_outline', - title: globalize.translate('ButtonRemove'), - id: 'remove' - }], - dragHandle: true + let contextButton = context.querySelector('.btnToggleContextMenu'); + // We remove the previous event listener by replacing the item in each update event + const autoFocusContextButton = document.activeElement === contextButton; + const contextButtonClone = contextButton.cloneNode(true); + contextButton.parentNode.replaceChild(contextButtonClone, contextButton); + contextButton = context.querySelector('.btnToggleContextMenu'); + if (autoFocusContextButton) { + contextButton.focus(); + } + const stopPlayback = !!layoutManager.mobile; + const options = { + play: false, + queue: false, + stopPlayback: stopPlayback, + clearQueue: true, + openAlbum: false, + positionTo: contextButton + }; + const apiClient = connectionManager.getApiClient(item.ServerId); + apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) { + apiClient.getCurrentUser().then(function (user) { + contextButton.addEventListener('click', function () { + itemContextMenu.show(Object.assign({ + item: fullItem, + user: user + }, options)); }); - - var itemsContainer = context.querySelector('.playlist'); - let focusedItemPlaylistId = itemsContainer.querySelector('button:focus'); - itemsContainer.innerHTML = html; - if (focusedItemPlaylistId !== null) { - focusedItemPlaylistId = focusedItemPlaylistId.getAttribute('data-playlistitemid'); - const newFocusedItem = itemsContainer.querySelector(`button[data-playlistitemid="${focusedItemPlaylistId}"]`); - if (newFocusedItem !== null) { - newFocusedItem.focus(); - } - } - - var playlistItemId = playbackManager.getCurrentPlaylistItemId(player); - - if (playlistItemId) { - var img = itemsContainer.querySelector(`.listItem[data-playlistItemId="${playlistItemId}"] .listItemImage`); - - if (img) { - img.classList.remove('lazy'); - img.classList.add('playlistIndexIndicatorImage'); - } - } - - imageLoader.lazyChildren(itemsContainer); }); + }); + setImageUrl(context, state, url); + backdrop.setBackdrops([item]); + apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) { + const userData = fullItem.UserData || {}; + const likes = userData.Likes == null ? '' : userData.Likes; + context.querySelector('.nowPlayingPageUserDataButtonsTitle').innerHTML = ''; + context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = ''; + }); + } else { + backdrop.clearBackdrop(); + context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = ''; + } +} + +function setImageUrl(context, state, url) { + const item = state.NowPlayingItem; + const imgContainer = context.querySelector('.nowPlayingPageImageContainer'); + + if (url) { + imgContainer.innerHTML = ''; + if (item.Type == 'Audio') { + context.querySelector('.nowPlayingPageImage').classList.add('nowPlayingPageImageAudio'); + context.querySelector('.nowPlayingPageImageContainer').classList.remove('nowPlayingPageImageAudio'); + } else { + context.querySelector('.nowPlayingPageImageContainer').classList.add('nowPlayingPageImagePoster'); + context.querySelector('.nowPlayingPageImage').classList.remove('nowPlayingPageImageAudio'); + } + } else { + imgContainer.innerHTML = '
'; + } +} + +function buttonVisible(btn, enabled) { + if (enabled) { + btn.classList.remove('hide'); + } else { + btn.classList.add('hide'); + } +} + +function updateSupportedCommands(context, commands) { + const all = context.querySelectorAll('.btnCommand'); + + for (let i = 0, length = all.length; i < length; i++) { + const enableButton = commands.indexOf(all[i].getAttribute('data-command')) !== -1; + all[i].disabled = !enableButton; + } +} + +export default function () { + function toggleRepeat() { + switch (playbackManager.getRepeatMode()) { + case 'RepeatAll': + playbackManager.setRepeatMode('RepeatOne'); + break; + case 'RepeatOne': + playbackManager.setRepeatMode('RepeatNone'); + break; + case 'RepeatNone': + playbackManager.setRepeatMode('RepeatAll'); + } + } + + function updatePlayerState(player, context, state) { + lastPlayerState = state; + const item = state.NowPlayingItem; + const playerInfo = playbackManager.getPlayerInfo(); + const supportedCommands = playerInfo.supportedCommands; + currentPlayerSupportedCommands = supportedCommands; + const playState = state.PlayState || {}; + const isSupportedCommands = supportedCommands.includes('DisplayMessage') || supportedCommands.includes('SendString') || supportedCommands.includes('Select'); + buttonVisible(context.querySelector('.btnToggleFullscreen'), item && item.MediaType == 'Video' && supportedCommands.includes('ToggleFullscreen')); + updateAudioTracksDisplay(player, context); + updateSubtitleTracksDisplay(player, context); + + if (supportedCommands.includes('DisplayMessage') && !currentPlayer.isLocalPlayer) { + context.querySelector('.sendMessageSection').classList.remove('hide'); + } else { + context.querySelector('.sendMessageSection').classList.add('hide'); } - function onPlaybackStart(e, state) { - console.debug('remotecontrol event: ' + e.type); - var player = this; - onStateChanged.call(player, e, state); + if (supportedCommands.includes('SendString') && !currentPlayer.isLocalPlayer) { + context.querySelector('.sendTextSection').classList.remove('hide'); + } else { + context.querySelector('.sendTextSection').classList.add('hide'); } - function onRepeatModeChange() { - updateRepeatModeDisplay(playbackManager.getRepeatMode()); + if (supportedCommands.includes('Select') && !currentPlayer.isLocalPlayer) { + context.querySelector('.navigationSection').classList.remove('hide'); + } else { + context.querySelector('.navigationSection').classList.add('hide'); } - function onShuffleQueueModeChange(updateView = true) { - let shuffleMode = playbackManager.getQueueShuffleMode(this); - let context = dlg; - const cssClass = 'buttonActive'; - let shuffleButtons = context.querySelectorAll('.btnShuffleQueue'); + if (isSupportedCommands && !currentPlayer.isLocalPlayer) { + context.querySelector('.remoteControlSection').classList.remove('hide'); + } else { + context.querySelector('.remoteControlSection').classList.add('hide'); + } - for (let shuffleButton of shuffleButtons) { - switch (shuffleMode) { - case 'Shuffle': - shuffleButton.classList.add(cssClass); - break; - case 'Sorted': - default: - shuffleButton.classList.remove(cssClass); - break; + buttonVisible(context.querySelector('.btnStop'), item != null); + buttonVisible(context.querySelector('.btnNextTrack'), item != null); + buttonVisible(context.querySelector('.btnPreviousTrack'), item != null); + if (layoutManager.mobile) { + const playingVideo = playbackManager.isPlayingVideo() && item !== null; + const playingAudio = !playbackManager.isPlayingVideo() && item !== null; + buttonVisible(context.querySelector('.btnRepeat'), playingAudio); + buttonVisible(context.querySelector('.btnShuffleQueue'), playingAudio); + buttonVisible(context.querySelector('.btnRewind'), playingVideo); + buttonVisible(context.querySelector('.btnFastForward'), playingVideo); + buttonVisible(context.querySelector('.nowPlayingSecondaryButtons .btnShuffleQueue'), playingVideo); + buttonVisible(context.querySelector('.nowPlayingSecondaryButtons .btnRepeat'), playingVideo); + } else { + buttonVisible(context.querySelector('.btnRewind'), item != null); + buttonVisible(context.querySelector('.btnFastForward'), item != null); + } + const positionSlider = context.querySelector('.nowPlayingPositionSlider'); + + if (positionSlider && item && item.RunTimeTicks) { + positionSlider.setKeyboardSteps(userSettings.skipBackLength() * 1000000 / item.RunTimeTicks, + userSettings.skipForwardLength() * 1000000 / item.RunTimeTicks); + } + + if (positionSlider && !positionSlider.dragging) { + positionSlider.disabled = !playState.CanSeek; + const isProgressClear = state.MediaSource && state.MediaSource.RunTimeTicks == null; + positionSlider.setIsClear(isProgressClear); + } + + updatePlayPauseState(playState.IsPaused, item != null); + updateTimeDisplay(playState.PositionTicks, item ? item.RunTimeTicks : null); + updatePlayerVolumeState(context, playState.IsMuted, playState.VolumeLevel); + + if (item && item.MediaType == 'Video') { + context.classList.remove('hideVideoButtons'); + } else { + context.classList.add('hideVideoButtons'); + } + + updateRepeatModeDisplay(playbackManager.getRepeatMode()); + onShuffleQueueModeChange(false); + updateNowPlayingInfo(context, state); + } + + function updateAudioTracksDisplay(player, context) { + const supportedCommands = currentPlayerSupportedCommands; + buttonVisible(context.querySelector('.btnAudioTracks'), playbackManager.audioTracks(player).length > 1 && supportedCommands.indexOf('SetAudioStreamIndex') != -1); + } + + function updateSubtitleTracksDisplay(player, context) { + const supportedCommands = currentPlayerSupportedCommands; + buttonVisible(context.querySelector('.btnSubtitles'), playbackManager.subtitleTracks(player).length && supportedCommands.indexOf('SetSubtitleStreamIndex') != -1); + } + + function updateRepeatModeDisplay(repeatMode) { + const context = dlg; + const toggleRepeatButtons = context.querySelectorAll('.repeatToggleButton'); + const cssClass = 'buttonActive'; + let innHtml = ''; + let repeatOn = true; + + switch (repeatMode) { + case 'RepeatAll': + break; + case 'RepeatOne': + innHtml = ''; + break; + case 'RepeatNone': + default: + repeatOn = false; + break; + } + + for (const toggleRepeatButton of toggleRepeatButtons) { + toggleRepeatButton.classList.toggle(cssClass, repeatOn); + toggleRepeatButton.innerHTML = innHtml; + } + } + + function updatePlayerVolumeState(context, isMuted, volumeLevel) { + const view = context; + const supportedCommands = currentPlayerSupportedCommands; + + if (supportedCommands.indexOf('Mute') === -1) { + showMuteButton = false; + } + + if (supportedCommands.indexOf('SetVolume') === -1) { + showVolumeSlider = false; + } + + if (currentPlayer.isLocalPlayer && appHost.supports('physicalvolumecontrol')) { + showMuteButton = false; + showVolumeSlider = false; + } + + const buttonMute = view.querySelector('.buttonMute'); + const buttonMuteIcon = buttonMute.querySelector('.material-icons'); + + buttonMuteIcon.classList.remove('volume_off', 'volume_up'); + + if (isMuted) { + buttonMute.setAttribute('title', globalize.translate('Unmute')); + buttonMuteIcon.classList.add('volume_off'); + } else { + buttonMute.setAttribute('title', globalize.translate('Mute')); + buttonMuteIcon.classList.add('volume_up'); + } + + if (!showMuteButton && !showVolumeSlider) { + context.querySelector('.volumecontrol').classList.add('hide'); + } else { + buttonMute.classList.toggle('hide', !showMuteButton); + + const nowPlayingVolumeSlider = context.querySelector('.nowPlayingVolumeSlider'); + const nowPlayingVolumeSliderContainer = context.querySelector('.nowPlayingVolumeSliderContainer'); + + if (nowPlayingVolumeSlider) { + nowPlayingVolumeSliderContainer.classList.toggle('hide', !showVolumeSlider); + + if (!nowPlayingVolumeSlider.dragging) { + nowPlayingVolumeSlider.value = volumeLevel || 0; } } - - if (updateView) { - onPlaylistUpdate(); - } } + } - function onPlaylistUpdate(e) { - loadPlaylist(dlg, this); - } + function updatePlayPauseState(isPaused, isActive) { + const context = dlg; + const btnPlayPause = context.querySelector('.btnPlayPause'); + const btnPlayPauseIcon = btnPlayPause.querySelector('.material-icons'); - function onPlaylistItemRemoved(e, info) { - var context = dlg; - if (info !== undefined) { - var playlistItemIds = info.playlistItemIds; + btnPlayPauseIcon.classList.remove('play_circle_filled', 'pause_circle_filled'); + btnPlayPauseIcon.classList.add(isPaused ? 'play_circle_filled' : 'pause_circle_filled'); - for (var i = 0, length = playlistItemIds.length; i < length; i++) { - var listItem = context.querySelector('.listItem[data-playlistItemId="' + playlistItemIds[i] + '"]'); + buttonVisible(btnPlayPause, isActive); + } - if (listItem) { - listItem.parentNode.removeChild(listItem); - } - } + function updateTimeDisplay(positionTicks, runtimeTicks) { + const context = dlg; + const positionSlider = context.querySelector('.nowPlayingPositionSlider'); + + if (positionSlider && !positionSlider.dragging) { + if (runtimeTicks) { + let pct = positionTicks / runtimeTicks; + pct *= 100; + positionSlider.value = pct; } else { - onPlaylistUpdate(); + positionSlider.value = 0; } } - function onPlaybackStopped(e, state) { - console.debug('remotecontrol event: ' + e.type); - var player = this; + context.querySelector('.positionTime').innerHTML = positionTicks == null ? '--:--' : datetime.getDisplayRunningTime(positionTicks); + context.querySelector('.runtime').innerHTML = runtimeTicks != null ? datetime.getDisplayRunningTime(runtimeTicks) : '--:--'; + } - if (!state.NextMediaType) { - updatePlayerState(player, dlg, {}); - Emby.Page.back(); + function getPlaylistItems(player) { + return playbackManager.getPlaylist(player); + } + + function loadPlaylist(context, player) { + getPlaylistItems(player).then(function (items) { + let html = ''; + let favoritesEnabled = true; + if (layoutManager.mobile) { + if (items.length > 0) { + context.querySelector('.btnTogglePlaylist').classList.remove('hide'); + } else { + context.querySelector('.btnTogglePlaylist').classList.add('hide'); + } + favoritesEnabled = false; + } + + html += listView.getListViewHtml({ + items: items, + smallIcon: true, + action: 'setplaylistindex', + enableUserDataButtons: favoritesEnabled, + rightButtons: [{ + icon: 'remove_circle_outline', + title: globalize.translate('ButtonRemove'), + id: 'remove' + }], + dragHandle: true + }); + + const itemsContainer = context.querySelector('.playlist'); + let focusedItemPlaylistId = itemsContainer.querySelector('button:focus'); + itemsContainer.innerHTML = html; + if (focusedItemPlaylistId !== null) { + focusedItemPlaylistId = focusedItemPlaylistId.getAttribute('data-playlistitemid'); + const newFocusedItem = itemsContainer.querySelector(`button[data-playlistitemid="${focusedItemPlaylistId}"]`); + if (newFocusedItem !== null) { + newFocusedItem.focus(); + } + } + + const playlistItemId = playbackManager.getCurrentPlaylistItemId(player); + + if (playlistItemId) { + const img = itemsContainer.querySelector(`.listItem[data-playlistItemId="${playlistItemId}"] .listItemImage`); + + if (img) { + img.classList.remove('lazy'); + img.classList.add('playlistIndexIndicatorImage'); + } + } + + imageLoader.lazyChildren(itemsContainer); + }); + } + + function onPlaybackStart(e, state) { + console.debug('remotecontrol event: ' + e.type); + const player = this; + onStateChanged.call(player, e, state); + } + + function onRepeatModeChange() { + updateRepeatModeDisplay(playbackManager.getRepeatMode()); + } + + function onShuffleQueueModeChange(updateView = true) { + const shuffleMode = playbackManager.getQueueShuffleMode(this); + const context = dlg; + const cssClass = 'buttonActive'; + const shuffleButtons = context.querySelectorAll('.btnShuffleQueue'); + + for (const shuffleButton of shuffleButtons) { + switch (shuffleMode) { + case 'Shuffle': + shuffleButton.classList.add(cssClass); + break; + case 'Sorted': + default: + shuffleButton.classList.remove(cssClass); + break; } } - function onPlayPauseStateChanged(e) { - updatePlayPauseState(this.paused(), true); - } - - function onStateChanged(event, state) { - var player = this; - updatePlayerState(player, dlg, state); + if (updateView) { onPlaylistUpdate(); } + } - function onTimeUpdate(e) { - var now = new Date().getTime(); + function onPlaylistUpdate(e) { + loadPlaylist(dlg, this); + } - if (!(now - lastUpdateTime < 700)) { - lastUpdateTime = now; - var player = this; - currentRuntimeTicks = playbackManager.duration(player); - updateTimeDisplay(playbackManager.currentTime(player), currentRuntimeTicks); + function onPlaylistItemRemoved(e, info) { + const context = dlg; + if (info !== undefined) { + const playlistItemIds = info.playlistItemIds; + + for (let i = 0, length = playlistItemIds.length; i < length; i++) { + const listItem = context.querySelector('.listItem[data-playlistItemId="' + playlistItemIds[i] + '"]'); + + if (listItem) { + listItem.parentNode.removeChild(listItem); + } + } + } else { + onPlaylistUpdate(); + } + } + + function onPlaybackStopped(e, state) { + console.debug('remotecontrol event: ' + e.type); + const player = this; + + if (!state.NextMediaType) { + updatePlayerState(player, dlg, {}); + Emby.Page.back(); + } + } + + function onPlayPauseStateChanged(e) { + updatePlayPauseState(this.paused(), true); + } + + function onStateChanged(event, state) { + const player = this; + updatePlayerState(player, dlg, state); + onPlaylistUpdate(); + } + + function onTimeUpdate(e) { + const now = new Date().getTime(); + + if (!(now - lastUpdateTime < 700)) { + lastUpdateTime = now; + const player = this; + currentRuntimeTicks = playbackManager.duration(player); + updateTimeDisplay(playbackManager.currentTime(player), currentRuntimeTicks); + } + } + + function onVolumeChanged(e) { + const player = this; + updatePlayerVolumeState(dlg, player.isMuted(), player.getVolume()); + } + + function releaseCurrentPlayer() { + const player = currentPlayer; + + if (player) { + events.off(player, 'playbackstart', onPlaybackStart); + events.off(player, 'statechange', onStateChanged); + events.off(player, 'repeatmodechange', onRepeatModeChange); + events.off(player, 'shufflequeuemodechange', onShuffleQueueModeChange); + events.off(player, 'playlistitemremove', onPlaylistItemRemoved); + events.off(player, 'playlistitemmove', onPlaylistUpdate); + events.off(player, 'playlistitemadd', onPlaylistUpdate); + events.off(player, 'playbackstop', onPlaybackStopped); + events.off(player, 'volumechange', onVolumeChanged); + events.off(player, 'pause', onPlayPauseStateChanged); + events.off(player, 'unpause', onPlayPauseStateChanged); + events.off(player, 'timeupdate', onTimeUpdate); + currentPlayer = null; + } + } + + function bindToPlayer(context, player) { + if (releaseCurrentPlayer(), currentPlayer = player, player) { + const state = playbackManager.getPlayerState(player); + onStateChanged.call(player, { + type: 'init' + }, state); + events.on(player, 'playbackstart', onPlaybackStart); + events.on(player, 'statechange', onStateChanged); + events.on(player, 'repeatmodechange', onRepeatModeChange); + events.on(player, 'shufflequeuemodechange', onShuffleQueueModeChange); + events.on(player, 'playlistitemremove', onPlaylistItemRemoved); + events.on(player, 'playlistitemmove', onPlaylistUpdate); + events.on(player, 'playlistitemadd', onPlaylistUpdate); + events.on(player, 'playbackstop', onPlaybackStopped); + events.on(player, 'volumechange', onVolumeChanged); + events.on(player, 'pause', onPlayPauseStateChanged); + events.on(player, 'unpause', onPlayPauseStateChanged); + events.on(player, 'timeupdate', onTimeUpdate); + const playerInfo = playbackManager.getPlayerInfo(); + const supportedCommands = playerInfo.supportedCommands; + currentPlayerSupportedCommands = supportedCommands; + updateSupportedCommands(context, supportedCommands); + } + } + + function onBtnCommandClick() { + if (currentPlayer) { + if (this.classList.contains('repeatToggleButton')) { + toggleRepeat(); + } else { + playbackManager.sendCommand({ + Name: this.getAttribute('data-command') + }, currentPlayer); } } + } - function onVolumeChanged(e) { - var player = this; - updatePlayerVolumeState(dlg, player.isMuted(), player.getVolume()); + function getSaveablePlaylistItems() { + return getPlaylistItems(currentPlayer).then(function (items) { + return items.filter(function (i) { + return i.Id && i.ServerId; + }); + }); + } + + function savePlaylist() { + import('playlistEditor').then(({ default: playlistEditor }) => { + getSaveablePlaylistItems().then(function (items) { + const serverId = items.length ? items[0].ServerId : ApiClient.serverId(); + new playlistEditor({ + items: items.map(function (i) { + return i.Id; + }), + serverId: serverId, + enableAddToPlayQueue: false, + defaultValue: 'new' + }); + }); + }); + } + + function bindEvents(context) { + const btnCommand = context.querySelectorAll('.btnCommand'); + const positionSlider = context.querySelector('.nowPlayingPositionSlider'); + + for (let i = 0, length = btnCommand.length; i < length; i++) { + btnCommand[i].addEventListener('click', onBtnCommandClick); } - function releaseCurrentPlayer() { - var player = currentPlayer; - - if (player) { - events.off(player, 'playbackstart', onPlaybackStart); - events.off(player, 'statechange', onStateChanged); - events.off(player, 'repeatmodechange', onRepeatModeChange); - events.off(player, 'shufflequeuemodechange', onShuffleQueueModeChange); - events.off(player, 'playlistitemremove', onPlaylistItemRemoved); - events.off(player, 'playlistitemmove', onPlaylistUpdate); - events.off(player, 'playlistitemadd', onPlaylistUpdate); - events.off(player, 'playbackstop', onPlaybackStopped); - events.off(player, 'volumechange', onVolumeChanged); - events.off(player, 'pause', onPlayPauseStateChanged); - events.off(player, 'unpause', onPlayPauseStateChanged); - events.off(player, 'timeupdate', onTimeUpdate); - currentPlayer = null; - } - } - - function bindToPlayer(context, player) { - if (releaseCurrentPlayer(), currentPlayer = player, player) { - var state = playbackManager.getPlayerState(player); - onStateChanged.call(player, { - type: 'init' - }, state); - events.on(player, 'playbackstart', onPlaybackStart); - events.on(player, 'statechange', onStateChanged); - events.on(player, 'repeatmodechange', onRepeatModeChange); - events.on(player, 'shufflequeuemodechange', onShuffleQueueModeChange); - events.on(player, 'playlistitemremove', onPlaylistItemRemoved); - events.on(player, 'playlistitemmove', onPlaylistUpdate); - events.on(player, 'playlistitemadd', onPlaylistUpdate); - events.on(player, 'playbackstop', onPlaybackStopped); - events.on(player, 'volumechange', onVolumeChanged); - events.on(player, 'pause', onPlayPauseStateChanged); - events.on(player, 'unpause', onPlayPauseStateChanged); - events.on(player, 'timeupdate', onTimeUpdate); - var playerInfo = playbackManager.getPlayerInfo(); - var supportedCommands = playerInfo.supportedCommands; - currentPlayerSupportedCommands = supportedCommands; - updateSupportedCommands(context, supportedCommands); - } - } - - function onBtnCommandClick() { + context.querySelector('.btnToggleFullscreen').addEventListener('click', function (e) { if (currentPlayer) { - if (this.classList.contains('repeatToggleButton')) { - toggleRepeat(); + playbackManager.sendCommand({ + Name: e.target.getAttribute('data-command') + }, currentPlayer); + } + }); + context.querySelector('.btnAudioTracks').addEventListener('click', function (e) { + if (currentPlayer && lastPlayerState && lastPlayerState.NowPlayingItem) { + showAudioMenu(context, currentPlayer, e.target, lastPlayerState.NowPlayingItem); + } + }); + context.querySelector('.btnSubtitles').addEventListener('click', function (e) { + if (currentPlayer && lastPlayerState && lastPlayerState.NowPlayingItem) { + showSubtitleMenu(context, currentPlayer, e.target, lastPlayerState.NowPlayingItem); + } + }); + context.querySelector('.btnStop').addEventListener('click', function () { + if (currentPlayer) { + playbackManager.stop(currentPlayer); + } + }); + context.querySelector('.btnPlayPause').addEventListener('click', function () { + if (currentPlayer) { + playbackManager.playPause(currentPlayer); + } + }); + context.querySelector('.btnNextTrack').addEventListener('click', function () { + if (currentPlayer) { + playbackManager.nextTrack(currentPlayer); + } + }); + context.querySelector('.btnRewind').addEventListener('click', function () { + if (currentPlayer) { + playbackManager.rewind(currentPlayer); + } + }); + context.querySelector('.btnFastForward').addEventListener('click', function () { + if (currentPlayer) { + playbackManager.fastForward(currentPlayer); + } + }); + for (const shuffleButton of context.querySelectorAll('.btnShuffleQueue')) { + shuffleButton.addEventListener('click', function () { + if (currentPlayer) { + playbackManager.toggleQueueShuffleMode(currentPlayer); + } + }); + } + + context.querySelector('.btnPreviousTrack').addEventListener('click', function (e) { + if (currentPlayer) { + if (lastPlayerState.NowPlayingItem.MediaType === 'Audio' && (currentPlayer._currentTime >= 5 || !playbackManager.previousTrack(currentPlayer))) { + // Cancel this event if doubleclick is fired + if (e.detail > 1 && playbackManager.previousTrack(currentPlayer)) { + return; + } + playbackManager.seekPercent(0, currentPlayer); + // This is done automatically by playbackManager. However, setting this here gives instant visual feedback. + // TODO: Check why seekPercentage doesn't reflect the changes inmmediately, so we can remove this workaround. + positionSlider.value = 0; } else { - playbackManager.sendCommand({ - Name: this.getAttribute('data-command') - }, currentPlayer); - } - } - } - - function getSaveablePlaylistItems() { - return getPlaylistItems(currentPlayer).then(function (items) { - return items.filter(function (i) { - return i.Id && i.ServerId; - }); - }); - } - - function savePlaylist() { - require(['playlistEditor'], function (playlistEditor) { - getSaveablePlaylistItems().then(function (items) { - var serverId = items.length ? items[0].ServerId : ApiClient.serverId(); - new playlistEditor.showEditor({ - items: items.map(function (i) { - return i.Id; - }), - serverId: serverId, - enableAddToPlayQueue: false, - defaultValue: 'new' - }); - }); - }); - } - - function bindEvents(context) { - var btnCommand = context.querySelectorAll('.btnCommand'); - var positionSlider = context.querySelector('.nowPlayingPositionSlider'); - - for (var i = 0, length = btnCommand.length; i < length; i++) { - btnCommand[i].addEventListener('click', onBtnCommandClick); - } - - context.querySelector('.btnToggleFullscreen').addEventListener('click', function (e) { - if (currentPlayer) { - playbackManager.sendCommand({ - Name: e.target.getAttribute('data-command') - }, currentPlayer); - } - }); - context.querySelector('.btnAudioTracks').addEventListener('click', function (e) { - if (currentPlayer && lastPlayerState && lastPlayerState.NowPlayingItem) { - showAudioMenu(context, currentPlayer, e.target, lastPlayerState.NowPlayingItem); - } - }); - context.querySelector('.btnSubtitles').addEventListener('click', function (e) { - if (currentPlayer && lastPlayerState && lastPlayerState.NowPlayingItem) { - showSubtitleMenu(context, currentPlayer, e.target, lastPlayerState.NowPlayingItem); - } - }); - context.querySelector('.btnStop').addEventListener('click', function () { - if (currentPlayer) { - playbackManager.stop(currentPlayer); - } - }); - context.querySelector('.btnPlayPause').addEventListener('click', function () { - if (currentPlayer) { - playbackManager.playPause(currentPlayer); - } - }); - context.querySelector('.btnNextTrack').addEventListener('click', function () { - if (currentPlayer) { - playbackManager.nextTrack(currentPlayer); - } - }); - context.querySelector('.btnRewind').addEventListener('click', function () { - if (currentPlayer) { - playbackManager.rewind(currentPlayer); - } - }); - context.querySelector('.btnFastForward').addEventListener('click', function () { - if (currentPlayer) { - playbackManager.fastForward(currentPlayer); - } - }); - for (const shuffleButton of context.querySelectorAll('.btnShuffleQueue')) { - shuffleButton.addEventListener('click', function () { - if (currentPlayer) { - playbackManager.toggleQueueShuffleMode(currentPlayer); - } - }); - } - - context.querySelector('.btnPreviousTrack').addEventListener('click', function (e) { - if (currentPlayer) { - if (lastPlayerState.NowPlayingItem.MediaType === 'Audio' && (currentPlayer._currentTime >= 5 || !playbackManager.previousTrack(currentPlayer))) { - // Cancel this event if doubleclick is fired - if (e.detail > 1 && playbackManager.previousTrack(currentPlayer)) { - return; - } - playbackManager.seekPercent(0, currentPlayer); - // This is done automatically by playbackManager. However, setting this here gives instant visual feedback. - // TODO: Check why seekPercentage doesn't reflect the changes inmmediately, so we can remove this workaround. - positionSlider.value = 0; - } else { - playbackManager.previousTrack(currentPlayer); - } - } - }); - - context.querySelector('.btnPreviousTrack').addEventListener('dblclick', function () { - if (currentPlayer) { playbackManager.previousTrack(currentPlayer); } - }); - positionSlider.addEventListener('change', function () { - var value = this.value; + } + }); - if (currentPlayer) { - var newPercent = parseFloat(value); - playbackManager.seekPercent(newPercent, currentPlayer); - } - }); + context.querySelector('.btnPreviousTrack').addEventListener('dblclick', function () { + if (currentPlayer) { + playbackManager.previousTrack(currentPlayer); + } + }); + positionSlider.addEventListener('change', function () { + const value = this.value; - positionSlider.getBubbleText = function (value) { - var state = lastPlayerState; + if (currentPlayer) { + const newPercent = parseFloat(value); + playbackManager.seekPercent(newPercent, currentPlayer); + } + }); - if (!state || !state.NowPlayingItem || !currentRuntimeTicks) { - return '--:--'; - } + positionSlider.getBubbleText = function (value) { + const state = lastPlayerState; - var ticks = currentRuntimeTicks; - ticks /= 100; - ticks *= value; - return datetime.getDisplayRunningTime(ticks); - }; + if (!state || !state.NowPlayingItem || !currentRuntimeTicks) { + return '--:--'; + } - context.querySelector('.nowPlayingVolumeSlider').addEventListener('input', (e) => { - playbackManager.setVolume(e.target.value, currentPlayer); - }); + let ticks = currentRuntimeTicks; + ticks /= 100; + ticks *= value; + return datetime.getDisplayRunningTime(ticks); + }; - context.querySelector('.buttonMute').addEventListener('click', function () { - playbackManager.toggleMute(currentPlayer); - }); - var playlistContainer = context.querySelector('.playlist'); - playlistContainer.addEventListener('action-remove', function (e) { - playbackManager.removeFromPlaylist([e.detail.playlistItemId], currentPlayer); - }); - playlistContainer.addEventListener('itemdrop', function (e) { - var newIndex = e.detail.newIndex; - var playlistItemId = e.detail.playlistItemId; - playbackManager.movePlaylistItem(playlistItemId, newIndex, currentPlayer); - }); - context.querySelector('.btnSavePlaylist').addEventListener('click', savePlaylist); - context.querySelector('.btnTogglePlaylist').addEventListener('click', function () { - if (context.querySelector('.playlist').classList.contains('hide')) { - context.querySelector('.playlist').classList.remove('hide'); - context.querySelector('.btnSavePlaylist').classList.remove('hide'); - context.querySelector('.volumecontrol').classList.add('hide'); - if (layoutManager.mobile) { - context.querySelector('.playlistSectionButton').classList.remove('playlistSectionButtonTransparent'); - } - } else { - context.querySelector('.playlist').classList.add('hide'); - context.querySelector('.btnSavePlaylist').classList.add('hide'); - if (showMuteButton || showVolumeSlider) { - context.querySelector('.volumecontrol').classList.remove('hide'); - } - if (layoutManager.mobile) { - context.querySelector('.playlistSectionButton').classList.add('playlistSectionButtonTransparent'); - } - } - }); - } + context.querySelector('.nowPlayingVolumeSlider').addEventListener('input', (e) => { + playbackManager.setVolume(e.target.value, currentPlayer); + }); - function onPlayerChange() { - bindToPlayer(dlg, playbackManager.getCurrentPlayer()); - } - - function onMessageSubmit(e) { - var form = e.target; - playbackManager.sendCommand({ - Name: 'DisplayMessage', - Arguments: { - Header: form.querySelector('#txtMessageTitle').value, - Text: form.querySelector('#txtMessageText', form).value - } - }, currentPlayer); - form.querySelector('input').value = ''; - - require(['toast'], function (toast) { - toast('Message sent.'); - }); - - e.preventDefault(); - e.stopPropagation(); - return false; - } - - function onSendStringSubmit(e) { - var form = e.target; - playbackManager.sendCommand({ - Name: 'SendString', - Arguments: { - String: form.querySelector('#txtTypeText', form).value - } - }, currentPlayer); - form.querySelector('input').value = ''; - - require(['toast'], function (toast) { - toast('Text sent.'); - }); - - e.preventDefault(); - e.stopPropagation(); - return false; - } - - function init(ownerView, context) { - let volumecontrolHtml = '
'; - volumecontrolHtml += ``; - volumecontrolHtml += '
'; - volumecontrolHtml += '
'; - let optionsSection = context.querySelector('.playlistSectionButton'); - if (!layoutManager.mobile) { - context.querySelector('.nowPlayingSecondaryButtons').insertAdjacentHTML('beforeend', volumecontrolHtml); - optionsSection.classList.remove('align-items-center', 'justify-content-center'); - optionsSection.classList.add('align-items-right', 'justify-content-flex-end'); + context.querySelector('.buttonMute').addEventListener('click', function () { + playbackManager.toggleMute(currentPlayer); + }); + const playlistContainer = context.querySelector('.playlist'); + playlistContainer.addEventListener('action-remove', function (e) { + playbackManager.removeFromPlaylist([e.detail.playlistItemId], currentPlayer); + }); + playlistContainer.addEventListener('itemdrop', function (e) { + const newIndex = e.detail.newIndex; + const playlistItemId = e.detail.playlistItemId; + playbackManager.movePlaylistItem(playlistItemId, newIndex, currentPlayer); + }); + context.querySelector('.btnSavePlaylist').addEventListener('click', savePlaylist); + context.querySelector('.btnTogglePlaylist').addEventListener('click', function () { + if (context.querySelector('.playlist').classList.contains('hide')) { context.querySelector('.playlist').classList.remove('hide'); context.querySelector('.btnSavePlaylist').classList.remove('hide'); - context.classList.add('padded-bottom'); + context.querySelector('.volumecontrol').classList.add('hide'); + if (layoutManager.mobile) { + context.querySelector('.playlistSectionButton').classList.remove('playlistSectionButtonTransparent'); + } } else { - optionsSection.querySelector('.btnTogglePlaylist').insertAdjacentHTML('afterend', volumecontrolHtml); - optionsSection.classList.add('playlistSectionButtonTransparent'); - context.querySelector('.btnTogglePlaylist').classList.remove('hide'); - context.querySelector('.playlistSectionButton').classList.remove('justify-content-center'); - context.querySelector('.playlistSectionButton').classList.add('justify-content-space-between'); + context.querySelector('.playlist').classList.add('hide'); + context.querySelector('.btnSavePlaylist').classList.add('hide'); + if (showMuteButton || showVolumeSlider) { + context.querySelector('.volumecontrol').classList.remove('hide'); + } + if (layoutManager.mobile) { + context.querySelector('.playlistSectionButton').classList.add('playlistSectionButtonTransparent'); + } } + }); + } - bindEvents(context); - context.querySelector('.sendMessageForm').addEventListener('submit', onMessageSubmit); - context.querySelector('.typeTextForm').addEventListener('submit', onSendStringSubmit); - events.on(playbackManager, 'playerchange', onPlayerChange); + function onPlayerChange() { + bindToPlayer(dlg, playbackManager.getCurrentPlayer()); + } - if (layoutManager.tv) { - var positionSlider = context.querySelector('.nowPlayingPositionSlider'); - positionSlider.classList.add('focusable'); - positionSlider.enableKeyboardDragging(); + function onMessageSubmit(e) { + const form = e.target; + playbackManager.sendCommand({ + Name: 'DisplayMessage', + Arguments: { + Header: form.querySelector('#txtMessageTitle').value, + Text: form.querySelector('#txtMessageText', form).value } + }, currentPlayer); + form.querySelector('input').value = ''; + + import('toast').then(({ default: toast }) => { + toast('Message sent.'); + }); + + e.preventDefault(); + e.stopPropagation(); + return false; + } + + function onSendStringSubmit(e) { + const form = e.target; + playbackManager.sendCommand({ + Name: 'SendString', + Arguments: { + String: form.querySelector('#txtTypeText', form).value + } + }, currentPlayer); + form.querySelector('input').value = ''; + + import('toast').then(({ default: toast }) => { + toast('Text sent.'); + }); + + e.preventDefault(); + e.stopPropagation(); + return false; + } + + function init(ownerView, context) { + let volumecontrolHtml = '
'; + volumecontrolHtml += ``; + volumecontrolHtml += '
'; + volumecontrolHtml += '
'; + const optionsSection = context.querySelector('.playlistSectionButton'); + if (!layoutManager.mobile) { + context.querySelector('.nowPlayingSecondaryButtons').insertAdjacentHTML('beforeend', volumecontrolHtml); + optionsSection.classList.remove('align-items-center', 'justify-content-center'); + optionsSection.classList.add('align-items-right', 'justify-content-flex-end'); + context.querySelector('.playlist').classList.remove('hide'); + context.querySelector('.btnSavePlaylist').classList.remove('hide'); + context.classList.add('padded-bottom'); + } else { + optionsSection.querySelector('.btnTogglePlaylist').insertAdjacentHTML('afterend', volumecontrolHtml); + optionsSection.classList.add('playlistSectionButtonTransparent'); + context.querySelector('.btnTogglePlaylist').classList.remove('hide'); + context.querySelector('.playlistSectionButton').classList.remove('justify-content-center'); + context.querySelector('.playlistSectionButton').classList.add('justify-content-space-between'); } - function onDialogClosed(e) { - releaseCurrentPlayer(); - events.off(playbackManager, 'playerchange', onPlayerChange); - lastPlayerState = null; + bindEvents(context); + context.querySelector('.sendMessageForm').addEventListener('submit', onMessageSubmit); + context.querySelector('.typeTextForm').addEventListener('submit', onSendStringSubmit); + events.on(playbackManager, 'playerchange', onPlayerChange); + + if (layoutManager.tv) { + const positionSlider = context.querySelector('.nowPlayingPositionSlider'); + positionSlider.classList.add('focusable'); + positionSlider.enableKeyboardDragging(); } + } - function onShow(context, tab) { - bindToPlayer(context, playbackManager.getCurrentPlayer()); - } + function onDialogClosed(e) { + releaseCurrentPlayer(); + events.off(playbackManager, 'playerchange', onPlayerChange); + lastPlayerState = null; + } - var dlg; - var currentPlayer; - var lastPlayerState; - var currentPlayerSupportedCommands = []; - var lastUpdateTime = 0; - var currentRuntimeTicks = 0; - var self = this; + function onShow(context, tab) { + bindToPlayer(context, playbackManager.getCurrentPlayer()); + } - self.init = function (ownerView, context) { - dlg = context; - init(ownerView, dlg); - }; + let dlg; + let currentPlayer; + let lastPlayerState; + let currentPlayerSupportedCommands = []; + let lastUpdateTime = 0; + let currentRuntimeTicks = 0; + const self = this; - self.onShow = function () { - onShow(dlg, window.location.hash); - }; - - self.destroy = function () { - onDialogClosed(); - }; + self.init = function (ownerView, context) { + dlg = context; + init(ownerView, dlg); }; -}); + + self.onShow = function () { + onShow(dlg, window.location.hash); + }; + + self.destroy = function () { + onDialogClosed(); + }; +} diff --git a/src/components/require/requiretext.js b/src/components/require/requiretext.js index 8c68daed92..28ddeb21c8 100644 --- a/src/components/require/requiretext.js +++ b/src/components/require/requiretext.js @@ -2,7 +2,7 @@ define(function () { 'use strict'; // hack to work around the server's auto-redirection feature - var addRedirectPrevention = self.dashboardVersion != null && self.Dashboard && !self.AppInfo.isNativeApp; + var addRedirectPrevention = window.dashboardVersion != null && window.Dashboard && !window.AppInfo.isNativeApp; return { diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 4ee31a6275..549cb9445c 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -251,7 +251,7 @@ import layoutManager from 'layoutManager'; * @return {ScrollerData} Scroller data. */ function getScrollerData(scroller, vertical) { - let data = {}; + const data = {}; if (!vertical) { data.scrollPos = scroller.scrollLeft; diff --git a/src/components/serviceworker/notifications.js b/src/components/serviceworker/notifications.js index 5f96d01a4d..339d521bbc 100644 --- a/src/components/serviceworker/notifications.js +++ b/src/components/serviceworker/notifications.js @@ -26,7 +26,7 @@ }); } - self.addEventListener('notificationclick', function (event) { + window.addEventListener('notificationclick', function (event) { var notification = event.notification; notification.close(); diff --git a/src/components/skinManager.js b/src/components/skinManager.js deleted file mode 100644 index faa1a1f306..0000000000 --- a/src/components/skinManager.js +++ /dev/null @@ -1,184 +0,0 @@ -define(['apphost', 'userSettings', 'browser', 'events', 'backdrop', 'globalize', 'require', 'appSettings'], function (appHost, userSettings, browser, events, backdrop, globalize, require, appSettings) { - 'use strict'; - - var themeStyleElement; - var currentThemeId; - - function unloadTheme() { - var elem = themeStyleElement; - if (elem) { - elem.parentNode.removeChild(elem); - themeStyleElement = null; - currentThemeId = null; - } - } - - function loadUserSkin(options) { - options = options || {}; - if (options.start) { - Emby.Page.invokeShortcut(options.start); - } else { - Emby.Page.goHome(); - } - } - - function getThemes() { - return [{ - name: 'Apple TV', - id: 'appletv' - }, { - name: 'Blue Radiance', - id: 'blueradiance' - }, { - name: 'Dark', - id: 'dark', - isDefault: true, - isDefaultServerDashboard: true - }, { - name: 'Light', - id: 'light' - }, { - name: 'Purple Haze', - id: 'purplehaze' - }, { - name: 'Windows Media Center', - id: 'wmc' - }]; - } - - var skinManager = { - getThemes: getThemes, - loadUserSkin: loadUserSkin - }; - - function getThemeStylesheetInfo(id, isDefaultProperty) { - var themes = skinManager.getThemes(); - var defaultTheme; - var selectedTheme; - - for (var i = 0, length = themes.length; i < length; i++) { - var theme = themes[i]; - if (theme[isDefaultProperty]) { - defaultTheme = theme; - } - if (id === theme.id) { - selectedTheme = theme; - } - } - - selectedTheme = selectedTheme || defaultTheme; - return { - stylesheetPath: require.toUrl('themes/' + selectedTheme.id + '/theme.css'), - themeId: selectedTheme.id - }; - } - - var themeResources = {}; - var lastSound = 0; - var currentSound; - - function loadThemeResources(id) { - lastSound = 0; - if (currentSound) { - currentSound.stop(); - currentSound = null; - } - - backdrop.clearBackdrop(); - } - - function onThemeLoaded() { - document.documentElement.classList.remove('preload'); - try { - var color = getComputedStyle(document.querySelector('.skinHeader')).getPropertyValue('background-color'); - if (color) { - appHost.setThemeColor(color); - } - } catch (err) { - console.error('error setting theme color: ' + err); - } - } - - skinManager.setTheme = function (id, context) { - return new Promise(function (resolve, reject) { - if (currentThemeId && currentThemeId === id) { - resolve(); - return; - } - - var isDefaultProperty = context === 'serverdashboard' ? 'isDefaultServerDashboard' : 'isDefault'; - var info = getThemeStylesheetInfo(id, isDefaultProperty); - if (currentThemeId && currentThemeId === info.themeId) { - resolve(); - return; - } - - var linkUrl = info.stylesheetPath; - unloadTheme(); - - var link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('type', 'text/css'); - link.onload = function () { - onThemeLoaded(); - resolve(); - }; - - link.setAttribute('href', linkUrl); - document.head.appendChild(link); - themeStyleElement = link; - currentThemeId = info.themeId; - loadThemeResources(info.themeId); - - onViewBeforeShow({}); - }); - }; - - function onViewBeforeShow(e) { - if (e.detail && e.detail.type === 'video-osd') { - // This removes the space that the scrollbar takes while playing a video - document.body.classList.remove('force-scroll'); - return; - } - - if (themeResources.backdrop) { - backdrop.setBackdrop(themeResources.backdrop); - } - - if (!browser.mobile && userSettings.enableThemeSongs()) { - if (lastSound === 0) { - if (themeResources.themeSong) { - playSound(themeResources.themeSong); - } - } else if ((new Date().getTime() - lastSound) > 30000) { - if (themeResources.effect) { - playSound(themeResources.effect); - } - } - } - // This keeps the scrollbar always present in all pages, so we avoid clipping while switching between pages - // that need the scrollbar and pages that don't. - document.body.classList.add('force-scroll'); - } - - document.addEventListener('viewshow', onViewBeforeShow); - - function playSound(path, volume) { - lastSound = new Date().getTime(); - require(['howler'], function (howler) { - /* globals Howl */ - try { - var sound = new Howl({ - src: [path], - volume: volume || 0.1 - }); - sound.play(); - currentSound = sound; - } catch (err) { - console.error('error playing sound: ' + err); - } - }); - } - - return skinManager; -}); diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 56327312f6..82f541a116 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -2,664 +2,672 @@ * Image viewer component * @module components/slideshow/slideshow */ -define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'focusManager', 'browser', 'apphost', 'dom', 'css!./style', 'material-icons', 'paper-icon-button-light'], function (dialogHelper, inputManager, connectionManager, layoutManager, focusManager, browser, appHost, dom) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import inputManager from 'inputManager'; +import connectionManager from 'connectionManager'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import browser from 'browser'; +import appHost from 'apphost'; +import dom from 'dom'; +import 'css!./style'; +import 'material-icons'; +import 'paper-icon-button-light'; - /** - * Name of transition event. - */ - const transitionEndEventName = dom.whichTransitionEvent(); +/** + * Name of transition event. + */ +const transitionEndEventName = dom.whichTransitionEvent(); - /** - * Flag to use fake image to fix blurry zoomed image. - * At least WebKit doesn't restore quality for zoomed images. - */ - const useFakeZoomImage = browser.safari; +/** + * Flag to use fake image to fix blurry zoomed image. + * At least WebKit doesn't restore quality for zoomed images. + */ +const useFakeZoomImage = browser.safari; - /** - * Retrieves an item's image URL from the API. - * @param {object|string} item - Item used to generate the image URL. - * @param {object} options - Options of the image. - * @param {object} apiClient - API client instance used to retrieve the image. - * @returns {null|string} URL of the item's image. - */ - function getImageUrl(item, options, apiClient) { - options = options || {}; - options.type = options.type || 'Primary'; +/** + * Retrieves an item's image URL from the API. + * @param {object|string} item - Item used to generate the image URL. + * @param {object} options - Options of the image. + * @param {object} apiClient - API client instance used to retrieve the image. + * @returns {null|string} URL of the item's image. + */ +function getImageUrl(item, options, apiClient) { + options = options || {}; + options.type = options.type || 'Primary'; - if (typeof (item) === 'string') { - return apiClient.getScaledImageUrl(item, options); + if (typeof (item) === 'string') { + return apiClient.getScaledImageUrl(item, options); + } + + if (item.ImageTags && item.ImageTags[options.type]) { + options.tag = item.ImageTags[options.type]; + return apiClient.getScaledImageUrl(item.Id, options); + } + + if (options.type === 'Primary') { + if (item.AlbumId && item.AlbumPrimaryImageTag) { + options.tag = item.AlbumPrimaryImageTag; + return apiClient.getScaledImageUrl(item.AlbumId, options); } + } - if (item.ImageTags && item.ImageTags[options.type]) { - options.tag = item.ImageTags[options.type]; - return apiClient.getScaledImageUrl(item.Id, options); + return null; +} + +/** + * Retrieves a backdrop's image URL from the API. + * @param {object} item - Item used to generate the image URL. + * @param {object} options - Options of the image. + * @param {object} apiClient - API client instance used to retrieve the image. + * @returns {null|string} URL of the item's backdrop. + */ +function getBackdropImageUrl(item, options, apiClient) { + options = options || {}; + options.type = options.type || 'Backdrop'; + + // If not resizing, get the original image + if (!options.maxWidth && !options.width && !options.maxHeight && !options.height) { + options.quality = 100; + } + + if (item.BackdropImageTags && item.BackdropImageTags.length) { + options.tag = item.BackdropImageTags[0]; + return apiClient.getScaledImageUrl(item.Id, options); + } + + return null; +} + +/** + * Dispatches a request for an item's image to its respective handler. + * @param {object} item - Item used to generate the image URL. + * @returns {string} URL of the item's image. + */ +function getImgUrl(item, user) { + const apiClient = connectionManager.getApiClient(item.ServerId); + const imageOptions = {}; + + if (item.BackdropImageTags && item.BackdropImageTags.length) { + return getBackdropImageUrl(item, imageOptions, apiClient); + } else { + if (item.MediaType === 'Photo' && user && user.Policy.EnableContentDownloading) { + return apiClient.getItemDownloadUrl(item.Id); } + imageOptions.type = 'Primary'; + return getImageUrl(item, imageOptions, apiClient); + } +} - if (options.type === 'Primary') { - if (item.AlbumId && item.AlbumPrimaryImageTag) { - options.tag = item.AlbumPrimaryImageTag; - return apiClient.getScaledImageUrl(item.AlbumId, options); +/** + * Generates a button using the specified icon, classes and properties. + * @param {string} icon - Name of the material icon on the button + * @param {string} cssClass - CSS classes to assign to the button + * @param {boolean} canFocus - Flag to set the tabindex attribute on the button to -1. + * @param {boolean} autoFocus - Flag to set the autofocus attribute on the button. + * @returns {string} The HTML markup of the button. + */ +function getIcon(icon, cssClass, canFocus, autoFocus) { + const tabIndex = canFocus ? '' : ' tabindex="-1"'; + autoFocus = autoFocus ? ' autofocus' : ''; + return ''; +} + +/** + * Sets the viewport meta tag to enable or disable scaling by the user. + * @param {boolean} scalable - Flag to set the scalability of the viewport. + */ +function setUserScalable(scalable) { + try { + appHost.setUserScalable(scalable); + } catch (err) { + console.error('error in appHost.setUserScalable: ' + err); + } +} + +export default function (options) { + const self = this; + /** Initialized instance of Swiper. */ + let swiperInstance; + /** Initialized instance of the dialog containing the Swiper instance. */ + let dialog; + /** Options of the slideshow components */ + let currentOptions; + /** ID of the timeout used to hide the OSD. */ + let hideTimeout; + /** Last coordinates of the mouse pointer. */ + let lastMouseMoveData; + + /** + * Creates the HTML markup for the dialog and the OSD. + * @param {Object} options - Options used to create the dialog and slideshow. + */ + function createElements(options) { + currentOptions = options; + + dialog = dialogHelper.createDialog({ + exitAnimationDuration: options.interactive ? 400 : 800, + size: 'fullscreen', + autoFocus: false, + scrollY: false, + exitAnimation: 'fadeout', + removeOnClose: true + }); + + dialog.classList.add('slideshowDialog'); + + let html = ''; + + html += '
'; + + if (options.interactive && !layoutManager.tv) { + const actionButtonsOnTop = layoutManager.mobile; + + html += getIcon('keyboard_arrow_left', 'btnSlideshowPrevious slideshowButton hide-mouse-idle-tv', false); + html += getIcon('keyboard_arrow_right', 'btnSlideshowNext slideshowButton hide-mouse-idle-tv', false); + + html += '
'; + if (actionButtonsOnTop) { + if (appHost.supports('filedownload') && options.user && options.user.Policy.EnableContentDownloading) { + html += getIcon('file_download', 'btnDownload slideshowButton', true); + } + if (appHost.supports('sharing')) { + html += getIcon('share', 'btnShare slideshowButton', true); + } } - } + html += getIcon('close', 'slideshowButton btnSlideshowExit hide-mouse-idle-tv', false); + html += '
'; - return null; - } + if (!actionButtonsOnTop) { + html += '
'; - /** - * Retrieves a backdrop's image URL from the API. - * @param {object} item - Item used to generate the image URL. - * @param {object} options - Options of the image. - * @param {object} apiClient - API client instance used to retrieve the image. - * @returns {null|string} URL of the item's backdrop. - */ - function getBackdropImageUrl(item, options, apiClient) { - options = options || {}; - options.type = options.type || 'Backdrop'; + html += getIcon('play_arrow', 'btnSlideshowPause slideshowButton', true, true); + if (appHost.supports('filedownload') && options.user && options.user.Policy.EnableContentDownloading) { + html += getIcon('file_download', 'btnDownload slideshowButton', true); + } + if (appHost.supports('sharing')) { + html += getIcon('share', 'btnShare slideshowButton', true); + } - // If not resizing, get the original image - if (!options.maxWidth && !options.width && !options.maxHeight && !options.height) { - options.quality = 100; - } - - if (item.BackdropImageTags && item.BackdropImageTags.length) { - options.tag = item.BackdropImageTags[0]; - return apiClient.getScaledImageUrl(item.Id, options); - } - - return null; - } - - /** - * Dispatches a request for an item's image to its respective handler. - * @param {object} item - Item used to generate the image URL. - * @returns {string} URL of the item's image. - */ - function getImgUrl(item, user) { - var apiClient = connectionManager.getApiClient(item.ServerId); - var imageOptions = {}; - - if (item.BackdropImageTags && item.BackdropImageTags.length) { - return getBackdropImageUrl(item, imageOptions, apiClient); + html += '
'; + } } else { - if (item.MediaType === 'Photo' && user && user.Policy.EnableContentDownloading) { - return apiClient.getItemDownloadUrl(item.Id); - } - imageOptions.type = 'Primary'; - return getImageUrl(item, imageOptions, apiClient); - } - } - - /** - * Generates a button using the specified icon, classes and properties. - * @param {string} icon - Name of the material icon on the button - * @param {string} cssClass - CSS classes to assign to the button - * @param {boolean} canFocus - Flag to set the tabindex attribute on the button to -1. - * @param {boolean} autoFocus - Flag to set the autofocus attribute on the button. - * @returns {string} The HTML markup of the button. - */ - function getIcon(icon, cssClass, canFocus, autoFocus) { - var tabIndex = canFocus ? '' : ' tabindex="-1"'; - autoFocus = autoFocus ? ' autofocus' : ''; - return ''; - } - - /** - * Sets the viewport meta tag to enable or disable scaling by the user. - * @param {boolean} scalable - Flag to set the scalability of the viewport. - */ - function setUserScalable(scalable) { - try { - appHost.setUserScalable(scalable); - } catch (err) { - console.error('error in appHost.setUserScalable: ' + err); - } - } - - return function (options) { - var self = this; - /** Initialized instance of Swiper. */ - var swiperInstance; - /** Initialized instance of the dialog containing the Swiper instance. */ - var dialog; - /** Options of the slideshow components */ - var currentOptions; - /** ID of the timeout used to hide the OSD. */ - var hideTimeout; - /** Last coordinates of the mouse pointer. */ - var lastMouseMoveData; - - /** - * Creates the HTML markup for the dialog and the OSD. - * @param {Object} options - Options used to create the dialog and slideshow. - */ - function createElements(options) { - currentOptions = options; - - dialog = dialogHelper.createDialog({ - exitAnimationDuration: options.interactive ? 400 : 800, - size: 'fullscreen', - autoFocus: false, - scrollY: false, - exitAnimation: 'fadeout', - removeOnClose: true - }); - - dialog.classList.add('slideshowDialog'); - - var html = ''; - - html += '
'; - - if (options.interactive && !layoutManager.tv) { - var actionButtonsOnTop = layoutManager.mobile; - - html += getIcon('keyboard_arrow_left', 'btnSlideshowPrevious slideshowButton hide-mouse-idle-tv', false); - html += getIcon('keyboard_arrow_right', 'btnSlideshowNext slideshowButton hide-mouse-idle-tv', false); - - html += '
'; - if (actionButtonsOnTop) { - if (appHost.supports('filedownload') && options.user && options.user.Policy.EnableContentDownloading) { - html += getIcon('file_download', 'btnDownload slideshowButton', true); - } - if (appHost.supports('sharing')) { - html += getIcon('share', 'btnShare slideshowButton', true); - } - } - html += getIcon('close', 'slideshowButton btnSlideshowExit hide-mouse-idle-tv', false); - html += '
'; - - if (!actionButtonsOnTop) { - html += '
'; - - html += getIcon('play_arrow', 'btnSlideshowPause slideshowButton', true, true); - if (appHost.supports('filedownload') && options.user && options.user.Policy.EnableContentDownloading) { - html += getIcon('file_download', 'btnDownload slideshowButton', true); - } - if (appHost.supports('sharing')) { - html += getIcon('share', 'btnShare slideshowButton', true); - } - - html += '
'; - } - } else { - html += '

'; - } - - dialog.innerHTML = html; - - if (options.interactive && !layoutManager.tv) { - dialog.querySelector('.btnSlideshowExit').addEventListener('click', function (e) { - dialogHelper.close(dialog); - }); - - var btnPause = dialog.querySelector('.btnSlideshowPause'); - if (btnPause) { - btnPause.addEventListener('click', playPause); - } - - var btnDownload = dialog.querySelector('.btnDownload'); - if (btnDownload) { - btnDownload.addEventListener('click', download); - } - - var btnShare = dialog.querySelector('.btnShare'); - if (btnShare) { - btnShare.addEventListener('click', share); - } - } - - setUserScalable(true); - - dialogHelper.open(dialog).then(function () { - setUserScalable(false); - }); - - inputManager.on(window, onInputCommand); - /* eslint-disable-next-line compat/compat */ - document.addEventListener((window.PointerEvent ? 'pointermove' : 'mousemove'), onPointerMove); - - dialog.addEventListener('close', onDialogClosed); - - loadSwiper(dialog, options); + html += '

'; } - /** - * Handles OSD changes when the autoplay is started. - */ - function onAutoplayStart() { - var btnSlideshowPause = dialog.querySelector('.btnSlideshowPause .material-icons'); - if (btnSlideshowPause) { - btnSlideshowPause.classList.replace('play_arrow', 'pause'); - } - } + dialog.innerHTML = html; - /** - * Handles OSD changes when the autoplay is stopped. - */ - function onAutoplayStop() { - var btnSlideshowPause = dialog.querySelector('.btnSlideshowPause .material-icons'); - if (btnSlideshowPause) { - btnSlideshowPause.classList.replace('pause', 'play_arrow'); - } - } - - /** - * Handles zoom changes. - */ - function onZoomChange(scale, imageEl, slideEl) { - const zoomImage = slideEl.querySelector('.swiper-zoom-fakeimg'); - - if (zoomImage) { - zoomImage.style.width = zoomImage.style.height = scale * 100 + '%'; - - if (scale > 1) { - if (zoomImage.classList.contains('swiper-zoom-fakeimg-hidden')) { - // Await for Swiper style changes - setTimeout(() => { - const callback = () => { - imageEl.removeEventListener(transitionEndEventName, callback); - zoomImage.classList.remove('swiper-zoom-fakeimg-hidden'); - }; - - // Swiper set 'transition-duration: 300ms' for auto zoom - // and 'transition-duration: 0s' for touch zoom - const transitionDuration = parseFloat(imageEl.style.transitionDuration.replace(/[a-z]/i, '')); - - if (transitionDuration > 0) { - imageEl.addEventListener(transitionEndEventName, callback); - } else { - callback(); - } - }, 0); - } - } else { - zoomImage.classList.add('swiper-zoom-fakeimg-hidden'); - } - } - } - - /** - * Initializes the Swiper instance and binds the relevant events. - * @param {HTMLElement} dialog - Element containing the dialog. - * @param {Object} options - Options used to initialize the Swiper instance. - */ - function loadSwiper(dialog, options) { - var slides; - if (currentOptions.slides) { - slides = currentOptions.slides; - } else { - slides = currentOptions.items; - } - - require(['swiper'], function (Swiper) { - swiperInstance = new Swiper(dialog.querySelector('.slideshowSwiperContainer'), { - direction: 'horizontal', - // Loop is disabled due to the virtual slides option not supporting it. - loop: false, - zoom: { - minRatio: 1, - toggle: true - }, - autoplay: !options.interactive, - keyboard: { - enabled: true - }, - preloadImages: true, - slidesPerView: 1, - slidesPerColumn: 1, - initialSlide: options.startIndex || 0, - speed: 240, - navigation: { - nextEl: '.btnSlideshowNext', - prevEl: '.btnSlideshowPrevious' - }, - // Virtual slides reduce memory consumption for large libraries while allowing preloading of images; - virtual: { - slides: slides, - cache: true, - renderSlide: getSwiperSlideHtml, - addSlidesBefore: 1, - addSlidesAfter: 1 - } - }); - - swiperInstance.on('autoplayStart', onAutoplayStart); - swiperInstance.on('autoplayStop', onAutoplayStop); - - if (useFakeZoomImage) { - swiperInstance.on('zoomChange', onZoomChange); - } - }); - } - - /** - * Renders the HTML markup of a slide for an item or a slide. - * @param {Object} item - The item used to render the slide. - * @param {number} index - The index of the item in the Swiper instance. - * @returns {string} The HTML markup of the slide. - */ - function getSwiperSlideHtml(item, index) { - if (currentOptions.slides) { - return getSwiperSlideHtmlFromSlide(item); - } else { - return getSwiperSlideHtmlFromItem(item); - } - } - - /** - * Renders the HTML markup of a slide for an item. - * @param {Object} item - Item used to generate the slide. - * @returns {string} The HTML markup of the slide. - */ - function getSwiperSlideHtmlFromItem(item) { - return getSwiperSlideHtmlFromSlide({ - originalImage: getImgUrl(item, currentOptions.user), - Id: item.Id, - ServerId: item.ServerId - }); - } - - /** - * Renders the HTML markup of a slide for a slide object. - * @param {Object} item - Slide object used to generate the slide. - * @returns {string} The HTML markup of the slide. - */ - function getSwiperSlideHtmlFromSlide(item) { - var html = ''; - html += '
'; - html += '
'; - if (useFakeZoomImage) { - html += `
`; - } - html += ''; - html += '
'; - if (item.title || item.subtitle) { - html += '
'; - html += '
'; - if (item.title) { - html += '

'; - html += item.title; - html += '

'; - } - if (item.description) { - html += '
'; - html += item.description; - html += '
'; - } - html += '
'; - html += '
'; - } - html += '
'; - - return html; - } - - /** - * Fetches the information of the currently displayed slide. - * @returns {null|{itemId: string, shareUrl: string, serverId: string, url: string}} Object containing the information of the currently displayed slide. - */ - function getCurrentImageInfo() { - if (swiperInstance) { - var slide = document.querySelector('.swiper-slide-active'); - - if (slide) { - return { - url: slide.getAttribute('data-original'), - shareUrl: slide.getAttribute('data-original'), - itemId: slide.getAttribute('data-itemid'), - serverId: slide.getAttribute('data-serverid') - }; - } - return null; - } else { - return null; - } - } - - /** - * Starts a download for the currently displayed slide. - */ - function download() { - var imageInfo = getCurrentImageInfo(); - - require(['fileDownloader'], function (fileDownloader) { - fileDownloader.download([imageInfo]); - }); - } - - /** - * Shares the currently displayed slide using the browser's built-in sharing feature. - */ - function share() { - var imageInfo = getCurrentImageInfo(); - - navigator.share({ - url: imageInfo.shareUrl - }); - } - - /** - * Starts the autoplay feature of the Swiper instance. - */ - function play() { - if (swiperInstance.autoplay) { - swiperInstance.autoplay.start(); - } - } - - /** - * Pauses the autoplay feature of the Swiper instance; - */ - function pause() { - if (swiperInstance.autoplay) { - swiperInstance.autoplay.stop(); - } - } - - /** - * Toggles the autoplay feature of the Swiper instance. - */ - function playPause() { - var paused = !dialog.querySelector('.btnSlideshowPause .material-icons').classList.contains('pause'); - if (paused) { - play(); - } else { - pause(); - } - } - - /** - * Closes the dialog and destroys the Swiper instance. - */ - function onDialogClosed() { - var swiper = swiperInstance; - if (swiper) { - swiper.destroy(true, true); - swiperInstance = null; - } - - inputManager.off(window, onInputCommand); - /* eslint-disable-next-line compat/compat */ - document.removeEventListener((window.PointerEvent ? 'pointermove' : 'mousemove'), onPointerMove); - // Shows page scrollbar - document.body.classList.remove('hide-scroll'); - document.body.classList.add('force-scroll'); - } - - /** - * Shows the OSD. - */ - function showOsd() { - var bottom = dialog.querySelector('.slideshowBottomBar'); - if (bottom) { - slideUpToShow(bottom); - startHideTimer(); - } - } - - /** - * Hides the OSD. - */ - function hideOsd() { - var bottom = dialog.querySelector('.slideshowBottomBar'); - if (bottom) { - slideDownToHide(bottom); - } - } - - /** - * Starts the timer used to automatically hide the OSD. - */ - function startHideTimer() { - stopHideTimer(); - hideTimeout = setTimeout(hideOsd, 3000); - } - - /** - * Stops the timer used to automatically hide the OSD. - */ - function stopHideTimer() { - if (hideTimeout) { - clearTimeout(hideTimeout); - hideTimeout = null; - } - } - - /** - * Shows the OSD by sliding it into view. - * @param {HTMLElement} element - Element containing the OSD. - */ - function slideUpToShow(element) { - if (!element.classList.contains('hide')) { - return; - } - - element.classList.remove('hide'); - - var onFinish = function () { - focusManager.focus(element.querySelector('.btnSlideshowPause')); - }; - - if (!element.animate) { - onFinish(); - return; - } - - requestAnimationFrame(function () { - var keyframes = [ - { transform: 'translate3d(0,' + element.offsetHeight + 'px,0)', opacity: '.3', offset: 0 }, - { transform: 'translate3d(0,0,0)', opacity: '1', offset: 1 } - ]; - var timing = { duration: 300, iterations: 1, easing: 'ease-out' }; - element.animate(keyframes, timing).onfinish = onFinish; - }); - } - - /** - * Hides the OSD by sliding it out of view. - * @param {HTMLElement} element - Element containing the OSD. - */ - function slideDownToHide(element) { - if (element.classList.contains('hide')) { - return; - } - - var onFinish = function () { - element.classList.add('hide'); - }; - - if (!element.animate) { - onFinish(); - return; - } - - requestAnimationFrame(function () { - var keyframes = [ - { transform: 'translate3d(0,0,0)', opacity: '1', offset: 0 }, - { transform: 'translate3d(0,' + element.offsetHeight + 'px,0)', opacity: '.3', offset: 1 } - ]; - var timing = { duration: 300, iterations: 1, easing: 'ease-out' }; - element.animate(keyframes, timing).onfinish = onFinish; - }); - } - - /** - * Shows the OSD when moving the mouse pointer or touching the screen. - * @param {Event} event - Pointer movement event. - */ - function onPointerMove(event) { - var pointerType = event.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'); - - if (pointerType === 'mouse') { - var eventX = event.screenX || 0; - var eventY = event.screenY || 0; - - var obj = lastMouseMoveData; - if (!obj) { - lastMouseMoveData = { - x: eventX, - y: eventY - }; - return; - } - - // if coord are same, it didn't move - if (Math.abs(eventX - obj.x) < 10 && Math.abs(eventY - obj.y) < 10) { - return; - } - - obj.x = eventX; - obj.y = eventY; - - showOsd(); - } - } - - /** - * Dispatches keyboard inputs to their proper handlers. - * @param {Event} event - Keyboard input event. - */ - function onInputCommand(event) { - switch (event.detail.command) { - case 'up': - case 'down': - case 'select': - case 'menu': - case 'info': - showOsd(); - break; - case 'play': - play(); - break; - case 'pause': - pause(); - break; - case 'playpause': - playPause(); - break; - default: - break; - } - } - - /** - * Shows the slideshow component. - */ - self.show = function () { - createElements(options); - // Hides page scrollbar - document.body.classList.remove('force-scroll'); - document.body.classList.add('hide-scroll'); - }; - - /** - * Hides the slideshow element. - */ - self.hide = function () { - if (dialog) { + if (options.interactive && !layoutManager.tv) { + dialog.querySelector('.btnSlideshowExit').addEventListener('click', function (e) { dialogHelper.close(dialog); + }); + + const btnPause = dialog.querySelector('.btnSlideshowPause'); + if (btnPause) { + btnPause.addEventListener('click', playPause); } + + const btnDownload = dialog.querySelector('.btnDownload'); + if (btnDownload) { + btnDownload.addEventListener('click', download); + } + + const btnShare = dialog.querySelector('.btnShare'); + if (btnShare) { + btnShare.addEventListener('click', share); + } + } + + setUserScalable(true); + + dialogHelper.open(dialog).then(function () { + setUserScalable(false); + }); + + inputManager.on(window, onInputCommand); + /* eslint-disable-next-line compat/compat */ + document.addEventListener((window.PointerEvent ? 'pointermove' : 'mousemove'), onPointerMove); + + dialog.addEventListener('close', onDialogClosed); + + loadSwiper(dialog, options); + } + + /** + * Handles OSD changes when the autoplay is started. + */ + function onAutoplayStart() { + const btnSlideshowPause = dialog.querySelector('.btnSlideshowPause .material-icons'); + if (btnSlideshowPause) { + btnSlideshowPause.classList.replace('play_arrow', 'pause'); + } + } + + /** + * Handles OSD changes when the autoplay is stopped. + */ + function onAutoplayStop() { + const btnSlideshowPause = dialog.querySelector('.btnSlideshowPause .material-icons'); + if (btnSlideshowPause) { + btnSlideshowPause.classList.replace('pause', 'play_arrow'); + } + } + + /** + * Handles zoom changes. + */ + function onZoomChange(scale, imageEl, slideEl) { + const zoomImage = slideEl.querySelector('.swiper-zoom-fakeimg'); + + if (zoomImage) { + zoomImage.style.width = zoomImage.style.height = scale * 100 + '%'; + + if (scale > 1) { + if (zoomImage.classList.contains('swiper-zoom-fakeimg-hidden')) { + // Await for Swiper style changes + setTimeout(() => { + const callback = () => { + imageEl.removeEventListener(transitionEndEventName, callback); + zoomImage.classList.remove('swiper-zoom-fakeimg-hidden'); + }; + + // Swiper set 'transition-duration: 300ms' for auto zoom + // and 'transition-duration: 0s' for touch zoom + const transitionDuration = parseFloat(imageEl.style.transitionDuration.replace(/[a-z]/i, '')); + + if (transitionDuration > 0) { + imageEl.addEventListener(transitionEndEventName, callback); + } else { + callback(); + } + }, 0); + } + } else { + zoomImage.classList.add('swiper-zoom-fakeimg-hidden'); + } + } + } + + /** + * Initializes the Swiper instance and binds the relevant events. + * @param {HTMLElement} dialog - Element containing the dialog. + * @param {Object} options - Options used to initialize the Swiper instance. + */ + function loadSwiper(dialog, options) { + let slides; + if (currentOptions.slides) { + slides = currentOptions.slides; + } else { + slides = currentOptions.items; + } + + import('swiper').then(({default: Swiper}) => { + swiperInstance = new Swiper(dialog.querySelector('.slideshowSwiperContainer'), { + direction: 'horizontal', + // Loop is disabled due to the virtual slides option not supporting it. + loop: false, + zoom: { + minRatio: 1, + toggle: true + }, + autoplay: !options.interactive, + keyboard: { + enabled: true + }, + preloadImages: true, + slidesPerView: 1, + slidesPerColumn: 1, + initialSlide: options.startIndex || 0, + speed: 240, + navigation: { + nextEl: '.btnSlideshowNext', + prevEl: '.btnSlideshowPrevious' + }, + // Virtual slides reduce memory consumption for large libraries while allowing preloading of images; + virtual: { + slides: slides, + cache: true, + renderSlide: getSwiperSlideHtml, + addSlidesBefore: 1, + addSlidesAfter: 1 + } + }); + + swiperInstance.on('autoplayStart', onAutoplayStart); + swiperInstance.on('autoplayStop', onAutoplayStop); + + if (useFakeZoomImage) { + swiperInstance.on('zoomChange', onZoomChange); + } + }); + } + + /** + * Renders the HTML markup of a slide for an item or a slide. + * @param {Object} item - The item used to render the slide. + * @param {number} index - The index of the item in the Swiper instance. + * @returns {string} The HTML markup of the slide. + */ + function getSwiperSlideHtml(item, index) { + if (currentOptions.slides) { + return getSwiperSlideHtmlFromSlide(item); + } else { + return getSwiperSlideHtmlFromItem(item); + } + } + + /** + * Renders the HTML markup of a slide for an item. + * @param {Object} item - Item used to generate the slide. + * @returns {string} The HTML markup of the slide. + */ + function getSwiperSlideHtmlFromItem(item) { + return getSwiperSlideHtmlFromSlide({ + originalImage: getImgUrl(item, currentOptions.user), + Id: item.Id, + ServerId: item.ServerId + }); + } + + /** + * Renders the HTML markup of a slide for a slide object. + * @param {Object} item - Slide object used to generate the slide. + * @returns {string} The HTML markup of the slide. + */ + function getSwiperSlideHtmlFromSlide(item) { + let html = ''; + html += '
'; + html += '
'; + if (useFakeZoomImage) { + html += `
`; + } + html += ''; + html += '
'; + if (item.title || item.subtitle) { + html += '
'; + html += '
'; + if (item.title) { + html += '

'; + html += item.title; + html += '

'; + } + if (item.description) { + html += '
'; + html += item.description; + html += '
'; + } + html += '
'; + html += '
'; + } + html += '
'; + + return html; + } + + /** + * Fetches the information of the currently displayed slide. + * @returns {null|{itemId: string, shareUrl: string, serverId: string, url: string}} Object containing the information of the currently displayed slide. + */ + function getCurrentImageInfo() { + if (swiperInstance) { + const slide = document.querySelector('.swiper-slide-active'); + + if (slide) { + return { + url: slide.getAttribute('data-original'), + shareUrl: slide.getAttribute('data-original'), + itemId: slide.getAttribute('data-itemid'), + serverId: slide.getAttribute('data-serverid') + }; + } + return null; + } else { + return null; + } + } + + /** + * Starts a download for the currently displayed slide. + */ + function download() { + const imageInfo = getCurrentImageInfo(); + + import('fileDownloader').then(({default: fileDownloader}) => { + fileDownloader.download([imageInfo]); + }); + } + + /** + * Shares the currently displayed slide using the browser's built-in sharing feature. + */ + function share() { + const imageInfo = getCurrentImageInfo(); + + navigator.share({ + url: imageInfo.shareUrl + }); + } + + /** + * Starts the autoplay feature of the Swiper instance. + */ + function play() { + if (swiperInstance.autoplay) { + swiperInstance.autoplay.start(); + } + } + + /** + * Pauses the autoplay feature of the Swiper instance; + */ + function pause() { + if (swiperInstance.autoplay) { + swiperInstance.autoplay.stop(); + } + } + + /** + * Toggles the autoplay feature of the Swiper instance. + */ + function playPause() { + const paused = !dialog.querySelector('.btnSlideshowPause .material-icons').classList.contains('pause'); + if (paused) { + play(); + } else { + pause(); + } + } + + /** + * Closes the dialog and destroys the Swiper instance. + */ + function onDialogClosed() { + const swiper = swiperInstance; + if (swiper) { + swiper.destroy(true, true); + swiperInstance = null; + } + + inputManager.off(window, onInputCommand); + /* eslint-disable-next-line compat/compat */ + document.removeEventListener((window.PointerEvent ? 'pointermove' : 'mousemove'), onPointerMove); + // Shows page scrollbar + document.body.classList.remove('hide-scroll'); + document.body.classList.add('force-scroll'); + } + + /** + * Shows the OSD. + */ + function showOsd() { + const bottom = dialog.querySelector('.slideshowBottomBar'); + if (bottom) { + slideUpToShow(bottom); + startHideTimer(); + } + } + + /** + * Hides the OSD. + */ + function hideOsd() { + const bottom = dialog.querySelector('.slideshowBottomBar'); + if (bottom) { + slideDownToHide(bottom); + } + } + + /** + * Starts the timer used to automatically hide the OSD. + */ + function startHideTimer() { + stopHideTimer(); + hideTimeout = setTimeout(hideOsd, 3000); + } + + /** + * Stops the timer used to automatically hide the OSD. + */ + function stopHideTimer() { + if (hideTimeout) { + clearTimeout(hideTimeout); + hideTimeout = null; + } + } + + /** + * Shows the OSD by sliding it into view. + * @param {HTMLElement} element - Element containing the OSD. + */ + function slideUpToShow(element) { + if (!element.classList.contains('hide')) { + return; + } + + element.classList.remove('hide'); + + const onFinish = function () { + focusManager.focus(element.querySelector('.btnSlideshowPause')); }; + + if (!element.animate) { + onFinish(); + return; + } + + requestAnimationFrame(function () { + const keyframes = [ + { transform: 'translate3d(0,' + element.offsetHeight + 'px,0)', opacity: '.3', offset: 0 }, + { transform: 'translate3d(0,0,0)', opacity: '1', offset: 1 } + ]; + const timing = { duration: 300, iterations: 1, easing: 'ease-out' }; + element.animate(keyframes, timing).onfinish = onFinish; + }); + } + + /** + * Hides the OSD by sliding it out of view. + * @param {HTMLElement} element - Element containing the OSD. + */ + function slideDownToHide(element) { + if (element.classList.contains('hide')) { + return; + } + + const onFinish = function () { + element.classList.add('hide'); + }; + + if (!element.animate) { + onFinish(); + return; + } + + requestAnimationFrame(function () { + const keyframes = [ + { transform: 'translate3d(0,0,0)', opacity: '1', offset: 0 }, + { transform: 'translate3d(0,' + element.offsetHeight + 'px,0)', opacity: '.3', offset: 1 } + ]; + const timing = { duration: 300, iterations: 1, easing: 'ease-out' }; + element.animate(keyframes, timing).onfinish = onFinish; + }); + } + + /** + * Shows the OSD when moving the mouse pointer or touching the screen. + * @param {Event} event - Pointer movement event. + */ + function onPointerMove(event) { + const pointerType = event.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'); + + if (pointerType === 'mouse') { + const eventX = event.screenX || 0; + const eventY = event.screenY || 0; + + const obj = lastMouseMoveData; + if (!obj) { + lastMouseMoveData = { + x: eventX, + y: eventY + }; + return; + } + + // if coord are same, it didn't move + if (Math.abs(eventX - obj.x) < 10 && Math.abs(eventY - obj.y) < 10) { + return; + } + + obj.x = eventX; + obj.y = eventY; + + showOsd(); + } + } + + /** + * Dispatches keyboard inputs to their proper handlers. + * @param {Event} event - Keyboard input event. + */ + function onInputCommand(event) { + switch (event.detail.command) { + case 'up': + case 'down': + case 'select': + case 'menu': + case 'info': + showOsd(); + break; + case 'play': + play(); + break; + case 'pause': + pause(); + break; + case 'playpause': + playPause(); + break; + default: + break; + } + } + + /** + * Shows the slideshow component. + */ + self.show = function () { + createElements(options); + // Hides page scrollbar + document.body.classList.remove('force-scroll'); + document.body.classList.add('hide-scroll'); }; -}); + + /** + * Hides the slideshow element. + */ + self.hide = function () { + if (dialog) { + dialogHelper.close(dialog); + } + }; +} diff --git a/src/components/sortmenu/sortmenu.js b/src/components/sortmenu/sortmenu.js index f62e5bb3a4..d38d98c090 100644 --- a/src/components/sortmenu/sortmenu.js +++ b/src/components/sortmenu/sortmenu.js @@ -1,46 +1,51 @@ -define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'globalize', 'userSettings', 'emby-select', 'paper-icon-button-light', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dom, focusManager, dialogHelper, loading, layoutManager, connectionManager, globalize, userSettings) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import layoutManager from 'layoutManager'; +import globalize from 'globalize'; +import * as userSettings from 'userSettings'; +import 'emby-select'; +import 'paper-icon-button-light'; +import 'material-icons'; +import 'css!./../formdialog'; +import 'emby-button'; +import 'flexStyles'; - function onSubmit(e) { - e.preventDefault(); - return false; - } +function onSubmit(e) { + e.preventDefault(); + return false; +} - function initEditor(context, settings) { - context.querySelector('form').addEventListener('submit', onSubmit); +function initEditor(context, settings) { + context.querySelector('form').addEventListener('submit', onSubmit); - context.querySelector('.selectSortOrder').value = settings.sortOrder; - context.querySelector('.selectSortBy').value = settings.sortBy; - } + context.querySelector('.selectSortOrder').value = settings.sortOrder; + context.querySelector('.selectSortBy').value = settings.sortBy; +} - function centerFocus(elem, horiz, on) { - require(['scrollHelper'], function (scrollHelper) { - var fn = on ? 'on' : 'off'; - scrollHelper.centerFocus[fn](elem, horiz); - }); - } +function centerFocus(elem, horiz, on) { + import('scrollHelper').then(({default: scrollHelper}) => { + const fn = on ? 'on' : 'off'; + scrollHelper.centerFocus[fn](elem, horiz); + }); +} - function fillSortBy(context, options) { - var selectSortBy = context.querySelector('.selectSortBy'); +function fillSortBy(context, options) { + const selectSortBy = context.querySelector('.selectSortBy'); - selectSortBy.innerHTML = options.map(function (o) { - return ''; - }).join(''); - } + selectSortBy.innerHTML = options.map(function (o) { + return ''; + }).join(''); +} - function saveValues(context, settings, settingsKey) { - userSettings.setFilter(settingsKey + '-sortorder', context.querySelector('.selectSortOrder').value); - userSettings.setFilter(settingsKey + '-sortby', context.querySelector('.selectSortBy').value); - } +function saveValues(context, settingsKey) { + userSettings.setFilter(settingsKey + '-sortorder', context.querySelector('.selectSortOrder').value); + userSettings.setFilter(settingsKey + '-sortby', context.querySelector('.selectSortBy').value); +} - function SortMenu() { - - } - - SortMenu.prototype.show = function (options) { +class SortMenu { + show(options) { return new Promise(function (resolve, reject) { - require(['text!./sortmenu.template.html'], function (template) { - var dialogOptions = { + import('text!./sortmenu.template.html').then(({default: template}) => { + const dialogOptions = { removeOnClose: true, scrollY: false }; @@ -51,11 +56,11 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutMana dialogOptions.size = 'small'; } - var dlg = dialogHelper.createDialog(dialogOptions); + const dlg = dialogHelper.createDialog(dialogOptions); dlg.classList.add('formDialog'); - var html = ''; + let html = ''; html += '
'; html += ''; @@ -78,7 +83,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutMana centerFocus(dlg.querySelector('.formDialogContent'), false, true); } - var submitted; + let submitted; dlg.querySelector('form').addEventListener('change', function () { submitted = true; @@ -90,7 +95,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutMana } if (submitted) { - saveValues(dlg, options.settings, options.settingsKey); + saveValues(dlg, options.settingsKey); resolve(); return; } @@ -99,7 +104,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutMana }); }); }); - }; + } +} - return SortMenu; -}); +export default SortMenu; diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 37f767524e..dfd7f9446c 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -1,424 +1,437 @@ -define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', 'connectionManager', 'loading', 'focusManager', 'dom', 'apphost', 'emby-select', 'listViewStyle', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'css!./subtitleeditor', 'emby-button', 'flexStyles'], function (dialogHelper, require, layoutManager, globalize, userSettings, connectionManager, loading, focusManager, dom, appHost) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import layoutManager from 'layoutManager'; +import globalize from 'globalize'; +import * as userSettings from 'userSettings'; +import connectionManager from 'connectionManager'; +import loading from 'loading'; +import focusManager from 'focusManager'; +import dom from 'dom'; +import 'emby-select'; +import 'listViewStyle'; +import 'paper-icon-button-light'; +import 'css!./../formdialog'; +import 'material-icons'; +import 'css!./subtitleeditor'; +import 'emby-button'; +import 'flexStyles'; - var currentItem; - var hasChanges; +let currentItem; +let hasChanges; - function downloadRemoteSubtitles(context, id) { - var url = 'Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + id; +function downloadRemoteSubtitles(context, id) { + let url = 'Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + id; - var apiClient = connectionManager.getApiClient(currentItem.ServerId); - apiClient.ajax({ + let apiClient = connectionManager.getApiClient(currentItem.ServerId); + apiClient.ajax({ - type: 'POST', - url: apiClient.getUrl(url) + type: 'POST', + url: apiClient.getUrl(url) + + }).then(function () { + hasChanges = true; + + import('toast').then(({default: toast}) => { + toast(globalize.translate('MessageDownloadQueued')); + }); + + focusManager.autoFocus(context); + }); +} + +function deleteLocalSubtitle(context, index) { + let msg = globalize.translate('MessageAreYouSureDeleteSubtitles'); + + import('confirm').then(({default: confirm}) => { + confirm({ + + title: globalize.translate('ConfirmDeletion'), + text: msg, + confirmText: globalize.translate('Delete'), + primary: 'delete' }).then(function () { - hasChanges = true; + loading.show(); - require(['toast'], function (toast) { - toast(globalize.translate('MessageDownloadQueued')); - }); + let itemId = currentItem.Id; + let url = 'Videos/' + itemId + '/Subtitles/' + index; - focusManager.autoFocus(context); - }); - } + let apiClient = connectionManager.getApiClient(currentItem.ServerId); - function deleteLocalSubtitle(context, index) { - var msg = globalize.translate('MessageAreYouSureDeleteSubtitles'); + apiClient.ajax({ - require(['confirm'], function (confirm) { - confirm.default({ - - title: globalize.translate('ConfirmDeletion'), - text: msg, - confirmText: globalize.translate('Delete'), - primary: 'delete' + type: 'DELETE', + url: apiClient.getUrl(url) }).then(function () { - loading.show(); - - var itemId = currentItem.Id; - var url = 'Videos/' + itemId + '/Subtitles/' + index; - - var apiClient = connectionManager.getApiClient(currentItem.ServerId); - - apiClient.ajax({ - - type: 'DELETE', - url: apiClient.getUrl(url) - - }).then(function () { - hasChanges = true; - reload(context, apiClient, itemId); - }); + hasChanges = true; + reload(context, apiClient, itemId); }); }); - } + }); +} - function fillSubtitleList(context, item) { - var streams = item.MediaStreams || []; +function fillSubtitleList(context, item) { + let streams = item.MediaStreams || []; - var subs = streams.filter(function (s) { - return s.Type === 'Subtitle'; - }); + let subs = streams.filter(function (s) { + return s.Type === 'Subtitle'; + }); - var html = ''; + let html = ''; - if (subs.length) { - html += '

' + globalize.translate('MySubtitles') + '

'; + if (subs.length) { + html += '

' + globalize.translate('MySubtitles') + '

'; - html += '
'; + html += '
'; - html += subs.map(function (s) { - var itemHtml = ''; + html += subs.map(function (s) { + let itemHtml = ''; - var tagName = layoutManager.tv ? 'button' : 'div'; - var className = layoutManager.tv && s.Path ? 'listItem listItem-border btnDelete' : 'listItem listItem-border'; + let tagName = layoutManager.tv ? 'button' : 'div'; + let className = layoutManager.tv && s.Path ? 'listItem listItem-border btnDelete' : 'listItem listItem-border'; - if (layoutManager.tv) { - className += ' listItem-focusscale listItem-button'; - } - - className += ' listItem-noborder'; - - itemHtml += '<' + tagName + ' class="' + className + '" data-index="' + s.Index + '">'; - - itemHtml += ''; - - itemHtml += '
'; - - itemHtml += '
'; - itemHtml += s.DisplayTitle || ''; - itemHtml += '
'; - - if (s.Path) { - itemHtml += '
' + (s.Path) + '
'; - } - - itemHtml += ''; - itemHtml += '
'; - - if (!layoutManager.tv) { - if (s.Path) { - itemHtml += ''; - } - } - - itemHtml += ''; - - return itemHtml; - }).join(''); - - html += '
'; - } - - var elem = context.querySelector('.subtitleList'); - - if (subs.length) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - elem.innerHTML = html; - } - - function fillLanguages(context, apiClient, languages) { - var selectLanguage = context.querySelector('#selectLanguage'); - - selectLanguage.innerHTML = languages.map(function (l) { - return ''; - }); - - var lastLanguage = userSettings.get('subtitleeditor-language'); - if (lastLanguage) { - selectLanguage.value = lastLanguage; - } else { - apiClient.getCurrentUser().then(function (user) { - var lang = user.Configuration.SubtitleLanguagePreference; - - if (lang) { - selectLanguage.value = lang; - } - }); - } - } - - function renderSearchResults(context, results) { - var lastProvider = ''; - var html = ''; - - if (!results.length) { - context.querySelector('.noSearchResults').classList.remove('hide'); - context.querySelector('.subtitleResults').innerHTML = ''; - loading.hide(); - return; - } - - context.querySelector('.noSearchResults').classList.add('hide'); - - for (var i = 0, length = results.length; i < length; i++) { - var result = results[i]; - - var provider = result.ProviderName; - - if (provider !== lastProvider) { - if (i > 0) { - html += '
'; - } - html += '

' + provider + '

'; - html += '
'; - lastProvider = provider; - } - - var tagName = layoutManager.tv ? 'button' : 'div'; - var className = layoutManager.tv ? 'listItem listItem-border btnOptions' : 'listItem listItem-border'; if (layoutManager.tv) { className += ' listItem-focusscale listItem-button'; } - html += '<' + tagName + ' class="' + className + '" data-subid="' + result.Id + '">'; + className += ' listItem-noborder'; - html += ''; + itemHtml += '<' + tagName + ' class="' + className + '" data-index="' + s.Index + '">'; - var bodyClass = result.Comment || result.IsHashMatch ? 'three-line' : 'two-line'; + itemHtml += ''; - html += '
'; + itemHtml += '
'; - html += '
' + (result.Name) + '
'; - html += '
'; + itemHtml += '
'; + itemHtml += s.DisplayTitle || ''; + itemHtml += '
'; - if (result.Format) { - html += '' + globalize.translate('FormatValue', result.Format) + ''; + if (s.Path) { + itemHtml += '
' + (s.Path) + '
'; } - if (result.DownloadCount != null) { - html += '' + globalize.translate('DownloadsValue', result.DownloadCount) + ''; - } - html += '
'; - - if (result.Comment) { - html += '
' + (result.Comment) + '
'; - } - - if (result.IsHashMatch) { - html += '
' + globalize.translate('PerfectMatch') + '
'; - } - - html += '
'; + itemHtml += ''; + itemHtml += '
'; if (!layoutManager.tv) { - html += ''; + if (s.Path) { + itemHtml += ''; + } } - html += ''; + itemHtml += ''; + + return itemHtml; + }).join(''); + + html += '
'; + } + + let elem = context.querySelector('.subtitleList'); + + if (subs.length) { + elem.classList.remove('hide'); + } else { + elem.classList.add('hide'); + } + elem.innerHTML = html; +} + +function fillLanguages(context, apiClient, languages) { + let selectLanguage = context.querySelector('#selectLanguage'); + + selectLanguage.innerHTML = languages.map(function (l) { + return ''; + }); + + let lastLanguage = userSettings.get('subtitleeditor-language'); + if (lastLanguage) { + selectLanguage.value = lastLanguage; + } else { + apiClient.getCurrentUser().then(function (user) { + let lang = user.Configuration.SubtitleLanguagePreference; + + if (lang) { + selectLanguage.value = lang; + } + }); + } +} + +function renderSearchResults(context, results) { + let lastProvider = ''; + let html = ''; + + if (!results.length) { + context.querySelector('.noSearchResults').classList.remove('hide'); + context.querySelector('.subtitleResults').innerHTML = ''; + loading.hide(); + return; + } + + context.querySelector('.noSearchResults').classList.add('hide'); + + for (let i = 0, length = results.length; i < length; i++) { + let result = results[i]; + + let provider = result.ProviderName; + + if (provider !== lastProvider) { + if (i > 0) { + html += '
'; + } + html += '

' + provider + '

'; + html += '
'; + lastProvider = provider; } - if (results.length) { - html += '
'; + let tagName = layoutManager.tv ? 'button' : 'div'; + let className = layoutManager.tv ? 'listItem listItem-border btnOptions' : 'listItem listItem-border'; + if (layoutManager.tv) { + className += ' listItem-focusscale listItem-button'; } - var elem = context.querySelector('.subtitleResults'); - elem.innerHTML = html; + html += '<' + tagName + ' class="' + className + '" data-subid="' + result.Id + '">'; + + html += ''; + + let bodyClass = result.Comment || result.IsHashMatch ? 'three-line' : 'two-line'; + + html += '
'; + + html += '
' + (result.Name) + '
'; + html += '
'; + + if (result.Format) { + html += '' + globalize.translate('FormatValue', result.Format) + ''; + } + + if (result.DownloadCount != null) { + html += '' + globalize.translate('DownloadsValue', result.DownloadCount) + ''; + } + html += '
'; + + if (result.Comment) { + html += '
' + (result.Comment) + '
'; + } + + if (result.IsHashMatch) { + html += '
' + globalize.translate('PerfectMatch') + '
'; + } + + html += '
'; + + if (!layoutManager.tv) { + html += ''; + } + + html += ''; + } + + if (results.length) { + html += '
'; + } + + let elem = context.querySelector('.subtitleResults'); + elem.innerHTML = html; + + loading.hide(); +} + +function searchForSubtitles(context, language) { + userSettings.set('subtitleeditor-language', language); + + loading.show(); + + let apiClient = connectionManager.getApiClient(currentItem.ServerId); + let url = apiClient.getUrl('Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + language); + + apiClient.getJSON(url).then(function (results) { + renderSearchResults(context, results); + }); +} + +function reload(context, apiClient, itemId) { + context.querySelector('.noSearchResults').classList.add('hide'); + + function onGetItem(item) { + currentItem = item; + + fillSubtitleList(context, item); + let file = item.Path || ''; + let index = Math.max(file.lastIndexOf('/'), file.lastIndexOf('\\')); + if (index > -1) { + file = file.substring(index + 1); + } + + if (file) { + context.querySelector('.pathValue').innerHTML = file; + context.querySelector('.originalFile').classList.remove('hide'); + } else { + context.querySelector('.pathValue').innerHTML = ''; + context.querySelector('.originalFile').classList.add('hide'); + } loading.hide(); } - function searchForSubtitles(context, language) { - userSettings.set('subtitleeditor-language', language); + if (typeof itemId === 'string') { + apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(onGetItem); + } else { + onGetItem(itemId); + } +} - loading.show(); +function onSearchSubmit(e) { + let form = this; - var apiClient = connectionManager.getApiClient(currentItem.ServerId); - var url = apiClient.getUrl('Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + language); + let lang = form.querySelector('#selectLanguage', form).value; - apiClient.getJSON(url).then(function (results) { - renderSearchResults(context, results); - }); + searchForSubtitles(dom.parentWithClass(form, 'formDialogContent'), lang); + + e.preventDefault(); + return false; +} + +function onSubtitleListClick(e) { + let btnDelete = dom.parentWithClass(e.target, 'btnDelete'); + if (btnDelete) { + let index = btnDelete.getAttribute('data-index'); + let context = dom.parentWithClass(btnDelete, 'subtitleEditorDialog'); + deleteLocalSubtitle(context, index); + } +} + +function onSubtitleResultsClick(e) { + let subtitleId; + let context; + + let btnOptions = dom.parentWithClass(e.target, 'btnOptions'); + if (btnOptions) { + subtitleId = btnOptions.getAttribute('data-subid'); + context = dom.parentWithClass(btnOptions, 'subtitleEditorDialog'); + showDownloadOptions(btnOptions, context, subtitleId); } - function reload(context, apiClient, itemId) { - context.querySelector('.noSearchResults').classList.add('hide'); + let btnDownload = dom.parentWithClass(e.target, 'btnDownload'); + if (btnDownload) { + subtitleId = btnDownload.getAttribute('data-subid'); + context = dom.parentWithClass(btnDownload, 'subtitleEditorDialog'); + downloadRemoteSubtitles(context, subtitleId); + } +} - function onGetItem(item) { - currentItem = item; +function showDownloadOptions(button, context, subtitleId) { + let items = []; - fillSubtitleList(context, item); - var file = item.Path || ''; - var index = Math.max(file.lastIndexOf('/'), file.lastIndexOf('\\')); - if (index > -1) { - file = file.substring(index + 1); + items.push({ + name: globalize.translate('Download'), + id: 'download' + }); + + import('actionsheet').then(({default: actionsheet}) => { + actionsheet.show({ + items: items, + positionTo: button + + }).then(function (id) { + switch (id) { + case 'download': + downloadRemoteSubtitles(context, subtitleId); + break; + default: + break; } + }); + }); +} - if (file) { - context.querySelector('.pathValue').innerHTML = file; - context.querySelector('.originalFile').classList.remove('hide'); - } else { - context.querySelector('.pathValue').innerHTML = ''; - context.querySelector('.originalFile').classList.add('hide'); - } +function centerFocus(elem, horiz, on) { + import('scrollHelper').then(({default: scrollHelper}) => { + let fn = on ? 'on' : 'off'; + scrollHelper.centerFocus[fn](elem, horiz); + }); +} - loading.hide(); - } +function showEditorInternal(itemId, serverId, template) { + hasChanges = false; - if (typeof itemId === 'string') { - apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(onGetItem); + let apiClient = connectionManager.getApiClient(serverId); + return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { + let dialogOptions = { + removeOnClose: true, + scrollY: false + }; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; } else { - onGetItem(itemId); - } - } - - function onSearchSubmit(e) { - var form = this; - - var lang = form.querySelector('#selectLanguage', form).value; - - searchForSubtitles(dom.parentWithClass(form, 'formDialogContent'), lang); - - e.preventDefault(); - return false; - } - - function onSubtitleListClick(e) { - var btnDelete = dom.parentWithClass(e.target, 'btnDelete'); - if (btnDelete) { - var index = btnDelete.getAttribute('data-index'); - var context = dom.parentWithClass(btnDelete, 'subtitleEditorDialog'); - deleteLocalSubtitle(context, index); - } - } - - function onSubtitleResultsClick(e) { - var subtitleId; - var context; - - var btnOptions = dom.parentWithClass(e.target, 'btnOptions'); - if (btnOptions) { - subtitleId = btnOptions.getAttribute('data-subid'); - context = dom.parentWithClass(btnOptions, 'subtitleEditorDialog'); - showDownloadOptions(btnOptions, context, subtitleId); + dialogOptions.size = 'small'; } - var btnDownload = dom.parentWithClass(e.target, 'btnDownload'); - if (btnDownload) { - subtitleId = btnDownload.getAttribute('data-subid'); - context = dom.parentWithClass(btnDownload, 'subtitleEditorDialog'); - downloadRemoteSubtitles(context, subtitleId); + let dlg = dialogHelper.createDialog(dialogOptions); + + dlg.classList.add('formDialog'); + dlg.classList.add('subtitleEditorDialog'); + + dlg.innerHTML = globalize.translateHtml(template, 'core'); + + dlg.querySelector('.originalSubtitleFileLabel').innerHTML = globalize.translate('File'); + + dlg.querySelector('.subtitleSearchForm').addEventListener('submit', onSearchSubmit); + + let btnSubmit = dlg.querySelector('.btnSubmit'); + + if (layoutManager.tv) { + centerFocus(dlg.querySelector('.formDialogContent'), false, true); + dlg.querySelector('.btnSearchSubtitles').classList.add('hide'); + } else { + btnSubmit.classList.add('hide'); } - } - function showDownloadOptions(button, context, subtitleId) { - var items = []; + let editorContent = dlg.querySelector('.formDialogContent'); - items.push({ - name: globalize.translate('Download'), - id: 'download' + dlg.querySelector('.subtitleList').addEventListener('click', onSubtitleListClick); + dlg.querySelector('.subtitleResults').addEventListener('click', onSubtitleResultsClick); + + apiClient.getCultures().then(function (languages) { + fillLanguages(editorContent, apiClient, languages); }); - require(['actionsheet'], function (actionsheet) { - actionsheet.show({ - items: items, - positionTo: button - - }).then(function (id) { - switch (id) { - case 'download': - downloadRemoteSubtitles(context, subtitleId); - break; - default: - break; - } - }); + dlg.querySelector('.btnCancel').addEventListener('click', function () { + dialogHelper.close(dlg); }); - } - - function centerFocus(elem, horiz, on) { - require(['scrollHelper'], function (scrollHelper) { - var fn = on ? 'on' : 'off'; - scrollHelper.centerFocus[fn](elem, horiz); - }); - } - - function showEditorInternal(itemId, serverId, template) { - hasChanges = false; - - var apiClient = connectionManager.getApiClient(serverId); - return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { - var dialogOptions = { - removeOnClose: true, - scrollY: false - }; - - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; - } else { - dialogOptions.size = 'small'; - } - - var dlg = dialogHelper.createDialog(dialogOptions); - - dlg.classList.add('formDialog'); - dlg.classList.add('subtitleEditorDialog'); - - dlg.innerHTML = globalize.translateHtml(template, 'core'); - - dlg.querySelector('.originalSubtitleFileLabel').innerHTML = globalize.translate('File'); - - dlg.querySelector('.subtitleSearchForm').addEventListener('submit', onSearchSubmit); - - var btnSubmit = dlg.querySelector('.btnSubmit'); - - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, true); - dlg.querySelector('.btnSearchSubtitles').classList.add('hide'); - } else { - btnSubmit.classList.add('hide'); - } - - var editorContent = dlg.querySelector('.formDialogContent'); - - dlg.querySelector('.subtitleList').addEventListener('click', onSubtitleListClick); - dlg.querySelector('.subtitleResults').addEventListener('click', onSubtitleResultsClick); - - apiClient.getCultures().then(function (languages) { - fillLanguages(editorContent, apiClient, languages); - }); - - dlg.querySelector('.btnCancel').addEventListener('click', function () { - dialogHelper.close(dlg); - }); - - return new Promise(function (resolve, reject) { - dlg.addEventListener('close', function () { - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.formDialogContent'), false, false); - } - - if (hasChanges) { - resolve(); - } else { - reject(); - } - }); - - dialogHelper.open(dlg); - - reload(editorContent, apiClient, item); - }); - }); - } - - function showEditor(itemId, serverId) { - loading.show(); return new Promise(function (resolve, reject) { - require(['text!./subtitleeditor.template.html'], function (template) { - showEditorInternal(itemId, serverId, template).then(resolve, reject); - }); - }); - } + dlg.addEventListener('close', function () { + if (layoutManager.tv) { + centerFocus(dlg.querySelector('.formDialogContent'), false, false); + } - return { - show: showEditor - }; -}); + if (hasChanges) { + resolve(); + } else { + reject(); + } + }); + + dialogHelper.open(dlg); + + reload(editorContent, apiClient, item); + }); + }); +} + +function showEditor(itemId, serverId) { + loading.show(); + + return new Promise(function (resolve, reject) { + import('text!./subtitleeditor.template.html').then(({default: template}) => { + showEditorInternal(itemId, serverId, template).then(resolve, reject); + }); + }); +} + +export default { + show: showEditor +}; diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index 7e3e2de7ac..1834cafa17 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -3,52 +3,29 @@ * @module components/subtitleSettings/subtitleAppearanceHelper */ -function getTextStyles(settings, isCue) { - let list = []; +function getTextStyles(settings, preview) { + const list = []; - if (isCue) { - switch (settings.textSize || '') { - case 'smaller': - list.push({ name: 'font-size', value: '.5em' }); - break; - case 'small': - list.push({ name: 'font-size', value: '.7em' }); - break; - case 'large': - list.push({ name: 'font-size', value: '1.3em' }); - break; - case 'larger': - list.push({ name: 'font-size', value: '1.72em' }); - break; - case 'extralarge': - list.push({ name: 'font-size', value: '2em' }); - break; - default: - case 'medium': - break; - } - } else { - switch (settings.textSize || '') { - case 'smaller': - list.push({ name: 'font-size', value: '.8em' }); - break; - case 'small': - list.push({ name: 'font-size', value: 'inherit' }); - break; - case 'larger': - list.push({ name: 'font-size', value: '2em' }); - break; - case 'extralarge': - list.push({ name: 'font-size', value: '2.2em' }); - break; - case 'large': - list.push({ name: 'font-size', value: '1.72em' }); - break; - default: - case 'medium': - list.push({ name: 'font-size', value: '1.36em' }); - break; - } + switch (settings.textSize || '') { + case 'smaller': + list.push({ name: 'font-size', value: '.8em' }); + break; + case 'small': + list.push({ name: 'font-size', value: 'inherit' }); + break; + case 'larger': + list.push({ name: 'font-size', value: '2em' }); + break; + case 'extralarge': + list.push({ name: 'font-size', value: '2.2em' }); + break; + case 'large': + list.push({ name: 'font-size', value: '1.72em' }); + break; + default: + case 'medium': + list.push({ name: 'font-size', value: '1.36em' }); + break; } switch (settings.dropShadow || '') { @@ -111,26 +88,56 @@ function getTextStyles(settings, isCue) { break; } + if (!preview) { + const pos = parseInt(settings.verticalPosition, 10); + const lineHeight = 1.35; // FIXME: It is better to read this value from element + const line = Math.abs(pos * lineHeight); + if (pos < 0) { + list.push({ name: 'min-height', value: `${line}em` }); + list.push({ name: 'margin-top', value: '' }); + } else { + list.push({ name: 'min-height', value: '' }); + list.push({ name: 'margin-top', value: `${line}em` }); + } + } + return list; } -export function getStyles(settings, isCue) { +function getWindowStyles(settings, preview) { + const list = []; + + if (!preview) { + const pos = parseInt(settings.verticalPosition, 10); + if (pos < 0) { + list.push({ name: 'top', value: '' }); + list.push({ name: 'bottom', value: '0' }); + } else { + list.push({ name: 'top', value: '0' }); + list.push({ name: 'bottom', value: '' }); + } + } + + return list; +} + +export function getStyles(settings, preview) { return { - text: getTextStyles(settings, isCue), - window: [] + text: getTextStyles(settings, preview), + window: getWindowStyles(settings, preview) }; } function applyStyleList(styles, elem) { for (let i = 0, length = styles.length; i < length; i++) { - let style = styles[i]; + const style = styles[i]; elem.style[style.name] = style.value; } } export function applyStyles(elements, appearanceSettings) { - let styles = getStyles(appearanceSettings); + const styles = getStyles(appearanceSettings, !!elements.preview); if (elements.text) { applyStyleList(styles.text, elements.text); diff --git a/src/components/subtitlesettings/subtitlesettings.css b/src/components/subtitlesettings/subtitlesettings.css new file mode 100644 index 0000000000..204757f10f --- /dev/null +++ b/src/components/subtitlesettings/subtitlesettings.css @@ -0,0 +1,26 @@ +.subtitleappearance-fullpreview { + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1000; + pointer-events: none; + transition: 0.2s; +} + +.subtitleappearance-fullpreview-hide { + opacity: 0; +} + +.subtitleappearance-fullpreview-window { + position: absolute; + width: 100%; + font-size: 170%; + text-align: center; +} + +.subtitleappearance-fullpreview-text { + display: inline-block; + max-width: 70%; +} diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 79fa289ab0..46760be4c8 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -2,6 +2,7 @@ import globalize from 'globalize'; import appHost from 'apphost'; import appSettings from 'appSettings'; import focusManager from 'focusManager'; +import layoutManager from 'layoutManager'; import loading from 'loading'; import connectionManager from 'connectionManager'; import subtitleAppearanceHelper from 'subtitleAppearanceHelper'; @@ -10,9 +11,11 @@ import dom from 'dom'; import events from 'events'; import 'listViewStyle'; import 'emby-select'; +import 'emby-slider'; import 'emby-input'; import 'emby-checkbox'; import 'flexStyles'; +import 'css!./subtitlesettings'; /** * Subtitle settings. @@ -20,13 +23,14 @@ import 'flexStyles'; */ function getSubtitleAppearanceObject(context) { - let appearanceSettings = {}; + const appearanceSettings = {}; appearanceSettings.textSize = context.querySelector('#selectTextSize').value; appearanceSettings.dropShadow = context.querySelector('#selectDropShadow').value; appearanceSettings.font = context.querySelector('#selectFont').value; appearanceSettings.textBackground = context.querySelector('#inputTextBackground').value; appearanceSettings.textColor = context.querySelector('#inputTextColor').value; + appearanceSettings.verticalPosition = context.querySelector('#sliderVerticalPosition').value; return appearanceSettings; } @@ -37,7 +41,7 @@ function loadForm(context, user, userSettings, appearanceSettings, apiClient) { context.querySelector('.fldBurnIn').classList.remove('hide'); } - let selectSubtitleLanguage = context.querySelector('#selectSubtitleLanguage'); + const selectSubtitleLanguage = context.querySelector('#selectSubtitleLanguage'); settingsHelper.populateLanguages(selectSubtitleLanguage, allCultures); @@ -51,6 +55,7 @@ function loadForm(context, user, userSettings, appearanceSettings, apiClient) { context.querySelector('#inputTextBackground').value = appearanceSettings.textBackground || 'transparent'; context.querySelector('#inputTextColor').value = appearanceSettings.textColor || '#ffffff'; context.querySelector('#selectFont').value = appearanceSettings.font || ''; + context.querySelector('#sliderVerticalPosition').value = appearanceSettings.verticalPosition; context.querySelector('#selectSubtitleBurnIn').value = appSettings.get('subtitleburnin') || ''; @@ -96,9 +101,9 @@ function save(instance, context, userId, userSettings, apiClient, enableSaveConf } function onSubtitleModeChange(e) { - let view = dom.parentWithClass(e.target, 'subtitlesettings'); + const view = dom.parentWithClass(e.target, 'subtitlesettings'); - let subtitlesHelp = view.querySelectorAll('.subtitlesHelp'); + const subtitlesHelp = view.querySelectorAll('.subtitlesHelp'); for (let i = 0, length = subtitlesHelp.length; i < length; i++) { subtitlesHelp[i].classList.add('hide'); } @@ -106,16 +111,51 @@ function onSubtitleModeChange(e) { } function onAppearanceFieldChange(e) { - let view = dom.parentWithClass(e.target, 'subtitlesettings'); + const view = dom.parentWithClass(e.target, 'subtitlesettings'); - let appearanceSettings = getSubtitleAppearanceObject(view); + const appearanceSettings = getSubtitleAppearanceObject(view); - let elements = { + const elements = { window: view.querySelector('.subtitleappearance-preview-window'), - text: view.querySelector('.subtitleappearance-preview-text') + text: view.querySelector('.subtitleappearance-preview-text'), + preview: true }; subtitleAppearanceHelper.applyStyles(elements, appearanceSettings); + + subtitleAppearanceHelper.applyStyles({ + window: view.querySelector('.subtitleappearance-fullpreview-window'), + text: view.querySelector('.subtitleappearance-fullpreview-text') + }, appearanceSettings); +} + +const subtitlePreviewDelay = 1000; +let subtitlePreviewTimer; + +function showSubtitlePreview(persistent) { + clearTimeout(subtitlePreviewTimer); + + this._fullPreview.classList.remove('subtitleappearance-fullpreview-hide'); + + if (persistent) { + this._refFullPreview++; + } + + if (this._refFullPreview === 0) { + subtitlePreviewTimer = setTimeout(hideSubtitlePreview.bind(this), subtitlePreviewDelay); + } +} + +function hideSubtitlePreview(persistent) { + clearTimeout(subtitlePreviewTimer); + + if (persistent) { + this._refFullPreview--; + } + + if (this._refFullPreview === 0) { + this._fullPreview.classList.add('subtitleappearance-fullpreview-hide'); + } } function embed(options, self) { @@ -138,6 +178,36 @@ function embed(options, self) { if (appHost.supports('subtitleappearancesettings')) { options.element.querySelector('.subtitleAppearanceSection').classList.remove('hide'); + + self._fullPreview = options.element.querySelector('.subtitleappearance-fullpreview'); + self._refFullPreview = 0; + + const sliderVerticalPosition = options.element.querySelector('#sliderVerticalPosition'); + sliderVerticalPosition.addEventListener('input', onAppearanceFieldChange); + sliderVerticalPosition.addEventListener('input', () => showSubtitlePreview.call(self)); + + const eventPrefix = window.PointerEvent ? 'pointer' : 'mouse'; + sliderVerticalPosition.addEventListener(`${eventPrefix}enter`, () => showSubtitlePreview.call(self, true)); + sliderVerticalPosition.addEventListener(`${eventPrefix}leave`, () => hideSubtitlePreview.call(self, true)); + + if (layoutManager.tv) { + sliderVerticalPosition.addEventListener('focus', () => showSubtitlePreview.call(self, true)); + sliderVerticalPosition.addEventListener('blur', () => hideSubtitlePreview.call(self, true)); + + // Give CustomElements time to attach + setTimeout(() => { + sliderVerticalPosition.classList.add('focusable'); + sliderVerticalPosition.enableKeyboardDragging(); + }, 0); + } + + options.element.querySelector('.chkPreview').addEventListener('change', (e) => { + if (e.target.checked) { + showSubtitlePreview.call(self, true); + } else { + hideSubtitlePreview.call(self, true); + } + }); } self.loadData(); @@ -156,20 +226,20 @@ export class SubtitleSettings { } loadData() { - let self = this; - let context = self.options.element; + const self = this; + const context = self.options.element; loading.show(); - let userId = self.options.userId; - let apiClient = connectionManager.getApiClient(self.options.serverId); - let userSettings = self.options.userSettings; + const userId = self.options.userId; + const apiClient = connectionManager.getApiClient(self.options.serverId); + const userSettings = self.options.userSettings; apiClient.getUser(userId).then(function (user) { userSettings.setUserInfo(userId, apiClient).then(function () { self.dataLoaded = true; - let appearanceSettings = userSettings.getSubtitleAppearanceSettings(self.options.appearanceKey); + const appearanceSettings = userSettings.getSubtitleAppearanceSettings(self.options.appearanceKey); loadForm(context, user, userSettings, appearanceSettings, apiClient); }); @@ -186,12 +256,12 @@ export class SubtitleSettings { onSubmit(e) { const self = this; - let apiClient = connectionManager.getApiClient(self.options.serverId); - let userId = self.options.userId; - let userSettings = self.options.userSettings; + const apiClient = connectionManager.getApiClient(self.options.serverId); + const userId = self.options.userId; + const userSettings = self.options.userSettings; userSettings.setUserInfo(userId, apiClient).then(function () { - let enableSaveConfirmation = self.options.enableSaveConfirmation; + const enableSaveConfirmation = self.options.enableSaveConfirmation; save(self, self.options.element, userId, userSettings, apiClient, enableSaveConfirmation); }); diff --git a/src/components/subtitlesettings/subtitlesettings.template.html b/src/components/subtitlesettings/subtitlesettings.template.html index 716296a257..2884b26efd 100644 --- a/src/components/subtitlesettings/subtitlesettings.template.html +++ b/src/components/subtitlesettings/subtitlesettings.template.html @@ -14,7 +14,7 @@ - +
${DefaultSubtitlesHelp}
${SmartSubtitlesHelp}
@@ -38,6 +38,16 @@ ${HeaderSubtitleAppearance} +
+
+
+ ${HeaderSubtitleAppearance} +
+ ${TheseSettingsAffectSubtitlesOnThisDevice} +
+
+
+
@@ -89,6 +99,20 @@
+ +
+
+ +
+
${SubtitleVerticalPositionHelp}
+
+ +
+ +
'; - } - - function getTunerName(providerId) { - switch (providerId = providerId.toLowerCase()) { - case 'm3u': - return 'M3U'; - - case 'hdhomerun': - return 'HDHomerun'; - - case 'hauppauge': - return 'Hauppauge'; - - case 'satip': - return 'DVB'; - - default: - return 'Unknown'; + if (enableFocusTransform) { + cssClass += ' show-animation'; } } - function renderDevices(view, devices) { - var i; - var length; - var html = ''; + html += ''; +} - for (i = 0, length = devices.length; i < length; i++) { - html += getDeviceHtml(devices[i]); - } +function getTunerName(providerId) { + switch (providerId = providerId.toLowerCase()) { + case 'm3u': + return 'M3U'; - if (devices.length) { - view.querySelector('.devicesHeader').classList.remove('hide'); - } else { - html = '


' + globalize.translate('NoNewDevicesFound') + '

'; - view.querySelector('.devicesHeader').classList.add('hide'); - } + case 'hdhomerun': + return 'HDHomerun'; - var elem = view.querySelector('.results'); - elem.innerHTML = html; + case 'hauppauge': + return 'Hauppauge'; - if (layoutManager.tv) { - focusManager.autoFocus(elem); - } + case 'satip': + return 'DVB'; + + default: + return 'Unknown'; + } +} + +function renderDevices(view, devices) { + let html = ''; + + for (let i = 0, length = devices.length; i < length; i++) { + html += getDeviceHtml(devices[i]); } - function discoverDevices(view, apiClient) { - loading.show(); - view.querySelector('.loadingContent').classList.remove('hide'); - return ApiClient.getJSON(ApiClient.getUrl('LiveTv/Tuners/Discvover', { - NewDevicesOnly: true - })).then(function (devices) { - currentDevices = devices; - renderDevices(view, devices); - view.querySelector('.loadingContent').classList.add('hide'); - loading.hide(); - }); + if (devices.length) { + view.querySelector('.devicesHeader').classList.remove('hide'); + } else { + html = '


' + globalize.translate('NoNewDevicesFound') + '

'; + view.querySelector('.devicesHeader').classList.add('hide'); } - function tunerPicker() { - this.show = function (options) { - var dialogOptions = { - removeOnClose: true, - scrollY: false - }; + const elem = view.querySelector('.results'); + elem.innerHTML = html; - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; - } else { - dialogOptions.size = 'small'; - } + if (layoutManager.tv) { + focusManager.autoFocus(elem); + } +} - var dlg = dialogHelper.createDialog(dialogOptions); - dlg.classList.add('formDialog'); - var html = ''; - html += '
'; - html += ''; - html += '

'; - html += globalize.translate('HeaderLiveTvTunerSetup'); - html += '

'; - html += '
'; - html += getEditorHtml(); - dlg.innerHTML = html; - dlg.querySelector('.btnCancel').addEventListener('click', function () { - dialogHelper.close(dlg); - }); - var deviceResult; - dlg.querySelector('.results').addEventListener('click', function (e) { - var tunerCard = dom.parentWithClass(e.target, 'card'); +function discoverDevices(view, apiClient) { + loading.show(); + view.querySelector('.loadingContent').classList.remove('hide'); + return ApiClient.getJSON(ApiClient.getUrl('LiveTv/Tuners/Discvover', { + NewDevicesOnly: true + })).then(function (devices) { + currentDevices = devices; + renderDevices(view, devices); + view.querySelector('.loadingContent').classList.add('hide'); + loading.hide(); + }); +} - if (tunerCard) { - var deviceId = tunerCard.getAttribute('data-id'); - deviceResult = currentDevices.filter(function (d) { - return d.DeviceId === deviceId; - })[0]; - dialogHelper.close(dlg); - } - }); - - if (layoutManager.tv) { - scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); - } - - var apiClient = connectionManager.getApiClient(options.serverId); - discoverDevices(dlg, apiClient); - - if (layoutManager.tv) { - scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); - } - - return dialogHelper.open(dlg).then(function () { - if (deviceResult) { - return Promise.resolve(deviceResult); - } - - return Promise.reject(); - }); +function tunerPicker() { + this.show = function (options) { + const dialogOptions = { + removeOnClose: true, + scrollY: false }; - } - var currentDevices = []; - return tunerPicker; -}); + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + } else { + dialogOptions.size = 'small'; + } + + const dlg = dialogHelper.createDialog(dialogOptions); + dlg.classList.add('formDialog'); + let html = ''; + html += '
'; + html += ''; + html += '

'; + html += globalize.translate('HeaderLiveTvTunerSetup'); + html += '

'; + html += '
'; + html += getEditorHtml(); + dlg.innerHTML = html; + dlg.querySelector('.btnCancel').addEventListener('click', function () { + dialogHelper.close(dlg); + }); + let deviceResult; + dlg.querySelector('.results').addEventListener('click', function (e) { + const tunerCard = dom.parentWithClass(e.target, 'card'); + + if (tunerCard) { + const deviceId = tunerCard.getAttribute('data-id'); + deviceResult = currentDevices.filter(function (d) { + return d.DeviceId === deviceId; + })[0]; + dialogHelper.close(dlg); + } + }); + + if (layoutManager.tv) { + scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); + } + + const apiClient = connectionManager.getApiClient(options.serverId); + discoverDevices(dlg, apiClient); + + if (layoutManager.tv) { + scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); + } + + return dialogHelper.open(dlg).then(function () { + if (deviceResult) { + return Promise.resolve(deviceResult); + } + + return Promise.reject(); + }); + }; +} + +let currentDevices = []; + +export default tunerPicker; diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js index 6f89702012..de469e1845 100644 --- a/src/components/tvproviders/schedulesdirect.js +++ b/src/components/tvproviders/schedulesdirect.js @@ -1,297 +1,304 @@ -define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emby-input', 'emby-select', 'emby-button', 'flexStyles'], function ($, loading, globalize) { - 'use strict'; +import $ from 'jQuery'; +import loading from 'loading'; +import globalize from 'globalize'; +import 'emby-checkbox'; +import 'emby-input'; +import 'listViewStyle'; +import 'paper-icon-button-light'; +import 'emby-select'; +import 'emby-button'; +import 'flexStyles'; - return function (page, providerId, options) { - function reload() { - loading.show(); - ApiClient.getNamedConfiguration('livetv').then(function (config) { - var info = config.ListingProviders.filter(function (i) { - return i.Id === providerId; - })[0] || {}; - listingsId = info.ListingsId; - $('#selectListing', page).val(info.ListingsId || ''); - page.querySelector('.txtUser').value = info.Username || ''; - page.querySelector('.txtPass').value = ''; - page.querySelector('.txtZipCode').value = info.ZipCode || ''; +export default function (page, providerId, options) { + function reload() { + loading.show(); + ApiClient.getNamedConfiguration('livetv').then(function (config) { + const info = config.ListingProviders.filter(function (i) { + return i.Id === providerId; + })[0] || {}; + listingsId = info.ListingsId; + $('#selectListing', page).val(info.ListingsId || ''); + page.querySelector('.txtUser').value = info.Username || ''; + page.querySelector('.txtPass').value = ''; + page.querySelector('.txtZipCode').value = info.ZipCode || ''; - if (info.Username && info.Password) { - page.querySelector('.listingsSection').classList.remove('hide'); - } else { - page.querySelector('.listingsSection').classList.add('hide'); - } - - page.querySelector('.chkAllTuners').checked = info.EnableAllTuners; - - if (info.EnableAllTuners) { - page.querySelector('.selectTunersSection').classList.add('hide'); - } else { - page.querySelector('.selectTunersSection').classList.remove('hide'); - } - - setCountry(info); - refreshTunerDevices(page, info, config.TunerHosts); - }); - } - - function setCountry(info) { - ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/SchedulesDirect/Countries')).then(function (result) { - var i; - var length; - var countryList = []; - - for (var region in result) { - var countries = result[region]; - - if (countries.length && region !== 'ZZZ') { - for (i = 0, length = countries.length; i < length; i++) { - countryList.push({ - name: countries[i].fullName, - value: countries[i].shortName - }); - } - } - } - - countryList.sort(function (a, b) { - if (a.name > b.name) { - return 1; - } - - if (a.name < b.name) { - return -1; - } - - return 0; - }); - $('#selectCountry', page).html(countryList.map(function (c) { - return ''; - }).join('')).val(info.Country || ''); - $(page.querySelector('.txtZipCode')).trigger('change'); - }, function () { // ApiClient.getJSON() error handler - Dashboard.alert({ - message: globalize.translate('ErrorGettingTvLineups') - }); - }); - loading.hide(); - } - - function sha256(str) { - if (!self.TextEncoder) { - return Promise.resolve(''); + if (info.Username && info.Password) { + page.querySelector('.listingsSection').classList.remove('hide'); + } else { + page.querySelector('.listingsSection').classList.add('hide'); } - var buffer = new TextEncoder('utf-8').encode(str); - return crypto.subtle.digest('SHA-256', buffer).then(function (hash) { - return hex(hash); - }); - } + page.querySelector('.chkAllTuners').checked = info.EnableAllTuners; - function hex(buffer) { - var hexCodes = []; - var view = new DataView(buffer); - - for (var i = 0; i < view.byteLength; i += 4) { - var value = view.getUint32(i); - var stringValue = value.toString(16); - var paddedValue = ('00000000' + stringValue).slice(-'00000000'.length); - hexCodes.push(paddedValue); + if (info.EnableAllTuners) { + page.querySelector('.selectTunersSection').classList.add('hide'); + } else { + page.querySelector('.selectTunersSection').classList.remove('hide'); } - return hexCodes.join(''); - } + setCountry(info); + refreshTunerDevices(page, info, config.TunerHosts); + }); + } - function submitLoginForm() { - loading.show(); - sha256(page.querySelector('.txtPass').value).then(function (passwordHash) { - var info = { - Type: 'SchedulesDirect', - Username: page.querySelector('.txtUser').value, - EnableAllTuners: true, - Password: passwordHash, - Pw: page.querySelector('.txtPass').value - }; - var id = providerId; + function setCountry(info) { + ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/SchedulesDirect/Countries')).then(function (result) { + let i; + let length; + const countryList = []; - if (id) { - info.Id = id; + for (const region in result) { + const countries = result[region]; + + if (countries.length && region !== 'ZZZ') { + for (i = 0, length = countries.length; i < length; i++) { + countryList.push({ + name: countries[i].fullName, + value: countries[i].shortName + }); + } + } + } + + countryList.sort(function (a, b) { + if (a.name > b.name) { + return 1; } - ApiClient.ajax({ - type: 'POST', - url: ApiClient.getUrl('LiveTv/ListingProviders', { - ValidateLogin: true - }), - data: JSON.stringify(info), - contentType: 'application/json', - dataType: 'json' - }).then(function (result) { - Dashboard.processServerConfigurationUpdateResult(); - providerId = result.Id; - reload(); - }, function () { - Dashboard.alert({ // ApiClient.ajax() error handler - message: globalize.translate('ErrorSavingTvProvider') - }); - }); + if (a.name < b.name) { + return -1; + } + + return 0; }); + $('#selectCountry', page).html(countryList.map(function (c) { + return ''; + }).join('')).val(info.Country || ''); + $(page.querySelector('.txtZipCode')).trigger('change'); + }, function () { // ApiClient.getJSON() error handler + Dashboard.alert({ + message: globalize.translate('ErrorGettingTvLineups') + }); + }); + loading.hide(); + } + + function sha256(str) { + if (!self.TextEncoder) { + return Promise.resolve(''); } - function submitListingsForm() { - var selectedListingsId = $('#selectListing', page).val(); + const buffer = new TextEncoder('utf-8').encode(str); + return crypto.subtle.digest('SHA-256', buffer).then(function (hash) { + return hex(hash); + }); + } - if (!selectedListingsId) { - return void Dashboard.alert({ - message: globalize.translate('ErrorPleaseSelectLineup') - }); - } + function hex(buffer) { + const hexCodes = []; + const view = new DataView(buffer); - loading.show(); - var id = providerId; - ApiClient.getNamedConfiguration('livetv').then(function (config) { - var info = config.ListingProviders.filter(function (i) { - return i.Id === id; - })[0]; - info.ZipCode = page.querySelector('.txtZipCode').value; - info.Country = $('#selectCountry', page).val(); - info.ListingsId = selectedListingsId; - info.EnableAllTuners = page.querySelector('.chkAllTuners').checked; - info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (i) { - return i.checked; - }).map(function (i) { - return i.getAttribute('data-id'); - }); - ApiClient.ajax({ - type: 'POST', - url: ApiClient.getUrl('LiveTv/ListingProviders', { - ValidateListings: true - }), - data: JSON.stringify(info), - contentType: 'application/json' - }).then(function (result) { - loading.hide(); - - if (options.showConfirmation) { - Dashboard.processServerConfigurationUpdateResult(); - } - - Events.trigger(self, 'submitted'); - }, function () { - loading.hide(); - Dashboard.alert({ - message: globalize.translate('ErrorAddingListingsToSchedulesDirect') - }); - }); - }); + for (let i = 0; i < view.byteLength; i += 4) { + const value = view.getUint32(i); + const stringValue = value.toString(16); + const paddedValue = ('00000000' + stringValue).slice(-'00000000'.length); + hexCodes.push(paddedValue); } - function refreshListings(value) { - if (!value) { - return void $('#selectListing', page).html(''); + return hexCodes.join(''); + } + + function submitLoginForm() { + loading.show(); + sha256(page.querySelector('.txtPass').value).then(function (passwordHash) { + const info = { + Type: 'SchedulesDirect', + Username: page.querySelector('.txtUser').value, + EnableAllTuners: true, + Password: passwordHash, + Pw: page.querySelector('.txtPass').value + }; + const id = providerId; + + if (id) { + info.Id = id; } - loading.show(); ApiClient.ajax({ - type: 'GET', - url: ApiClient.getUrl('LiveTv/ListingProviders/Lineups', { - Id: providerId, - Location: value, - Country: $('#selectCountry', page).val() + type: 'POST', + url: ApiClient.getUrl('LiveTv/ListingProviders', { + ValidateLogin: true }), + data: JSON.stringify(info), + contentType: 'application/json', dataType: 'json' }).then(function (result) { - $('#selectListing', page).html(result.map(function (o) { - return ''; - })); - - if (listingsId) { - $('#selectListing', page).val(listingsId); - } - - loading.hide(); - }, function (result) { - Dashboard.alert({ - message: globalize.translate('ErrorGettingTvLineups') + Dashboard.processServerConfigurationUpdateResult(); + providerId = result.Id; + reload(); + }, function () { + Dashboard.alert({ // ApiClient.ajax() error handler + message: globalize.translate('ErrorSavingTvProvider') }); - refreshListings(''); + }); + }); + } + + function submitListingsForm() { + const selectedListingsId = $('#selectListing', page).val(); + + if (!selectedListingsId) { + return void Dashboard.alert({ + message: globalize.translate('ErrorPleaseSelectLineup') + }); + } + + loading.show(); + const id = providerId; + ApiClient.getNamedConfiguration('livetv').then(function (config) { + const info = config.ListingProviders.filter(function (i) { + return i.Id === id; + })[0]; + info.ZipCode = page.querySelector('.txtZipCode').value; + info.Country = $('#selectCountry', page).val(); + info.ListingsId = selectedListingsId; + info.EnableAllTuners = page.querySelector('.chkAllTuners').checked; + info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (i) { + return i.checked; + }).map(function (i) { + return i.getAttribute('data-id'); + }); + ApiClient.ajax({ + type: 'POST', + url: ApiClient.getUrl('LiveTv/ListingProviders', { + ValidateListings: true + }), + data: JSON.stringify(info), + contentType: 'application/json' + }).then(function (result) { loading.hide(); - }); - } - function getTunerName(providerId) { - switch (providerId = providerId.toLowerCase()) { - case 'm3u': - return 'M3U Playlist'; - case 'hdhomerun': - return 'HDHomerun'; - case 'satip': - return 'DVB'; - default: - return 'Unknown'; - } - } - - function refreshTunerDevices(page, providerInfo, devices) { - var html = ''; - - for (var i = 0, length = devices.length; i < length; i++) { - var device = devices[i]; - html += '
'; - var enabledTuners = providerInfo.EnabledTuners || []; - var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1; - var checkedAttribute = isChecked ? ' checked' : ''; - html += ''; - html += '
'; - html += '
'; - html += device.FriendlyName || getTunerName(device.Type); - html += '
'; - html += '
'; - html += device.Url; - html += '
'; - html += '
'; - html += '
'; - } - - page.querySelector('.tunerList').innerHTML = html; - } - - var listingsId; - var self = this; - - self.submit = function () { - page.querySelector('.btnSubmitListingsContainer').click(); - }; - - self.init = function () { - options = options || {}; - - // Only hide the buttons if explicitly set to false; default to showing if undefined or null - // FIXME: rename this option to clarify logic - var hideCancelButton = options.showCancelButton === false; - page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton); - - var hideSubmitButton = options.showSubmitButton === false; - page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton); - - $('.formLogin', page).on('submit', function () { - submitLoginForm(); - return false; - }); - $('.formListings', page).on('submit', function () { - submitListingsForm(); - return false; - }); - $('.txtZipCode', page).on('change', function () { - refreshListings(this.value); - }); - page.querySelector('.chkAllTuners').addEventListener('change', function (e) { - if (e.target.checked) { - page.querySelector('.selectTunersSection').classList.add('hide'); - } else { - page.querySelector('.selectTunersSection').classList.remove('hide'); + if (options.showConfirmation) { + Dashboard.processServerConfigurationUpdateResult(); } + + Events.trigger(self, 'submitted'); + }, function () { + loading.hide(); + Dashboard.alert({ + message: globalize.translate('ErrorAddingListingsToSchedulesDirect') + }); }); - $('.createAccountHelp', page).html(globalize.translate('MessageCreateAccountAt', 'http://www.schedulesdirect.org')); - reload(); - }; + }); + } + + function refreshListings(value) { + if (!value) { + return void $('#selectListing', page).html(''); + } + + loading.show(); + ApiClient.ajax({ + type: 'GET', + url: ApiClient.getUrl('LiveTv/ListingProviders/Lineups', { + Id: providerId, + Location: value, + Country: $('#selectCountry', page).val() + }), + dataType: 'json' + }).then(function (result) { + $('#selectListing', page).html(result.map(function (o) { + return ''; + })); + + if (listingsId) { + $('#selectListing', page).val(listingsId); + } + + loading.hide(); + }, function (result) { + Dashboard.alert({ + message: globalize.translate('ErrorGettingTvLineups') + }); + refreshListings(''); + loading.hide(); + }); + } + + function getTunerName(providerId) { + switch (providerId = providerId.toLowerCase()) { + case 'm3u': + return 'M3U Playlist'; + case 'hdhomerun': + return 'HDHomerun'; + case 'satip': + return 'DVB'; + default: + return 'Unknown'; + } + } + + function refreshTunerDevices(page, providerInfo, devices) { + let html = ''; + + for (let i = 0, length = devices.length; i < length; i++) { + const device = devices[i]; + html += '
'; + const enabledTuners = providerInfo.EnabledTuners || []; + const isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1; + const checkedAttribute = isChecked ? ' checked' : ''; + html += ''; + html += '
'; + html += '
'; + html += device.FriendlyName || getTunerName(device.Type); + html += '
'; + html += '
'; + html += device.Url; + html += '
'; + html += '
'; + html += '
'; + } + + page.querySelector('.tunerList').innerHTML = html; + } + + let listingsId; + const self = this; + + self.submit = function () { + page.querySelector('.btnSubmitListingsContainer').click(); }; -}); + + self.init = function () { + options = options || {}; + + // Only hide the buttons if explicitly set to false; default to showing if undefined or null + // FIXME: rename this option to clarify logic + const hideCancelButton = options.showCancelButton === false; + page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton); + + const hideSubmitButton = options.showSubmitButton === false; + page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton); + + $('.formLogin', page).on('submit', function () { + submitLoginForm(); + return false; + }); + $('.formListings', page).on('submit', function () { + submitListingsForm(); + return false; + }); + $('.txtZipCode', page).on('change', function () { + refreshListings(this.value); + }); + page.querySelector('.chkAllTuners').addEventListener('change', function (e) { + if (e.target.checked) { + page.querySelector('.selectTunersSection').classList.add('hide'); + } else { + page.querySelector('.selectTunersSection').classList.remove('hide'); + } + }); + $('.createAccountHelp', page).html(globalize.translate('MessageCreateAccountAt', 'http://www.schedulesdirect.org')); + reload(); + }; +} diff --git a/src/components/tvproviders/schedulesdirect.template.html b/src/components/tvproviders/schedulesdirect.template.html index abe19b50f5..8783987875 100644 --- a/src/components/tvproviders/schedulesdirect.template.html +++ b/src/components/tvproviders/schedulesdirect.template.html @@ -27,7 +27,7 @@
- +
@@ -65,7 +65,7 @@

- +
diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index 5c75a09cdd..a75b29eeb3 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -1,189 +1,193 @@ -define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listViewStyle', 'paper-icon-button-light'], function ($, loading, globalize) { - 'use strict'; +import $ from 'jQuery'; +import loading from 'loading'; +import globalize from 'globalize'; +import 'emby-checkbox'; +import 'emby-input'; +import 'listViewStyle'; +import 'paper-icon-button-light'; - return function (page, providerId, options) { - function getListingProvider(config, id) { - if (config && id) { - var result = config.ListingProviders.filter(function (provider) { - return provider.Id === id; - })[0]; +export default function (page, providerId, options) { + function getListingProvider(config, id) { + if (config && id) { + const result = config.ListingProviders.filter(function (provider) { + return provider.Id === id; + })[0]; - if (result) { - return Promise.resolve(result); - } - - return getListingProvider(); + if (result) { + return Promise.resolve(result); } - return ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/Default')); + return getListingProvider(); } - function reload() { - loading.show(); - ApiClient.getNamedConfiguration('livetv').then(function (config) { - getListingProvider(config, providerId).then(function (info) { - page.querySelector('.txtPath').value = info.Path || ''; - page.querySelector('.txtKids').value = (info.KidsCategories || []).join('|'); - page.querySelector('.txtNews').value = (info.NewsCategories || []).join('|'); - page.querySelector('.txtSports').value = (info.SportsCategories || []).join('|'); - page.querySelector('.txtMovies').value = (info.MovieCategories || []).join('|'); - page.querySelector('.txtMoviePrefix').value = info.MoviePrefix || ''; - page.querySelector('.txtUserAgent').value = info.UserAgent || ''; - page.querySelector('.chkAllTuners').checked = info.EnableAllTuners; + return ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/Default')); + } - if (page.querySelector('.chkAllTuners').checked) { - page.querySelector('.selectTunersSection').classList.add('hide'); - } else { - page.querySelector('.selectTunersSection').classList.remove('hide'); - } + function reload() { + loading.show(); + ApiClient.getNamedConfiguration('livetv').then(function (config) { + getListingProvider(config, providerId).then(function (info) { + page.querySelector('.txtPath').value = info.Path || ''; + page.querySelector('.txtKids').value = (info.KidsCategories || []).join('|'); + page.querySelector('.txtNews').value = (info.NewsCategories || []).join('|'); + page.querySelector('.txtSports').value = (info.SportsCategories || []).join('|'); + page.querySelector('.txtMovies').value = (info.MovieCategories || []).join('|'); + page.querySelector('.txtMoviePrefix').value = info.MoviePrefix || ''; + page.querySelector('.txtUserAgent').value = info.UserAgent || ''; + page.querySelector('.chkAllTuners').checked = info.EnableAllTuners; - refreshTunerDevices(page, info, config.TunerHosts); - loading.hide(); - }); - }); - } - - function getCategories(txtInput) { - var value = txtInput.value; - - if (value) { - return value.split('|'); - } - - return []; - } - - function submitListingsForm() { - loading.show(); - var id = providerId; - ApiClient.getNamedConfiguration('livetv').then(function (config) { - var info = config.ListingProviders.filter(function (provider) { - return provider.Id === id; - })[0] || {}; - info.Type = 'xmltv'; - info.Path = page.querySelector('.txtPath').value; - info.MoviePrefix = page.querySelector('.txtMoviePrefix').value || null; - info.UserAgent = page.querySelector('.txtUserAgent').value || null; - info.MovieCategories = getCategories(page.querySelector('.txtMovies')); - info.KidsCategories = getCategories(page.querySelector('.txtKids')); - info.NewsCategories = getCategories(page.querySelector('.txtNews')); - info.SportsCategories = getCategories(page.querySelector('.txtSports')); - info.EnableAllTuners = page.querySelector('.chkAllTuners').checked; - info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (tuner) { - return tuner.checked; - }).map(function (tuner) { - return tuner.getAttribute('data-id'); - }); - ApiClient.ajax({ - type: 'POST', - url: ApiClient.getUrl('LiveTv/ListingProviders', { - ValidateListings: true - }), - data: JSON.stringify(info), - contentType: 'application/json' - }).then(function (result) { - loading.hide(); - - if (options.showConfirmation !== false) { - Dashboard.processServerConfigurationUpdateResult(); - } - - Events.trigger(self, 'submitted'); - }, function () { - loading.hide(); - Dashboard.alert({ - message: globalize.translate('ErrorAddingXmlTvFile') - }); - }); - }); - } - - function getTunerName(providerId) { - switch (providerId = providerId.toLowerCase()) { - case 'm3u': - return 'M3U Playlist'; - case 'hdhomerun': - return 'HDHomerun'; - case 'satip': - return 'DVB'; - default: - return 'Unknown'; - } - } - - function refreshTunerDevices(page, providerInfo, devices) { - var html = ''; - - for (var i = 0, length = devices.length; i < length; i++) { - var device = devices[i]; - html += '
'; - var enabledTuners = providerInfo.EnabledTuners || []; - var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1; - var checkedAttribute = isChecked ? ' checked' : ''; - html += ''; - html += '
'; - html += '
'; - html += device.FriendlyName || getTunerName(device.Type); - html += '
'; - html += '
'; - html += device.Url; - html += '
'; - html += '
'; - html += '
'; - } - - page.querySelector('.tunerList').innerHTML = html; - } - - function onSelectPathClick(e) { - var page = $(e.target).parents('.xmltvForm')[0]; - - require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser.default(); - picker.show({ - includeFiles: true, - callback: function (path) { - if (path) { - var txtPath = page.querySelector('.txtPath'); - txtPath.value = path; - txtPath.focus(); - } - picker.close(); - } - }); - }); - } - - var self = this; - - self.submit = function () { - page.querySelector('.btnSubmitListings').click(); - }; - - self.init = function () { - options = options || {}; - - // Only hide the buttons if explicitly set to false; default to showing if undefined or null - // FIXME: rename this option to clarify logic - var hideCancelButton = options.showCancelButton === false; - page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton); - - var hideSubmitButton = options.showSubmitButton === false; - page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton); - - $('form', page).on('submit', function () { - submitListingsForm(); - return false; - }); - page.querySelector('#btnSelectPath').addEventListener('click', onSelectPathClick); - page.querySelector('.chkAllTuners').addEventListener('change', function (evt) { - if (evt.target.checked) { + if (page.querySelector('.chkAllTuners').checked) { page.querySelector('.selectTunersSection').classList.add('hide'); } else { page.querySelector('.selectTunersSection').classList.remove('hide'); } + + refreshTunerDevices(page, info, config.TunerHosts); + loading.hide(); }); - reload(); - }; + }); + } + + function getCategories(txtInput) { + const value = txtInput.value; + + if (value) { + return value.split('|'); + } + + return []; + } + + function submitListingsForm() { + loading.show(); + const id = providerId; + ApiClient.getNamedConfiguration('livetv').then(function (config) { + const info = config.ListingProviders.filter(function (provider) { + return provider.Id === id; + })[0] || {}; + info.Type = 'xmltv'; + info.Path = page.querySelector('.txtPath').value; + info.MoviePrefix = page.querySelector('.txtMoviePrefix').value || null; + info.UserAgent = page.querySelector('.txtUserAgent').value || null; + info.MovieCategories = getCategories(page.querySelector('.txtMovies')); + info.KidsCategories = getCategories(page.querySelector('.txtKids')); + info.NewsCategories = getCategories(page.querySelector('.txtNews')); + info.SportsCategories = getCategories(page.querySelector('.txtSports')); + info.EnableAllTuners = page.querySelector('.chkAllTuners').checked; + info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (tuner) { + return tuner.checked; + }).map(function (tuner) { + return tuner.getAttribute('data-id'); + }); + ApiClient.ajax({ + type: 'POST', + url: ApiClient.getUrl('LiveTv/ListingProviders', { + ValidateListings: true + }), + data: JSON.stringify(info), + contentType: 'application/json' + }).then(function (result) { + loading.hide(); + + if (options.showConfirmation !== false) { + Dashboard.processServerConfigurationUpdateResult(); + } + + Events.trigger(self, 'submitted'); + }, function () { + loading.hide(); + Dashboard.alert({ + message: globalize.translate('ErrorAddingXmlTvFile') + }); + }); + }); + } + + function getTunerName(providerId) { + switch (providerId = providerId.toLowerCase()) { + case 'm3u': + return 'M3U Playlist'; + case 'hdhomerun': + return 'HDHomerun'; + case 'satip': + return 'DVB'; + default: + return 'Unknown'; + } + } + + function refreshTunerDevices(page, providerInfo, devices) { + let html = ''; + + for (let i = 0, length = devices.length; i < length; i++) { + const device = devices[i]; + html += '
'; + const enabledTuners = providerInfo.EnabledTuners || []; + const isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1; + const checkedAttribute = isChecked ? ' checked' : ''; + html += ''; + html += '
'; + html += '
'; + html += device.FriendlyName || getTunerName(device.Type); + html += '
'; + html += '
'; + html += device.Url; + html += '
'; + html += '
'; + html += '
'; + } + + page.querySelector('.tunerList').innerHTML = html; + } + + function onSelectPathClick(e) { + const page = $(e.target).parents('.xmltvForm')[0]; + + import('directorybrowser').then(({default: directoryBrowser}) => { + const picker = new directoryBrowser(); + picker.show({ + includeFiles: true, + callback: function (path) { + if (path) { + const txtPath = page.querySelector('.txtPath'); + txtPath.value = path; + txtPath.focus(); + } + picker.close(); + } + }); + }); + } + + const self = this; + + self.submit = function () { + page.querySelector('.btnSubmitListings').click(); }; -}); + + self.init = function () { + options = options || {}; + + // Only hide the buttons if explicitly set to false; default to showing if undefined or null + // FIXME: rename this option to clarify logic + const hideCancelButton = options.showCancelButton === false; + page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton); + + const hideSubmitButton = options.showSubmitButton === false; + page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton); + + $('form', page).on('submit', function () { + submitListingsForm(); + return false; + }); + page.querySelector('#btnSelectPath').addEventListener('click', onSelectPathClick); + page.querySelector('.chkAllTuners').addEventListener('change', function (evt) { + if (evt.target.checked) { + page.querySelector('.selectTunersSection').classList.add('hide'); + } else { + page.querySelector('.selectTunersSection').classList.remove('hide'); + } + }); + reload(); + }; +} diff --git a/src/components/tvproviders/xmltv.template.html b/src/components/tvproviders/xmltv.template.html index 72c29904b3..010e66ea0d 100644 --- a/src/components/tvproviders/xmltv.template.html +++ b/src/components/tvproviders/xmltv.template.html @@ -56,7 +56,7 @@
- +
diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js index 1dbe71c632..e28bb03abe 100644 --- a/src/components/upnextdialog/upnextdialog.js +++ b/src/components/upnextdialog/upnextdialog.js @@ -1,7 +1,19 @@ -define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'layoutManager', 'focusManager', 'globalize', 'itemHelper', 'css!./upnextdialog', 'emby-button', 'flexStyles'], function (dom, playbackManager, connectionManager, events, mediaInfo, layoutManager, focusManager, globalize, itemHelper) { - 'use strict'; +import dom from 'dom'; +import playbackManager from 'playbackManager'; +import connectionManager from 'connectionManager'; +import events from 'events'; +import mediaInfo from 'mediaInfo'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import globalize from 'globalize'; +import itemHelper from 'itemHelper'; +import 'css!./upnextdialog'; +import 'emby-button'; +import 'flexStyles'; - var transitionEndEventName = dom.whichTransitionEvent(); +/* eslint-disable indent */ + + const transitionEndEventName = dom.whichTransitionEvent(); function seriesImageUrl(item, options) { if (item.Type !== 'Episode') { @@ -56,7 +68,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l function setPoster(osdPoster, item, secondaryItem) { if (item) { - var imgUrl = seriesImageUrl(item, { type: 'Primary' }) || + let imgUrl = seriesImageUrl(item, { type: 'Primary' }) || seriesImageUrl(item, { type: 'Thumb' }) || imageUrl(item, { type: 'Primary' }); @@ -76,7 +88,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } function getHtml() { - var html = ''; + let html = ''; html += '
'; html += '
'; @@ -112,17 +124,17 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } function setNextVideoText() { - var instance = this; + const instance = this; - var elem = instance.options.parent; + const elem = instance.options.parent; - var secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0); + const secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0); console.debug('up next seconds remaining: ' + secondsRemaining); - var timeText = '' + globalize.translate('HeaderSecondsValue', secondsRemaining) + ''; + const timeText = '' + globalize.translate('HeaderSecondsValue', secondsRemaining) + ''; - var nextVideoText = instance.itemType === 'Episode' ? + const nextVideoText = instance.itemType === 'Episode' ? globalize.translate('HeaderNextEpisodePlayingInValue', timeText) : globalize.translate('HeaderNextVideoPlayingInValue', timeText); @@ -130,9 +142,9 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } function fillItem(item) { - var instance = this; + const instance = this; - var elem = instance.options.parent; + const elem = instance.options.parent; setPoster(elem.querySelector('.upNextDialog-poster'), item); @@ -141,7 +153,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l elem.querySelector('.upNextDialog-mediainfo').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(item, { }); - var title = itemHelper.getDisplayName(item); + let title = itemHelper.getDisplayName(item); if (item.SeriesName) { title = item.SeriesName + ' - ' + title; } @@ -161,10 +173,10 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } function onStartNowClick() { - var options = this.options; + const options = this.options; if (options) { - var player = options.player; + const player = options.player; this.hide(); @@ -186,7 +198,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } function clearHideAnimationEventListeners(instance, elem) { - var fn = instance._onHideAnimationComplete; + const fn = instance._onHideAnimationComplete; if (fn) { dom.removeEventListener(elem, transitionEndEventName, fn, { @@ -196,8 +208,8 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } function onHideAnimationComplete(e) { - var instance = this; - var elem = e.target; + const instance = this; + const elem = e.target; elem.classList.add('hide'); @@ -206,14 +218,14 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } function hideComingUpNext() { - var instance = this; + const instance = this; clearCountdownTextTimeout(this); if (!instance.options) { return; } - var elem = instance.options.parent; + const elem = instance.options.parent; if (!elem) { return; @@ -230,7 +242,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l elem.classList.add('upNextDialog-hidden'); - var fn = onHideAnimationComplete.bind(instance); + const fn = onHideAnimationComplete.bind(instance); instance._onHideAnimationComplete = fn; dom.addEventListener(elem, transitionEndEventName, fn, { @@ -239,12 +251,12 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } function getTimeRemainingMs(instance) { - var options = instance.options; + const options = instance.options; if (options) { - var runtimeTicks = playbackManager.duration(options.player); + const runtimeTicks = playbackManager.duration(options.player); if (runtimeTicks) { - var timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player); + const timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player); return Math.round(timeRemainingTicks / 10000); } @@ -254,7 +266,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } function startComingUpNextHideTimer(instance) { - var timeRemainingMs = getTimeRemainingMs(instance); + const timeRemainingMs = getTimeRemainingMs(instance); if (timeRemainingMs <= 0) { return; @@ -266,14 +278,14 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l instance._countdownTextTimeout = setInterval(setNextVideoText.bind(instance), 400); } - function UpNextDialog(options) { +class UpNextDialog { + constructor(options) { this.options = options; init(this, options); } - - UpNextDialog.prototype.show = function () { - var elem = this.options.parent; + show() { + const elem = this.options.parent; clearHideAnimationEventListeners(this, elem); @@ -291,18 +303,18 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } startComingUpNextHideTimer(this); - }; - - UpNextDialog.prototype.hide = function () { + } + hide() { hideComingUpNext.call(this); - }; - - UpNextDialog.prototype.destroy = function () { + } + destroy() { hideComingUpNext.call(this); this.options = null; this.itemType = null; - }; + } +} - return UpNextDialog; -}); +export default UpNextDialog; + +/* eslint-enable indent */ diff --git a/src/components/userdatabuttons/userdatabuttons.js b/src/components/userdatabuttons/userdatabuttons.js index e3a7b9e06b..2b09095574 100644 --- a/src/components/userdatabuttons/userdatabuttons.js +++ b/src/components/userdatabuttons/userdatabuttons.js @@ -1,214 +1,219 @@ -define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-button-light', 'material-icons', 'emby-button', 'css!./userdatabuttons'], function (connectionManager, globalize, dom, itemHelper) { - 'use strict'; +import connectionManager from 'connectionManager'; +import globalize from 'globalize'; +import dom from 'dom'; +import itemHelper from 'itemHelper'; +import 'paper-icon-button-light'; +import 'material-icons'; +import 'emby-button'; +import 'css!./userdatabuttons'; - var userDataMethods = { - markPlayed: markPlayed, - markDislike: markDislike, - markLike: markLike, - markFavorite: markFavorite - }; +const userDataMethods = { + markPlayed: markPlayed, + markDislike: markDislike, + markLike: markLike, + markFavorite: markFavorite +}; - function getUserDataButtonHtml(method, itemId, serverId, buttonCssClass, iconCssClass, icon, tooltip, style) { - if (style === 'fab-mini') { - style = 'fab'; - buttonCssClass = buttonCssClass ? (buttonCssClass + ' mini') : 'mini'; - } - - var is = style === 'fab' ? 'emby-button' : 'paper-icon-button-light'; - var className = style === 'fab' ? 'autoSize fab' : 'autoSize'; - - if (buttonCssClass) { - className += ' ' + buttonCssClass; - } - - if (iconCssClass) { - iconCssClass += ' '; - } else { - iconCssClass = ''; - } - - iconCssClass += 'material-icons'; - - return ''; +function getUserDataButtonHtml(method, itemId, serverId, buttonCssClass, iconCssClass, icon, tooltip, style) { + if (style === 'fab-mini') { + style = 'fab'; + buttonCssClass = buttonCssClass ? (buttonCssClass + ' mini') : 'mini'; } - function onContainerClick(e) { - var btnUserData = dom.parentWithClass(e.target, 'btnUserData'); + const is = style === 'fab' ? 'emby-button' : 'paper-icon-button-light'; + let className = style === 'fab' ? 'autoSize fab' : 'autoSize'; - if (!btnUserData) { - return; - } - - var method = btnUserData.getAttribute('data-method'); - userDataMethods[method](btnUserData); + if (buttonCssClass) { + className += ' ' + buttonCssClass; } - function fill(options) { - var html = getIconsHtml(options); - - if (options.fillMode === 'insertAdjacent') { - options.element.insertAdjacentHTML(options.insertLocation || 'beforeend', html); - } else { - options.element.innerHTML = html; - } - - dom.removeEventListener(options.element, 'click', onContainerClick, { - passive: true - }); - - dom.addEventListener(options.element, 'click', onContainerClick, { - passive: true - }); + if (iconCssClass) { + iconCssClass += ' '; + } else { + iconCssClass = ''; } - function destroy(options) { - options.element.innerHTML = ''; + iconCssClass += 'material-icons'; - dom.removeEventListener(options.element, 'click', onContainerClick, { - passive: true - }); + return ''; +} + +function onContainerClick(e) { + const btnUserData = dom.parentWithClass(e.target, 'btnUserData'); + + if (!btnUserData) { + return; } - function getIconsHtml(options) { - var item = options.item; - var includePlayed = options.includePlayed; - var cssClass = options.cssClass; - var style = options.style; + const method = btnUserData.getAttribute('data-method'); + userDataMethods[method](btnUserData); +} - var html = ''; +function fill(options) { + const html = getIconsHtml(options); - var userData = item.UserData || {}; + if (options.fillMode === 'insertAdjacent') { + options.element.insertAdjacentHTML(options.insertLocation || 'beforeend', html); + } else { + options.element.innerHTML = html; + } - var itemId = item.Id; + dom.removeEventListener(options.element, 'click', onContainerClick, { + passive: true + }); - if (itemHelper.isLocalItem(item)) { - return html; - } + dom.addEventListener(options.element, 'click', onContainerClick, { + passive: true + }); +} - var btnCssClass = 'btnUserData'; +function destroy(options) { + options.element.innerHTML = ''; - if (cssClass) { - btnCssClass += ' ' + cssClass; - } + dom.removeEventListener(options.element, 'click', onContainerClick, { + passive: true + }); +} - var iconCssClass = options.iconCssClass; +function getIconsHtml(options) { + const item = options.item; + const includePlayed = options.includePlayed; + const cssClass = options.cssClass; + const style = options.style; - var serverId = item.ServerId; + let html = ''; - if (includePlayed !== false) { - var tooltipPlayed = globalize.translate('MarkPlayed'); + const userData = item.UserData || {}; - if (itemHelper.canMarkPlayed(item)) { - if (userData.Played) { - html += getUserDataButtonHtml('markPlayed', itemId, serverId, btnCssClass + ' btnUserDataOn', iconCssClass, 'check', tooltipPlayed, style); - } else { - html += getUserDataButtonHtml('markPlayed', itemId, serverId, btnCssClass, iconCssClass, 'check', tooltipPlayed, style); - } - } - } - - var tooltipFavorite = globalize.translate('Favorite'); - if (userData.IsFavorite) { - html += getUserDataButtonHtml('markFavorite', itemId, serverId, btnCssClass + ' btnUserData btnUserDataOn', iconCssClass, 'favorite', tooltipFavorite, style); - } else { - html += getUserDataButtonHtml('markFavorite', itemId, serverId, btnCssClass + ' btnUserData', iconCssClass, 'favorite', tooltipFavorite, style); - } + const itemId = item.Id; + if (itemHelper.isLocalItem(item)) { return html; } - function markFavorite(link) { - var id = link.getAttribute('data-itemid'); - var serverId = link.getAttribute('data-serverid'); + let btnCssClass = 'btnUserData'; - var markAsFavorite = !link.classList.contains('btnUserDataOn'); + if (cssClass) { + btnCssClass += ' ' + cssClass; + } - favorite(id, serverId, markAsFavorite); + const iconCssClass = options.iconCssClass; - if (markAsFavorite) { - link.classList.add('btnUserDataOn'); - } else { - link.classList.remove('btnUserDataOn'); + const serverId = item.ServerId; + + if (includePlayed !== false) { + const tooltipPlayed = globalize.translate('MarkPlayed'); + + if (itemHelper.canMarkPlayed(item)) { + if (userData.Played) { + html += getUserDataButtonHtml('markPlayed', itemId, serverId, btnCssClass + ' btnUserDataOn', iconCssClass, 'check', tooltipPlayed, style); + } else { + html += getUserDataButtonHtml('markPlayed', itemId, serverId, btnCssClass, iconCssClass, 'check', tooltipPlayed, style); + } } } - function markLike(link) { - var id = link.getAttribute('data-itemid'); - var serverId = link.getAttribute('data-serverid'); - - if (!link.classList.contains('btnUserDataOn')) { - likes(id, serverId, true); - - link.classList.add('btnUserDataOn'); - } else { - clearLike(id, serverId); - - link.classList.remove('btnUserDataOn'); - } - - link.parentNode.querySelector('.btnDislike').classList.remove('btnUserDataOn'); + const tooltipFavorite = globalize.translate('Favorite'); + if (userData.IsFavorite) { + html += getUserDataButtonHtml('markFavorite', itemId, serverId, btnCssClass + ' btnUserData btnUserDataOn', iconCssClass, 'favorite', tooltipFavorite, style); + } else { + html += getUserDataButtonHtml('markFavorite', itemId, serverId, btnCssClass + ' btnUserData', iconCssClass, 'favorite', tooltipFavorite, style); } - function markDislike(link) { - var id = link.getAttribute('data-itemid'); - var serverId = link.getAttribute('data-serverid'); + return html; +} - if (!link.classList.contains('btnUserDataOn')) { - likes(id, serverId, false); +function markFavorite(link) { + const id = link.getAttribute('data-itemid'); + const serverId = link.getAttribute('data-serverid'); - link.classList.add('btnUserDataOn'); - } else { - clearLike(id, serverId); + const markAsFavorite = !link.classList.contains('btnUserDataOn'); - link.classList.remove('btnUserDataOn'); - } + favorite(id, serverId, markAsFavorite); - link.parentNode.querySelector('.btnLike').classList.remove('btnUserDataOn'); + if (markAsFavorite) { + link.classList.add('btnUserDataOn'); + } else { + link.classList.remove('btnUserDataOn'); + } +} + +function markLike(link) { + const id = link.getAttribute('data-itemid'); + const serverId = link.getAttribute('data-serverid'); + + if (!link.classList.contains('btnUserDataOn')) { + likes(id, serverId, true); + + link.classList.add('btnUserDataOn'); + } else { + clearLike(id, serverId); + + link.classList.remove('btnUserDataOn'); } - function markPlayed(link) { - var id = link.getAttribute('data-itemid'); - var serverId = link.getAttribute('data-serverid'); + link.parentNode.querySelector('.btnDislike').classList.remove('btnUserDataOn'); +} - if (!link.classList.contains('btnUserDataOn')) { - played(id, serverId, true); +function markDislike(link) { + const id = link.getAttribute('data-itemid'); + const serverId = link.getAttribute('data-serverid'); - link.classList.add('btnUserDataOn'); - } else { - played(id, serverId, false); + if (!link.classList.contains('btnUserDataOn')) { + likes(id, serverId, false); - link.classList.remove('btnUserDataOn'); - } + link.classList.add('btnUserDataOn'); + } else { + clearLike(id, serverId); + + link.classList.remove('btnUserDataOn'); } - function likes(id, serverId, isLiked) { - var apiClient = connectionManager.getApiClient(serverId); - return apiClient.updateUserItemRating(apiClient.getCurrentUserId(), id, isLiked); + link.parentNode.querySelector('.btnLike').classList.remove('btnUserDataOn'); +} + +function markPlayed(link) { + const id = link.getAttribute('data-itemid'); + const serverId = link.getAttribute('data-serverid'); + + if (!link.classList.contains('btnUserDataOn')) { + played(id, serverId, true); + + link.classList.add('btnUserDataOn'); + } else { + played(id, serverId, false); + + link.classList.remove('btnUserDataOn'); } +} - function played(id, serverId, isPlayed) { - var apiClient = connectionManager.getApiClient(serverId); +function likes(id, serverId, isLiked) { + const apiClient = connectionManager.getApiClient(serverId); + return apiClient.updateUserItemRating(apiClient.getCurrentUserId(), id, isLiked); +} - var method = isPlayed ? 'markPlayed' : 'markUnplayed'; +function played(id, serverId, isPlayed) { + const apiClient = connectionManager.getApiClient(serverId); - return apiClient[method](apiClient.getCurrentUserId(), id, new Date()); - } + const method = isPlayed ? 'markPlayed' : 'markUnplayed'; - function favorite(id, serverId, isFavorite) { - var apiClient = connectionManager.getApiClient(serverId); + return apiClient[method](apiClient.getCurrentUserId(), id, new Date()); +} - return apiClient.updateFavoriteStatus(apiClient.getCurrentUserId(), id, isFavorite); - } +function favorite(id, serverId, isFavorite) { + const apiClient = connectionManager.getApiClient(serverId); - function clearLike(id, serverId) { - var apiClient = connectionManager.getApiClient(serverId); + return apiClient.updateFavoriteStatus(apiClient.getCurrentUserId(), id, isFavorite); +} - return apiClient.clearUserItemRating(apiClient.getCurrentUserId(), id); - } +function clearLike(id, serverId) { + const apiClient = connectionManager.getApiClient(serverId); - return { - fill: fill, - destroy: destroy, - getIconsHtml: getIconsHtml - }; -}); + return apiClient.clearUserItemRating(apiClient.getCurrentUserId(), id); +} + +export default { + fill: fill, + destroy: destroy, + getIconsHtml: getIconsHtml +}; diff --git a/src/components/viewContainer.js b/src/components/viewContainer.js index d1b0df6fbb..9d64130cdb 100644 --- a/src/components/viewContainer.js +++ b/src/components/viewContainer.js @@ -1,12 +1,12 @@ -define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewContainer'], function (browser, dom, layoutManager) { - 'use strict'; +import 'css!components/viewManager/viewContainer'; +/* eslint-disable indent */ function setControllerClass(view, options) { if (options.controllerFactory) { return Promise.resolve(); } - var controllerUrl = view.getAttribute('data-controller'); + let controllerUrl = view.getAttribute('data-controller'); if (controllerUrl) { if (controllerUrl.indexOf('__plugin/') === 0) { @@ -14,7 +14,7 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta } controllerUrl = Dashboard.getConfigurationResourceUrl(controllerUrl); - return getRequirePromise([controllerUrl]).then(function (ControllerFactory) { + return import(controllerUrl).then((ControllerFactory) => { options.controllerFactory = ControllerFactory; }); } @@ -22,94 +22,85 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta return Promise.resolve(); } - function getRequirePromise(deps) { - return new Promise(function (resolve, reject) { - require(deps, resolve); - }); - } - - function loadView(options) { + export function loadView(options) { if (!options.cancel) { - var selected = selectedPageIndex; - var previousAnimatable = selected === -1 ? null : allPages[selected]; - var pageIndex = selected + 1; + const selected = selectedPageIndex; + const previousAnimatable = selected === -1 ? null : allPages[selected]; + let pageIndex = selected + 1; if (pageIndex >= pageContainerCount) { pageIndex = 0; } - var isPluginpage = options.url.toLowerCase().indexOf('/configurationpage') !== -1; - var newViewInfo = normalizeNewView(options, isPluginpage); - var newView = newViewInfo.elem; - var modulesToLoad = []; + const isPluginpage = options.url.toLowerCase().indexOf('/configurationpage') !== -1; + const newViewInfo = normalizeNewView(options, isPluginpage); + const newView = newViewInfo.elem; - return new Promise(function (resolve) { - require(modulesToLoad, function () { - var currentPage = allPages[pageIndex]; + return new Promise((resolve) => { + const currentPage = allPages[pageIndex]; - if (currentPage) { - triggerDestroy(currentPage); - } + if (currentPage) { + triggerDestroy(currentPage); + } - var view = newView; + let view = newView; - if (typeof view == 'string') { - view = document.createElement('div'); - view.innerHTML = newView; - } + if (typeof view == 'string') { + view = document.createElement('div'); + view.innerHTML = newView; + } - view.classList.add('mainAnimatedPage'); + view.classList.add('mainAnimatedPage'); - if (currentPage) { - if (newViewInfo.hasScript && window.$) { - view = $(view).appendTo(mainAnimatedPages)[0]; - mainAnimatedPages.removeChild(currentPage); - } else { - mainAnimatedPages.replaceChild(view, currentPage); - } + if (currentPage) { + if (newViewInfo.hasScript && window.$) { + mainAnimatedPages.removeChild(currentPage); + view = $(view).appendTo(mainAnimatedPages)[0]; } else { - if (newViewInfo.hasScript && window.$) { - view = $(view).appendTo(mainAnimatedPages)[0]; - } else { - mainAnimatedPages.appendChild(view); - } + mainAnimatedPages.replaceChild(view, currentPage); + } + } else { + if (newViewInfo.hasScript && window.$) { + view = $(view).appendTo(mainAnimatedPages)[0]; + } else { + mainAnimatedPages.appendChild(view); + } + } + + if (options.type) { + view.setAttribute('data-type', options.type); + } + + const properties = []; + + if (options.fullscreen) { + properties.push('fullscreen'); + } + + if (properties.length) { + view.setAttribute('data-properties', properties.join(',')); + } + + allPages[pageIndex] = view; + setControllerClass(view, options).then(() => { + if (onBeforeChange) { + onBeforeChange(view, false, options); } - if (options.type) { - view.setAttribute('data-type', options.type); + beforeAnimate(allPages, pageIndex, selected); + selectedPageIndex = pageIndex; + currentUrls[pageIndex] = options.url; + + if (!options.cancel && previousAnimatable) { + afterAnimate(allPages, pageIndex); } - var properties = []; - - if (options.fullscreen) { - properties.push('fullscreen'); + if (window.$) { + $.mobile = $.mobile || {}; + $.mobile.activePage = view; } - if (properties.length) { - view.setAttribute('data-properties', properties.join(',')); - } - - allPages[pageIndex] = view; - setControllerClass(view, options).then(function () { - if (onBeforeChange) { - onBeforeChange(view, false, options); - } - - beforeAnimate(allPages, pageIndex, selected); - selectedPageIndex = pageIndex; - currentUrls[pageIndex] = options.url; - - if (!options.cancel && previousAnimatable) { - afterAnimate(allPages, pageIndex); - } - - if (window.$) { - $.mobile = $.mobile || {}; - $.mobile.activePage = view; - } - - resolve(view); - }); + resolve(view); }); }); } @@ -125,28 +116,28 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta html = replaceAll(html, '<\/script>--\x3e', '<\/script>'); } - var wrapper = document.createElement('div'); + const wrapper = document.createElement('div'); wrapper.innerHTML = html; return wrapper.querySelector('div[data-role="page"]'); } function normalizeNewView(options, isPluginpage) { - var viewHtml = options.view; + const viewHtml = options.view; if (viewHtml.indexOf('data-role="page"') === -1) { return viewHtml; } - var hasScript = viewHtml.indexOf(' { if (onBeforeChange) { onBeforeChange(view, true, options); } @@ -228,25 +219,28 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta view.dispatchEvent(new CustomEvent('viewdestroy', {})); } - function reset() { + export function reset() { allPages = []; currentUrls = []; mainAnimatedPages.innerHTML = ''; selectedPageIndex = -1; } - var onBeforeChange; - var mainAnimatedPages = document.querySelector('.mainAnimatedPages'); - var allPages = []; - var currentUrls = []; - var pageContainerCount = 3; - var selectedPageIndex = -1; + let onBeforeChange; + const mainAnimatedPages = document.querySelector('.mainAnimatedPages'); + let allPages = []; + let currentUrls = []; + const pageContainerCount = 3; + let selectedPageIndex = -1; reset(); mainAnimatedPages.classList.remove('hide'); - return { - loadView: loadView, - tryRestoreView: tryRestoreView, - reset: reset, - setOnBeforeChange: setOnBeforeChange - }; -}); + +/* eslint-enable indent */ + +export default { + loadView: loadView, + tryRestoreView: tryRestoreView, + reset: reset, + setOnBeforeChange: setOnBeforeChange +}; + diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index 058ba4ebb2..00c3018590 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -1,134 +1,134 @@ -define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], function (viewContainer, focusManager, queryString, layoutManager) { - 'use strict'; +import viewContainer from 'viewContainer'; +import focusManager from 'focusManager'; +import queryString from 'queryString'; +import layoutManager from 'layoutManager'; - var currentView; - var dispatchPageEvents; +let currentView; +let dispatchPageEvents; - viewContainer.setOnBeforeChange(function (newView, isRestored, options) { - var lastView = currentView; - if (lastView) { - var beforeHideResult = dispatchViewEvent(lastView, null, 'viewbeforehide', true); +viewContainer.setOnBeforeChange(function (newView, isRestored, options) { + const lastView = currentView; + if (lastView) { + const beforeHideResult = dispatchViewEvent(lastView, null, 'viewbeforehide', true); - if (!beforeHideResult) { - // todo: cancel - } - } - - var eventDetail = getViewEventDetail(newView, options, isRestored); - - if (!newView.initComplete) { - newView.initComplete = true; - - if (typeof options.controllerFactory === 'function') { - new options.controllerFactory(newView, eventDetail.detail.params); - } else if (options.controllerFactory && typeof options.controllerFactory.default === 'function') { - new options.controllerFactory.default(newView, eventDetail.detail.params); - } - - if (!options.controllerFactory || dispatchPageEvents) { - dispatchViewEvent(newView, eventDetail, 'viewinit'); - } - } - - dispatchViewEvent(newView, eventDetail, 'viewbeforeshow'); - }); - - function onViewChange(view, options, isRestore) { - var lastView = currentView; - if (lastView) { - dispatchViewEvent(lastView, null, 'viewhide'); - } - - currentView = view; - - var eventDetail = getViewEventDetail(view, options, isRestore); - - if (!isRestore) { - if (options.autoFocus !== false) { - focusManager.autoFocus(view); - } - } else if (!layoutManager.mobile) { - if (view.activeElement && document.body.contains(view.activeElement) && focusManager.isCurrentlyFocusable(view.activeElement)) { - focusManager.focus(view.activeElement); - } else { - focusManager.autoFocus(view); - } - } - - view.dispatchEvent(new CustomEvent('viewshow', eventDetail)); - - if (dispatchPageEvents) { - view.dispatchEvent(new CustomEvent('pageshow', eventDetail)); + if (!beforeHideResult) { + // todo: cancel } } - function getProperties(view) { - var props = view.getAttribute('data-properties'); + const eventDetail = getViewEventDetail(newView, options, isRestored); - if (props) { - return props.split(','); + if (!newView.initComplete) { + newView.initComplete = true; + + if (typeof options.controllerFactory === 'function') { + new options.controllerFactory(newView, eventDetail.detail.params); + } else if (options.controllerFactory && typeof options.controllerFactory.default === 'function') { + new options.controllerFactory.default(newView, eventDetail.detail.params); } - return []; + if (!options.controllerFactory || dispatchPageEvents) { + dispatchViewEvent(newView, eventDetail, 'viewinit'); + } } - function dispatchViewEvent(view, eventInfo, eventName, isCancellable) { - if (!eventInfo) { - eventInfo = { - detail: { - type: view.getAttribute('data-type'), - properties: getProperties(view) - }, - bubbles: true, - cancelable: isCancellable - }; - } + dispatchViewEvent(newView, eventDetail, 'viewbeforeshow'); +}); - eventInfo.cancelable = isCancellable || false; - - var eventResult = view.dispatchEvent(new CustomEvent(eventName, eventInfo)); - - if (dispatchPageEvents) { - eventInfo.cancelable = false; - view.dispatchEvent(new CustomEvent(eventName.replace('view', 'page'), eventInfo)); - } - - return eventResult; +function onViewChange(view, options, isRestore) { + const lastView = currentView; + if (lastView) { + dispatchViewEvent(lastView, null, 'viewhide'); } - function getViewEventDetail(view, options, isRestore) { - var url = options.url; - var index = url.indexOf('?'); - var params = index === -1 ? {} : queryString.parse(url.substring(index + 1)); + currentView = view; - return { + const eventDetail = getViewEventDetail(view, options, isRestore); + + if (!isRestore) { + if (options.autoFocus !== false) { + focusManager.autoFocus(view); + } + } else if (!layoutManager.mobile) { + if (view.activeElement && document.body.contains(view.activeElement) && focusManager.isCurrentlyFocusable(view.activeElement)) { + focusManager.focus(view.activeElement); + } else { + focusManager.autoFocus(view); + } + } + + view.dispatchEvent(new CustomEvent('viewshow', eventDetail)); + + if (dispatchPageEvents) { + view.dispatchEvent(new CustomEvent('pageshow', eventDetail)); + } +} + +function getProperties(view) { + const props = view.getAttribute('data-properties'); + + if (props) { + return props.split(','); + } + + return []; +} + +function dispatchViewEvent(view, eventInfo, eventName, isCancellable) { + if (!eventInfo) { + eventInfo = { detail: { type: view.getAttribute('data-type'), - properties: getProperties(view), - params: params, - isRestored: isRestore, - state: options.state, - - // The route options - options: options.options || {} + properties: getProperties(view) }, bubbles: true, - cancelable: false + cancelable: isCancellable }; } - function resetCachedViews() { - // Reset all cached views whenever the skin changes - viewContainer.reset(); + eventInfo.cancelable = isCancellable || false; + + const eventResult = view.dispatchEvent(new CustomEvent(eventName, eventInfo)); + + if (dispatchPageEvents) { + eventInfo.cancelable = false; + view.dispatchEvent(new CustomEvent(eventName.replace('view', 'page'), eventInfo)); } - document.addEventListener('skinunload', resetCachedViews); + return eventResult; +} - function ViewManager() { - } +function getViewEventDetail(view, options, isRestore) { + const url = options.url; + const index = url.indexOf('?'); + const params = index === -1 ? {} : queryString.parse(url.substring(index + 1)); - ViewManager.prototype.loadView = function (options) { - var lastView = currentView; + return { + detail: { + type: view.getAttribute('data-type'), + properties: getProperties(view), + params: params, + isRestored: isRestore, + state: options.state, + + // The route options + options: options.options || {} + }, + bubbles: true, + cancelable: false + }; +} + +function resetCachedViews() { + // Reset all cached views whenever the skin changes + viewContainer.reset(); +} + +document.addEventListener('skinunload', resetCachedViews); + +class ViewManager { + loadView(options) { + const lastView = currentView; // Record the element that has focus if (lastView) { @@ -142,9 +142,9 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi viewContainer.loadView(options).then(function (view) { onViewChange(view, options); }); - }; + } - ViewManager.prototype.tryRestoreView = function (options, onViewChanging) { + tryRestoreView(options, onViewChanging) { if (options.cancel) { return Promise.reject({ cancelled: true }); } @@ -158,15 +158,15 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi onViewChanging(); onViewChange(view, options, true); }); - }; + } - ViewManager.prototype.currentView = function () { + currentView() { return currentView; - }; + } - ViewManager.prototype.dispatchPageEvents = function (value) { + dispatchPageEvents(value) { dispatchPageEvents = value; - }; + } +} - return new ViewManager(); -}); +export default new ViewManager(); diff --git a/src/components/viewSettings/viewSettings.js b/src/components/viewSettings/viewSettings.js index 67abc25a9c..fd5b5c3f9e 100644 --- a/src/components/viewSettings/viewSettings.js +++ b/src/components/viewSettings/viewSettings.js @@ -1,57 +1,66 @@ -define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'userSettings', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dialogHelper, loading, appHost, layoutManager, connectionManager, appRouter, globalize, userSettings) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import layoutManager from 'layoutManager'; +import globalize from 'globalize'; +import * as userSettings from 'userSettings'; +import 'emby-checkbox'; +import 'emby-input'; +import 'paper-icon-button-light'; +import 'emby-select'; +import 'material-icons'; +import 'css!./../formdialog'; +import 'emby-button'; +import 'flexStyles'; - function onSubmit(e) { - e.preventDefault(); - return false; +function onSubmit(e) { + e.preventDefault(); + return false; +} + +function initEditor(context, settings) { + context.querySelector('form').addEventListener('submit', onSubmit); + + const elems = context.querySelectorAll('.viewSetting-checkboxContainer'); + + for (const elem of elems) { + elem.querySelector('input').checked = settings[elem.getAttribute('data-settingname')] || false; } - function initEditor(context, settings) { - context.querySelector('form').addEventListener('submit', onSubmit); + context.querySelector('.selectImageType').value = settings.imageType || 'primary'; +} - var elems = context.querySelectorAll('.viewSetting-checkboxContainer'); - - for (var i = 0, length = elems.length; i < length; i++) { - elems[i].querySelector('input').checked = settings[elems[i].getAttribute('data-settingname')] || false; - } - - context.querySelector('.selectImageType').value = settings.imageType || 'primary'; +function saveValues(context, settings, settingsKey) { + const elems = context.querySelectorAll('.viewSetting-checkboxContainer'); + for (const elem of elems) { + userSettings.set(settingsKey + '-' + elem.getAttribute('data-settingname'), elem.querySelector('input').checked); } - function saveValues(context, settings, settingsKey) { - var elems = context.querySelectorAll('.viewSetting-checkboxContainer'); - for (var i = 0, length = elems.length; i < length; i++) { - userSettings.set(settingsKey + '-' + elems[i].getAttribute('data-settingname'), elems[i].querySelector('input').checked); - } + userSettings.set(settingsKey + '-imageType', context.querySelector('.selectImageType').value); +} - userSettings.set(settingsKey + '-imageType', context.querySelector('.selectImageType').value); +function centerFocus(elem, horiz, on) { + import('scrollHelper').then(({default: scrollHelper}) => { + const fn = on ? 'on' : 'off'; + scrollHelper.centerFocus[fn](elem, horiz); + }); +} + +function showIfAllowed(context, selector, visible) { + const elem = context.querySelector(selector); + + if (visible && !elem.classList.contains('hiddenFromViewSettings')) { + elem.classList.remove('hide'); + } else { + elem.classList.add('hide'); } +} - function centerFocus(elem, horiz, on) { - require(['scrollHelper'], function (scrollHelper) { - var fn = on ? 'on' : 'off'; - scrollHelper.centerFocus[fn](elem, horiz); - }); +class ViewSettings { + constructor() { } - - function showIfAllowed(context, selector, visible) { - var elem = context.querySelector(selector); - - if (visible && !elem.classList.contains('hiddenFromViewSettings')) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - } - - function ViewSettings() { - - } - - ViewSettings.prototype.show = function (options) { + show(options) { return new Promise(function (resolve, reject) { - require(['text!./viewSettings.template.html'], function (template) { - var dialogOptions = { + import('text!./viewSettings.template.html').then(({default: template}) => { + const dialogOptions = { removeOnClose: true, scrollY: false }; @@ -62,11 +71,11 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne dialogOptions.size = 'small'; } - var dlg = dialogHelper.createDialog(dialogOptions); + const dlg = dialogHelper.createDialog(dialogOptions); dlg.classList.add('formDialog'); - var html = ''; + let html = ''; html += '
'; html += ''; @@ -78,14 +87,14 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne dlg.innerHTML = globalize.translateHtml(html, 'core'); - var settingElements = dlg.querySelectorAll('.viewSetting'); - for (var i = 0, length = settingElements.length; i < length; i++) { - if (options.visibleSettings.indexOf(settingElements[i].getAttribute('data-settingname')) === -1) { - settingElements[i].classList.add('hide'); - settingElements[i].classList.add('hiddenFromViewSettings'); + const settingElements = dlg.querySelectorAll('.viewSetting'); + for (const settingElement of settingElements) { + if (options.visibleSettings.indexOf(settingElement.getAttribute('data-settingname')) === -1) { + settingElement.classList.add('hide'); + settingElement.classList.add('hiddenFromViewSettings'); } else { - settingElements[i].classList.remove('hide'); - settingElements[i].classList.remove('hiddenFromViewSettings'); + settingElement.classList.remove('hide'); + settingElement.classList.remove('hiddenFromViewSettings'); } } @@ -104,7 +113,7 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne centerFocus(dlg.querySelector('.formDialogContent'), false, true); } - var submitted; + let submitted; dlg.querySelector('.selectImageType').dispatchEvent(new CustomEvent('change', {})); @@ -127,7 +136,7 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne }); }); }); - }; + } +} - return ViewSettings; -}); +export default ViewSettings; diff --git a/src/config.template.json b/src/config.template.json index 4b22a699d6..9d98e8b6f7 100644 --- a/src/config.template.json +++ b/src/config.template.json @@ -1,3 +1,38 @@ { - "multiserver": false + "multiserver": false, + "themes": [ + { + "name": "Apple TV", + "id": "appletv" + }, { + "name": "Blue Radiance", + "id": "blueradiance" + }, { + "name": "Dark", + "id": "dark", + "default": true + }, { + "name": "Light", + "id": "light" + }, { + "name": "Purple Haze", + "id": "purplehaze" + }, { + "name": "WMC", + "id": "wmc" + } + ], + "plugins": [ + "plugins/playAccessValidation/plugin", + "plugins/experimentalWarnings/plugin", + "plugins/htmlAudioPlayer/plugin", + "plugins/htmlVideoPlayer/plugin", + "plugins/photoPlayer/plugin", + "plugins/bookPlayer/plugin", + "plugins/youtubePlayer/plugin", + "plugins/backdropScreensaver/plugin", + "plugins/logoScreensaver/plugin", + "plugins/sessionPlayer/plugin", + "plugins/chromecastPlayer/plugin" + ] } diff --git a/src/apikeys.html b/src/controllers/dashboard/apikeys.html similarity index 94% rename from src/apikeys.html rename to src/controllers/dashboard/apikeys.html index 3cb7cd6de1..400a3e5f60 100644 --- a/src/apikeys.html +++ b/src/controllers/dashboard/apikeys.html @@ -3,7 +3,7 @@

${HeaderApiKeys}

-
diff --git a/src/dashboard.html b/src/controllers/dashboard/dashboard.html similarity index 100% rename from src/dashboard.html rename to src/controllers/dashboard/dashboard.html diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 61fc345382..a1ce7f489e 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -24,7 +24,7 @@ import 'emby-itemscontainer'; function showPlaybackInfo(btn, session) { import('alert').then(({default: alert}) => { let title; - let text = []; + const text = []; const displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); if (displayPlayMethod === 'DirectStream') { @@ -737,7 +737,7 @@ import 'emby-itemscontainer'; shutdown: function (btn) { import('confirm').then(({default: confirm}) => { confirm({ - title: globalize.translate('HeaderShutdown'), + title: globalize.translate('ButtonShutdown'), text: globalize.translate('MessageConfirmShutdown'), confirmText: globalize.translate('ButtonShutdown'), primary: 'delete' diff --git a/src/device.html b/src/controllers/dashboard/devices/device.html similarity index 91% rename from src/device.html rename to src/controllers/dashboard/devices/device.html index 093b311208..aec73db008 100644 --- a/src/device.html +++ b/src/controllers/dashboard/devices/device.html @@ -9,13 +9,13 @@
- +
${LabelCustomDeviceDisplayNameHelp}
diff --git a/src/devices.html b/src/controllers/dashboard/devices/devices.html similarity index 97% rename from src/devices.html rename to src/controllers/dashboard/devices/devices.html index 55f51d7e23..63c348c900 100644 --- a/src/devices.html +++ b/src/controllers/dashboard/devices/devices.html @@ -3,7 +3,7 @@
-

${TabDevices}

+

${HeaderDevices}

${Help}
diff --git a/src/controllers/dashboard/devices/devices.js b/src/controllers/dashboard/devices/devices.js index 93ae62c43f..1178a0f1bd 100644 --- a/src/controllers/dashboard/devices/devices.js +++ b/src/controllers/dashboard/devices/devices.js @@ -21,7 +21,7 @@ import 'cardStyle'; confirm({ text: msg, title: globalize.translate('HeaderDeleteDevice'), - confirmText: globalize.translate('ButtonDelete'), + confirmText: globalize.translate('Delete'), primary: 'delete' }).then(function () { loading.show(); @@ -38,7 +38,7 @@ import 'cardStyle'; } function showDeviceMenu(view, btn, deviceId) { - let menuItems = []; + const menuItems = []; if (canEdit) { menuItems.push({ diff --git a/src/dlnaprofile.html b/src/controllers/dashboard/dlna/profile.html similarity index 97% rename from src/dlnaprofile.html rename to src/controllers/dashboard/dlna/profile.html index 01636e6019..3ac3a71c6c 100644 --- a/src/dlnaprofile.html +++ b/src/controllers/dashboard/dlna/profile.html @@ -8,9 +8,9 @@
- ${TabInfo} + ${ButtonInfo} ${TabDirectPlay} - ${TabTranscoding} + ${Transcoding} ${TabContainers} ${TabCodecs} ${TabResponses} @@ -96,14 +96,14 @@

${HeaderHttpHeaders}

-
-
+

@@ -209,7 +209,7 @@

${HeaderSubtitleProfilesHelp}


@@ -219,7 +219,7 @@

${HeaderXmlDocumentAttributes}

-
@@ -231,38 +231,38 @@

${HeaderDirectPlayProfileHelp}

- +

${HeaderTranscodingProfileHelp}

- +

${HeaderContainerProfileHelp}

- +

${HeaderCodecProfileHelp}

- +

${HeaderResponseProfileHelp}

- +

- +
- +
- +
diff --git a/src/controllers/dashboard/dlna/profile.js b/src/controllers/dashboard/dlna/profile.js index 17dc9f78cb..478b5ca878 100644 --- a/src/controllers/dashboard/dlna/profile.js +++ b/src/controllers/dashboard/dlna/profile.js @@ -315,7 +315,7 @@ import 'listViewStyle'; let currentType; for (let i = 0, length = profiles.length; i < length; i++) { - let profile = profiles[i]; + const profile = profiles[i]; if (profile.Type !== currentType) { html += '
  • ' + profile.Type + '
  • '; @@ -401,7 +401,7 @@ import 'listViewStyle'; let currentType; for (let i = 0, length = profiles.length; i < length; i++) { - let profile = profiles[i]; + const profile = profiles[i]; if (profile.Type !== currentType) { html += '
  • ' + profile.Type + '
  • '; @@ -472,7 +472,7 @@ import 'listViewStyle'; let currentType; for (let i = 0, length = profiles.length; i < length; i++) { - let profile = profiles[i]; + const profile = profiles[i]; const type = profile.Type.replace('VideoAudio', 'Video Audio'); if (type !== currentType) { @@ -696,7 +696,7 @@ import 'listViewStyle'; let currentProfile; let currentSubProfile; let isSubProfileNew; - const allText = globalize.translate('LabelAll'); + const allText = globalize.translate('All'); $(document).on('pageinit', '#dlnaProfilePage', function () { const page = this; diff --git a/src/dlnaprofiles.html b/src/controllers/dashboard/dlna/profiles.html similarity index 100% rename from src/dlnaprofiles.html rename to src/controllers/dashboard/dlna/profiles.html diff --git a/src/controllers/dashboard/dlna/profiles.js b/src/controllers/dashboard/dlna/profiles.js index 7fd3bdb525..cdfdcf8212 100644 --- a/src/controllers/dashboard/dlna/profiles.js +++ b/src/controllers/dashboard/dlna/profiles.js @@ -36,7 +36,7 @@ import 'emby-button'; } for (let i = 0, length = profiles.length; i < length; i++) { - let profile = profiles[i]; + const profile = profiles[i]; html += '
    '; html += ''; html += '
    '; @@ -46,7 +46,7 @@ import 'emby-button'; html += '
    '; if (profile.Type == 'User') { - html += ''; + html += ''; } html += '
    '; diff --git a/src/dlnasettings.html b/src/controllers/dashboard/dlna/settings.html similarity index 98% rename from src/dlnasettings.html rename to src/controllers/dashboard/dlna/settings.html index 703dd66a9f..0a78782f89 100644 --- a/src/dlnasettings.html +++ b/src/controllers/dashboard/dlna/settings.html @@ -59,7 +59,7 @@
    diff --git a/src/encodingsettings.html b/src/controllers/dashboard/encodingsettings.html similarity index 98% rename from src/encodingsettings.html rename to src/controllers/dashboard/encodingsettings.html index 858375b145..402532e600 100644 --- a/src/encodingsettings.html +++ b/src/controllers/dashboard/encodingsettings.html @@ -4,7 +4,7 @@
    -

    ${TabTranscoding}

    +

    ${Transcoding}

    ${Help}
    @@ -176,7 +176,7 @@
    diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index 9995577ba8..dfad07618c 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -45,10 +45,10 @@ import libraryMenu from 'libraryMenu'; return ApiClient.ajax({ url: ApiClient.getUrl('System/MediaEncoder/Path'), type: 'POST', - data: { + data: JSON.stringify({ Path: form.querySelector('.txtEncoderPath').value, PathType: 'Custom' - } + }) }).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure); }); } @@ -81,7 +81,7 @@ import libraryMenu from 'libraryMenu'; updateEncoder(form); }, function () { import('alert').then(({default: alert}) => { - alert(globalize.translate('DefaultErrorMessage')); + alert(globalize.translate('ErrorDefault')); }); Dashboard.processServerConfigurationUpdateResult(); @@ -128,7 +128,7 @@ import libraryMenu from 'libraryMenu'; name: globalize.translate('Transcoding') }, { href: 'playbackconfiguration.html', - name: globalize.translate('TabResumeSettings') + name: globalize.translate('ButtonResume') }, { href: 'streamingsettings.html', name: globalize.translate('TabStreaming') diff --git a/src/dashboardgeneral.html b/src/controllers/dashboard/general.html similarity index 94% rename from src/dashboardgeneral.html rename to src/controllers/dashboard/general.html index 99e6414dd6..e3a1769c24 100644 --- a/src/dashboardgeneral.html +++ b/src/controllers/dashboard/general.html @@ -17,9 +17,9 @@
    -
    ${LabelPreferredDisplayLanguageHelp}
    +
    ${LabelDisplayLanguageHelp}
    @@ -63,7 +63,7 @@
    diff --git a/src/controllers/dashboard/general.js b/src/controllers/dashboard/general.js index 8e30749aba..eb819dc415 100644 --- a/src/controllers/dashboard/general.js +++ b/src/controllers/dashboard/general.js @@ -52,7 +52,7 @@ import 'emby-button'; }); }, function () { import('alert').then(({default: alert}) => { - alert(globalize.translate('DefaultErrorMessage')); + alert(globalize.translate('ErrorDefault')); }); Dashboard.processServerConfigurationUpdateResult(); diff --git a/src/library.html b/src/controllers/dashboard/library.html similarity index 100% rename from src/library.html rename to src/controllers/dashboard/library.html diff --git a/src/controllers/dashboard/mediaLibrary.js b/src/controllers/dashboard/library.js similarity index 98% rename from src/controllers/dashboard/mediaLibrary.js rename to src/controllers/dashboard/library.js index 4fee65e674..85d9a4b1b2 100644 --- a/src/controllers/dashboard/mediaLibrary.js +++ b/src/controllers/dashboard/library.js @@ -93,7 +93,7 @@ import 'emby-itemrefreshindicator'; const virtualFolder = virtualFolders[index]; const menuItems = []; menuItems.push({ - name: globalize.translate('ButtonEditImages'), + name: globalize.translate('EditImages'), id: 'editimages', icon: 'photo' }); @@ -363,10 +363,10 @@ import 'emby-itemrefreshindicator'; name: globalize.translate('HeaderLibraries') }, { href: 'librarydisplay.html', - name: globalize.translate('TabDisplay') + name: globalize.translate('Display') }, { href: 'metadataimages.html', - name: globalize.translate('TabMetadata') + name: globalize.translate('Metadata') }, { href: 'metadatanfo.html', name: globalize.translate('TabNfoSettings') diff --git a/src/librarydisplay.html b/src/controllers/dashboard/librarydisplay.html similarity index 98% rename from src/librarydisplay.html rename to src/controllers/dashboard/librarydisplay.html index 25dce48223..04a8554823 100644 --- a/src/librarydisplay.html +++ b/src/controllers/dashboard/librarydisplay.html @@ -49,7 +49,7 @@
    diff --git a/src/controllers/dashboard/librarydisplay.js b/src/controllers/dashboard/librarydisplay.js index bbc7e633d1..06e366b988 100644 --- a/src/controllers/dashboard/librarydisplay.js +++ b/src/controllers/dashboard/librarydisplay.js @@ -12,10 +12,10 @@ import 'emby-button'; name: globalize.translate('HeaderLibraries') }, { href: 'librarydisplay.html', - name: globalize.translate('TabDisplay') + name: globalize.translate('Display') }, { href: 'metadataimages.html', - name: globalize.translate('TabMetadata') + name: globalize.translate('Metadata') }, { href: 'metadatanfo.html', name: globalize.translate('TabNfoSettings') diff --git a/src/log.html b/src/controllers/dashboard/logs.html similarity index 100% rename from src/log.html rename to src/controllers/dashboard/logs.html diff --git a/src/controllers/dashboard/metadataImages.js b/src/controllers/dashboard/metadataImages.js index 02e01736ea..649ca9ac31 100644 --- a/src/controllers/dashboard/metadataImages.js +++ b/src/controllers/dashboard/metadataImages.js @@ -55,10 +55,10 @@ import 'listViewStyle'; name: globalize.translate('HeaderLibraries') }, { href: 'librarydisplay.html', - name: globalize.translate('TabDisplay') + name: globalize.translate('Display') }, { href: 'metadataimages.html', - name: globalize.translate('TabMetadata') + name: globalize.translate('Metadata') }, { href: 'metadatanfo.html', name: globalize.translate('TabNfoSettings') diff --git a/src/metadataimages.html b/src/controllers/dashboard/metadataimages.html similarity index 92% rename from src/metadataimages.html rename to src/controllers/dashboard/metadataimages.html index 8ad129256c..48a9977054 100644 --- a/src/metadataimages.html +++ b/src/controllers/dashboard/metadataimages.html @@ -17,7 +17,7 @@

    -
    +
    diff --git a/src/metadatanfo.html b/src/controllers/dashboard/metadatanfo.html similarity index 97% rename from src/metadatanfo.html rename to src/controllers/dashboard/metadatanfo.html index 4005c74f67..44d1cc06f6 100644 --- a/src/metadatanfo.html +++ b/src/controllers/dashboard/metadatanfo.html @@ -41,7 +41,7 @@
    ${LabelKodiMetadataEnableExtraThumbsHelp}
    -
    +
    diff --git a/src/controllers/dashboard/metadatanfo.js b/src/controllers/dashboard/metadatanfo.js index f1b768d18b..f33971b369 100644 --- a/src/controllers/dashboard/metadatanfo.js +++ b/src/controllers/dashboard/metadatanfo.js @@ -52,10 +52,10 @@ import globalize from 'globalize'; name: globalize.translate('HeaderLibraries') }, { href: 'librarydisplay.html', - name: globalize.translate('TabDisplay') + name: globalize.translate('Display') }, { href: 'metadataimages.html', - name: globalize.translate('TabMetadata') + name: globalize.translate('Metadata') }, { href: 'metadatanfo.html', name: globalize.translate('TabNfoSettings') diff --git a/src/networking.html b/src/controllers/dashboard/networking.html similarity index 99% rename from src/networking.html rename to src/controllers/dashboard/networking.html index 74ddefb87b..899d0976b7 100644 --- a/src/networking.html +++ b/src/controllers/dashboard/networking.html @@ -112,7 +112,7 @@
    diff --git a/src/controllers/dashboard/notifications/notification/index.html b/src/controllers/dashboard/notifications/notification/index.html index 67b35981f1..99bed59887 100644 --- a/src/controllers/dashboard/notifications/notification/index.html +++ b/src/controllers/dashboard/notifications/notification/index.html @@ -54,7 +54,7 @@

    '; - itemHtml += ''; - } - itemHtml += '
    '; - itemHtml += '
    '; - itemHtml += '

    '; - itemHtml += notification.Category; - itemHtml += '

    '; - if (showHelp) { - showHelp = false; - itemHtml += ''; - itemHtml += globalize.translate('Help'); - itemHtml += ''; - } +function reload(page) { + loading.show(); + ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')).then(function (list) { + let html = ''; + let lastCategory = ''; + let showHelp = true; + html += list.map(function (notification) { + let itemHtml = ''; + if (notification.Category !== lastCategory) { + lastCategory = notification.Category; + if (lastCategory) { + itemHtml += '
    '; itemHtml += '
    '; - itemHtml += '
    '; } - itemHtml += ''; - if (notification.Enabled) { - itemHtml += ''; - } else { - itemHtml += ''; + itemHtml += '
    '; + itemHtml += '
    '; + itemHtml += '

    '; + itemHtml += notification.Category; + itemHtml += '

    '; + if (showHelp) { + showHelp = false; + itemHtml += '
    '; + itemHtml += globalize.translate('Help'); + itemHtml += ''; } - itemHtml += '
    '; - itemHtml += '
    ' + notification.Name + '
    '; itemHtml += '
    '; - itemHtml += ''; - itemHtml += ''; - return itemHtml; - }).join(''); - - if (list.length) { - html += '
    '; - html += '
    '; + itemHtml += '
    '; } - page.querySelector('.notificationList').innerHTML = html; - loading.hide(); - }); - } + itemHtml += ''; + if (notification.Enabled) { + itemHtml += ''; + } else { + itemHtml += ''; + } + itemHtml += '
    '; + itemHtml += '
    ' + notification.Name + '
    '; + itemHtml += '
    '; + itemHtml += ''; + itemHtml += '
    '; + return itemHtml; + }).join(''); - return function(view, params) { - view.addEventListener('viewshow', function() { - reload(view); - }); - }; -}); + if (list.length) { + html += '
    '; + html += '
    '; + } + page.querySelector('.notificationList').innerHTML = html; + loading.hide(); + }); +} + +export default function (view, params) { + view.addEventListener('viewshow', function () { + reload(view); + }); +} diff --git a/src/playbackconfiguration.html b/src/controllers/dashboard/playback.html similarity index 91% rename from src/playbackconfiguration.html rename to src/controllers/dashboard/playback.html index 9deeeebbcd..e5f392ead4 100644 --- a/src/playbackconfiguration.html +++ b/src/controllers/dashboard/playback.html @@ -3,7 +3,7 @@
    -

    ${TabResumeSettings}

    +

    ${ButtonResume}

    @@ -23,7 +23,7 @@ ${LabelMinResumeDurationHelp}
    -
    +
    diff --git a/src/controllers/dashboard/playback.js b/src/controllers/dashboard/playback.js index 0406c21926..101c3ac0a2 100644 --- a/src/controllers/dashboard/playback.js +++ b/src/controllers/dashboard/playback.js @@ -32,7 +32,7 @@ import globalize from 'globalize'; name: globalize.translate('Transcoding') }, { href: 'playbackconfiguration.html', - name: globalize.translate('TabResumeSettings') + name: globalize.translate('ButtonResume') }, { href: 'streamingsettings.html', name: globalize.translate('TabStreaming') diff --git a/src/controllers/dashboard/plugins/add/index.js b/src/controllers/dashboard/plugins/add/index.js index a3c450dd79..5cc1dd3215 100644 --- a/src/controllers/dashboard/plugins/add/index.js +++ b/src/controllers/dashboard/plugins/add/index.js @@ -1,141 +1,146 @@ -define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'connectionManager', 'emby-button'], function ($, loading, libraryMenu, globalize, connectionManager) { - 'use strict'; +import $ from 'jQuery'; +import loading from 'loading'; +import globalize from 'globalize'; +import 'emby-button'; - function populateHistory(packageInfo, page) { - var html = ''; - var length = Math.min(packageInfo.versions.length, 10); +function populateHistory(packageInfo, page) { + let html = ''; + const length = Math.min(packageInfo.versions.length, 10); - for (var i = 0; i < length; i++) { - var version = packageInfo.versions[i]; - html += '

    ' + version.version + '

    '; - html += '
    ' + version.changelog + '
    '; - } - - $('#revisionHistory', page).html(html); + for (let i = 0; i < length; i++) { + const version = packageInfo.versions[i]; + html += '

    ' + version.version + '

    '; + html += '
    ' + version.changelog + '
    '; } - function populateVersions(packageInfo, page, installedPlugin) { - var html = ''; + $('#revisionHistory', page).html(html); +} - for (var i = 0; i < packageInfo.versions.length; i++) { - var version = packageInfo.versions[i]; - html += ''; - } +function populateVersions(packageInfo, page, installedPlugin) { + let html = ''; - var selectmenu = $('#selectVersion', page).html(html); - - if (!installedPlugin) { - $('#pCurrentVersion', page).hide().html(''); - } - - var packageVersion = packageInfo.versions[0]; - if (packageVersion) { - selectmenu.val(packageVersion.version); - } + for (let i = 0; i < packageInfo.versions.length; i++) { + const version = packageInfo.versions[i]; + html += ''; } - function renderPackage(pkg, installedPlugins, page) { - var installedPlugin = installedPlugins.filter(function (ip) { - return ip.Name == pkg.name; - })[0]; + const selectmenu = $('#selectVersion', page).html(html); - populateVersions(pkg, page, installedPlugin); - populateHistory(pkg, page); - - $('.pluginName', page).html(pkg.name); - $('#btnInstallDiv', page).removeClass('hide'); - $('#pSelectVersion', page).removeClass('hide'); - - if (pkg.overview) { - $('#overview', page).show().html(pkg.overview); - } else { - $('#overview', page).hide(); - } - - $('#description', page).html(pkg.description); - $('#developer', page).html(pkg.owner); - - if (installedPlugin) { - var currentVersionText = globalize.translate('MessageYouHaveVersionInstalled', '' + installedPlugin.Version + ''); - $('#pCurrentVersion', page).show().html(currentVersionText); - } else { - $('#pCurrentVersion', page).hide().html(''); - } - - loading.hide(); + if (!installedPlugin) { + $('#pCurrentVersion', page).hide().html(''); } - function alertText(options) { - require(['alert'], function ({default: alert}) { - alert(options); - }); + const packageVersion = packageInfo.versions[0]; + if (packageVersion) { + selectmenu.val(packageVersion.version); + } +} + +function renderPackage(pkg, installedPlugins, page) { + const installedPlugin = installedPlugins.filter(function (ip) { + return ip.Name == pkg.name; + })[0]; + + populateVersions(pkg, page, installedPlugin); + populateHistory(pkg, page); + + $('.pluginName', page).html(pkg.name); + $('#btnInstallDiv', page).removeClass('hide'); + $('#pSelectVersion', page).removeClass('hide'); + + if (pkg.overview) { + $('#overview', page).show().html(pkg.overview); + } else { + $('#overview', page).hide(); } - function performInstallation(page, name, guid, version) { - var developer = $('#developer', page).html().toLowerCase(); + $('#description', page).html(pkg.description); + $('#developer', page).html(pkg.owner); - var alertCallback = function () { - loading.show(); - page.querySelector('#btnInstall').disabled = true; - ApiClient.installPlugin(name, guid, version).then(function () { - loading.hide(); - alertText(globalize.translate('PluginInstalledMessage')); - }); - }; + if (installedPlugin) { + const currentVersionText = globalize.translate('MessageYouHaveVersionInstalled', '' + installedPlugin.Version + ''); + $('#pCurrentVersion', page).show().html(currentVersionText); + } else { + $('#pCurrentVersion', page).hide().html(''); + } - if (developer !== 'jellyfin') { + loading.hide(); +} + +function alertText(options) { + import('alert').then(({default: alert}) => { + alert(options); + }); +} + +function performInstallation(page, name, guid, version) { + const developer = $('#developer', page).html().toLowerCase(); + + const alertCallback = function () { + loading.show(); + page.querySelector('#btnInstall').disabled = true; + ApiClient.installPlugin(name, guid, version).then(() => { loading.hide(); - var msg = globalize.translate('MessagePluginInstallDisclaimer'); - msg += '
    '; - msg += '
    '; - msg += globalize.translate('PleaseConfirmPluginInstallation'); - - require(['confirm'], function (confirm) { - confirm.default(msg, globalize.translate('HeaderConfirmPluginInstallation')).then(function () { - alertCallback(); - }, function () { - console.debug('plugin not installed'); - }); - }); - } else { - alertCallback(); - } - } - - return function (view, params) { - $('.addPluginForm', view).on('submit', function () { - loading.show(); - var page = $(this).parents('#addPluginPage')[0]; - var name = params.name; - var guid = params.guid; - ApiClient.getInstalledPlugins().then(function (plugins) { - var installedPlugin = plugins.filter(function (plugin) { - return plugin.Name == name; - })[0]; - - var version = $('#selectVersion', page).val(); - if (installedPlugin && installedPlugin.Version === version) { - loading.hide(); - Dashboard.alert({ - message: globalize.translate('MessageAlreadyInstalled'), - title: globalize.translate('HeaderPluginInstallation') - }); - } else { - performInstallation(page, name, guid, version); - } - }); - return false; - }); - view.addEventListener('viewshow', function () { - var page = this; - loading.show(); - var name = params.name; - var guid = params.guid; - var promise1 = ApiClient.getPackageInfo(name, guid); - var promise2 = ApiClient.getInstalledPlugins(); - Promise.all([promise1, promise2]).then(function (responses) { - renderPackage(responses[0], responses[1], page); - }); + alertText(globalize.translate('MessagePluginInstalled')); + }).catch(() => { + alertText(globalize.translate('MessagePluginInstallError')); }); }; -}); + + if (developer !== 'jellyfin') { + loading.hide(); + let msg = globalize.translate('MessagePluginInstallDisclaimer'); + msg += '
    '; + msg += '
    '; + msg += globalize.translate('PleaseConfirmPluginInstallation'); + + import('confirm').then(({default: confirm}) => { + confirm(msg, globalize.translate('HeaderConfirmPluginInstallation')).then(function () { + alertCallback(); + }).catch(() => { + console.debug('plugin not installed'); + }); + }); + } else { + alertCallback(); + } +} + +export default function(view, params) { + $('.addPluginForm', view).on('submit', function () { + loading.show(); + const page = $(this).parents('#addPluginPage')[0]; + const name = params.name; + const guid = params.guid; + ApiClient.getInstalledPlugins().then(function (plugins) { + const installedPlugin = plugins.filter(function (plugin) { + return plugin.Name == name; + })[0]; + + const version = $('#selectVersion', page).val(); + if (installedPlugin && installedPlugin.Version === version) { + loading.hide(); + Dashboard.alert({ + message: globalize.translate('MessageAlreadyInstalled'), + title: globalize.translate('HeaderPluginInstallation') + }); + } else { + performInstallation(page, name, guid, version); + } + }).catch(() => { + alertText(globalize.translate('MessageGetInstalledPluginsError')); + }); + return false; + }); + view.addEventListener('viewshow', function () { + const page = this; + loading.show(); + const name = params.name; + const guid = params.guid; + const promise1 = ApiClient.getPackageInfo(name, guid); + const promise2 = ApiClient.getInstalledPlugins(); + Promise.all([promise1, promise2]).then(function (responses) { + renderPackage(responses[0], responses[1], page); + }); + }); +} diff --git a/src/controllers/dashboard/plugins/available/index.js b/src/controllers/dashboard/plugins/available/index.js index e27a3298da..b7c3505aa1 100644 --- a/src/controllers/dashboard/plugins/available/index.js +++ b/src/controllers/dashboard/plugins/available/index.js @@ -1,141 +1,142 @@ -define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby-checkbox', 'emby-select'], function (loading, libraryMenu, globalize) { - 'use strict'; +import loading from 'loading'; +import libraryMenu from 'libraryMenu'; +import globalize from 'globalize'; +import 'cardStyle'; +import 'emby-button'; +import 'emby-checkbox'; +import 'emby-select'; - function reloadList(page) { - loading.show(); - var promise1 = ApiClient.getAvailablePlugins(); - var promise2 = ApiClient.getInstalledPlugins(); - Promise.all([promise1, promise2]).then(function (responses) { - populateList({ - catalogElement: page.querySelector('#pluginTiles'), - noItemsElement: page.querySelector('#noPlugins'), - availablePlugins: responses[0], - installedPlugins: responses[1] - }); +function reloadList(page) { + loading.show(); + const promise1 = ApiClient.getAvailablePlugins(); + const promise2 = ApiClient.getInstalledPlugins(); + Promise.all([promise1, promise2]).then(function (responses) { + populateList({ + catalogElement: page.querySelector('#pluginTiles'), + noItemsElement: page.querySelector('#noPlugins'), + availablePlugins: responses[0], + installedPlugins: responses[1] }); + }); +} + +function getHeaderText(category) { + category = category.replace(' ', ''); + // TODO: Replace with switch + if (category === 'Channel') { + category = 'Channels'; + } else if (category === 'Theme') { + category = 'Themes'; + } else if (category === 'LiveTV') { + category = 'LiveTV'; + } else if (category === 'ScreenSaver') { + category = 'HeaderScreenSavers'; } - function getHeaderText(category) { - category = category.replace(' ', ''); - if (category === 'Channel') { - category = 'Channels'; - } else if (category === 'Theme') { - category = 'Themes'; - } else if (category === 'LiveTV') { - category = 'HeaderLiveTV'; - } else if (category === 'ScreenSaver') { - category = 'HeaderScreenSavers'; + return globalize.translate(category); +} + +function populateList(options) { + const availablePlugins = options.availablePlugins; + const installedPlugins = options.installedPlugins; + + availablePlugins.forEach(function (plugin, index, array) { + plugin.category = plugin.category || 'General'; + plugin.categoryDisplayName = getHeaderText(plugin.category); + array[index] = plugin; + }); + + availablePlugins.sort(function (a, b) { + if (a.category > b.category) { + return 1; + } else if (b.category > a.category) { + return -1; } + if (a.name > b.name) { + return 1; + } else if (b.name > a.name) { + return -1; + } + return 0; + }); - return globalize.translate(category); - } + let currentCategory = null; + let html = ''; - function populateList(options) { - var availablePlugins = options.availablePlugins; - var installedPlugins = options.installedPlugins; - - availablePlugins.forEach(function (plugin, index, array) { - plugin.category = plugin.category || 'General'; - plugin.categoryDisplayName = getHeaderText(plugin.category); - array[index] = plugin; - }); - - availablePlugins.sort(function (a, b) { - if (a.category > b.category) { - return 1; - } else if (b.category > a.category) { - return -1; + for (let i = 0; i < availablePlugins.length; i++) { + const plugin = availablePlugins[i]; + const category = plugin.categoryDisplayName; + if (category != currentCategory) { + if (currentCategory) { + html += ''; + html += ''; } - if (a.name > b.name) { - return 1; - } else if (b.name > a.name) { - return -1; - } - return 0; - }); - - var currentCategory = null; - var html = ''; - - for (var i = 0; i < availablePlugins.length; i++) { - var plugin = availablePlugins[i]; - var category = plugin.categoryDisplayName; - if (category != currentCategory) { - if (currentCategory) { - html += ''; - html += ''; - } - html += '
    '; - html += '

    ' + category + '

    '; - html += '
    '; - currentCategory = category; - } - html += getPluginHtml(plugin, options, installedPlugins); + html += '
    '; + html += '

    ' + category + '

    '; + html += '
    '; + currentCategory = category; } - html += '
    '; - html += '
    '; + html += getPluginHtml(plugin, options, installedPlugins); + } + html += '
    '; + html += '
    '; - if (!availablePlugins.length && options.noItemsElement) { - options.noItemsElement.classList.remove('hide'); - } - - options.catalogElement.innerHTML = html; - loading.hide(); + if (!availablePlugins.length && options.noItemsElement) { + options.noItemsElement.classList.remove('hide'); } - function getPluginHtml(plugin, options, installedPlugins) { - var html = ''; - var href = plugin.externalUrl ? plugin.externalUrl : 'addplugin.html?name=' + encodeURIComponent(plugin.name) + '&guid=' + plugin.guid; + options.catalogElement.innerHTML = html; + loading.hide(); +} - if (options.context) { - href += '&context=' + options.context; - } +function getPluginHtml(plugin, options, installedPlugins) { + let html = ''; + let href = plugin.externalUrl ? plugin.externalUrl : 'addplugin.html?name=' + encodeURIComponent(plugin.name) + '&guid=' + plugin.guid; - var target = plugin.externalUrl ? ' target="_blank"' : ''; - html += "
    "; - html += '
    '; - html += '
    '; - html += '
    '; - html += ''; - html += ''; - html += ''; - html += '
    '; - html += '
    '; - html += "
    "; - html += plugin.name; - html += '
    '; - var installedPlugin = installedPlugins.filter(function (ip) { - return ip.Id == plugin.guid; - })[0]; - html += "
    "; - html += installedPlugin ? globalize.translate('LabelVersionInstalled', installedPlugin.Version) : ' '; - html += '
    '; - html += '
    '; - html += '
    '; - return html += '
    '; + if (options.context) { + href += '&context=' + options.context; } - function getTabs() { - return [{ - href: 'installedplugins.html', - name: globalize.translate('TabMyPlugins') - }, { - href: 'availableplugins.html', - name: globalize.translate('TabCatalog') - }, { - href: 'repositories.html', - name: globalize.translate('TabRepositories') - }]; - } + const target = plugin.externalUrl ? ' target="_blank"' : ''; + html += "
    "; + html += '
    '; + html += '
    '; + html += '
    '; + html += ''; + html += ''; + html += ''; + html += '
    '; + html += '
    '; + html += "
    "; + html += plugin.name; + html += '
    '; + const installedPlugin = installedPlugins.filter(function (ip) { + return ip.Id == plugin.guid; + })[0]; + html += "
    "; + html += installedPlugin ? globalize.translate('LabelVersionInstalled', installedPlugin.Version) : ' '; + html += '
    '; + html += '
    '; + html += '
    '; + return html += '
    '; +} - window.PluginCatalog = { - renderCatalog: populateList - }; +function getTabs() { + return [{ + href: 'installedplugins.html', + name: globalize.translate('TabMyPlugins') + }, { + href: 'availableplugins.html', + name: globalize.translate('TabCatalog') + }, { + href: 'repositories.html', + name: globalize.translate('TabRepositories') + }]; +} - return function (view, params) { - view.addEventListener('viewshow', function () { - libraryMenu.setTabs('plugins', 1, getTabs); - reloadList(this); - }); - }; -}); +export default function (view) { + view.addEventListener('viewshow', function () { + libraryMenu.setTabs('plugins', 1, getTabs); + reloadList(this); + }); +} diff --git a/src/controllers/dashboard/plugins/installed/index.js b/src/controllers/dashboard/plugins/installed/index.js index d28a04cb2b..e5f5b92413 100644 --- a/src/controllers/dashboard/plugins/installed/index.js +++ b/src/controllers/dashboard/plugins/installed/index.js @@ -1,190 +1,193 @@ -define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'], function (loading, libraryMenu, dom, globalize) { - 'use strict'; +import loading from 'loading'; +import libraryMenu from 'libraryMenu'; +import dom from 'dom'; +import globalize from 'globalize'; +import 'cardStyle'; +import 'emby-button'; - function deletePlugin(page, uniqueid, name) { - var msg = globalize.translate('UninstallPluginConfirmation', name); +function deletePlugin(page, uniqueid, name) { + const msg = globalize.translate('UninstallPluginConfirmation', name); - require(['confirm'], function (confirm) { - confirm.default({ - title: globalize.translate('UninstallPluginHeader'), - text: msg, - primary: 'delete', - confirmText: globalize.translate('UninstallPluginHeader') - }).then(function () { - loading.show(); - ApiClient.uninstallPlugin(uniqueid).then(function () { - reloadList(page); - }); + import('confirm').then(({default: confirm}) => { + confirm.default({ + title: globalize.translate('HeaderUninstallPlugin'), + text: msg, + primary: 'delete', + confirmText: globalize.translate('HeaderUninstallPlugin') + }).then(function () { + loading.show(); + ApiClient.uninstallPlugin(uniqueid).then(function () { + reloadList(page); }); }); - } + }); +} - function showNoConfigurationMessage() { - Dashboard.alert({ - message: globalize.translate('NoPluginConfigurationMessage') - }); - } +function showNoConfigurationMessage() { + Dashboard.alert({ + message: globalize.translate('MessageNoPluginConfiguration') + }); +} - function showConnectMessage() { - Dashboard.alert({ - message: globalize.translate('MessagePluginConfigurationRequiresLocalAccess') - }); - } +function showConnectMessage() { + Dashboard.alert({ + message: globalize.translate('MessagePluginConfigurationRequiresLocalAccess') + }); +} - function getPluginCardHtml(plugin, pluginConfigurationPages) { - var configPage = pluginConfigurationPages.filter(function (pluginConfigurationPage) { - return pluginConfigurationPage.PluginId == plugin.Id; - })[0]; - var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null; - var html = ''; - html += "
    "; - html += '
    '; - html += '
    '; - html += '
    '; - html += configPageUrl ? '' : ''; +function getPluginCardHtml(plugin, pluginConfigurationPages) { + const configPage = pluginConfigurationPages.filter(function (pluginConfigurationPage) { + return pluginConfigurationPage.PluginId == plugin.Id; + })[0]; + const configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null; + let html = ''; + html += "
    "; + html += '
    '; + html += '
    '; + html += '
    '; + html += configPageUrl ? '' : ''; + html += '
    '; + html += '
    '; + + if (configPage || plugin.CanUninstall) { + html += '
    '; + html += ''; html += '
    '; - html += '
    '; + } - if (configPage || plugin.CanUninstall) { - html += '
    '; - html += ''; - html += '
    '; + html += "
    "; + html += configPage && configPage.DisplayName ? configPage.DisplayName : plugin.Name; + html += '
    '; + html += "
    "; + html += plugin.Version; + html += '
    '; + html += '
    '; + html += '
    '; + html += '
    '; + return html; +} + +function renderPlugins(page, plugins) { + ApiClient.getJSON(ApiClient.getUrl('web/configurationpages') + '?pageType=PluginConfiguration').then(function (configPages) { + populateList(page, plugins, configPages); + }); +} + +function populateList(page, plugins, pluginConfigurationPages) { + plugins = plugins.sort(function (plugin1, plugin2) { + if (plugin1.Name > plugin2.Name) { + return 1; } - html += "
    "; - html += configPage && configPage.DisplayName ? configPage.DisplayName : plugin.Name; - html += '
    '; - html += "
    "; - html += plugin.Version; - html += '
    '; - html += '
    '; - html += '
    '; - html += '
    '; - return html; - } - - function renderPlugins(page, plugins) { - ApiClient.getJSON(ApiClient.getUrl('web/configurationpages') + '?pageType=PluginConfiguration').then(function (configPages) { - populateList(page, plugins, configPages); - }); - } - - function populateList(page, plugins, pluginConfigurationPages) { - plugins = plugins.sort(function (plugin1, plugin2) { - if (plugin1.Name > plugin2.Name) { - return 1; - } - - return -1; - }); - - var html = plugins.map(function (p) { - return getPluginCardHtml(p, pluginConfigurationPages); - }).join(''); - - var installedPluginsElement = page.querySelector('.installedPlugins'); - installedPluginsElement.removeEventListener('click', onInstalledPluginsClick); - installedPluginsElement.addEventListener('click', onInstalledPluginsClick); - - if (plugins.length) { - installedPluginsElement.classList.add('itemsContainer'); - installedPluginsElement.classList.add('vertical-wrap'); - } else { - html += '
    '; - html += '

    ' + globalize.translate('MessageNoPluginsInstalled') + '

    '; - html += '

    '; - html += globalize.translate('BrowsePluginCatalogMessage'); - html += '

    '; - html += '
    '; - } - - installedPluginsElement.innerHTML = html; - loading.hide(); - } - - function showPluginMenu(page, elem) { - var card = dom.parentWithClass(elem, 'card'); - var id = card.getAttribute('data-id'); - var name = card.getAttribute('data-name'); - var removable = card.getAttribute('data-removable'); - var configHref = card.querySelector('.cardContent').getAttribute('href'); - var menuItems = []; - - if (configHref) { - menuItems.push({ - name: globalize.translate('ButtonSettings'), - id: 'open', - icon: 'mode_edit' - }); - } - - if (removable === 'true') { - menuItems.push({ - name: globalize.translate('ButtonUninstall'), - id: 'delete', - icon: 'delete' - }); - } - - require(['actionsheet'], function (actionsheet) { - actionsheet.show({ - items: menuItems, - positionTo: elem, - callback: function (resultId) { - switch (resultId) { - case 'open': - Dashboard.navigate(configHref); - break; - case 'delete': - deletePlugin(page, id, name); - break; - } - } - }); - }); - } - - function reloadList(page) { - loading.show(); - ApiClient.getInstalledPlugins().then(function (plugins) { - renderPlugins(page, plugins); - }); - } - - function getTabs() { - return [{ - href: 'installedplugins.html', - name: globalize.translate('TabMyPlugins') - }, { - href: 'availableplugins.html', - name: globalize.translate('TabCatalog') - }, { - href: 'repositories.html', - name: globalize.translate('TabRepositories') - }]; - } - - function onInstalledPluginsClick(e) { - if (dom.parentWithClass(e.target, 'noConfigPluginCard')) { - showNoConfigurationMessage(); - } else if (dom.parentWithClass(e.target, 'connectModePluginCard')) { - showConnectMessage(); - } else { - var btnCardMenu = dom.parentWithClass(e.target, 'btnCardMenu'); - if (btnCardMenu) { - showPluginMenu(dom.parentWithClass(btnCardMenu, 'page'), btnCardMenu); - } - } - } - - pageIdOn('pageshow', 'pluginsPage', function () { - libraryMenu.setTabs('plugins', 0, getTabs); - reloadList(this); + return -1; }); - window.PluginsPage = { - renderPlugins: renderPlugins - }; + let html = plugins.map(function (p) { + return getPluginCardHtml(p, pluginConfigurationPages); + }).join(''); + + const installedPluginsElement = page.querySelector('.installedPlugins'); + installedPluginsElement.removeEventListener('click', onInstalledPluginsClick); + installedPluginsElement.addEventListener('click', onInstalledPluginsClick); + + if (plugins.length) { + installedPluginsElement.classList.add('itemsContainer'); + installedPluginsElement.classList.add('vertical-wrap'); + } else { + html += '
    '; + html += '

    ' + globalize.translate('MessageNoPluginsInstalled') + '

    '; + html += '

    '; + html += globalize.translate('MessageBrowsePluginCatalog'); + html += '

    '; + html += '
    '; + } + + installedPluginsElement.innerHTML = html; + loading.hide(); +} + +function showPluginMenu(page, elem) { + const card = dom.parentWithClass(elem, 'card'); + const id = card.getAttribute('data-id'); + const name = card.getAttribute('data-name'); + const removable = card.getAttribute('data-removable'); + const configHref = card.querySelector('.cardContent').getAttribute('href'); + const menuItems = []; + + if (configHref) { + menuItems.push({ + name: globalize.translate('ButtonSettings'), + id: 'open', + icon: 'mode_edit' + }); + } + + if (removable === 'true') { + menuItems.push({ + name: globalize.translate('ButtonUninstall'), + id: 'delete', + icon: 'delete' + }); + } + + import('actionsheet').then(({default: actionsheet}) => { + actionsheet.show({ + items: menuItems, + positionTo: elem, + callback: function (resultId) { + switch (resultId) { + case 'open': + Dashboard.navigate(configHref); + break; + case 'delete': + deletePlugin(page, id, name); + break; + } + } + }); + }); +} + +function reloadList(page) { + loading.show(); + ApiClient.getInstalledPlugins().then(function (plugins) { + renderPlugins(page, plugins); + }); +} + +function getTabs() { + return [{ + href: 'installedplugins.html', + name: globalize.translate('TabMyPlugins') + }, { + href: 'availableplugins.html', + name: globalize.translate('TabCatalog') + }, { + href: 'repositories.html', + name: globalize.translate('TabRepositories') + }]; +} + +function onInstalledPluginsClick(e) { + if (dom.parentWithClass(e.target, 'noConfigPluginCard')) { + showNoConfigurationMessage(); + } else if (dom.parentWithClass(e.target, 'connectModePluginCard')) { + showConnectMessage(); + } else { + const btnCardMenu = dom.parentWithClass(e.target, 'btnCardMenu'); + if (btnCardMenu) { + showPluginMenu(dom.parentWithClass(btnCardMenu, 'page'), btnCardMenu); + } + } +} + +pageIdOn('pageshow', 'pluginsPage', function () { + libraryMenu.setTabs('plugins', 0, getTabs); + reloadList(this); }); + +window.PluginsPage = { + renderPlugins: renderPlugins +}; diff --git a/src/controllers/dashboard/plugins/repositories/index.html b/src/controllers/dashboard/plugins/repositories/index.html index ff3406fb95..cea20d5a4a 100644 --- a/src/controllers/dashboard/plugins/repositories/index.html +++ b/src/controllers/dashboard/plugins/repositories/index.html @@ -3,7 +3,7 @@

    ${TabRepositories}

    -
    diff --git a/src/controllers/dashboard/plugins/repositories/index.js b/src/controllers/dashboard/plugins/repositories/index.js index 3087cdd927..8d1cbf3164 100644 --- a/src/controllers/dashboard/plugins/repositories/index.js +++ b/src/controllers/dashboard/plugins/repositories/index.js @@ -69,7 +69,7 @@ function getRepositoryHtml(repository) { html += `

    ${repository.Name}

    `; html += `
    ${repository.Url}
    `; html += '
    '; - html += ``; + html += ``; html += '
    '; return html; @@ -105,7 +105,7 @@ export default function(view, params) { }); view.querySelector('.btnNewRepository').addEventListener('click', () => { - let dialog = dialogHelper.createDialog({ + const dialog = dialogHelper.createDialog({ scrollY: false, size: 'large', modal: false, @@ -127,7 +127,7 @@ export default function(view, params) { html += ``; html += `
    ${globalize.translate('LabelRepositoryUrlHelp')}
    `; html += ''; - html += ``; + html += ``; html += ''; html += ''; diff --git a/src/scheduledtask.html b/src/controllers/dashboard/scheduledtasks/scheduledtask.html similarity index 86% rename from src/scheduledtask.html rename to src/controllers/dashboard/scheduledtasks/scheduledtask.html index c7e82594ce..8d0b2e24e0 100644 --- a/src/scheduledtask.html +++ b/src/controllers/dashboard/scheduledtasks/scheduledtask.html @@ -23,7 +23,7 @@
    -

    ${HeaderAddScheduledTaskTrigger}

    +

    ${ButtonAddScheduledTaskTrigger}

    @@ -31,18 +31,18 @@ - +
    @@ -73,7 +73,7 @@
    '; - html += ''; + html += ''; html += '
    '; } @@ -143,7 +143,7 @@ import 'emby-select'; }, deleteTrigger: function (view, index) { loading.show(); - let id = getParameterByName('id'); + const id = getParameterByName('id'); ApiClient.getScheduledTask(id).then(function (task) { task.Triggers.remove(index); ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () { @@ -211,7 +211,7 @@ import 'emby-select'; export default function (view, params) { function onSubmit(e) { loading.show(); - let id = getParameterByName('id'); + const id = getParameterByName('id'); ApiClient.getScheduledTask(id).then(function (task) { task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view)); ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () { diff --git a/src/scheduledtasks.html b/src/controllers/dashboard/scheduledtasks/scheduledtasks.html similarity index 100% rename from src/scheduledtasks.html rename to src/controllers/dashboard/scheduledtasks/scheduledtasks.html diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index af96f34c15..81a34d4fa6 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -103,7 +103,7 @@ import 'emby-button'; } function setTaskButtonIcon(button, icon) { - let inner = button.querySelector('.material-icons'); + const inner = button.querySelector('.material-icons'); inner.classList.remove('stop', 'play_arrow'); inner.classList.add(icon); } @@ -160,7 +160,7 @@ import 'emby-button'; $('.divScheduledTasks', view).on('click', '.btnStartTask', function() { const button = this; - let id = button.getAttribute('data-taskid'); + const id = button.getAttribute('data-taskid'); ApiClient.startScheduledTask(id).then(function() { updateTaskButton(button, 'Running'); reloadList(view); @@ -169,7 +169,7 @@ import 'emby-button'; $('.divScheduledTasks', view).on('click', '.btnStopTask', function() { const button = this; - let id = button.getAttribute('data-taskid'); + const id = button.getAttribute('data-taskid'); ApiClient.stopScheduledTask(id).then(function() { updateTaskButton(button, ''); reloadList(view); diff --git a/src/serveractivity.html b/src/controllers/dashboard/serveractivity.html similarity index 100% rename from src/serveractivity.html rename to src/controllers/dashboard/serveractivity.html diff --git a/src/streamingsettings.html b/src/controllers/dashboard/streaming.html similarity index 95% rename from src/streamingsettings.html rename to src/controllers/dashboard/streaming.html index 2d51d9ee77..c3e7e783f2 100644 --- a/src/streamingsettings.html +++ b/src/controllers/dashboard/streaming.html @@ -12,7 +12,7 @@
    diff --git a/src/controllers/dashboard/streaming.js b/src/controllers/dashboard/streaming.js index c54fbea472..5db888dfc1 100644 --- a/src/controllers/dashboard/streaming.js +++ b/src/controllers/dashboard/streaming.js @@ -27,7 +27,7 @@ import globalize from 'globalize'; name: globalize.translate('Transcoding') }, { href: 'playbackconfiguration.html', - name: globalize.translate('TabResumeSettings') + name: globalize.translate('ButtonResume') }, { href: 'streamingsettings.html', name: globalize.translate('TabStreaming') diff --git a/src/useredit.html b/src/controllers/dashboard/users/useredit.html similarity index 98% rename from src/useredit.html rename to src/controllers/dashboard/users/useredit.html index c3a613bed4..400c0c35bf 100644 --- a/src/useredit.html +++ b/src/controllers/dashboard/users/useredit.html @@ -14,7 +14,7 @@ ${TabProfile} ${TabAccess} ${TabParentalControl} - ${TabPassword} + ${HeaderPassword}

    ${ButtonEditOtherUserPreferences} @@ -192,7 +192,7 @@

    @@ -59,7 +59,7 @@
    diff --git a/src/controllers/dashboard/users/userlibraryaccess.js b/src/controllers/dashboard/users/userlibraryaccess.js index d32c7312b7..146777a0db 100644 --- a/src/controllers/dashboard/users/userlibraryaccess.js +++ b/src/controllers/dashboard/users/userlibraryaccess.js @@ -32,7 +32,7 @@ import globalize from 'globalize'; function loadChannels(page, user, channels) { let html = ''; - html += '

    ' + globalize.translate('HeaderChannels') + '

    '; + html += '

    ' + globalize.translate('Channels') + '

    '; html += '
    '; for (let i = 0, length = channels.length; i < length; i++) { diff --git a/src/usernew.html b/src/controllers/dashboard/users/usernew.html similarity index 96% rename from src/usernew.html rename to src/controllers/dashboard/users/usernew.html index fac036aa8d..67f1f61ebc 100644 --- a/src/usernew.html +++ b/src/controllers/dashboard/users/usernew.html @@ -4,7 +4,7 @@
    -

    ${HeaderAddUser}

    +

    ${ButtonAddUser}

    ${Help}
    @@ -49,7 +49,7 @@
    @@ -40,7 +40,7 @@

    ${HeaderAccessSchedule}

    -
    @@ -51,7 +51,7 @@
    diff --git a/src/userpassword.html b/src/controllers/dashboard/users/userpassword.html similarity index 96% rename from src/userpassword.html rename to src/controllers/dashboard/users/userpassword.html index 119a0212de..0f6ea2d78e 100644 --- a/src/userpassword.html +++ b/src/controllers/dashboard/users/userpassword.html @@ -12,7 +12,7 @@ ${TabProfile} ${TabAccess} ${TabParentalControl} - ${TabPassword} + ${HeaderPassword}
    @@ -29,7 +29,7 @@

    - + @@ -58,7 +58,7 @@
    - -
    -
    -

    ${HeaderSchedule}

    +

    ${Schedule}

    -

    ${HeaderNextUp}

    +

    ${NextUp}

    @@ -193,7 +193,7 @@
    -

    ${HeaderCastCrew}

    +

    ${HeaderCastAndCrew}

    diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index df2855d69a..b1781e75f0 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1,5 +1,7 @@ +import appHost from 'apphost'; import loading from 'loading'; import appRouter from 'appRouter'; +import itemShortcuts from 'itemShortcuts'; import layoutManager from 'layoutManager'; import connectionManager from 'connectionManager'; import * as userSettings from 'userSettings'; @@ -27,1916 +29,1923 @@ import 'emby-ratingbutton'; import 'emby-scroller'; import 'emby-select'; -/* eslint-disable indent */ +function getPromise(apiClient, params) { + const id = params.id; - function getPromise(apiClient, params) { - const id = params.id; - - if (id) { - return apiClient.getItem(apiClient.getCurrentUserId(), id); - } - - if (params.seriesTimerId) { - return apiClient.getLiveTvSeriesTimer(params.seriesTimerId); - } - - if (params.genre) { - return apiClient.getGenre(params.genre, apiClient.getCurrentUserId()); - } - - if (params.musicgenre) { - return apiClient.getMusicGenre(params.musicgenre, apiClient.getCurrentUserId()); - } - - if (params.musicartist) { - return apiClient.getArtist(params.musicartist, apiClient.getCurrentUserId()); - } - - throw new Error('Invalid request'); + if (id) { + return apiClient.getItem(apiClient.getCurrentUserId(), id); } - function hideAll(page, className, show) { - for (const elem of page.querySelectorAll('.' + className)) { - if (show) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } + if (params.seriesTimerId) { + return apiClient.getLiveTvSeriesTimer(params.seriesTimerId); + } + + if (params.genre) { + return apiClient.getGenre(params.genre, apiClient.getCurrentUserId()); + } + + if (params.musicgenre) { + return apiClient.getMusicGenre(params.musicgenre, apiClient.getCurrentUserId()); + } + + if (params.musicartist) { + return apiClient.getArtist(params.musicartist, apiClient.getCurrentUserId()); + } + + throw new Error('Invalid request'); +} + +function hideAll(page, className, show) { + for (const elem of page.querySelectorAll('.' + className)) { + if (show) { + elem.classList.remove('hide'); + } else { + elem.classList.add('hide'); } } +} - function getContextMenuOptions(item, user, button) { - return { - item: item, - open: false, - play: false, - playAllFromHere: false, - queueAllFromHere: false, - positionTo: button, - cancelTimer: false, - record: false, - deleteItem: item.CanDelete === true, - shuffle: false, - instantMix: false, - user: user, - share: true - }; - } +function getContextMenuOptions(item, user, button) { + return { + item: item, + open: false, + play: false, + playAllFromHere: false, + queueAllFromHere: false, + positionTo: button, + cancelTimer: false, + record: false, + deleteItem: item.CanDelete === true, + shuffle: false, + instantMix: false, + user: user, + share: true + }; +} - function getProgramScheduleHtml(items) { - let html = ''; +function getProgramScheduleHtml(items) { + let html = ''; - html += '
    '; - html += listView.getListViewHtml({ - items: items, - enableUserDataButtons: false, - image: true, - imageSource: 'channel', - showProgramDateTime: true, - showChannel: false, - mediaInfo: false, - action: 'none', - moreButton: false, - recordButton: false - }); + html += '
    '; + html += listView.getListViewHtml({ + items: items, + enableUserDataButtons: false, + image: true, + imageSource: 'channel', + showProgramDateTime: true, + showChannel: false, + mediaInfo: false, + action: 'none', + moreButton: false, + recordButton: false + }); - html += '
    '; + html += '
    '; - return html; - } + return html; +} - function renderSeriesTimerSchedule(page, apiClient, seriesTimerId) { - apiClient.getLiveTvTimers({ - UserId: apiClient.getCurrentUserId(), - ImageTypeLimit: 1, - EnableImageTypes: 'Primary,Backdrop,Thumb', - SortBy: 'StartDate', - EnableTotalRecordCount: false, - EnableUserData: false, - SeriesTimerId: seriesTimerId, - Fields: 'ChannelInfo,ChannelImage' - }).then(function (result) { - if (result.Items.length && result.Items[0].SeriesTimerId != seriesTimerId) { - result.Items = []; - } - - const html = getProgramScheduleHtml(result.Items); - const scheduleTab = page.querySelector('.seriesTimerSchedule'); - scheduleTab.innerHTML = html; - imageLoader.lazyChildren(scheduleTab); - }); - } - - function renderTimerEditor(page, item, apiClient, user) { - if (item.Type !== 'Recording' || !user.Policy.EnableLiveTvManagement || !item.TimerId || item.Status !== 'InProgress') { - return void hideAll(page, 'btnCancelTimer'); +function renderSeriesTimerSchedule(page, apiClient, seriesTimerId) { + apiClient.getLiveTvTimers({ + UserId: apiClient.getCurrentUserId(), + ImageTypeLimit: 1, + EnableImageTypes: 'Primary,Backdrop,Thumb', + SortBy: 'StartDate', + EnableTotalRecordCount: false, + EnableUserData: false, + SeriesTimerId: seriesTimerId, + Fields: 'ChannelInfo,ChannelImage' + }).then(function (result) { + if (result.Items.length && result.Items[0].SeriesTimerId != seriesTimerId) { + result.Items = []; } - hideAll(page, 'btnCancelTimer', true); + const html = getProgramScheduleHtml(result.Items); + const scheduleTab = page.querySelector('.seriesTimerSchedule'); + scheduleTab.innerHTML = html; + imageLoader.lazyChildren(scheduleTab); + }); +} + +function renderTimerEditor(page, item, apiClient, user) { + if (item.Type !== 'Recording' || !user.Policy.EnableLiveTvManagement || !item.TimerId || item.Status !== 'InProgress') { + return void hideAll(page, 'btnCancelTimer'); } - function renderSeriesTimerEditor(page, item, apiClient, user) { - if (item.Type !== 'SeriesTimer') { - return void hideAll(page, 'btnCancelSeriesTimer'); - } + hideAll(page, 'btnCancelTimer', true); +} - if (user.Policy.EnableLiveTvManagement) { - import('seriesRecordingEditor').then(({default: seriesRecordingEditor}) => { - seriesRecordingEditor.embed(item, apiClient.serverId(), { - context: page.querySelector('.seriesRecordingEditor') - }); - }); - - page.querySelector('.seriesTimerScheduleSection').classList.remove('hide'); - hideAll(page, 'btnCancelSeriesTimer', true); - return void renderSeriesTimerSchedule(page, apiClient, item.Id); - } - - page.querySelector('.seriesTimerScheduleSection').classList.add('hide'); +function renderSeriesTimerEditor(page, item, apiClient, user) { + if (item.Type !== 'SeriesTimer') { return void hideAll(page, 'btnCancelSeriesTimer'); } - function renderTrackSelections(page, instance, item, forceReload) { - const select = page.querySelector('.selectSource'); - - if (!item.MediaSources || !itemHelper.supportsMediaSourceSelection(item) || playbackManager.getSupportedCommands().indexOf('PlayMediaSource') === -1 || !playbackManager.canPlay(item)) { - page.querySelector('.trackSelections').classList.add('hide'); - select.innerHTML = ''; - page.querySelector('.selectVideo').innerHTML = ''; - page.querySelector('.selectAudio').innerHTML = ''; - page.querySelector('.selectSubtitles').innerHTML = ''; - return; - } - - const mediaSources = item.MediaSources; - instance._currentPlaybackMediaSources = mediaSources; - - page.querySelector('.trackSelections').classList.remove('hide'); - select.setLabel(globalize.translate('LabelVersion')); - - const currentValue = select.value; - - const selectedId = mediaSources[0].Id; - select.innerHTML = mediaSources.map(function (v) { - const selected = v.Id === selectedId ? ' selected' : ''; - return ''; - }).join(''); - - if (mediaSources.length > 1) { - page.querySelector('.selectSourceContainer').classList.remove('hide'); - } else { - page.querySelector('.selectSourceContainer').classList.add('hide'); - } - - if (select.value !== currentValue || forceReload) { - renderVideoSelections(page, mediaSources); - renderAudioSelections(page, mediaSources); - renderSubtitleSelections(page, mediaSources); - } - } - - function renderVideoSelections(page, mediaSources) { - const mediaSourceId = page.querySelector('.selectSource').value; - const mediaSource = mediaSources.filter(function (m) { - return m.Id === mediaSourceId; - })[0]; - - const tracks = mediaSource.MediaStreams.filter(function (m) { - return m.Type === 'Video'; + if (user.Policy.EnableLiveTvManagement) { + import('seriesRecordingEditor').then(({ default: seriesRecordingEditor }) => { + seriesRecordingEditor.embed(item, apiClient.serverId(), { + context: page.querySelector('.seriesRecordingEditor') + }); }); - const select = page.querySelector('.selectVideo'); - select.setLabel(globalize.translate('LabelVideo')); - const selectedId = tracks.length ? tracks[0].Index : -1; - select.innerHTML = tracks.map(function (v) { - const selected = v.Index === selectedId ? ' selected' : ''; - const titleParts = []; - const resolutionText = mediaInfo.getResolutionText(v); + page.querySelector('.seriesTimerScheduleSection').classList.remove('hide'); + hideAll(page, 'btnCancelSeriesTimer', true); + return void renderSeriesTimerSchedule(page, apiClient, item.Id); + } - if (resolutionText) { - titleParts.push(resolutionText); - } + page.querySelector('.seriesTimerScheduleSection').classList.add('hide'); + return void hideAll(page, 'btnCancelSeriesTimer'); +} - if (v.Codec) { - titleParts.push(v.Codec.toUpperCase()); - } +function renderTrackSelections(page, instance, item, forceReload) { + const select = page.querySelector('.selectSource'); - return ''; - }).join(''); + if (!item.MediaSources || !itemHelper.supportsMediaSourceSelection(item) || playbackManager.getSupportedCommands().indexOf('PlayMediaSource') === -1 || !playbackManager.canPlay(item)) { + page.querySelector('.trackSelections').classList.add('hide'); + select.innerHTML = ''; + page.querySelector('.selectVideo').innerHTML = ''; + page.querySelector('.selectAudio').innerHTML = ''; + page.querySelector('.selectSubtitles').innerHTML = ''; + return; + } + + const mediaSources = item.MediaSources; + instance._currentPlaybackMediaSources = mediaSources; + + page.querySelector('.trackSelections').classList.remove('hide'); + select.setLabel(globalize.translate('LabelVersion')); + + const currentValue = select.value; + + const selectedId = mediaSources[0].Id; + select.innerHTML = mediaSources.map(function (v) { + const selected = v.Id === selectedId ? ' selected' : ''; + return ''; + }).join(''); + + if (mediaSources.length > 1) { + page.querySelector('.selectSourceContainer').classList.remove('hide'); + } else { + page.querySelector('.selectSourceContainer').classList.add('hide'); + } + + if (select.value !== currentValue || forceReload) { + renderVideoSelections(page, mediaSources); + renderAudioSelections(page, mediaSources); + renderSubtitleSelections(page, mediaSources); + } +} + +function renderVideoSelections(page, mediaSources) { + const mediaSourceId = page.querySelector('.selectSource').value; + const mediaSource = mediaSources.filter(function (m) { + return m.Id === mediaSourceId; + })[0]; + + const tracks = mediaSource.MediaStreams.filter(function (m) { + return m.Type === 'Video'; + }); + + const select = page.querySelector('.selectVideo'); + select.setLabel(globalize.translate('LabelVideo')); + const selectedId = tracks.length ? tracks[0].Index : -1; + select.innerHTML = tracks.map(function (v) { + const selected = v.Index === selectedId ? ' selected' : ''; + const titleParts = []; + const resolutionText = mediaInfo.getResolutionText(v); + + if (resolutionText) { + titleParts.push(resolutionText); + } + + if (v.Codec) { + titleParts.push(v.Codec.toUpperCase()); + } + + return ''; + }).join(''); + select.setAttribute('disabled', 'disabled'); + + if (tracks.length) { + page.querySelector('.selectVideoContainer').classList.remove('hide'); + } else { + page.querySelector('.selectVideoContainer').classList.add('hide'); + } +} + +function renderAudioSelections(page, mediaSources) { + const mediaSourceId = page.querySelector('.selectSource').value; + const mediaSource = mediaSources.filter(function (m) { + return m.Id === mediaSourceId; + })[0]; + const tracks = mediaSource.MediaStreams.filter(function (m) { + return m.Type === 'Audio'; + }); + const select = page.querySelector('.selectAudio'); + select.setLabel(globalize.translate('Audio')); + const selectedId = mediaSource.DefaultAudioStreamIndex; + select.innerHTML = tracks.map(function (v) { + const selected = v.Index === selectedId ? ' selected' : ''; + return ''; + }).join(''); + + if (tracks.length > 1) { + select.removeAttribute('disabled'); + } else { select.setAttribute('disabled', 'disabled'); - - if (tracks.length) { - page.querySelector('.selectVideoContainer').classList.remove('hide'); - } else { - page.querySelector('.selectVideoContainer').classList.add('hide'); - } } - function renderAudioSelections(page, mediaSources) { - const mediaSourceId = page.querySelector('.selectSource').value; - const mediaSource = mediaSources.filter(function (m) { - return m.Id === mediaSourceId; - })[0]; - const tracks = mediaSource.MediaStreams.filter(function (m) { - return m.Type === 'Audio'; - }); - const select = page.querySelector('.selectAudio'); - select.setLabel(globalize.translate('LabelAudio')); - const selectedId = mediaSource.DefaultAudioStreamIndex; - select.innerHTML = tracks.map(function (v) { - const selected = v.Index === selectedId ? ' selected' : ''; + if (tracks.length) { + page.querySelector('.selectAudioContainer').classList.remove('hide'); + } else { + page.querySelector('.selectAudioContainer').classList.add('hide'); + } +} + +function renderSubtitleSelections(page, mediaSources) { + const mediaSourceId = page.querySelector('.selectSource').value; + const mediaSource = mediaSources.filter(function (m) { + return m.Id === mediaSourceId; + })[0]; + const tracks = mediaSource.MediaStreams.filter(function (m) { + return m.Type === 'Subtitle'; + }); + const select = page.querySelector('.selectSubtitles'); + select.setLabel(globalize.translate('Subtitles')); + const selectedId = mediaSource.DefaultSubtitleStreamIndex == null ? -1 : mediaSource.DefaultSubtitleStreamIndex; + + const videoTracks = mediaSource.MediaStreams.filter(function (m) { + return m.Type === 'Video'; + }); + + // This only makes sense on Video items + if (videoTracks.length) { + let selected = selectedId === -1 ? ' selected' : ''; + select.innerHTML = '' + tracks.map(function (v) { + selected = v.Index === selectedId ? ' selected' : ''; return ''; }).join(''); - if (tracks.length > 1) { + if (tracks.length > 0) { select.removeAttribute('disabled'); } else { select.setAttribute('disabled', 'disabled'); } - if (tracks.length) { - page.querySelector('.selectAudioContainer').classList.remove('hide'); - } else { - page.querySelector('.selectAudioContainer').classList.add('hide'); - } + page.querySelector('.selectSubtitlesContainer').classList.remove('hide'); + } else { + select.innerHTML = ''; + page.querySelector('.selectSubtitlesContainer').classList.add('hide'); } +} - function renderSubtitleSelections(page, mediaSources) { - const mediaSourceId = page.querySelector('.selectSource').value; - const mediaSource = mediaSources.filter(function (m) { - return m.Id === mediaSourceId; - })[0]; - const tracks = mediaSource.MediaStreams.filter(function (m) { - return m.Type === 'Subtitle'; - }); - const select = page.querySelector('.selectSubtitles'); - select.setLabel(globalize.translate('LabelSubtitles')); - const selectedId = mediaSource.DefaultSubtitleStreamIndex == null ? -1 : mediaSource.DefaultSubtitleStreamIndex; +function reloadPlayButtons(page, item) { + let canPlay = false; - const videoTracks = mediaSource.MediaStreams.filter(function (m) { - return m.Type === 'Video'; - }); + if (item.Type == 'Program') { + const now = new Date(); - // This only makes sense on Video items - if (videoTracks.length) { - let selected = selectedId === -1 ? ' selected' : ''; - select.innerHTML = '' + tracks.map(function (v) { - selected = v.Index === selectedId ? ' selected' : ''; - return ''; - }).join(''); - - if (tracks.length > 0) { - select.removeAttribute('disabled'); - } else { - select.setAttribute('disabled', 'disabled'); - } - - page.querySelector('.selectSubtitlesContainer').classList.remove('hide'); - } else { - select.innerHTML = ''; - page.querySelector('.selectSubtitlesContainer').classList.add('hide'); - } - } - - function reloadPlayButtons(page, item) { - let canPlay = false; - - if (item.Type == 'Program') { - const now = new Date(); - - if (now >= datetime.parseISO8601Date(item.StartDate, true) && now < datetime.parseISO8601Date(item.EndDate, true)) { - hideAll(page, 'btnPlay', true); - canPlay = true; - } else { - hideAll(page, 'btnPlay'); - } - - hideAll(page, 'btnResume'); - hideAll(page, 'btnInstantMix'); - hideAll(page, 'btnShuffle'); - } else if (playbackManager.canPlay(item)) { + if (now >= datetime.parseISO8601Date(item.StartDate, true) && now < datetime.parseISO8601Date(item.EndDate, true)) { hideAll(page, 'btnPlay', true); - const enableInstantMix = ['Audio', 'MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type) !== -1; - hideAll(page, 'btnInstantMix', enableInstantMix); - const enableShuffle = item.IsFolder || ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type) !== -1; - hideAll(page, 'btnShuffle', enableShuffle); canPlay = true; - - const isResumable = item.UserData && item.UserData.PlaybackPositionTicks > 0; - hideAll(page, 'btnResume', isResumable); - - if (isResumable) { - for (const elem of page.querySelectorAll('.btnPlay')) { - elem.querySelector('.detailButton-icon').classList.replace('play_arrow', 'replay'); - } - } } else { hideAll(page, 'btnPlay'); - hideAll(page, 'btnResume'); - hideAll(page, 'btnInstantMix'); - hideAll(page, 'btnShuffle'); } - return canPlay; + hideAll(page, 'btnResume'); + hideAll(page, 'btnInstantMix'); + hideAll(page, 'btnShuffle'); + } else if (playbackManager.canPlay(item)) { + hideAll(page, 'btnPlay', true); + const enableInstantMix = ['Audio', 'MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type) !== -1; + hideAll(page, 'btnInstantMix', enableInstantMix); + const enableShuffle = item.IsFolder || ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type) !== -1; + hideAll(page, 'btnShuffle', enableShuffle); + canPlay = true; + + const isResumable = item.UserData && item.UserData.PlaybackPositionTicks > 0; + hideAll(page, 'btnResume', isResumable); + + if (isResumable) { + for (const elem of page.querySelectorAll('.btnPlay')) { + elem.querySelector('.detailButton-icon').classList.replace('play_arrow', 'replay'); + } + } + } else { + hideAll(page, 'btnPlay'); + hideAll(page, 'btnResume'); + hideAll(page, 'btnInstantMix'); + hideAll(page, 'btnShuffle'); } - function reloadUserDataButtons(page, item) { - let i; - let length; - const btnPlaystates = page.querySelectorAll('.btnPlaystate'); + return canPlay; +} - for (i = 0, length = btnPlaystates.length; i < length; i++) { - const btnPlaystate = btnPlaystates[i]; +function reloadUserDataButtons(page, item) { + let i; + let length; + const btnPlaystates = page.querySelectorAll('.btnPlaystate'); - if (itemHelper.canMarkPlayed(item)) { - btnPlaystate.classList.remove('hide'); - btnPlaystate.setItem(item); - } else { - btnPlaystate.classList.add('hide'); - btnPlaystate.setItem(null); - } - } + for (i = 0, length = btnPlaystates.length; i < length; i++) { + const btnPlaystate = btnPlaystates[i]; - const btnUserRatings = page.querySelectorAll('.btnUserRating'); - - for (i = 0, length = btnUserRatings.length; i < length; i++) { - const btnUserRating = btnUserRatings[i]; - - if (itemHelper.canRate(item)) { - btnUserRating.classList.remove('hide'); - btnUserRating.setItem(item); - } else { - btnUserRating.classList.add('hide'); - btnUserRating.setItem(null); - } + if (itemHelper.canMarkPlayed(item)) { + btnPlaystate.classList.remove('hide'); + btnPlaystate.setItem(item); + } else { + btnPlaystate.classList.add('hide'); + btnPlaystate.setItem(null); } } - function getArtistLinksHtml(artists, serverId, context) { - let html = []; + const btnUserRatings = page.querySelectorAll('.btnUserRating'); - for (const artist of artists) { - const href = appRouter.getRouteUrl(artist, { - context: context, - itemType: 'MusicArtist', - serverId: serverId - }); - html.push('' + artist.Name + ''); + for (i = 0, length = btnUserRatings.length; i < length; i++) { + const btnUserRating = btnUserRatings[i]; + + if (itemHelper.canRate(item)) { + btnUserRating.classList.remove('hide'); + btnUserRating.setItem(item); + } else { + btnUserRating.classList.add('hide'); + btnUserRating.setItem(null); } - - return html.join(' / '); } +} - /** - * Renders the item's name block - * @param {Object} item - Item used to render the name. - * @param {HTMLDivElement} container - Container to render the information into. - * @param {Object} context - Application context. - */ - function renderName(item, container, context) { - let parentRoute; - const parentNameHtml = []; - let parentNameLast = false; +function getArtistLinksHtml(artists, serverId, context) { + const html = []; - if (item.AlbumArtists) { - parentNameHtml.push(getArtistLinksHtml(item.AlbumArtists, item.ServerId, context)); - parentNameLast = true; - } else if (item.ArtistItems && item.ArtistItems.length && item.Type === 'MusicVideo') { - parentNameHtml.push(getArtistLinksHtml(item.ArtistItems, item.ServerId, context)); - parentNameLast = true; - } else if (item.SeriesName && item.Type === 'Episode') { - parentRoute = appRouter.getRouteUrl({ - Id: item.SeriesId, - Name: item.SeriesName, - Type: 'Series', - IsFolder: true, - ServerId: item.ServerId - }, { - context: context - }); - parentNameHtml.push('' + item.SeriesName + ''); - } else if (item.IsSeries || item.EpisodeTitle) { - parentNameHtml.push(item.Name); - } - - if (item.SeriesName && item.Type === 'Season') { - parentRoute = appRouter.getRouteUrl({ - Id: item.SeriesId, - Name: item.SeriesName, - Type: 'Series', - IsFolder: true, - ServerId: item.ServerId - }, { - context: context - }); - parentNameHtml.push('' + item.SeriesName + ''); - } else if (item.ParentIndexNumber != null && item.Type === 'Episode') { - parentRoute = appRouter.getRouteUrl({ - Id: item.SeasonId, - Name: item.SeasonName, - Type: 'Season', - IsFolder: true, - ServerId: item.ServerId - }, { - context: context - }); - parentNameHtml.push('' + item.SeasonName + ''); - } else if (item.ParentIndexNumber != null && item.IsSeries) { - parentNameHtml.push(item.SeasonName || 'S' + item.ParentIndexNumber); - } else if (item.Album && item.AlbumId && (item.Type === 'MusicVideo' || item.Type === 'Audio')) { - parentRoute = appRouter.getRouteUrl({ - Id: item.AlbumId, - Name: item.Album, - Type: 'MusicAlbum', - IsFolder: true, - ServerId: item.ServerId - }, { - context: context - }); - parentNameHtml.push('' + item.Album + ''); - } else if (item.Album) { - parentNameHtml.push(item.Album); - } - - // FIXME: This whole section needs some refactoring, so it becames easier to scale across all form factors. See GH #1022 - let html = ''; - const tvShowHtml = parentNameHtml[0]; - const tvSeasonHtml = parentNameHtml[1]; - - if (parentNameHtml.length) { - if (parentNameLast) { - // Music - if (layoutManager.mobile) { - html = '

    ' + parentNameHtml.join('
    ') + '

    '; - } else { - html = '

    ' + parentNameHtml.join(' - ') + '

    '; - } - } else { - html = '

    ' + tvShowHtml + '

    '; - } - } - - const name = itemHelper.getDisplayName(item, { - includeParentInfo: false + for (const artist of artists) { + const href = appRouter.getRouteUrl(artist, { + context: context, + itemType: 'MusicArtist', + serverId: serverId }); - - if (html && !parentNameLast) { - if (tvSeasonHtml) { - html += '

    ' + tvSeasonHtml + ' - ' + name + '

    '; - } else { - html += '

    ' + name + '

    '; - } - } else if (item.OriginalTitle && item.OriginalTitle != item.Name) { - html = '

    ' + name + '

    ' + html; - } else { - html = '

    ' + name + '

    ' + html; - } - - if (item.OriginalTitle && item.OriginalTitle != item.Name) { - html += '

    ' + item.OriginalTitle + '

    '; - } - - container.innerHTML = html; - - if (html.length) { - container.classList.remove('hide'); - } else { - container.classList.add('hide'); - } + html.push('' + artist.Name + ''); } - function setTrailerButtonVisibility(page, item) { - if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && playbackManager.getSupportedCommands().indexOf('PlayTrailers') !== -1) { - hideAll(page, 'btnPlayTrailer', true); - } else { - hideAll(page, 'btnPlayTrailer'); - } - } + return html.join(' / '); +} - function renderBackdrop(item) { - if (dom.getWindowSize().innerWidth >= 1000) { - backdrop.setBackdrops([item]); - } else { - backdrop.clearBackdrop(); - } - } +/** + * Renders the item's name block + * @param {Object} item - Item used to render the name. + * @param {HTMLDivElement} container - Container to render the information into. + * @param {Object} context - Application context. + */ +function renderName(item, container, context) { + let parentRoute; + const parentNameHtml = []; + let parentNameLast = false; - function renderDetailPageBackdrop(page, item, apiClient) { - let imgUrl; - let hasbackdrop = false; - const itemBackdropElement = page.querySelector('#itemBackdrop'); - - if (!layoutManager.mobile && !userSettings.detailsBanner()) { - return false; - } - - if (item.BackdropImageTags && item.BackdropImageTags.length) { - imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: 'Backdrop', - maxWidth: dom.getScreenWidth(), - index: 0, - tag: item.BackdropImageTags[0] - }); - imageLoader.lazyImage(itemBackdropElement, imgUrl); - hasbackdrop = true; - } else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { - imgUrl = apiClient.getScaledImageUrl(item.ParentBackdropItemId, { - type: 'Backdrop', - maxWidth: dom.getScreenWidth(), - index: 0, - tag: item.ParentBackdropImageTags[0] - }); - imageLoader.lazyImage(itemBackdropElement, imgUrl); - hasbackdrop = true; - } else if (item.ImageTags && item.ImageTags.Primary) { - imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: 'Primary', - maxWidth: dom.getScreenWidth(), - tag: item.ImageTags.Primary - }); - imageLoader.lazyImage(itemBackdropElement, imgUrl); - hasbackdrop = true; - } else { - itemBackdropElement.style.backgroundImage = ''; - } - - return hasbackdrop; - } - - function reloadFromItem(instance, page, params, item, user) { - const apiClient = connectionManager.getApiClient(item.ServerId); - - Emby.Page.setTitle(''); - - // Start rendering the artwork first - renderImage(page, item); - renderLogo(page, item, apiClient); - renderBackdrop(item); - renderDetailPageBackdrop(page, item, apiClient); - - // Render the main information for the item - page.querySelector('.detailPagePrimaryContainer').classList.add('detailRibbon'); - renderName(item, page.querySelector('.nameContainer'), params.context); - renderDetails(page, item, apiClient, params.context); - renderTrackSelections(page, instance, item); - - renderSeriesTimerEditor(page, item, apiClient, user); - renderTimerEditor(page, item, apiClient, user); - setInitialCollapsibleState(page, item, apiClient, params.context, user); - const canPlay = reloadPlayButtons(page, item); - - if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && playbackManager.getSupportedCommands().indexOf('PlayTrailers') !== -1) { - hideAll(page, 'btnPlayTrailer', true); - } else { - hideAll(page, 'btnPlayTrailer'); - } - - setTrailerButtonVisibility(page, item); - - if (item.Type !== 'Program' || canPlay) { - hideAll(page, 'mainDetailButtons', true); - } else { - hideAll(page, 'mainDetailButtons'); - } - - showRecordingFields(instance, page, item, user); - const groupedVersions = (item.MediaSources || []).filter(function (g) { - return g.Type == 'Grouping'; + if (item.AlbumArtists) { + parentNameHtml.push(getArtistLinksHtml(item.AlbumArtists, item.ServerId, context)); + parentNameLast = true; + } else if (item.ArtistItems && item.ArtistItems.length && item.Type === 'MusicVideo') { + parentNameHtml.push(getArtistLinksHtml(item.ArtistItems, item.ServerId, context)); + parentNameLast = true; + } else if (item.SeriesName && item.Type === 'Episode') { + parentRoute = appRouter.getRouteUrl({ + Id: item.SeriesId, + Name: item.SeriesName, + Type: 'Series', + IsFolder: true, + ServerId: item.ServerId + }, { + context: context }); + parentNameHtml.push('' + item.SeriesName + ''); + } else if (item.IsSeries || item.EpisodeTitle) { + parentNameHtml.push(item.Name); + } - if (user.Policy.IsAdministrator && groupedVersions.length) { - page.querySelector('.btnSplitVersions').classList.remove('hide'); - } else { - page.querySelector('.btnSplitVersions').classList.add('hide'); - } + if (item.SeriesName && item.Type === 'Season') { + parentRoute = appRouter.getRouteUrl({ + Id: item.SeriesId, + Name: item.SeriesName, + Type: 'Series', + IsFolder: true, + ServerId: item.ServerId + }, { + context: context + }); + parentNameHtml.push('' + item.SeriesName + ''); + } else if (item.ParentIndexNumber != null && item.Type === 'Episode') { + parentRoute = appRouter.getRouteUrl({ + Id: item.SeasonId, + Name: item.SeasonName, + Type: 'Season', + IsFolder: true, + ServerId: item.ServerId + }, { + context: context + }); + parentNameHtml.push('' + item.SeasonName + ''); + } else if (item.ParentIndexNumber != null && item.IsSeries) { + parentNameHtml.push(item.SeasonName || 'S' + item.ParentIndexNumber); + } else if (item.Album && item.AlbumId && (item.Type === 'MusicVideo' || item.Type === 'Audio')) { + parentRoute = appRouter.getRouteUrl({ + Id: item.AlbumId, + Name: item.Album, + Type: 'MusicAlbum', + IsFolder: true, + ServerId: item.ServerId + }, { + context: context + }); + parentNameHtml.push('' + item.Album + ''); + } else if (item.Album) { + parentNameHtml.push(item.Album); + } - if (itemContextMenu.getCommands(getContextMenuOptions(item, user)).length) { - hideAll(page, 'btnMoreCommands', true); - } else { - hideAll(page, 'btnMoreCommands'); - } + // FIXME: This whole section needs some refactoring, so it becames easier to scale across all form factors. See GH #1022 + let html = ''; + const tvShowHtml = parentNameHtml[0]; + const tvSeasonHtml = parentNameHtml[1]; - const itemBirthday = page.querySelector('#itemBirthday'); - - if (item.Type == 'Person' && item.PremiereDate) { - try { - const birthday = datetime.parseISO8601Date(item.PremiereDate, true).toDateString(); - itemBirthday.classList.remove('hide'); - itemBirthday.innerHTML = globalize.translate('BirthDateValue', birthday); - } catch (err) { - itemBirthday.classList.add('hide'); + if (parentNameHtml.length) { + if (parentNameLast) { + // Music + if (layoutManager.mobile) { + html = '

    ' + parentNameHtml.join('
    ') + '

    '; + } else { + html = '

    ' + parentNameHtml.join(' - ') + '

    '; } } else { + html = '

    ' + tvShowHtml + '

    '; + } + } + + const name = itemHelper.getDisplayName(item, { + includeParentInfo: false + }); + + if (html && !parentNameLast) { + if (tvSeasonHtml) { + html += '

    ' + tvSeasonHtml + ' - ' + name + '

    '; + } else { + html += '

    ' + name + '

    '; + } + } else if (item.OriginalTitle && item.OriginalTitle != item.Name) { + html = '

    ' + name + '

    ' + html; + } else { + html = '

    ' + name + '

    ' + html; + } + + if (item.OriginalTitle && item.OriginalTitle != item.Name) { + html += '

    ' + item.OriginalTitle + '

    '; + } + + container.innerHTML = html; + + if (html.length) { + container.classList.remove('hide'); + } else { + container.classList.add('hide'); + } +} + +function setTrailerButtonVisibility(page, item) { + if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && playbackManager.getSupportedCommands().indexOf('PlayTrailers') !== -1) { + hideAll(page, 'btnPlayTrailer', true); + } else { + hideAll(page, 'btnPlayTrailer'); + } +} + +function renderBackdrop(item) { + if (dom.getWindowSize().innerWidth >= 1000) { + backdrop.setBackdrops([item]); + } else { + backdrop.clearBackdrop(); + } +} + +function renderDetailPageBackdrop(page, item, apiClient) { + let imgUrl; + let hasbackdrop = false; + const itemBackdropElement = page.querySelector('#itemBackdrop'); + + if (!layoutManager.mobile && !userSettings.detailsBanner()) { + return false; + } + + if (item.BackdropImageTags && item.BackdropImageTags.length) { + imgUrl = apiClient.getScaledImageUrl(item.Id, { + type: 'Backdrop', + maxWidth: dom.getScreenWidth(), + index: 0, + tag: item.BackdropImageTags[0] + }); + imageLoader.lazyImage(itemBackdropElement, imgUrl); + hasbackdrop = true; + } else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { + imgUrl = apiClient.getScaledImageUrl(item.ParentBackdropItemId, { + type: 'Backdrop', + maxWidth: dom.getScreenWidth(), + index: 0, + tag: item.ParentBackdropImageTags[0] + }); + imageLoader.lazyImage(itemBackdropElement, imgUrl); + hasbackdrop = true; + } else if (item.ImageTags && item.ImageTags.Primary) { + imgUrl = apiClient.getScaledImageUrl(item.Id, { + type: 'Primary', + maxWidth: dom.getScreenWidth(), + tag: item.ImageTags.Primary + }); + imageLoader.lazyImage(itemBackdropElement, imgUrl); + hasbackdrop = true; + } else { + itemBackdropElement.style.backgroundImage = ''; + } + + return hasbackdrop; +} + +function reloadFromItem(instance, page, params, item, user) { + const apiClient = connectionManager.getApiClient(item.ServerId); + + Emby.Page.setTitle(''); + + // Start rendering the artwork first + renderImage(page, item); + renderLogo(page, item, apiClient); + renderBackdrop(item); + renderDetailPageBackdrop(page, item, apiClient); + + // Render the main information for the item + page.querySelector('.detailPagePrimaryContainer').classList.add('detailRibbon'); + renderName(item, page.querySelector('.nameContainer'), params.context); + renderDetails(page, item, apiClient, params.context); + renderTrackSelections(page, instance, item); + + renderSeriesTimerEditor(page, item, apiClient, user); + renderTimerEditor(page, item, apiClient, user); + setInitialCollapsibleState(page, item, apiClient, params.context, user); + const canPlay = reloadPlayButtons(page, item); + + if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && playbackManager.getSupportedCommands().indexOf('PlayTrailers') !== -1) { + hideAll(page, 'btnPlayTrailer', true); + } else { + hideAll(page, 'btnPlayTrailer'); + } + + setTrailerButtonVisibility(page, item); + + if (item.Type !== 'Program' || canPlay) { + hideAll(page, 'mainDetailButtons', true); + } else { + hideAll(page, 'mainDetailButtons'); + } + + showRecordingFields(instance, page, item, user); + const groupedVersions = (item.MediaSources || []).filter(function (g) { + return g.Type == 'Grouping'; + }); + + if (user.Policy.IsAdministrator && groupedVersions.length) { + page.querySelector('.btnSplitVersions').classList.remove('hide'); + } else { + page.querySelector('.btnSplitVersions').classList.add('hide'); + } + + if (itemContextMenu.getCommands(getContextMenuOptions(item, user)).length) { + hideAll(page, 'btnMoreCommands', true); + } else { + hideAll(page, 'btnMoreCommands'); + } + + const itemBirthday = page.querySelector('#itemBirthday'); + + if (item.Type == 'Person' && item.PremiereDate) { + try { + const birthday = datetime.parseISO8601Date(item.PremiereDate, true).toDateString(); + itemBirthday.classList.remove('hide'); + itemBirthday.innerHTML = globalize.translate('BirthDateValue', birthday); + } catch (err) { itemBirthday.classList.add('hide'); } + } else { + itemBirthday.classList.add('hide'); + } - const itemDeathDate = page.querySelector('#itemDeathDate'); + const itemDeathDate = page.querySelector('#itemDeathDate'); - if (item.Type == 'Person' && item.EndDate) { - try { - const deathday = datetime.parseISO8601Date(item.EndDate, true).toDateString(); - itemDeathDate.classList.remove('hide'); - itemDeathDate.innerHTML = globalize.translate('DeathDateValue', deathday); - } catch (err) { - itemDeathDate.classList.add('hide'); - } - } else { + if (item.Type == 'Person' && item.EndDate) { + try { + const deathday = datetime.parseISO8601Date(item.EndDate, true).toDateString(); + itemDeathDate.classList.remove('hide'); + itemDeathDate.innerHTML = globalize.translate('DeathDateValue', deathday); + } catch (err) { itemDeathDate.classList.add('hide'); } - - const itemBirthLocation = page.querySelector('#itemBirthLocation'); - - if (item.Type == 'Person' && item.ProductionLocations && item.ProductionLocations.length) { - const gmap = '' + item.ProductionLocations[0] + ''; - itemBirthLocation.classList.remove('hide'); - itemBirthLocation.innerHTML = globalize.translate('BirthPlaceValue', gmap); - } else { - itemBirthLocation.classList.add('hide'); - } - - setPeopleHeader(page, item); - loading.hide(); - - if (item.Type === 'Book') { - hideAll(page, 'btnDownload', true); - } - - import('autoFocuser').then(({default: autoFocuser}) => { - autoFocuser.autoFocus(page); - }); + } else { + itemDeathDate.classList.add('hide'); } - function logoImageUrl(item, apiClient, options) { - options = options || {}; - options.type = 'Logo'; + const itemBirthLocation = page.querySelector('#itemBirthLocation'); - if (item.ImageTags && item.ImageTags.Logo) { - options.tag = item.ImageTags.Logo; - return apiClient.getScaledImageUrl(item.Id, options); - } - - if (item.ParentLogoImageTag) { - options.tag = item.ParentLogoImageTag; - return apiClient.getScaledImageUrl(item.ParentLogoItemId, options); - } - - return null; + if (item.Type == 'Person' && item.ProductionLocations && item.ProductionLocations.length) { + const gmap = '' + item.ProductionLocations[0] + ''; + itemBirthLocation.classList.remove('hide'); + itemBirthLocation.innerHTML = globalize.translate('BirthPlaceValue', gmap); + } else { + itemBirthLocation.classList.add('hide'); } - function renderLogo(page, item, apiClient) { - const detailLogo = page.querySelector('.detailLogo'); + setPeopleHeader(page, item); + loading.hide(); - const url = logoImageUrl(item, apiClient, {}); - - if (!layoutManager.mobile && !userSettings.enableBackdrops()) { - detailLogo.classList.add('hide'); - } else if (url) { - detailLogo.classList.remove('hide'); - imageLoader.setLazyImage(detailLogo, url); - } else { - detailLogo.classList.add('hide'); - } + if (item.Type === 'Book' && item.CanDownload && appHost.supports('filedownload')) { + hideAll(page, 'btnDownload', true); } - function showRecordingFields(instance, page, item, user) { - if (!instance.currentRecordingFields) { - const recordingFieldsElement = page.querySelector('.recordingFields'); + import('autoFocuser').then(({ default: autoFocuser }) => { + autoFocuser.autoFocus(page); + }); +} - if (item.Type == 'Program' && user.Policy.EnableLiveTvManagement) { - import('recordingFields').then(({default: recordingFields}) => { - instance.currentRecordingFields = new recordingFields({ - parent: recordingFieldsElement, - programId: item.Id, - serverId: item.ServerId - }); - recordingFieldsElement.classList.remove('hide'); +function logoImageUrl(item, apiClient, options) { + options = options || {}; + options.type = 'Logo'; + + if (item.ImageTags && item.ImageTags.Logo) { + options.tag = item.ImageTags.Logo; + return apiClient.getScaledImageUrl(item.Id, options); + } + + if (item.ParentLogoImageTag) { + options.tag = item.ParentLogoImageTag; + return apiClient.getScaledImageUrl(item.ParentLogoItemId, options); + } + + return null; +} + +function renderLogo(page, item, apiClient) { + const detailLogo = page.querySelector('.detailLogo'); + + const url = logoImageUrl(item, apiClient, {}); + + if (!layoutManager.mobile && !userSettings.enableBackdrops()) { + detailLogo.classList.add('hide'); + } else if (url) { + detailLogo.classList.remove('hide'); + imageLoader.setLazyImage(detailLogo, url); + } else { + detailLogo.classList.add('hide'); + } +} + +function showRecordingFields(instance, page, item, user) { + if (!instance.currentRecordingFields) { + const recordingFieldsElement = page.querySelector('.recordingFields'); + + if (item.Type == 'Program' && user.Policy.EnableLiveTvManagement) { + import('recordingFields').then(({ default: recordingFields }) => { + instance.currentRecordingFields = new recordingFields({ + parent: recordingFieldsElement, + programId: item.Id, + serverId: item.ServerId }); - } else { - recordingFieldsElement.classList.add('hide'); - recordingFieldsElement.innerHTML = ''; - } - } - } - - function renderLinks(page, item) { - const externalLinksElem = page.querySelector('.itemExternalLinks'); - - const links = []; - - if (!layoutManager.tv && item.HomePageUrl) { - links.push(`${globalize.translate('ButtonWebsite')}`); - } - - if (item.ExternalUrls) { - for (const url of item.ExternalUrls) { - links.push(`${url.Name}`); - } - } - - const html = []; - if (links.length) { - html.push(links.join(', ')); - } - - externalLinksElem.innerHTML = html.join(', '); - - if (html.length) { - externalLinksElem.classList.remove('hide'); - } else { - externalLinksElem.classList.add('hide'); - } - } - - function renderDetailImage(elem, item, imageLoader) { - const itemArray = []; - itemArray.push(item); - const cardHtml = cardBuilder.getCardsHtml(itemArray, { - shape: 'auto', - showTitle: false, - centerText: true, - overlayText: false, - transition: false, - disableIndicators: true, - disableHoverMenu: true, - overlayPlayButton: true, - width: dom.getWindowSize().innerWidth * 0.25 - }); - - elem.innerHTML = cardHtml; - imageLoader.lazyChildren(elem); - } - - function renderImage(page, item) { - renderDetailImage( - page.querySelector('.detailImageContainer'), - item, - imageLoader - ); - } - - function refreshDetailImageUserData(elem, item) { - elem.querySelector('.detailImageProgressContainer').innerHTML = indicators.getProgressBarHtml(item); - } - - function refreshImage(page, item) { - refreshDetailImageUserData(page.querySelector('.detailImageContainer'), item); - } - - function setPeopleHeader(page, item) { - if (item.MediaType == 'Audio' || item.Type == 'MusicAlbum' || item.MediaType == 'Book' || item.MediaType == 'Photo') { - page.querySelector('#peopleHeader').innerHTML = globalize.translate('HeaderPeople'); - } else { - page.querySelector('#peopleHeader').innerHTML = globalize.translate('HeaderCastAndCrew'); - } - } - - function renderNextUp(page, item, user) { - const section = page.querySelector('.nextUpSection'); - - if (item.Type != 'Series') { - return void section.classList.add('hide'); - } - - connectionManager.getApiClient(item.ServerId).getNextUpEpisodes({ - SeriesId: item.Id, - UserId: user.Id - }).then(function (result) { - if (result.Items.length) { - section.classList.remove('hide'); - } else { - section.classList.add('hide'); - } - - const html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: 'overflowBackdrop', - showTitle: true, - displayAsSpecial: item.Type == 'Season' && item.IndexNumber, - overlayText: false, - centerText: true, - overlayPlayButton: true + recordingFieldsElement.classList.remove('hide'); }); - const itemsContainer = section.querySelector('.nextUpItems'); - itemsContainer.innerHTML = html; - imageLoader.lazyChildren(itemsContainer); - }); + } else { + recordingFieldsElement.classList.add('hide'); + recordingFieldsElement.innerHTML = ''; + } + } +} + +function renderLinks(page, item) { + const externalLinksElem = page.querySelector('.itemExternalLinks'); + + const links = []; + + if (!layoutManager.tv && item.HomePageUrl) { + links.push(`${globalize.translate('ButtonWebsite')}`); } - function setInitialCollapsibleState(page, item, apiClient, context, user) { - page.querySelector('.collectionItems').innerHTML = ''; + if (item.ExternalUrls) { + for (const url of item.ExternalUrls) { + links.push(`${url.Name}`); + } + } - if (item.Type == 'Playlist') { - page.querySelector('#childrenCollapsible').classList.remove('hide'); - renderPlaylistItems(page, item); - } else if (item.Type == 'Studio' || item.Type == 'Person' || item.Type == 'Genre' || item.Type == 'MusicGenre' || item.Type == 'MusicArtist') { - page.querySelector('#childrenCollapsible').classList.remove('hide'); - renderItemsByName(page, item); - } else if (item.IsFolder) { - if (item.Type == 'BoxSet') { - page.querySelector('#childrenCollapsible').classList.add('hide'); - } + const html = []; + if (links.length) { + html.push(links.join(', ')); + } - renderChildren(page, item); + externalLinksElem.innerHTML = html.join(', '); + + if (html.length) { + externalLinksElem.classList.remove('hide'); + } else { + externalLinksElem.classList.add('hide'); + } +} + +function renderDetailImage(elem, item, imageLoader) { + const itemArray = []; + itemArray.push(item); + const cardHtml = cardBuilder.getCardsHtml(itemArray, { + shape: 'auto', + showTitle: false, + centerText: true, + overlayText: false, + transition: false, + disableIndicators: true, + overlayPlayButton: true, + action: 'play', + width: dom.getWindowSize().innerWidth * 0.25 + }); + + elem.innerHTML = cardHtml; + imageLoader.lazyChildren(elem); +} + +function renderImage(page, item) { + renderDetailImage( + page.querySelector('.detailImageContainer'), + item, + imageLoader + ); +} + +function refreshDetailImageUserData(elem, item) { + elem.querySelector('.detailImageProgressContainer').innerHTML = indicators.getProgressBarHtml(item); +} + +function refreshImage(page, item) { + refreshDetailImageUserData(page.querySelector('.detailImageContainer'), item); +} + +function setPeopleHeader(page, item) { + if (item.MediaType == 'Audio' || item.Type == 'MusicAlbum' || item.MediaType == 'Book' || item.MediaType == 'Photo') { + page.querySelector('#peopleHeader').innerHTML = globalize.translate('People'); + } else { + page.querySelector('#peopleHeader').innerHTML = globalize.translate('HeaderCastAndCrew'); + } +} + +function renderNextUp(page, item, user) { + const section = page.querySelector('.nextUpSection'); + + if (item.Type != 'Series') { + return void section.classList.add('hide'); + } + + connectionManager.getApiClient(item.ServerId).getNextUpEpisodes({ + SeriesId: item.Id, + UserId: user.Id + }).then(function (result) { + if (result.Items.length) { + section.classList.remove('hide'); } else { + section.classList.add('hide'); + } + + const html = cardBuilder.getCardsHtml({ + items: result.Items, + shape: 'overflowBackdrop', + showTitle: true, + displayAsSpecial: item.Type == 'Season' && item.IndexNumber, + overlayText: false, + centerText: true, + overlayPlayButton: true + }); + const itemsContainer = section.querySelector('.nextUpItems'); + itemsContainer.innerHTML = html; + imageLoader.lazyChildren(itemsContainer); + }); +} + +function setInitialCollapsibleState(page, item, apiClient, context, user) { + page.querySelector('.collectionItems').innerHTML = ''; + + if (item.Type == 'Playlist') { + page.querySelector('#childrenCollapsible').classList.remove('hide'); + renderPlaylistItems(page, item); + } else if (item.Type == 'Studio' || item.Type == 'Person' || item.Type == 'Genre' || item.Type == 'MusicGenre' || item.Type == 'MusicArtist') { + page.querySelector('#childrenCollapsible').classList.remove('hide'); + renderItemsByName(page, item); + } else if (item.IsFolder) { + if (item.Type == 'BoxSet') { page.querySelector('#childrenCollapsible').classList.add('hide'); } - if (item.Type == 'Series') { - renderSeriesSchedule(page, item); - renderNextUp(page, item, user); - } else { - page.querySelector('.nextUpSection').classList.add('hide'); - } - - renderScenes(page, item); - - if (item.SpecialFeatureCount && item.SpecialFeatureCount != 0 && item.Type != 'Series') { - page.querySelector('#specialsCollapsible').classList.remove('hide'); - renderSpecials(page, item, user); - } else { - page.querySelector('#specialsCollapsible').classList.add('hide'); - } - - renderCast(page, item); - - if (item.PartCount && item.PartCount > 1) { - page.querySelector('#additionalPartsCollapsible').classList.remove('hide'); - renderAdditionalParts(page, item, user); - } else { - page.querySelector('#additionalPartsCollapsible').classList.add('hide'); - } - - if (item.Type == 'MusicAlbum') { - renderMusicVideos(page, item, user); - } else { - page.querySelector('#musicVideosCollapsible').classList.add('hide'); - } + renderChildren(page, item); + } else { + page.querySelector('#childrenCollapsible').classList.add('hide'); } - function toggleLineClamp(clampTarget, e) { - const expandButton = e.target; - const clampClassName = 'detail-clamp-text'; - - if (clampTarget.classList.contains(clampClassName)) { - clampTarget.classList.remove(clampClassName); - expandButton.innerHTML = globalize.translate('ShowLess'); - } else { - clampTarget.classList.add(clampClassName); - expandButton.innerHTML = globalize.translate('ShowMore'); - } + if (item.Type == 'Series') { + renderSeriesSchedule(page, item); + renderNextUp(page, item, user); + } else { + page.querySelector('.nextUpSection').classList.add('hide'); } - function renderOverview(page, item) { - for (const overviewElemnt of page.querySelectorAll('.overview')) { - const overview = item.Overview || ''; + renderScenes(page, item); - if (overview) { - overviewElemnt.innerHTML = overview; - overviewElemnt.classList.remove('hide'); - overviewElemnt.classList.add('detail-clamp-text'); + if (item.SpecialFeatureCount && item.SpecialFeatureCount != 0 && item.Type != 'Series') { + page.querySelector('#specialsCollapsible').classList.remove('hide'); + renderSpecials(page, item, user); + } else { + page.querySelector('#specialsCollapsible').classList.add('hide'); + } - // Grab the sibling element to control the expand state - const expandButton = overviewElemnt.parentElement.querySelector('.overview-expand'); + renderCast(page, item); - // Detect if we have overflow of text. Based on this StackOverflow answer - // https://stackoverflow.com/a/35157976 - if (Math.abs(overviewElemnt.scrollHeight - overviewElemnt.offsetHeight) > 2) { - expandButton.classList.remove('hide'); - } else { - expandButton.classList.add('hide'); - } + if (item.PartCount && item.PartCount > 1) { + page.querySelector('#additionalPartsCollapsible').classList.remove('hide'); + renderAdditionalParts(page, item, user); + } else { + page.querySelector('#additionalPartsCollapsible').classList.add('hide'); + } - expandButton.addEventListener('click', toggleLineClamp.bind(null, overviewElemnt)); + if (item.Type == 'MusicAlbum') { + renderMusicVideos(page, item, user); + } else { + page.querySelector('#musicVideosCollapsible').classList.add('hide'); + } +} - for (const anchor of overviewElemnt.querySelectorAll('a')) { - anchor.setAttribute('target', '_blank'); - } +function toggleLineClamp(clampTarget, e) { + const expandButton = e.target; + const clampClassName = 'detail-clamp-text'; + + if (clampTarget.classList.contains(clampClassName)) { + clampTarget.classList.remove(clampClassName); + expandButton.innerHTML = globalize.translate('ShowLess'); + } else { + clampTarget.classList.add(clampClassName); + expandButton.innerHTML = globalize.translate('ShowMore'); + } +} + +function renderOverview(page, item) { + for (const overviewElemnt of page.querySelectorAll('.overview')) { + const overview = item.Overview || ''; + + if (overview) { + overviewElemnt.innerHTML = overview; + overviewElemnt.classList.remove('hide'); + overviewElemnt.classList.add('detail-clamp-text'); + + // Grab the sibling element to control the expand state + const expandButton = overviewElemnt.parentElement.querySelector('.overview-expand'); + + // Detect if we have overflow of text. Based on this StackOverflow answer + // https://stackoverflow.com/a/35157976 + if (Math.abs(overviewElemnt.scrollHeight - overviewElemnt.offsetHeight) > 2) { + expandButton.classList.remove('hide'); } else { - overviewElemnt.innerHTML = ''; - overviewElemnt.classList.add('hide'); + expandButton.classList.add('hide'); } - } - } - function renderGenres(page, item, context = inferContext(item)) { - const genres = item.GenreItems || []; - const type = context === 'music' ? 'MusicGenre' : 'Genre'; + expandButton.addEventListener('click', toggleLineClamp.bind(null, overviewElemnt)); - const html = genres.map(function (p) { - return '' + p.Name + ''; - }).join(', '); - - const genresLabel = page.querySelector('.genresLabel'); - genresLabel.innerHTML = globalize.translate(genres.length > 1 ? 'Genres' : 'Genre'); - const genresValue = page.querySelector('.genres'); - genresValue.innerHTML = html; - - const genresGroup = page.querySelector('.genresGroup'); - if (genres.length) { - genresGroup.classList.remove('hide'); + for (const anchor of overviewElemnt.querySelectorAll('a')) { + anchor.setAttribute('target', '_blank'); + } } else { - genresGroup.classList.add('hide'); + overviewElemnt.innerHTML = ''; + overviewElemnt.classList.add('hide'); } } +} - function renderWriter(page, item, context) { - const writers = (item.People || []).filter(function (person) { - return person.Type === 'Writer'; +function renderGenres(page, item, context = inferContext(item)) { + const genres = item.GenreItems || []; + const type = context === 'music' ? 'MusicGenre' : 'Genre'; + + const html = genres.map(function (p) { + return '' + p.Name + ''; + }).join(', '); + + const genresLabel = page.querySelector('.genresLabel'); + genresLabel.innerHTML = globalize.translate(genres.length > 1 ? 'Genres' : 'Genre'); + const genresValue = page.querySelector('.genres'); + genresValue.innerHTML = html; + + const genresGroup = page.querySelector('.genresGroup'); + if (genres.length) { + genresGroup.classList.remove('hide'); + } else { + genresGroup.classList.add('hide'); + } +} + +function renderWriter(page, item, context) { + const writers = (item.People || []).filter(function (person) { + return person.Type === 'Writer'; + }); + + const html = writers.map(function (person) { + return '' + person.Name + ''; + }).join(', '); + + const writersLabel = page.querySelector('.writersLabel'); + writersLabel.innerHTML = globalize.translate(writers.length > 1 ? 'Writers' : 'Writer'); + const writersValue = page.querySelector('.writers'); + writersValue.innerHTML = html; + + const writersGroup = page.querySelector('.writersGroup'); + if (writers.length) { + writersGroup.classList.remove('hide'); + } else { + writersGroup.classList.add('hide'); + } +} + +function renderDirector(page, item, context) { + const directors = (item.People || []).filter(function (person) { + return person.Type === 'Director'; + }); + + const html = directors.map(function (person) { + return '' + person.Name + ''; + }).join(', '); + + const directorsLabel = page.querySelector('.directorsLabel'); + directorsLabel.innerHTML = globalize.translate(directors.length > 1 ? 'Directors' : 'Director'); + const directorsValue = page.querySelector('.directors'); + directorsValue.innerHTML = html; + + const directorsGroup = page.querySelector('.directorsGroup'); + if (directors.length) { + directorsGroup.classList.remove('hide'); + } else { + directorsGroup.classList.add('hide'); + } +} + +function renderMiscInfo(page, item) { + const primaryItemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary'); + + for (const miscInfo of primaryItemMiscInfo) { + mediaInfo.fillPrimaryMediaInfo(miscInfo, item, { + interactive: true, + episodeTitle: false, + subtitles: false }); - const html = writers.map(function (person) { - return '' + person.Name + ''; - }).join(', '); - - const writersLabel = page.querySelector('.writersLabel'); - writersLabel.innerHTML = globalize.translate(writers.length > 1 ? 'Writers' : 'Writer'); - const writersValue = page.querySelector('.writers'); - writersValue.innerHTML = html; - - const writersGroup = page.querySelector('.writersGroup'); - if (writers.length) { - writersGroup.classList.remove('hide'); + if (miscInfo.innerHTML && item.Type !== 'SeriesTimer') { + miscInfo.classList.remove('hide'); } else { - writersGroup.classList.add('hide'); + miscInfo.classList.add('hide'); } } - function renderDirector(page, item, context) { - const directors = (item.People || []).filter(function (person) { - return person.Type === 'Director'; + const secondaryItemMiscInfo = page.querySelectorAll('.itemMiscInfo-secondary'); + + for (const miscInfo of secondaryItemMiscInfo) { + mediaInfo.fillSecondaryMediaInfo(miscInfo, item, { + interactive: true }); - const html = directors.map(function (person) { - return '' + person.Name + ''; - }).join(', '); - - const directorsLabel = page.querySelector('.directorsLabel'); - directorsLabel.innerHTML = globalize.translate(directors.length > 1 ? 'Directors' : 'Director'); - const directorsValue = page.querySelector('.directors'); - directorsValue.innerHTML = html; - - const directorsGroup = page.querySelector('.directorsGroup'); - if (directors.length) { - directorsGroup.classList.remove('hide'); + if (miscInfo.innerHTML && item.Type !== 'SeriesTimer') { + miscInfo.classList.remove('hide'); } else { - directorsGroup.classList.add('hide'); + miscInfo.classList.add('hide'); } } +} - function renderMiscInfo(page, item) { - const primaryItemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary'); +function renderTagline(page, item) { + const taglineElement = page.querySelector('.tagline'); - for (const miscInfo of primaryItemMiscInfo) { - mediaInfo.fillPrimaryMediaInfo(miscInfo, item, { - interactive: true, - episodeTitle: false, - subtitles: false - }); + if (item.Taglines && item.Taglines.length) { + taglineElement.classList.remove('hide'); + taglineElement.innerHTML = item.Taglines[0]; + } else { + taglineElement.classList.add('hide'); + } +} - if (miscInfo.innerHTML && item.Type !== 'SeriesTimer') { - miscInfo.classList.remove('hide'); - } else { - miscInfo.classList.add('hide'); - } +function renderDetails(page, item, apiClient, context, isStatic) { + renderSimilarItems(page, item, context); + renderMoreFromSeason(page, item, apiClient); + renderMoreFromArtist(page, item, apiClient); + renderDirector(page, item, context); + renderWriter(page, item, context); + renderGenres(page, item, context); + renderChannelGuide(page, apiClient, item); + renderTagline(page, item); + renderOverview(page, item); + renderMiscInfo(page, item); + reloadUserDataButtons(page, item); + renderLinks(page, item); + renderTags(page, item); + renderSeriesAirTime(page, item, isStatic); +} + +function enableScrollX() { + return browser.mobile && window.screen.availWidth <= 1000; +} + +function getPortraitShape(scrollX) { + if (scrollX == null) { + scrollX = enableScrollX(); + } + + return scrollX ? 'overflowPortrait' : 'portrait'; +} + +function getSquareShape(scrollX) { + if (scrollX == null) { + scrollX = enableScrollX(); + } + + return scrollX ? 'overflowSquare' : 'square'; +} + +function renderMoreFromSeason(view, item, apiClient) { + const section = view.querySelector('.moreFromSeasonSection'); + + if (section) { + if (item.Type !== 'Episode' || !item.SeasonId || !item.SeriesId) { + return void section.classList.add('hide'); } - const secondaryItemMiscInfo = page.querySelectorAll('.itemMiscInfo-secondary'); - - for (const miscInfo of secondaryItemMiscInfo) { - mediaInfo.fillSecondaryMediaInfo(miscInfo, item, { - interactive: true - }); - - if (miscInfo.innerHTML && item.Type !== 'SeriesTimer') { - miscInfo.classList.remove('hide'); - } else { - miscInfo.classList.add('hide'); - } - } - } - - function renderTagline(page, item) { - const taglineElement = page.querySelector('.tagline'); - - if (item.Taglines && item.Taglines.length) { - taglineElement.classList.remove('hide'); - taglineElement.innerHTML = item.Taglines[0]; - } else { - taglineElement.classList.add('hide'); - } - } - - function renderDetails(page, item, apiClient, context, isStatic) { - renderSimilarItems(page, item, context); - renderMoreFromSeason(page, item, apiClient); - renderMoreFromArtist(page, item, apiClient); - renderDirector(page, item, context); - renderWriter(page, item, context); - renderGenres(page, item, context); - renderChannelGuide(page, apiClient, item); - renderTagline(page, item); - renderOverview(page, item); - renderMiscInfo(page, item); - reloadUserDataButtons(page, item); - renderLinks(page, item); - renderTags(page, item); - renderSeriesAirTime(page, item, isStatic); - } - - function enableScrollX() { - return browser.mobile && screen.availWidth <= 1000; - } - - function getPortraitShape(scrollX) { - if (scrollX == null) { - scrollX = enableScrollX(); - } - - return scrollX ? 'overflowPortrait' : 'portrait'; - } - - function getSquareShape(scrollX) { - if (scrollX == null) { - scrollX = enableScrollX(); - } - - return scrollX ? 'overflowSquare' : 'square'; - } - - function renderMoreFromSeason(view, item, apiClient) { - const section = view.querySelector('.moreFromSeasonSection'); - - if (section) { - if (item.Type !== 'Episode' || !item.SeasonId || !item.SeriesId) { + const userId = apiClient.getCurrentUserId(); + apiClient.getEpisodes(item.SeriesId, { + SeasonId: item.SeasonId, + UserId: userId, + Fields: 'ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount' + }).then(function (result) { + if (result.Items.length < 2) { return void section.classList.add('hide'); } - const userId = apiClient.getCurrentUserId(); - apiClient.getEpisodes(item.SeriesId, { - SeasonId: item.SeasonId, - UserId: userId, - Fields: 'ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount' - }).then(function (result) { - if (result.Items.length < 2) { - return void section.classList.add('hide'); - } - - section.classList.remove('hide'); - section.querySelector('h2').innerHTML = globalize.translate('MoreFromValue', item.SeasonName); - const itemsContainer = section.querySelector('.itemsContainer'); - cardBuilder.buildCards(result.Items, { - parentContainer: section, - itemsContainer: itemsContainer, - shape: 'autooverflow', - sectionTitleTagName: 'h2', - scalable: true, - showTitle: true, - overlayText: false, - centerText: true, - includeParentInfoInTitle: false, - allowBottomPadding: false - }); - const card = itemsContainer.querySelector('.card[data-id="' + item.Id + '"]'); - - if (card) { - setTimeout(function () { - section.querySelector('.emby-scroller').toStart(card.previousSibling || card, true); - }, 100); - } + section.classList.remove('hide'); + section.querySelector('h2').innerHTML = globalize.translate('MoreFromValue', item.SeasonName); + const itemsContainer = section.querySelector('.itemsContainer'); + cardBuilder.buildCards(result.Items, { + parentContainer: section, + itemsContainer: itemsContainer, + shape: 'autooverflow', + sectionTitleTagName: 'h2', + scalable: true, + showTitle: true, + overlayText: false, + centerText: true, + includeParentInfoInTitle: false, + allowBottomPadding: false }); - } + const card = itemsContainer.querySelector('.card[data-id="' + item.Id + '"]'); + + if (card) { + setTimeout(function () { + section.querySelector('.emby-scroller').toStart(card.previousSibling || card, true); + }, 100); + } + }); } +} - function renderMoreFromArtist(view, item, apiClient) { - const section = view.querySelector('.moreFromArtistSection'); +function renderMoreFromArtist(view, item, apiClient) { + const section = view.querySelector('.moreFromArtistSection'); - if (section) { - if (item.Type === 'MusicArtist') { - if (!apiClient.isMinServerVersion('3.4.1.19')) { - return void section.classList.add('hide'); - } - } else if (item.Type !== 'MusicAlbum' || !item.AlbumArtists || !item.AlbumArtists.length) { + if (section) { + if (item.Type === 'MusicArtist') { + if (!apiClient.isMinServerVersion('3.4.1.19')) { + return void section.classList.add('hide'); + } + } else if (item.Type !== 'MusicAlbum' || !item.AlbumArtists || !item.AlbumArtists.length) { + return void section.classList.add('hide'); + } + + const query = { + IncludeItemTypes: 'MusicAlbum', + Recursive: true, + ExcludeItemIds: item.Id, + SortBy: 'ProductionYear,SortName', + SortOrder: 'Descending' + }; + + if (item.Type === 'MusicArtist') { + query.ContributingArtistIds = item.Id; + } else if (apiClient.isMinServerVersion('3.4.1.18')) { + query.AlbumArtistIds = item.AlbumArtists[0].Id; + } else { + query.ArtistIds = item.AlbumArtists[0].Id; + } + + apiClient.getItems(apiClient.getCurrentUserId(), query).then(function (result) { + if (!result.Items.length) { return void section.classList.add('hide'); } - const query = { - IncludeItemTypes: 'MusicAlbum', - Recursive: true, - ExcludeItemIds: item.Id, - SortBy: 'ProductionYear,SortName', - SortOrder: 'Descending' - }; + section.classList.remove('hide'); if (item.Type === 'MusicArtist') { - query.ContributingArtistIds = item.Id; - } else if (apiClient.isMinServerVersion('3.4.1.18')) { - query.AlbumArtistIds = item.AlbumArtists[0].Id; + section.querySelector('h2').innerHTML = globalize.translate('HeaderAppearsOn'); } else { - query.ArtistIds = item.AlbumArtists[0].Id; + section.querySelector('h2').innerHTML = globalize.translate('MoreFromValue', item.AlbumArtists[0].Name); } - apiClient.getItems(apiClient.getCurrentUserId(), query).then(function (result) { - if (!result.Items.length) { - return void section.classList.add('hide'); - } - - section.classList.remove('hide'); - - if (item.Type === 'MusicArtist') { - section.querySelector('h2').innerHTML = globalize.translate('HeaderAppearsOn'); - } else { - section.querySelector('h2').innerHTML = globalize.translate('MoreFromValue', item.AlbumArtists[0].Name); - } - - cardBuilder.buildCards(result.Items, { - parentContainer: section, - itemsContainer: section.querySelector('.itemsContainer'), - shape: 'autooverflow', - sectionTitleTagName: 'h2', - scalable: true, - coverImage: item.Type === 'MusicArtist' || item.Type === 'MusicAlbum', - showTitle: true, - showParentTitle: false, - centerText: true, - overlayText: false, - overlayPlayButton: true, - showYear: true - }); + cardBuilder.buildCards(result.Items, { + parentContainer: section, + itemsContainer: section.querySelector('.itemsContainer'), + shape: 'autooverflow', + sectionTitleTagName: 'h2', + scalable: true, + coverImage: item.Type === 'MusicArtist' || item.Type === 'MusicAlbum', + showTitle: true, + showParentTitle: false, + centerText: true, + overlayText: false, + overlayPlayButton: true, + showYear: true }); - } + }); } +} - function renderSimilarItems(page, item, context) { - const similarCollapsible = page.querySelector('#similarCollapsible'); +function renderSimilarItems(page, item, context) { + const similarCollapsible = page.querySelector('#similarCollapsible'); - if (similarCollapsible) { - if (item.Type != 'Movie' && item.Type != 'Trailer' && item.Type != 'Series' && item.Type != 'Program' && item.Type != 'Recording' && item.Type != 'MusicAlbum' && item.Type != 'MusicArtist' && item.Type != 'Playlist') { + if (similarCollapsible) { + if (item.Type != 'Movie' && item.Type != 'Trailer' && item.Type != 'Series' && item.Type != 'Program' && item.Type != 'Recording' && item.Type != 'MusicAlbum' && item.Type != 'MusicArtist' && item.Type != 'Playlist') { + return void similarCollapsible.classList.add('hide'); + } + + similarCollapsible.classList.remove('hide'); + const apiClient = connectionManager.getApiClient(item.ServerId); + const options = { + userId: apiClient.getCurrentUserId(), + limit: 12, + fields: 'PrimaryImageAspectRatio,UserData,CanDelete' + }; + + if (item.Type == 'MusicAlbum' && item.AlbumArtists && item.AlbumArtists.length) { + options.ExcludeArtistIds = item.AlbumArtists[0].Id; + } + + apiClient.getSimilarItems(item.Id, options).then(function (result) { + if (!result.Items.length) { return void similarCollapsible.classList.add('hide'); } similarCollapsible.classList.remove('hide'); - const apiClient = connectionManager.getApiClient(item.ServerId); - const options = { - userId: apiClient.getCurrentUserId(), - limit: 12, - fields: 'PrimaryImageAspectRatio,UserData,CanDelete' - }; - - if (item.Type == 'MusicAlbum' && item.AlbumArtists && item.AlbumArtists.length) { - options.ExcludeArtistIds = item.AlbumArtists[0].Id; - } - - apiClient.getSimilarItems(item.Id, options).then(function (result) { - if (!result.Items.length) { - return void similarCollapsible.classList.add('hide'); - } - - similarCollapsible.classList.remove('hide'); - let html = ''; - html += cardBuilder.getCardsHtml({ - items: result.Items, - shape: 'autooverflow', - showParentTitle: item.Type == 'MusicAlbum', - centerText: true, - showTitle: true, - context: context, - lazy: true, - showDetailsMenu: true, - coverImage: item.Type == 'MusicAlbum' || item.Type == 'MusicArtist', - overlayPlayButton: true, - overlayText: false, - showYear: item.Type === 'Movie' || item.Type === 'Trailer' || item.Type === 'Series' - }); - const similarContent = similarCollapsible.querySelector('.similarContent'); - similarContent.innerHTML = html; - imageLoader.lazyChildren(similarContent); - }); - } - } - - function renderSeriesAirTime(page, item, isStatic) { - const seriesAirTime = page.querySelector('#seriesAirTime'); - if (item.Type != 'Series') { - seriesAirTime.classList.add('hide'); - return; - } - let html = ''; - if (item.AirDays && item.AirDays.length) { - if (item.AirDays.length == 7) { - html += 'daily'; - } else { - html += item.AirDays.map(function (a) { - return a + 's'; - }).join(','); - } - } - if (item.AirTime) { - html += ' at ' + item.AirTime; - } - if (item.Studios.length) { - if (isStatic) { - html += ' on ' + item.Studios[0].Name; - } else { - const context = inferContext(item); - const href = appRouter.getRouteUrl(item.Studios[0], { - context: context, - itemType: 'Studio', - serverId: item.ServerId - }); - html += ' on ' + item.Studios[0].Name + ''; - } - } - if (html) { - html = (item.Status == 'Ended' ? 'Aired ' : 'Airs ') + html; - seriesAirTime.innerHTML = html; - seriesAirTime.classList.remove('hide'); - } else { - seriesAirTime.classList.add('hide'); - } - } - - function renderTags(page, item) { - const itemTags = page.querySelector('.itemTags'); - const tagElements = []; - let tags = item.Tags || []; - - if (item.Type === 'Program') { - tags = []; - } - - for (let i = 0, length = tags.length; i < length; i++) { - tagElements.push(tags[i]); - } - - if (tagElements.length) { - itemTags.innerHTML = globalize.translate('TagsValue', tagElements.join(', ')); - itemTags.classList.remove('hide'); - } else { - itemTags.innerHTML = ''; - itemTags.classList.add('hide'); - } - } - - function renderChildren(page, item) { - let fields = 'ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount'; - const query = { - ParentId: item.Id, - Fields: fields - }; - - if (item.Type !== 'BoxSet') { - query.SortBy = 'SortName'; - } - - let promise; - const apiClient = connectionManager.getApiClient(item.ServerId); - const userId = apiClient.getCurrentUserId(); - - if (item.Type == 'Series') { - promise = apiClient.getSeasons(item.Id, { - userId: userId, - Fields: fields - }); - } else if (item.Type == 'Season') { - fields += ',Overview'; - promise = apiClient.getEpisodes(item.SeriesId, { - seasonId: item.Id, - userId: userId, - Fields: fields - }); - } else if (item.Type == 'MusicArtist') { - query.SortBy = 'ProductionYear,SortName'; - } - - promise = promise || apiClient.getItems(apiClient.getCurrentUserId(), query); - promise.then(function (result) { let html = ''; - let scrollX = false; - let isList = false; - const childrenItemsContainer = page.querySelector('.childrenItemsContainer'); + html += cardBuilder.getCardsHtml({ + items: result.Items, + shape: 'autooverflow', + showParentTitle: item.Type == 'MusicAlbum', + centerText: true, + showTitle: true, + context: context, + lazy: true, + showDetailsMenu: true, + coverImage: item.Type == 'MusicAlbum' || item.Type == 'MusicArtist', + overlayPlayButton: true, + overlayText: false, + showYear: item.Type === 'Movie' || item.Type === 'Trailer' || item.Type === 'Series' + }); + const similarContent = similarCollapsible.querySelector('.similarContent'); + similarContent.innerHTML = html; + imageLoader.lazyChildren(similarContent); + }); + } +} - if (item.Type == 'MusicAlbum') { - html = listView.getListViewHtml({ - items: result.Items, - smallIcon: true, - showIndex: true, - index: 'disc', - showIndexNumberLeft: true, - playFromHere: true, - action: 'playallfromhere', - image: false, - artist: 'auto', - containerAlbumArtists: item.AlbumArtists - }); +function renderSeriesAirTime(page, item, isStatic) { + const seriesAirTime = page.querySelector('#seriesAirTime'); + if (item.Type != 'Series') { + seriesAirTime.classList.add('hide'); + return; + } + let html = ''; + if (item.AirDays && item.AirDays.length) { + if (item.AirDays.length == 7) { + html += 'daily'; + } else { + html += item.AirDays.map(function (a) { + return a + 's'; + }).join(','); + } + } + if (item.AirTime) { + html += ' at ' + item.AirTime; + } + if (item.Studios.length) { + if (isStatic) { + html += ' on ' + item.Studios[0].Name; + } else { + const context = inferContext(item); + const href = appRouter.getRouteUrl(item.Studios[0], { + context: context, + itemType: 'Studio', + serverId: item.ServerId + }); + html += ' on ' + item.Studios[0].Name + ''; + } + } + if (html) { + html = (item.Status == 'Ended' ? 'Aired ' : 'Airs ') + html; + seriesAirTime.innerHTML = html; + seriesAirTime.classList.remove('hide'); + } else { + seriesAirTime.classList.add('hide'); + } +} + +function renderTags(page, item) { + const itemTags = page.querySelector('.itemTags'); + const tagElements = []; + let tags = item.Tags || []; + + if (item.Type === 'Program') { + tags = []; + } + + for (let i = 0, length = tags.length; i < length; i++) { + tagElements.push(tags[i]); + } + + if (tagElements.length) { + itemTags.innerHTML = globalize.translate('TagsValue', tagElements.join(', ')); + itemTags.classList.remove('hide'); + } else { + itemTags.innerHTML = ''; + itemTags.classList.add('hide'); + } +} + +function renderChildren(page, item) { + let fields = 'ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount'; + const query = { + ParentId: item.Id, + Fields: fields + }; + + if (item.Type !== 'BoxSet') { + query.SortBy = 'SortName'; + } + + let promise; + const apiClient = connectionManager.getApiClient(item.ServerId); + const userId = apiClient.getCurrentUserId(); + + if (item.Type == 'Series') { + promise = apiClient.getSeasons(item.Id, { + userId: userId, + Fields: fields + }); + } else if (item.Type == 'Season') { + fields += ',Overview'; + promise = apiClient.getEpisodes(item.SeriesId, { + seasonId: item.Id, + userId: userId, + Fields: fields + }); + } else if (item.Type == 'MusicArtist') { + query.SortBy = 'ProductionYear,SortName'; + } + + promise = promise || apiClient.getItems(apiClient.getCurrentUserId(), query); + promise.then(function (result) { + let html = ''; + let scrollX = false; + let isList = false; + const childrenItemsContainer = page.querySelector('.childrenItemsContainer'); + + if (item.Type == 'MusicAlbum') { + html = listView.getListViewHtml({ + items: result.Items, + smallIcon: true, + showIndex: true, + index: 'disc', + showIndexNumberLeft: true, + playFromHere: true, + action: 'playallfromhere', + image: false, + artist: 'auto', + containerAlbumArtists: item.AlbumArtists + }); + isList = true; + } else if (item.Type == 'Series') { + scrollX = enableScrollX(); + html = cardBuilder.getCardsHtml({ + items: result.Items, + shape: 'overflowPortrait', + showTitle: true, + centerText: true, + lazy: true, + overlayPlayButton: true, + allowBottomPadding: !scrollX + }); + } else if (item.Type == 'Season' || item.Type == 'Episode') { + if (item.Type !== 'Episode') { isList = true; - } else if (item.Type == 'Series') { - scrollX = enableScrollX(); + } + scrollX = item.Type == 'Episode'; + if (result.Items.length < 2 && item.Type === 'Episode') { + return; + } + + if (item.Type === 'Episode') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: 'overflowPortrait', + shape: 'overflowBackdrop', showTitle: true, - centerText: true, + displayAsSpecial: item.Type == 'Season' && item.IndexNumber, + playFromHere: true, + overlayText: true, lazy: true, + showDetailsMenu: true, overlayPlayButton: true, - allowBottomPadding: !scrollX + allowBottomPadding: !scrollX, + includeParentInfoInTitle: false + }); + } else if (item.Type === 'Season') { + html = listView.getListViewHtml({ + items: result.Items, + showIndexNumber: false, + enableOverview: true, + enablePlayedButton: layoutManager.mobile ? false : true, + infoButton: layoutManager.mobile ? false : true, + imageSize: 'large', + enableSideMediaInfo: false, + highlight: false, + action: !layoutManager.desktop ? 'link' : 'none', + imagePlayButton: true, + includeParentInfoInTitle: false }); - } else if (item.Type == 'Season' || item.Type == 'Episode') { - if (item.Type !== 'Episode') { - isList = true; - } - scrollX = item.Type == 'Episode'; - if (result.Items.length < 2 && item.Type === 'Episode') { - return; - } - - if (item.Type === 'Episode') { - html = cardBuilder.getCardsHtml({ - items: result.Items, - shape: 'overflowBackdrop', - showTitle: true, - displayAsSpecial: item.Type == 'Season' && item.IndexNumber, - playFromHere: true, - overlayText: true, - lazy: true, - showDetailsMenu: true, - overlayPlayButton: true, - allowBottomPadding: !scrollX, - includeParentInfoInTitle: false - }); - } else if (item.Type === 'Season') { - html = listView.getListViewHtml({ - items: result.Items, - showIndexNumber: false, - enableOverview: true, - enablePlayedButton: layoutManager.mobile ? false : true, - infoButton: layoutManager.mobile ? false : true, - imageSize: 'large', - enableSideMediaInfo: false, - highlight: false, - action: !layoutManager.desktop ? 'link' : 'none', - imagePlayButton: true, - includeParentInfoInTitle: false - }); - } } + } - if (item.Type !== 'BoxSet') { - page.querySelector('#childrenCollapsible').classList.remove('hide'); - } - if (scrollX) { - childrenItemsContainer.classList.add('scrollX'); - childrenItemsContainer.classList.add('hiddenScrollX'); + if (item.Type !== 'BoxSet') { + page.querySelector('#childrenCollapsible').classList.remove('hide'); + } + if (scrollX) { + childrenItemsContainer.classList.add('scrollX'); + childrenItemsContainer.classList.add('hiddenScrollX'); + childrenItemsContainer.classList.remove('vertical-wrap'); + childrenItemsContainer.classList.remove('vertical-list'); + } else { + childrenItemsContainer.classList.remove('scrollX'); + childrenItemsContainer.classList.remove('hiddenScrollX'); + childrenItemsContainer.classList.remove('smoothScrollX'); + if (isList) { + childrenItemsContainer.classList.add('vertical-list'); childrenItemsContainer.classList.remove('vertical-wrap'); - childrenItemsContainer.classList.remove('vertical-list'); } else { - childrenItemsContainer.classList.remove('scrollX'); - childrenItemsContainer.classList.remove('hiddenScrollX'); - childrenItemsContainer.classList.remove('smoothScrollX'); - if (isList) { - childrenItemsContainer.classList.add('vertical-list'); - childrenItemsContainer.classList.remove('vertical-wrap'); - } else { - childrenItemsContainer.classList.add('vertical-wrap'); - childrenItemsContainer.classList.remove('vertical-list'); - } + childrenItemsContainer.classList.add('vertical-wrap'); + childrenItemsContainer.classList.remove('vertical-list'); } - if (layoutManager.mobile) { - childrenItemsContainer.classList.remove('padded-right'); - } - childrenItemsContainer.innerHTML = html; - imageLoader.lazyChildren(childrenItemsContainer); - if (item.Type == 'BoxSet') { - const collectionItemTypes = [{ - name: globalize.translate('HeaderVideos'), - mediaType: 'Video' - }, { - name: globalize.translate('HeaderSeries'), - type: 'Series' - }, { - name: globalize.translate('HeaderAlbums'), - type: 'MusicAlbum' - }, { - name: globalize.translate('HeaderBooks'), - type: 'Book' - }]; - renderCollectionItems(page, item, collectionItemTypes, result.Items); - } - }); - - if (item.Type == 'Season') { - page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderEpisodes'); - } else if (item.Type == 'Series') { - page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderSeasons'); - } else if (item.Type == 'MusicAlbum') { - page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderTracks'); - } else { - page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderItems'); } - - if (item.Type == 'MusicAlbum' || item.Type == 'Season') { - page.querySelector('.childrenSectionHeader').classList.add('hide'); - page.querySelector('#childrenCollapsible').classList.add('verticalSection-extrabottompadding'); - } else { - page.querySelector('.childrenSectionHeader').classList.remove('hide'); + if (layoutManager.mobile) { + childrenItemsContainer.classList.remove('padded-right'); } + childrenItemsContainer.innerHTML = html; + imageLoader.lazyChildren(childrenItemsContainer); + if (item.Type == 'BoxSet') { + const collectionItemTypes = [{ + name: globalize.translate('HeaderVideos'), + mediaType: 'Video' + }, { + name: globalize.translate('Series'), + type: 'Series' + }, { + name: globalize.translate('Albums'), + type: 'MusicAlbum' + }, { + name: globalize.translate('Books'), + type: 'Book' + }]; + renderCollectionItems(page, item, collectionItemTypes, result.Items); + } + }); + + if (item.Type == 'Season') { + page.querySelector('#childrenTitle').innerHTML = globalize.translate('Episodes'); + } else if (item.Type == 'Series') { + page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderSeasons'); + } else if (item.Type == 'MusicAlbum') { + page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderTracks'); + } else { + page.querySelector('#childrenTitle').innerHTML = globalize.translate('Items'); } - function renderItemsByName(page, item) { - import('scripts/itembynamedetailpage').then(() => { - window.ItemsByName.renderItems(page, item); - }); + if (item.Type == 'MusicAlbum' || item.Type == 'Season') { + page.querySelector('.childrenSectionHeader').classList.add('hide'); + page.querySelector('#childrenCollapsible').classList.add('verticalSection-extrabottompadding'); + } else { + page.querySelector('.childrenSectionHeader').classList.remove('hide'); } +} - function renderPlaylistItems(page, item) { - import('scripts/playlistedit').then(() => { - PlaylistViewer.render(page, item); - }); - } +function renderItemsByName(page, item) { + import('scripts/itembynamedetailpage').then(() => { + window.ItemsByName.renderItems(page, item); + }); +} - function renderProgramsForChannel(page, result) { - let html = ''; - let currentItems = []; - let currentStartDate = null; +function renderPlaylistItems(page, item) { + import('scripts/playlistedit').then(() => { + PlaylistViewer.render(page, item); + }); +} - for (let i = 0, length = result.Items.length; i < length; i++) { - const item = result.Items[i]; - const itemStartDate = datetime.parseISO8601Date(item.StartDate); +function renderProgramsForChannel(page, result) { + let html = ''; + let currentItems = []; + let currentStartDate = null; - if (!(currentStartDate && currentStartDate.toDateString() === itemStartDate.toDateString())) { - if (currentItems.length) { - html += '
    '; - html += '

    ' + datetime.toLocaleDateString(currentStartDate, { - weekday: 'long', - month: 'long', - day: 'numeric' - }) + '

    '; - html += '
    ' + listView.getListViewHtml({ - items: currentItems, - enableUserDataButtons: false, - showParentTitle: true, - image: false, - showProgramTime: true, - mediaInfo: false, - parentTitleWithTitle: true - }) + '
    '; - } + for (let i = 0, length = result.Items.length; i < length; i++) { + const item = result.Items[i]; + const itemStartDate = datetime.parseISO8601Date(item.StartDate); - currentStartDate = itemStartDate; - currentItems = []; + if (!(currentStartDate && currentStartDate.toDateString() === itemStartDate.toDateString())) { + if (currentItems.length) { + html += '
    '; + html += '

    ' + datetime.toLocaleDateString(currentStartDate, { + weekday: 'long', + month: 'long', + day: 'numeric' + }) + '

    '; + html += '
    ' + listView.getListViewHtml({ + items: currentItems, + enableUserDataButtons: false, + showParentTitle: true, + image: false, + showProgramTime: true, + mediaInfo: false, + parentTitleWithTitle: true + }) + '
    '; } - currentItems.push(item); + currentStartDate = itemStartDate; + currentItems = []; } - if (currentItems.length) { - html += '
    '; - html += '

    ' + datetime.toLocaleDateString(currentStartDate, { - weekday: 'long', - month: 'long', - day: 'numeric' - }) + '

    '; - html += '
    ' + listView.getListViewHtml({ - items: currentItems, - enableUserDataButtons: false, - showParentTitle: true, - image: false, - showProgramTime: true, - mediaInfo: false, - parentTitleWithTitle: true - }) + '
    '; - } - - page.querySelector('.programGuide').innerHTML = html; + currentItems.push(item); } - function renderChannelGuide(page, apiClient, item) { - if (item.Type === 'TvChannel') { - page.querySelector('.programGuideSection').classList.remove('hide'); - apiClient.getLiveTvPrograms({ - ChannelIds: item.Id, - UserId: apiClient.getCurrentUserId(), - HasAired: false, - SortBy: 'StartDate', - EnableTotalRecordCount: false, - EnableImages: false, - ImageTypeLimit: 0, - EnableUserData: false - }).then(function (result) { - renderProgramsForChannel(page, result); - }); - } + if (currentItems.length) { + html += '
    '; + html += '

    ' + datetime.toLocaleDateString(currentStartDate, { + weekday: 'long', + month: 'long', + day: 'numeric' + }) + '

    '; + html += '
    ' + listView.getListViewHtml({ + items: currentItems, + enableUserDataButtons: false, + showParentTitle: true, + image: false, + showProgramTime: true, + mediaInfo: false, + parentTitleWithTitle: true + }) + '
    '; } - function renderSeriesSchedule(page, item) { - const apiClient = connectionManager.getApiClient(item.ServerId); + page.querySelector('.programGuide').innerHTML = html; +} + +function renderChannelGuide(page, apiClient, item) { + if (item.Type === 'TvChannel') { + page.querySelector('.programGuideSection').classList.remove('hide'); apiClient.getLiveTvPrograms({ + ChannelIds: item.Id, UserId: apiClient.getCurrentUserId(), HasAired: false, SortBy: 'StartDate', EnableTotalRecordCount: false, EnableImages: false, ImageTypeLimit: 0, - Limit: 50, - EnableUserData: false, - LibrarySeriesId: item.Id + EnableUserData: false }).then(function (result) { - if (result.Items.length) { - page.querySelector('#seriesScheduleSection').classList.remove('hide'); - } else { - page.querySelector('#seriesScheduleSection').classList.add('hide'); - } - - page.querySelector('#seriesScheduleList').innerHTML = listView.getListViewHtml({ - items: result.Items, - enableUserDataButtons: false, - showParentTitle: false, - image: false, - showProgramDateTime: true, - mediaInfo: false, - showTitle: true, - moreButton: false, - action: 'programdialog' - }); - loading.hide(); + renderProgramsForChannel(page, result); }); } +} - function inferContext(item) { - if (item.Type === 'Movie' || item.Type === 'BoxSet') { - return 'movies'; - } - - if (item.Type === 'Series' || item.Type === 'Season' || item.Type === 'Episode') { - return 'tvshows'; - } - - if (item.Type === 'MusicArtist' || item.Type === 'MusicAlbum' || item.Type === 'Audio' || item.Type === 'AudioBook') { - return 'music'; - } - - if (item.Type === 'Program') { - return 'livetv'; - } - - return null; - } - - function filterItemsByCollectionItemType(items, typeInfo) { - return items.filter(function (item) { - if (typeInfo.mediaType) { - return item.MediaType == typeInfo.mediaType; - } - - return item.Type == typeInfo.type; - }); - } - - function canPlaySomeItemInCollection(items) { - let i = 0; - - for (let length = items.length; i < length; i++) { - if (playbackManager.canPlay(items[i])) { - return true; - } - } - - return false; - } - - function renderCollectionItems(page, parentItem, types, items) { - page.querySelector('.collectionItems').classList.remove('hide'); - page.querySelector('.collectionItems').innerHTML = ''; - - for (const type of types) { - const typeItems = filterItemsByCollectionItemType(items, type); - - if (typeItems.length) { - renderCollectionItemType(page, parentItem, type, typeItems); - } - } - - const otherType = { - name: globalize.translate('HeaderOtherItems') - }; - const otherTypeItems = items.filter(function (curr) { - return !types.filter(function (t) { - return filterItemsByCollectionItemType([curr], t).length > 0; - }).length; - }); - - if (otherTypeItems.length) { - renderCollectionItemType(page, parentItem, otherType, otherTypeItems); - } - - if (!items.length) { - renderCollectionItemType(page, parentItem, { - name: globalize.translate('HeaderItems') - }, items); - } - - const containers = page.querySelectorAll('.collectionItemsContainer'); - - const notifyRefreshNeeded = function () { - renderChildren(page, parentItem); - }; - - for (const container of containers) { - container.notifyRefreshNeeded = notifyRefreshNeeded; - } - - // if nothing in the collection can be played hide play and shuffle buttons - if (!canPlaySomeItemInCollection(items)) { - hideAll(page, 'btnPlay', false); - hideAll(page, 'btnShuffle', false); - } - - // HACK: Call autoFocuser again because btnPlay may be hidden, but focused by reloadFromItem - // FIXME: Sometimes focus does not move until all (?) sections are loaded - import('autoFocuser').then(({default: autoFocuser}) => { - autoFocuser.autoFocus(page); - }); - } - - function renderCollectionItemType(page, parentItem, type, items) { - let html = ''; - html += '
    '; - html += '
    '; - html += '

    '; - html += '' + type.name + ''; - html += '

    '; - html += '
    '; - html += '
    '; - const shape = type.type == 'MusicAlbum' ? getSquareShape(false) : getPortraitShape(false); - html += cardBuilder.getCardsHtml({ - items: items, - shape: shape, - showTitle: true, - showYear: type.mediaType === 'Video' || type.type === 'Series', - centerText: true, - lazy: true, - showDetailsMenu: true, - overlayMoreButton: true, - showAddToCollection: false, - showRemoveFromCollection: true, - collectionId: parentItem.Id - }); - html += '
    '; - html += '
    '; - const collectionItems = page.querySelector('.collectionItems'); - collectionItems.insertAdjacentHTML('beforeend', html); - imageLoader.lazyChildren(collectionItems); - } - - function renderMusicVideos(page, item, user) { - connectionManager.getApiClient(item.ServerId).getItems(user.Id, { - SortBy: 'SortName', - SortOrder: 'Ascending', - IncludeItemTypes: 'MusicVideo', - Recursive: true, - Fields: 'PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount', - AlbumIds: item.Id - }).then(function (result) { - if (result.Items.length) { - page.querySelector('#musicVideosCollapsible').classList.remove('hide'); - const musicVideosContent = page.querySelector('.musicVideosContent'); - musicVideosContent.innerHTML = getVideosHtml(result.Items); - imageLoader.lazyChildren(musicVideosContent); - } else { - page.querySelector('#musicVideosCollapsible').classList.add('hide'); - } - }); - } - - function renderAdditionalParts(page, item, user) { - connectionManager.getApiClient(item.ServerId).getAdditionalVideoParts(user.Id, item.Id).then(function (result) { - if (result.Items.length) { - page.querySelector('#additionalPartsCollapsible').classList.remove('hide'); - const additionalPartsContent = page.querySelector('#additionalPartsContent'); - additionalPartsContent.innerHTML = getVideosHtml(result.Items); - imageLoader.lazyChildren(additionalPartsContent); - } else { - page.querySelector('#additionalPartsCollapsible').classList.add('hide'); - } - }); - } - - function renderScenes(page, item) { - let chapters = item.Chapters || []; - - if (chapters.length && !chapters[0].ImageTag && (chapters = []), chapters.length) { - page.querySelector('#scenesCollapsible').classList.remove('hide'); - const scenesContent = page.querySelector('#scenesContent'); - - import('chaptercardbuilder').then(({default: chaptercardbuilder}) => { - chaptercardbuilder.buildChapterCards(item, chapters, { - itemsContainer: scenesContent, - backdropShape: 'overflowBackdrop', - squareShape: 'overflowSquare', - imageBlurhashes: item.ImageBlurHashes - }); - }); +function renderSeriesSchedule(page, item) { + const apiClient = connectionManager.getApiClient(item.ServerId); + apiClient.getLiveTvPrograms({ + UserId: apiClient.getCurrentUserId(), + HasAired: false, + SortBy: 'StartDate', + EnableTotalRecordCount: false, + EnableImages: false, + ImageTypeLimit: 0, + Limit: 50, + EnableUserData: false, + LibrarySeriesId: item.Id + }).then(function (result) { + if (result.Items.length) { + page.querySelector('#seriesScheduleSection').classList.remove('hide'); } else { - page.querySelector('#scenesCollapsible').classList.add('hide'); + page.querySelector('#seriesScheduleSection').classList.add('hide'); } - } - function getVideosHtml(items) { - return cardBuilder.getCardsHtml({ - items: items, - shape: 'autooverflow', + page.querySelector('#seriesScheduleList').innerHTML = listView.getListViewHtml({ + items: result.Items, + enableUserDataButtons: false, + showParentTitle: false, + image: false, + showProgramDateTime: true, + mediaInfo: false, showTitle: true, - action: 'play', - overlayText: false, - centerText: true, - showRuntime: true + moreButton: false, + action: 'programdialog' }); + loading.hide(); + }); +} + +function inferContext(item) { + if (item.Type === 'Movie' || item.Type === 'BoxSet') { + return 'movies'; } - function renderSpecials(page, item, user) { - connectionManager.getApiClient(item.ServerId).getSpecialFeatures(user.Id, item.Id).then(function (specials) { - const specialsContent = page.querySelector('#specialsContent'); - specialsContent.innerHTML = getVideosHtml(specials); - imageLoader.lazyChildren(specialsContent); - }); + if (item.Type === 'Series' || item.Type === 'Season' || item.Type === 'Episode') { + return 'tvshows'; } - function renderCast(page, item) { - const people = (item.People || []).filter(function (p) { - return p.Type === 'Actor'; - }); + if (item.Type === 'MusicArtist' || item.Type === 'MusicAlbum' || item.Type === 'Audio' || item.Type === 'AudioBook') { + return 'music'; + } - if (!people.length) { - return void page.querySelector('#castCollapsible').classList.add('hide'); + if (item.Type === 'Program') { + return 'livetv'; + } + + return null; +} + +function filterItemsByCollectionItemType(items, typeInfo) { + return items.filter(function (item) { + if (typeInfo.mediaType) { + return item.MediaType == typeInfo.mediaType; } - page.querySelector('#castCollapsible').classList.remove('hide'); - const castContent = page.querySelector('#castContent'); + return item.Type == typeInfo.type; + }); +} - import('peoplecardbuilder').then(({default: peoplecardbuilder}) => { - peoplecardbuilder.buildPeopleCards(people, { - itemsContainer: castContent, - coverImage: true, - serverId: item.ServerId, - shape: 'overflowPortrait', +function canPlaySomeItemInCollection(items) { + let i = 0; + + for (let length = items.length; i < length; i++) { + if (playbackManager.canPlay(items[i])) { + return true; + } + } + + return false; +} + +function renderCollectionItems(page, parentItem, types, items) { + page.querySelector('.collectionItems').classList.remove('hide'); + page.querySelector('.collectionItems').innerHTML = ''; + + for (const type of types) { + const typeItems = filterItemsByCollectionItemType(items, type); + + if (typeItems.length) { + renderCollectionItemType(page, parentItem, type, typeItems); + } + } + + const otherType = { + name: globalize.translate('HeaderOtherItems') + }; + const otherTypeItems = items.filter(function (curr) { + return !types.filter(function (t) { + return filterItemsByCollectionItemType([curr], t).length > 0; + }).length; + }); + + if (otherTypeItems.length) { + renderCollectionItemType(page, parentItem, otherType, otherTypeItems); + } + + if (!items.length) { + renderCollectionItemType(page, parentItem, { + name: globalize.translate('Items') + }, items); + } + + const containers = page.querySelectorAll('.collectionItemsContainer'); + + const notifyRefreshNeeded = function () { + renderChildren(page, parentItem); + }; + + for (const container of containers) { + container.notifyRefreshNeeded = notifyRefreshNeeded; + } + + // if nothing in the collection can be played hide play and shuffle buttons + if (!canPlaySomeItemInCollection(items)) { + hideAll(page, 'btnPlay', false); + hideAll(page, 'btnShuffle', false); + } + + // HACK: Call autoFocuser again because btnPlay may be hidden, but focused by reloadFromItem + // FIXME: Sometimes focus does not move until all (?) sections are loaded + import('autoFocuser').then(({ default: autoFocuser }) => { + autoFocuser.autoFocus(page); + }); +} + +function renderCollectionItemType(page, parentItem, type, items) { + let html = ''; + html += '
    '; + html += '
    '; + html += '

    '; + html += '' + type.name + ''; + html += '

    '; + html += '
    '; + html += '
    '; + const shape = type.type == 'MusicAlbum' ? getSquareShape(false) : getPortraitShape(false); + html += cardBuilder.getCardsHtml({ + items: items, + shape: shape, + showTitle: true, + showYear: type.mediaType === 'Video' || type.type === 'Series', + centerText: true, + lazy: true, + showDetailsMenu: true, + overlayMoreButton: true, + showAddToCollection: false, + showRemoveFromCollection: true, + collectionId: parentItem.Id + }); + html += '
    '; + html += '
    '; + const collectionItems = page.querySelector('.collectionItems'); + collectionItems.insertAdjacentHTML('beforeend', html); + imageLoader.lazyChildren(collectionItems); +} + +function renderMusicVideos(page, item, user) { + connectionManager.getApiClient(item.ServerId).getItems(user.Id, { + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'MusicVideo', + Recursive: true, + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount', + AlbumIds: item.Id + }).then(function (result) { + if (result.Items.length) { + page.querySelector('#musicVideosCollapsible').classList.remove('hide'); + const musicVideosContent = page.querySelector('.musicVideosContent'); + musicVideosContent.innerHTML = getVideosHtml(result.Items); + imageLoader.lazyChildren(musicVideosContent); + } else { + page.querySelector('#musicVideosCollapsible').classList.add('hide'); + } + }); +} + +function renderAdditionalParts(page, item, user) { + connectionManager.getApiClient(item.ServerId).getAdditionalVideoParts(user.Id, item.Id).then(function (result) { + if (result.Items.length) { + page.querySelector('#additionalPartsCollapsible').classList.remove('hide'); + const additionalPartsContent = page.querySelector('#additionalPartsContent'); + additionalPartsContent.innerHTML = getVideosHtml(result.Items); + imageLoader.lazyChildren(additionalPartsContent); + } else { + page.querySelector('#additionalPartsCollapsible').classList.add('hide'); + } + }); +} + +function renderScenes(page, item) { + let chapters = item.Chapters || []; + + if (chapters.length && !chapters[0].ImageTag && (chapters = []), chapters.length) { + page.querySelector('#scenesCollapsible').classList.remove('hide'); + const scenesContent = page.querySelector('#scenesContent'); + + import('chaptercardbuilder').then(({ default: chaptercardbuilder }) => { + chaptercardbuilder.buildChapterCards(item, chapters, { + itemsContainer: scenesContent, + backdropShape: 'overflowBackdrop', + squareShape: 'overflowSquare', imageBlurhashes: item.ImageBlurHashes }); }); + } else { + page.querySelector('#scenesCollapsible').classList.add('hide'); + } +} + +function getVideosHtml(items) { + return cardBuilder.getCardsHtml({ + items: items, + shape: 'autooverflow', + showTitle: true, + action: 'play', + overlayText: false, + centerText: true, + showRuntime: true + }); +} + +function renderSpecials(page, item, user) { + connectionManager.getApiClient(item.ServerId).getSpecialFeatures(user.Id, item.Id).then(function (specials) { + const specialsContent = page.querySelector('#specialsContent'); + specialsContent.innerHTML = getVideosHtml(specials); + imageLoader.lazyChildren(specialsContent); + }); +} + +function renderCast(page, item) { + const people = (item.People || []).filter(function (p) { + return p.Type === 'Actor'; + }); + + if (!people.length) { + return void page.querySelector('#castCollapsible').classList.add('hide'); } - function itemDetailPage() { - const self = this; - self.setInitialCollapsibleState = setInitialCollapsibleState; - self.renderDetails = renderDetails; - self.renderCast = renderCast; + page.querySelector('#castCollapsible').classList.remove('hide'); + const castContent = page.querySelector('#castContent'); + + import('peoplecardbuilder').then(({ default: peoplecardbuilder }) => { + peoplecardbuilder.buildPeopleCards(people, { + itemsContainer: castContent, + coverImage: true, + serverId: item.ServerId, + shape: 'overflowPortrait', + imageBlurhashes: item.ImageBlurHashes + }); + }); +} + +function itemDetailPage() { + const self = this; + self.setInitialCollapsibleState = setInitialCollapsibleState; + self.renderDetails = renderDetails; + self.renderCast = renderCast; +} + +function bindAll(view, selector, eventName, fn) { + const elems = view.querySelectorAll(selector); + + for (const elem of elems) { + elem.addEventListener(eventName, fn); + } +} + +function onTrackSelectionsSubmit(e) { + e.preventDefault(); + return false; +} + +window.ItemDetailPage = new itemDetailPage(); + +export default function (view, params) { + function reload(instance, page, params) { + loading.show(); + + const apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient; + + Promise.all([getPromise(apiClient, params), apiClient.getCurrentUser()]).then(([item, user]) => { + currentItem = item; + reloadFromItem(instance, page, params, item, user); + }).catch((error) => { + console.error('failed to get item or current user: ', error); + }); } - function bindAll(view, selector, eventName, fn) { - const elems = view.querySelectorAll(selector); - - for (const elem of elems) { - elem.addEventListener(eventName, fn); - } - } - - function onTrackSelectionsSubmit(e) { - e.preventDefault(); - return false; - } - - window.ItemDetailPage = new itemDetailPage(); - - export default function (view, params) { - function reload(instance, page, params) { - loading.show(); - - const apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient; - - Promise.all([getPromise(apiClient, params), apiClient.getCurrentUser()]).then(([item, user]) => { - currentItem = item; - reloadFromItem(instance, page, params, item, user); - }).catch((error) => { - console.error('failed to get item or current user: ', error); + function splitVersions(instance, page, apiClient, params) { + import('confirm').then(({ default: confirm }) => { + confirm('Are you sure you wish to split the media sources into separate items?', 'Split Media Apart').then(function () { + loading.show(); + apiClient.ajax({ + type: 'DELETE', + url: apiClient.getUrl('Videos/' + params.id + '/AlternateSources') + }).then(function () { + loading.hide(); + reload(instance, page, params); + }); }); - } + }); + } - function splitVersions(instance, page, apiClient, params) { - import('confirm').then(({default: confirm}) => { - confirm('Are you sure you wish to split the media sources into separate items?', 'Split Media Apart').then(function () { - loading.show(); - apiClient.ajax({ - type: 'DELETE', - url: apiClient.getUrl('Videos/' + params.id + '/AlternateSources') - }).then(function () { - loading.hide(); - reload(instance, page, params); - }); + function getPlayOptions(startPosition) { + const audioStreamIndex = view.querySelector('.selectAudio').value || null; + return { + startPositionTicks: startPosition, + mediaSourceId: view.querySelector('.selectSource').value, + audioStreamIndex: audioStreamIndex, + subtitleStreamIndex: view.querySelector('.selectSubtitles').value + }; + } + + function playItem(item, startPosition) { + const playOptions = getPlayOptions(startPosition); + playOptions.items = [item]; + playbackManager.play(playOptions); + } + + function playTrailer() { + playbackManager.playTrailers(currentItem); + } + + function playCurrentItem(button, mode) { + const item = currentItem; + + if (item.Type === 'Program') { + const apiClient = connectionManager.getApiClient(item.ServerId); + return void apiClient.getLiveTvChannel(item.ChannelId, apiClient.getCurrentUserId()).then(function (channel) { + playbackManager.play({ + items: [channel] }); }); } - function getPlayOptions(startPosition) { - const audioStreamIndex = view.querySelector('.selectAudio').value || null; - return { - startPositionTicks: startPosition, - mediaSourceId: view.querySelector('.selectSource').value, - audioStreamIndex: audioStreamIndex, - subtitleStreamIndex: view.querySelector('.selectSubtitles').value - }; - } + playItem(item, item.UserData && mode === 'resume' ? item.UserData.PlaybackPositionTicks : 0); + } - function playItem(item, startPosition) { - const playOptions = getPlayOptions(startPosition); - playOptions.items = [item]; - playbackManager.play(playOptions); - } + function onPlayClick() { + playCurrentItem(this, this.getAttribute('data-mode')); + } - function playTrailer() { - playbackManager.playTrailers(currentItem); - } + function onPosterClick(e) { + itemShortcuts.onClick.call(view.querySelector('.detailImageContainer'), e); + } - function playCurrentItem(button, mode) { - const item = currentItem; + function onInstantMixClick() { + playbackManager.instantMix(currentItem); + } - if (item.Type === 'Program') { - const apiClient = connectionManager.getApiClient(item.ServerId); - return void apiClient.getLiveTvChannel(item.ChannelId, apiClient.getCurrentUserId()).then(function (channel) { - playbackManager.play({ - items: [channel] - }); - }); - } + function onShuffleClick() { + playbackManager.shuffle(currentItem); + } - playItem(item, item.UserData && mode === 'resume' ? item.UserData.PlaybackPositionTicks : 0); - } - - function onPlayClick() { - playCurrentItem(this, this.getAttribute('data-mode')); - } - - function onInstantMixClick() { - playbackManager.instantMix(currentItem); - } - - function onShuffleClick() { - playbackManager.shuffle(currentItem); - } - - function onCancelSeriesTimerClick() { - import('recordingHelper').then(({default: recordingHelper}) => { - recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id, currentItem.ServerId).then(function () { - Dashboard.navigate('livetv.html'); - }); + function onCancelSeriesTimerClick() { + import('recordingHelper').then(({ default: recordingHelper }) => { + recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id, currentItem.ServerId).then(function () { + Dashboard.navigate('livetv.html'); }); - } + }); + } - function onCancelTimerClick() { - import('recordingHelper').then(({default: recordingHelper}) => { - recordingHelper.cancelTimer(connectionManager.getApiClient(currentItem.ServerId), currentItem.TimerId).then(function () { - reload(self, view, params); - }); + function onCancelTimerClick() { + import('recordingHelper').then(({ default: recordingHelper }) => { + recordingHelper.cancelTimer(connectionManager.getApiClient(currentItem.ServerId), currentItem.TimerId).then(function () { + reload(self, view, params); }); - } + }); + } - function onPlayTrailerClick() { - playTrailer(); - } + function onPlayTrailerClick() { + playTrailer(); + } - function onDownloadClick() { - import('fileDownloader').then(({default: fileDownloader}) => { - const downloadHref = apiClient.getItemDownloadUrl(currentItem.Id); - fileDownloader.download([{ - url: downloadHref, - itemId: currentItem.Id, - serverId: currentItem.serverId - }]); - }); - } + function onDownloadClick() { + import('fileDownloader').then(({ default: fileDownloader }) => { + const downloadHref = apiClient.getItemDownloadUrl(currentItem.Id); + fileDownloader.download([{ + url: downloadHref, + itemId: currentItem.Id, + serverId: currentItem.serverId + }]); + }); + } + + function onMoreCommandsClick() { + const button = this; + let selectedItem = view.querySelector('.selectSource').value || currentItem.Id; + + apiClient.getItem(apiClient.getCurrentUserId(), selectedItem).then(function (item) { + selectedItem = item; - function onMoreCommandsClick() { - const button = this; apiClient.getCurrentUser().then(function (user) { - itemContextMenu.show(getContextMenuOptions(currentItem, user, button)).then(function (result) { + itemContextMenu.show(getContextMenuOptions(selectedItem, user, button)).then(function (result) { if (result.deleted) { appRouter.goHome(); } else if (result.updated) { @@ -1944,79 +1953,79 @@ import 'emby-select'; } }); }); - } - - function onPlayerChange() { - renderTrackSelections(view, self, currentItem); - setTrailerButtonVisibility(view, currentItem); - } - - function onWebSocketMessage(e, data) { - const msg = data; - - if (msg.MessageType === 'UserDataChanged' && currentItem && msg.Data.UserId == apiClient.getCurrentUserId()) { - const key = currentItem.UserData.Key; - const userData = msg.Data.UserDataList.filter(function (u) { - return u.Key == key; - })[0]; - - if (userData) { - currentItem.UserData = userData; - reloadPlayButtons(view, currentItem); - refreshImage(view, currentItem); - } - } - } - - let currentItem; - const self = this; - const apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient; - view.querySelectorAll('.btnPlay'); - bindAll(view, '.btnPlay', 'click', onPlayClick); - bindAll(view, '.btnResume', 'click', onPlayClick); - bindAll(view, '.btnInstantMix', 'click', onInstantMixClick); - bindAll(view, '.btnShuffle', 'click', onShuffleClick); - bindAll(view, '.btnPlayTrailer', 'click', onPlayTrailerClick); - bindAll(view, '.btnCancelSeriesTimer', 'click', onCancelSeriesTimerClick); - bindAll(view, '.btnCancelTimer', 'click', onCancelTimerClick); - bindAll(view, '.btnDownload', 'click', onDownloadClick); - view.querySelector('.trackSelections').addEventListener('submit', onTrackSelectionsSubmit); - view.querySelector('.btnSplitVersions').addEventListener('click', function () { - splitVersions(self, view, apiClient, params); - }); - bindAll(view, '.btnMoreCommands', 'click', onMoreCommandsClick); - view.querySelector('.selectSource').addEventListener('change', function () { - renderVideoSelections(view, self._currentPlaybackMediaSources); - renderAudioSelections(view, self._currentPlaybackMediaSources); - renderSubtitleSelections(view, self._currentPlaybackMediaSources); - }); - view.addEventListener('viewshow', function (e) { - const page = this; - - libraryMenu.setTransparentMenu(true); - - if (e.detail.isRestored) { - if (currentItem) { - Emby.Page.setTitle(''); - renderTrackSelections(page, self, currentItem, true); - } - } else { - reload(self, page, params); - } - - events.on(apiClient, 'message', onWebSocketMessage); - events.on(playbackManager, 'playerchange', onPlayerChange); - }); - view.addEventListener('viewbeforehide', function () { - events.off(apiClient, 'message', onWebSocketMessage); - events.off(playbackManager, 'playerchange', onPlayerChange); - libraryMenu.setTransparentMenu(false); - }); - view.addEventListener('viewdestroy', function () { - currentItem = null; - self._currentPlaybackMediaSources = null; - self.currentRecordingFields = null; }); } -/* eslint-enable indent */ + function onPlayerChange() { + renderTrackSelections(view, self, currentItem); + setTrailerButtonVisibility(view, currentItem); + } + + function onWebSocketMessage(e, data) { + const msg = data; + + if (msg.MessageType === 'UserDataChanged' && currentItem && msg.Data.UserId == apiClient.getCurrentUserId()) { + const key = currentItem.UserData.Key; + const userData = msg.Data.UserDataList.filter(function (u) { + return u.Key == key; + })[0]; + + if (userData) { + currentItem.UserData = userData; + reloadPlayButtons(view, currentItem); + refreshImage(view, currentItem); + } + } + } + + let currentItem; + const self = this; + const apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient; + view.querySelectorAll('.btnPlay'); + bindAll(view, '.btnPlay', 'click', onPlayClick); + bindAll(view, '.btnResume', 'click', onPlayClick); + bindAll(view, '.btnInstantMix', 'click', onInstantMixClick); + bindAll(view, '.btnShuffle', 'click', onShuffleClick); + bindAll(view, '.btnPlayTrailer', 'click', onPlayTrailerClick); + bindAll(view, '.btnCancelSeriesTimer', 'click', onCancelSeriesTimerClick); + bindAll(view, '.btnCancelTimer', 'click', onCancelTimerClick); + bindAll(view, '.btnDownload', 'click', onDownloadClick); + view.querySelector('.detailImageContainer').addEventListener('click', onPosterClick); + view.querySelector('.trackSelections').addEventListener('submit', onTrackSelectionsSubmit); + view.querySelector('.btnSplitVersions').addEventListener('click', function () { + splitVersions(self, view, apiClient, params); + }); + bindAll(view, '.btnMoreCommands', 'click', onMoreCommandsClick); + view.querySelector('.selectSource').addEventListener('change', function () { + renderVideoSelections(view, self._currentPlaybackMediaSources); + renderAudioSelections(view, self._currentPlaybackMediaSources); + renderSubtitleSelections(view, self._currentPlaybackMediaSources); + }); + view.addEventListener('viewshow', function (e) { + const page = this; + + libraryMenu.setTransparentMenu(true); + + if (e.detail.isRestored) { + if (currentItem) { + Emby.Page.setTitle(''); + renderTrackSelections(page, self, currentItem, true); + } + } else { + reload(self, page, params); + } + + events.on(apiClient, 'message', onWebSocketMessage); + events.on(playbackManager, 'playerchange', onPlayerChange); + }); + view.addEventListener('viewbeforehide', function () { + events.off(apiClient, 'message', onWebSocketMessage); + events.off(playbackManager, 'playerchange', onPlayerChange); + libraryMenu.setTransparentMenu(false); + }); + view.addEventListener('viewdestroy', function () { + currentItem = null; + self._currentPlaybackMediaSources = null; + self.currentRecordingFields = null; + }); +} diff --git a/src/list.html b/src/controllers/list.html similarity index 100% rename from src/list.html rename to src/controllers/list.html diff --git a/src/controllers/list.js b/src/controllers/list.js index 01ef35a26a..0027c576f1 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -1,8 +1,21 @@ -define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager', 'cardBuilder', 'loading', 'connectionManager', 'alphaNumericShortcuts', 'scroller', 'playbackManager', 'alphaPicker', 'emby-itemscontainer', 'emby-scroller'], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, scroller, playbackManager, AlphaPicker) { - 'use strict'; +import globalize from 'globalize'; +import listView from 'listView'; +import layoutManager from 'layoutManager'; +import * as userSettings from 'userSettings'; +import focusManager from 'focusManager'; +import cardBuilder from 'cardBuilder'; +import loading from 'loading'; +import connectionManager from 'connectionManager'; +import AlphaNumericShortcuts from 'alphaNumericShortcuts'; +import playbackManager from 'playbackManager'; +import AlphaPicker from 'alphaPicker'; +import 'emby-itemscontainer'; +import 'emby-scroller'; + +/* eslint-disable indent */ function getInitialLiveTvQuery(instance, params) { - var query = { + const query = { UserId: connectionManager.getApiClient(params.serverId).getCurrentUserId(), StartIndex: 0, Fields: 'ChannelInfo,PrimaryImageAspectRatio', @@ -59,7 +72,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function modifyQueryWithFilters(instance, query) { - var sortValues = instance.getSortValues(); + const sortValues = instance.getSortValues(); if (!query.SortBy) { query.SortBy = sortValues.sortBy; @@ -68,9 +81,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' query.Fields = query.Fields ? query.Fields + ',PrimaryImageAspectRatio' : 'PrimaryImageAspectRatio'; query.ImageTypeLimit = 1; - var hasFilters; - var queryFilters = []; - var filters = instance.getFilters(); + let hasFilters; + const queryFilters = []; + const filters = instance.getFilters(); if (filters.IsPlayed) { queryFilters.push('IsPlayed'); @@ -164,21 +177,21 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function updateSortText(instance) { - var btnSortText = instance.btnSortText; + const btnSortText = instance.btnSortText; if (btnSortText) { - var options = instance.getSortMenuOptions(); - var values = instance.getSortValues(); - var sortBy = values.sortBy; + const options = instance.getSortMenuOptions(); + const values = instance.getSortValues(); + const sortBy = values.sortBy; - for (var i = 0, length = options.length; i < length; i++) { - if (sortBy === options[i].value) { - btnSortText.innerHTML = globalize.translate('SortByValue', options[i].name); + for (const option of options) { + if (sortBy === option.value) { + btnSortText.innerHTML = globalize.translate('SortByValue', option.name); break; } } - var btnSortIcon = instance.btnSortIcon; + const btnSortIcon = instance.btnSortIcon; if (btnSortIcon) { setSortButtonIcon(btnSortIcon, values.sortOrder === 'Descending' ? 'arrow_downward' : 'arrow_upward'); @@ -198,10 +211,10 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' function updateAlphaPickerState(instance, numItems) { if (instance.alphaPicker) { - var alphaPicker = instance.alphaPickerElement; + const alphaPicker = instance.alphaPickerElement; if (alphaPicker) { - var values = instance.getSortValues(); + const values = instance.getSortValues(); if (numItems == null) { numItems = 100; @@ -219,7 +232,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function getItems(instance, params, item, sortBy, startIndex, limit) { - var apiClient = connectionManager.getApiClient(params.serverId); + const apiClient = connectionManager.getApiClient(params.serverId); instance.queryRecursive = false; if (params.type === 'Recordings') { @@ -248,7 +261,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' if (!item) { instance.queryRecursive = true; - var method = 'getItems'; + let method = 'getItems'; if (params.type === 'MusicArtist') { method = 'getArtists'; @@ -271,7 +284,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' if (item.Type === 'Genre' || item.Type === 'MusicGenre' || item.Type === 'Studio' || item.Type === 'Person') { instance.queryRecursive = true; - var query = { + const query = { StartIndex: startIndex, Limit: limit, Fields: 'PrimaryImageAspectRatio,SortName', @@ -320,8 +333,8 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' return Promise.resolve(null); } - var apiClient = connectionManager.getApiClient(params.serverId); - var itemId = params.genreId || params.musicGenreId || params.studioId || params.personId || params.parentId; + const apiClient = connectionManager.getApiClient(params.serverId); + const itemId = params.genreId || params.musicGenreId || params.studioId || params.personId || params.parentId; if (itemId) { return apiClient.getItem(apiClient.getCurrentUserId(), itemId); @@ -331,9 +344,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function showViewSettingsMenu() { - var instance = this; + const instance = this; - require(['viewSettings'], function (ViewSettings) { + import('viewSettings').then(({default: ViewSettings}) => { new ViewSettings().show({ settingsKey: instance.getSettingsKey(), settings: instance.getViewSettings(), @@ -346,9 +359,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function showFilterMenu() { - var instance = this; + const instance = this; - require(['filterMenu'], function (FilterMenu) { + import('filterMenu').then(({default: FilterMenu}) => { new FilterMenu().show({ settingsKey: instance.getSettingsKey(), settings: instance.getFilters(), @@ -365,9 +378,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function showSortMenu() { - var instance = this; + const instance = this; - require(['sortMenu'], function (SortMenu) { + import('sortMenu').then(({default: SortMenu}) => { new SortMenu().show({ settingsKey: instance.getSettingsKey(), settings: instance.getSortValues(), @@ -383,10 +396,10 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function onNewItemClick() { - var instance = this; + const instance = this; - require(['playlistEditor'], function (playlistEditor) { - new playlistEditor.showEditor({ + import('playlistEditor').then(({default: playlistEditor}) => { + new playlistEditor({ items: [], serverId: instance.params.serverId }); @@ -394,22 +407,23 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function hideOrShowAll(elems, hide) { - for (var i = 0, length = elems.length; i < length; i++) { + for (const elem of elems) { if (hide) { - elems[i].classList.add('hide'); + elem.classList.add('hide'); } else { - elems[i].classList.remove('hide'); + elem.classList.remove('hide'); } } } function bindAll(elems, eventName, fn) { - for (var i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener(eventName, fn); + for (const elem of elems) { + elem.addEventListener(eventName, fn); } } - function ItemsView(view, params) { +class ItemsView { + constructor(view, params) { function fetchData() { return getItems(self, params, self.currentItem).then(function (result) { if (self.totalItemCount == null) { @@ -422,7 +436,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function getItemsHtml(items) { - var settings = self.getViewSettings(); + const settings = self.getViewSettings(); if (settings.imageType === 'list') { return listView.getListViewHtml({ @@ -430,13 +444,13 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' }); } - var shape; - var preferThumb; - var preferDisc; - var preferLogo; - var defaultShape; - var item = self.currentItem; - var lines = settings.showTitle ? 2 : 0; + let shape; + let preferThumb; + let preferDisc; + let preferLogo; + let defaultShape; + const item = self.currentItem; + let lines = settings.showTitle ? 2 : 0; if (settings.imageType === 'banner') { shape = 'banner'; @@ -460,7 +474,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' shape = 'autoVertical'; } - var posterOptions = { + let posterOptions = { shape: shape, showTitle: settings.showTitle, showYear: settings.showTitle, @@ -493,19 +507,19 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' lines = 1; } else if (params.type === 'Programs') { lines = settings.showTitle ? 1 : 0; - var showParentTitle = settings.showTitle && params.IsMovie !== 'true'; + const showParentTitle = settings.showTitle && params.IsMovie !== 'true'; if (showParentTitle) { lines++; } - var showAirTime = settings.showTitle && params.type !== 'Recordings'; + const showAirTime = settings.showTitle && params.type !== 'Recordings'; if (showAirTime) { lines++; } - var showYear = settings.showTitle && params.IsMovie === 'true' && params.type === 'Recordings'; + const showYear = settings.showTitle && params.IsMovie === 'true' && params.type === 'Recordings'; if (showYear) { lines++; @@ -538,13 +552,13 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' function initAlphaPicker() { self.scroller = view.querySelector('.scrollFrameY'); - var alphaPickerElement = self.alphaPickerElement; + const alphaPickerElement = self.alphaPickerElement; alphaPickerElement.classList.add('alphaPicker-fixed-right'); alphaPickerElement.classList.add('focuscontainer-right'); self.itemsContainer.parentNode.classList.add('padded-right-withalphapicker'); - self.alphaPicker = new AlphaPicker.default({ + self.alphaPicker = new AlphaPicker({ element: alphaPickerElement, itemsContainer: layoutManager.tv ? self.itemsContainer : null, itemClass: 'card', @@ -649,7 +663,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function play() { - var currentItem = self.currentItem; + const currentItem = self.currentItem; if (currentItem && !self.hasFilters) { playbackManager.play({ @@ -665,7 +679,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function queue() { - var currentItem = self.currentItem; + const currentItem = self.currentItem; if (currentItem && !self.hasFilters) { playbackManager.queue({ @@ -681,7 +695,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function shuffle() { - var currentItem = self.currentItem; + const currentItem = self.currentItem; if (currentItem && !self.hasFilters) { playbackManager.shuffle(currentItem); @@ -694,7 +708,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } } - var self = this; + const self = this; self.params = params; this.itemsContainer = view.querySelector('.itemsContainer'); @@ -708,20 +722,17 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' this.itemsContainer.setAttribute('data-refreshinterval', '300000'); } - var i; - var length; - var btnViewSettings = view.querySelectorAll('.btnViewSettings'); + const btnViewSettings = view.querySelectorAll('.btnViewSettings'); - for (i = 0, length = btnViewSettings.length; i < length; i++) { - btnViewSettings[i].addEventListener('click', showViewSettingsMenu.bind(this)); + for (const btnViewSetting of btnViewSettings) { + btnViewSetting.addEventListener('click', showViewSettingsMenu.bind(this)); } - var filterButtons = view.querySelectorAll('.btnFilter'); + const filterButtons = view.querySelectorAll('.btnFilter'); this.filterButtons = filterButtons; - var hasVisibleFilters = this.getVisibleFilters().length; + const hasVisibleFilters = this.getVisibleFilters().length; - for (i = 0, length = filterButtons.length; i < length; i++) { - var btnFilter = filterButtons[i]; + for (const btnFilter of filterButtons) { btnFilter.addEventListener('click', showFilterMenu.bind(this)); if (hasVisibleFilters) { @@ -731,10 +742,10 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } } - var sortButtons = view.querySelectorAll('.btnSort'); + const sortButtons = view.querySelectorAll('.btnSort'); - for (this.sortButtons = sortButtons, i = 0, length = sortButtons.length; i < length; i++) { - var sortButton = sortButtons[i]; + this.sortButtons = sortButtons; + for (const sortButton of sortButtons) { sortButton.addEventListener('click', showSortMenu.bind(this)); if (params.type !== 'nextup') { @@ -749,7 +760,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' self.itemsContainer.fetchData = fetchData; self.itemsContainer.getItemsHtml = getItemsHtml; view.addEventListener('viewshow', function (e) { - var isRestored = e.detail.isRestored; + const isRestored = e.detail.isRestored; if (!isRestored) { loading.show(); @@ -761,7 +772,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' getItem(params).then(function (item) { setTitle(item); self.currentItem = item; - var refresh = !isRestored; + const refresh = !isRestored; self.itemsContainer.resume({ refresh: refresh }).then(function () { @@ -776,7 +787,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' initAlphaPicker(); } - var itemType = item ? item.Type : null; + const itemType = item ? item.Type : null; if (itemType === 'MusicGenre' || params.type !== 'Programs' && itemType !== 'Channel') { hideOrShowAll(view.querySelectorAll('.btnPlay'), false); @@ -803,18 +814,18 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' bindAll(view.querySelectorAll('.btnShuffle'), 'click', shuffle); } - self.alphaNumericShortcuts = new AlphaNumericShortcuts.default({ + self.alphaNumericShortcuts = new AlphaNumericShortcuts({ itemsContainer: self.itemsContainer }); }); view.addEventListener('viewhide', function (e) { - var itemsContainer = self.itemsContainer; + const itemsContainer = self.itemsContainer; if (itemsContainer) { itemsContainer.pause(); } - var alphaNumericShortcuts = self.alphaNumericShortcuts; + const alphaNumericShortcuts = self.alphaNumericShortcuts; if (alphaNumericShortcuts) { alphaNumericShortcuts.destroy(); @@ -842,8 +853,8 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' }); } - ItemsView.prototype.getFilters = function () { - var basekey = this.getSettingsKey(); + getFilters() { + const basekey = this.getSettingsKey(); return { IsPlayed: userSettings.getFilter(basekey + '-filter-IsPlayed') === 'true', IsUnplayed: userSettings.getFilter(basekey + '-filter-IsUnplayed') === 'true', @@ -862,39 +873,37 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' HasThemeVideo: userSettings.getFilter(basekey + '-filter-HasThemeVideo'), GenreIds: userSettings.getFilter(basekey + '-filter-GenreIds') }; - }; + } - ItemsView.prototype.getSortValues = function () { - var basekey = this.getSettingsKey(); + getSortValues() { + const basekey = this.getSettingsKey(); return { sortBy: userSettings.getFilter(basekey + '-sortby') || this.getDefaultSortBy(), sortOrder: userSettings.getFilter(basekey + '-sortorder') === 'Descending' ? 'Descending' : 'Ascending' }; - }; + } - ItemsView.prototype.getDefaultSortBy = function () { - var params = this.params; - var sortNameOption = this.getNameSortOption(params); + getDefaultSortBy() { + const sortNameOption = this.getNameSortOption(this.params); - if (params.type) { + if (this.params.type) { return sortNameOption.value; } return 'IsFolder,' + sortNameOption.value; - }; + } - ItemsView.prototype.getSortMenuOptions = function () { - var sortBy = []; - var params = this.params; + getSortMenuOptions() { + const sortBy = []; - if (params.type === 'Programs') { + if (this.params.type === 'Programs') { sortBy.push({ name: globalize.translate('AirDate'), value: 'StartDate,SortName' }); } - var option = this.getNameSortOption(params); + let option = this.getNameSortOption(this.params); if (option) { sortBy.push(option); @@ -912,7 +921,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' sortBy.push(option); } - if (params.type !== 'Programs') { + if (this.params.type !== 'Programs') { sortBy.push({ name: globalize.translate('DateAdded'), value: 'DateCreated,SortName' @@ -925,8 +934,8 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' sortBy.push(option); } - if (!params.type) { - option = this.getNameSortOption(params); + if (!this.params.type) { + option = this.getNameSortOption(this.params); sortBy.push({ name: globalize.translate('Folders'), value: 'IsFolder,' + option.value @@ -952,9 +961,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' value: 'Runtime,SortName' }); return sortBy; - }; + } - ItemsView.prototype.getNameSortOption = function (params) { + getNameSortOption(params) { if (params.type === 'Episode') { return { name: globalize.translate('Name'), @@ -966,9 +975,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' name: globalize.translate('Name'), value: 'SortName' }; - }; + } - ItemsView.prototype.getPlayCountSortOption = function () { + getPlayCountSortOption() { if (this.params.type === 'Programs') { return null; } @@ -977,9 +986,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' name: globalize.translate('PlayCount'), value: 'PlayCount,SortName' }; - }; + } - ItemsView.prototype.getDatePlayedSortOption = function () { + getDatePlayedSortOption() { if (this.params.type === 'Programs') { return null; } @@ -988,9 +997,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' name: globalize.translate('DatePlayed'), value: 'DatePlayed,SortName' }; - }; + } - ItemsView.prototype.getCriticRatingSortOption = function () { + getCriticRatingSortOption() { if (this.params.type === 'Programs') { return null; } @@ -999,18 +1008,18 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' name: globalize.translate('CriticRating'), value: 'CriticRating,SortName' }; - }; + } - ItemsView.prototype.getCommunityRatingSortOption = function () { + getCommunityRatingSortOption() { return { name: globalize.translate('CommunityRating'), value: 'CommunityRating,SortName' }; - }; + } - ItemsView.prototype.getVisibleFilters = function () { - var filters = []; - var params = this.params; + getVisibleFilters() { + const filters = []; + const params = this.params; if (!(params.type === 'nextup')) { if (params.type === 'Programs') { @@ -1034,16 +1043,15 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } return filters; - }; + } - ItemsView.prototype.setFilterStatus = function (hasFilters) { + setFilterStatus(hasFilters) { this.hasFilters = hasFilters; - var filterButtons = this.filterButtons; + const filterButtons = this.filterButtons; if (filterButtons.length) { - for (var i = 0, length = filterButtons.length; i < length; i++) { - var btnFilter = filterButtons[i]; - var bubble = btnFilter.querySelector('.filterButtonBubble'); + for (const btnFilter of filterButtons) { + let bubble = btnFilter.querySelector('.filterButtonBubble'); if (!bubble) { if (!hasFilters) { @@ -1062,10 +1070,10 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } } } - }; + } - ItemsView.prototype.getFilterMenuOptions = function () { - var params = this.params; + getFilterMenuOptions() { + const params = this.params; return { IsAiring: params.IsAiring, IsMovie: params.IsMovie, @@ -1075,11 +1083,11 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' IsSeries: params.IsSeries, Recursive: this.queryRecursive }; - }; + } - ItemsView.prototype.getVisibleViewSettings = function () { - var item = (this.params, this.currentItem); - var fields = ['showTitle']; + getVisibleViewSettings() { + const item = (this.params, this.currentItem); + const fields = ['showTitle']; if (!item || item.Type !== 'PhotoAlbum' && item.Type !== 'ChannelFolderItem') { fields.push('imageType'); @@ -1087,13 +1095,13 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' fields.push('viewType'); return fields; - }; + } - ItemsView.prototype.getViewSettings = function () { - var basekey = this.getSettingsKey(); - var params = this.params; - var item = this.currentItem; - var showTitle = userSettings.get(basekey + '-showTitle'); + getViewSettings() { + const basekey = this.getSettingsKey(); + const params = this.params; + const item = this.currentItem; + let showTitle = userSettings.get(basekey + '-showTitle'); if (showTitle === 'true') { showTitle = true; @@ -1105,7 +1113,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' showTitle = true; } - var imageType = userSettings.get(basekey + '-imageType'); + let imageType = userSettings.get(basekey + '-imageType'); if (!imageType && params.type === 'nextup') { imageType = 'thumb'; @@ -1117,10 +1125,10 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' imageType: imageType || 'primary', viewType: userSettings.get(basekey + '-viewType') || 'images' }; - }; + } - ItemsView.prototype.getItemTypes = function () { - var params = this.params; + getItemTypes() { + const params = this.params; if (params.type === 'nextup') { return ['Episode']; @@ -1131,12 +1139,12 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } return []; - }; + } - ItemsView.prototype.getSettingsKey = function () { - var values = []; + getSettingsKey() { + const values = []; values.push('items'); - var params = this.params; + const params = this.params; if (params.type) { values.push(params.type); @@ -1193,7 +1201,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } return values.join('-'); - }; + } +} - return ItemsView; -}); +export default ItemsView; + +/* eslint-enable indent */ diff --git a/src/livetv.html b/src/controllers/livetv.html similarity index 95% rename from src/livetv.html rename to src/controllers/livetv.html index fdf19bd915..fa6c3125d5 100644 --- a/src/livetv.html +++ b/src/controllers/livetv.html @@ -1,4 +1,4 @@ -
    +
    @@ -15,7 +15,7 @@
    @@ -24,7 +24,7 @@
    @@ -63,7 +63,7 @@
    - +
    diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 3ceda7d476..278200c634 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -1,132 +1,134 @@ -define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'userSettings', 'emby-itemscontainer'], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { - 'use strict'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import libraryBrowser from 'libraryBrowser'; +import loading from 'loading'; +import events from 'events'; +import * as userSettings from 'userSettings'; +import 'emby-itemscontainer'; - libraryBrowser = libraryBrowser.default || libraryBrowser; +export default function (view, params, tabContent) { + function getPageData() { + if (!pageData) { + pageData = { + query: { + StartIndex: 0, + Fields: 'PrimaryImageAspectRatio' + } + }; + } - return function (view, params, tabContent) { - function getPageData() { - if (!pageData) { - pageData = { - query: { - StartIndex: 0, - Fields: 'PrimaryImageAspectRatio' - } - }; + if (userSettings.libraryPageSize() > 0) { + pageData.query['Limit'] = userSettings.libraryPageSize(); + } + + return pageData; + } + + function getQuery() { + return getPageData().query; + } + + function getChannelsHtml(channels) { + return cardBuilder.getCardsHtml({ + items: channels, + shape: 'square', + showTitle: true, + lazy: true, + cardLayout: true, + showDetailsMenu: true, + showCurrentProgram: true, + showCurrentProgramTime: true + }); + } + + function renderChannels(context, result) { + function onNextPageClick() { + if (isLoading) { + return; } if (userSettings.libraryPageSize() > 0) { - pageData.query['Limit'] = userSettings.libraryPageSize(); + query.StartIndex += query.Limit; + } + reloadItems(context); + } + + function onPreviousPageClick() { + if (isLoading) { + return; } - return pageData; - } - - function getQuery() { - return getPageData().query; - } - - function getChannelsHtml(channels) { - return cardBuilder.getCardsHtml({ - items: channels, - shape: 'square', - showTitle: true, - lazy: true, - cardLayout: true, - showDetailsMenu: true, - showCurrentProgram: true, - showCurrentProgramTime: true - }); - } - - function renderChannels(context, result) { - function onNextPageClick() { - if (isLoading) { - return; - } - - if (userSettings.libraryPageSize() > 0) { - query.StartIndex += query.Limit; - } - reloadItems(context); - } - - function onPreviousPageClick() { - if (isLoading) { - return; - } - - if (userSettings.libraryPageSize() > 0) { - query.StartIndex = Math.max(0, query.StartIndex - query.Limit); - } - reloadItems(context); - } - - var query = getQuery(); - context.querySelector('.paging').innerHTML = libraryBrowser.getQueryPagingHtml({ - startIndex: query.StartIndex, - limit: query.Limit, - totalRecordCount: result.TotalRecordCount, - showLimit: false, - updatePageSizeSetting: false, - filterButton: false - }); - var html = getChannelsHtml(result.Items); - var elem = context.querySelector('#items'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - var i; - var length; - var elems; - - for (elems = context.querySelectorAll('.btnNextPage'), i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); - } - - for (elems = context.querySelectorAll('.btnPreviousPage'), i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + if (userSettings.libraryPageSize() > 0) { + query.StartIndex = Math.max(0, query.StartIndex - query.Limit); } + reloadItems(context); } - function showFilterMenu(context) { - require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { - var filterDialog = new filterDialogFactory({ - query: getQuery(), - mode: 'livetvchannels', - serverId: ApiClient.serverId() - }); - events.on(filterDialog, 'filterchange', function () { - reloadItems(context); - }); - filterDialog.show(); - }); - } - - function reloadItems(context, save) { - loading.show(); - isLoading = true; - var query = getQuery(); - var apiClient = ApiClient; - query.UserId = apiClient.getCurrentUserId(); - apiClient.getLiveTvChannels(query).then(function (result) { - renderChannels(context, result); - loading.hide(); - isLoading = false; - - require(['autoFocuser'], function (autoFocuser) { - autoFocuser.autoFocus(view); - }); - }); - } - - var pageData; - var self = this; - var isLoading = false; - tabContent.querySelector('.btnFilter').addEventListener('click', function () { - showFilterMenu(tabContent); + const query = getQuery(); + context.querySelector('.paging').innerHTML = libraryBrowser.getQueryPagingHtml({ + startIndex: query.StartIndex, + limit: query.Limit, + totalRecordCount: result.TotalRecordCount, + showLimit: false, + updatePageSizeSetting: false, + filterButton: false }); + const html = getChannelsHtml(result.Items); + const elem = context.querySelector('#items'); + elem.innerHTML = html; + imageLoader.lazyChildren(elem); + let i; + let length; + let elems; - self.renderTab = function () { - reloadItems(tabContent); - }; + for (elems = context.querySelectorAll('.btnNextPage'), i = 0, length = elems.length; i < length; i++) { + elems[i].addEventListener('click', onNextPageClick); + } + + for (elems = context.querySelectorAll('.btnPreviousPage'), i = 0, length = elems.length; i < length; i++) { + elems[i].addEventListener('click', onPreviousPageClick); + } + } + + function showFilterMenu(context) { + import(['components/filterdialog/filterdialog']).then(({default: FilterDialog}) => { + const filterDialog = new FilterDialog({ + query: getQuery(), + mode: 'livetvchannels', + serverId: ApiClient.serverId() + }); + events.on(filterDialog, 'filterchange', function () { + reloadItems(context); + }); + filterDialog.show(); + }); + } + + function reloadItems(context, save) { + loading.show(); + isLoading = true; + const query = getQuery(); + const apiClient = ApiClient; + query.UserId = apiClient.getCurrentUserId(); + apiClient.getLiveTvChannels(query).then(function (result) { + renderChannels(context, result); + loading.hide(); + isLoading = false; + + import('autoFocuser').then(({default: autoFocuser}) => { + autoFocuser.autoFocus(view); + }); + }); + } + + let pageData; + const self = this; + let isLoading = false; + tabContent.querySelector('.btnFilter').addEventListener('click', function () { + showFilterMenu(tabContent); + }); + + self.renderTab = function () { + reloadItems(tabContent); }; -}); +} diff --git a/src/controllers/livetv/livetvguide.js b/src/controllers/livetv/livetvguide.js index ec7a7a3f81..f8b49bd22a 100644 --- a/src/controllers/livetv/livetvguide.js +++ b/src/controllers/livetv/livetvguide.js @@ -1,29 +1,27 @@ -define(['tvguide'], function (tvguide) { - 'use strict'; +import tvguide from 'tvguide'; - return function (view, params, tabContent) { - var guideInstance; - var self = this; +export default function (view, params, tabContent) { + let guideInstance; + const self = this; - self.renderTab = function () { - if (!guideInstance) { - guideInstance = new tvguide({ - element: tabContent, - serverId: ApiClient.serverId() - }); - } - }; - - self.onShow = function () { - if (guideInstance) { - guideInstance.resume(); - } - }; - - self.onHide = function () { - if (guideInstance) { - guideInstance.pause(); - } - }; + self.renderTab = function () { + if (!guideInstance) { + guideInstance = new tvguide({ + element: tabContent, + serverId: ApiClient.serverId() + }); + } }; -}); + + self.onShow = function () { + if (guideInstance) { + guideInstance.resume(); + } + }; + + self.onHide = function () { + if (guideInstance) { + guideInstance.pause(); + } + }; +} diff --git a/src/controllers/livetv/livetvrecordings.js b/src/controllers/livetv/livetvrecordings.js index d832ca1339..ec2f57e14f 100644 --- a/src/controllers/livetv/livetvrecordings.js +++ b/src/controllers/livetv/livetvrecordings.js @@ -1,109 +1,112 @@ -define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'scripts/livetvcomponents', 'listViewStyle', 'emby-itemscontainer'], function (layoutManager, loading, cardBuilder, appHost, imageLoader) { - 'use strict'; +import loading from 'loading'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import 'scripts/livetvcomponents'; +import 'listViewStyle'; +import 'emby-itemscontainer'; - function renderRecordings(elem, recordings, cardOptions, scrollX) { - if (!elem) { - return; - } - - if (recordings.length) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - - var recordingItems = elem.querySelector('.recordingItems'); - - if (scrollX) { - recordingItems.classList.add('scrollX'); - recordingItems.classList.add('hiddenScrollX'); - recordingItems.classList.remove('vertical-wrap'); - } else { - recordingItems.classList.remove('scrollX'); - recordingItems.classList.remove('hiddenScrollX'); - recordingItems.classList.add('vertical-wrap'); - } - - recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ - items: recordings, - shape: scrollX ? 'autooverflow' : 'auto', - defaultShape: scrollX ? 'overflowBackdrop' : 'backdrop', - showTitle: true, - showParentTitle: true, - coverImage: true, - cardLayout: false, - centerText: true, - allowBottomPadding: !scrollX, - preferThumb: 'auto', - overlayText: false - }, cardOptions || {})); - imageLoader.lazyChildren(recordingItems); +function renderRecordings(elem, recordings, cardOptions, scrollX) { + if (!elem) { + return; } - function renderLatestRecordings(context, promise) { - promise.then(function (result) { - renderRecordings(context.querySelector('#latestRecordings'), result.Items, { - showYear: true, - lines: 2 - }, false); - loading.hide(); - }); + if (recordings.length) { + elem.classList.remove('hide'); + } else { + elem.classList.add('hide'); } - function renderRecordingFolders(context, promise) { - promise.then(function (result) { - renderRecordings(context.querySelector('#recordingFolders'), result.Items, { - showYear: false, - showParentTitle: false - }, false); - }); + const recordingItems = elem.querySelector('.recordingItems'); + + if (scrollX) { + recordingItems.classList.add('scrollX'); + recordingItems.classList.add('hiddenScrollX'); + recordingItems.classList.remove('vertical-wrap'); + } else { + recordingItems.classList.remove('scrollX'); + recordingItems.classList.remove('hiddenScrollX'); + recordingItems.classList.add('vertical-wrap'); } - function onMoreClick(e) { - var type = this.getAttribute('data-type'); - var serverId = ApiClient.serverId(); + recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ + items: recordings, + shape: scrollX ? 'autooverflow' : 'auto', + defaultShape: scrollX ? 'overflowBackdrop' : 'backdrop', + showTitle: true, + showParentTitle: true, + coverImage: true, + cardLayout: false, + centerText: true, + allowBottomPadding: !scrollX, + preferThumb: 'auto', + overlayText: false + }, cardOptions || {})); + imageLoader.lazyChildren(recordingItems); +} - switch (type) { - case 'latest': - Dashboard.navigate('list.html?type=Recordings&serverId=' + serverId); - } +function renderLatestRecordings(context, promise) { + promise.then(function (result) { + renderRecordings(context.querySelector('#latestRecordings'), result.Items, { + showYear: true, + lines: 2 + }, false); + loading.hide(); + }); +} + +function renderRecordingFolders(context, promise) { + promise.then(function (result) { + renderRecordings(context.querySelector('#recordingFolders'), result.Items, { + showYear: false, + showParentTitle: false + }, false); + }); +} + +function onMoreClick(e) { + const type = this.getAttribute('data-type'); + const serverId = ApiClient.serverId(); + + switch (type) { + case 'latest': + Dashboard.navigate('list.html?type=Recordings&serverId=' + serverId); + } +} + +export default function (view, params, tabContent) { + function enableFullRender() { + return new Date().getTime() - lastFullRender > 300000; } - return function (view, params, tabContent) { - function enableFullRender() { - return new Date().getTime() - lastFullRender > 300000; + let foldersPromise; + let latestPromise; + const self = this; + let lastFullRender = 0; + const moreButtons = tabContent.querySelectorAll('.more'); + + for (let i = 0, length = moreButtons.length; i < length; i++) { + moreButtons[i].addEventListener('click', onMoreClick); + } + + self.preRender = function () { + if (enableFullRender()) { + latestPromise = ApiClient.getLiveTvRecordings({ + UserId: Dashboard.getCurrentUserId(), + Limit: 12, + Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', + EnableTotalRecordCount: false, + EnableImageTypes: 'Primary,Thumb,Backdrop' + }); + foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId()); } - - var foldersPromise; - var latestPromise; - var self = this; - var lastFullRender = 0; - var moreButtons = tabContent.querySelectorAll('.more'); - - for (var i = 0, length = moreButtons.length; i < length; i++) { - moreButtons[i].addEventListener('click', onMoreClick); - } - - self.preRender = function () { - if (enableFullRender()) { - latestPromise = ApiClient.getLiveTvRecordings({ - UserId: Dashboard.getCurrentUserId(), - Limit: 12, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - EnableImageTypes: 'Primary,Thumb,Backdrop' - }); - foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId()); - } - }; - - self.renderTab = function () { - if (enableFullRender()) { - loading.show(); - renderLatestRecordings(tabContent, latestPromise); - renderRecordingFolders(tabContent, foldersPromise); - lastFullRender = new Date().getTime(); - } - }; }; -}); + + self.renderTab = function () { + if (enableFullRender()) { + loading.show(); + renderLatestRecordings(tabContent, latestPromise); + renderRecordingFolders(tabContent, foldersPromise); + lastFullRender = new Date().getTime(); + } + }; +} diff --git a/src/controllers/livetv/livetvschedule.js b/src/controllers/livetv/livetvschedule.js index 2f451e50fb..d7bfbad059 100644 --- a/src/controllers/livetv/livetvschedule.js +++ b/src/controllers/livetv/livetvschedule.js @@ -1,120 +1,124 @@ -define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'scripts/livetvcomponents', 'emby-button', 'emby-itemscontainer'], function (layoutManager, cardBuilder, appHost, imageLoader, loading) { - 'use strict'; +import layoutManager from 'layoutManager'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import loading from 'loading'; +import 'scripts/livetvcomponents'; +import 'emby-button'; +import 'emby-itemscontainer'; - function enableScrollX() { - return !layoutManager.desktop; +function enableScrollX() { + return !layoutManager.desktop; +} + +function renderRecordings(elem, recordings, cardOptions) { + if (recordings.length) { + elem.classList.remove('hide'); + } else { + elem.classList.add('hide'); } - function renderRecordings(elem, recordings, cardOptions) { - if (recordings.length) { + const recordingItems = elem.querySelector('.recordingItems'); + + if (enableScrollX()) { + recordingItems.classList.add('scrollX'); + + if (layoutManager.tv) { + recordingItems.classList.add('smoothScrollX'); + } + + recordingItems.classList.add('hiddenScrollX'); + recordingItems.classList.remove('vertical-wrap'); + } else { + recordingItems.classList.remove('scrollX'); + recordingItems.classList.remove('smoothScrollX'); + recordingItems.classList.remove('hiddenScrollX'); + recordingItems.classList.add('vertical-wrap'); + } + + recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ + items: recordings, + shape: enableScrollX() ? 'autooverflow' : 'auto', + showTitle: true, + showParentTitle: true, + coverImage: true, + cardLayout: false, + centerText: true, + allowBottomPadding: !enableScrollX(), + preferThumb: 'auto' + }, cardOptions || {})); + imageLoader.lazyChildren(recordingItems); +} + +function getBackdropShape() { + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; +} + +function renderActiveRecordings(context, promise) { + promise.then(function (result) { + renderRecordings(context.querySelector('#activeRecordings'), result.Items, { + shape: enableScrollX() ? 'autooverflow' : 'auto', + defaultShape: getBackdropShape(), + showParentTitle: false, + showParentTitleOrTitle: true, + showTitle: false, + showAirTime: true, + showAirEndTime: true, + showChannelName: true, + coverImage: true, + overlayText: false, + overlayMoreButton: true + }); + }); +} + +function renderTimers(context, timers, options) { + LiveTvHelpers.getTimersHtml(timers, options).then(function (html) { + const elem = context; + + if (html) { elem.classList.remove('hide'); } else { elem.classList.add('hide'); } - var recordingItems = elem.querySelector('.recordingItems'); + elem.querySelector('.recordingItems').innerHTML = html; + imageLoader.lazyChildren(elem); + }); +} - if (enableScrollX()) { - recordingItems.classList.add('scrollX'); +function renderUpcomingRecordings(context, promise) { + promise.then(function (result) { + renderTimers(context.querySelector('#upcomingRecordings'), result.Items); + loading.hide(); + }); +} - if (layoutManager.tv) { - recordingItems.classList.add('smoothScrollX'); - } +export default function (view, params, tabContent) { + let activeRecordingsPromise; + let upcomingRecordingsPromise; + const self = this; + tabContent.querySelector('#upcomingRecordings .recordingItems').addEventListener('timercancelled', function () { + self.preRender(); + self.renderTab(); + }); - recordingItems.classList.add('hiddenScrollX'); - recordingItems.classList.remove('vertical-wrap'); - } else { - recordingItems.classList.remove('scrollX'); - recordingItems.classList.remove('smoothScrollX'); - recordingItems.classList.remove('hiddenScrollX'); - recordingItems.classList.add('vertical-wrap'); - } - - recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ - items: recordings, - shape: enableScrollX() ? 'autooverflow' : 'auto', - showTitle: true, - showParentTitle: true, - coverImage: true, - cardLayout: false, - centerText: true, - allowBottomPadding: !enableScrollX(), - preferThumb: 'auto' - }, cardOptions || {})); - imageLoader.lazyChildren(recordingItems); - } - - function getBackdropShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function renderActiveRecordings(context, promise) { - promise.then(function (result) { - renderRecordings(context.querySelector('#activeRecordings'), result.Items, { - shape: enableScrollX() ? 'autooverflow' : 'auto', - defaultShape: getBackdropShape(), - showParentTitle: false, - showParentTitleOrTitle: true, - showTitle: false, - showAirTime: true, - showAirEndTime: true, - showChannelName: true, - coverImage: true, - overlayText: false, - overlayMoreButton: true - }); + self.preRender = function () { + activeRecordingsPromise = ApiClient.getLiveTvRecordings({ + UserId: Dashboard.getCurrentUserId(), + IsInProgress: true, + Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', + EnableTotalRecordCount: false, + EnableImageTypes: 'Primary,Thumb,Backdrop' }); - } - - function renderTimers(context, timers, options) { - LiveTvHelpers.getTimersHtml(timers, options).then(function (html) { - var elem = context; - - if (html) { - elem.classList.remove('hide'); - } else { - elem.classList.add('hide'); - } - - elem.querySelector('.recordingItems').innerHTML = html; - imageLoader.lazyChildren(elem); + upcomingRecordingsPromise = ApiClient.getLiveTvTimers({ + IsActive: false, + IsScheduled: true }); - } - - function renderUpcomingRecordings(context, promise) { - promise.then(function (result) { - renderTimers(context.querySelector('#upcomingRecordings'), result.Items); - loading.hide(); - }); - } - - return function (view, params, tabContent) { - var activeRecordingsPromise; - var upcomingRecordingsPromise; - var self = this; - tabContent.querySelector('#upcomingRecordings .recordingItems').addEventListener('timercancelled', function () { - self.preRender(); - self.renderTab(); - }); - - self.preRender = function () { - activeRecordingsPromise = ApiClient.getLiveTvRecordings({ - UserId: Dashboard.getCurrentUserId(), - IsInProgress: true, - Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', - EnableTotalRecordCount: false, - EnableImageTypes: 'Primary,Thumb,Backdrop' - }); - upcomingRecordingsPromise = ApiClient.getLiveTvTimers({ - IsActive: false, - IsScheduled: true - }); - }; - - self.renderTab = function () { - loading.show(); - renderActiveRecordings(tabContent, activeRecordingsPromise); - renderUpcomingRecordings(tabContent, upcomingRecordingsPromise); - }; }; -}); + + self.renderTab = function () { + loading.show(); + renderActiveRecordings(tabContent, activeRecordingsPromise); + renderUpcomingRecordings(tabContent, upcomingRecordingsPromise); + }; +} diff --git a/src/controllers/livetv/livetvseriestimers.js b/src/controllers/livetv/livetvseriestimers.js index c5d0da60d7..4f6bfaaa6a 100644 --- a/src/controllers/livetv/livetvseriestimers.js +++ b/src/controllers/livetv/livetvseriestimers.js @@ -1,50 +1,52 @@ -define(['datetime', 'cardBuilder', 'imageLoader', 'apphost', 'loading', 'paper-icon-button-light', 'emby-button'], function (datetime, cardBuilder, imageLoader, appHost, loading) { - 'use strict'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import loading from 'loading'; +import 'paper-icon-button-light'; +import 'emby-button'; - function renderTimers(context, timers) { - var html = ''; - html += cardBuilder.getCardsHtml({ - items: timers, - shape: 'auto', - defaultShape: 'portrait', - showTitle: true, - cardLayout: false, - preferThumb: 'auto', - coverImage: true, - overlayText: false, - showSeriesTimerTime: true, - showSeriesTimerChannel: true, - centerText: true, - overlayMoreButton: true, - lines: 3 - }); - var elem = context.querySelector('#items'); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); - loading.hide(); - } +function renderTimers(context, timers) { + const html = cardBuilder.getCardsHtml({ + items: timers, + shape: 'auto', + defaultShape: 'portrait', + showTitle: true, + cardLayout: false, + preferThumb: 'auto', + coverImage: true, + overlayText: false, + showSeriesTimerTime: true, + showSeriesTimerChannel: true, + centerText: true, + overlayMoreButton: true, + lines: 3 + }); + const elem = context.querySelector('#items'); + elem.innerHTML = html; + imageLoader.lazyChildren(elem); + loading.hide(); +} - function reload(context, promise) { - loading.show(); - promise.then(function (result) { - renderTimers(context, result.Items); - }); - } +function reload(context, promise) { + loading.show(); + promise.then(function (result) { + renderTimers(context, result.Items); + }); +} - var query = { - SortBy: 'SortName', - SortOrder: 'Ascending' +const query = { + SortBy: 'SortName', + SortOrder: 'Ascending' +}; + +export default function (view, params, tabContent) { + let timersPromise; + const self = this; + + self.preRender = function () { + timersPromise = ApiClient.getLiveTvSeriesTimers(query); }; - return function (view, params, tabContent) { - var timersPromise; - var self = this; - self.preRender = function () { - timersPromise = ApiClient.getLiveTvSeriesTimers(query); - }; - - self.renderTab = function () { - reload(tabContent, timersPromise); - }; + self.renderTab = function () { + reload(tabContent, timersPromise); }; -}); +} diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js index 36ba825a34..346630012a 100644 --- a/src/controllers/livetv/livetvsuggested.js +++ b/src/controllers/livetv/livetvsuggested.js @@ -1,393 +1,397 @@ -define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize', 'libraryBrowser', 'mainTabsManager', 'cardBuilder', 'apphost', 'imageLoader', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) { - 'use strict'; +import layoutManager from 'layoutManager'; +import * as userSettings from 'userSettings'; +import inputManager from 'inputManager'; +import loading from 'loading'; +import globalize from 'globalize'; +import * as mainTabsManager from 'mainTabsManager'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import 'scrollStyles'; +import 'emby-itemscontainer'; +import 'emby-tabs'; +import 'emby-button'; - function enableScrollX() { - return !layoutManager.desktop; +function enableScrollX() { + return !layoutManager.desktop; +} + +function getBackdropShape() { + if (enableScrollX()) { + return 'overflowBackdrop'; + } + return 'backdrop'; +} + +function getPortraitShape() { + if (enableScrollX()) { + return 'overflowPortrait'; + } + return 'portrait'; +} + +function getLimit() { + if (enableScrollX()) { + return 12; } - function getBackdropShape() { - if (enableScrollX()) { - return 'overflowBackdrop'; - } - return 'backdrop'; + return 9; +} + +function loadRecommendedPrograms(page) { + loading.show(); + let limit = getLimit(); + + if (enableScrollX()) { + limit *= 2; } - function getPortraitShape() { - if (enableScrollX()) { - return 'overflowPortrait'; - } - return 'portrait'; - } + ApiClient.getLiveTvRecommendedPrograms({ + userId: Dashboard.getCurrentUserId(), + IsAiring: true, + limit: limit, + ImageTypeLimit: 1, + EnableImageTypes: 'Primary,Thumb,Backdrop', + EnableTotalRecordCount: false, + Fields: 'ChannelInfo,PrimaryImageAspectRatio' + }).then(function (result) { + renderItems(page, result.Items, 'activeProgramItems', 'play', { + showAirDateTime: false, + showAirEndTime: true + }); + loading.hide(); - function getLimit() { - if (enableScrollX()) { - return 12; - } + import('autoFocuser').then(({default: autoFocuser}) => { + autoFocuser.autoFocus(page); + }); + }); +} - return 9; - } - - function loadRecommendedPrograms(page) { - loading.show(); - var limit = getLimit(); - - if (enableScrollX()) { - limit *= 2; - } - - ApiClient.getLiveTvRecommendedPrograms({ +function reload(page, enableFullRender) { + if (enableFullRender) { + loadRecommendedPrograms(page); + ApiClient.getLiveTvPrograms({ userId: Dashboard.getCurrentUserId(), - IsAiring: true, - limit: limit, - ImageTypeLimit: 1, - EnableImageTypes: 'Primary,Thumb,Backdrop', + HasAired: false, + limit: getLimit(), + IsMovie: false, + IsSports: false, + IsKids: false, + IsNews: false, + IsSeries: true, EnableTotalRecordCount: false, - Fields: 'ChannelInfo,PrimaryImageAspectRatio' + Fields: 'ChannelInfo,PrimaryImageAspectRatio', + EnableImageTypes: 'Primary,Thumb' }).then(function (result) { - renderItems(page, result.Items, 'activeProgramItems', 'play', { - showAirDateTime: false, - showAirEndTime: true + renderItems(page, result.Items, 'upcomingEpisodeItems'); + }); + ApiClient.getLiveTvPrograms({ + userId: Dashboard.getCurrentUserId(), + HasAired: false, + limit: getLimit(), + IsMovie: true, + EnableTotalRecordCount: false, + Fields: 'ChannelInfo', + EnableImageTypes: 'Primary,Thumb' + }).then(function (result) { + renderItems(page, result.Items, 'upcomingTvMovieItems', null, { + shape: getPortraitShape(), + preferThumb: null, + showParentTitle: false }); - loading.hide(); - - require(['autoFocuser'], function (autoFocuser) { - autoFocuser.autoFocus(page); + }); + ApiClient.getLiveTvPrograms({ + userId: Dashboard.getCurrentUserId(), + HasAired: false, + limit: getLimit(), + IsSports: true, + EnableTotalRecordCount: false, + Fields: 'ChannelInfo,PrimaryImageAspectRatio', + EnableImageTypes: 'Primary,Thumb' + }).then(function (result) { + renderItems(page, result.Items, 'upcomingSportsItems'); + }); + ApiClient.getLiveTvPrograms({ + userId: Dashboard.getCurrentUserId(), + HasAired: false, + limit: getLimit(), + IsKids: true, + EnableTotalRecordCount: false, + Fields: 'ChannelInfo,PrimaryImageAspectRatio', + EnableImageTypes: 'Primary,Thumb' + }).then(function (result) { + renderItems(page, result.Items, 'upcomingKidsItems'); + }); + ApiClient.getLiveTvPrograms({ + userId: Dashboard.getCurrentUserId(), + HasAired: false, + limit: getLimit(), + IsNews: true, + EnableTotalRecordCount: false, + Fields: 'ChannelInfo,PrimaryImageAspectRatio', + EnableImageTypes: 'Primary,Thumb' + }).then(function (result) { + renderItems(page, result.Items, 'upcomingNewsItems', null, { + showParentTitleOrTitle: true, + showTitle: false, + showParentTitle: false }); }); } +} - function reload(page, enableFullRender) { - if (enableFullRender) { - loadRecommendedPrograms(page); - ApiClient.getLiveTvPrograms({ - userId: Dashboard.getCurrentUserId(), - HasAired: false, - limit: getLimit(), - IsMovie: false, - IsSports: false, - IsKids: false, - IsNews: false, - IsSeries: true, - EnableTotalRecordCount: false, - Fields: 'ChannelInfo,PrimaryImageAspectRatio', - EnableImageTypes: 'Primary,Thumb' - }).then(function (result) { - renderItems(page, result.Items, 'upcomingEpisodeItems'); - }); - ApiClient.getLiveTvPrograms({ - userId: Dashboard.getCurrentUserId(), - HasAired: false, - limit: getLimit(), - IsMovie: true, - EnableTotalRecordCount: false, - Fields: 'ChannelInfo', - EnableImageTypes: 'Primary,Thumb' - }).then(function (result) { - renderItems(page, result.Items, 'upcomingTvMovieItems', null, { - shape: getPortraitShape(), - preferThumb: null, - showParentTitle: false - }); - }); - ApiClient.getLiveTvPrograms({ - userId: Dashboard.getCurrentUserId(), - HasAired: false, - limit: getLimit(), - IsSports: true, - EnableTotalRecordCount: false, - Fields: 'ChannelInfo,PrimaryImageAspectRatio', - EnableImageTypes: 'Primary,Thumb' - }).then(function (result) { - renderItems(page, result.Items, 'upcomingSportsItems'); - }); - ApiClient.getLiveTvPrograms({ - userId: Dashboard.getCurrentUserId(), - HasAired: false, - limit: getLimit(), - IsKids: true, - EnableTotalRecordCount: false, - Fields: 'ChannelInfo,PrimaryImageAspectRatio', - EnableImageTypes: 'Primary,Thumb' - }).then(function (result) { - renderItems(page, result.Items, 'upcomingKidsItems'); - }); - ApiClient.getLiveTvPrograms({ - userId: Dashboard.getCurrentUserId(), - HasAired: false, - limit: getLimit(), - IsNews: true, - EnableTotalRecordCount: false, - Fields: 'ChannelInfo,PrimaryImageAspectRatio', - EnableImageTypes: 'Primary,Thumb' - }).then(function (result) { - renderItems(page, result.Items, 'upcomingNewsItems', null, { - showParentTitleOrTitle: true, - showTitle: false, - showParentTitle: false - }); - }); +function renderItems(page, items, sectionClass, overlayButton, cardOptions) { + const html = cardBuilder.getCardsHtml(Object.assign({ + items: items, + preferThumb: 'auto', + inheritThumb: false, + shape: enableScrollX() ? 'autooverflow' : 'auto', + defaultShape: getBackdropShape(), + showParentTitle: true, + showTitle: true, + centerText: true, + coverImage: true, + overlayText: false, + lazy: true, + overlayPlayButton: overlayButton === 'play', + overlayMoreButton: overlayButton === 'more', + overlayInfoButton: overlayButton === 'info', + allowBottomPadding: !enableScrollX(), + showAirTime: true, + showAirDateTime: true + }, cardOptions || {})); + const elem = page.querySelector('.' + sectionClass); + elem.innerHTML = html; + imageLoader.lazyChildren(elem); +} + +function getTabs() { + return [{ + name: globalize.translate('Programs') + }, { + name: globalize.translate('Guide') + }, { + name: globalize.translate('Channels') + }, { + name: globalize.translate('Recordings') + }, { + name: globalize.translate('Schedule') + }, { + name: globalize.translate('Series') + }]; +} + +function setScrollClasses(elem, scrollX) { + if (scrollX) { + elem.classList.add('hiddenScrollX'); + + if (layoutManager.tv) { + elem.classList.add('smoothScrollX'); } + + elem.classList.add('scrollX'); + elem.classList.remove('vertical-wrap'); + } else { + elem.classList.remove('hiddenScrollX'); + elem.classList.remove('smoothScrollX'); + elem.classList.remove('scrollX'); + elem.classList.add('vertical-wrap'); + } +} + +function getDefaultTabIndex(folderId) { + if (userSettings.get('landing-' + folderId) === 'guide') { + return 1; } - function renderItems(page, items, sectionClass, overlayButton, cardOptions) { - var html = cardBuilder.getCardsHtml(Object.assign({ - items: items, - preferThumb: 'auto', - inheritThumb: false, - shape: enableScrollX() ? 'autooverflow' : 'auto', - defaultShape: getBackdropShape(), - showParentTitle: true, - showTitle: true, - centerText: true, - coverImage: true, - overlayText: false, - lazy: true, - overlayPlayButton: overlayButton === 'play', - overlayMoreButton: overlayButton === 'more', - overlayInfoButton: overlayButton === 'info', - allowBottomPadding: !enableScrollX(), - showAirTime: true, - showAirDateTime: true - }, cardOptions || {})); - var elem = page.querySelector('.' + sectionClass); - elem.innerHTML = html; - imageLoader.lazyChildren(elem); + return 0; +} + +export default function (view, params) { + function enableFullRender() { + return new Date().getTime() - lastFullRender > 3e5; } - function getTabs() { - return [{ - name: globalize.translate('Programs') - }, { - name: globalize.translate('TabGuide') - }, { - name: globalize.translate('TabChannels') - }, { - name: globalize.translate('TabRecordings') - }, { - name: globalize.translate('HeaderSchedule') - }, { - name: globalize.translate('TabSeries') - }, { - name: globalize.translate('ButtonSearch'), - cssClass: 'searchTabButton' - }]; + function onBeforeTabChange(evt) { + preLoadTab(view, parseInt(evt.detail.selectedTabIndex)); } - function setScrollClasses(elem, scrollX) { - if (scrollX) { - elem.classList.add('hiddenScrollX'); + function onTabChange(evt) { + const previousTabController = tabControllers[parseInt(evt.detail.previousIndex)]; - if (layoutManager.tv) { - elem.classList.add('smoothScrollX'); + if (previousTabController && previousTabController.onHide) { + previousTabController.onHide(); + } + + loadTab(view, parseInt(evt.detail.selectedTabIndex)); + } + + function getTabContainers() { + return view.querySelectorAll('.pageTabContent'); + } + + function initTabs() { + mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange); + } + + function getTabController(page, index, callback) { + let depends; + + // TODO int is a little hard to read + switch (index) { + case 0: + depends = 'controllers/livetv/livetvsuggested'; + break; + + case 1: + depends = 'controllers/livetv/livetvguide'; + break; + + case 2: + depends = 'controllers/livetv/livetvchannels'; + break; + + case 3: + depends = 'controllers/livetv/livetvrecordings'; + break; + + case 4: + depends = 'controllers/livetv/livetvschedule'; + break; + + case 5: + depends = 'controllers/livetv/livetvseriestimers'; + break; + } + + import(depends).then(({default: controllerFactory}) => { + let tabContent; + + if (index === 0) { + tabContent = view.querySelector(`.pageTabContent[data-index="${index}"]`); + self.tabContent = tabContent; } - elem.classList.add('scrollX'); - elem.classList.remove('vertical-wrap'); - } else { - elem.classList.remove('hiddenScrollX'); - elem.classList.remove('smoothScrollX'); - elem.classList.remove('scrollX'); - elem.classList.add('vertical-wrap'); - } - } + let controller = tabControllers[index]; - function getDefaultTabIndex(folderId) { - if (userSettings.get('landing-' + folderId) === 'guide') { - return 1; - } + if (!controller) { + tabContent = view.querySelector(`.pageTabContent[data-index="${index}"]`); - return 0; - } - - return function (view, params) { - function enableFullRender() { - return new Date().getTime() - lastFullRender > 3e5; - } - - function onBeforeTabChange(evt) { - preLoadTab(view, parseInt(evt.detail.selectedTabIndex)); - } - - function onTabChange(evt) { - var previousTabController = tabControllers[parseInt(evt.detail.previousIndex)]; - - if (previousTabController && previousTabController.onHide) { - previousTabController.onHide(); - } - - loadTab(view, parseInt(evt.detail.selectedTabIndex)); - } - - function getTabContainers() { - return view.querySelectorAll('.pageTabContent'); - } - - function initTabs() { - mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange); - } - - function getTabController(page, index, callback) { - var depends = []; - - // TODO int is a little hard to read - switch (index) { - case 0: - break; - - case 1: - depends.push('controllers/livetv/livetvguide'); - break; - - case 2: - depends.push('controllers/livetv/livetvchannels'); - break; - - case 3: - depends.push('controllers/livetv/livetvrecordings'); - break; - - case 4: - depends.push('controllers/livetv/livetvschedule'); - break; - - case 5: - depends.push('controllers/livetv/livetvseriestimers'); - break; - - case 6: - depends.push('scripts/searchtab'); - } - - require(depends, function (controllerFactory) { - var tabContent; - - if (index == 0) { - tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); - self.tabContent = tabContent; + if (index === 0) { + controller = self; + } else if (index === 6) { + controller = new controllerFactory(view, tabContent, { + collectionType: 'livetv' + }); + } else { + controller = new controllerFactory(view, params, tabContent); } - var controller = tabControllers[index]; + tabControllers[index] = controller; - if (!controller) { - tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); + if (controller.initTab) { + controller.initTab(); + } + } - if (index === 0) { - controller = self; - } else if (index === 6) { - controller = new controllerFactory(view, tabContent, { - collectionType: 'livetv' - }); - } else { - controller = new controllerFactory(view, params, tabContent); - } + callback(controller); + }); + } - tabControllers[index] = controller; + function preLoadTab(page, index) { + getTabController(page, index, function (controller) { + if (renderedTabs.indexOf(index) === -1 && controller.preRender) { + controller.preRender(); + } + }); + } - if (controller.initTab) { - controller.initTab(); - } + function loadTab(page, index) { + currentTabIndex = index; + getTabController(page, index, function (controller) { + initialTabIndex = null; + + if (renderedTabs.indexOf(index) === -1) { + if (index === 1) { + renderedTabs.push(index); } - callback(controller); - }); + controller.renderTab(); + } else if (controller.onShow) { + controller.onShow(); + } + + currentTabController = controller; + }); + } + + function onInputCommand(evt) { + if (evt.detail.command === 'search') { + evt.preventDefault(); + Dashboard.navigate('search.html?collectionType=livetv'); } + } - function preLoadTab(page, index) { - getTabController(page, index, function (controller) { - if (renderedTabs.indexOf(index) === -1 && controller.preRender) { - controller.preRender(); - } - }); + let isViewRestored; + const self = this; + let currentTabIndex = parseInt(params.tab || getDefaultTabIndex('livetv')); + let initialTabIndex = currentTabIndex; + let lastFullRender = 0; + [].forEach.call(view.querySelectorAll('.sectionTitleTextButton-programs'), function (link) { + const href = link.href; + + if (href) { + link.href = href + '&serverId=' + ApiClient.serverId(); } + }); - function loadTab(page, index) { - currentTabIndex = index; - getTabController(page, index, function (controller) { - initialTabIndex = null; + self.initTab = function () { + const tabContent = view.querySelector('.pageTabContent[data-index="0"]'); + const containers = tabContent.querySelectorAll('.itemsContainer'); - if (renderedTabs.indexOf(index) == -1) { - if (index === 1) { - renderedTabs.push(index); - } - - controller.renderTab(); - } else if (controller.onShow) { - controller.onShow(); - } - - currentTabController = controller; - }); + for (let i = 0, length = containers.length; i < length; i++) { + setScrollClasses(containers[i], enableScrollX()); } - - function onInputCommand(evt) { - if (evt.detail.command === 'search') { - evt.preventDefault(); - Dashboard.navigate('search.html?collectionType=livetv'); - } - } - - var isViewRestored; - var self = this; - var currentTabIndex = parseInt(params.tab || getDefaultTabIndex('livetv')); - var initialTabIndex = currentTabIndex; - var lastFullRender = 0; - [].forEach.call(view.querySelectorAll('.sectionTitleTextButton-programs'), function (link) { - var href = link.href; - - if (href) { - link.href = href + '&serverId=' + ApiClient.serverId(); - } - }); - - self.initTab = function () { - var tabContent = view.querySelector(".pageTabContent[data-index='0']"); - var containers = tabContent.querySelectorAll('.itemsContainer'); - - for (var i = 0, length = containers.length; i < length; i++) { - setScrollClasses(containers[i], enableScrollX()); - } - }; - - self.renderTab = function () { - var tabContent = view.querySelector(".pageTabContent[data-index='0']"); - - if (enableFullRender()) { - reload(tabContent, true); - lastFullRender = new Date().getTime(); - } else { - reload(tabContent); - } - }; - - var currentTabController; - var tabControllers = []; - var renderedTabs = []; - view.addEventListener('viewbeforeshow', function (evt) { - isViewRestored = evt.detail.isRestored; - initTabs(); - }); - view.addEventListener('viewshow', function (evt) { - isViewRestored = evt.detail.isRestored; - - if (!isViewRestored) { - mainTabsManager.selectedTabIndex(initialTabIndex); - } - - inputManager.on(window, onInputCommand); - }); - view.addEventListener('viewbeforehide', function (e) { - if (currentTabController && currentTabController.onHide) { - currentTabController.onHide(); - } - - inputManager.off(window, onInputCommand); - }); - view.addEventListener('viewdestroy', function (evt) { - tabControllers.forEach(function (tabController) { - if (tabController.destroy) { - tabController.destroy(); - } - }); - }); }; -}); + + self.renderTab = function () { + const tabContent = view.querySelector('.pageTabContent[data-index="0"]'); + + if (enableFullRender()) { + reload(tabContent, true); + lastFullRender = new Date().getTime(); + } else { + reload(tabContent); + } + }; + + let currentTabController; + const tabControllers = []; + const renderedTabs = []; + view.addEventListener('viewbeforeshow', function (evt) { + isViewRestored = evt.detail.isRestored; + initTabs(); + }); + view.addEventListener('viewshow', function (evt) { + isViewRestored = evt.detail.isRestored; + + if (!isViewRestored) { + mainTabsManager.selectedTabIndex(initialTabIndex); + } + + inputManager.on(window, onInputCommand); + }); + view.addEventListener('viewbeforehide', function () { + if (currentTabController && currentTabController.onHide) { + currentTabController.onHide(); + } + + inputManager.off(window, onInputCommand); + }); + view.addEventListener('viewdestroy', function () { + tabControllers.forEach(function (tabController) { + if (tabController.destroy) { + tabController.destroy(); + } + }); + }); +} diff --git a/src/livetvguideprovider.html b/src/controllers/livetvguideprovider.html similarity index 100% rename from src/livetvguideprovider.html rename to src/controllers/livetvguideprovider.html diff --git a/src/controllers/livetvguideprovider.js b/src/controllers/livetvguideprovider.js index 8f8b9f91c7..6ab195a088 100644 --- a/src/controllers/livetvguideprovider.js +++ b/src/controllers/livetvguideprovider.js @@ -1,30 +1,30 @@ -define(['events', 'loading', 'globalize'], function (events, loading, globalize) { - 'use strict'; +import events from 'events'; +import loading from 'loading'; +import globalize from 'globalize'; - function onListingsSubmitted() { - Dashboard.navigate('livetvstatus.html'); - } +function onListingsSubmitted() { + Dashboard.navigate('livetvstatus.html'); +} - function init(page, type, providerId) { - var url = 'components/tvproviders/' + type + '.js'; +function init(page, type, providerId) { + const url = 'components/tvproviders/' + type + '.js'; - require([url], function (factory) { - var instance = new factory(page, providerId, {}); - events.on(instance, 'submitted', onListingsSubmitted); - instance.init(); - }); - } - - function loadTemplate(page, type, providerId) { - require(['text!./components/tvproviders/' + type + '.template.html'], function (html) { - page.querySelector('.providerTemplate').innerHTML = globalize.translateHtml(html); - init(page, type, providerId); - }); - } - - pageIdOn('pageshow', 'liveTvGuideProviderPage', function () { - loading.show(); - var providerId = getParameterByName('id'); - loadTemplate(this, getParameterByName('type'), providerId); + import(url).then(({default: factory}) => { + const instance = new factory(page, providerId, {}); + events.on(instance, 'submitted', onListingsSubmitted); + instance.init(); }); +} + +function loadTemplate(page, type, providerId) { + import('text!./../components/tvproviders/' + type + '.template.html').then(({default: html}) => { + page.querySelector('.providerTemplate').innerHTML = globalize.translateHtml(html); + init(page, type, providerId); + }); +} + +pageIdOn('pageshow', 'liveTvGuideProviderPage', function () { + loading.show(); + const providerId = getParameterByName('id'); + loadTemplate(this, getParameterByName('type'), providerId); }); diff --git a/src/livetvsettings.html b/src/controllers/livetvsettings.html similarity index 97% rename from src/livetvsettings.html rename to src/controllers/livetvsettings.html index 02b960f08d..ad3a9de7af 100644 --- a/src/livetvsettings.html +++ b/src/controllers/livetvsettings.html @@ -11,7 +11,7 @@
    '; } - var itemsContainer = tabContent.querySelector('.itemsContainer'); + const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); }); - } + }; - var self = this; - var data = {}; - var isLoading = false; + const data = {}; + let isLoading = false; - self.getCurrentViewStyle = function () { + this.getCurrentViewStyle = function () { return getPageData(tabContent).view; }; - function initPage(tabContent) { + const initPage = (tabContent) => { tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ @@ -229,36 +233,37 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB button: e.target }); }); - var btnSelectView = tabContent.querySelector('.btnSelectView'); + const btnSelectView = tabContent.querySelector('.btnSelectView'); btnSelectView.addEventListener('click', function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); + libraryBrowser.showLayoutMenu(e.target, this.getCurrentViewStyle(), 'List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); }); btnSelectView.addEventListener('layoutchange', function (e) { - var viewStyle = e.detail.viewStyle; + const viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); getQuery(tabContent).StartIndex = 0; onViewStyleChange(); reloadItems(tabContent); }); - tabContent.querySelector('.btnNewCollection').addEventListener('click', function () { - require(['collectionEditor'], function (collectionEditor) { - var serverId = ApiClient.serverInfo().Id; + tabContent.querySelector('.btnNewCollection').addEventListener('click', () => { + import('collectionEditor').then(({default: collectionEditor}) => { + const serverId = ApiClient.serverInfo().Id; new collectionEditor.showEditor({ items: [], serverId: serverId }); }); }); - } + }; initPage(tabContent); onViewStyleChange(); - self.renderTab = function () { + this.renderTab = function () { reloadItems(tabContent); }; - self.destroy = function () {}; - }; -}); + this.destroy = function () {}; + } + +/* eslint-enable indent */ diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index 07334b4d91..ca02ede36d 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -1,12 +1,18 @@ -define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader', 'apphost', 'globalize', 'appRouter', 'dom', 'emby-button'], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) { - 'use strict'; +import layoutManager from 'layoutManager'; +import loading from 'loading'; +import libraryBrowser from 'libraryBrowser'; +import cardBuilder from 'cardBuilder'; +import lazyLoader from 'lazyLoader'; +import globalize from 'globalize'; +import appRouter from 'appRouter'; +import 'emby-button'; - libraryBrowser = libraryBrowser.default || libraryBrowser; +/* eslint-disable indent */ - return function (view, params, tabContent) { + export default function (view, params, tabContent) { function getPageData() { - var key = getSavedQueryKey(); - var pageData = data[key]; + const key = getSavedQueryKey(); + let pageData = data[key]; if (!pageData) { pageData = data[key] = { @@ -36,7 +42,7 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader function getPromise() { loading.show(); - var query = getQuery(); + const query = getQuery(); return ApiClient.getGenres(ApiClient.getCurrentUserId(), query); } @@ -52,18 +58,18 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader return enableScrollX() ? 'overflowPortrait' : 'portrait'; } - function fillItemsContainer(entry) { - var elem = entry.target; - var id = elem.getAttribute('data-id'); - var viewStyle = self.getCurrentViewStyle(); - var limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9; + const fillItemsContainer = (entry) => { + const elem = entry.target; + const id = elem.getAttribute('data-id'); + const viewStyle = this.getCurrentViewStyle(); + let limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9; if (enableScrollX()) { limit = 10; } - var enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 'Primary,Backdrop,Thumb' : 'Primary'; - var query = { + const enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 'Primary,Backdrop,Thumb' : 'Primary'; + const query = { SortBy: 'SortName', SortOrder: 'Ascending', IncludeItemTypes: 'Movie', @@ -125,17 +131,17 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader tabContent.querySelector('.btnMoreFromGenre' + id + ' .material-icons').classList.remove('hide'); } }); - } + }; function reloadItems(context, promise) { - var query = getQuery(); + const query = getQuery(); promise.then(function (result) { - var elem = context.querySelector('#items'); - var html = ''; - var items = result.Items; + const elem = context.querySelector('#items'); + let html = ''; + const items = result.Items; - for (var i = 0, length = items.length; i < length; i++) { - var item = items[i]; + for (let i = 0, length = items.length; i < length; i++) { + const item = items[i]; html += '
    '; html += '
    '; @@ -150,7 +156,7 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader html += ''; html += '
    '; if (enableScrollX()) { - var scrollXClass = 'scrollX hiddenScrollX'; + let scrollXClass = 'scrollX hiddenScrollX'; if (layoutManager.tv) { scrollXClass += 'smoothScrollX padded-top-focusscale padded-bottom-focusscale'; @@ -181,37 +187,37 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader }); } - function fullyReload() { - self.preRender(); - self.renderTab(); - } + const fullyReload = () => { + this.preRender(); + this.renderTab(); + }; - var self = this; - var data = {}; + const data = {}; - self.getViewStyles = function () { + this.getViewStyles = function () { return 'Poster,PosterCard,Thumb,ThumbCard'.split(','); }; - self.getCurrentViewStyle = function () { + this.getCurrentViewStyle = function () { return getPageData().view; }; - self.setCurrentViewStyle = function (viewStyle) { + this.setCurrentViewStyle = function (viewStyle) { getPageData().view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); fullyReload(); }; - self.enableViewSelection = true; - var promise; + this.enableViewSelection = true; + let promise; - self.preRender = function () { + this.preRender = function () { promise = getPromise(); }; - self.renderTab = function () { + this.renderTab = function () { reloadItems(tabContent, promise); }; - }; -}); + } + +/* eslint-enable indent */ diff --git a/src/movies.html b/src/controllers/movies/movies.html similarity index 91% rename from src/movies.html rename to src/controllers/movies/movies.html index a2221c510d..dddda3f7f9 100644 --- a/src/movies.html +++ b/src/controllers/movies/movies.html @@ -4,8 +4,8 @@
    - - + +
    @@ -46,8 +46,8 @@
    - - + +
    @@ -75,7 +75,7 @@
    - +
    diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index f4c126c468..91b428ec68 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -1,11 +1,18 @@ -define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', 'alphaPicker', 'listView', 'cardBuilder', 'globalize', 'emby-itemscontainer'], function (loading, layoutManager, userSettings, events, libraryBrowser, AlphaPicker, listView, cardBuilder, globalize) { - 'use strict'; +import loading from 'loading'; +import * as userSettings from 'userSettings'; +import events from 'events'; +import libraryBrowser from 'libraryBrowser'; +import AlphaPicker from 'alphaPicker'; +import listView from 'listView'; +import cardBuilder from 'cardBuilder'; +import globalize from 'globalize'; +import 'emby-itemscontainer'; - libraryBrowser = libraryBrowser.default || libraryBrowser; +/* eslint-disable indent */ - return function (view, params, tabContent, options) { - function onViewStyleChange() { - if (self.getCurrentViewStyle() == 'List') { + export default function (view, params, tabContent, options) { + const onViewStyleChange = () => { + if (this.getCurrentViewStyle() == 'List') { itemsContainer.classList.add('vertical-list'); itemsContainer.classList.remove('vertical-wrap'); } else { @@ -14,13 +21,13 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', } itemsContainer.innerHTML = ''; - } + }; - function updateFilterControls() { - if (self.alphaPicker) { - self.alphaPicker.value(query.NameStartsWithOrGreater); + const updateFilterControls = () => { + if (this.alphaPicker) { + this.alphaPicker.value(query.NameStartsWithOrGreater); } - } + }; function fetchData() { isLoading = true; @@ -53,7 +60,7 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', window.scrollTo(0, 0); updateFilterControls(); - var pagingHtml = libraryBrowser.getQueryPagingHtml({ + const pagingHtml = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, totalRecordCount: result.TotalRecordCount, @@ -63,35 +70,30 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', sortButton: false, filterButton: false }); - var i; - var length; - var elems = tabContent.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].innerHTML = pagingHtml; + for (const elem of tabContent.querySelectorAll('.paging')) { + elem.innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); + for (const elem of tabContent.querySelectorAll('.btnNextPage')) { + elem.addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + for (const elem of tabContent.querySelectorAll('.btnPreviousPage')) { + elem.addEventListener('click', onPreviousPageClick); } isLoading = false; loading.hide(); - require(['autoFocuser'], function (autoFocuser) { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(tabContent); }); } - function getItemsHtml(items) { - var html; - var viewStyle = self.getCurrentViewStyle(); + const getItemsHtml = (items) => { + let html; + const viewStyle = this.getCurrentViewStyle(); if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ @@ -155,22 +157,22 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', } return html; - } + }; - function initPage(tabContent) { + const initPage = (tabContent) => { itemsContainer.fetchData = fetchData; itemsContainer.getItemsHtml = getItemsHtml; itemsContainer.afterRefresh = afterRefresh; - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); + let alphaPickerElement = tabContent.querySelector('.alphaPicker'); if (alphaPickerElement) { alphaPickerElement.addEventListener('alphavaluechanged', function (e) { - var newValue = e.detail.value; + let newValue = e.detail.value; query.NameStartsWithOrGreater = newValue; query.StartIndex = 0; itemsContainer.refreshItems(); }); - self.alphaPicker = new AlphaPicker.default({ + this.alphaPicker = new AlphaPicker({ element: alphaPickerElement, valueChangeEvent: 'click' }); @@ -180,14 +182,14 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', itemsContainer.classList.add('padded-right-withalphapicker'); } - var btnFilter = tabContent.querySelector('.btnFilter'); + const btnFilter = tabContent.querySelector('.btnFilter'); if (btnFilter) { - btnFilter.addEventListener('click', function () { - self.showFilterMenu(); + btnFilter.addEventListener('click', () => { + this.showFilterMenu(); }); } - var btnSort = tabContent.querySelector('.btnSort'); + const btnSort = tabContent.querySelector('.btnSort'); if (btnSort) { btnSort.addEventListener('click', function (e) { @@ -230,24 +232,23 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', }); }); } - var btnSelectView = tabContent.querySelector('.btnSelectView'); + const btnSelectView = tabContent.querySelector('.btnSelectView'); btnSelectView.addEventListener('click', function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'Banner,List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); + libraryBrowser.showLayoutMenu(e.target, this.getCurrentViewStyle, 'Banner,List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); }); btnSelectView.addEventListener('layoutchange', function (e) { - var viewStyle = e.detail.viewStyle; + let viewStyle = e.detail.viewStyle; userSettings.set(savedViewKey, viewStyle); query.StartIndex = 0; onViewStyleChange(); itemsContainer.refreshItems(); }); - } + }; - var self = this; - var itemsContainer = tabContent.querySelector('.itemsContainer'); - var savedQueryKey = params.topParentId + '-' + options.mode; - var savedViewKey = savedQueryKey + '-view'; - var query = { + let itemsContainer = tabContent.querySelector('.itemsContainer'); + const savedQueryKey = params.topParentId + '-' + options.mode; + const savedViewKey = savedQueryKey + '-view'; + let query = { SortBy: 'SortName,ProductionYear', SortOrder: 'Ascending', IncludeItemTypes: 'Movie', @@ -263,7 +264,7 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', query['Limit'] = userSettings.libraryPageSize(); } - var isLoading = false; + let isLoading = false; if (options.mode === 'favorites') { query.IsFavorite = true; @@ -271,14 +272,14 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', query = userSettings.loadQuerySettings(savedQueryKey, query); - self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { - var filterDialog = new filterDialogFactory({ + this.showFilterMenu = function () { + import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + let filterDialog = new filterDialogFactory({ query: query, mode: 'movies', serverId: ApiClient.serverId() }); - events.on(filterDialog, 'filterchange', function () { + events.on(filterDialog, 'filterchange', () => { query.StartIndex = 0; itemsContainer.refreshItems(); }); @@ -286,22 +287,23 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', }); }; - self.getCurrentViewStyle = function () { + this.getCurrentViewStyle = function () { return userSettings.get(savedViewKey) || 'Poster'; }; - self.initTab = function () { + this.initTab = function () { initPage(tabContent); onViewStyleChange(); }; - self.renderTab = function () { + this.renderTab = function () { itemsContainer.refreshItems(); updateFilterControls(); }; - self.destroy = function () { + this.destroy = function () { itemsContainer = null; }; - }; -}); + } + +/* eslint-enable indent */ diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index 4ffe7888cf..5b85fbadae 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -1,5 +1,20 @@ -define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu', 'mainTabsManager', 'cardBuilder', 'dom', 'imageLoader', 'playbackManager', 'globalize', 'emby-scroller', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager, globalize) { - 'use strict'; +import events from 'events'; +import layoutManager from 'layoutManager'; +import inputManager from 'inputManager'; +import * as userSettings from 'userSettings'; +import libraryMenu from 'libraryMenu'; +import * as mainTabsManager from 'mainTabsManager'; +import cardBuilder from 'cardBuilder'; +import dom from 'dom'; +import imageLoader from 'imageLoader'; +import playbackManager from 'playbackManager'; +import globalize from 'globalize'; +import 'emby-scroller'; +import 'emby-itemscontainer'; +import 'emby-tabs'; +import 'emby-button'; + +/* eslint-disable indent */ function enableScrollX() { return !layoutManager.desktop; @@ -14,7 +29,7 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' } function loadLatest(page, userId, parentId) { - var options = { + const options = { IncludeItemTypes: 'Movie', Limit: 18, Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', @@ -24,8 +39,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' EnableTotalRecordCount: false }; ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { - var allowBottomPadding = !enableScrollX(); - var container = page.querySelector('#recentlyAddedItems'); + const allowBottomPadding = !enableScrollX(); + const container = page.querySelector('#recentlyAddedItems'); cardBuilder.buildCards(items, { itemsContainer: container, shape: getPortraitShape(), @@ -43,8 +58,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' } function loadResume(page, userId, parentId) { - var screenWidth = dom.getWindowSize().innerWidth; - var options = { + let screenWidth = dom.getWindowSize().innerWidth; + const options = { SortBy: 'DatePlayed', SortOrder: 'Descending', IncludeItemTypes: 'Movie', @@ -65,8 +80,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' page.querySelector('#resumableSection').classList.add('hide'); } - var allowBottomPadding = !enableScrollX(); - var container = page.querySelector('#resumableItems'); + const allowBottomPadding = !enableScrollX(); + const container = page.querySelector('#resumableItems'); cardBuilder.buildCards(result.Items, { itemsContainer: container, preferThumb: true, @@ -86,8 +101,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' } function getRecommendationHtml(recommendation) { - var html = ''; - var title = ''; + let html = ''; + let title = ''; switch (recommendation.RecommendationType) { case 'SimilarToRecentlyPlayed': @@ -111,7 +126,7 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' html += '
    '; html += '

    ' + title + '

    '; - var allowBottomPadding = true; + const allowBottomPadding = true; if (enableScrollX()) { html += '
    '; @@ -139,8 +154,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' } function loadSuggestions(page, userId, parentId) { - var screenWidth = dom.getWindowSize().innerWidth; - var url = ApiClient.getUrl('Movies/Recommendations', { + let screenWidth = dom.getWindowSize().innerWidth; + let url = ApiClient.getUrl('Movies/Recommendations', { userId: userId, categoryLimit: 6, ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5, @@ -155,9 +170,9 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' return; } - var html = recommendations.map(getRecommendationHtml).join(''); + const html = recommendations.map(getRecommendationHtml).join(''); page.querySelector('.noItemsMessage').classList.add('hide'); - var recs = page.querySelector('.recommendations'); + let recs = page.querySelector('.recommendations'); recs.innerHTML = html; imageLoader.lazyChildren(recs); @@ -167,7 +182,7 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' } function autoFocus(page) { - require(['autoFocuser'], function (autoFocuser) { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); } @@ -193,17 +208,16 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' } function initSuggestedTab(page, tabContent) { - var containers = tabContent.querySelectorAll('.itemsContainer'); + const containers = tabContent.querySelectorAll('.itemsContainer'); - for (var i = 0, length = containers.length; i < length; i++) { - setScrollClasses(containers[i], enableScrollX()); + for (const container of containers) { + setScrollClasses(container, enableScrollX()); } } function loadSuggestionsTab(view, params, tabContent) { - var parentId = params.topParentId; - var userId = ApiClient.getCurrentUserId(); - console.debug('loadSuggestionsTab'); + const parentId = params.topParentId; + const userId = ApiClient.getCurrentUserId(); loadResume(tabContent, userId, parentId); loadLatest(tabContent, userId, parentId); loadSuggestions(tabContent, userId, parentId); @@ -213,18 +227,15 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' return [{ name: globalize.translate('Movies') }, { - name: globalize.translate('TabSuggestions') + name: globalize.translate('Suggestions') }, { - name: globalize.translate('TabTrailers') + name: globalize.translate('Trailers') }, { - name: globalize.translate('TabFavorites') + name: globalize.translate('Favorites') }, { - name: globalize.translate('TabCollections') + name: globalize.translate('Collections') }, { - name: globalize.translate('TabGenres') - }, { - name: globalize.translate('ButtonSearch'), - cssClass: 'searchTabButton' + name: globalize.translate('Genres') }]; } @@ -247,13 +258,13 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' } } - return function (view, params) { + export default function (view, params) { function onBeforeTabChange(e) { preLoadTab(view, parseInt(e.detail.selectedTabIndex)); } function onTabChange(e) { - var newIndex = parseInt(e.detail.selectedTabIndex); + const newIndex = parseInt(e.detail.selectedTabIndex); loadTab(view, newIndex); } @@ -265,52 +276,50 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange); } - function getTabController(page, index, callback) { - var depends = []; + const getTabController = (page, index, callback) => { + let depends = ''; switch (index) { case 0: - depends.push('controllers/movies/movies'); + depends = 'controllers/movies/movies'; break; case 1: + depends = 'controllers/movies/moviesrecommended.js'; break; case 2: - depends.push('controllers/movies/movietrailers'); + depends = 'controllers/movies/movietrailers'; break; case 3: - depends.push('controllers/movies/movies'); + depends = 'controllers/movies/movies'; break; case 4: - depends.push('controllers/movies/moviecollections'); + depends = 'controllers/movies/moviecollections'; break; case 5: - depends.push('controllers/movies/moviegenres'); + depends = 'controllers/movies/moviegenres'; break; - - case 6: - depends.push('scripts/searchtab'); } - require(depends, function (controllerFactory) { - var tabContent; + import(depends).then(({default: controllerFactory}) => { + let tabContent; if (index === suggestionsTabIndex) { tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); - self.tabContent = tabContent; + this.tabContent = tabContent; } - var controller = tabControllers[index]; + let controller = tabControllers[index]; if (!controller) { tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); if (index === suggestionsTabIndex) { - controller = self; + controller = this; } else if (index === 6) { controller = new controllerFactory(view, tabContent, { collectionType: 'movies', @@ -333,7 +342,7 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' callback(controller); }); - } + }; function preLoadTab(page, index) { getTabController(page, index, function (controller) { @@ -345,12 +354,12 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' function loadTab(page, index) { currentTabIndex = index; - getTabController(page, index, function (controller) { + getTabController(page, index, ((controller) => { if (renderedTabs.indexOf(index) == -1) { renderedTabs.push(index); controller.renderTab(); } - }); + })); } function onPlaybackStop(e, state) { @@ -368,22 +377,21 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' } } - var self = this; - var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)); - var suggestionsTabIndex = 1; + let currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)); + const suggestionsTabIndex = 1; - self.initTab = function () { - var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']"); + this.initTab = function () { + let tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']"); initSuggestedTab(view, tabContent); }; - self.renderTab = function () { - var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']"); + this.renderTab = function () { + let tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']"); loadSuggestionsTab(view, params, tabContent); }; - var tabControllers = []; - var renderedTabs = []; + let tabControllers = []; + let renderedTabs = []; view.addEventListener('viewshow', function (e) { initTabs(); if (!view.getAttribute('data-title')) { @@ -395,23 +403,22 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' libraryMenu.setTitle(item.Name); }); } else { - view.setAttribute('data-title', globalize.translate('TabMovies')); - libraryMenu.setTitle(globalize.translate('TabMovies')); + view.setAttribute('data-title', globalize.translate('Movies')); + libraryMenu.setTitle(globalize.translate('Movies')); } } events.on(playbackManager, 'playbackstop', onPlaybackStop); inputManager.on(window, onInputCommand); }); - view.addEventListener('viewbeforehide', function (e) { + view.addEventListener('viewbeforehide', function () { inputManager.off(window, onInputCommand); }); - view.addEventListener('viewdestroy', function (e) { - tabControllers.forEach(function (t) { - if (t.destroy) { - t.destroy(); - } - }); - }); - }; -}); + for (const tabController of tabControllers) { + if (tabController.destroy) { + tabController.destroy(); + } + } + } + +/* eslint-enable indent */ diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index 84d7c538ee..5f1aa1fe62 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -1,12 +1,20 @@ -define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) { - 'use strict'; +import loading from 'loading'; +import events from 'events'; +import libraryBrowser from 'libraryBrowser'; +import imageLoader from 'imageLoader'; +import AlphaPicker from 'alphaPicker'; +import listView from 'listView'; +import cardBuilder from 'cardBuilder'; +import * as userSettings from 'userSettings'; +import globalize from 'globalize'; +import 'emby-itemscontainer'; - libraryBrowser = libraryBrowser.default || libraryBrowser; +/* eslint-disable indent */ - return function (view, params, tabContent) { + export default function (view, params, tabContent) { function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; + const key = getSavedQueryKey(context); + let pageData = data[key]; if (!pageData) { pageData = data[key] = { @@ -45,11 +53,11 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' return context.savedQueryKey; } - function reloadItems() { + const reloadItems = () => { loading.show(); isLoading = true; - var query = getQuery(tabContent); - ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) { + const query = getQuery(tabContent); + ApiClient.getItems(ApiClient.getCurrentUserId(), query).then((result) => { function onNextPageClick() { if (isLoading) { return; @@ -74,7 +82,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' window.scrollTo(0, 0); updateFilterControls(tabContent); - var pagingHtml = libraryBrowser.getQueryPagingHtml({ + const pagingHtml = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, totalRecordCount: result.TotalRecordCount, @@ -84,8 +92,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' sortButton: false, filterButton: false }); - var html; - var viewStyle = self.getCurrentViewStyle(); + let html; + const viewStyle = this.getCurrentViewStyle(); if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ @@ -141,22 +149,20 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' }); } - var i; - var length; - var elems = tabContent.querySelectorAll('.paging'); + let elems = tabContent.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].innerHTML = pagingHtml; + for (const elem of elems) { + elem.innerHTML = pagingHtml; } elems = tabContent.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onNextPageClick); + for (const elem of elems) { + elem.addEventListener('click', onNextPageClick); } elems = tabContent.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onPreviousPageClick); + for (const elem of elems) { + elem.addEventListener('click', onPreviousPageClick); } if (!result.Items.length) { @@ -168,27 +174,26 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' html += '
    '; } - var itemsContainer = tabContent.querySelector('.itemsContainer'); + const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query); loading.hide(); isLoading = false; }); - } + }; - function updateFilterControls(tabContent) { - var query = getQuery(tabContent); - self.alphaPicker.value(query.NameStartsWithOrGreater); - } + const updateFilterControls = (tabContent) => { + const query = getQuery(tabContent); + this.alphaPicker.value(query.NameStartsWithOrGreater); + }; - var self = this; - var data = {}; - var isLoading = false; + const data = {}; + let isLoading = false; - self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { - var filterDialog = new filterDialogFactory({ + this.showFilterMenu = function () { + import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: 'movies', serverId: ApiClient.serverId() @@ -201,21 +206,21 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' }); }; - self.getCurrentViewStyle = function () { + this.getCurrentViewStyle = function () { return getPageData(tabContent).view; }; - function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + const initPage = (tabContent) => { + const alphaPickerElement = tabContent.querySelector('.alphaPicker'); + const itemsContainer = tabContent.querySelector('.itemsContainer'); alphaPickerElement.addEventListener('alphavaluechanged', function (e) { - var newValue = e.detail.value; - var query = getQuery(tabContent); + const newValue = e.detail.value; + const query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; query.StartIndex = 0; reloadItems(); }); - self.alphaPicker = new AlphaPicker.default({ + this.alphaPicker = new AlphaPicker({ element: alphaPickerElement, valueChangeEvent: 'click' }); @@ -225,7 +230,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' itemsContainer.classList.add('padded-right-withalphapicker'); tabContent.querySelector('.btnFilter').addEventListener('click', function () { - self.showFilterMenu(); + this.showFilterMenu(); }); tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ @@ -259,15 +264,16 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' button: e.target }); }); - } + }; initPage(tabContent); - self.renderTab = function () { + this.renderTab = function () { reloadItems(); updateFilterControls(tabContent); }; - self.destroy = function () {}; - }; -}); + this.destroy = function () {}; + } + +/* eslint-enable indent */ diff --git a/src/music.html b/src/controllers/music/music.html similarity index 89% rename from src/music.html rename to src/controllers/music/music.html index 1e22ae9f3a..84d324857d 100644 --- a/src/music.html +++ b/src/controllers/music/music.html @@ -38,10 +38,10 @@
    - + - - + +
    @@ -57,7 +57,7 @@
    - +
    @@ -73,7 +73,7 @@
    - +
    @@ -92,8 +92,8 @@
    - - + +
    diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index 7d03c91073..7ea8fa254a 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -69,8 +69,8 @@ import 'emby-itemscontainer'; return savedQueryKey; } - function onViewStyleChange() { - const viewStyle = self.getCurrentViewStyle(); + const onViewStyleChange = () => { + const viewStyle = this.getCurrentViewStyle(); const itemsContainer = tabContent.querySelector('.itemsContainer'); if (viewStyle == 'List') { @@ -82,13 +82,13 @@ import 'emby-itemscontainer'; } itemsContainer.innerHTML = ''; - } + }; - function reloadItems(page) { + const reloadItems = (page) => { loading.show(); isLoading = true; const query = getQuery(); - ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) { + ApiClient.getItems(ApiClient.getCurrentUserId(), query).then((result) => { function onNextPageClick() { if (isLoading) { return; @@ -124,7 +124,7 @@ import 'emby-itemscontainer'; sortButton: false, filterButton: false }); - const viewStyle = self.getCurrentViewStyle(); + const viewStyle = this.getCurrentViewStyle(); if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, @@ -182,19 +182,18 @@ import 'emby-itemscontainer'; autoFocuser.autoFocus(tabContent); }); }); - } + }; - function updateFilterControls(tabContent) { + const updateFilterControls = (tabContent) => { const query = getQuery(); - self.alphaPicker.value(query.NameStartsWithOrGreater); - } + this.alphaPicker.value(query.NameStartsWithOrGreater); + }; let savedQueryKey; let pageData; - const self = this; let isLoading = false; - self.showFilterMenu = function () { + this.showFilterMenu = function () { import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { const filterDialog = new filterDialogFactory({ query: getQuery(), @@ -209,11 +208,11 @@ import 'emby-itemscontainer'; }); }; - self.getCurrentViewStyle = function () { + this.getCurrentViewStyle = function () { return getPageData().view; }; - function initPage(tabContent) { + const initPage = (tabContent) => { const alphaPickerElement = tabContent.querySelector('.alphaPicker'); const itemsContainer = tabContent.querySelector('.itemsContainer'); @@ -224,7 +223,7 @@ import 'emby-itemscontainer'; query.StartIndex = 0; reloadItems(tabContent); }); - self.alphaPicker = new AlphaPicker({ + this.alphaPicker = new AlphaPicker({ element: alphaPickerElement, valueChangeEvent: 'click' }); @@ -233,10 +232,10 @@ import 'emby-itemscontainer'; alphaPickerElement.classList.add('alphaPicker-fixed-right'); itemsContainer.classList.add('padded-right-withalphapicker'); - tabContent.querySelector('.btnFilter').addEventListener('click', function () { - self.showFilterMenu(); + tabContent.querySelector('.btnFilter').addEventListener('click', () => { + this.showFilterMenu(); }); - tabContent.querySelector('.btnSort').addEventListener('click', function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', (e) => { libraryBrowser.showSortMenu({ items: [{ name: globalize.translate('OptionNameSort'), @@ -269,8 +268,8 @@ import 'emby-itemscontainer'; }); }); const btnSelectView = tabContent.querySelector('.btnSelectView'); - btnSelectView.addEventListener('click', function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); + btnSelectView.addEventListener('click', (e) => { + libraryBrowser.showLayoutMenu(e.target, this.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); }); btnSelectView.addEventListener('layoutchange', function (e) { const viewStyle = e.detail.viewStyle; @@ -282,17 +281,17 @@ import 'emby-itemscontainer'; }); tabContent.querySelector('.btnPlayAll').addEventListener('click', playAll); tabContent.querySelector('.btnShuffle').addEventListener('click', shuffle); - } + }; initPage(tabContent); onViewStyleChange(); - self.renderTab = function () { + this.renderTab = function () { reloadItems(tabContent); updateFilterControls(tabContent); }; - self.destroy = function () {}; + this.destroy = function () {}; } /* eslint-enable indent */ diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index 23e0bbd459..32e0a22a07 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -45,16 +45,16 @@ import 'emby-itemscontainer'; return getPageData(context).query; } - function getSavedQueryKey(context) { + const getSavedQueryKey = (context) => { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey(self.mode); + context.savedQueryKey = libraryBrowser.getSavedQueryKey(this.mode); } return context.savedQueryKey; - } + }; - function onViewStyleChange() { - const viewStyle = self.getCurrentViewStyle(); + const onViewStyleChange = () => { + const viewStyle = this.getCurrentViewStyle(); const itemsContainer = tabContent.querySelector('.itemsContainer'); if (viewStyle == 'List') { @@ -66,16 +66,16 @@ import 'emby-itemscontainer'; } itemsContainer.innerHTML = ''; - } + }; - function reloadItems(page) { + const reloadItems = (page) => { loading.show(); isLoading = true; const query = getQuery(page); - const promise = self.mode == 'albumartists' ? + const promise = this.mode == 'albumartists' ? ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) : ApiClient.getArtists(ApiClient.getCurrentUserId(), query); - promise.then(function (result) { + promise.then((result) => { function onNextPageClick() { if (isLoading) { return; @@ -111,7 +111,7 @@ import 'emby-itemscontainer'; sortButton: false, filterButton: false }); - const viewStyle = self.getCurrentViewStyle(); + const viewStyle = this.getCurrentViewStyle(); if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, @@ -165,22 +165,21 @@ import 'emby-itemscontainer'; autoFocuser.autoFocus(tabContent); }); }); - } + }; - function updateFilterControls(tabContent) { + const updateFilterControls = (tabContent) => { const query = getQuery(tabContent); - self.alphaPicker.value(query.NameStartsWithOrGreater); - } + this.alphaPicker.value(query.NameStartsWithOrGreater); + }; - const self = this; const data = {}; let isLoading = false; - self.showFilterMenu = function () { + this.showFilterMenu = function () { import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: self.mode, + mode: this.mode, serverId: ApiClient.serverId() }); events.on(filterDialog, 'filterchange', function () { @@ -191,11 +190,11 @@ import 'emby-itemscontainer'; }); }; - self.getCurrentViewStyle = function () { + this.getCurrentViewStyle = function () { return getPageData(tabContent).view; }; - function initPage(tabContent) { + const initPage = (tabContent) => { const alphaPickerElement = tabContent.querySelector('.alphaPicker'); const itemsContainer = tabContent.querySelector('.itemsContainer'); @@ -206,7 +205,7 @@ import 'emby-itemscontainer'; query.StartIndex = 0; reloadItems(tabContent); }); - self.alphaPicker = new AlphaPicker({ + this.alphaPicker = new AlphaPicker({ element: alphaPickerElement, valueChangeEvent: 'click' }); @@ -215,12 +214,12 @@ import 'emby-itemscontainer'; alphaPickerElement.classList.add('alphaPicker-fixed-right'); itemsContainer.classList.add('padded-right-withalphapicker'); - tabContent.querySelector('.btnFilter').addEventListener('click', function () { - self.showFilterMenu(); + tabContent.querySelector('.btnFilter').addEventListener('click', () => { + this.showFilterMenu(); }); const btnSelectView = tabContent.querySelector('.btnSelectView'); btnSelectView.addEventListener('click', function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); + libraryBrowser.showLayoutMenu(e.target, this.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); }); btnSelectView.addEventListener('layoutchange', function (e) { const viewStyle = e.detail.viewStyle; @@ -230,17 +229,17 @@ import 'emby-itemscontainer'; onViewStyleChange(); reloadItems(tabContent); }); - } + }; initPage(tabContent); onViewStyleChange(); - self.renderTab = function () { + this.renderTab = function () { reloadItems(tabContent); updateFilterControls(tabContent); }; - self.destroy = function () {}; + this.destroy = function () {}; } /* eslint-enable indent */ diff --git a/src/controllers/music/musicgenres.js b/src/controllers/music/musicgenres.js index 29e0d888e4..2cd9e2114b 100644 --- a/src/controllers/music/musicgenres.js +++ b/src/controllers/music/musicgenres.js @@ -42,11 +42,11 @@ import loading from 'loading'; return ApiClient.getGenres(ApiClient.getCurrentUserId(), query); } - function reloadItems(context, promise) { + const reloadItems = (context, promise) => { const query = getQuery(); - promise.then(function (result) { + promise.then((result) => { let html = ''; - const viewStyle = self.getCurrentViewStyle(); + const viewStyle = this.getCurrentViewStyle(); if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ @@ -96,38 +96,37 @@ import loading from 'loading'; autoFocuser.autoFocus(context); }); }); - } + }; function fullyReload() { - self.preRender(); - self.renderTab(); + this.preRender(); + this.renderTab(); } - const self = this; const data = {}; - self.getViewStyles = function () { + this.getViewStyles = function () { return 'Poster,PosterCard,Thumb,ThumbCard'.split(','); }; - self.getCurrentViewStyle = function () { + this.getCurrentViewStyle = function () { return getPageData().view; }; - self.setCurrentViewStyle = function (viewStyle) { + this.setCurrentViewStyle = function (viewStyle) { getPageData().view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); fullyReload(); }; - self.enableViewSelection = true; + this.enableViewSelection = true; let promise; - self.preRender = function () { + this.preRender = function () { promise = getPromise(); }; - self.renderTab = function () { + this.renderTab = function () { reloadItems(tabContent, promise); }; } diff --git a/src/controllers/music/musicplaylists.js b/src/controllers/music/musicplaylists.js index befeafcf4c..67e6a959eb 100644 --- a/src/controllers/music/musicplaylists.js +++ b/src/controllers/music/musicplaylists.js @@ -69,20 +69,19 @@ import loading from 'loading'; }); } - const self = this; const data = {}; - self.getCurrentViewStyle = function () { + this.getCurrentViewStyle = function () { return getPageData().view; }; let promise; - self.preRender = function () { + this.preRender = function () { promise = getPromise(); }; - self.renderTab = function () { + this.renderTab = function () { reloadItems(tabContent, promise); }; } diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index db7dac9547..a93bfea4e3 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -104,7 +104,6 @@ import 'flexStyles'; } var itemsContainer = elem.querySelector('.itemsContainer'); - itemsContainer.innerHTML = cardBuilder.getCardsHtml({ items: result.Items, showUnplayedIndicator: false, @@ -178,22 +177,19 @@ import 'flexStyles'; function getTabs() { return [{ - name: globalize.translate('TabSuggestions') + name: globalize.translate('Suggestions') }, { - name: globalize.translate('TabAlbums') + name: globalize.translate('Albums') }, { - name: globalize.translate('TabAlbumArtists') + name: globalize.translate('HeaderAlbumArtists') }, { - name: globalize.translate('TabArtists') + name: globalize.translate('Artists') }, { - name: globalize.translate('TabPlaylists') + name: globalize.translate('Playlists') }, { - name: globalize.translate('TabSongs') + name: globalize.translate('Songs') }, { - name: globalize.translate('TabGenres') - }, { - name: globalize.translate('ButtonSearch'), - cssClass: 'searchTabButton' + name: globalize.translate('Genres') }]; } @@ -267,7 +263,7 @@ import 'flexStyles'; mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange); } - function getTabController(page, index, callback) { + const getTabController = (page, index, callback) => { let depends; switch (index) { @@ -295,10 +291,6 @@ import 'flexStyles'; case 6: depends = 'controllers/music/musicgenres'; break; - - case 7: - depends = 'scripts/searchtab'; - break; } import(depends).then(({default: controllerFactory}) => { @@ -306,7 +298,7 @@ import 'flexStyles'; if (index == 0) { tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); - self.tabContent = tabContent; + this.tabContent = tabContent; } let controller = tabControllers[index]; @@ -315,7 +307,7 @@ import 'flexStyles'; tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); if (index === 0) { - controller = self; + controller = this; } else if (index === 7) { controller = new controllerFactory(view, tabContent, { collectionType: 'music', @@ -339,7 +331,7 @@ import 'flexStyles'; callback(controller); }); - } + }; function preLoadTab(page, index) { getTabController(page, index, function (controller) { @@ -367,10 +359,9 @@ import 'flexStyles'; } } - var self = this; - var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)); + let currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)); - self.initTab = function () { + this.initTab = function () { const tabContent = view.querySelector(".pageTabContent[data-index='0']"); const containers = tabContent.querySelectorAll('.itemsContainer'); @@ -379,7 +370,7 @@ import 'flexStyles'; } }; - self.renderTab = function () { + this.renderTab = function () { reload(); }; diff --git a/src/controllers/playback/queue/index.html b/src/controllers/playback/queue/index.html index 592807737f..c881f7b22c 100644 --- a/src/controllers/playback/queue/index.html +++ b/src/controllers/playback/queue/index.html @@ -30,7 +30,7 @@
    - @@ -59,7 +59,7 @@ - @@ -71,7 +71,7 @@ - @@ -81,11 +81,11 @@ - - @@ -99,7 +99,7 @@
    -
    @@ -120,7 +120,7 @@ -

    - - - -
    diff --git a/src/controllers/playback/video/index.html b/src/controllers/playback/video/index.html index cf3d0beff8..77274230e4 100644 --- a/src/controllers/playback/video/index.html +++ b/src/controllers/playback/video/index.html @@ -1,5 +1,4 @@
    -
    diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index a8bd0e01f3..420268ea75 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -172,9 +172,7 @@ import 'css!assets/css/videoosd'; } setTitle(displayItem, parentName); - let titleElement; - const osdTitle = view.querySelector('.osdTitle'); - titleElement = osdTitle; + const titleElement = view.querySelector('.osdTitle'); let displayName = itemHelper.getDisplayName(displayItem, { includeParentInfo: displayItem.Type !== 'Program', includeIndexNumber: displayItem.Type !== 'Program' @@ -769,7 +767,7 @@ import 'css!assets/css/videoosd'; if (isPaused) { btnPlayPauseIcon.classList.add('play_arrow'); - btnPlayPause.setAttribute('title', globalize.translate('ButtonPlay') + ' (k)'); + btnPlayPause.setAttribute('title', globalize.translate('Play') + ' (k)'); } else { btnPlayPauseIcon.classList.add('pause'); btnPlayPause.setAttribute('title', globalize.translate('ButtonPause') + ' (k)'); @@ -1245,6 +1243,12 @@ import 'css!assets/css/videoosd'; } break; } + case '>': + playbackManager.increasePlaybackRate(currentPlayer); + break; + case '<': + playbackManager.decreasePlaybackRate(currentPlayer); + break; } } @@ -1619,7 +1623,7 @@ import 'css!assets/css/videoosd'; const item = currentItem; if (item && item.Chapters && item.Chapters.length && item.Chapters[0].ImageTag) { - let html = getChapterBubbleHtml(connectionManager.getApiClient(item.ServerId), item, item.Chapters, ticks); + const html = getChapterBubbleHtml(connectionManager.getApiClient(item.ServerId), item, item.Chapters, ticks); if (html) { return html; diff --git a/src/search.html b/src/controllers/search.html similarity index 70% rename from src/search.html rename to src/controllers/search.html index acf65e7317..b0277aa7e0 100644 --- a/src/search.html +++ b/src/controllers/search.html @@ -1,4 +1,4 @@ -
    +
    diff --git a/src/controllers/session/addServer/index.html b/src/controllers/session/addServer/index.html index d25a8eef98..31dd66b33c 100644 --- a/src/controllers/session/addServer/index.html +++ b/src/controllers/session/addServer/index.html @@ -8,7 +8,7 @@

    - - + +
    @@ -26,12 +26,12 @@
    -

    ${HeaderNextUp}

    +

    ${NextUp}

    - +
    @@ -60,8 +60,8 @@
    - - + +
    diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index 4aab69e978..c58a2faad3 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -17,22 +17,19 @@ import 'emby-button'; function getTabs() { return [{ - name: globalize.translate('TabShows') + name: globalize.translate('Shows') }, { - name: globalize.translate('TabSuggestions') + name: globalize.translate('Suggestions') }, { name: globalize.translate('TabLatest') }, { name: globalize.translate('TabUpcoming') }, { - name: globalize.translate('TabGenres') + name: globalize.translate('Genres') }, { name: globalize.translate('TabNetworks') }, { - name: globalize.translate('TabEpisodes') - }, { - name: globalize.translate('ButtonSearch'), - cssClass: 'searchTabButton' + name: globalize.translate('Episodes') }]; } @@ -217,10 +214,6 @@ import 'emby-button'; case 6: depends = 'controllers/shows/episodes'; break; - - case 7: - depends = 'scripts/searchtab'; - break; } import(depends).then(({default: controllerFactory}) => { @@ -325,8 +318,8 @@ import 'emby-button'; libraryMenu.setTitle(item.Name); }); } else { - view.setAttribute('data-title', globalize.translate('TabShows')); - libraryMenu.setTitle(globalize.translate('TabShows')); + view.setAttribute('data-title', globalize.translate('Shows')); + libraryMenu.setTitle(globalize.translate('Shows')); } } diff --git a/src/controllers/user/display/index.html b/src/controllers/user/display/index.html index bee49754af..5482b62fe8 100644 --- a/src/controllers/user/display/index.html +++ b/src/controllers/user/display/index.html @@ -1,4 +1,4 @@ -
    +
    diff --git a/src/controllers/user/home/index.html b/src/controllers/user/home/index.html index 79c5ccc4bd..f98f373cb0 100644 --- a/src/controllers/user/home/index.html +++ b/src/controllers/user/home/index.html @@ -1,4 +1,4 @@ -
    +
    diff --git a/src/controllers/user/menu/index.html b/src/controllers/user/menu/index.html index 2c3ca0edd9..4d91f1206f 100644 --- a/src/controllers/user/menu/index.html +++ b/src/controllers/user/menu/index.html @@ -16,7 +16,7 @@
    -
    ${HeaderDisplay}
    +
    ${Display}
    @@ -25,7 +25,7 @@
    -
    ${HeaderHome}
    +
    ${Home}
    diff --git a/src/controllers/user/profile/index.html b/src/controllers/user/profile/index.html index 3765ac5e75..52b58bd264 100644 --- a/src/controllers/user/profile/index.html +++ b/src/controllers/user/profile/index.html @@ -12,7 +12,7 @@ ${ButtonAddImage}
    @@ -32,7 +32,7 @@
    +

    @@ -12,10 +12,10 @@
    diff --git a/src/controllers/wizard/remote/index.html b/src/controllers/wizard/remote/index.html index 0718c2dc37..0334f584c5 100644 --- a/src/controllers/wizard/remote/index.html +++ b/src/controllers/wizard/remote/index.html @@ -22,10 +22,10 @@
    diff --git a/src/controllers/wizard/remote/index.js b/src/controllers/wizard/remote/index.js index 3c482607de..74c795658d 100644 --- a/src/controllers/wizard/remote/index.js +++ b/src/controllers/wizard/remote/index.js @@ -11,7 +11,7 @@ function save(page) { config.EnableAutomaticPortMapping = page.querySelector('#chkEnableUpnp').checked; apiClient.ajax({ type: 'POST', - data: config, + data: JSON.stringify(config), url: apiClient.getUrl('Startup/RemoteAccess') }).then(function () { loading.hide(); diff --git a/src/controllers/wizard/settings/index.html b/src/controllers/wizard/settings/index.html index d4f537cf98..d1f557d8f1 100644 --- a/src/controllers/wizard/settings/index.html +++ b/src/controllers/wizard/settings/index.html @@ -17,10 +17,10 @@
    diff --git a/src/controllers/wizard/settings/index.js b/src/controllers/wizard/settings/index.js index a1c3c11267..2eaef4fab6 100644 --- a/src/controllers/wizard/settings/index.js +++ b/src/controllers/wizard/settings/index.js @@ -11,7 +11,7 @@ function save(page) { config.MetadataCountryCode = page.querySelector('#selectCountry').value; apiClient.ajax({ type: 'POST', - data: config, + data: JSON.stringify(config), url: apiClient.getUrl('Startup/Configuration') }).then(function () { loading.hide(); diff --git a/src/controllers/wizard/start/index.html b/src/controllers/wizard/start/index.html index 05e282bee3..5306d2ca73 100644 --- a/src/controllers/wizard/start/index.html +++ b/src/controllers/wizard/start/index.html @@ -19,7 +19,7 @@
    diff --git a/src/controllers/wizard/start/index.js b/src/controllers/wizard/start/index.js index cec93446db..8c147fc75e 100644 --- a/src/controllers/wizard/start/index.js +++ b/src/controllers/wizard/start/index.js @@ -17,7 +17,7 @@ function save(page) { config.UICulture = $('#selectLocalizationLanguage', page).val(); apiClient.ajax({ type: 'POST', - data: config, + data: JSON.stringify(config), url: apiClient.getUrl('Startup/Configuration') }).then(function () { Dashboard.navigate('wizarduser.html'); diff --git a/src/controllers/wizard/user/index.html b/src/controllers/wizard/user/index.html index 3ce0b3ba74..24429d043a 100644 --- a/src/controllers/wizard/user/index.html +++ b/src/controllers/wizard/user/index.html @@ -23,10 +23,10 @@
    diff --git a/src/controllers/wizard/user/index.js b/src/controllers/wizard/user/index.js index 855086a3a4..fc9a27855f 100644 --- a/src/controllers/wizard/user/index.js +++ b/src/controllers/wizard/user/index.js @@ -23,10 +23,10 @@ function submit(form) { const apiClient = getApiClient(); apiClient.ajax({ type: 'POST', - data: { + data: JSON.stringify({ Name: form.querySelector('#txtUsername').value, Password: form.querySelector('#txtManualPassword').value - }, + }), url: apiClient.getUrl('Startup/User') }).then(onUpdateUserComplete); } diff --git a/src/elements/emby-checkbox/emby-checkbox.js b/src/elements/emby-checkbox/emby-checkbox.js index d3f24d6f82..d44c58ed48 100644 --- a/src/elements/emby-checkbox/emby-checkbox.js +++ b/src/elements/emby-checkbox/emby-checkbox.js @@ -5,12 +5,12 @@ import 'webcomponents'; /* eslint-disable indent */ - let EmbyCheckboxPrototype = Object.create(HTMLInputElement.prototype); + const EmbyCheckboxPrototype = Object.create(HTMLInputElement.prototype); function onKeyDown(e) { // Don't submit form on enter // Real (non-emulator) Tizen does nothing on Space - if (e.keyCode === 13 || e.keyCode === 32) { + if (e.keyCode === 13 || (e.keyCode === 32 && browser.tizen)) { e.preventDefault(); this.checked = !this.checked; @@ -26,7 +26,7 @@ import 'webcomponents'; const enableRefreshHack = browser.tizen || browser.orsay || browser.operaTv || browser.web0s ? true : false; function forceRefresh(loading) { - let elem = this.parentNode; + const elem = this.parentNode; elem.style.webkitAnimationName = 'repaintChrome'; elem.style.webkitAnimationDelay = (loading === true ? '500ms' : ''); diff --git a/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js b/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js index 67eacf3db9..51f3fc5be9 100644 --- a/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js +++ b/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js @@ -40,7 +40,7 @@ import 'webcomponents'; } } - let EmbyItemRefreshIndicatorPrototype = Object.create(EmbyProgressRing); + const EmbyItemRefreshIndicatorPrototype = Object.create(EmbyProgressRing); EmbyItemRefreshIndicatorPrototype.createdCallback = function () { // base method diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js index 691552c074..ef30d1e663 100644 --- a/src/elements/emby-itemscontainer/emby-itemscontainer.js +++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js @@ -18,7 +18,7 @@ import 'webcomponents'; function onClick(e) { const itemsContainer = this; - let multiSelect = itemsContainer.multiSelect; + const multiSelect = itemsContainer.multiSelect; if (multiSelect) { if (multiSelect.onContainerClick.call(itemsContainer, e) === false) { @@ -164,7 +164,7 @@ import 'webcomponents'; } function getEventsToMonitor(itemsContainer) { - let monitor = itemsContainer.getAttribute('data-monitor'); + const monitor = itemsContainer.getAttribute('data-monitor'); if (monitor) { return monitor.split(','); } @@ -356,7 +356,7 @@ import 'webcomponents'; ItemsContainerPrototype.resume = function (options) { this.paused = false; - let refreshIntervalEndTime = this.refreshIntervalEndTime; + const refreshIntervalEndTime = this.refreshIntervalEndTime; if (refreshIntervalEndTime) { const remainingMs = refreshIntervalEndTime - new Date().getTime(); if (remainingMs > 0 && !this.needsRefresh) { @@ -395,7 +395,7 @@ import 'webcomponents'; return; } - let timeout = this.refreshTimeout; + const timeout = this.refreshTimeout; if (timeout) { clearTimeout(timeout); } @@ -434,7 +434,7 @@ import 'webcomponents'; function onDataFetched(result) { const items = result.Items || result; - let parentContainer = this.parentContainer; + const parentContainer = this.parentContainer; if (parentContainer) { if (items.length) { parentContainer.classList.remove('hide'); diff --git a/src/elements/emby-playstatebutton/emby-playstatebutton.js b/src/elements/emby-playstatebutton/emby-playstatebutton.js index 7b5c344095..322b7b3722 100644 --- a/src/elements/emby-playstatebutton/emby-playstatebutton.js +++ b/src/elements/emby-playstatebutton/emby-playstatebutton.js @@ -75,7 +75,7 @@ import EmbyButtonPrototype from 'emby-button'; button.title = globalize.translate('Played'); } - let text = button.querySelector('.button-text'); + const text = button.querySelector('.button-text'); if (text) { text.innerHTML = button.title; } diff --git a/src/elements/emby-progressbar/emby-progressbar.js b/src/elements/emby-progressbar/emby-progressbar.js index 54fcb1999e..e232bbcde0 100644 --- a/src/elements/emby-progressbar/emby-progressbar.js +++ b/src/elements/emby-progressbar/emby-progressbar.js @@ -1,6 +1,6 @@ /* eslint-disable indent */ - let ProgressBarPrototype = Object.create(HTMLDivElement.prototype); + const ProgressBarPrototype = Object.create(HTMLDivElement.prototype); function onAutoTimeProgress() { const start = parseInt(this.getAttribute('data-starttime')); diff --git a/src/elements/emby-progressring/emby-progressring.js b/src/elements/emby-progressring/emby-progressring.js index 10db8b9a27..929b80a573 100644 --- a/src/elements/emby-progressring/emby-progressring.js +++ b/src/elements/emby-progressring/emby-progressring.js @@ -3,7 +3,7 @@ import 'webcomponents'; /* eslint-disable indent */ - let EmbyProgressRing = Object.create(HTMLDivElement.prototype); + const EmbyProgressRing = Object.create(HTMLDivElement.prototype); EmbyProgressRing.createdCallback = function () { this.classList.add('progressring'); @@ -79,7 +79,7 @@ import 'webcomponents'; }; EmbyProgressRing.detachedCallback = function () { - let observer = this.observer; + const observer = this.observer; if (observer) { // later, you can stop observing diff --git a/src/elements/emby-radio/emby-radio.js b/src/elements/emby-radio/emby-radio.js index b31d436444..7c468a84a6 100644 --- a/src/elements/emby-radio/emby-radio.js +++ b/src/elements/emby-radio/emby-radio.js @@ -1,15 +1,16 @@ import layoutManager from 'layoutManager'; import 'css!./emby-radio'; import 'webcomponents'; +import browser from 'browser'; /* eslint-disable indent */ - let EmbyRadioPrototype = Object.create(HTMLInputElement.prototype); + const EmbyRadioPrototype = Object.create(HTMLInputElement.prototype); function onKeyDown(e) { // Don't submit form on enter // Real (non-emulator) Tizen does nothing on Space - if (e.keyCode === 13 || e.keyCode === 32) { + if (e.keyCode === 13 || (e.keyCode === 32 && browser.tizen)) { e.preventDefault(); if (!this.checked) { @@ -35,7 +36,7 @@ import 'webcomponents'; this.classList.add('mdl-radio__button'); - let labelElement = this.parentNode; + const labelElement = this.parentNode; labelElement.classList.add('mdl-radio'); labelElement.classList.add('mdl-js-radio'); labelElement.classList.add('mdl-js-ripple-effect'); @@ -43,7 +44,7 @@ import 'webcomponents'; labelElement.classList.add('show-focus'); } - let labelTextElement = labelElement.querySelector('span'); + const labelTextElement = labelElement.querySelector('span'); labelTextElement.classList.add('radioButtonLabel'); labelTextElement.classList.add('mdl-radio__label'); diff --git a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js index fcff587392..f7665c0618 100644 --- a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js +++ b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js @@ -118,7 +118,7 @@ const EmbyScrollButtonsPrototype = Object.create(HTMLDivElement.prototype); } function onScrollButtonClick(e) { - let scroller = this.parentNode.nextSibling; + const scroller = this.parentNode.nextSibling; const direction = this.getAttribute('data-direction'); const scrollSize = getScrollSize(scroller); @@ -161,7 +161,7 @@ const EmbyScrollButtonsPrototype = Object.create(HTMLDivElement.prototype); const parent = this.scroller; this.scroller = null; - let scrollHandler = this.scrollHandler; + const scrollHandler = this.scrollHandler; if (parent && scrollHandler) { parent.removeScrollEventListener(scrollHandler, { capture: false, diff --git a/src/elements/emby-scroller/emby-scroller.js b/src/elements/emby-scroller/emby-scroller.js index fb903d839c..d7133e317a 100644 --- a/src/elements/emby-scroller/emby-scroller.js +++ b/src/elements/emby-scroller/emby-scroller.js @@ -9,7 +9,7 @@ import 'css!./emby-scroller'; /* eslint-disable indent */ - let ScrollerPrototype = Object.create(HTMLDivElement.prototype); + const ScrollerPrototype = Object.create(HTMLDivElement.prototype); ScrollerPrototype.createdCallback = function () { this.classList.add('emby-scroller'); diff --git a/src/elements/emby-slider/emby-slider.css b/src/elements/emby-slider/emby-slider.css index 7661895f15..01221b6cae 100644 --- a/src/elements/emby-slider/emby-slider.css +++ b/src/elements/emby-slider/emby-slider.css @@ -230,3 +230,18 @@ margin: 0; padding: 0.5em 0.75em; } + +/* FIXME: 'sliderContainer' is used to wrap slider's pieces */ +.sliderContainer-settings { + margin-bottom: 1.8em; + position: relative; +} + +.sliderContainer-settings .mdl-slider-container { + height: 2.83em; /* similar to emby-input with its 110% font-size */ +} + +.sliderLabel { + display: block; + margin-bottom: 0.25em; +} diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 2439331144..40d2e69bbb 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -8,7 +8,7 @@ import 'emby-input'; /* eslint-disable indent */ - let EmbySliderPrototype = Object.create(HTMLInputElement.prototype); + const EmbySliderPrototype = Object.create(HTMLInputElement.prototype); let supportsValueSetOverride = false; @@ -94,7 +94,7 @@ import 'emby-input'; // Keep only one per slider frame request cancelAnimationFrame(range.updateValuesFrame); range.updateValuesFrame = requestAnimationFrame(function () { - let backgroundLower = range.backgroundLower; + const backgroundLower = range.backgroundLower; if (backgroundLower) { let fraction = (value - range.min) / (range.max - range.min); @@ -150,6 +150,16 @@ import 'emby-input'; this.classList.add('show-focus'); } + const topContainer = dom.parentWithClass(this, 'sliderContainer-settings'); + + if (topContainer && this.getAttribute('label')) { + const label = this.ownerDocument.createElement('label'); + label.innerHTML = this.getAttribute('label'); + label.classList.add('sliderLabel'); + label.htmlFor = this.id; + topContainer.insertBefore(label, topContainer.firstChild); + } + const containerElement = this.parentNode; containerElement.classList.add('mdl-slider-container'); diff --git a/src/elements/emby-tabs/emby-tabs.js b/src/elements/emby-tabs/emby-tabs.js index 320a14e2cb..7e16e31dd4 100644 --- a/src/elements/emby-tabs/emby-tabs.js +++ b/src/elements/emby-tabs/emby-tabs.js @@ -8,11 +8,11 @@ import 'scrollStyles'; /* eslint-disable indent */ - let EmbyTabs = Object.create(HTMLDivElement.prototype); + const EmbyTabs = Object.create(HTMLDivElement.prototype); const buttonClass = 'emby-tab-button'; const activeButtonClass = buttonClass + '-active'; - function setActiveTabButton(tabs, newButton, oldButton, animate) { + function setActiveTabButton(newButton) { newButton.classList.add(activeButtonClass); } @@ -21,7 +21,7 @@ import 'scrollStyles'; } function removeActivePanelClass(tabs, index) { - let tabPanel = getTabPanel(tabs, index); + const tabPanel = getTabPanel(tabs, index); if (tabPanel) { tabPanel.classList.remove('is-active'); } @@ -52,7 +52,7 @@ import 'scrollStyles'; removeActivePanelClass(tabs, previousIndex); } - let newPanel = getTabPanel(tabs, index); + const newPanel = getTabPanel(tabs, index); if (newPanel) { // animate new panel ? @@ -77,7 +77,7 @@ import 'scrollStyles'; const previousIndex = current ? parseInt(current.getAttribute('data-index')) : null; - setActiveTabButton(tabs, tabButton, current, true); + setActiveTabButton(tabButton); const index = parseInt(tabButton.getAttribute('data-index')); @@ -101,6 +101,15 @@ import 'scrollStyles'; } } + function onFocusOut(e) { + const parentContainer = e.target.parentNode; + const previousFocus = parentContainer.querySelector('.lastFocused'); + if (previousFocus) { + previousFocus.classList.remove('lastFocused'); + } + e.target.classList.add('lastFocused'); + } + function initScroller(tabs) { if (tabs.scroller) { return; @@ -146,13 +155,18 @@ import 'scrollStyles'; dom.addEventListener(this, 'click', onClick, { passive: true }); + + dom.addEventListener(this, 'focusout', onFocusOut); }; - EmbyTabs.focus = function () { - const selected = this.querySelector('.' + activeButtonClass); + EmbyTabs.focus = function onFocusIn() { + const selectedTab = this.querySelector('.' + activeButtonClass); + const lastFocused = this.querySelector('.lastFocused'); - if (selected) { - focusManager.focus(selected); + if (lastFocused) { + focusManager.focus(lastFocused); + } else if (selectedTab) { + focusManager.focus(selectedTab); } else { focusManager.autoFocus(this); } @@ -178,7 +192,7 @@ import 'scrollStyles'; const newTabButton = tabButtons[currentIndex]; if (newTabButton) { - setActiveTabButton(this, newTabButton, current, false); + setActiveTabButton(newTabButton); } } @@ -225,8 +239,8 @@ import 'scrollStyles'; } })); - let currentTabButton = tabButtons[current]; - setActiveTabButton(tabs, tabButtons[selected], currentTabButton, false); + const currentTabButton = tabButtons[current]; + setActiveTabButton(tabButtons[selected]); if (current !== selected && currentTabButton) { currentTabButton.classList.remove(activeButtonClass); diff --git a/src/index.html b/src/index.html index a135079a7d..c689a42f30 100644 --- a/src/index.html +++ b/src/index.html @@ -1,13 +1,11 @@ - - @@ -15,10 +13,9 @@ - - + + - @@ -64,7 +61,6 @@ - Jellyfin @@ -141,8 +137,7 @@ } @media screen - and (min-device-width: 992px) - and (-webkit-min-device-pixel-ratio: 1) { + and (min-device-width: 992px) { .splashLogo { background-image: url(assets/img/banner-light.png); } diff --git a/src/legacy/focusPreventScroll.js b/src/legacy/focusPreventScroll.js index 97d6b0b120..93f53dca29 100644 --- a/src/legacy/focusPreventScroll.js +++ b/src/legacy/focusPreventScroll.js @@ -1,4 +1,3 @@ -// TODO: Move to external library (https://github.com/calvellido/focus-options-polyfill) // Polyfill to add support for preventScroll by focus function if (HTMLElement.prototype.nativeFocus === undefined) { diff --git a/src/libraries/navdrawer/navdrawer.js b/src/libraries/navdrawer/navdrawer.js index d9c246b406..965b68aee4 100644 --- a/src/libraries/navdrawer/navdrawer.js +++ b/src/libraries/navdrawer/navdrawer.js @@ -1,352 +1,357 @@ -define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser, dom) { - "use strict"; +/* Cleaning this file properly is not neecessary, since it's an outdated library + * and will be replaced soon by a Vue component. + */ - return function (options) { - function getTouches(e) { - return e.changedTouches || e.targetTouches || e.touches; +import browser from 'browser'; +import dom from 'dom'; +import 'css!./navdrawer'; +import 'scrollStyles'; + +export default function (options) { + function getTouches(e) { + return e.changedTouches || e.targetTouches || e.touches; + } + + function onMenuTouchStart(e) { + options.target.classList.remove('transition'); + var touches = getTouches(e); + var touch = touches[0] || {}; + menuTouchStartX = touch.clientX; + menuTouchStartY = touch.clientY; + menuTouchStartTime = new Date().getTime(); + } + + function setVelocity(deltaX) { + var time = new Date().getTime() - (menuTouchStartTime || 0); + velocity = Math.abs(deltaX) / time; + } + + function onMenuTouchMove(e) { + var isOpen = self.visible; + var touches = getTouches(e); + var touch = touches[0] || {}; + var endX = touch.clientX || 0; + var endY = touch.clientY || 0; + var deltaX = endX - (menuTouchStartX || 0); + var deltaY = endY - (menuTouchStartY || 0); + setVelocity(deltaX); + + if (isOpen && dragMode !== 1 && deltaX > 0) { + dragMode = 2; } - function onMenuTouchStart(e) { - options.target.classList.remove("transition"); - var touches = getTouches(e); - var touch = touches[0] || {}; - menuTouchStartX = touch.clientX; - menuTouchStartY = touch.clientY; - menuTouchStartTime = new Date().getTime(); + if (dragMode === 0 && (!isOpen || Math.abs(deltaX) >= 10) && Math.abs(deltaY) < 5) { + dragMode = 1; + scrollContainer.addEventListener('scroll', disableEvent); + self.showMask(); + } else if (dragMode === 0 && Math.abs(deltaY) >= 5) { + dragMode = 2; } - function setVelocity(deltaX) { - var time = new Date().getTime() - (menuTouchStartTime || 0); - velocity = Math.abs(deltaX) / time; + if (dragMode === 1) { + newPos = currentPos + deltaX; + self.changeMenuPos(); } + } - function onMenuTouchMove(e) { - var isOpen = self.visible; - var touches = getTouches(e); - var touch = touches[0] || {}; - var endX = touch.clientX || 0; - var endY = touch.clientY || 0; - var deltaX = endX - (menuTouchStartX || 0); - var deltaY = endY - (menuTouchStartY || 0); - setVelocity(deltaX); + function onMenuTouchEnd(e) { + options.target.classList.add('transition'); + scrollContainer.removeEventListener('scroll', disableEvent); + dragMode = 0; + var touches = getTouches(e); + var touch = touches[0] || {}; + var endX = touch.clientX || 0; + var endY = touch.clientY || 0; + var deltaX = endX - (menuTouchStartX || 0); + var deltaY = endY - (menuTouchStartY || 0); + currentPos = deltaX; + self.checkMenuState(deltaX, deltaY); + } - if (isOpen && 1 !== dragMode && deltaX > 0) { - dragMode = 2; - } + function onEdgeTouchStart(e) { + if (isPeeking) { + onMenuTouchMove(e); + } else { + if (((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize) { + isPeeking = true; - if (0 === dragMode && (!isOpen || Math.abs(deltaX) >= 10) && Math.abs(deltaY) < 5) { - dragMode = 1; - scrollContainer.addEventListener("scroll", disableEvent); - self.showMask(); - } else if (0 === dragMode && Math.abs(deltaY) >= 5) { - dragMode = 2; - } - - if (1 === dragMode) { - newPos = currentPos + deltaX; - self.changeMenuPos(); - } - } - - function onMenuTouchEnd(e) { - options.target.classList.add("transition"); - scrollContainer.removeEventListener("scroll", disableEvent); - dragMode = 0; - var touches = getTouches(e); - var touch = touches[0] || {}; - var endX = touch.clientX || 0; - var endY = touch.clientY || 0; - var deltaX = endX - (menuTouchStartX || 0); - var deltaY = endY - (menuTouchStartY || 0); - currentPos = deltaX; - self.checkMenuState(deltaX, deltaY); - } - - function onEdgeTouchStart(e) { - if (isPeeking) { - onMenuTouchMove(e); - } else { - if (((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize) { - isPeeking = true; - - if (e.type === "touchstart") { - dom.removeEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); - dom.addEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); - } - - onMenuTouchStart(e); + if (e.type === 'touchstart') { + dom.removeEventListener(edgeContainer, 'touchmove', onEdgeTouchMove, {}); + dom.addEventListener(edgeContainer, 'touchmove', onEdgeTouchMove, {}); } + + onMenuTouchStart(e); } } + } - function onEdgeTouchMove(e) { - e.preventDefault(); - e.stopPropagation(); - onEdgeTouchStart(e); + function onEdgeTouchMove(e) { + e.preventDefault(); + e.stopPropagation(); + onEdgeTouchStart(e); + } + + function onEdgeTouchEnd(e) { + if (isPeeking) { + isPeeking = false; + dom.removeEventListener(edgeContainer, 'touchmove', onEdgeTouchMove, {}); + onMenuTouchEnd(e); } + } - function onEdgeTouchEnd(e) { - if (isPeeking) { - isPeeking = false; - dom.removeEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); - onMenuTouchEnd(e); - } - } + function disableEvent(e) { + e.preventDefault(); + e.stopPropagation(); + } - function disableEvent(e) { - e.preventDefault(); - e.stopPropagation(); - } + function onBackgroundTouchStart(e) { + var touches = getTouches(e); + var touch = touches[0] || {}; + backgroundTouchStartX = touch.clientX; + backgroundTouchStartTime = new Date().getTime(); + } - function onBackgroundTouchStart(e) { - var touches = getTouches(e); - var touch = touches[0] || {}; - backgroundTouchStartX = touch.clientX; - backgroundTouchStartTime = new Date().getTime(); - } + function onBackgroundTouchMove(e) { + var touches = getTouches(e); + var touch = touches[0] || {}; + var endX = touch.clientX || 0; - function onBackgroundTouchMove(e) { - var touches = getTouches(e); - var touch = touches[0] || {}; - var endX = touch.clientX || 0; - - if (endX <= options.width && self.isVisible) { - countStart++; - var deltaX = endX - (backgroundTouchStartX || 0); - - if (countStart == 1) { - startPoint = deltaX; - } - if (deltaX < 0 && dragMode !== 2) { - dragMode = 1; - newPos = deltaX - startPoint + options.width; - self.changeMenuPos(); - var time = new Date().getTime() - (backgroundTouchStartTime || 0); - velocity = Math.abs(deltaX) / time; - } - } - - e.preventDefault(); - e.stopPropagation(); - } - - function onBackgroundTouchEnd(e) { - var touches = getTouches(e); - var touch = touches[0] || {}; - var endX = touch.clientX || 0; + if (endX <= options.width && self.isVisible) { + countStart++; var deltaX = endX - (backgroundTouchStartX || 0); - self.checkMenuState(deltaX); - countStart = 0; - } - function onMaskTransitionEnd() { - var classList = mask.classList; - - if (!classList.contains("backdrop")) { - classList.add("hide"); + if (countStart == 1) { + startPoint = deltaX; + } + if (deltaX < 0 && dragMode !== 2) { + dragMode = 1; + newPos = deltaX - startPoint + options.width; + self.changeMenuPos(); + var time = new Date().getTime() - (backgroundTouchStartTime || 0); + velocity = Math.abs(deltaX) / time; } } - var self; - var defaults; - var mask; - var newPos = 0; - var currentPos = 0; - var startPoint = 0; - var countStart = 0; - var velocity = 0; - options.target.classList.add("transition"); - var dragMode = 0; - var scrollContainer = options.target.querySelector(".mainDrawer-scrollContainer"); - scrollContainer.classList.add("scrollY"); + e.preventDefault(); + e.stopPropagation(); + } - var TouchMenuLA = function () { - self = this; - defaults = { - width: 260, - handleSize: 10, - disableMask: false, - maxMaskOpacity: 0.5 - }; - this.isVisible = false; - this.initialize(); + function onBackgroundTouchEnd(e) { + var touches = getTouches(e); + var touch = touches[0] || {}; + var endX = touch.clientX || 0; + var deltaX = endX - (backgroundTouchStartX || 0); + self.checkMenuState(deltaX); + countStart = 0; + } + + function onMaskTransitionEnd() { + var classList = mask.classList; + + if (!classList.contains('backdrop')) { + classList.add('hide'); + } + } + + var self; + var defaults; + var mask; + var newPos = 0; + var currentPos = 0; + var startPoint = 0; + var countStart = 0; + var velocity = 0; + options.target.classList.add('transition'); + var dragMode = 0; + var scrollContainer = options.target.querySelector('.mainDrawer-scrollContainer'); + scrollContainer.classList.add('scrollY'); + + var TouchMenuLA = function () { + self = this; + defaults = { + width: 260, + handleSize: 10, + disableMask: false, + maxMaskOpacity: 0.5 }; + this.isVisible = false; + this.initialize(); + }; - TouchMenuLA.prototype.initElements = function () { - options.target.classList.add("touch-menu-la"); - options.target.style.width = options.width + "px"; - options.target.style.left = -options.width + "px"; + TouchMenuLA.prototype.initElements = function () { + options.target.classList.add('touch-menu-la'); + options.target.style.width = options.width + 'px'; + options.target.style.left = -options.width + 'px'; - if (!options.disableMask) { - mask = document.createElement("div"); - mask.className = "tmla-mask hide"; - document.body.appendChild(mask); - dom.addEventListener(mask, dom.whichTransitionEvent(), onMaskTransitionEnd, { - passive: true - }); - } - }; - - var menuTouchStartX; - var menuTouchStartY; - var menuTouchStartTime; - var edgeContainer = document.querySelector(".mainDrawerHandle"); - var isPeeking = false; - - TouchMenuLA.prototype.animateToPosition = function (pos) { - requestAnimationFrame(function () { - options.target.style.transform = pos ? "translateX(" + pos + "px)" : "none"; + if (!options.disableMask) { + mask = document.createElement('div'); + mask.className = 'tmla-mask hide'; + document.body.appendChild(mask); + dom.addEventListener(mask, dom.whichTransitionEvent(), onMaskTransitionEnd, { + passive: true }); - }; + } + }; - TouchMenuLA.prototype.changeMenuPos = function () { - if (newPos <= options.width) { - this.animateToPosition(newPos); - } - }; + var menuTouchStartX; + var menuTouchStartY; + var menuTouchStartTime; + var edgeContainer = document.querySelector('.mainDrawerHandle'); + var isPeeking = false; - TouchMenuLA.prototype.clickMaskClose = function () { - mask.addEventListener("click", function () { + TouchMenuLA.prototype.animateToPosition = function (pos) { + requestAnimationFrame(function () { + options.target.style.transform = pos ? 'translateX(' + pos + 'px)' : 'none'; + }); + }; + + TouchMenuLA.prototype.changeMenuPos = function () { + if (newPos <= options.width) { + this.animateToPosition(newPos); + } + }; + + TouchMenuLA.prototype.clickMaskClose = function () { + mask.addEventListener('click', function () { + self.close(); + }); + }; + + TouchMenuLA.prototype.checkMenuState = function (deltaX, deltaY) { + if (velocity >= 0.4) { + if (deltaX >= 0 || Math.abs(deltaY || 0) >= 70) { + self.open(); + } else { self.close(); - }); - }; - - TouchMenuLA.prototype.checkMenuState = function (deltaX, deltaY) { - if (velocity >= 0.4) { - if (deltaX >= 0 || Math.abs(deltaY || 0) >= 70) { - self.open(); - } else { + } + } else { + if (newPos >= 100) { + self.open(); + } else { + if (newPos) { self.close(); } - } else { - if (newPos >= 100) { - self.open(); - } else { - if (newPos) { - self.close(); - } - } } - }; - - TouchMenuLA.prototype.open = function () { - this.animateToPosition(options.width); - currentPos = options.width; - this.isVisible = true; - options.target.classList.add("drawer-open"); - self.showMask(); - self.invoke(options.onChange); - }; - - TouchMenuLA.prototype.close = function () { - this.animateToPosition(0); - currentPos = 0; - self.isVisible = false; - options.target.classList.remove("drawer-open"); - self.hideMask(); - self.invoke(options.onChange); - }; - - TouchMenuLA.prototype.toggle = function () { - if (self.isVisible) { - self.close(); - } else { - self.open(); - } - }; - - var backgroundTouchStartX; - var backgroundTouchStartTime; - - TouchMenuLA.prototype.showMask = function () { - mask.classList.remove("hide"); - mask.classList.add("backdrop"); - }; - - TouchMenuLA.prototype.hideMask = function () { - mask.classList.add("hide"); - mask.classList.remove("backdrop"); - }; - - TouchMenuLA.prototype.invoke = function (fn) { - if (fn) { - fn.apply(self); - } - }; - - var _edgeSwipeEnabled; - - TouchMenuLA.prototype.setEdgeSwipeEnabled = function (enabled) { - if (!options.disableEdgeSwipe) { - if (browser.touch) { - if (enabled) { - if (!_edgeSwipeEnabled) { - _edgeSwipeEnabled = true; - dom.addEventListener(edgeContainer, "touchstart", onEdgeTouchStart, { - passive: true - }); - dom.addEventListener(edgeContainer, "touchend", onEdgeTouchEnd, { - passive: true - }); - dom.addEventListener(edgeContainer, "touchcancel", onEdgeTouchEnd, { - passive: true - }); - } - } else { - if (_edgeSwipeEnabled) { - _edgeSwipeEnabled = false; - dom.removeEventListener(edgeContainer, "touchstart", onEdgeTouchStart, { - passive: true - }); - dom.removeEventListener(edgeContainer, "touchend", onEdgeTouchEnd, { - passive: true - }); - dom.removeEventListener(edgeContainer, "touchcancel", onEdgeTouchEnd, { - passive: true - }); - } - } - } - } - }; - - TouchMenuLA.prototype.initialize = function () { - options = Object.assign(defaults, options || {}); - - if (browser.edge) { - options.disableEdgeSwipe = true; - } - - self.initElements(); - - if (browser.touch) { - dom.addEventListener(options.target, "touchstart", onMenuTouchStart, { - passive: true - }); - dom.addEventListener(options.target, "touchmove", onMenuTouchMove, { - passive: true - }); - dom.addEventListener(options.target, "touchend", onMenuTouchEnd, { - passive: true - }); - dom.addEventListener(options.target, "touchcancel", onMenuTouchEnd, { - passive: true - }); - dom.addEventListener(mask, "touchstart", onBackgroundTouchStart, { - passive: true - }); - dom.addEventListener(mask, "touchmove", onBackgroundTouchMove, {}); - dom.addEventListener(mask, "touchend", onBackgroundTouchEnd, { - passive: true - }); - dom.addEventListener(mask, "touchcancel", onBackgroundTouchEnd, { - passive: true - }); - } - - self.clickMaskClose(); - }; - - return new TouchMenuLA(); + } }; -}); + + TouchMenuLA.prototype.open = function () { + this.animateToPosition(options.width); + currentPos = options.width; + this.isVisible = true; + options.target.classList.add('drawer-open'); + self.showMask(); + self.invoke(options.onChange); + }; + + TouchMenuLA.prototype.close = function () { + this.animateToPosition(0); + currentPos = 0; + self.isVisible = false; + options.target.classList.remove('drawer-open'); + self.hideMask(); + self.invoke(options.onChange); + }; + + TouchMenuLA.prototype.toggle = function () { + if (self.isVisible) { + self.close(); + } else { + self.open(); + } + }; + + var backgroundTouchStartX; + var backgroundTouchStartTime; + + TouchMenuLA.prototype.showMask = function () { + mask.classList.remove('hide'); + mask.classList.add('backdrop'); + }; + + TouchMenuLA.prototype.hideMask = function () { + mask.classList.add('hide'); + mask.classList.remove('backdrop'); + }; + + TouchMenuLA.prototype.invoke = function (fn) { + if (fn) { + fn.apply(self); + } + }; + + var _edgeSwipeEnabled; + + TouchMenuLA.prototype.setEdgeSwipeEnabled = function (enabled) { + if (!options.disableEdgeSwipe) { + if (browser.touch) { + if (enabled) { + if (!_edgeSwipeEnabled) { + _edgeSwipeEnabled = true; + dom.addEventListener(edgeContainer, 'touchstart', onEdgeTouchStart, { + passive: true + }); + dom.addEventListener(edgeContainer, 'touchend', onEdgeTouchEnd, { + passive: true + }); + dom.addEventListener(edgeContainer, 'touchcancel', onEdgeTouchEnd, { + passive: true + }); + } + } else { + if (_edgeSwipeEnabled) { + _edgeSwipeEnabled = false; + dom.removeEventListener(edgeContainer, 'touchstart', onEdgeTouchStart, { + passive: true + }); + dom.removeEventListener(edgeContainer, 'touchend', onEdgeTouchEnd, { + passive: true + }); + dom.removeEventListener(edgeContainer, 'touchcancel', onEdgeTouchEnd, { + passive: true + }); + } + } + } + } + }; + + TouchMenuLA.prototype.initialize = function () { + options = Object.assign(defaults, options || {}); + + if (browser.edge) { + options.disableEdgeSwipe = true; + } + + self.initElements(); + + if (browser.touch) { + dom.addEventListener(options.target, 'touchstart', onMenuTouchStart, { + passive: true + }); + dom.addEventListener(options.target, 'touchmove', onMenuTouchMove, { + passive: true + }); + dom.addEventListener(options.target, 'touchend', onMenuTouchEnd, { + passive: true + }); + dom.addEventListener(options.target, 'touchcancel', onMenuTouchEnd, { + passive: true + }); + dom.addEventListener(mask, 'touchstart', onBackgroundTouchStart, { + passive: true + }); + dom.addEventListener(mask, 'touchmove', onBackgroundTouchMove, {}); + dom.addEventListener(mask, 'touchend', onBackgroundTouchEnd, { + passive: true + }); + dom.addEventListener(mask, 'touchcancel', onBackgroundTouchEnd, { + passive: true + }); + } + + self.clickMaskClose(); + }; + + return new TouchMenuLA(); +} diff --git a/src/libraries/screensavermanager.js b/src/libraries/screensavermanager.js index b9d7082850..5c24ec63d0 100644 --- a/src/libraries/screensavermanager.js +++ b/src/libraries/screensavermanager.js @@ -1,132 +1,128 @@ -define(["events", "playbackManager", "pluginManager", "inputManager", "connectionManager", "userSettings"], function (events, playbackManager, pluginManager, inputManager, connectionManager, userSettings) { - "use strict"; +import events from 'events'; +import playbackManager from 'playbackManager'; +import pluginManager from 'pluginManager'; +import inputManager from 'inputManager'; +import connectionManager from 'connectionManager'; +import * as userSettings from 'userSettings'; - function getMinIdleTime() { - // Returns the minimum amount of idle time required before the screen saver can be displayed - //time units used Millisecond - return 180000; +function getMinIdleTime() { + // Returns the minimum amount of idle time required before the screen saver can be displayed + //time units used Millisecond + return 180000; +} + +let lastFunctionalEvent = 0; + +function getFunctionalEventIdleTime() { + return new Date().getTime() - lastFunctionalEvent; +} + +events.on(playbackManager, 'playbackstop', function (e, stopInfo) { + const state = stopInfo.state; + if (state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { + lastFunctionalEvent = new Date().getTime(); } - - var lastFunctionalEvent = 0; - - function getFunctionalEventIdleTime() { - return new Date().getTime() - lastFunctionalEvent; - } - - events.on(playbackManager, "playbackstop", function (e, stopInfo) { - var state = stopInfo.state; - if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") { - lastFunctionalEvent = new Date().getTime(); - } - }); - - function getScreensaverPlugin(isLoggedIn) { - - var option; - try { - option = userSettings.get("screensaver", false); - } catch (err) { - option = isLoggedIn ? "backdropscreensaver" : "logoscreensaver"; - } - - var plugins = pluginManager.ofType("screensaver"); - - for (var i = 0, length = plugins.length; i < length; i++) { - var plugin = plugins[i]; - - if (plugin.id === option) { - return plugin; - } - } - - return null; - } - - function ScreenSaverManager() { - - var self = this; - var activeScreenSaver; - - function showScreenSaver(screensaver) { - - if (activeScreenSaver) { - throw new Error("An existing screensaver is already active."); - } - - console.debug("Showing screensaver " + screensaver.name); - - screensaver.show(); - activeScreenSaver = screensaver; - - if (screensaver.hideOnClick !== false) { - window.addEventListener("click", hide, true); - } - if (screensaver.hideOnMouse !== false) { - window.addEventListener("mousemove", hide, true); - } - if (screensaver.hideOnKey !== false) { - window.addEventListener("keydown", hide, true); - } - } - - function hide() { - if (activeScreenSaver) { - console.debug("Hiding screensaver"); - activeScreenSaver.hide(); - activeScreenSaver = null; - } - - window.removeEventListener("click", hide, true); - window.removeEventListener("mousemove", hide, true); - window.removeEventListener("keydown", hide, true); - } - - self.isShowing = function () { - return activeScreenSaver != null; - }; - - self.show = function () { - var isLoggedIn; - var apiClient = connectionManager.currentApiClient(); - - if (apiClient && apiClient.isLoggedIn()) { - isLoggedIn = true; - } - - var screensaver = getScreensaverPlugin(isLoggedIn); - - if (screensaver) { - showScreenSaver(screensaver); - } - }; - - self.hide = function () { - hide(); - }; - - function onInterval() { - - if (self.isShowing()) { - return; - } - - if (inputManager.idleTime() < getMinIdleTime()) { - return; - } - - if (getFunctionalEventIdleTime < getMinIdleTime()) { - return; - } - - if (playbackManager.isPlayingVideo()) { - return; - } - - self.show(); - } - - setInterval(onInterval, 10000); - } - - return new ScreenSaverManager(); }); + +function getScreensaverPlugin(isLoggedIn) { + let option; + try { + option = userSettings.get('screensaver', false); + } catch (err) { + option = isLoggedIn ? 'backdropscreensaver' : 'logoscreensaver'; + } + + const plugins = pluginManager.ofType('screensaver'); + + for (const plugin of plugins) { + if (plugin.id === option) { + return plugin; + } + } + + return null; +} + +function ScreenSaverManager() { + let activeScreenSaver; + + function showScreenSaver(screensaver) { + if (activeScreenSaver) { + throw new Error('An existing screensaver is already active.'); + } + + console.debug('Showing screensaver ' + screensaver.name); + + screensaver.show(); + activeScreenSaver = screensaver; + + if (screensaver.hideOnClick !== false) { + window.addEventListener('click', hide, true); + } + if (screensaver.hideOnMouse !== false) { + window.addEventListener('mousemove', hide, true); + } + if (screensaver.hideOnKey !== false) { + window.addEventListener('keydown', hide, true); + } + } + + function hide() { + if (activeScreenSaver) { + console.debug('Hiding screensaver'); + activeScreenSaver.hide(); + activeScreenSaver = null; + } + + window.removeEventListener('click', hide, true); + window.removeEventListener('mousemove', hide, true); + window.removeEventListener('keydown', hide, true); + } + + this.isShowing = () => { + return activeScreenSaver != null; + }; + + this.show = function () { + let isLoggedIn; + const apiClient = connectionManager.currentApiClient(); + + if (apiClient && apiClient.isLoggedIn()) { + isLoggedIn = true; + } + + const screensaver = getScreensaverPlugin(isLoggedIn); + + if (screensaver) { + showScreenSaver(screensaver); + } + }; + + this.hide = function () { + hide(); + }; + + const onInterval = () => { + if (this.isShowing()) { + return; + } + + if (inputManager.idleTime() < getMinIdleTime()) { + return; + } + + if (getFunctionalEventIdleTime < getMinIdleTime()) { + return; + } + + if (playbackManager.isPlayingVideo()) { + return; + } + + this.show(); + }; + + setInterval(onInterval, 10000); +} + +export default new ScreenSaverManager; diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index 645a8ea85c..c460ec5b2c 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -1,925 +1,886 @@ -define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'scrollStyles'], function (browser, layoutManager, dom, focusManager, ResizeObserver) { - 'use strict'; +/* Cleaning this file properly is not neecessary, since it's an outdated library + * and will be replaced soon by a Vue component. + */ - /** +import browser from 'browser'; +import layoutManager from 'layoutManager'; +import dom from 'dom'; +import focusManager from 'focusManager'; +import ResizeObserver from 'ResizeObserver'; +import 'scrollStyles'; + +/** * Return type of the value. * * @param {Mixed} value * * @return {String} */ - function type(value) { - if (value == null) { - return String(value); - } - - if (typeof value === 'object' || typeof value === 'function') { - return Object.prototype.toString.call(value).match(/\s([a-z]+)/i)[1].toLowerCase() || 'object'; - } - - return typeof value; +function type(value) { + if (value == null) { + return String(value); } - /** - * Disables an event it was triggered on and unbinds itself. - * - * @param {Event} event - * - * @return {Void} - */ - function disableOneEvent(event) { - /*jshint validthis:true */ - event.preventDefault(); - event.stopPropagation(); - this.removeEventListener(event.type, disableOneEvent); + if (typeof value === 'object' || typeof value === 'function') { + return Object.prototype.toString.call(value).match(/\s([a-z]+)/i)[1].toLowerCase() || 'object'; } - /** - * Make sure that number is within the limits. - * - * @param {Number} number - * @param {Number} min - * @param {Number} max - * - * @return {Number} - */ - function within(number, min, max) { - return number < min ? min : number > max ? max : number; + return typeof value; +} + +/** + * Disables an event it was triggered on and unbinds itself. + * + * @param {Event} event + * + * @return {Void} + */ +function disableOneEvent(event) { + /*jshint validthis:true */ + event.preventDefault(); + event.stopPropagation(); + this.removeEventListener(event.type, disableOneEvent); +} + +/** + * Make sure that number is within the limits. + * + * @param {Number} number + * @param {Number} min + * @param {Number} max + * + * @return {Number} + */ +function within(number, min, max) { + return number < min ? min : number > max ? max : number; +} + +// Other global values +var dragMouseEvents = ['mousemove', 'mouseup']; +var dragTouchEvents = ['touchmove', 'touchend']; +var wheelEvent = (document.implementation.hasFeature('Event.wheel', '3.0') ? 'wheel' : 'mousewheel'); +var interactiveElements = ['INPUT', 'SELECT', 'TEXTAREA']; + +var scrollerFactory = function (frame, options) { + // Extend options + var o = Object.assign({}, { + slidee: null, // Selector, DOM element, or jQuery object with DOM element representing SLIDEE. + horizontal: false, // Switch to horizontal mode. + + // Scrolling + mouseWheel: true, + scrollBy: 0, // Pixels or items to move per one mouse scroll. 0 to disable scrolling + + // Dragging + dragSource: null, // Selector or DOM element for catching dragging events. Default is FRAME. + mouseDragging: 1, // Enable navigation by dragging the SLIDEE with mouse cursor. + touchDragging: 1, // Enable navigation by dragging the SLIDEE with touch events. + dragThreshold: 3, // Distance in pixels before Sly recognizes dragging. + intervactive: null, // Selector for special interactive elements. + + // Mixed options + speed: 0 // Animations speed in milliseconds. 0 to disable animations. + + }, options); + + var isSmoothScrollSupported = 'scrollBehavior' in document.documentElement.style; + + // native scroll is a must with touch input + // also use native scroll when scrolling vertically in desktop mode - excluding horizontal because the mouse wheel support is choppy at the moment + // in cases with firefox, if the smooth scroll api is supported then use that because their implementation is very good + if (options.allowNativeScroll === false) { + options.enableNativeScroll = false; + } else if (isSmoothScrollSupported && ((browser.firefox && !layoutManager.tv) || options.allowNativeSmoothScroll)) { + // native smooth scroll + options.enableNativeScroll = true; + } else if (options.requireAnimation && (browser.animate || browser.supportsCssAnimation())) { + // transform is the only way to guarantee animation + options.enableNativeScroll = false; + } else if (!layoutManager.tv || !browser.animate) { + options.enableNativeScroll = true; } - // Other global values - var dragMouseEvents = ['mousemove', 'mouseup']; - var dragTouchEvents = ['touchmove', 'touchend']; - var wheelEvent = (document.implementation.hasFeature('Event.wheel', '3.0') ? 'wheel' : 'mousewheel'); - var interactiveElements = ['INPUT', 'SELECT', 'TEXTAREA']; - var tmpArray = []; - var time; - - // Math shorthands - var abs = Math.abs; - var sqrt = Math.sqrt; - var pow = Math.pow; - var round = Math.round; - var max = Math.max; - var min = Math.min; - - var scrollerFactory = function (frame, options) { - - // Extend options - var o = Object.assign({}, { - slidee: null, // Selector, DOM element, or jQuery object with DOM element representing SLIDEE. - horizontal: false, // Switch to horizontal mode. - - // Scrolling - mouseWheel: true, - scrollBy: 0, // Pixels or items to move per one mouse scroll. 0 to disable scrolling - - // Dragging - dragSource: null, // Selector or DOM element for catching dragging events. Default is FRAME. - mouseDragging: 1, // Enable navigation by dragging the SLIDEE with mouse cursor. - touchDragging: 1, // Enable navigation by dragging the SLIDEE with touch events. - dragThreshold: 3, // Distance in pixels before Sly recognizes dragging. - intervactive: null, // Selector for special interactive elements. - - // Mixed options - speed: 0 // Animations speed in milliseconds. 0 to disable animations. - - }, options); - - var isSmoothScrollSupported = 'scrollBehavior' in document.documentElement.style; - - // native scroll is a must with touch input - // also use native scroll when scrolling vertically in desktop mode - excluding horizontal because the mouse wheel support is choppy at the moment - // in cases with firefox, if the smooth scroll api is supported then use that because their implementation is very good - if (options.allowNativeScroll === false) { - options.enableNativeScroll = false; - } else if (isSmoothScrollSupported && ((browser.firefox && !layoutManager.tv) || options.allowNativeSmoothScroll)) { - // native smooth scroll - options.enableNativeScroll = true; - } else if (options.requireAnimation && (browser.animate || browser.supportsCssAnimation())) { - - // transform is the only way to guarantee animation - options.enableNativeScroll = false; - } else if (!layoutManager.tv || !browser.animate) { - - options.enableNativeScroll = true; - } - - // Need this for the magic wheel. With the animated scroll the magic wheel will run off of the screen - if (browser.web0s) { - options.enableNativeScroll = true; - } - - // Private variables - var self = this; - self.options = o; - - // Frame - var slideeElement = o.slidee ? o.slidee : sibling(frame.firstChild)[0]; - self._pos = { - start: 0, - center: 0, - end: 0, - cur: 0, - dest: 0 - }; - - var transform = !options.enableNativeScroll; - - // Miscellaneous - var scrollSource = frame; - var dragSourceElement = o.dragSource ? o.dragSource : frame; - var dragging = { - released: 1 - }; - var scrolling = { - last: 0, - delta: 0, - resetTime: 200 - }; - - // Expose properties - self.initialized = 0; - self.slidee = slideeElement; - self.options = o; - self.dragging = dragging; - - var nativeScrollElement = frame; - - function sibling(n, elem) { - var matched = []; - - for (; n; n = n.nextSibling) { - if (n.nodeType === 1 && n !== elem) { - matched.push(n); - } - } - return matched; - } - - var requiresReflow = true; - - var frameSize = 0; - var slideeSize = 0; - function ensureSizeInfo() { - - if (requiresReflow) { - - requiresReflow = false; - - // Reset global variables - frameSize = o.horizontal ? (frame).offsetWidth : (frame).offsetHeight; - - slideeSize = o.scrollWidth || Math.max(slideeElement[o.horizontal ? 'offsetWidth' : 'offsetHeight'], slideeElement[o.horizontal ? 'scrollWidth' : 'scrollHeight']); - - // Set position limits & relativess - self._pos.end = max(slideeSize - frameSize, 0); - } - } - - /** - * Loading function. - * - * Populate arrays, set sizes, bind events, ... - * - * @param {Boolean} [isInit] Whether load is called from within self.init(). - * @return {Void} - */ - function load(isInit) { - - requiresReflow = true; - - if (!isInit) { - - ensureSizeInfo(); - - // Fix possible overflowing - var pos = self._pos; - self.slideTo(within(pos.dest, pos.start, pos.end)); - } - } - - function initFrameResizeObserver() { - - var observerOptions = {}; - - self.frameResizeObserver = new ResizeObserver(onResize, observerOptions); - - self.frameResizeObserver.observe(frame); - } - - self.reload = function () { - load(); - }; - - self.getScrollEventName = function () { - return transform ? 'scrollanimate' : 'scroll'; - }; - - self.getScrollSlider = function () { - return slideeElement; - }; - - self.getScrollFrame = function () { - return frame; - }; - - function nativeScrollTo(container, pos, immediate) { - - if (container.scroll) { - if (o.horizontal) { - - container.scroll({ - left: pos, - behavior: immediate ? 'instant' : 'smooth' - }); - } else { - - container.scroll({ - top: pos, - behavior: immediate ? 'instant' : 'smooth' - }); - } - } else if (!immediate && container.scrollTo) { - if (o.horizontal) { - container.scrollTo(Math.round(pos), 0); - } else { - container.scrollTo(0, Math.round(pos)); - } - } else { - if (o.horizontal) { - container.scrollLeft = Math.round(pos); - } else { - container.scrollTop = Math.round(pos); - } - } - } - - var lastAnimate; - - /** - * Animate to a position. - * - * @param {Int} newPos New position. - * @param {Bool} immediate Reposition immediately without an animation. - * - * @return {Void} - */ - self.slideTo = function (newPos, immediate, fullItemPos) { - - ensureSizeInfo(); - var pos = self._pos; - - newPos = within(newPos, pos.start, pos.end); - - if (!transform) { - - nativeScrollTo(nativeScrollElement, newPos, immediate); - return; - } - - // Update the animation object - var from = pos.cur; - immediate = immediate || dragging.init || !o.speed; - - var now = new Date().getTime(); - - if (o.autoImmediate) { - if (!immediate && (now - (lastAnimate || 0)) <= 50) { - immediate = true; - } - } - - if (!immediate && o.skipSlideToWhenVisible && fullItemPos && fullItemPos.isVisible) { - - return; - } - - // Start animation rendering - // NOTE the dependency was modified here to fix a scrollbutton issue - pos.dest = newPos; - renderAnimateWithTransform(from, newPos, immediate); - lastAnimate = now; - }; - - function setStyleProperty(elem, name, value, speed, resetTransition) { - - var style = elem.style; - - if (resetTransition || browser.edge) { - style.transition = 'none'; - void elem.offsetWidth; - } - - style.transition = 'transform ' + speed + 'ms ease-out'; - style[name] = value; - } - - function dispatchScrollEventIfNeeded() { - if (o.dispatchScrollEvent) { - frame.dispatchEvent(new CustomEvent(self.getScrollEventName(), { - bubbles: true, - cancelable: false - })); - } - } - - function renderAnimateWithTransform(fromPosition, toPosition, immediate) { - - var speed = o.speed; - - if (immediate) { - speed = o.immediateSpeed || 50; - } - - if (o.horizontal) { - setStyleProperty(slideeElement, 'transform', 'translateX(' + (-round(toPosition)) + 'px)', speed); - } else { - setStyleProperty(slideeElement, 'transform', 'translateY(' + (-round(toPosition)) + 'px)', speed); - } - self._pos.cur = toPosition; - - dispatchScrollEventIfNeeded(); - } - - function getBoundingClientRect(elem) { - - // Support: BlackBerry 5, iOS 3 (original iPhone) - // If we don't have gBCR, just use 0,0 rather than error - if (elem.getBoundingClientRect) { - return elem.getBoundingClientRect(); - } else { - return { top: 0, left: 0 }; - } - } - - /** - * Returns the position object. - * - * @param {Mixed} item - * - * @return {Object} - */ - self.getPos = function (item) { - - var scrollElement = transform ? slideeElement : nativeScrollElement; - var slideeOffset = getBoundingClientRect(scrollElement); - var itemOffset = getBoundingClientRect(item); - - var slideeStartPos = o.horizontal ? slideeOffset.left : slideeOffset.top; - var slideeEndPos = o.horizontal ? slideeOffset.right : slideeOffset.bottom; - - var offset = o.horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top; - - var size = o.horizontal ? itemOffset.width : itemOffset.height; - if (!size && size !== 0) { - size = item[o.horizontal ? 'offsetWidth' : 'offsetHeight']; - } - - var centerOffset = o.centerOffset || 0; - - if (!transform) { - centerOffset = 0; - if (o.horizontal) { - offset += nativeScrollElement.scrollLeft; - } else { - offset += nativeScrollElement.scrollTop; - } - } - - ensureSizeInfo(); - - var currentStart = self._pos.cur; - var currentEnd = currentStart + frameSize; - - console.debug('offset:' + offset + ' currentStart:' + currentStart + ' currentEnd:' + currentEnd); - var isVisible = offset >= currentStart && (offset + size) <= currentEnd; - - return { - start: offset, - center: offset + centerOffset - (frameSize / 2) + (size / 2), - end: offset - frameSize + size, - size: size, - isVisible: isVisible - }; - }; - - self.getCenterPosition = function (item) { - - ensureSizeInfo(); - - var pos = self.getPos(item); - return within(pos.center, pos.start, pos.end); - }; - - function dragInitSlidee(event) { - var isTouch = event.type === 'touchstart'; - - // Ignore when already in progress, or interactive element in non-touch navivagion - if (dragging.init || !isTouch && isInteractive(event.target)) { - return; - } - - // SLIDEE dragging conditions - if (!(isTouch ? o.touchDragging : o.mouseDragging && event.which < 2)) { - return; - } - - if (!isTouch) { - // prevents native image dragging in Firefox - event.preventDefault(); - } - - // Reset dragging object - dragging.released = 0; - - // Properties used in dragHandler - dragging.init = 0; - dragging.source = event.target; - dragging.touch = isTouch; - var pointer = isTouch ? event.touches[0] : event; - dragging.initX = pointer.pageX; - dragging.initY = pointer.pageY; - dragging.initPos = self._pos.cur; - dragging.start = +new Date(); - dragging.time = 0; - dragging.path = 0; - dragging.delta = 0; - dragging.locked = 0; - dragging.pathToLock = isTouch ? 30 : 10; - - // Bind dragging events - if (transform) { - - if (isTouch) { - dragTouchEvents.forEach(function (eventName) { - dom.addEventListener(document, eventName, dragHandler, { - passive: true - }); - }); - } else { - dragMouseEvents.forEach(function (eventName) { - dom.addEventListener(document, eventName, dragHandler, { - passive: true - }); - }); - } - } - } - - /** - * Handler for dragging scrollbar handle or SLIDEE. - * - * @param {Event} event - * - * @return {Void} - */ - function dragHandler(event) { - dragging.released = event.type === 'mouseup' || event.type === 'touchend'; - var pointer = dragging.touch ? event[dragging.released ? 'changedTouches' : 'touches'][0] : event; - dragging.pathX = pointer.pageX - dragging.initX; - dragging.pathY = pointer.pageY - dragging.initY; - dragging.path = sqrt(pow(dragging.pathX, 2) + pow(dragging.pathY, 2)); - dragging.delta = o.horizontal ? dragging.pathX : dragging.pathY; - - if (!dragging.released && dragging.path < 1) { - return; - } - - // We haven't decided whether this is a drag or not... - if (!dragging.init) { - // If the drag path was very short, maybe it's not a drag? - if (dragging.path < o.dragThreshold) { - // If the pointer was released, the path will not become longer and it's - // definitely not a drag. If not released yet, decide on next iteration - return dragging.released ? dragEnd() : undefined; - } else { - // If dragging path is sufficiently long we can confidently start a drag - // if drag is in different direction than scroll, ignore it - if (o.horizontal ? abs(dragging.pathX) > abs(dragging.pathY) : abs(dragging.pathX) < abs(dragging.pathY)) { - dragging.init = 1; - } else { - return dragEnd(); - } - } - } - - //event.preventDefault(); - - // Disable click on a source element, as it is unwelcome when dragging - if (!dragging.locked && dragging.path > dragging.pathToLock) { - dragging.locked = 1; - dragging.source.addEventListener('click', disableOneEvent); - } - - // Cancel dragging on release - if (dragging.released) { - dragEnd(); - } - - self.slideTo(round(dragging.initPos - dragging.delta)); - } - - /** - * Stops dragging and cleans up after it. - * - * @return {Void} - */ - function dragEnd() { - dragging.released = true; - - dragTouchEvents.forEach(function (eventName) { - dom.removeEventListener(document, eventName, dragHandler, { - passive: true - }); - }); - - dragMouseEvents.forEach(function (eventName) { - dom.removeEventListener(document, eventName, dragHandler, { - passive: true - }); - }); - - // Make sure that disableOneEvent is not active in next tick. - setTimeout(function () { - dragging.source.removeEventListener('click', disableOneEvent); - }); - - dragging.init = 0; - } - - /** - * Check whether element is interactive. - * - * @return {Boolean} - */ - function isInteractive(element) { - - while (element) { - - if (interactiveElements.indexOf(element.tagName) !== -1) { - return true; - } - - element = element.parentNode; - } - return false; - } - - /** - * Mouse wheel delta normalization. - * - * @param {Event} event - * - * @return {Int} - */ - function normalizeWheelDelta(event) { - // JELLYFIN MOD: Only use deltaX for horizontal scroll and remove IE8 support - scrolling.curDelta = o.horizontal ? event.deltaX : event.deltaY; - // END JELLYFIN MOD - - if (transform) { - scrolling.curDelta /= event.deltaMode === 1 ? 3 : 100; - } - return scrolling.curDelta; - } - - /** - * Mouse scrolling handler. - * - * @param {Event} event - * - * @return {Void} - */ - function scrollHandler(event) { - - ensureSizeInfo(); - var pos = self._pos; - // Ignore if there is no scrolling to be done - if (!o.scrollBy || pos.start === pos.end) { - return; - } - var delta = normalizeWheelDelta(event); - - if (transform) { - // Trap scrolling only when necessary and/or requested - if (delta > 0 && pos.dest < pos.end || delta < 0 && pos.dest > pos.start) { - //stopDefault(event, 1); - } - - self.slideBy(o.scrollBy * delta); - } else { - - if (isSmoothScrollSupported) { - delta *= 12; - } - - if (o.horizontal) { - nativeScrollElement.scrollLeft += delta; - } else { - nativeScrollElement.scrollTop += delta; - } - } - } - - /** - * Destroys instance and everything it created. - * - * @return {Void} - */ - self.destroy = function () { - - if (self.frameResizeObserver) { - self.frameResizeObserver.disconnect(); - self.frameResizeObserver = null; - } - - // Reset native FRAME element scroll - dom.removeEventListener(frame, 'scroll', resetScroll, { - passive: true - }); - - dom.removeEventListener(scrollSource, wheelEvent, scrollHandler, { - passive: true - }); - - dom.removeEventListener(dragSourceElement, 'touchstart', dragInitSlidee, { - passive: true - }); - - dom.removeEventListener(frame, 'click', onFrameClick, { - passive: true, - capture: true - }); - - dom.removeEventListener(dragSourceElement, 'mousedown', dragInitSlidee, { - //passive: true - }); - - // Reset initialized status and return the instance - self.initialized = 0; - return self; - }; - - var contentRect = {}; - - function onResize(entries) { - - var entry = entries[0]; - - if (entry) { - - var newRect = entry.contentRect; - - // handle element being hidden - if (newRect.width === 0 || newRect.height === 0) { - return; - } - - if (newRect.width !== contentRect.width || newRect.height !== contentRect.height) { - - contentRect = newRect; - - load(false); - } - } - } - - function resetScroll() { - if (o.horizontal) { - this.scrollLeft = 0; - } else { - this.scrollTop = 0; - } - } - - function onFrameClick(e) { - if (e.which === 1) { - var focusableParent = focusManager.focusableParent(e.target); - if (focusableParent && focusableParent !== document.activeElement) { - focusableParent.focus(); - } - } - } - - self.getScrollPosition = function () { - - if (transform) { - return self._pos.cur; - } - - if (o.horizontal) { - return nativeScrollElement.scrollLeft; - } else { - return nativeScrollElement.scrollTop; - } - }; - - self.getScrollSize = function () { - - if (transform) { - return slideeSize; - } - - if (o.horizontal) { - return nativeScrollElement.scrollWidth; - } else { - return nativeScrollElement.scrollHeight; - } - }; - - /** - * Initialize. - * - * @return {Object} - */ - self.init = function () { - if (self.initialized) { - return; - } - - if (!transform) { - if (o.horizontal) { - if (layoutManager.desktop && !o.hideScrollbar) { - nativeScrollElement.classList.add('scrollX'); - } else { - nativeScrollElement.classList.add('scrollX'); - nativeScrollElement.classList.add('hiddenScrollX'); - - if (layoutManager.tv && o.allowNativeSmoothScroll !== false) { - nativeScrollElement.classList.add('smoothScrollX'); - } - } - - if (o.forceHideScrollbars) { - nativeScrollElement.classList.add('hiddenScrollX-forced'); - } - } else { - if (layoutManager.desktop && !o.hideScrollbar) { - nativeScrollElement.classList.add('scrollY'); - } else { - nativeScrollElement.classList.add('scrollY'); - nativeScrollElement.classList.add('hiddenScrollY'); - - if (layoutManager.tv && o.allowNativeSmoothScroll !== false) { - nativeScrollElement.classList.add('smoothScrollY'); - } - } - - if (o.forceHideScrollbars) { - nativeScrollElement.classList.add('hiddenScrollY-forced'); - } - } - } else { - frame.style.overflow = 'hidden'; - slideeElement.style['will-change'] = 'transform'; - slideeElement.style.transition = 'transform ' + o.speed + 'ms ease-out'; - - if (o.horizontal) { - slideeElement.classList.add('animatedScrollX'); - } else { - slideeElement.classList.add('animatedScrollY'); - } - } - - if (transform || layoutManager.tv) { - // This can prevent others from being able to listen to mouse events - dom.addEventListener(dragSourceElement, 'mousedown', dragInitSlidee, { - //passive: true - }); - } - - initFrameResizeObserver(); - - if (transform) { - - dom.addEventListener(dragSourceElement, 'touchstart', dragInitSlidee, { - passive: true - }); - - if (!o.horizontal) { - dom.addEventListener(frame, 'scroll', resetScroll, { - passive: true - }); - } - - if (o.mouseWheel) { - // Scrolling navigation - dom.addEventListener(scrollSource, wheelEvent, scrollHandler, { - passive: true - }); - } - - } else if (o.horizontal) { - - // Don't bind to mouse events with vertical scroll since the mouse wheel can handle this natively - - if (o.mouseWheel) { - // Scrolling navigation - dom.addEventListener(scrollSource, wheelEvent, scrollHandler, { - passive: true - }); - } - } - - dom.addEventListener(frame, 'click', onFrameClick, { - passive: true, - capture: true - }); - - // Mark instance as initialized - self.initialized = 1; - - // Load - load(true); - - // Return instance - return self; - }; + // Need this for the magic wheel. With the animated scroll the magic wheel will run off of the screen + if (browser.web0s) { + options.enableNativeScroll = true; + } + + // Private variables + var self = this; + self.options = o; + + // Frame + var slideeElement = o.slidee ? o.slidee : sibling(frame.firstChild)[0]; + self._pos = { + start: 0, + center: 0, + end: 0, + cur: 0, + dest: 0 }; + var transform = !options.enableNativeScroll; + + // Miscellaneous + var scrollSource = frame; + var dragSourceElement = o.dragSource ? o.dragSource : frame; + var dragging = { + released: 1 + }; + var scrolling = { + last: 0, + delta: 0, + resetTime: 200 + }; + + // Expose properties + self.initialized = 0; + self.slidee = slideeElement; + self.options = o; + self.dragging = dragging; + + var nativeScrollElement = frame; + + function sibling(n, elem) { + var matched = []; + + for (; n; n = n.nextSibling) { + if (n.nodeType === 1 && n !== elem) { + matched.push(n); + } + } + return matched; + } + + var requiresReflow = true; + + var frameSize = 0; + var slideeSize = 0; + function ensureSizeInfo() { + if (requiresReflow) { + requiresReflow = false; + + // Reset global variables + frameSize = o.horizontal ? (frame).offsetWidth : (frame).offsetHeight; + + slideeSize = o.scrollWidth || Math.max(slideeElement[o.horizontal ? 'offsetWidth' : 'offsetHeight'], slideeElement[o.horizontal ? 'scrollWidth' : 'scrollHeight']); + + // Set position limits & relativess + self._pos.end = Math.max(slideeSize - frameSize, 0); + } + } + /** - * Slide SLIDEE by amount of pixels. + * Loading function. * - * @param {Int} delta Pixels/Items. Positive means forward, negative means backward. - * @param {Bool} immediate Reposition immediately without an animation. + * Populate arrays, set sizes, bind events, ... * + * @param {Boolean} [isInit] Whether load is called from within self.init(). * @return {Void} */ - scrollerFactory.prototype.slideBy = function (delta, immediate) { - if (!delta) { + function load(isInit) { + requiresReflow = true; + + if (!isInit) { + ensureSizeInfo(); + + // Fix possible overflowing + var pos = self._pos; + self.slideTo(within(pos.dest, pos.start, pos.end)); + } + } + + function initFrameResizeObserver() { + var observerOptions = {}; + + self.frameResizeObserver = new ResizeObserver(onResize, observerOptions); + + self.frameResizeObserver.observe(frame); + } + + self.reload = function () { + load(); + }; + + self.getScrollEventName = function () { + return transform ? 'scrollanimate' : 'scroll'; + }; + + self.getScrollSlider = function () { + return slideeElement; + }; + + self.getScrollFrame = function () { + return frame; + }; + + function nativeScrollTo(container, pos, immediate) { + if (container.scroll) { + if (o.horizontal) { + container.scroll({ + left: pos, + behavior: immediate ? 'instant' : 'smooth' + }); + } else { + container.scroll({ + top: pos, + behavior: immediate ? 'instant' : 'smooth' + }); + } + } else if (!immediate && container.scrollTo) { + if (o.horizontal) { + container.scrollTo(Math.round(pos), 0); + } else { + container.scrollTo(0, Math.round(pos)); + } + } else { + if (o.horizontal) { + container.scrollLeft = Math.round(pos); + } else { + container.scrollTop = Math.round(pos); + } + } + } + + var lastAnimate; + + /** + * Animate to a position. + * + * @param {Int} newPos New position. + * @param {Bool} immediate Reposition immediately without an animation. + * + * @return {Void} + */ + self.slideTo = function (newPos, immediate, fullItemPos) { + ensureSizeInfo(); + var pos = self._pos; + + newPos = within(newPos, pos.start, pos.end); + + if (!transform) { + nativeScrollTo(nativeScrollElement, newPos, immediate); return; } - this.slideTo(this._pos.dest + delta, immediate); - }; - /** - * Core method for handling `toLocation` methods. - * - * @param {String} location - * @param {Mixed} item - * @param {Bool} immediate - * - * @return {Void} - */ - scrollerFactory.prototype.to = function (location, item, immediate) { - // Optional arguments logic - if (type(item) === 'boolean') { - immediate = item; - item = undefined; - } + // Update the animation object + var from = pos.cur; + immediate = immediate || dragging.init || !o.speed; - if (item === undefined) { - this.slideTo(this._pos[location], immediate); - } else { - var itemPos = this.getPos(item); + var now = new Date().getTime(); - if (itemPos) { - this.slideTo(itemPos[location], immediate, itemPos); + if (o.autoImmediate) { + if (!immediate && (now - (lastAnimate || 0)) <= 50) { + immediate = true; } } + + if (!immediate && o.skipSlideToWhenVisible && fullItemPos && fullItemPos.isVisible) { + return; + } + + // Start animation rendering + // NOTE the dependency was modified here to fix a scrollbutton issue + pos.dest = newPos; + renderAnimateWithTransform(from, newPos, immediate); + lastAnimate = now; }; + function setStyleProperty(elem, name, value, speed, resetTransition) { + var style = elem.style; + + if (resetTransition || browser.edge) { + style.transition = 'none'; + void elem.offsetWidth; + } + + style.transition = 'transform ' + speed + 'ms ease-out'; + style[name] = value; + } + + function dispatchScrollEventIfNeeded() { + if (o.dispatchScrollEvent) { + frame.dispatchEvent(new CustomEvent(self.getScrollEventName(), { + bubbles: true, + cancelable: false + })); + } + } + + function renderAnimateWithTransform(fromPosition, toPosition, immediate) { + var speed = o.speed; + + if (immediate) { + speed = o.immediateSpeed || 50; + } + + if (o.horizontal) { + setStyleProperty(slideeElement, 'transform', 'translateX(' + (-Math.round(toPosition)) + 'px)', speed); + } else { + setStyleProperty(slideeElement, 'transform', 'translateY(' + (-Math.round(toPosition)) + 'px)', speed); + } + self._pos.cur = toPosition; + + dispatchScrollEventIfNeeded(); + } + + function getBoundingClientRect(elem) { + // Support: BlackBerry 5, iOS 3 (original iPhone) + // If we don't have gBCR, just use 0,0 rather than error + if (elem.getBoundingClientRect) { + return elem.getBoundingClientRect(); + } else { + return { top: 0, left: 0 }; + } + } + /** - * Animate element or the whole SLIDEE to the start of the frame. + * Returns the position object. * - * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. - * @param {Bool} immediate Reposition immediately without an animation. + * @param {Mixed} item + * + * @return {Object} + */ + self.getPos = function (item) { + var scrollElement = transform ? slideeElement : nativeScrollElement; + var slideeOffset = getBoundingClientRect(scrollElement); + var itemOffset = getBoundingClientRect(item); + + var offset = o.horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top; + + var size = o.horizontal ? itemOffset.width : itemOffset.height; + if (!size && size !== 0) { + size = item[o.horizontal ? 'offsetWidth' : 'offsetHeight']; + } + + var centerOffset = o.centerOffset || 0; + + if (!transform) { + centerOffset = 0; + if (o.horizontal) { + offset += nativeScrollElement.scrollLeft; + } else { + offset += nativeScrollElement.scrollTop; + } + } + + ensureSizeInfo(); + + var currentStart = self._pos.cur; + var currentEnd = currentStart + frameSize; + + console.debug('offset:' + offset + ' currentStart:' + currentStart + ' currentEnd:' + currentEnd); + var isVisible = offset >= currentStart && (offset + size) <= currentEnd; + + return { + start: offset, + center: offset + centerOffset - (frameSize / 2) + (size / 2), + end: offset - frameSize + size, + size: size, + isVisible: isVisible + }; + }; + + self.getCenterPosition = function (item) { + ensureSizeInfo(); + + var pos = self.getPos(item); + return within(pos.center, pos.start, pos.end); + }; + + function dragInitSlidee(event) { + var isTouch = event.type === 'touchstart'; + + // Ignore when already in progress, or interactive element in non-touch navivagion + if (dragging.init || !isTouch && isInteractive(event.target)) { + return; + } + + // SLIDEE dragging conditions + if (!(isTouch ? o.touchDragging : o.mouseDragging && event.which < 2)) { + return; + } + + if (!isTouch) { + // prevents native image dragging in Firefox + event.preventDefault(); + } + + // Reset dragging object + dragging.released = 0; + + // Properties used in dragHandler + dragging.init = 0; + dragging.source = event.target; + dragging.touch = isTouch; + var pointer = isTouch ? event.touches[0] : event; + dragging.initX = pointer.pageX; + dragging.initY = pointer.pageY; + dragging.initPos = self._pos.cur; + dragging.start = +new Date(); + dragging.time = 0; + dragging.path = 0; + dragging.delta = 0; + dragging.locked = 0; + dragging.pathToLock = isTouch ? 30 : 10; + + // Bind dragging events + if (transform) { + if (isTouch) { + dragTouchEvents.forEach(function (eventName) { + dom.addEventListener(document, eventName, dragHandler, { + passive: true + }); + }); + } else { + dragMouseEvents.forEach(function (eventName) { + dom.addEventListener(document, eventName, dragHandler, { + passive: true + }); + }); + } + } + } + + /** + * Handler for dragging scrollbar handle or SLIDEE. + * + * @param {Event} event * * @return {Void} */ - scrollerFactory.prototype.toStart = function (item, immediate) { - this.to('start', item, immediate); - }; + function dragHandler(event) { + dragging.released = event.type === 'mouseup' || event.type === 'touchend'; + var pointer = dragging.touch ? event[dragging.released ? 'changedTouches' : 'touches'][0] : event; + dragging.pathX = pointer.pageX - dragging.initX; + dragging.pathY = pointer.pageY - dragging.initY; + dragging.path = Math.sqrt(Math.pow(dragging.pathX, 2) + Math.pow(dragging.pathY, 2)); + dragging.delta = o.horizontal ? dragging.pathX : dragging.pathY; + + if (!dragging.released && dragging.path < 1) { + return; + } + + // We haven't decided whether this is a drag or not... + if (!dragging.init) { + // If the drag path was very short, maybe it's not a drag? + if (dragging.path < o.dragThreshold) { + // If the pointer was released, the path will not become longer and it's + // definitely not a drag. If not released yet, decide on next iteration + return dragging.released ? dragEnd() : undefined; + } else { + // If dragging path is sufficiently long we can confidently start a drag + // if drag is in different direction than scroll, ignore it + if (o.horizontal ? Math.abs(dragging.pathX) > Math.abs(dragging.pathY) : Math.abs(dragging.pathX) < Math.abs(dragging.pathY)) { + dragging.init = 1; + } else { + return dragEnd(); + } + } + } + + //event.preventDefault(); + + // Disable click on a source element, as it is unwelcome when dragging + if (!dragging.locked && dragging.path > dragging.pathToLock) { + dragging.locked = 1; + dragging.source.addEventListener('click', disableOneEvent); + } + + // Cancel dragging on release + if (dragging.released) { + dragEnd(); + } + + self.slideTo(Math.round(dragging.initPos - dragging.delta)); + } /** - * Animate element or the whole SLIDEE to the end of the frame. - * - * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. - * @param {Bool} immediate Reposition immediately without an animation. + * Stops dragging and cleans up after it. * * @return {Void} */ - scrollerFactory.prototype.toEnd = function (item, immediate) { - this.to('end', item, immediate); - }; + function dragEnd() { + dragging.released = true; + + dragTouchEvents.forEach(function (eventName) { + dom.removeEventListener(document, eventName, dragHandler, { + passive: true + }); + }); + + dragMouseEvents.forEach(function (eventName) { + dom.removeEventListener(document, eventName, dragHandler, { + passive: true + }); + }); + + // Make sure that disableOneEvent is not active in next tick. + setTimeout(function () { + dragging.source.removeEventListener('click', disableOneEvent); + }); + + dragging.init = 0; + } /** - * Animate element or the whole SLIDEE to the center of the frame. + * Check whether element is interactive. * - * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. - * @param {Bool} immediate Reposition immediately without an animation. + * @return {Boolean} + */ + function isInteractive(element) { + while (element) { + if (interactiveElements.indexOf(element.tagName) !== -1) { + return true; + } + + element = element.parentNode; + } + return false; + } + + /** + * Mouse wheel delta normalization. + * + * @param {Event} event + * + * @return {Int} + */ + function normalizeWheelDelta(event) { + // JELLYFIN MOD: Only use deltaX for horizontal scroll and remove IE8 support + scrolling.curDelta = o.horizontal ? event.deltaX : event.deltaY; + // END JELLYFIN MOD + + if (transform) { + scrolling.curDelta /= event.deltaMode === 1 ? 3 : 100; + } + return scrolling.curDelta; + } + + /** + * Mouse scrolling handler. + * + * @param {Event} event * * @return {Void} */ - scrollerFactory.prototype.toCenter = function (item, immediate) { - this.to('center', item, immediate); + function scrollHandler(event) { + ensureSizeInfo(); + var pos = self._pos; + // Ignore if there is no scrolling to be done + if (!o.scrollBy || pos.start === pos.end) { + return; + } + var delta = normalizeWheelDelta(event); + + if (transform) { + // Trap scrolling only when necessary and/or requested + if (delta > 0 && pos.dest < pos.end || delta < 0 && pos.dest > pos.start) { + //stopDefault(event, 1); + } + + self.slideBy(o.scrollBy * delta); + } else { + if (isSmoothScrollSupported) { + delta *= 12; + } + + if (o.horizontal) { + nativeScrollElement.scrollLeft += delta; + } else { + nativeScrollElement.scrollTop += delta; + } + } + } + + /** + * Destroys instance and everything it created. + * + * @return {Void} + */ + self.destroy = function () { + if (self.frameResizeObserver) { + self.frameResizeObserver.disconnect(); + self.frameResizeObserver = null; + } + + // Reset native FRAME element scroll + dom.removeEventListener(frame, 'scroll', resetScroll, { + passive: true + }); + + dom.removeEventListener(scrollSource, wheelEvent, scrollHandler, { + passive: true + }); + + dom.removeEventListener(dragSourceElement, 'touchstart', dragInitSlidee, { + passive: true + }); + + dom.removeEventListener(frame, 'click', onFrameClick, { + passive: true, + capture: true + }); + + dom.removeEventListener(dragSourceElement, 'mousedown', dragInitSlidee, { + //passive: true + }); + + // Reset initialized status and return the instance + self.initialized = 0; + return self; }; - scrollerFactory.create = function (frame, options) { - var instance = new scrollerFactory(frame, options); - return Promise.resolve(instance); + var contentRect = {}; + + function onResize(entries) { + var entry = entries[0]; + + if (entry) { + var newRect = entry.contentRect; + + // handle element being hidden + if (newRect.width === 0 || newRect.height === 0) { + return; + } + + if (newRect.width !== contentRect.width || newRect.height !== contentRect.height) { + contentRect = newRect; + + load(false); + } + } + } + + function resetScroll() { + if (o.horizontal) { + this.scrollLeft = 0; + } else { + this.scrollTop = 0; + } + } + + function onFrameClick(e) { + if (e.which === 1) { + var focusableParent = focusManager.focusableParent(e.target); + if (focusableParent && focusableParent !== document.activeElement) { + focusableParent.focus(); + } + } + } + + self.getScrollPosition = function () { + if (transform) { + return self._pos.cur; + } + + if (o.horizontal) { + return nativeScrollElement.scrollLeft; + } else { + return nativeScrollElement.scrollTop; + } }; - return scrollerFactory; -}); + self.getScrollSize = function () { + if (transform) { + return slideeSize; + } + + if (o.horizontal) { + return nativeScrollElement.scrollWidth; + } else { + return nativeScrollElement.scrollHeight; + } + }; + + /** + * Initialize. + * + * @return {Object} + */ + self.init = function () { + if (self.initialized) { + return; + } + + if (!transform) { + if (o.horizontal) { + if (layoutManager.desktop && !o.hideScrollbar) { + nativeScrollElement.classList.add('scrollX'); + } else { + nativeScrollElement.classList.add('scrollX'); + nativeScrollElement.classList.add('hiddenScrollX'); + + if (layoutManager.tv && o.allowNativeSmoothScroll !== false) { + nativeScrollElement.classList.add('smoothScrollX'); + } + } + + if (o.forceHideScrollbars) { + nativeScrollElement.classList.add('hiddenScrollX-forced'); + } + } else { + if (layoutManager.desktop && !o.hideScrollbar) { + nativeScrollElement.classList.add('scrollY'); + } else { + nativeScrollElement.classList.add('scrollY'); + nativeScrollElement.classList.add('hiddenScrollY'); + + if (layoutManager.tv && o.allowNativeSmoothScroll !== false) { + nativeScrollElement.classList.add('smoothScrollY'); + } + } + + if (o.forceHideScrollbars) { + nativeScrollElement.classList.add('hiddenScrollY-forced'); + } + } + } else { + frame.style.overflow = 'hidden'; + slideeElement.style['will-change'] = 'transform'; + slideeElement.style.transition = 'transform ' + o.speed + 'ms ease-out'; + + if (o.horizontal) { + slideeElement.classList.add('animatedScrollX'); + } else { + slideeElement.classList.add('animatedScrollY'); + } + } + + if (transform || layoutManager.tv) { + // This can prevent others from being able to listen to mouse events + dom.addEventListener(dragSourceElement, 'mousedown', dragInitSlidee, { + //passive: true + }); + } + + initFrameResizeObserver(); + + if (transform) { + dom.addEventListener(dragSourceElement, 'touchstart', dragInitSlidee, { + passive: true + }); + + if (!o.horizontal) { + dom.addEventListener(frame, 'scroll', resetScroll, { + passive: true + }); + } + + if (o.mouseWheel) { + // Scrolling navigation + dom.addEventListener(scrollSource, wheelEvent, scrollHandler, { + passive: true + }); + } + } else if (o.horizontal) { + // Don't bind to mouse events with vertical scroll since the mouse wheel can handle this natively + + if (o.mouseWheel) { + // Scrolling navigation + dom.addEventListener(scrollSource, wheelEvent, scrollHandler, { + passive: true + }); + } + } + + dom.addEventListener(frame, 'click', onFrameClick, { + passive: true, + capture: true + }); + + // Mark instance as initialized + self.initialized = 1; + + // Load + load(true); + + // Return instance + return self; + }; +}; + +/** + * Slide SLIDEE by amount of pixels. + * + * @param {Int} delta Pixels/Items. Positive means forward, negative means backward. + * @param {Bool} immediate Reposition immediately without an animation. + * + * @return {Void} + */ +scrollerFactory.prototype.slideBy = function (delta, immediate) { + if (!delta) { + return; + } + this.slideTo(this._pos.dest + delta, immediate); +}; + +/** + * Core method for handling `toLocation` methods. + * + * @param {String} location + * @param {Mixed} item + * @param {Bool} immediate + * + * @return {Void} + */ +scrollerFactory.prototype.to = function (location, item, immediate) { + // Optional arguments logic + if (type(item) === 'boolean') { + immediate = item; + item = undefined; + } + + if (item === undefined) { + this.slideTo(this._pos[location], immediate); + } else { + var itemPos = this.getPos(item); + + if (itemPos) { + this.slideTo(itemPos[location], immediate, itemPos); + } + } +}; + +/** + * Animate element or the whole SLIDEE to the start of the frame. + * + * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. + * @param {Bool} immediate Reposition immediately without an animation. + * + * @return {Void} + */ +scrollerFactory.prototype.toStart = function (item, immediate) { + this.to('start', item, immediate); +}; + +/** + * Animate element or the whole SLIDEE to the end of the frame. + * + * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. + * @param {Bool} immediate Reposition immediately without an animation. + * + * @return {Void} + */ +scrollerFactory.prototype.toEnd = function (item, immediate) { + this.to('end', item, immediate); +}; + +/** + * Animate element or the whole SLIDEE to the center of the frame. + * + * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. + * @param {Bool} immediate Reposition immediately without an animation. + * + * @return {Void} + */ +scrollerFactory.prototype.toCenter = function (item, immediate) { + this.to('center', item, immediate); +}; + +scrollerFactory.create = function (frame, options) { + var instance = new scrollerFactory(frame, options); + return Promise.resolve(instance); +}; + +export default scrollerFactory; diff --git a/src/manifest.json b/src/manifest.json index fed1177e24..5b5ecd5516 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,6 +1,6 @@ { "name": "Jellyfin", - "description": "Jellyfin: the Free Software Media System.", + "description": "The Free Software Media System", "lang": "en-US", "short_name": "Jellyfin", "start_url": "index.html#!/home.html", diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js index be5beb98ed..415bd7b958 100644 --- a/src/plugins/bookPlayer/plugin.js +++ b/src/plugins/bookPlayer/plugin.js @@ -2,6 +2,7 @@ import connectionManager from 'connectionManager'; import loading from 'loading'; import keyboardnavigation from 'keyboardnavigation'; import dialogHelper from 'dialogHelper'; +import dom from 'dom'; import events from 'events'; import 'css!./style'; import 'material-icons'; @@ -26,16 +27,16 @@ export class BookPlayer { this._loaded = false; loading.show(); - let elem = this.createMediaElement(); + const elem = this.createMediaElement(); return this.setCurrentSrc(elem, options); } stop() { this.unbindEvents(); - let elem = this._mediaElement; - let tocElement = this._tocElement; - let rendition = this._rendition; + const elem = this._mediaElement; + const tocElement = this._tocElement; + const rendition = this._rendition; if (elem) { dialogHelper.close(elem); @@ -92,24 +93,23 @@ export class BookPlayer { } onWindowKeyUp(e) { - let key = keyboardnavigation.getKeyName(e); - let rendition = this._rendition; - let book = rendition.book; + const key = keyboardnavigation.getKeyName(e); + // TODO: depending on the event this can be the document or the rendition itself + const rendition = this._rendition || this; + const book = rendition.book; + + if (this._loaded === false) return; switch (key) { case 'l': case 'ArrowRight': case 'Right': - if (this._loaded) { - book.package.metadata.direction === 'rtl' ? rendition.prev() : rendition.next(); - } + book.package.metadata.direction === 'rtl' ? rendition.prev() : rendition.next(); break; case 'j': case 'ArrowLeft': case 'Left': - if (this._loaded) { - book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev(); - } + book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev(); break; case 'Escape': if (this._tocElement) { @@ -123,12 +123,32 @@ export class BookPlayer { } } + onTouchStart(e) { + // TODO: depending on the event this can be the document or the rendition itself + const rendition = this._rendition || this; + const book = rendition.book; + + // check that the event is from the book or the document + if (!book || this._loaded === false) return; + + // epubjs stores pages off the screen or something for preloading + // get the modulus of the touch event to account for the increased width + if (!e.touches || e.touches.length === 0) return; + + const touch = e.touches[0].clientX % dom.getWindowSize().innerWidth; + if (touch < dom.getWindowSize().innerWidth / 2) { + book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev(); + } else { + book.package.metadata.direction === 'rtl' ? rendition.prev() : rendition.next(); + } + } + onDialogClosed() { this.stop(); } bindMediaElementEvents() { - let elem = this._mediaElement; + const elem = this._mediaElement; elem.addEventListener('close', this.onDialogClosed, {once: true}); elem.querySelector('.btnBookplayerExit').addEventListener('click', this.onDialogClosed, {once: true}); @@ -139,12 +159,15 @@ export class BookPlayer { this.bindMediaElementEvents(); document.addEventListener('keyup', this.onWindowKeyUp); + document.addEventListener('touchstart', this.onTouchStart); + // FIXME: I don't really get why document keyup event is not triggered when epub is in focus this._rendition.on('keyup', this.onWindowKeyUp); + this._rendition.on('touchstart', this.onTouchStart); } unbindMediaElementEvents() { - let elem = this._mediaElement; + const elem = this._mediaElement; elem.removeEventListener('close', this.onDialogClosed); elem.querySelector('.btnBookplayerExit').removeEventListener('click', this.onDialogClosed); @@ -155,9 +178,13 @@ export class BookPlayer { if (this._mediaElement) { this.unbindMediaElementEvents(); } + document.removeEventListener('keyup', this.onWindowKeyUp); + document.removeEventListener('touchstart', this.onTouchStart); + if (this._rendition) { this._rendition.off('keyup', this.onWindowKeyUp); + this._rendition.off('touchstart', this.onTouchStart); } } @@ -169,13 +196,11 @@ export class BookPlayer { createMediaElement() { let elem = this._mediaElement; - if (elem) { return elem; } elem = document.getElementById('bookPlayer'); - if (!elem) { elem = dialogHelper.createDialog({ exitAnimationDuration: 400, @@ -185,6 +210,7 @@ export class BookPlayer { exitAnimation: 'fadeout', removeOnClose: true }); + elem.id = 'bookPlayer'; let html = ''; @@ -206,7 +232,7 @@ export class BookPlayer { } setCurrentSrc(elem, options) { - let item = options.items[0]; + const item = options.items[0]; this._currentItem = item; this.streamInfo = { started: true, @@ -216,24 +242,25 @@ export class BookPlayer { } }; - let serverId = item.ServerId; - let apiClient = connectionManager.getApiClient(serverId); + const serverId = item.ServerId; + const apiClient = connectionManager.getApiClient(serverId); return new Promise((resolve, reject) => { import('epubjs').then(({default: epubjs}) => { - let downloadHref = apiClient.getItemDownloadUrl(item.Id); - let book = epubjs(downloadHref, {openAs: 'epub'}); - let rendition = book.renderTo(elem, {width: '100%', height: '97%'}); + const downloadHref = apiClient.getItemDownloadUrl(item.Id); + const book = epubjs(downloadHref, {openAs: 'epub'}); + const rendition = book.renderTo(elem, {width: '100%', height: '97%'}); this._currentSrc = downloadHref; this._rendition = rendition; - let cancellationToken = { + const cancellationToken = { shouldCancel: false }; + this._cancellationToken = cancellationToken; return rendition.display().then(() => { - let epubElem = document.querySelector('.epub-container'); + const epubElem = document.querySelector('.epub-container'); epubElem.style.display = 'none'; this.bindEvents(); @@ -253,7 +280,6 @@ export class BookPlayer { epubElem.style.display = 'block'; rendition.on('relocated', (locations) => { this._progress = book.locations.percentageFromCfi(locations.start.cfi); - events.trigger(this, 'timeupdate'); }); @@ -262,7 +288,7 @@ export class BookPlayer { return resolve(); }); }, () => { - console.error('Failed to display epub'); + console.error('failed to display epub'); return reject(); }); }); diff --git a/src/plugins/bookPlayer/tableOfContents.js b/src/plugins/bookPlayer/tableOfContents.js index 23e288aff5..a1c5d8f220 100644 --- a/src/plugins/bookPlayer/tableOfContents.js +++ b/src/plugins/bookPlayer/tableOfContents.js @@ -11,7 +11,7 @@ export default class TableOfContents { } destroy() { - let elem = this._elem; + const elem = this._elem; if (elem) { this.unbindEvents(); dialogHelper.close(elem); @@ -21,14 +21,14 @@ export default class TableOfContents { } bindEvents() { - let elem = this._elem; + const elem = this._elem; elem.addEventListener('close', this.onDialogClosed, {once: true}); elem.querySelector('.btnBookplayerTocClose').addEventListener('click', this.onDialogClosed, {once: true}); } unbindEvents() { - let elem = this._elem; + const elem = this._elem; elem.removeEventListener('close', this.onDialogClosed); elem.querySelector('.btnBookplayerTocClose').removeEventListener('click', this.onDialogClosed); @@ -39,10 +39,10 @@ export default class TableOfContents { } replaceLinks(contents, f) { - let links = contents.querySelectorAll('a[href]'); + const links = contents.querySelectorAll('a[href]'); links.forEach((link) => { - let href = link.getAttribute('href'); + const href = link.getAttribute('href'); link.onclick = () => { f(href); @@ -52,9 +52,9 @@ export default class TableOfContents { } createMediaElement() { - let rendition = this._rendition; + const rendition = this._rendition; - let elem = dialogHelper.createDialog({ + const elem = dialogHelper.createDialog({ size: 'small', autoFocus: false, removeOnClose: true @@ -69,7 +69,7 @@ export default class TableOfContents { rendition.book.navigation.forEach((chapter) => { tocHtml += '
  • '; // Remove '../' from href - let link = chapter.href.startsWith('../') ? chapter.href.substr(3) : chapter.href; + const link = chapter.href.startsWith('../') ? chapter.href.substr(3) : chapter.href; tocHtml += `${chapter.label}`; tocHtml += '
  • '; }); @@ -78,7 +78,7 @@ export default class TableOfContents { elem.innerHTML = tocHtml; this.replaceLinks(elem, (href) => { - let relative = rendition.book.path.relative(href); + const relative = rendition.book.path.relative(href); rendition.display(relative); this.destroy(); }); diff --git a/src/plugins/chromecastPlayer/chromecastHelper.js b/src/plugins/chromecastPlayer/chromecastHelper.js new file mode 100644 index 0000000000..7aac76c544 --- /dev/null +++ b/src/plugins/chromecastPlayer/chromecastHelper.js @@ -0,0 +1,229 @@ +import events from 'events'; + +// LinkParser +// +// https://github.com/ravisorg/LinkParser +// +// Locate and extract almost any URL within a string. Handles protocol-less domains, IPv4 and +// IPv6, unrecognised TLDs, and more. +// +// This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. +// http://creativecommons.org/licenses/by-sa/4.0/ +(function () { + // Original URL regex from the Android android.text.util.Linkify function, found here: + // http://stackoverflow.com/a/19696443 + // + // However there were problems with it, most probably related to the fact it was + // written in 2007, and it's been highly modified. + // + // 1) I didn't like the fact that it was tied to specific TLDs, since new ones + // are being added all the time it wouldn't be reasonable to expect developer to + // be continually updating their regular expressions. + // + // 2) It didn't allow unicode characters in the domains which are now allowed in + // many languages, (including some IDN TLDs). Again these are constantly being + // added to and it doesn't seem reasonable to hard-code them. Note this ended up + // not being possible in standard JS due to the way it handles multibyte strings. + // It is possible using XRegExp, however a big performance hit results. Disabled + // for now. + // + // 3) It didn't allow for IPv6 hostnames + // IPv6 regex from http://stackoverflow.com/a/17871737 + // + // 4) It was very poorly commented + // + // 5) It wasn't as smart as it could have been about what should be part of a + // URL and what should be part of human language. + + const protocols = '(?:(?:http|https|rtsp|ftp):\\/\\/)'; + const credentials = "(?:(?:[a-z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-f0-9]{2})){1,64}" // username (1-64 normal or url escaped characters) + + "(?:\\:(?:[a-z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-f0-9]{2})){1,25})?" // followed by optional password (: + 1-25 normal or url escaped characters) + + '\\@)'; + + // IPv6 Regex http://forums.intermapper.com/viewtopic.php?t=452 + // by Dartware, LLC is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License + // http://intermapper.com/ + const ipv6 = '(' + + '(([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))' + + '|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))' + + '|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))' + + '|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' + + '|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' + + '|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' + + '|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' + + '|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' + + ')(%.+)?'; + + const ipv4 = '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.' + + '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.' + + '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.' + + '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])'; + + // This would have been a lot cleaner if JS RegExp supported conditionals... + const linkRegExpString = + + // begin match for protocol / username / password / host + '(?:' + + // ============================ + // If we have a recognized protocol at the beginning of the URL, we're + // more relaxed about what we accept, because we assume the user wants + // this to be a URL, and we're not accidentally matching human language + + protocols + '?' + + // optional username:password@ + + credentials + '?' + + // IP address (both v4 and v6) + + '(?:' + + // IPv6 + + ipv6 + + // IPv4 + + '|' + ipv4 + + + ')' + + // end match for protocol / username / password / host + + ')' + + // optional port number + + '(?:\\:\\d{1,5})?' + + // plus optional path and query params (no unicode allowed here?) + + '(?:' + + '\\/(?:' + // some characters we'll accept because it's unlikely human language + // would use them after a URL unless they were part of the url + + '(?:[a-z0-9\\/\\@\\&\\#\\~\\*\\_\\-\\+])' + + '|(?:\\%[a-f0-9]{2})' + // some characters are much more likely to be used AFTER a url and + // were not intended to be included in the url itself. Mostly end + // of sentence type things. It's also likely that the URL would + // still work if any of these characters were missing from the end + // because we parsed it incorrectly. For these characters to be accepted + // they must be followed by another character that we're reasonably + // sure is part of the url + + "|(?:[\\;\\?\\:\\.\\!\\'\\(\\)\\,\\=]+(?=(?:[a-z0-9\\/\\@\\&\\#\\~\\*\\_\\-\\+])|(?:\\%[a-f0-9]{2})))" + + ')*' + + '|\\b|\$' + + ')'; + + // regex = XRegExp(regex,'gi'); + const linkRegExp = RegExp(linkRegExpString, 'gi'); + + const protocolRegExp = RegExp('^' + protocols, 'i'); + + // if url doesn't begin with a known protocol, add http by default + function ensureProtocol(url) { + if (!url.match(protocolRegExp)) { + url = 'http://' + url; + } + return url; + } + + // look for links in the text + const LinkParser = { + parse: function (text) { + const links = []; + let match; + + // eslint-disable-next-line no-cond-assign + while (match = linkRegExp.exec(text)) { + console.debug(match); + const txt = match[0]; + const pos = match.index; + const len = txt.length; + const url = ensureProtocol(text); + links.push({ 'pos': pos, 'text': txt, 'len': len, 'url': url }); + } + + return links; + } + + }; + + window.LinkParser = LinkParser; +})(); + +let cache = {}; + +// TODO: Replace with isIP (https://www.npmjs.com/package/is-ip) +function isValidIpAddress(address) { + const links = LinkParser.parse(address); + + return links.length == 1; +} + +// TODO: Add IPv6 support. Potentially replace with isLocalhost (https://www.npmjs.com/package/is-localhost-ip) +function isLocalIpAddress(address) { + address = address.toLowerCase(); + + if (address.includes('127.0.0.1')) { + return true; + } + if (address.includes('localhost')) { + return true; + } + + return false; +} + +export function getServerAddress(apiClient) { + const serverAddress = apiClient.serverAddress(); + + if (isValidIpAddress(serverAddress) && !isLocalIpAddress(serverAddress)) { + return Promise.resolve(serverAddress); + } + + const cachedValue = getCachedValue(serverAddress); + if (cachedValue) { + return Promise.resolve(cachedValue); + } + + return apiClient.getEndpointInfo().then(function (endpoint) { + if (endpoint.IsInNetwork) { + return apiClient.getPublicSystemInfo().then(function (info) { + let localAddress = info.LocalAddress; + if (!localAddress) { + console.debug('No valid local address returned, defaulting to external one'); + localAddress = serverAddress; + } + addToCache(serverAddress, localAddress); + return localAddress; + }); + } else { + addToCache(serverAddress, serverAddress); + return serverAddress; + } + }); +} + +function clearCache() { + cache = {}; +} + +function addToCache(key, value) { + cache[key] = { + value: value, + time: new Date().getTime() + }; +} + +function getCachedValue(key) { + const obj = cache[key]; + + if (obj && (new Date().getTime() - obj.time) < 180000) { + return obj.value; + } + + return null; +} + +events.on(ConnectionManager, 'localusersignedin', clearCache); +events.on(ConnectionManager, 'localusersignedout', clearCache); + +export default { + getServerAddress: getServerAddress +}; diff --git a/src/plugins/chromecastPlayer/chromecastHelpers.js b/src/plugins/chromecastPlayer/chromecastHelpers.js deleted file mode 100644 index 3fbff5507b..0000000000 --- a/src/plugins/chromecastPlayer/chromecastHelpers.js +++ /dev/null @@ -1,229 +0,0 @@ -define(['events'], function (events) { - 'use strict'; - - // LinkParser - // - // https://github.com/ravisorg/LinkParser - // - // Locate and extract almost any URL within a string. Handles protocol-less domains, IPv4 and - // IPv6, unrecognised TLDs, and more. - // - // This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - // http://creativecommons.org/licenses/by-sa/4.0/ - (function () { - // Original URL regex from the Android android.text.util.Linkify function, found here: - // http://stackoverflow.com/a/19696443 - // - // However there were problems with it, most probably related to the fact it was - // written in 2007, and it's been highly modified. - // - // 1) I didn't like the fact that it was tied to specific TLDs, since new ones - // are being added all the time it wouldn't be reasonable to expect developer to - // be continually updating their regular expressions. - // - // 2) It didn't allow unicode characters in the domains which are now allowed in - // many languages, (including some IDN TLDs). Again these are constantly being - // added to and it doesn't seem reasonable to hard-code them. Note this ended up - // not being possible in standard JS due to the way it handles multibyte strings. - // It is possible using XRegExp, however a big performance hit results. Disabled - // for now. - // - // 3) It didn't allow for IPv6 hostnames - // IPv6 regex from http://stackoverflow.com/a/17871737 - // - // 4) It was very poorly commented - // - // 5) It wasn't as smart as it could have been about what should be part of a - // URL and what should be part of human language. - - var protocols = '(?:(?:http|https|rtsp|ftp):\\/\\/)'; - var credentials = "(?:(?:[a-z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-f0-9]{2})){1,64}" // username (1-64 normal or url escaped characters) - + "(?:\\:(?:[a-z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-f0-9]{2})){1,25})?" // followed by optional password (: + 1-25 normal or url escaped characters) - + '\\@)'; - - // IPv6 Regex http://forums.intermapper.com/viewtopic.php?t=452 - // by Dartware, LLC is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License - // http://intermapper.com/ - var ipv6 = '(' - + '(([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))' - + '|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))' - + '|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))' - + '|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' - + '|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' - + '|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' - + '|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' - + '|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' - + ')(%.+)?'; - - var ipv4 = '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.' - + '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.' - + '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.' - + '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])'; - - // This would have been a lot cleaner if JS RegExp supported conditionals... - var linkRegExpString = - - // begin match for protocol / username / password / host - '(?:' - - // ============================ - // If we have a recognized protocol at the beginning of the URL, we're - // more relaxed about what we accept, because we assume the user wants - // this to be a URL, and we're not accidentally matching human language - + protocols + '?' - - // optional username:password@ - + credentials + '?' - - // IP address (both v4 and v6) - + '(?:' - - // IPv6 - + ipv6 - - // IPv4 - + '|' + ipv4 - - + ')' - - // end match for protocol / username / password / host - + ')' - - // optional port number - + '(?:\\:\\d{1,5})?' - - // plus optional path and query params (no unicode allowed here?) - + '(?:' - + '\\/(?:' - // some characters we'll accept because it's unlikely human language - // would use them after a URL unless they were part of the url - + '(?:[a-z0-9\\/\\@\\&\\#\\~\\*\\_\\-\\+])' - + '|(?:\\%[a-f0-9]{2})' - // some characters are much more likely to be used AFTER a url and - // were not intended to be included in the url itself. Mostly end - // of sentence type things. It's also likely that the URL would - // still work if any of these characters were missing from the end - // because we parsed it incorrectly. For these characters to be accepted - // they must be followed by another character that we're reasonably - // sure is part of the url - + "|(?:[\\;\\?\\:\\.\\!\\'\\(\\)\\,\\=]+(?=(?:[a-z0-9\\/\\@\\&\\#\\~\\*\\_\\-\\+])|(?:\\%[a-f0-9]{2})))" - + ')*' - + '|\\b|\$' - + ')'; - - // regex = XRegExp(regex,'gi'); - var linkRegExp = RegExp(linkRegExpString, 'gi'); - - var protocolRegExp = RegExp('^' + protocols, 'i'); - - // if url doesn't begin with a known protocol, add http by default - function ensureProtocol(url) { - if (!url.match(protocolRegExp)) { - url = 'http://' + url; - } - return url; - } - - // look for links in the text - var LinkParser = { - parse: function (text) { - var links = []; - var match; - - // eslint-disable-next-line no-cond-assign - while (match = linkRegExp.exec(text)) { - console.debug(match); - var txt = match[0]; - var pos = match.index; - var len = txt.length; - var url = ensureProtocol(text); - links.push({ 'pos': pos, 'text': txt, 'len': len, 'url': url }); - } - - return links; - } - - }; - - window.LinkParser = LinkParser; - })(); - - var cache = {}; - - function isValidIpAddress(address) { - var links = LinkParser.parse(address); - - return links.length == 1; - } - - function isLocalIpAddress(address) { - address = address.toLowerCase(); - - if (address.indexOf('127.0.0.1') !== -1) { - return true; - } - if (address.indexOf('localhost') !== -1) { - return true; - } - - return false; - } - - function getServerAddress(apiClient) { - var serverAddress = apiClient.serverAddress(); - - if (isValidIpAddress(serverAddress) && !isLocalIpAddress(serverAddress)) { - return Promise.resolve(serverAddress); - } - - var cachedValue = getCachedValue(serverAddress); - if (cachedValue) { - return Promise.resolve(cachedValue); - } - - return apiClient.getEndpointInfo().then(function (endpoint) { - if (endpoint.IsInNetwork) { - return apiClient.getPublicSystemInfo().then(function (info) { - var localAddress = info.LocalAddress; - if (!localAddress) { - console.debug('No valid local address returned, defaulting to external one'); - localAddress = serverAddress; - } - addToCache(serverAddress, localAddress); - return localAddress; - }); - } else { - addToCache(serverAddress, serverAddress); - return serverAddress; - } - }); - } - - function clearCache() { - cache = {}; - } - - function addToCache(key, value) { - cache[key] = { - value: value, - time: new Date().getTime() - }; - } - - function getCachedValue(key) { - var obj = cache[key]; - - if (obj && (new Date().getTime() - obj.time) < 180000) { - return obj.value; - } - - return null; - } - - events.on(ConnectionManager, 'localusersignedin', clearCache); - events.on(ConnectionManager, 'localusersignedout', clearCache); - - return { - getServerAddress: getServerAddress - }; -}); diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index f4acc6d8b3..5ba8596089 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -1,64 +1,71 @@ -define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', 'globalize', 'events', 'require', 'castSenderApiLoader'], function (appSettings, userSettings, playbackManager, connectionManager, globalize, events, require, castSenderApiLoader) { - 'use strict'; +import appSettings from 'appSettings'; +import * as userSettings from 'userSettings'; +import playbackManager from 'playbackManager'; +import connectionManager from 'connectionManager'; +import globalize from 'globalize'; +import events from 'events'; +import castSenderApiLoader from 'castSenderApiLoader'; - // Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js - var currentResolve; - var currentReject; +// Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js - var PlayerName = 'Google Cast'; +let currentResolve; +let currentReject; - function sendConnectionResult(isOk) { - var resolve = currentResolve; - var reject = currentReject; +const PlayerName = 'Google Cast'; - currentResolve = null; - currentReject = null; +function sendConnectionResult(isOk) { + const resolve = currentResolve; + const reject = currentReject; - if (isOk) { - if (resolve) { - resolve(); - } + currentResolve = null; + currentReject = null; + + if (isOk) { + if (resolve) { + resolve(); + } + } else { + if (reject) { + reject(); } else { - if (reject) { - reject(); - } else { - playbackManager.removeActivePlayer(PlayerName); - } + playbackManager.removeActivePlayer(PlayerName); } } +} - /** - * Constants of states for Chromecast device - **/ - var DEVICE_STATE = { - 'IDLE': 0, - 'ACTIVE': 1, - 'WARNING': 2, - 'ERROR': 3 - }; +/** + * Constants of states for Chromecast device + **/ +const DEVICE_STATE = { + 'IDLE': 0, + 'ACTIVE': 1, + 'WARNING': 2, + 'ERROR': 3 +}; - /** - * Constants of states for CastPlayer - **/ - var PLAYER_STATE = { - 'IDLE': 'IDLE', - 'LOADING': 'LOADING', - 'LOADED': 'LOADED', - 'PLAYING': 'PLAYING', - 'PAUSED': 'PAUSED', - 'STOPPED': 'STOPPED', - 'SEEKING': 'SEEKING', - 'ERROR': 'ERROR' - }; +/** + * Constants of states for CastPlayer + **/ +const PLAYER_STATE = { + 'IDLE': 'IDLE', + 'LOADING': 'LOADING', + 'LOADED': 'LOADED', + 'PLAYING': 'PLAYING', + 'PAUSED': 'PAUSED', + 'STOPPED': 'STOPPED', + 'SEEKING': 'SEEKING', + 'ERROR': 'ERROR' +}; - // production version registered with google - // replace this value if you want to test changes on another instance - var applicationStable = 'F007D354'; - var applicationUnstable = '6F511C87'; +// production version registered with google +// replace this value if you want to test changes on another instance +const applicationStable = 'F007D354'; +const applicationUnstable = '6F511C87'; - var messageNamespace = 'urn:x-cast:com.connectsdk'; +const messageNamespace = 'urn:x-cast:com.connectsdk'; - var CastPlayer = function () { +class CastPlayer { + constructor() { /* device variables */ // @type {DEVICE_STATE} A state for device this.deviceState = DEVICE_STATE.IDLE; @@ -79,7 +86,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' this.mediaStatusUpdateHandler = this.onMediaStatusUpdate.bind(this); this.initializeCastPlayer(); - }; + } /** * Initialize Cast media player @@ -87,8 +94,8 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * invoked once the API has finished initialization. The sessionListener and * receiverListener may be invoked at any time afterwards, and possibly more than once. */ - CastPlayer.prototype.initializeCastPlayer = function () { - var chrome = window.chrome; + initializeCastPlayer() { + const chrome = window.chrome; if (!chrome) { return; } @@ -98,35 +105,35 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' return; } - var applicationID = applicationStable; + let applicationID = applicationStable; if (userSettings.chromecastVersion() === 'unstable') { applicationID = applicationUnstable; } // request session - var sessionRequest = new chrome.cast.SessionRequest(applicationID); - var apiConfig = new chrome.cast.ApiConfig(sessionRequest, + const sessionRequest = new chrome.cast.SessionRequest(applicationID); + const apiConfig = new chrome.cast.ApiConfig(sessionRequest, this.sessionListener.bind(this), this.receiverListener.bind(this)); console.debug('chromecast.initialize'); chrome.cast.initialize(apiConfig, this.onInitSuccess.bind(this), this.errorHandler); - }; + } /** * Callback function for init success */ - CastPlayer.prototype.onInitSuccess = function () { + onInitSuccess() { this.isInitialized = true; console.debug('chromecast init success'); - }; + } /** * Generic error callback function */ - CastPlayer.prototype.onError = function () { + onError() { console.debug('chromecast error'); - }; + } /** * @param {!Object} e A new session @@ -135,7 +142,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * join existing session and occur in Cast mode and media * status gets synced up with current media of the session */ - CastPlayer.prototype.sessionListener = function (e) { + sessionListener(e) { this.session = e; if (this.session) { if (this.session.media[0]) { @@ -144,24 +151,15 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' this.onSessionConnected(e); } - }; - - function alertText(text, title) { - require(['alert'], function (alert) { - alert.default({ - text: text, - title: title - }); - }); } - CastPlayer.prototype.messageListener = function (namespace, message) { + messageListener(namespace, message) { if (typeof (message) === 'string') { message = JSON.parse(message); } if (message.type === 'playbackerror') { - var errorCode = message.data; + const errorCode = message.data; setTimeout(function () { alertText(globalize.translate('MessagePlaybackError' + errorCode), globalize.translate('HeaderPlaybackError')); }, 300); @@ -172,14 +170,14 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' } else if (message.type) { events.trigger(this, message.type, [message.data]); } - }; + } /** * @param {string} e Receiver availability * This indicates availability of receivers but * does not provide a list of device IDs */ - CastPlayer.prototype.receiverListener = function (e) { + receiverListener(e) { if (e === 'available') { console.debug('chromecast receiver found'); this.hasReceivers = true; @@ -187,12 +185,12 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' console.debug('chromecast receiver list empty'); this.hasReceivers = false; } - }; + } /** * session update listener */ - CastPlayer.prototype.sessionUpdateListener = function (isAlive) { + sessionUpdateListener(isAlive) { if (isAlive) { console.debug('sessionUpdateListener: already alive'); } else { @@ -207,28 +205,28 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' sendConnectionResult(false); } - }; + } /** * Requests that a receiver application session be created or joined. By default, the SessionRequest * passed to the API at initialization time is used; this may be overridden by passing a different * session request in opt_sessionRequest. */ - CastPlayer.prototype.launchApp = function () { + launchApp() { console.debug('chromecast launching app...'); chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this), this.onLaunchError.bind(this)); - }; + } /** * Callback function for request session success * @param {Object} e A chrome.cast.Session object */ - CastPlayer.prototype.onRequestSessionSuccess = function (e) { + onRequestSessionSuccess(e) { console.debug('chromecast session success: ' + e.sessionId); this.onSessionConnected(e); - }; + } - CastPlayer.prototype.onSessionConnected = function (session) { + onSessionConnected(session) { this.session = session; this.deviceState = DEVICE_STATE.ACTIVE; @@ -244,46 +242,38 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' options: {}, command: 'Identify' }); - }; - - function onVolumeUpKeyDown() { - playbackManager.volumeUp(); - } - - function onVolumeDownKeyDown() { - playbackManager.volumeDown(); } /** * session update listener */ - CastPlayer.prototype.sessionMediaListener = function (e) { + sessionMediaListener(e) { this.currentMediaSession = e; this.currentMediaSession.addUpdateListener(this.mediaStatusUpdateHandler); - }; + } /** * Callback function for launch error */ - CastPlayer.prototype.onLaunchError = function () { + onLaunchError() { console.debug('chromecast launch error'); this.deviceState = DEVICE_STATE.ERROR; sendConnectionResult(false); - }; + } /** * Stops the running receiver application associated with the session. */ - CastPlayer.prototype.stopApp = function () { + stopApp() { if (this.session) { this.session.stop(this.onStopAppSuccess.bind(this, 'Session stopped'), this.errorHandler); } - }; + } /** * Callback function for stop app success */ - CastPlayer.prototype.onStopAppSuccess = function (message) { + onStopAppSuccess(message) { console.debug(message); this.deviceState = DEVICE_STATE.IDLE; @@ -292,13 +282,13 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' document.removeEventListener('volumedownbutton', onVolumeDownKeyDown, false); this.currentMediaSession = null; - }; + } /** * Loads media into a running receiver application * @param {Number} mediaIndex An index number to indicate current media content */ - CastPlayer.prototype.loadMedia = function (options, command) { + loadMedia(options, command) { if (!this.session) { console.debug('no session'); return Promise.reject(); @@ -320,20 +310,20 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' options: options, command: command }); - }; + } - CastPlayer.prototype.sendMessage = function (message) { - var player = this; + sendMessage(message) { + const player = this; - var receiverName = null; + let receiverName = null; - var session = player.session; + const session = player.session; if (session && session.receiver && session.receiver.friendlyName) { receiverName = session.receiver.friendlyName; } - var apiClient; + let apiClient; if (message.options && message.options.ServerId) { apiClient = connectionManager.getApiClient(message.options.ServerId); } else if (message.options && message.options.items && message.options.items.length) { @@ -352,7 +342,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' receiverName: receiverName }); - var bitrateSetting = appSettings.maxChromecastBitrate(); + const bitrateSetting = appSettings.maxChromecastBitrate(); if (bitrateSetting) { message.maxBitrate = bitrateSetting; } @@ -363,31 +353,31 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' } return new Promise(function (resolve, reject) { - require(['chromecastHelper'], function (chromecastHelper) { + import('./chromecastHelper').then(({ default: chromecastHelper }) => { chromecastHelper.getServerAddress(apiClient).then(function (serverAddress) { message.serverAddress = serverAddress; player.sendMessageInternal(message).then(resolve, reject); }, reject); }); }); - }; + } - CastPlayer.prototype.sendMessageInternal = function (message) { + sendMessageInternal(message) { message = JSON.stringify(message); this.session.sendMessage(messageNamespace, message, this.onPlayCommandSuccess.bind(this), this.errorHandler); return Promise.resolve(); - }; + } - CastPlayer.prototype.onPlayCommandSuccess = function () { + onPlayCommandSuccess() { console.debug('Message was sent to receiver ok.'); - }; + } /** * Callback function for loadMedia success * @param {Object} mediaSession A new media object. */ - CastPlayer.prototype.onMediaDiscovered = function (how, mediaSession) { + onMediaDiscovered(how, mediaSession) { console.debug('chromecast new media session ID:' + mediaSession.mediaSessionId + ' (' + how + ')'); this.currentMediaSession = mediaSession; @@ -400,24 +390,24 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' } this.currentMediaSession.addUpdateListener(this.mediaStatusUpdateHandler); - }; + } /** * Callback function for media status update from receiver * @param {!Boolean} e true/false */ - CastPlayer.prototype.onMediaStatusUpdate = function (e) { + onMediaStatusUpdate(e) { console.debug('chromecast updating media: ' + e); if (e === false) { this.castPlayerState = PLAYER_STATE.IDLE; } - }; + } /** * Set media volume in Cast mode * @param {Boolean} mute A boolean */ - CastPlayer.prototype.setReceiverVolume = function (mute, vol) { + setReceiverVolume(mute, vol) { if (!this.currentMediaSession) { console.debug('this.currentMediaSession is null'); return; @@ -432,142 +422,161 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' this.mediaCommandSuccessCallback.bind(this), this.errorHandler); } - }; + } /** * Mute CC */ - CastPlayer.prototype.mute = function () { + mute() { this.setReceiverVolume(true); - }; + } /** * Callback function for media command success */ - CastPlayer.prototype.mediaCommandSuccessCallback = function (info, e) { + mediaCommandSuccessCallback(info, e) { console.debug(info); - }; + } +} - function normalizeImages(state) { - if (state && state.NowPlayingItem) { - var item = state.NowPlayingItem; +function alertText(text, title) { + import('alert').then(({default: alert}) => { + alert({ + text: text, + title: title + }); + }); +} - if (!item.ImageTags || !item.ImageTags.Primary) { - if (item.PrimaryImageTag) { - item.ImageTags = item.ImageTags || {}; - item.ImageTags.Primary = item.PrimaryImageTag; - } - } - if (item.BackdropImageTag && item.BackdropItemId === item.Id) { - item.BackdropImageTags = [item.BackdropImageTag]; - } - if (item.BackdropImageTag && item.BackdropItemId !== item.Id) { - item.ParentBackdropImageTags = [item.BackdropImageTag]; - item.ParentBackdropItemId = item.BackdropItemId; +function onVolumeUpKeyDown() { + playbackManager.volumeUp(); +} + +function onVolumeDownKeyDown() { + playbackManager.volumeDown(); +} + +function normalizeImages(state) { + if (state && state.NowPlayingItem) { + const item = state.NowPlayingItem; + + if (!item.ImageTags || !item.ImageTags.Primary) { + if (item.PrimaryImageTag) { + item.ImageTags = item.ImageTags || {}; + item.ImageTags.Primary = item.PrimaryImageTag; } } + if (item.BackdropImageTag && item.BackdropItemId === item.Id) { + item.BackdropImageTags = [item.BackdropImageTag]; + } + if (item.BackdropImageTag && item.BackdropItemId !== item.Id) { + item.ParentBackdropImageTags = [item.BackdropImageTag]; + item.ParentBackdropItemId = item.BackdropItemId; + } } +} - function getItemsForPlayback(apiClient, query) { - var userId = apiClient.getCurrentUserId(); +function getItemsForPlayback(apiClient, query) { + const userId = apiClient.getCurrentUserId(); - if (query.Ids && query.Ids.split(',').length === 1) { - return apiClient.getItem(userId, query.Ids.split(',')).then(function (item) { - return { - Items: [item], - TotalRecordCount: 1 - }; - }); + if (query.Ids && query.Ids.split(',').length === 1) { + return apiClient.getItem(userId, query.Ids.split(',')).then(function (item) { + return { + Items: [item], + TotalRecordCount: 1 + }; + }); + } else { + query.Limit = query.Limit || 100; + query.ExcludeLocationTypes = 'Virtual'; + query.EnableTotalRecordCount = false; + + return apiClient.getItems(userId, query); + } +} + +function bindEventForRelay(instance, eventName) { + events.on(instance._castPlayer, eventName, function (e, data) { + console.debug('cc: ' + eventName); + const state = instance.getPlayerStateInternal(data); + + events.trigger(instance, eventName, [state]); + }); +} + +function initializeChromecast() { + const instance = this; + instance._castPlayer = new CastPlayer(); + + // To allow the native android app to override + document.dispatchEvent(new CustomEvent('chromecastloaded', { + detail: { + player: instance + } + })); + + events.on(instance._castPlayer, 'connect', function (e) { + if (currentResolve) { + sendConnectionResult(true); } else { - query.Limit = query.Limit || 100; - query.ExcludeLocationTypes = 'Virtual'; - query.EnableTotalRecordCount = false; - - return apiClient.getItems(userId, query); + playbackManager.setActivePlayer(PlayerName, instance.getCurrentTargetInfo()); } - } - function bindEventForRelay(instance, eventName) { - events.on(instance._castPlayer, eventName, function (e, data) { - console.debug('cc: ' + eventName); - var state = instance.getPlayerStateInternal(data); + console.debug('cc: connect'); + // Reset this so that statechange will fire + instance.lastPlayerData = null; + }); - events.trigger(instance, eventName, [state]); - }); - } + events.on(instance._castPlayer, 'playbackstart', function (e, data) { + console.debug('cc: playbackstart'); - function initializeChromecast() { - var instance = this; - instance._castPlayer = new CastPlayer(); + instance._castPlayer.initializeCastPlayer(); - // To allow the native android app to override - document.dispatchEvent(new CustomEvent('chromecastloaded', { - detail: { - player: instance - } - })); + const state = instance.getPlayerStateInternal(data); + events.trigger(instance, 'playbackstart', [state]); + }); - events.on(instance._castPlayer, 'connect', function (e) { - if (currentResolve) { - sendConnectionResult(true); - } else { - playbackManager.setActivePlayer(PlayerName, instance.getCurrentTargetInfo()); - } + events.on(instance._castPlayer, 'playbackstop', function (e, data) { + console.debug('cc: playbackstop'); + let state = instance.getPlayerStateInternal(data); - console.debug('cc: connect'); - // Reset this so that statechange will fire - instance.lastPlayerData = null; - }); + events.trigger(instance, 'playbackstop', [state]); - events.on(instance._castPlayer, 'playbackstart', function (e, data) { - console.debug('cc: playbackstart'); + state = instance.lastPlayerData.PlayState || {}; + const volume = state.VolumeLevel || 0.5; + const mute = state.IsMuted || false; - instance._castPlayer.initializeCastPlayer(); + // Reset this so the next query doesn't make it appear like content is playing. + instance.lastPlayerData = {}; + instance.lastPlayerData.PlayState = {}; + instance.lastPlayerData.PlayState.VolumeLevel = volume; + instance.lastPlayerData.PlayState.IsMuted = mute; + }); - var state = instance.getPlayerStateInternal(data); - events.trigger(instance, 'playbackstart', [state]); - }); + events.on(instance._castPlayer, 'playbackprogress', function (e, data) { + console.debug('cc: positionchange'); + const state = instance.getPlayerStateInternal(data); - events.on(instance._castPlayer, 'playbackstop', function (e, data) { - console.debug('cc: playbackstop'); - var state = instance.getPlayerStateInternal(data); + events.trigger(instance, 'timeupdate', [state]); + }); - events.trigger(instance, 'playbackstop', [state]); + bindEventForRelay(instance, 'timeupdate'); + bindEventForRelay(instance, 'pause'); + bindEventForRelay(instance, 'unpause'); + bindEventForRelay(instance, 'volumechange'); + bindEventForRelay(instance, 'repeatmodechange'); + bindEventForRelay(instance, 'shufflequeuemodechange'); - state = instance.lastPlayerData.PlayState || {}; - var volume = state.VolumeLevel || 0.5; - var mute = state.IsMuted || false; + events.on(instance._castPlayer, 'playstatechange', function (e, data) { + console.debug('cc: playstatechange'); + const state = instance.getPlayerStateInternal(data); - // Reset this so the next query doesn't make it appear like content is playing. - instance.lastPlayerData = {}; - instance.lastPlayerData.PlayState = {}; - instance.lastPlayerData.PlayState.VolumeLevel = volume; - instance.lastPlayerData.PlayState.IsMuted = mute; - }); + events.trigger(instance, 'pause', [state]); + }); +} - events.on(instance._castPlayer, 'playbackprogress', function (e, data) { - console.debug('cc: positionchange'); - var state = instance.getPlayerStateInternal(data); - - events.trigger(instance, 'timeupdate', [state]); - }); - - bindEventForRelay(instance, 'timeupdate'); - bindEventForRelay(instance, 'pause'); - bindEventForRelay(instance, 'unpause'); - bindEventForRelay(instance, 'volumechange'); - bindEventForRelay(instance, 'repeatmodechange'); - bindEventForRelay(instance, 'shufflequeuemodechange'); - - events.on(instance._castPlayer, 'playstatechange', function (e, data) { - console.debug('cc: playstatechange'); - var state = instance.getPlayerStateInternal(data); - - events.trigger(instance, 'pause', [state]); - }); - } - - function ChromecastPlayer() { +class ChromecastPlayer { + constructor() { // playbackManager needs this this.name = PlayerName; this.type = 'mediaplayer'; @@ -575,11 +584,11 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' this.isLocalPlayer = false; this.lastPlayerData = {}; - castSenderApiLoader.load().then(initializeChromecast.bind(this)); + new castSenderApiLoader().load().then(initializeChromecast.bind(this)); } - ChromecastPlayer.prototype.tryPair = function (target) { - var castPlayer = this._castPlayer; + tryPair(target) { + const castPlayer = this._castPlayer; if (castPlayer.deviceState !== DEVICE_STATE.ACTIVE && castPlayer.isInitialized) { return new Promise(function (resolve, reject) { @@ -593,23 +602,23 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' return Promise.reject(); } - }; + } - ChromecastPlayer.prototype.getTargets = function () { - var targets = []; + getTargets() { + const targets = []; if (this._castPlayer && this._castPlayer.hasReceivers) { targets.push(this.getCurrentTargetInfo()); } return Promise.resolve(targets); - }; + } // This is a privately used method - ChromecastPlayer.prototype.getCurrentTargetInfo = function () { - var appName = null; + getCurrentTargetInfo() { + let appName = null; - var castPlayer = this._castPlayer; + const castPlayer = this._castPlayer; if (castPlayer.session && castPlayer.session.receiver && castPlayer.session.receiver.friendlyName) { appName = castPlayer.session.receiver.friendlyName; @@ -640,10 +649,10 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' 'PlayTrailers' ] }; - }; + } - ChromecastPlayer.prototype.getPlayerStateInternal = function (data) { - var triggerStateChange = false; + getPlayerStateInternal(data) { + let triggerStateChange = false; if (data && !this.lastPlayerData) { triggerStateChange = true; } @@ -660,12 +669,12 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' } return data; - }; + } - ChromecastPlayer.prototype.playWithCommand = function (options, command) { + playWithCommand(options, command) { if (!options.items) { - var apiClient = connectionManager.getApiClient(options.serverId); - var instance = this; + const apiClient = connectionManager.getApiClient(options.serverId); + const instance = this; return apiClient.getItem(apiClient.getCurrentUserId(), options.ids[0]).then(function (item) { options.items = [item]; @@ -681,9 +690,9 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' } return this._castPlayer.loadMedia(options, command); - }; + } - ChromecastPlayer.prototype.seek = function (position) { + seek(position) { position = parseInt(position); position = position / 10000000; @@ -694,55 +703,55 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' }, command: 'Seek' }); - }; + } - ChromecastPlayer.prototype.setAudioStreamIndex = function (index) { + setAudioStreamIndex(index) { this._castPlayer.sendMessage({ options: { index: index }, command: 'SetAudioStreamIndex' }); - }; + } - ChromecastPlayer.prototype.setSubtitleStreamIndex = function (index) { + setSubtitleStreamIndex(index) { this._castPlayer.sendMessage({ options: { index: index }, command: 'SetSubtitleStreamIndex' }); - }; + } - ChromecastPlayer.prototype.setMaxStreamingBitrate = function (options) { + setMaxStreamingBitrate(options) { this._castPlayer.sendMessage({ options: options, command: 'SetMaxStreamingBitrate' }); - }; + } - ChromecastPlayer.prototype.isFullscreen = function () { - var state = this.lastPlayerData || {}; + isFullscreen() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.IsFullscreen; - }; + } - ChromecastPlayer.prototype.nextTrack = function () { + nextTrack() { this._castPlayer.sendMessage({ options: {}, command: 'NextTrack' }); - }; + } - ChromecastPlayer.prototype.previousTrack = function () { + previousTrack() { this._castPlayer.sendMessage({ options: {}, command: 'PreviousTrack' }); - }; + } - ChromecastPlayer.prototype.volumeDown = function () { - var vol = this._castPlayer.session.receiver.volume.level; + volumeDown() { + let vol = this._castPlayer.session.receiver.volume.level; if (vol == null) { vol = 0.5; } @@ -750,20 +759,20 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' vol = Math.max(vol, 0); this._castPlayer.session.setReceiverVolumeLevel(vol); - }; + } - ChromecastPlayer.prototype.endSession = function () { - var instance = this; + endSession() { + const instance = this; this.stop().then(function () { setTimeout(function () { instance._castPlayer.stopApp(); }, 1000); }); - }; + } - ChromecastPlayer.prototype.volumeUp = function () { - var vol = this._castPlayer.session.receiver.volume.level; + volumeUp() { + let vol = this._castPlayer.session.receiver.volume.level; if (vol == null) { vol = 0.5; } @@ -771,53 +780,53 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' vol = Math.min(vol, 1); this._castPlayer.session.setReceiverVolumeLevel(vol); - }; + } - ChromecastPlayer.prototype.setVolume = function (vol) { + setVolume(vol) { vol = Math.min(vol, 100); vol = Math.max(vol, 0); vol = vol / 100; this._castPlayer.session.setReceiverVolumeLevel(vol); - }; + } - ChromecastPlayer.prototype.unpause = function () { + unpause() { this._castPlayer.sendMessage({ options: {}, command: 'Unpause' }); - }; + } - ChromecastPlayer.prototype.playPause = function () { + playPause() { this._castPlayer.sendMessage({ options: {}, command: 'PlayPause' }); - }; + } - ChromecastPlayer.prototype.pause = function () { + pause() { this._castPlayer.sendMessage({ options: {}, command: 'Pause' }); - }; + } - ChromecastPlayer.prototype.stop = function () { + stop() { return this._castPlayer.sendMessage({ options: {}, command: 'Stop' }); - }; + } - ChromecastPlayer.prototype.displayContent = function (options) { + displayContent(options) { this._castPlayer.sendMessage({ options: options, command: 'DisplayContent' }); - }; + } - ChromecastPlayer.prototype.setMute = function (isMuted) { - var castPlayer = this._castPlayer; + setMute(isMuted) { + const castPlayer = this._castPlayer; if (isMuted) { castPlayer.sendMessage({ @@ -830,21 +839,21 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' command: 'Unmute' }); } - }; + } - ChromecastPlayer.prototype.getRepeatMode = function () { - var state = this.lastPlayerData || {}; + getRepeatMode() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.RepeatMode; - }; + } - ChromecastPlayer.prototype.getQueueShuffleMode = function () { - var state = this.lastPlayerData || {}; + getQueueShuffleMode() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.ShuffleMode; - }; + } - ChromecastPlayer.prototype.playTrailers = function (item) { + playTrailers(item) { this._castPlayer.sendMessage({ options: { ItemId: item.Id, @@ -852,177 +861,173 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' }, command: 'PlayTrailers' }); - }; + } - ChromecastPlayer.prototype.setRepeatMode = function (mode) { + setRepeatMode(mode) { this._castPlayer.sendMessage({ options: { RepeatMode: mode }, command: 'SetRepeatMode' }); - }; + } - ChromecastPlayer.prototype.setQueueShuffleMode = function (value) { + setQueueShuffleMode(value) { this._castPlayer.sendMessage({ options: { ShuffleMode: value }, command: 'SetShuffleQueue' }); - }; + } - ChromecastPlayer.prototype.toggleMute = function () { + toggleMute() { this._castPlayer.sendMessage({ options: {}, command: 'ToggleMute' }); - }; + } - ChromecastPlayer.prototype.audioTracks = function () { - var state = this.lastPlayerData || {}; + audioTracks() { + let state = this.lastPlayerData || {}; state = state.NowPlayingItem || {}; - var streams = state.MediaStreams || []; + const streams = state.MediaStreams || []; return streams.filter(function (s) { return s.Type === 'Audio'; }); - }; + } - ChromecastPlayer.prototype.getAudioStreamIndex = function () { - var state = this.lastPlayerData || {}; + getAudioStreamIndex() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.AudioStreamIndex; - }; + } - ChromecastPlayer.prototype.subtitleTracks = function () { - var state = this.lastPlayerData || {}; + subtitleTracks() { + let state = this.lastPlayerData || {}; state = state.NowPlayingItem || {}; - var streams = state.MediaStreams || []; + const streams = state.MediaStreams || []; return streams.filter(function (s) { return s.Type === 'Subtitle'; }); - }; + } - ChromecastPlayer.prototype.getSubtitleStreamIndex = function () { - var state = this.lastPlayerData || {}; + getSubtitleStreamIndex() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.SubtitleStreamIndex; - }; + } - ChromecastPlayer.prototype.getMaxStreamingBitrate = function () { - var state = this.lastPlayerData || {}; + getMaxStreamingBitrate() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.MaxStreamingBitrate; - }; + } - ChromecastPlayer.prototype.getVolume = function () { - var state = this.lastPlayerData || {}; + getVolume() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.VolumeLevel == null ? 100 : state.VolumeLevel; - }; + } - ChromecastPlayer.prototype.isPlaying = function () { - var state = this.lastPlayerData || {}; - return state.NowPlayingItem != null; - }; + isPlaying(mediaType) { + const state = this.lastPlayerData || {}; + return state.NowPlayingItem != null && (state.NowPlayingItem.MediaType === mediaType || !mediaType); + } - ChromecastPlayer.prototype.isPlayingVideo = function () { - var state = this.lastPlayerData || {}; + isPlayingVideo() { + let state = this.lastPlayerData || {}; state = state.NowPlayingItem || {}; return state.MediaType === 'Video'; - }; + } - ChromecastPlayer.prototype.isPlayingAudio = function () { - var state = this.lastPlayerData || {}; + isPlayingAudio() { + let state = this.lastPlayerData || {}; state = state.NowPlayingItem || {}; return state.MediaType === 'Audio'; - }; + } - ChromecastPlayer.prototype.currentTime = function (val) { + currentTime(val) { if (val != null) { return this.seek(val); } - var state = this.lastPlayerData || {}; + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.PositionTicks; - }; + } - ChromecastPlayer.prototype.duration = function () { - var state = this.lastPlayerData || {}; + duration() { + let state = this.lastPlayerData || {}; state = state.NowPlayingItem || {}; return state.RunTimeTicks; - }; + } - ChromecastPlayer.prototype.getBufferedRanges = function () { - var state = this.lastPlayerData || {}; + getBufferedRanges() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.BufferedRanges || []; - }; + } - ChromecastPlayer.prototype.paused = function () { - var state = this.lastPlayerData || {}; + paused() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.IsPaused; - }; + } - ChromecastPlayer.prototype.isMuted = function () { - var state = this.lastPlayerData || {}; + isMuted() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.IsMuted; - }; + } - ChromecastPlayer.prototype.shuffle = function (item) { - var apiClient = connectionManager.getApiClient(item.ServerId); - var userId = apiClient.getCurrentUserId(); + shuffle(item) { + const apiClient = connectionManager.getApiClient(item.ServerId); + const userId = apiClient.getCurrentUserId(); - var instance = this; + const instance = this; apiClient.getItem(userId, item.Id).then(function (item) { instance.playWithCommand({ - items: [item] - }, 'Shuffle'); }); - }; + } - ChromecastPlayer.prototype.instantMix = function (item) { - var apiClient = connectionManager.getApiClient(item.ServerId); - var userId = apiClient.getCurrentUserId(); + instantMix(item) { + const apiClient = connectionManager.getApiClient(item.ServerId); + const userId = apiClient.getCurrentUserId(); - var instance = this; + const instance = this; apiClient.getItem(userId, item.Id).then(function (item) { instance.playWithCommand({ - items: [item] - }, 'InstantMix'); }); - }; + } - ChromecastPlayer.prototype.canPlayMediaType = function (mediaType) { + canPlayMediaType(mediaType) { mediaType = (mediaType || '').toLowerCase(); return mediaType === 'audio' || mediaType === 'video'; - }; + } - ChromecastPlayer.prototype.canQueueMediaType = function (mediaType) { + canQueueMediaType(mediaType) { return this.canPlayMediaType(mediaType); - }; + } - ChromecastPlayer.prototype.queue = function (options) { + queue(options) { this.playWithCommand(options, 'PlayLast'); - }; + } - ChromecastPlayer.prototype.queueNext = function (options) { + queueNext(options) { this.playWithCommand(options, 'PlayNext'); - }; + } - ChromecastPlayer.prototype.play = function (options) { + play(options) { if (options.items) { return this.playWithCommand(options, 'PlayNow'); } else { @@ -1030,50 +1035,48 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' throw new Error('serverId required!'); } - var instance = this; - var apiClient = connectionManager.getApiClient(options.serverId); + const instance = this; + const apiClient = connectionManager.getApiClient(options.serverId); return getItemsForPlayback(apiClient, { - Ids: options.ids.join(',') - }).then(function (result) { options.items = result.Items; return instance.playWithCommand(options, 'PlayNow'); }); } - }; + } - ChromecastPlayer.prototype.toggleFullscreen = function () { + toggleFullscreen() { // not supported - }; + } - ChromecastPlayer.prototype.beginPlayerUpdates = function () { + beginPlayerUpdates() { // Setup polling here - }; + } - ChromecastPlayer.prototype.endPlayerUpdates = function () { + endPlayerUpdates() { // Stop polling here - }; + } - ChromecastPlayer.prototype.getPlaylist = function () { + getPlaylist() { return Promise.resolve([]); - }; + } - ChromecastPlayer.prototype.getCurrentPlaylistItemId = function () { - }; + getCurrentPlaylistItemId() { + } - ChromecastPlayer.prototype.setCurrentPlaylistItem = function (playlistItemId) { + setCurrentPlaylistItem(playlistItemId) { return Promise.resolve(); - }; + } - ChromecastPlayer.prototype.removeFromPlaylist = function (playlistItemIds) { + removeFromPlaylist(playlistItemIds) { return Promise.resolve(); - }; + } - ChromecastPlayer.prototype.getPlayerState = function () { + getPlayerState() { return this.getPlayerStateInternal() || {}; - }; + } +} - return ChromecastPlayer; -}); +export default ChromecastPlayer; diff --git a/src/plugins/experimentalWarnings/plugin.js b/src/plugins/experimentalWarnings/plugin.js index c39612d45b..bc301f01af 100644 --- a/src/plugins/experimentalWarnings/plugin.js +++ b/src/plugins/experimentalWarnings/plugin.js @@ -1,59 +1,61 @@ -define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function (connectionManager, globalize, userSettings, appHost) { - 'use strict'; +import globalize from 'globalize'; +import * as userSettings from 'userSettings'; +import appHost from 'apphost'; - // TODO: Replace with date-fns - // https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php - function getWeek(date) { - var d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); - var dayNum = d.getUTCDay() || 7; - d.setUTCDate(d.getUTCDate() + 4 - dayNum); - var yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); - return Math.ceil((((d - yearStart) / 86400000) + 1) / 7); +// TODO: Replace with date-fns +// https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php +function getWeek(date) { + const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); + const dayNum = d.getUTCDay() || 7; + d.setUTCDate(d.getUTCDate() + 4 - dayNum); + const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); + return Math.ceil((((d - yearStart) / 86400000) + 1) / 7); +} + +function showMessage(text, userSettingsKey, appHostFeature) { + if (appHost.supports(appHostFeature)) { + return Promise.resolve(); } - function showMessage(text, userSettingsKey, appHostFeature) { - if (appHost.supports(appHostFeature)) { - return Promise.resolve(); - } + const now = new Date(); - var now = new Date(); + // TODO: Use date-fns + userSettingsKey += now.getFullYear() + '-w' + getWeek(now); - // TODO: Use date-fns - userSettingsKey += now.getFullYear() + '-w' + getWeek(now); + if (userSettings.get(userSettingsKey, false) === '1') { + return Promise.resolve(); + } - if (userSettings.get(userSettingsKey, false) === '1') { - return Promise.resolve(); - } + return new Promise(function (resolve, reject) { + userSettings.set(userSettingsKey, '1', false); - return new Promise(function (resolve, reject) { - userSettings.set(userSettingsKey, '1', false); - - require(['alert'], function (alert) { - return alert(text).then(resolve, resolve); - }); + import('alert').then(({default: alert}) => { + return alert(text).then(resolve, resolve); }); - } + }); +} - function showBlurayMessage() { - return showMessage(globalize.translate('UnsupportedPlayback'), 'blurayexpirementalinfo', 'nativeblurayplayback'); - } +function showBlurayMessage() { + return showMessage(globalize.translate('UnsupportedPlayback'), 'blurayexpirementalinfo', 'nativeblurayplayback'); +} - function showDvdMessage() { - return showMessage(globalize.translate('UnsupportedPlayback'), 'dvdexpirementalinfo', 'nativedvdplayback'); - } +function showDvdMessage() { + return showMessage(globalize.translate('UnsupportedPlayback'), 'dvdexpirementalinfo', 'nativedvdplayback'); +} - function showIsoMessage() { - return showMessage(globalize.translate('UnsupportedPlayback'), 'isoexpirementalinfo', 'nativeisoplayback'); - } +function showIsoMessage() { + return showMessage(globalize.translate('UnsupportedPlayback'), 'isoexpirementalinfo', 'nativeisoplayback'); +} - function ExpirementalPlaybackWarnings() { +class ExpirementalPlaybackWarnings { + constructor() { this.name = 'Experimental playback warnings'; this.type = 'preplayintercept'; this.id = 'expirementalplaybackwarnings'; } - ExpirementalPlaybackWarnings.prototype.intercept = function (options) { - var item = options.item; + intercept(options) { + const item = options.item; if (!item) { return Promise.resolve(); } @@ -71,7 +73,7 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function ( } return Promise.resolve(); - }; + } +} - return ExpirementalPlaybackWarnings; -}); +export default ExpirementalPlaybackWarnings; diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js index 16fce8c9d1..acce15df88 100644 --- a/src/plugins/htmlAudioPlayer/plugin.js +++ b/src/plugins/htmlAudioPlayer/plugin.js @@ -1,91 +1,92 @@ -define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelper'], function (events, browser, require, appHost, appSettings, htmlMediaHelper) { - 'use strict'; +import events from 'events'; +import browser from 'browser'; +import appHost from 'apphost'; +import * as htmlMediaHelper from 'htmlMediaHelper'; - function getDefaultProfile() { - return new Promise(function (resolve, reject) { - require(['browserdeviceprofile'], function (profileBuilder) { - resolve(profileBuilder({})); - }); +function getDefaultProfile() { + return import('browserdeviceprofile').then(({ default: profileBuilder }) => { + return profileBuilder({}); + }); +} + +let fadeTimeout; +function fade(instance, elem, startingVolume) { + instance._isFadingOut = true; + + // Need to record the starting volume on each pass rather than querying elem.volume + // This is due to iOS safari not allowing volume changes and always returning the system volume value + const newVolume = Math.max(0, startingVolume - 0.15); + console.debug('fading volume to ' + newVolume); + elem.volume = newVolume; + + if (newVolume <= 0) { + instance._isFadingOut = false; + return Promise.resolve(); + } + + return new Promise(function (resolve, reject) { + cancelFadeTimeout(); + fadeTimeout = setTimeout(function () { + fade(instance, elem, newVolume).then(resolve, reject); + }, 100); + }); +} + +function cancelFadeTimeout() { + const timeout = fadeTimeout; + if (timeout) { + clearTimeout(timeout); + fadeTimeout = null; + } +} + +function supportsFade() { + if (browser.tv) { + // Not working on tizen. + // We could possibly enable on other tv's, but all smart tv browsers tend to be pretty primitive + return false; + } + + return true; +} + +function requireHlsPlayer(callback) { + import('hlsjs').then(({ default: hls }) => { + window.Hls = hls; + callback(); + }); +} + +function enableHlsPlayer(url, item, mediaSource, mediaType) { + if (!htmlMediaHelper.enableHlsJsPlayer(mediaSource.RunTimeTicks, mediaType)) { + return Promise.reject(); + } + + if (url.indexOf('.m3u8') !== -1) { + return Promise.resolve(); + } + + // issue head request to get content type + return new Promise(function (resolve, reject) { + import('fetchHelper').then((fetchHelper) => { + fetchHelper.ajax({ + url: url, + type: 'HEAD' + }).then(function (response) { + const contentType = (response.headers.get('Content-Type') || '').toLowerCase(); + if (contentType === 'application/x-mpegurl') { + resolve(); + } else { + reject(); + } + }, reject); }); - } + }); +} - var fadeTimeout; - function fade(instance, elem, startingVolume) { - instance._isFadingOut = true; - - // Need to record the starting volume on each pass rather than querying elem.volume - // This is due to iOS safari not allowing volume changes and always returning the system volume value - var newVolume = Math.max(0, startingVolume - 0.15); - console.debug('fading volume to ' + newVolume); - elem.volume = newVolume; - - if (newVolume <= 0) { - instance._isFadingOut = false; - return Promise.resolve(); - } - - return new Promise(function (resolve, reject) { - cancelFadeTimeout(); - fadeTimeout = setTimeout(function () { - fade(instance, elem, newVolume).then(resolve, reject); - }, 100); - }); - } - - function cancelFadeTimeout() { - var timeout = fadeTimeout; - if (timeout) { - clearTimeout(timeout); - fadeTimeout = null; - } - } - - function supportsFade() { - if (browser.tv) { - // Not working on tizen. - // We could possibly enable on other tv's, but all smart tv browsers tend to be pretty primitive - return false; - } - - return true; - } - - function requireHlsPlayer(callback) { - require(['hlsjs'], function (hls) { - window.Hls = hls; - callback(); - }); - } - - function enableHlsPlayer(url, item, mediaSource, mediaType) { - if (!htmlMediaHelper.enableHlsJsPlayer(mediaSource.RunTimeTicks, mediaType)) { - return Promise.reject(); - } - - if (url.indexOf('.m3u8') !== -1) { - return Promise.resolve(); - } - - // issue head request to get content type - return new Promise(function (resolve, reject) { - require(['fetchHelper'], function (fetchHelper) { - fetchHelper.ajax({ - url: url, - type: 'HEAD' - }).then(function (response) { - var contentType = (response.headers.get('Content-Type') || '').toLowerCase(); - if (contentType === 'application/x-mpegurl') { - resolve(); - } else { - reject(); - } - }, reject); - }); - }); - } - - function HtmlAudioPlayer() { - var self = this; +class HtmlAudioPlayer { + constructor() { + const self = this; self.name = 'Html Audio Player'; self.type = 'mediaplayer'; @@ -99,7 +100,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp self._timeUpdated = false; self._currentTime = null; - var elem = createMediaElement(); + const elem = createMediaElement(); return setCurrentSrc(elem, options); }; @@ -109,11 +110,11 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp unBindEvents(elem); bindEvents(elem); - var val = options.url; + let val = options.url; console.debug('playing url: ' + val); // Convert to seconds - var seconds = (options.playerStartPositionTicks || 0) / 10000000; + const seconds = (options.playerStartPositionTicks || 0) / 10000000; if (seconds) { val += '#t=' + seconds; } @@ -122,7 +123,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp self._currentPlayOptions = options; - var crossOrigin = htmlMediaHelper.getCrossOriginValue(options.mediaSource); + const crossOrigin = htmlMediaHelper.getCrossOriginValue(options.mediaSource); if (crossOrigin) { elem.crossOrigin = crossOrigin; } @@ -130,9 +131,9 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp return enableHlsPlayer(val, options.item, options.mediaSource, 'Audio').then(function () { return new Promise(function (resolve, reject) { requireHlsPlayer(function () { - var hls = new Hls({ + const hls = new Hls({ manifestLoadingTimeOut: 20000, - xhrSetup: function(xhr, url) { + xhrSetup: function (xhr, url) { xhr.withCredentials = true; } }); @@ -183,8 +184,8 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp self.stop = function (destroyPlayer) { cancelFadeTimeout(); - var elem = self._mediaElement; - var src = self._currentSrc; + const elem = self._mediaElement; + const src = self._currentSrc; if (elem && src) { if (!destroyPlayer || !supportsFade()) { @@ -198,7 +199,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp return Promise.resolve(); } - var originalVolume = elem.volume; + const originalVolume = elem.volume; return fade(self, elem, elem.volume).then(function () { elem.pause(); @@ -219,7 +220,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp }; function createMediaElement() { - var elem = self._mediaElement; + let elem = self._mediaElement; if (elem) { return elem; @@ -248,7 +249,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp function onTimeUpdate() { // Get the player position + the transcoding offset - var time = this.currentTime; + const time = this.currentTime; // Don't trigger events after user stop if (!self._isFadingOut) { @@ -287,11 +288,11 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp } function onError() { - var errorCode = this.error ? (this.error.code || 0) : 0; - var errorMessage = this.error ? (this.error.message || '') : ''; + const errorCode = this.error ? (this.error.code || 0) : 0; + const errorMessage = this.error ? (this.error.message || '') : ''; console.error('media element error: ' + errorCode.toString() + ' ' + errorMessage); - var type; + let type; switch (errorCode) { case 1: @@ -325,59 +326,59 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp } } - HtmlAudioPlayer.prototype.currentSrc = function () { + currentSrc() { return this._currentSrc; - }; + } - HtmlAudioPlayer.prototype.canPlayMediaType = function (mediaType) { + canPlayMediaType(mediaType) { return (mediaType || '').toLowerCase() === 'audio'; - }; + } - HtmlAudioPlayer.prototype.getDeviceProfile = function (item) { + getDeviceProfile(item) { if (appHost.getDeviceProfile) { return appHost.getDeviceProfile(item); } return getDefaultProfile(); - }; + } // Save this for when playback stops, because querying the time at that point might return 0 - HtmlAudioPlayer.prototype.currentTime = function (val) { - var mediaElement = this._mediaElement; + currentTime(val) { + const mediaElement = this._mediaElement; if (mediaElement) { if (val != null) { mediaElement.currentTime = val / 1000; return; } - var currentTime = this._currentTime; + const currentTime = this._currentTime; if (currentTime) { return currentTime * 1000; } return (mediaElement.currentTime || 0) * 1000; } - }; + } - HtmlAudioPlayer.prototype.duration = function (val) { - var mediaElement = this._mediaElement; + duration(val) { + const mediaElement = this._mediaElement; if (mediaElement) { - var duration = mediaElement.duration; + const duration = mediaElement.duration; if (htmlMediaHelper.isValidDuration(duration)) { return duration * 1000; } } return null; - }; + } - HtmlAudioPlayer.prototype.seekable = function () { - var mediaElement = this._mediaElement; + seekable() { + const mediaElement = this._mediaElement; if (mediaElement) { - var seekable = mediaElement.seekable; + const seekable = mediaElement.seekable; if (seekable && seekable.length) { - var start = seekable.start(0); - var end = seekable.end(0); + let start = seekable.start(0); + let end = seekable.end(0); if (!htmlMediaHelper.isValidDuration(start)) { start = 0; @@ -391,124 +392,120 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp return false; } - }; + } - HtmlAudioPlayer.prototype.getBufferedRanges = function () { - var mediaElement = this._mediaElement; + getBufferedRanges() { + const mediaElement = this._mediaElement; if (mediaElement) { return htmlMediaHelper.getBufferedRanges(this, mediaElement); } return []; - }; + } - HtmlAudioPlayer.prototype.pause = function () { - var mediaElement = this._mediaElement; + pause() { + const mediaElement = this._mediaElement; if (mediaElement) { mediaElement.pause(); } - }; + } // This is a retry after error - HtmlAudioPlayer.prototype.resume = function () { - var mediaElement = this._mediaElement; + resume() { + const mediaElement = this._mediaElement; if (mediaElement) { mediaElement.play(); } - }; + } - HtmlAudioPlayer.prototype.unpause = function () { - var mediaElement = this._mediaElement; + unpause() { + const mediaElement = this._mediaElement; if (mediaElement) { mediaElement.play(); } - }; + } - HtmlAudioPlayer.prototype.paused = function () { - var mediaElement = this._mediaElement; + paused() { + const mediaElement = this._mediaElement; if (mediaElement) { return mediaElement.paused; } return false; - }; + } - HtmlAudioPlayer.prototype.setPlaybackRate = function (value) { - var mediaElement = this._mediaElement; + setPlaybackRate(value) { + const mediaElement = this._mediaElement; if (mediaElement) { mediaElement.playbackRate = value; } - }; + } - HtmlAudioPlayer.prototype.getPlaybackRate = function () { - var mediaElement = this._mediaElement; + getPlaybackRate() { + const mediaElement = this._mediaElement; if (mediaElement) { return mediaElement.playbackRate; } return null; - }; + } - HtmlAudioPlayer.prototype.setVolume = function (val) { - var mediaElement = this._mediaElement; + setVolume(val) { + const mediaElement = this._mediaElement; if (mediaElement) { mediaElement.volume = val / 100; } - }; + } - HtmlAudioPlayer.prototype.getVolume = function () { - var mediaElement = this._mediaElement; + getVolume() { + const mediaElement = this._mediaElement; if (mediaElement) { return Math.min(Math.round(mediaElement.volume * 100), 100); } - }; + } - HtmlAudioPlayer.prototype.volumeUp = function () { + volumeUp() { this.setVolume(Math.min(this.getVolume() + 2, 100)); - }; + } - HtmlAudioPlayer.prototype.volumeDown = function () { + volumeDown() { this.setVolume(Math.max(this.getVolume() - 2, 0)); - }; + } - HtmlAudioPlayer.prototype.setMute = function (mute) { - var mediaElement = this._mediaElement; + setMute(mute) { + const mediaElement = this._mediaElement; if (mediaElement) { mediaElement.muted = mute; } - }; + } - HtmlAudioPlayer.prototype.isMuted = function () { - var mediaElement = this._mediaElement; + isMuted() { + const mediaElement = this._mediaElement; if (mediaElement) { return mediaElement.muted; } return false; - }; - - HtmlAudioPlayer.prototype.destroy = function () { - - }; - - var supportedFeatures; - - function getSupportedFeatures() { - var list = []; - var audio = document.createElement('audio'); - - if (typeof audio.playbackRate === 'number') { - list.push('PlaybackRate'); - } - - return list; } - HtmlAudioPlayer.prototype.supports = function (feature) { + supports(feature) { if (!supportedFeatures) { supportedFeatures = getSupportedFeatures(); } return supportedFeatures.indexOf(feature) !== -1; - }; + } +} - return HtmlAudioPlayer; -}); +let supportedFeatures; + +function getSupportedFeatures() { + const list = []; + const audio = document.createElement('audio'); + + if (typeof audio.playbackRate === 'number') { + list.push('PlaybackRate'); + } + + return list; +} + +export default HtmlAudioPlayer; diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index d52f0eb5b3..58c8624e34 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -105,7 +105,7 @@ function tryRemoveElement(elem) { } function hidePrePlaybackPage() { - let animatedPage = document.querySelector('.page:not(.hide)'); + const animatedPage = document.querySelector('.page:not(.hide)'); animatedPage.classList.add('hide'); // At this point, we must hide the scrollbar placeholder, so it's not being displayed while the item is being loaded document.body.classList.remove('force-scroll'); @@ -150,7 +150,7 @@ function tryRemoveElement(elem) { /** * @type {string} */ - name + name; /** * @type {string} */ @@ -730,7 +730,7 @@ function tryRemoveElement(elem) { const elem = e.target; this.destroyCustomTrack(elem); onEndedInternal(this, elem, this.onError); - } + }; /** * @private @@ -760,7 +760,7 @@ function tryRemoveElement(elem) { } events.trigger(this, 'timeupdate'); - } + }; /** * @private @@ -773,7 +773,7 @@ function tryRemoveElement(elem) { const elem = e.target; saveVolume(elem.volume); events.trigger(this, 'volumechange'); - } + }; /** * @private @@ -785,7 +785,7 @@ function tryRemoveElement(elem) { this.onStartedAndNavigatedToOsd(); } - } + }; /** * @private @@ -832,14 +832,14 @@ function tryRemoveElement(elem) { } } events.trigger(this, 'playing'); - } + }; /** * @private */ onPlay = () => { events.trigger(this, 'unpause'); - } + }; /** * @private @@ -865,21 +865,21 @@ function tryRemoveElement(elem) { */ onClick = () => { events.trigger(this, 'click'); - } + }; /** * @private */ onDblClick = () => { events.trigger(this, 'dblclick'); - } + }; /** * @private */ onPause = () => { events.trigger(this, 'pause'); - } + }; onWaiting() { events.trigger(this, 'waiting'); @@ -929,7 +929,7 @@ function tryRemoveElement(elem) { } onErrorInternal(this, type); - } + }; /** * @private @@ -1132,7 +1132,7 @@ function tryRemoveElement(elem) { */ getCueCss(appearance, selector) { return `${selector}::cue { - ${appearance.text.map((s) => `${s.name}:${s.value}!important;`).join('')} + ${appearance.text.map((s) => s.value !== undefined && s.value !== '' ? `${s.name}:${s.value}!important;` : '').join('')} }`; } @@ -1150,7 +1150,7 @@ function tryRemoveElement(elem) { document.getElementsByTagName('head')[0].appendChild(styleElem); } - styleElem.innerHTML = this.getCueCss(subtitleAppearanceHelper.getStyles(userSettings.getSubtitleAppearanceSettings(), true), '.htmlvideoplayer'); + styleElem.innerHTML = this.getCueCss(subtitleAppearanceHelper.getStyles(userSettings.getSubtitleAppearanceSettings()), '.htmlvideoplayer'); }); } @@ -1195,17 +1195,28 @@ function tryRemoveElement(elem) { // download the track json this.fetchSubtitles(track, item).then(function (data) { - // show in ui - console.debug(`downloaded ${data.TrackEvents.length} track events`); - // add some cues to show the text - // in safari, the cues need to be added before setting the track mode to showing - for (const trackEvent of data.TrackEvents) { - const trackCueObject = window.VTTCue || window.TextTrackCue; - const cue = new trackCueObject(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text, false)); + import('userSettings').then((userSettings) => { + // show in ui + console.debug(`downloaded ${data.TrackEvents.length} track events`); - trackElement.addCue(cue); - } - trackElement.mode = 'showing'; + const subtitleAppearance = userSettings.getSubtitleAppearanceSettings(); + const cueLine = parseInt(subtitleAppearance.verticalPosition, 10); + + // add some cues to show the text + // in safari, the cues need to be added before setting the track mode to showing + for (const trackEvent of data.TrackEvents) { + const trackCueObject = window.VTTCue || window.TextTrackCue; + const cue = new trackCueObject(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text, false)); + + if (cue.line === 'auto') { + cue.line = cueLine; + } + + trackElement.addCue(cue); + } + + trackElement.mode = 'showing'; + }); }); } @@ -1288,7 +1299,7 @@ function tryRemoveElement(elem) { } let html = ''; - let cssClass = 'htmlvideoplayer'; + const cssClass = 'htmlvideoplayer'; // Can't autoplay in these browsers so we need to use the full controls, at least until playback starts if (!appHost.supports('htmlvideoautoplay')) { @@ -1623,6 +1634,31 @@ function tryRemoveElement(elem) { return null; } + getSupportedPlaybackRates() { + return [{ + name: '0.5x', + id: 0.5 + }, { + name: '0.75x', + id: 0.75 + }, { + name: '1x', + id: 1.0 + }, { + name: '1.25x', + id: 1.25 + }, { + name: '1.5x', + id: 1.5 + }, { + name: '1.75x', + id: 1.75 + }, { + name: '2x', + id: 2.0 + }]; + } + setVolume(val) { const mediaElement = this.#mediaElement; if (mediaElement) { diff --git a/src/plugins/htmlVideoPlayer/style.css b/src/plugins/htmlVideoPlayer/style.css index b83a7816f5..880ea86743 100644 --- a/src/plugins/htmlVideoPlayer/style.css +++ b/src/plugins/htmlVideoPlayer/style.css @@ -33,16 +33,22 @@ video::-webkit-media-controls { text-shadow: 0.14em 0.14em 0.14em rgba(0, 0, 0, 1); -webkit-font-smoothing: antialiased; font-family: inherit; + line-height: normal; /* Restore value. See -webkit-media-text-track-container 'line-height' */ } -.htmlvideoplayer-moveupsubtitles::-webkit-media-text-track-display { - /* style the text itself */ - margin-top: -2em; +.htmlvideoplayer::-webkit-media-text-track-container { + font-size: 170% !important; /* Override element inline style */ + line-height: 50%; /* Child element cannot set line height smaller than its parent has. This allow smaller values for children */ +} + +.htmlvideoplayer::-webkit-media-text-track-display { + max-width: 70%; + margin-left: 15%; } .videoSubtitles { position: fixed; - bottom: 10%; + bottom: 0; text-align: center; left: 0; right: 0; @@ -53,7 +59,6 @@ video::-webkit-media-controls { .videoSubtitlesInner { max-width: 70%; background-color: rgba(0, 0, 0, 0.8); - padding: 0.25em; margin: auto; display: inline-block; } diff --git a/src/plugins/logoScreensaver/plugin.js b/src/plugins/logoScreensaver/plugin.js index bdd1d34e79..61b8f8a6d6 100644 --- a/src/plugins/logoScreensaver/plugin.js +++ b/src/plugins/logoScreensaver/plugin.js @@ -1,165 +1,165 @@ -define(['pluginManager'], function (pluginManager) { - return function () { - var self = this; +import pluginManager from 'pluginManager'; - self.name = 'Logo ScreenSaver'; - self.type = 'screensaver'; - self.id = 'logoscreensaver'; - self.supportsAnonymous = true; +export default function () { + const self = this; - var interval; + self.name = 'Logo ScreenSaver'; + self.type = 'screensaver'; + self.id = 'logoscreensaver'; + self.supportsAnonymous = true; - function animate() { - var animations = [ + let interval; - bounceInLeft, - bounceInRight, - swing, - tada, - wobble, - rotateIn, - rotateOut - ]; + function animate() { + const animations = [ - var elem = document.querySelector('.logoScreenSaverImage'); + bounceInLeft, + bounceInRight, + swing, + tada, + wobble, + rotateIn, + rotateOut + ]; - if (elem && elem.animate) { - var random = getRandomInt(0, animations.length - 1); + const elem = document.querySelector('.logoScreenSaverImage'); - animations[random](elem, 1); + if (elem && elem.animate) { + const random = getRandomInt(0, animations.length - 1); + + animations[random](elem, 1); + } + } + + function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; + } + + function bounceInLeft(elem, iterations) { + const keyframes = [ + { transform: 'translate3d(-3000px, 0, 0)', opacity: '0', offset: 0 }, + { transform: 'translate3d(25px, 0, 0)', opacity: '1', offset: 0.6 }, + { transform: 'translate3d(-100px, 0, 0)', offset: 0.75 }, + { transform: 'translate3d(5px, 0, 0)', offset: 0.9 }, + { transform: 'none', opacity: '1', offset: 1 }]; + const timing = { duration: 900, iterations: iterations, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' }; + return elem.animate(keyframes, timing); + } + + function bounceInRight(elem, iterations) { + const keyframes = [ + { transform: 'translate3d(3000px, 0, 0)', opacity: '0', offset: 0 }, + { transform: 'translate3d(-25px, 0, 0)', opacity: '1', offset: 0.6 }, + { transform: 'translate3d(100px, 0, 0)', offset: 0.75 }, + { transform: 'translate3d(-5px, 0, 0)', offset: 0.9 }, + { transform: 'none', opacity: '1', offset: 1 }]; + const timing = { duration: 900, iterations: iterations, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' }; + return elem.animate(keyframes, timing); + } + + function swing(elem, iterations) { + const keyframes = [ + { transform: 'translate(0%)', offset: 0 }, + { transform: 'rotate3d(0, 0, 1, 15deg)', offset: 0.2 }, + { transform: 'rotate3d(0, 0, 1, -10deg)', offset: 0.4 }, + { transform: 'rotate3d(0, 0, 1, 5deg)', offset: 0.6 }, + { transform: 'rotate3d(0, 0, 1, -5deg)', offset: 0.8 }, + { transform: 'rotate3d(0, 0, 1, 0deg)', offset: 1 }]; + const timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function tada(elem, iterations) { + const keyframes = [ + { transform: 'scale3d(1, 1, 1)', offset: 0 }, + { transform: 'scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)', offset: 0.1 }, + { transform: 'scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)', offset: 0.2 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.3 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.4 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.5 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.6 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.7 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.8 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.9 }, + { transform: 'scale3d(1, 1, 1)', offset: 1 }]; + const timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function wobble(elem, iterations) { + const keyframes = [ + { transform: 'translate(0%)', offset: 0 }, + { transform: 'translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)', offset: 0.15 }, + { transform: 'translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)', offset: 0.45 }, + { transform: 'translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)', offset: 0.6 }, + { transform: 'translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)', offset: 0.75 }, + { transform: 'translateX(0%)', offset: 1 }]; + const timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function rotateIn(elem, iterations) { + const keyframes = [{ transform: 'rotate3d(0, 0, 1, -200deg)', opacity: '0', transformOrigin: 'center', offset: 0 }, + { transform: 'none', opacity: '1', transformOrigin: 'center', offset: 1 }]; + const timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function rotateOut(elem, iterations) { + const keyframes = [{ transform: 'none', opacity: '1', transformOrigin: 'center', offset: 0 }, + { transform: 'rotate3d(0, 0, 1, 200deg)', opacity: '0', transformOrigin: 'center', offset: 1 }]; + const timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function fadeOut(elem, iterations) { + const keyframes = [ + { opacity: '1', offset: 0 }, + { opacity: '0', offset: 1 }]; + const timing = { duration: 400, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function stopInterval() { + if (interval) { + clearInterval(interval); + interval = null; + } + } + + self.show = function () { + import('css!' + pluginManager.mapPath(self, 'style.css')).then(() => { + let elem = document.querySelector('.logoScreenSaver'); + + if (!elem) { + elem = document.createElement('div'); + elem.classList.add('logoScreenSaver'); + document.body.appendChild(elem); + + elem.innerHTML = ''; } - } - function getRandomInt(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; - } - - function bounceInLeft(elem, iterations) { - var keyframes = [ - { transform: 'translate3d(-3000px, 0, 0)', opacity: '0', offset: 0 }, - { transform: 'translate3d(25px, 0, 0)', opacity: '1', offset: 0.6 }, - { transform: 'translate3d(-100px, 0, 0)', offset: 0.75 }, - { transform: 'translate3d(5px, 0, 0)', offset: 0.9 }, - { transform: 'none', opacity: '1', offset: 1 }]; - var timing = { duration: 900, iterations: iterations, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' }; - return elem.animate(keyframes, timing); - } - - function bounceInRight(elem, iterations) { - var keyframes = [ - { transform: 'translate3d(3000px, 0, 0)', opacity: '0', offset: 0 }, - { transform: 'translate3d(-25px, 0, 0)', opacity: '1', offset: 0.6 }, - { transform: 'translate3d(100px, 0, 0)', offset: 0.75 }, - { transform: 'translate3d(-5px, 0, 0)', offset: 0.9 }, - { transform: 'none', opacity: '1', offset: 1 }]; - var timing = { duration: 900, iterations: iterations, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' }; - return elem.animate(keyframes, timing); - } - - function swing(elem, iterations) { - var keyframes = [ - { transform: 'translate(0%)', offset: 0 }, - { transform: 'rotate3d(0, 0, 1, 15deg)', offset: 0.2 }, - { transform: 'rotate3d(0, 0, 1, -10deg)', offset: 0.4 }, - { transform: 'rotate3d(0, 0, 1, 5deg)', offset: 0.6 }, - { transform: 'rotate3d(0, 0, 1, -5deg)', offset: 0.8 }, - { transform: 'rotate3d(0, 0, 1, 0deg)', offset: 1 }]; - var timing = { duration: 900, iterations: iterations }; - return elem.animate(keyframes, timing); - } - - function tada(elem, iterations) { - var keyframes = [ - { transform: 'scale3d(1, 1, 1)', offset: 0 }, - { transform: 'scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)', offset: 0.1 }, - { transform: 'scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)', offset: 0.2 }, - { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.3 }, - { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.4 }, - { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.5 }, - { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.6 }, - { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.7 }, - { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.8 }, - { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.9 }, - { transform: 'scale3d(1, 1, 1)', offset: 1 }]; - var timing = { duration: 900, iterations: iterations }; - return elem.animate(keyframes, timing); - } - - function wobble(elem, iterations) { - var keyframes = [ - { transform: 'translate(0%)', offset: 0 }, - { transform: 'translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)', offset: 0.15 }, - { transform: 'translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)', offset: 0.45 }, - { transform: 'translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)', offset: 0.6 }, - { transform: 'translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)', offset: 0.75 }, - { transform: 'translateX(0%)', offset: 1 }]; - var timing = { duration: 900, iterations: iterations }; - return elem.animate(keyframes, timing); - } - - function rotateIn(elem, iterations) { - var keyframes = [{ transform: 'rotate3d(0, 0, 1, -200deg)', opacity: '0', transformOrigin: 'center', offset: 0 }, - { transform: 'none', opacity: '1', transformOrigin: 'center', offset: 1 }]; - var timing = { duration: 900, iterations: iterations }; - return elem.animate(keyframes, timing); - } - - function rotateOut(elem, iterations) { - var keyframes = [{ transform: 'none', opacity: '1', transformOrigin: 'center', offset: 0 }, - { transform: 'rotate3d(0, 0, 1, 200deg)', opacity: '0', transformOrigin: 'center', offset: 1 }]; - var timing = { duration: 900, iterations: iterations }; - return elem.animate(keyframes, timing); - } - - function fadeOut(elem, iterations) { - var keyframes = [ - { opacity: '1', offset: 0 }, - { opacity: '0', offset: 1 }]; - var timing = { duration: 400, iterations: iterations }; - return elem.animate(keyframes, timing); - } - - function stopInterval() { - if (interval) { - clearInterval(interval); - interval = null; - } - } - - self.show = function () { - require(['css!' + pluginManager.mapPath(self, 'style.css')], function () { - var elem = document.querySelector('.logoScreenSaver'); - - if (!elem) { - elem = document.createElement('div'); - elem.classList.add('logoScreenSaver'); - document.body.appendChild(elem); - - elem.innerHTML = ''; - } - - stopInterval(); - interval = setInterval(animate, 3000); - }); - }; - - self.hide = function () { stopInterval(); - - var elem = document.querySelector('.logoScreenSaver'); - - if (elem) { - var onAnimationFinish = function () { - elem.parentNode.removeChild(elem); - }; - - if (elem.animate) { - var animation = fadeOut(elem, 1); - animation.onfinish = onAnimationFinish; - } else { - onAnimationFinish(); - } - } - }; + interval = setInterval(animate, 3000); + }); }; -}); + + self.hide = function () { + stopInterval(); + + const elem = document.querySelector('.logoScreenSaver'); + + if (elem) { + const onAnimationFinish = function () { + elem.parentNode.removeChild(elem); + }; + + if (elem.animate) { + const animation = fadeOut(elem, 1); + animation.onfinish = onAnimationFinish; + } else { + onAnimationFinish(); + } + } + }; +} diff --git a/src/plugins/playAccessValidation/plugin.js b/src/plugins/playAccessValidation/plugin.js index 5148d2b821..a9fbeda9a9 100644 --- a/src/plugins/playAccessValidation/plugin.js +++ b/src/plugins/playAccessValidation/plugin.js @@ -1,33 +1,26 @@ -define(['connectionManager', 'globalize'], function (connectionManager, globalize) { - 'use strict'; +import connectionManager from 'connectionManager'; +import globalize from 'globalize'; - function getRequirePromise(deps) { - return new Promise(function (resolve, reject) { - require(deps, resolve); - }); - } +function showErrorMessage() { + return import('alert').then(({default: alert}) => { + return alert(globalize.translate('MessagePlayAccessRestricted')); + }); +} - function showErrorMessage() { - return getRequirePromise(['alert']).then(function (alert) { - return alert(globalize.translate('MessagePlayAccessRestricted')).then(function () { - return Promise.reject(); - }); - }); - } - - function PlayAccessValidation() { +class PlayAccessValidation { + constructor() { this.name = 'Playback validation'; this.type = 'preplayintercept'; this.id = 'playaccessvalidation'; this.order = -2; } - PlayAccessValidation.prototype.intercept = function (options) { - var item = options.item; + intercept(options) { + const item = options.item; if (!item) { return Promise.resolve(); } - var serverId = item.ServerId; + const serverId = item.ServerId; if (!serverId) { return Promise.resolve(); } @@ -44,7 +37,7 @@ define(['connectionManager', 'globalize'], function (connectionManager, globaliz return showErrorMessage(); }); - }; + } +} - return PlayAccessValidation; -}); +export default PlayAccessValidation; diff --git a/src/plugins/sessionPlayer/plugin.js b/src/plugins/sessionPlayer/plugin.js index 89a18a96cc..7e5dc9f4f7 100644 --- a/src/plugins/sessionPlayer/plugin.js +++ b/src/plugins/sessionPlayer/plugin.js @@ -1,129 +1,123 @@ -define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'], function (playbackManager, events, serverNotifications, connectionManager) { - 'use strict'; +import playbackManager from 'playbackManager'; +import events from 'events'; +import serverNotifications from 'serverNotifications'; +import connectionManager from 'connectionManager'; - function getActivePlayerId() { - var info = playbackManager.getPlayerInfo(); - return info ? info.id : null; +function getActivePlayerId() { + const info = playbackManager.getPlayerInfo(); + return info ? info.id : null; +} + +function sendPlayCommand(apiClient, options, playType) { + const sessionId = getActivePlayerId(); + + const ids = options.ids || options.items.map(function (i) { + return i.Id; + }); + + const remoteOptions = { + ItemIds: ids.join(','), + + PlayCommand: playType + }; + + if (options.startPositionTicks) { + remoteOptions.StartPositionTicks = options.startPositionTicks; } - function sendPlayCommand(apiClient, options, playType) { - var sessionId = getActivePlayerId(); - - var ids = options.ids || options.items.map(function (i) { - return i.Id; - }); - - var remoteOptions = { - ItemIds: ids.join(','), - - PlayCommand: playType - }; - - if (options.startPositionTicks) { - remoteOptions.StartPositionTicks = options.startPositionTicks; - } - - if (options.mediaSourceId) { - remoteOptions.MediaSourceId = options.mediaSourceId; - } - - if (options.audioStreamIndex != null) { - remoteOptions.AudioStreamIndex = options.audioStreamIndex; - } - - if (options.subtitleStreamIndex != null) { - remoteOptions.SubtitleStreamIndex = options.subtitleStreamIndex; - } - - if (options.startIndex != null) { - remoteOptions.StartIndex = options.startIndex; - } - - return apiClient.sendPlayCommand(sessionId, remoteOptions); + if (options.mediaSourceId) { + remoteOptions.MediaSourceId = options.mediaSourceId; } - function sendPlayStateCommand(apiClient, command, options) { - var sessionId = getActivePlayerId(); - - apiClient.sendPlayStateCommand(sessionId, command, options); + if (options.audioStreamIndex != null) { + remoteOptions.AudioStreamIndex = options.audioStreamIndex; } - function getCurrentApiClient(instance) { - var currentServerId = instance.currentServerId; - - if (currentServerId) { - return connectionManager.getApiClient(currentServerId); - } - - return connectionManager.currentApiClient(); + if (options.subtitleStreamIndex != null) { + remoteOptions.SubtitleStreamIndex = options.subtitleStreamIndex; } - function sendCommandByName(instance, name, options) { - var command = { - Name: name - }; - - if (options) { - command.Arguments = options; - } - - instance.sendCommand(command); + if (options.startIndex != null) { + remoteOptions.StartIndex = options.startIndex; } - function unsubscribeFromPlayerUpdates(instance) { - instance.isUpdating = true; + return apiClient.sendPlayCommand(sessionId, remoteOptions); +} - var apiClient = getCurrentApiClient(instance); - apiClient.sendMessage('SessionsStop'); - if (instance.pollInterval) { - clearInterval(instance.pollInterval); - instance.pollInterval = null; - } +function sendPlayStateCommand(apiClient, command, options) { + const sessionId = getActivePlayerId(); + + apiClient.sendPlayStateCommand(sessionId, command, options); +} + +function getCurrentApiClient(instance) { + const currentServerId = instance.currentServerId; + + if (currentServerId) { + return connectionManager.getApiClient(currentServerId); } - function processUpdatedSessions(instance, sessions, apiClient) { - var serverId = apiClient.serverId(); + return connectionManager.currentApiClient(); +} - sessions.map(function (s) { - if (s.NowPlayingItem) { - s.NowPlayingItem.ServerId = serverId; - } - }); +function sendCommandByName(instance, name, options) { + const command = { + Name: name + }; - var currentTargetId = getActivePlayerId(); - - var session = sessions.filter(function (s) { - return s.Id === currentTargetId; - })[0]; - - if (session) { - normalizeImages(session, apiClient); - - var eventNames = getChangedEvents(instance.lastPlayerData, session); - instance.lastPlayerData = session; - - for (var i = 0, length = eventNames.length; i < length; i++) { - events.trigger(instance, eventNames[i], [session]); - } - } else { - instance.lastPlayerData = session; - - playbackManager.setDefaultPlayerActive(); - } + if (options) { + command.Arguments = options; } - function getChangedEvents(state1, state2) { - var names = []; + instance.sendCommand(command); +} - if (!state1) { - names.push('statechange'); - names.push('timeupdate'); - names.push('pause'); +function unsubscribeFromPlayerUpdates(instance) { + instance.isUpdating = true; - return names; + const apiClient = getCurrentApiClient(instance); + apiClient.sendMessage('SessionsStop'); + if (instance.pollInterval) { + clearInterval(instance.pollInterval); + instance.pollInterval = null; + } +} + +function processUpdatedSessions(instance, sessions, apiClient) { + const serverId = apiClient.serverId(); + + sessions.map(function (s) { + if (s.NowPlayingItem) { + s.NowPlayingItem.ServerId = serverId; } + }); - // TODO: Trim these down to prevent the UI from over-refreshing + const currentTargetId = getActivePlayerId(); + + const session = sessions.filter(function (s) { + return s.Id === currentTargetId; + })[0]; + + if (session) { + normalizeImages(session, apiClient); + + const eventNames = getChangedEvents(instance.lastPlayerData, session); + instance.lastPlayerData = session; + + for (let i = 0, length = eventNames.length; i < length; i++) { + events.trigger(instance, eventNames[i], [session]); + } + } else { + instance.lastPlayerData = session; + + playbackManager.setDefaultPlayerActive(); + } +} + +function getChangedEvents(state1, state2) { + const names = []; + + if (!state1) { names.push('statechange'); names.push('timeupdate'); names.push('pause'); @@ -131,53 +125,62 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] return names; } - function onPollIntervalFired() { - var instance = this; - var apiClient = getCurrentApiClient(instance); - if (!apiClient.isMessageChannelOpen()) { - apiClient.getSessions().then(function (sessions) { - processUpdatedSessions(instance, sessions, apiClient); - }); - } + // TODO: Trim these down to prevent the UI from over-refreshing + names.push('statechange'); + names.push('timeupdate'); + names.push('pause'); + + return names; +} + +function onPollIntervalFired() { + const instance = this; + const apiClient = getCurrentApiClient(instance); + if (!apiClient.isMessageChannelOpen()) { + apiClient.getSessions().then(function (sessions) { + processUpdatedSessions(instance, sessions, apiClient); + }); } +} - function subscribeToPlayerUpdates(instance) { - instance.isUpdating = true; +function subscribeToPlayerUpdates(instance) { + instance.isUpdating = true; - var apiClient = getCurrentApiClient(instance); - apiClient.sendMessage('SessionsStart', '100,800'); - if (instance.pollInterval) { - clearInterval(instance.pollInterval); - instance.pollInterval = null; - } - instance.pollInterval = setInterval(onPollIntervalFired.bind(instance), 5000); + const apiClient = getCurrentApiClient(instance); + apiClient.sendMessage('SessionsStart', '100,800'); + if (instance.pollInterval) { + clearInterval(instance.pollInterval); + instance.pollInterval = null; } + instance.pollInterval = setInterval(onPollIntervalFired.bind(instance), 5000); +} - function normalizeImages(state, apiClient) { - if (state && state.NowPlayingItem) { - var item = state.NowPlayingItem; +function normalizeImages(state, apiClient) { + if (state && state.NowPlayingItem) { + const item = state.NowPlayingItem; - if (!item.ImageTags || !item.ImageTags.Primary) { - if (item.PrimaryImageTag) { - item.ImageTags = item.ImageTags || {}; - item.ImageTags.Primary = item.PrimaryImageTag; - } - } - if (item.BackdropImageTag && item.BackdropItemId === item.Id) { - item.BackdropImageTags = [item.BackdropImageTag]; - } - if (item.BackdropImageTag && item.BackdropItemId !== item.Id) { - item.ParentBackdropImageTags = [item.BackdropImageTag]; - item.ParentBackdropItemId = item.BackdropItemId; - } - if (!item.ServerId) { - item.ServerId = apiClient.serverId(); + if (!item.ImageTags || !item.ImageTags.Primary) { + if (item.PrimaryImageTag) { + item.ImageTags = item.ImageTags || {}; + item.ImageTags.Primary = item.PrimaryImageTag; } } + if (item.BackdropImageTag && item.BackdropItemId === item.Id) { + item.BackdropImageTags = [item.BackdropImageTag]; + } + if (item.BackdropImageTag && item.BackdropItemId !== item.Id) { + item.ParentBackdropImageTags = [item.BackdropImageTag]; + item.ParentBackdropItemId = item.BackdropItemId; + } + if (!item.ServerId) { + item.ServerId = apiClient.serverId(); + } } +} - function SessionPlayer() { - var self = this; +class SessionPlayer { + constructor() { + const self = this; this.name = 'Remote Control'; this.type = 'mediaplayer'; @@ -189,7 +192,7 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] }); } - SessionPlayer.prototype.beginPlayerUpdates = function () { + beginPlayerUpdates() { this.playerListenerCount = this.playerListenerCount || 0; if (this.playerListenerCount <= 0) { @@ -199,9 +202,9 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] } this.playerListenerCount++; - }; + } - SessionPlayer.prototype.endPlayerUpdates = function () { + endPlayerUpdates() { this.playerListenerCount = this.playerListenerCount || 0; this.playerListenerCount--; @@ -209,21 +212,21 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] unsubscribeFromPlayerUpdates(this); this.playerListenerCount = 0; } - }; + } - SessionPlayer.prototype.getPlayerState = function () { + getPlayerState() { return this.lastPlayerData || {}; - }; + } - SessionPlayer.prototype.getTargets = function () { - var apiClient = getCurrentApiClient(this); + getTargets() { + const apiClient = getCurrentApiClient(this); - var sessionQuery = { + const sessionQuery = { ControllableByUserId: apiClient.getCurrentUserId() }; if (apiClient) { - var name = this.name; + const name = this.name; return apiClient.getSessions(sessionQuery).then(function (sessions) { return sessions.filter(function (s) { @@ -240,11 +243,9 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] isLocalPlayer: false, supportedCommands: s.Capabilities.SupportedCommands, user: s.UserId ? { - Id: s.UserId, Name: s.UserName, PrimaryImageTag: s.UserPrimaryImageTag - } : null }; }); @@ -252,16 +253,16 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] } else { return Promise.resolve([]); } - }; + } - SessionPlayer.prototype.sendCommand = function (command) { - var sessionId = getActivePlayerId(); + sendCommand(command) { + const sessionId = getActivePlayerId(); - var apiClient = getCurrentApiClient(this); + const apiClient = getCurrentApiClient(this); apiClient.sendCommand(sessionId, command); - }; + } - SessionPlayer.prototype.play = function (options) { + play(options) { options = Object.assign({}, options); if (options.items) { @@ -273,251 +274,233 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] } return sendPlayCommand(getCurrentApiClient(this), options, 'PlayNow'); - }; + } - SessionPlayer.prototype.shuffle = function (item) { + shuffle(item) { sendPlayCommand(getCurrentApiClient(this), { ids: [item.Id] }, 'PlayShuffle'); - }; + } - SessionPlayer.prototype.instantMix = function (item) { + instantMix(item) { sendPlayCommand(getCurrentApiClient(this), { ids: [item.Id] }, 'PlayInstantMix'); - }; + } - SessionPlayer.prototype.queue = function (options) { + queue(options) { sendPlayCommand(getCurrentApiClient(this), options, 'PlayNext'); - }; + } - SessionPlayer.prototype.queueNext = function (options) { + queueNext(options) { sendPlayCommand(getCurrentApiClient(this), options, 'PlayLast'); - }; + } - SessionPlayer.prototype.canPlayMediaType = function (mediaType) { + canPlayMediaType(mediaType) { mediaType = (mediaType || '').toLowerCase(); return mediaType === 'audio' || mediaType === 'video'; - }; + } - SessionPlayer.prototype.canQueueMediaType = function (mediaType) { + canQueueMediaType(mediaType) { return this.canPlayMediaType(mediaType); - }; + } - SessionPlayer.prototype.stop = function () { + stop() { sendPlayStateCommand(getCurrentApiClient(this), 'stop'); - }; + } - SessionPlayer.prototype.nextTrack = function () { + nextTrack() { sendPlayStateCommand(getCurrentApiClient(this), 'nextTrack'); - }; + } - SessionPlayer.prototype.previousTrack = function () { + previousTrack() { sendPlayStateCommand(getCurrentApiClient(this), 'previousTrack'); - }; + } - SessionPlayer.prototype.seek = function (positionTicks) { + seek(positionTicks) { sendPlayStateCommand(getCurrentApiClient(this), 'seek', { SeekPositionTicks: positionTicks }); - }; + } - SessionPlayer.prototype.currentTime = function (val) { + currentTime(val) { if (val != null) { return this.seek(val); } - var state = this.lastPlayerData || {}; + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.PositionTicks; - }; + } - SessionPlayer.prototype.duration = function () { - var state = this.lastPlayerData || {}; + duration() { + let state = this.lastPlayerData || {}; state = state.NowPlayingItem || {}; return state.RunTimeTicks; - }; + } - SessionPlayer.prototype.paused = function () { - var state = this.lastPlayerData || {}; + paused() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.IsPaused; - }; + } - SessionPlayer.prototype.getVolume = function () { - var state = this.lastPlayerData || {}; + getVolume() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.VolumeLevel; - }; + } - SessionPlayer.prototype.isMuted = function () { - var state = this.lastPlayerData || {}; + isMuted() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.IsMuted; - }; + } - SessionPlayer.prototype.pause = function () { + pause() { sendPlayStateCommand(getCurrentApiClient(this), 'Pause'); - }; + } - SessionPlayer.prototype.unpause = function () { + unpause() { sendPlayStateCommand(getCurrentApiClient(this), 'Unpause'); - }; + } - SessionPlayer.prototype.playPause = function () { + playPause() { sendPlayStateCommand(getCurrentApiClient(this), 'PlayPause'); - }; + } - SessionPlayer.prototype.setMute = function (isMuted) { + setMute(isMuted) { if (isMuted) { sendCommandByName(this, 'Mute'); } else { sendCommandByName(this, 'Unmute'); } - }; + } - SessionPlayer.prototype.toggleMute = function () { + toggleMute() { sendCommandByName(this, 'ToggleMute'); - }; + } - SessionPlayer.prototype.setVolume = function (vol) { + setVolume(vol) { sendCommandByName(this, 'SetVolume', { Volume: vol }); - }; + } - SessionPlayer.prototype.volumeUp = function () { + volumeUp() { sendCommandByName(this, 'VolumeUp'); - }; + } - SessionPlayer.prototype.volumeDown = function () { + volumeDown() { sendCommandByName(this, 'VolumeDown'); - }; + } - SessionPlayer.prototype.toggleFullscreen = function () { + toggleFullscreen() { sendCommandByName(this, 'ToggleFullscreen'); - }; + } - SessionPlayer.prototype.audioTracks = function () { - var state = this.lastPlayerData || {}; + audioTracks() { + let state = this.lastPlayerData || {}; state = state.NowPlayingItem || {}; - var streams = state.MediaStreams || []; + const streams = state.MediaStreams || []; return streams.filter(function (s) { return s.Type === 'Audio'; }); - }; + } - SessionPlayer.prototype.getAudioStreamIndex = function () { - var state = this.lastPlayerData || {}; + getAudioStreamIndex() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.AudioStreamIndex; - }; + } - SessionPlayer.prototype.playTrailers = function (item) { + playTrailers(item) { sendCommandByName(this, 'PlayTrailers', { ItemId: item.Id }); - }; + } - SessionPlayer.prototype.setAudioStreamIndex = function (index) { + setAudioStreamIndex(index) { sendCommandByName(this, 'SetAudioStreamIndex', { Index: index }); - }; + } - SessionPlayer.prototype.subtitleTracks = function () { - var state = this.lastPlayerData || {}; + subtitleTracks() { + let state = this.lastPlayerData || {}; state = state.NowPlayingItem || {}; - var streams = state.MediaStreams || []; + const streams = state.MediaStreams || []; return streams.filter(function (s) { return s.Type === 'Subtitle'; }); - }; + } - SessionPlayer.prototype.getSubtitleStreamIndex = function () { - var state = this.lastPlayerData || {}; + getSubtitleStreamIndex() { + let state = this.lastPlayerData || {}; state = state.PlayState || {}; return state.SubtitleStreamIndex; - }; + } - SessionPlayer.prototype.setSubtitleStreamIndex = function (index) { + setSubtitleStreamIndex(index) { sendCommandByName(this, 'SetSubtitleStreamIndex', { Index: index }); - }; + } - SessionPlayer.prototype.getMaxStreamingBitrate = function () { - - }; - - SessionPlayer.prototype.setMaxStreamingBitrate = function (options) { - - }; - - SessionPlayer.prototype.isFullscreen = function () { - - }; - - SessionPlayer.prototype.toggleFullscreen = function () { - - }; - - SessionPlayer.prototype.getRepeatMode = function () { - - }; - - SessionPlayer.prototype.setRepeatMode = function (mode) { + setRepeatMode(mode) { sendCommandByName(this, 'SetRepeatMode', { RepeatMode: mode }); - }; + } - SessionPlayer.prototype.setQueueShuffleMode = function (mode) { + getRepeatMode() { + } + + setQueueShuffleMode(mode) { sendCommandByName(this, 'SetShuffleQueue', { ShuffleMode: mode }); - }; + } - SessionPlayer.prototype.getQueueShuffleMode = function () { + getQueueShuffleMode() { + } - }; - - SessionPlayer.prototype.displayContent = function (options) { + displayContent(options) { sendCommandByName(this, 'DisplayContent', options); - }; + } - SessionPlayer.prototype.isPlaying = function () { - var state = this.lastPlayerData || {}; - return state.NowPlayingItem != null; - }; + isPlaying(mediaType) { + const state = this.lastPlayerData || {}; + return state.NowPlayingItem != null && (state.NowPlayingItem.MediaType === mediaType || !mediaType); + } - SessionPlayer.prototype.isPlayingVideo = function () { - var state = this.lastPlayerData || {}; + isPlayingVideo() { + let state = this.lastPlayerData || {}; state = state.NowPlayingItem || {}; return state.MediaType === 'Video'; - }; + } - SessionPlayer.prototype.isPlayingAudio = function () { - var state = this.lastPlayerData || {}; + isPlayingAudio() { + let state = this.lastPlayerData || {}; state = state.NowPlayingItem || {}; return state.MediaType === 'Audio'; - }; + } - SessionPlayer.prototype.getPlaylist = function () { + getPlaylist() { return Promise.resolve([]); - }; + } - SessionPlayer.prototype.getCurrentPlaylistItemId = function () { - }; + getCurrentPlaylistItemId() { + } - SessionPlayer.prototype.setCurrentPlaylistItem = function (playlistItemId) { + setCurrentPlaylistItem(playlistItemId) { return Promise.resolve(); - }; + } - SessionPlayer.prototype.removeFromPlaylist = function (playlistItemIds) { + removeFromPlaylist(playlistItemIds) { return Promise.resolve(); - }; + } - SessionPlayer.prototype.tryPair = function (target) { + tryPair(target) { return Promise.resolve(); - }; + } +} - return SessionPlayer; -}); +export default SessionPlayer; diff --git a/src/scripts/apploader.js b/src/scripts/apploader.js index 183b765d16..f5f6850c40 100644 --- a/src/scripts/apploader.js +++ b/src/scripts/apploader.js @@ -1,14 +1,12 @@ (function() { - 'use strict'; - function injectScriptElement(src, onload) { if (!src) { return; } - var script = document.createElement('script'); - if (self.dashboardVersion) { - src += `?v=${self.dashboardVersion}`; + const script = document.createElement('script'); + if (window.dashboardVersion) { + src += `?v=${window.dashboardVersion}`; } script.src = src; script.setAttribute('async', ''); @@ -37,10 +35,10 @@ // Promise() being missing on some legacy browser, and a funky one // is Promise() present but buggy on WebOS 2 window.Promise = undefined; - self.Promise = undefined; + window.Promise = undefined; } - if (!self.Promise) { + if (!window.Promise) { // Load Promise polyfill if they are not natively supported injectScriptElement( './libraries/npo.js', diff --git a/src/scripts/autoThemes.js b/src/scripts/autoThemes.js new file mode 100644 index 0000000000..75309f377b --- /dev/null +++ b/src/scripts/autoThemes.js @@ -0,0 +1,12 @@ +import * as userSettings from 'userSettings'; +import skinManager from 'skinManager'; +import connectionManager from 'connectionManager'; +import events from 'events'; + +// Set the default theme when loading +skinManager.setTheme(userSettings.theme()); + +// Set the user's prefered theme when signing in +events.on(connectionManager, 'localusersignedin', function (e, user) { + skinManager.setTheme(userSettings.theme()); +}); diff --git a/src/scripts/browser.js b/src/scripts/browser.js index b10587cb09..618d930ec8 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -210,7 +210,7 @@ if (userAgent.toLowerCase().indexOf('xbox') !== -1) { browser.tv = true; } browser.animate = typeof document !== 'undefined' && document.documentElement.animate != null; -browser.tizen = userAgent.toLowerCase().indexOf('tizen') !== -1 || self.tizen != null; +browser.tizen = userAgent.toLowerCase().indexOf('tizen') !== -1 || window.tizen != null; browser.web0s = userAgent.toLowerCase().indexOf('Web0S'.toLowerCase()) !== -1; browser.edgeUwp = browser.edge && (userAgent.toLowerCase().indexOf('msapphost') !== -1 || userAgent.toLowerCase().indexOf('webview') !== -1); diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index 382ffbed1a..67c75da901 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -1,6 +1,8 @@ define(['browser'], function (browser) { 'use strict'; + browser = browser.default || browser; + function canPlayH264(videoTestElement) { return !!(videoTestElement.canPlayType && videoTestElement.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, '')); } @@ -313,10 +315,12 @@ define(['browser'], function (browser) { // Not sure how to test for this var supportsMp2VideoAudio = browser.edgeUwp || browser.tizen || browser.web0s; + /* eslint-disable compat/compat */ var maxVideoWidth = browser.xboxOne ? - (self.screen ? self.screen.width : null) : + (window.screen ? window.screen.width : null) : null; + /* eslint-enable compat/compat */ if (options.maxVideoWidth) { maxVideoWidth = options.maxVideoWidth; } diff --git a/src/scripts/clientUtils.js b/src/scripts/clientUtils.js new file mode 100644 index 0000000000..70d42d0782 --- /dev/null +++ b/src/scripts/clientUtils.js @@ -0,0 +1,233 @@ + +export function getCurrentUser() { + return window.ApiClient.getCurrentUser(false); +} + +//TODO: investigate url prefix support for serverAddress function +export function serverAddress() { + if (AppInfo.isNativeApp) { + const apiClient = window.ApiClient; + + if (apiClient) { + return apiClient.serverAddress(); + } + + return null; + } + + const urlLower = window.location.href.toLowerCase(); + const index = urlLower.lastIndexOf('/web'); + + if (index != -1) { + return urlLower.substring(0, index); + } + + const loc = window.location; + let address = loc.protocol + '//' + loc.hostname; + + if (loc.port) { + address += ':' + loc.port; + } + + return address; +} + +export function getCurrentUserId() { + const apiClient = window.ApiClient; + + if (apiClient) { + return apiClient.getCurrentUserId(); + } + + return null; +} + +export function onServerChanged(userId, accessToken, apiClient) { + apiClient = apiClient || window.ApiClient; + window.ApiClient = apiClient; +} + +export function logout() { + ConnectionManager.logout().then(function () { + let loginPage; + + if (AppInfo.isNativeApp) { + loginPage = 'selectserver.html'; + window.ApiClient = null; + } else { + loginPage = 'login.html'; + } + + navigate(loginPage); + }); +} + +export function getConfigurationPageUrl(name) { + return 'configurationpage?name=' + encodeURIComponent(name); +} + +export function getConfigurationResourceUrl(name) { + if (AppInfo.isNativeApp) { + return ApiClient.getUrl('web/ConfigurationPage', { + name: name + }); + } + + return getConfigurationPageUrl(name); +} + +export function navigate(url, preserveQueryString) { + if (!url) { + throw new Error('url cannot be null or empty'); + } + + const queryString = getWindowLocationSearch(); + + if (preserveQueryString && queryString) { + url += queryString; + } + + return new Promise(function (resolve, reject) { + import('appRouter').then(({default: appRouter}) => { + return appRouter.show(url).then(resolve, reject); + }); + }); +} + +export function processPluginConfigurationUpdateResult() { + Promise.all([ + import('loading'), + import('toast') + ]) + .then(([{default: loading}, {default: toast}]) => { + loading.hide(); + toast(Globalize.translate('SettingsSaved')); + }); +} + +export function processServerConfigurationUpdateResult(result) { + Promise.all([ + import('loading'), + import('toast') + ]) + .then(([{default: loading}, {default: toast}]) => { + loading.hide(); + toast(Globalize.translate('SettingsSaved')); + }); +} + +export function processErrorResponse(response) { + import('loading').then(({default: loading}) => { + loading.hide(); + }); + + let status = '' + response.status; + + if (response.statusText) { + status = response.statusText; + } + + alert({ + title: status, + message: response.headers ? response.headers.get('X-Application-Error-Code') : null + }); +} + +export function alert(options) { + if (typeof options == 'string') { + return void import('toast').then(({default: toast}) => { + toast({ + text: options + }); + }); + } + + import('alert').then(({default: alert}) => { + alert({ + title: options.title || Globalize.translate('HeaderAlert'), + text: options.message + }).then(options.callback || function () {}); + }); +} + +export function capabilities(appHost) { + let capabilities = { + PlayableMediaTypes: ['Audio', 'Video'], + SupportedCommands: ['MoveUp', 'MoveDown', 'MoveLeft', 'MoveRight', 'PageUp', 'PageDown', 'PreviousLetter', 'NextLetter', 'ToggleOsd', 'ToggleContextMenu', 'Select', 'Back', 'SendKey', 'SendString', 'GoHome', 'GoToSettings', 'VolumeUp', 'VolumeDown', 'Mute', 'Unmute', 'ToggleMute', 'SetVolume', 'SetAudioStreamIndex', 'SetSubtitleStreamIndex', 'DisplayContent', 'GoToSearch', 'DisplayMessage', 'SetRepeatMode', 'SetShuffleQueue', 'ChannelUp', 'ChannelDown', 'PlayMediaSource', 'PlayTrailers'], + SupportsPersistentIdentifier: window.appMode === 'cordova' || window.appMode === 'android', + SupportsMediaControl: true + }; + return Object.assign(capabilities, appHost.getPushTokenInfo()); +} + +export function selectServer() { + if (window.NativeShell && typeof window.NativeShell.selectServer === 'function') { + window.NativeShell.selectServer(); + } else { + navigate('selectserver.html'); + } +} + +export function hideLoadingMsg() { + import('loading').then(({default: loading}) => { + loading.hide(); + }); +} + +export function showLoadingMsg() { + import('loading').then(({default: loading}) => { + loading.show(); + }); +} + +export function confirm(message, title, callback) { + import('confirm').then(({default: confirm}) => { + confirm(message, title).then(function() { + callback(!0); + }).catch(function() { + callback(!1); + }); + }); +} + +// This is used in plugins and templates, so keep it defined for now. +// TODO: Remove once plugins don't need it +window.Dashboard = { + alert, + capabilities, + confirm, + getConfigurationPageUrl, + getConfigurationResourceUrl, + getCurrentUser, + getCurrentUserId, + hideLoadingMsg, + logout, + navigate, + onServerChanged, + processErrorResponse, + processPluginConfigurationUpdateResult, + processServerConfigurationUpdateResult, + selectServer, + serverAddress, + showLoadingMsg +}; + +export default { + alert, + capabilities, + confirm, + getConfigurationPageUrl, + getConfigurationResourceUrl, + getCurrentUser, + getCurrentUserId, + hideLoadingMsg, + logout, + navigate, + onServerChanged, + processErrorResponse, + processPluginConfigurationUpdateResult, + processServerConfigurationUpdateResult, + selectServer, + serverAddress, + showLoadingMsg +}; diff --git a/src/scripts/datetime.js b/src/scripts/datetime.js index dcac41089e..c6baa28ed3 100644 --- a/src/scripts/datetime.js +++ b/src/scripts/datetime.js @@ -24,7 +24,7 @@ import globalize from 'globalize'; // parse strings, leading zeros into proper ints const a = [1, 2, 3, 4, 5, 6, 10, 11]; - for (let i in a) { + for (const i in a) { d[a[i]] = parseInt(d[a[i]], 10); } d[7] = parseFloat(d[7]); diff --git a/src/scripts/deleteHelper.js b/src/scripts/deleteHelper.js index e10a1568c7..44876c75b3 100644 --- a/src/scripts/deleteHelper.js +++ b/src/scripts/deleteHelper.js @@ -15,7 +15,7 @@ export function deleteItem(options) { const item = options.item; const parentId = item.SeasonId || item.SeriesId || item.ParentId; - let apiClient = connectionManager.getApiClient(item.ServerId); + const apiClient = connectionManager.getApiClient(item.ServerId); return confirm({ @@ -34,7 +34,7 @@ export function deleteItem(options) { } } }, function (err) { - let result = function () { + const result = function () { return Promise.reject(err); }; diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js index 2489335969..b6a45ccf2c 100644 --- a/src/scripts/editorsidebar.js +++ b/src/scripts/editorsidebar.js @@ -86,7 +86,7 @@ import 'material-icons'; if (result.TotalRecordCount) { nodes.push({ id: 'livetv', - text: globalize.translate('HeaderLiveTV'), + text: globalize.translate('LiveTV'), state: { opened: false }, @@ -302,7 +302,7 @@ import 'material-icons'; $(document).on('itemsaved', '.metadataEditorPage', function (e, item) { updateEditorNode(this, item); }).on('pagebeforeshow', '.metadataEditorPage', function () { - /* eslint-disable-next-line no-unused-expressions */ + /* eslint-disable-next-line @babel/no-unused-expressions */ import('css!assets/css/metadataeditor.css'); }).on('pagebeforeshow', '.metadataEditorPage', function () { var page = this; diff --git a/src/scripts/gamepadtokey.js b/src/scripts/gamepadtokey.js index 870429ee09..b6f25f1eea 100644 --- a/src/scripts/gamepadtokey.js +++ b/src/scripts/gamepadtokey.js @@ -19,384 +19,383 @@ // # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // # THE SOFTWARE. -require(['apphost'], function (appHost) { - 'use strict'; - var _GAMEPAD_A_BUTTON_INDEX = 0; - var _GAMEPAD_B_BUTTON_INDEX = 1; - var _GAMEPAD_DPAD_UP_BUTTON_INDEX = 12; - var _GAMEPAD_DPAD_DOWN_BUTTON_INDEX = 13; - var _GAMEPAD_DPAD_LEFT_BUTTON_INDEX = 14; - var _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX = 15; - var _GAMEPAD_A_KEY = 'GamepadA'; - var _GAMEPAD_B_KEY = 'GamepadB'; - var _GAMEPAD_DPAD_UP_KEY = 'GamepadDPadUp'; - var _GAMEPAD_DPAD_DOWN_KEY = 'GamepadDPadDown'; - var _GAMEPAD_DPAD_LEFT_KEY = 'GamepadDPadLeft'; - var _GAMEPAD_DPAD_RIGHT_KEY = 'GamepadDPadRight'; - var _GAMEPAD_LEFT_THUMBSTICK_UP_KEY = 'GamepadLeftThumbStickUp'; - var _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEY = 'GamepadLeftThumbStickDown'; - var _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEY = 'GamepadLeftThumbStickLeft'; - var _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEY = 'GamepadLeftThumbStickRight'; - var _GAMEPAD_A_KEYCODE = 0; - var _GAMEPAD_B_KEYCODE = 27; - var _GAMEPAD_DPAD_UP_KEYCODE = 38; - var _GAMEPAD_DPAD_DOWN_KEYCODE = 40; - var _GAMEPAD_DPAD_LEFT_KEYCODE = 37; - var _GAMEPAD_DPAD_RIGHT_KEYCODE = 39; - var _GAMEPAD_LEFT_THUMBSTICK_UP_KEYCODE = 38; - var _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEYCODE = 40; - var _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEYCODE = 37; - var _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEYCODE = 39; - var _THUMB_STICK_THRESHOLD = 0.75; +import appHost from 'apphost'; - var _leftThumbstickUpPressed = false; - var _leftThumbstickDownPressed = false; - var _leftThumbstickLeftPressed = false; - var _leftThumbstickRightPressed = false; - var _dPadUpPressed = false; - var _dPadDownPressed = false; - var _dPadLeftPressed = false; - var _dPadRightPressed = false; - var _gamepadAPressed = false; - var _gamepadBPressed = false; +var _GAMEPAD_A_BUTTON_INDEX = 0; +var _GAMEPAD_B_BUTTON_INDEX = 1; +var _GAMEPAD_DPAD_UP_BUTTON_INDEX = 12; +var _GAMEPAD_DPAD_DOWN_BUTTON_INDEX = 13; +var _GAMEPAD_DPAD_LEFT_BUTTON_INDEX = 14; +var _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX = 15; +var _GAMEPAD_A_KEY = 'GamepadA'; +var _GAMEPAD_B_KEY = 'GamepadB'; +var _GAMEPAD_DPAD_UP_KEY = 'GamepadDPadUp'; +var _GAMEPAD_DPAD_DOWN_KEY = 'GamepadDPadDown'; +var _GAMEPAD_DPAD_LEFT_KEY = 'GamepadDPadLeft'; +var _GAMEPAD_DPAD_RIGHT_KEY = 'GamepadDPadRight'; +var _GAMEPAD_LEFT_THUMBSTICK_UP_KEY = 'GamepadLeftThumbStickUp'; +var _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEY = 'GamepadLeftThumbStickDown'; +var _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEY = 'GamepadLeftThumbStickLeft'; +var _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEY = 'GamepadLeftThumbStickRight'; +var _GAMEPAD_A_KEYCODE = 0; +var _GAMEPAD_B_KEYCODE = 27; +var _GAMEPAD_DPAD_UP_KEYCODE = 38; +var _GAMEPAD_DPAD_DOWN_KEYCODE = 40; +var _GAMEPAD_DPAD_LEFT_KEYCODE = 37; +var _GAMEPAD_DPAD_RIGHT_KEYCODE = 39; +var _GAMEPAD_LEFT_THUMBSTICK_UP_KEYCODE = 38; +var _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEYCODE = 40; +var _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEYCODE = 37; +var _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEYCODE = 39; +var _THUMB_STICK_THRESHOLD = 0.75; - // The set of buttons on the gamepad we listen for. - var ProcessedButtons = [ - _GAMEPAD_DPAD_UP_BUTTON_INDEX, - _GAMEPAD_DPAD_DOWN_BUTTON_INDEX, - _GAMEPAD_DPAD_LEFT_BUTTON_INDEX, - _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX, - _GAMEPAD_A_BUTTON_INDEX, - _GAMEPAD_B_BUTTON_INDEX - ]; +var _leftThumbstickUpPressed = false; +var _leftThumbstickDownPressed = false; +var _leftThumbstickLeftPressed = false; +var _leftThumbstickRightPressed = false; +var _dPadUpPressed = false; +var _dPadDownPressed = false; +var _dPadLeftPressed = false; +var _dPadRightPressed = false; +var _gamepadAPressed = false; +var _gamepadBPressed = false; - var _ButtonPressedState = {}; - _ButtonPressedState.getgamepadA = function () { - return _gamepadAPressed; - }; +// The set of buttons on the gamepad we listen for. +var ProcessedButtons = [ + _GAMEPAD_DPAD_UP_BUTTON_INDEX, + _GAMEPAD_DPAD_DOWN_BUTTON_INDEX, + _GAMEPAD_DPAD_LEFT_BUTTON_INDEX, + _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX, + _GAMEPAD_A_BUTTON_INDEX, + _GAMEPAD_B_BUTTON_INDEX +]; - _ButtonPressedState.setgamepadA = function (newPressedState) { - raiseKeyEvent(_gamepadAPressed, newPressedState, _GAMEPAD_A_KEY, _GAMEPAD_A_KEYCODE, false, true); - _gamepadAPressed = newPressedState; - }; +var _ButtonPressedState = {}; +_ButtonPressedState.getgamepadA = function () { + return _gamepadAPressed; +}; - _ButtonPressedState.getgamepadB = function () { - return _gamepadBPressed; - }; +_ButtonPressedState.setgamepadA = function (newPressedState) { + raiseKeyEvent(_gamepadAPressed, newPressedState, _GAMEPAD_A_KEY, _GAMEPAD_A_KEYCODE, false, true); + _gamepadAPressed = newPressedState; +}; - _ButtonPressedState.setgamepadB = function (newPressedState) { - raiseKeyEvent(_gamepadBPressed, newPressedState, _GAMEPAD_B_KEY, _GAMEPAD_B_KEYCODE); - _gamepadBPressed = newPressedState; - }; +_ButtonPressedState.getgamepadB = function () { + return _gamepadBPressed; +}; - _ButtonPressedState.getleftThumbstickUp = function () { - return _leftThumbstickUpPressed; - }; +_ButtonPressedState.setgamepadB = function (newPressedState) { + raiseKeyEvent(_gamepadBPressed, newPressedState, _GAMEPAD_B_KEY, _GAMEPAD_B_KEYCODE); + _gamepadBPressed = newPressedState; +}; - _ButtonPressedState.setleftThumbstickUp = function (newPressedState) { - raiseKeyEvent(_leftThumbstickUpPressed, newPressedState, _GAMEPAD_LEFT_THUMBSTICK_UP_KEY, _GAMEPAD_LEFT_THUMBSTICK_UP_KEYCODE, true); - _leftThumbstickUpPressed = newPressedState; - }; +_ButtonPressedState.getleftThumbstickUp = function () { + return _leftThumbstickUpPressed; +}; - _ButtonPressedState.getleftThumbstickDown = function () { - return _leftThumbstickDownPressed; - }; +_ButtonPressedState.setleftThumbstickUp = function (newPressedState) { + raiseKeyEvent(_leftThumbstickUpPressed, newPressedState, _GAMEPAD_LEFT_THUMBSTICK_UP_KEY, _GAMEPAD_LEFT_THUMBSTICK_UP_KEYCODE, true); + _leftThumbstickUpPressed = newPressedState; +}; - _ButtonPressedState.setleftThumbstickDown = function (newPressedState) { - raiseKeyEvent(_leftThumbstickDownPressed, newPressedState, _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEY, _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEYCODE, true); - _leftThumbstickDownPressed = newPressedState; - }; +_ButtonPressedState.getleftThumbstickDown = function () { + return _leftThumbstickDownPressed; +}; - _ButtonPressedState.getleftThumbstickLeft = function () { - return _leftThumbstickLeftPressed; - }; +_ButtonPressedState.setleftThumbstickDown = function (newPressedState) { + raiseKeyEvent(_leftThumbstickDownPressed, newPressedState, _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEY, _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEYCODE, true); + _leftThumbstickDownPressed = newPressedState; +}; - _ButtonPressedState.setleftThumbstickLeft = function (newPressedState) { - raiseKeyEvent(_leftThumbstickLeftPressed, newPressedState, _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEY, _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEYCODE, true); - _leftThumbstickLeftPressed = newPressedState; - }; +_ButtonPressedState.getleftThumbstickLeft = function () { + return _leftThumbstickLeftPressed; +}; - _ButtonPressedState.getleftThumbstickRight = function () { - return _leftThumbstickRightPressed; - }; +_ButtonPressedState.setleftThumbstickLeft = function (newPressedState) { + raiseKeyEvent(_leftThumbstickLeftPressed, newPressedState, _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEY, _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEYCODE, true); + _leftThumbstickLeftPressed = newPressedState; +}; - _ButtonPressedState.setleftThumbstickRight = function (newPressedState) { - raiseKeyEvent(_leftThumbstickRightPressed, newPressedState, _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEY, _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEYCODE, true); - _leftThumbstickRightPressed = newPressedState; - }; +_ButtonPressedState.getleftThumbstickRight = function () { + return _leftThumbstickRightPressed; +}; - _ButtonPressedState.getdPadUp = function () { - return _dPadUpPressed; - }; +_ButtonPressedState.setleftThumbstickRight = function (newPressedState) { + raiseKeyEvent(_leftThumbstickRightPressed, newPressedState, _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEY, _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEYCODE, true); + _leftThumbstickRightPressed = newPressedState; +}; - _ButtonPressedState.setdPadUp = function (newPressedState) { - raiseKeyEvent(_dPadUpPressed, newPressedState, _GAMEPAD_DPAD_UP_KEY, _GAMEPAD_DPAD_UP_KEYCODE, true); - _dPadUpPressed = newPressedState; - }; +_ButtonPressedState.getdPadUp = function () { + return _dPadUpPressed; +}; - _ButtonPressedState.getdPadDown = function () { - return _dPadDownPressed; - }; +_ButtonPressedState.setdPadUp = function (newPressedState) { + raiseKeyEvent(_dPadUpPressed, newPressedState, _GAMEPAD_DPAD_UP_KEY, _GAMEPAD_DPAD_UP_KEYCODE, true); + _dPadUpPressed = newPressedState; +}; - _ButtonPressedState.setdPadDown = function (newPressedState) { - raiseKeyEvent(_dPadDownPressed, newPressedState, _GAMEPAD_DPAD_DOWN_KEY, _GAMEPAD_DPAD_DOWN_KEYCODE, true); - _dPadDownPressed = newPressedState; - }; +_ButtonPressedState.getdPadDown = function () { + return _dPadDownPressed; +}; - _ButtonPressedState.getdPadLeft = function () { - return _dPadLeftPressed; - }; +_ButtonPressedState.setdPadDown = function (newPressedState) { + raiseKeyEvent(_dPadDownPressed, newPressedState, _GAMEPAD_DPAD_DOWN_KEY, _GAMEPAD_DPAD_DOWN_KEYCODE, true); + _dPadDownPressed = newPressedState; +}; - _ButtonPressedState.setdPadLeft = function (newPressedState) { - raiseKeyEvent(_dPadLeftPressed, newPressedState, _GAMEPAD_DPAD_LEFT_KEY, _GAMEPAD_DPAD_LEFT_KEYCODE, true); - _dPadLeftPressed = newPressedState; - }; +_ButtonPressedState.getdPadLeft = function () { + return _dPadLeftPressed; +}; - _ButtonPressedState.getdPadRight = function () { - return _dPadRightPressed; - }; +_ButtonPressedState.setdPadLeft = function (newPressedState) { + raiseKeyEvent(_dPadLeftPressed, newPressedState, _GAMEPAD_DPAD_LEFT_KEY, _GAMEPAD_DPAD_LEFT_KEYCODE, true); + _dPadLeftPressed = newPressedState; +}; - _ButtonPressedState.setdPadRight = function (newPressedState) { - raiseKeyEvent(_dPadRightPressed, newPressedState, _GAMEPAD_DPAD_RIGHT_KEY, _GAMEPAD_DPAD_RIGHT_KEYCODE, true); - _dPadRightPressed = newPressedState; - }; +_ButtonPressedState.getdPadRight = function () { + return _dPadRightPressed; +}; - var times = {}; +_ButtonPressedState.setdPadRight = function (newPressedState) { + raiseKeyEvent(_dPadRightPressed, newPressedState, _GAMEPAD_DPAD_RIGHT_KEY, _GAMEPAD_DPAD_RIGHT_KEYCODE, true); + _dPadRightPressed = newPressedState; +}; - function throttle(key) { - var time = times[key] || 0; - var now = new Date().getTime(); +var times = {}; - if ((now - time) >= 200) { - //times[key] = now; - return true; - } - - return false; - } - - function resetThrottle(key) { - times[key] = new Date().getTime(); - } - - var isElectron = navigator.userAgent.toLowerCase().indexOf('electron') !== -1; - function allowInput() { - // This would be nice but always seems to return true with electron - if (!isElectron && document.hidden) { /* eslint-disable-line compat/compat */ - return false; - } - - if (appHost.getWindowState() === 'Minimized') { - return false; - } +function throttle(key) { + var time = times[key] || 0; + var now = new Date().getTime(); + if ((now - time) >= 200) { + //times[key] = now; return true; } - function raiseEvent(name, key, keyCode) { - if (!allowInput()) { - return; - } + return false; +} - var event = document.createEvent('Event'); - event.initEvent(name, true, true); - event.key = key; - event.keyCode = keyCode; - (document.activeElement || document.body).dispatchEvent(event); +function resetThrottle(key) { + times[key] = new Date().getTime(); +} + +var isElectron = navigator.userAgent.toLowerCase().indexOf('electron') !== -1; +function allowInput() { + // This would be nice but always seems to return true with electron + if (!isElectron && document.hidden) { /* eslint-disable-line compat/compat */ + return false; } - function clickElement(elem) { - if (!allowInput()) { - return; - } - - elem.click(); + if (appHost.getWindowState() === 'Minimized') { + return false; } - function raiseKeyEvent(oldPressedState, newPressedState, key, keyCode, enableRepeatKeyDown, clickonKeyUp) { - // No-op if oldPressedState === newPressedState - if (newPressedState === true) { - // button down - var fire = false; + return true; +} - // always fire if this is the initial down press - if (oldPressedState === false) { - fire = true; - resetThrottle(key); - } else if (enableRepeatKeyDown) { - fire = throttle(key); - } +function raiseEvent(name, key, keyCode) { + if (!allowInput()) { + return; + } - if (fire && keyCode) { - raiseEvent('keydown', key, keyCode); - } - } else if (newPressedState === false && oldPressedState === true) { + var event = document.createEvent('Event'); + event.initEvent(name, true, true); + event.key = key; + event.keyCode = keyCode; + (document.activeElement || document.body).dispatchEvent(event); +} + +function clickElement(elem) { + if (!allowInput()) { + return; + } + + elem.click(); +} + +function raiseKeyEvent(oldPressedState, newPressedState, key, keyCode, enableRepeatKeyDown, clickonKeyUp) { + // No-op if oldPressedState === newPressedState + if (newPressedState === true) { + // button down + var fire = false; + + // always fire if this is the initial down press + if (oldPressedState === false) { + fire = true; resetThrottle(key); + } else if (enableRepeatKeyDown) { + fire = throttle(key); + } - // button up - if (keyCode) { - raiseEvent('keyup', key, keyCode); - } - if (clickonKeyUp) { - clickElement(document.activeElement || window); - } + if (fire && keyCode) { + raiseEvent('keydown', key, keyCode); + } + } else if (newPressedState === false && oldPressedState === true) { + resetThrottle(key); + + // button up + if (keyCode) { + raiseEvent('keyup', key, keyCode); + } + if (clickonKeyUp) { + clickElement(document.activeElement || window); } } +} - var inputLoopTimer; - function runInputLoop() { - // Get the latest gamepad state. - var gamepads = navigator.getGamepads(); /* eslint-disable-line compat/compat */ - for (var i = 0, len = gamepads.length; i < len; i++) { - var gamepad = gamepads[i]; - if (!gamepad) { - continue; - } - // Iterate through the axes - var axes = gamepad.axes; - var leftStickX = axes[0]; - var leftStickY = axes[1]; - if (leftStickX > _THUMB_STICK_THRESHOLD) { // Right - _ButtonPressedState.setleftThumbstickRight(true); - } else if (leftStickX < -_THUMB_STICK_THRESHOLD) { // Left - _ButtonPressedState.setleftThumbstickLeft(true); - } else if (leftStickY < -_THUMB_STICK_THRESHOLD) { // Up - _ButtonPressedState.setleftThumbstickUp(true); - } else if (leftStickY > _THUMB_STICK_THRESHOLD) { // Down - _ButtonPressedState.setleftThumbstickDown(true); - } else { - _ButtonPressedState.setleftThumbstickLeft(false); - _ButtonPressedState.setleftThumbstickRight(false); - _ButtonPressedState.setleftThumbstickUp(false); - _ButtonPressedState.setleftThumbstickDown(false); - } - // Iterate through the buttons to see if Left thumbstick, DPad, A and B are pressed. - var buttons = gamepad.buttons; - for (var j = 0, len = buttons.length; j < len; j++) { - if (ProcessedButtons.indexOf(j) !== -1) { - if (buttons[j].pressed) { - switch (j) { - case _GAMEPAD_DPAD_UP_BUTTON_INDEX: - _ButtonPressedState.setdPadUp(true); - break; - case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: - _ButtonPressedState.setdPadDown(true); - break; - case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: - _ButtonPressedState.setdPadLeft(true); - break; - case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: - _ButtonPressedState.setdPadRight(true); - break; - case _GAMEPAD_A_BUTTON_INDEX: - _ButtonPressedState.setgamepadA(true); - break; - case _GAMEPAD_B_BUTTON_INDEX: - _ButtonPressedState.setgamepadB(true); - break; - default: - // No-op - break; - } - } else { - switch (j) { - case _GAMEPAD_DPAD_UP_BUTTON_INDEX: - if (_ButtonPressedState.getdPadUp()) { - _ButtonPressedState.setdPadUp(false); - } - break; - case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: - if (_ButtonPressedState.getdPadDown()) { - _ButtonPressedState.setdPadDown(false); - } - break; - case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: - if (_ButtonPressedState.getdPadLeft()) { - _ButtonPressedState.setdPadLeft(false); - } - break; - case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: - if (_ButtonPressedState.getdPadRight()) { - _ButtonPressedState.setdPadRight(false); - } - break; - case _GAMEPAD_A_BUTTON_INDEX: - if (_ButtonPressedState.getgamepadA()) { - _ButtonPressedState.setgamepadA(false); - } - break; - case _GAMEPAD_B_BUTTON_INDEX: - if (_ButtonPressedState.getgamepadB()) { - _ButtonPressedState.setgamepadB(false); - } - break; - default: - // No-op - break; - } +var inputLoopTimer; +function runInputLoop() { + // Get the latest gamepad state. + var gamepads = navigator.getGamepads(); /* eslint-disable-line compat/compat */ + for (var i = 0, len = gamepads.length; i < len; i++) { + var gamepad = gamepads[i]; + if (!gamepad) { + continue; + } + // Iterate through the axes + var axes = gamepad.axes; + var leftStickX = axes[0]; + var leftStickY = axes[1]; + if (leftStickX > _THUMB_STICK_THRESHOLD) { // Right + _ButtonPressedState.setleftThumbstickRight(true); + } else if (leftStickX < -_THUMB_STICK_THRESHOLD) { // Left + _ButtonPressedState.setleftThumbstickLeft(true); + } else if (leftStickY < -_THUMB_STICK_THRESHOLD) { // Up + _ButtonPressedState.setleftThumbstickUp(true); + } else if (leftStickY > _THUMB_STICK_THRESHOLD) { // Down + _ButtonPressedState.setleftThumbstickDown(true); + } else { + _ButtonPressedState.setleftThumbstickLeft(false); + _ButtonPressedState.setleftThumbstickRight(false); + _ButtonPressedState.setleftThumbstickUp(false); + _ButtonPressedState.setleftThumbstickDown(false); + } + // Iterate through the buttons to see if Left thumbstick, DPad, A and B are pressed. + var buttons = gamepad.buttons; + for (var j = 0, len = buttons.length; j < len; j++) { + if (ProcessedButtons.indexOf(j) !== -1) { + if (buttons[j].pressed) { + switch (j) { + case _GAMEPAD_DPAD_UP_BUTTON_INDEX: + _ButtonPressedState.setdPadUp(true); + break; + case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: + _ButtonPressedState.setdPadDown(true); + break; + case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: + _ButtonPressedState.setdPadLeft(true); + break; + case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: + _ButtonPressedState.setdPadRight(true); + break; + case _GAMEPAD_A_BUTTON_INDEX: + _ButtonPressedState.setgamepadA(true); + break; + case _GAMEPAD_B_BUTTON_INDEX: + _ButtonPressedState.setgamepadB(true); + break; + default: + // No-op + break; + } + } else { + switch (j) { + case _GAMEPAD_DPAD_UP_BUTTON_INDEX: + if (_ButtonPressedState.getdPadUp()) { + _ButtonPressedState.setdPadUp(false); + } + break; + case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: + if (_ButtonPressedState.getdPadDown()) { + _ButtonPressedState.setdPadDown(false); + } + break; + case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: + if (_ButtonPressedState.getdPadLeft()) { + _ButtonPressedState.setdPadLeft(false); + } + break; + case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: + if (_ButtonPressedState.getdPadRight()) { + _ButtonPressedState.setdPadRight(false); + } + break; + case _GAMEPAD_A_BUTTON_INDEX: + if (_ButtonPressedState.getgamepadA()) { + _ButtonPressedState.setgamepadA(false); + } + break; + case _GAMEPAD_B_BUTTON_INDEX: + if (_ButtonPressedState.getgamepadB()) { + _ButtonPressedState.setgamepadB(false); + } + break; + default: + // No-op + break; } } } } - // Schedule the next one - inputLoopTimer = requestAnimationFrame(runInputLoop); } + // Schedule the next one + inputLoopTimer = requestAnimationFrame(runInputLoop); +} - function startInputLoop() { - if (!inputLoopTimer) { - runInputLoop(); +function startInputLoop() { + if (!inputLoopTimer) { + runInputLoop(); + } +} + +function stopInputLoop() { + cancelAnimationFrame(inputLoopTimer); + inputLoopTimer = undefined; +} + +function isGamepadConnected() { + var gamepads = navigator.getGamepads(); /* eslint-disable-line compat/compat */ + for (var i = 0, len = gamepads.length; i < len; i++) { + var gamepad = gamepads[i]; + if (gamepad && gamepad.connected) { + return true; } } + return false; +} - function stopInputLoop() { - cancelAnimationFrame(inputLoopTimer); - inputLoopTimer = undefined; +function onFocusOrGamepadAttach(e) { + /* eslint-disable-next-line compat/compat */ + if (isGamepadConnected() && document.hasFocus()) { + console.log('Gamepad connected! Starting input loop'); + startInputLoop(); } +} - function isGamepadConnected() { - var gamepads = navigator.getGamepads(); /* eslint-disable-line compat/compat */ - for (var i = 0, len = gamepads.length; i < len; i++) { - var gamepad = gamepads[i]; - if (gamepad && gamepad.connected) { - return true; - } - } - return false; +function onFocusOrGamepadDetach(e) { + /* eslint-disable-next-line compat/compat */ + if (!isGamepadConnected() || !document.hasFocus()) { + console.log('Gamepad disconnected! No other gamepads are connected, stopping input loop'); + stopInputLoop(); + } else { + console.log('Gamepad disconnected! There are gamepads still connected.'); } +} - function onFocusOrGamepadAttach(e) { - /* eslint-disable-next-line compat/compat */ - if (isGamepadConnected() && document.hasFocus()) { - console.log('Gamepad connected! Starting input loop'); - startInputLoop(); - } - } +// Event listeners for any change in gamepads' state. +window.addEventListener('gamepaddisconnected', onFocusOrGamepadDetach); +window.addEventListener('gamepadconnected', onFocusOrGamepadAttach); +window.addEventListener('blur', onFocusOrGamepadDetach); +window.addEventListener('focus', onFocusOrGamepadAttach); - function onFocusOrGamepadDetach(e) { - /* eslint-disable-next-line compat/compat */ - if (!isGamepadConnected() || !document.hasFocus()) { - console.log('Gamepad disconnected! No other gamepads are connected, stopping input loop'); - stopInputLoop(); - } else { - console.log('Gamepad disconnected! There are gamepads still connected.'); - } - } +onFocusOrGamepadAttach(); - // Event listeners for any change in gamepads' state. - window.addEventListener('gamepaddisconnected', onFocusOrGamepadDetach); - window.addEventListener('gamepadconnected', onFocusOrGamepadAttach); - window.addEventListener('blur', onFocusOrGamepadDetach); - window.addEventListener('focus', onFocusOrGamepadAttach); - - onFocusOrGamepadAttach(); - - // The gamepadInputEmulation is a string property that exists in JavaScript UWAs and in WebViews in UWAs. - // It won't exist in Win8.1 style apps or browsers. - if (window.navigator && typeof window.navigator.gamepadInputEmulation === 'string') { - // We want the gamepad to provide gamepad VK keyboard events rather than moving a - // mouse like cursor. Set to "keyboard", the gamepad will provide such keyboard events - // and provide input to the DOM navigator.getGamepads API. - window.navigator.gamepadInputEmulation = 'gamepad'; - } -}); +// The gamepadInputEmulation is a string property that exists in JavaScript UWAs and in WebViews in UWAs. +// It won't exist in Win8.1 style apps or browsers. +if (window.navigator && typeof window.navigator.gamepadInputEmulation === 'string') { + // We want the gamepad to provide gamepad VK keyboard events rather than moving a + // mouse like cursor. Set to "keyboard", the gamepad will provide such keyboard events + // and provide input to the DOM navigator.getGamepads API. + window.navigator.gamepadInputEmulation = 'gamepad'; +} diff --git a/src/scripts/globalize.js b/src/scripts/globalize.js index 4af1ea6cbf..d237fdcce0 100644 --- a/src/scripts/globalize.js +++ b/src/scripts/globalize.js @@ -63,11 +63,11 @@ import events from 'events'; } function ensureTranslations(culture) { - for (let i in allTranslations) { + for (const i in allTranslations) { ensureTranslation(allTranslations[i], culture); } if (culture !== fallbackCulture) { - for (let i in allTranslations) { + for (const i in allTranslations) { ensureTranslation(allTranslations[i], fallbackCulture); } } diff --git a/src/scripts/inputManager.js b/src/scripts/inputManager.js index aa2c2945c0..baa3deb0aa 100644 --- a/src/scripts/inputManager.js +++ b/src/scripts/inputManager.js @@ -35,10 +35,11 @@ import appHost from 'apphost'; if (eventListenerCount) { eventListenerCount--; } + dom.removeEventListener(scope, 'command', fn, {}); } - let commandTimes = {}; + const commandTimes = {}; function checkCommandTime(command) { const last = commandTimes[command] || 0; @@ -184,6 +185,12 @@ import appHost from 'apphost'; 'changezoom': () => { playbackManager.toggleAspectRatio(); }, + 'increaseplaybackrate': () => { + playbackManager.increasePlaybackRate(); + }, + 'decreaseplaybackrate': () => { + playbackManager.decreasePlaybackRate(); + }, 'changeaudiotrack': () => { playbackManager.changeAudioStream(); }, diff --git a/src/scripts/itembynamedetailpage.js b/src/scripts/itembynamedetailpage.js index eaeecba275..f77bb73652 100644 --- a/src/scripts/itembynamedetailpage.js +++ b/src/scripts/itembynamedetailpage.js @@ -1,369 +1,374 @@ -define(['connectionManager', 'listView', 'cardBuilder', 'imageLoader', 'libraryBrowser', 'globalize', 'emby-itemscontainer', 'emby-button'], function (connectionManager, listView, cardBuilder, imageLoader, libraryBrowser, globalize) { - 'use strict'; +import connectionManager from 'connectionManager'; +import listView from 'listView'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import globalize from 'globalize'; +import 'emby-itemscontainer'; +import 'emby-button'; - function renderItems(page, item) { - var sections = []; +function renderItems(page, item) { + const sections = []; - if (item.ArtistCount) { - sections.push({ - name: globalize.translate('TabArtists'), - type: 'MusicArtist' - }); - } - - if (item.ProgramCount && item.Type == 'Person') { - sections.push({ - name: globalize.translate('HeaderUpcomingOnTV'), - type: 'Program' - }); - } - - if (item.MovieCount) { - sections.push({ - name: globalize.translate('TabMovies'), - type: 'Movie' - }); - } - - if (item.SeriesCount) { - sections.push({ - name: globalize.translate('TabShows'), - type: 'Series' - }); - } - - if (item.EpisodeCount) { - sections.push({ - name: globalize.translate('TabEpisodes'), - type: 'Episode' - }); - } - - if (item.TrailerCount) { - sections.push({ - name: globalize.translate('TabTrailers'), - type: 'Trailer' - }); - } - - if (item.AlbumCount) { - sections.push({ - name: globalize.translate('TabAlbums'), - type: 'MusicAlbum' - }); - } - - if (item.MusicVideoCount) { - sections.push({ - name: globalize.translate('TabMusicVideos'), - type: 'MusicVideo' - }); - } - - var elem = page.querySelector('#childrenContent'); - elem.innerHTML = sections.map(function (section) { - var html = ''; - var sectionClass = 'verticalSection'; - - if (section.type === 'Audio') { - sectionClass += ' verticalSection-extrabottompadding'; - } - - html += '
    '; - html += '
    '; - html += '

    '; - html += section.name; - html += '

    '; - html += ''; - html += '
    '; - html += '
    '; - html += '
    '; - return html += '
    '; - }).join(''); - var sectionElems = elem.querySelectorAll('.verticalSection'); - - for (var i = 0, length = sectionElems.length; i < length; i++) { - renderSection(page, item, sectionElems[i], sectionElems[i].getAttribute('data-type')); - } - } - - function renderSection(page, item, element, type) { - switch (type) { - case 'Program': - loadItems(element, item, type, { - MediaTypes: '', - IncludeItemTypes: 'Program', - PersonTypes: '', - ArtistIds: '', - AlbumArtistIds: '', - Limit: 10, - SortBy: 'StartDate' - }, { - shape: 'overflowBackdrop', - showTitle: true, - centerText: true, - overlayMoreButton: true, - preferThumb: true, - overlayText: false, - showAirTime: true, - showAirDateTime: true, - showChannelName: true - }); - break; - - case 'Movie': - loadItems(element, item, type, { - MediaTypes: '', - IncludeItemTypes: 'Movie', - PersonTypes: '', - ArtistIds: '', - AlbumArtistIds: '', - Limit: 10, - SortBy: 'SortName' - }, { - shape: 'overflowPortrait', - showTitle: true, - centerText: true, - overlayMoreButton: true, - overlayText: false, - showYear: true - }); - break; - - case 'MusicVideo': - loadItems(element, item, type, { - MediaTypes: '', - IncludeItemTypes: 'MusicVideo', - PersonTypes: '', - ArtistIds: '', - AlbumArtistIds: '', - Limit: 10, - SortBy: 'SortName' - }, { - shape: 'overflowPortrait', - showTitle: true, - centerText: true, - overlayPlayButton: true - }); - break; - - case 'Trailer': - loadItems(element, item, type, { - MediaTypes: '', - IncludeItemTypes: 'Trailer', - PersonTypes: '', - ArtistIds: '', - AlbumArtistIds: '', - Limit: 10, - SortBy: 'SortName' - }, { - shape: 'overflowPortrait', - showTitle: true, - centerText: true, - overlayPlayButton: true - }); - break; - - case 'Series': - loadItems(element, item, type, { - MediaTypes: '', - IncludeItemTypes: 'Series', - PersonTypes: '', - ArtistIds: '', - AlbumArtistIds: '', - Limit: 10, - SortBy: 'SortName' - }, { - shape: 'overflowPortrait', - showTitle: true, - centerText: true, - overlayMoreButton: true - }); - break; - - case 'MusicAlbum': - loadItems(element, item, type, { - MediaTypes: '', - IncludeItemTypes: 'MusicAlbum', - PersonTypes: '', - ArtistIds: '', - AlbumArtistIds: '', - SortOrder: 'Descending', - SortBy: 'ProductionYear,Sortname' - }, { - shape: 'overflowSquare', - playFromHere: true, - showTitle: true, - showYear: true, - coverImage: true, - centerText: true, - overlayPlayButton: true - }); - break; - - case 'MusicArtist': - loadItems(element, item, type, { - MediaTypes: '', - IncludeItemTypes: 'MusicArtist', - PersonTypes: '', - ArtistIds: '', - AlbumArtistIds: '', - Limit: 8, - SortBy: 'SortName' - }, { - shape: 'overflowSquare', - playFromHere: true, - showTitle: true, - showParentTitle: true, - coverImage: true, - centerText: true, - overlayPlayButton: true - }); - break; - - case 'Episode': - loadItems(element, item, type, { - MediaTypes: '', - IncludeItemTypes: 'Episode', - PersonTypes: '', - ArtistIds: '', - AlbumArtistIds: '', - Limit: 6, - SortBy: 'SortName' - }, { - shape: 'overflowBackdrop', - showTitle: true, - showParentTitle: true, - centerText: true, - overlayPlayButton: true - }); - break; - - case 'Audio': - loadItems(element, item, type, { - MediaTypes: '', - IncludeItemTypes: 'Audio', - PersonTypes: '', - ArtistIds: '', - AlbumArtistIds: '', - SortBy: 'AlbumArtist,Album,SortName' - }, { - playFromHere: true, - action: 'playallfromhere', - smallIcon: true, - artist: true - }); - } - } - - function loadItems(element, item, type, query, listOptions) { - query = getQuery(query, item); - getItemsFunction(query, item)(query.StartIndex, query.Limit, query.Fields).then(function (result) { - var html = ''; - - if (query.Limit && result.TotalRecordCount > query.Limit) { - var link = element.querySelector('a'); - link.classList.remove('hide'); - link.setAttribute('href', getMoreItemsHref(item, type)); - } else { - element.querySelector('a').classList.add('hide'); - } - - listOptions.items = result.Items; - var itemsContainer = element.querySelector('.itemsContainer'); - - if (type == 'Audio') { - html = listView.getListViewHtml(listOptions); - itemsContainer.classList.remove('vertical-wrap'); - itemsContainer.classList.add('vertical-list'); - } else { - html = cardBuilder.getCardsHtml(listOptions); - itemsContainer.classList.add('vertical-wrap'); - itemsContainer.classList.remove('vertical-list'); - } - - itemsContainer.innerHTML = html; - imageLoader.lazyChildren(itemsContainer); + if (item.ArtistCount) { + sections.push({ + name: globalize.translate('Artists'), + type: 'MusicArtist' }); } - function getMoreItemsHref(item, type) { - if (item.Type == 'Genre') { - return 'list.html?type=' + type + '&genreId=' + item.Id + '&serverId=' + item.ServerId; - } - - if (item.Type == 'MusicGenre') { - return 'list.html?type=' + type + '&musicGenreId=' + item.Id + '&serverId=' + item.ServerId; - } - - if (item.Type == 'Studio') { - return 'list.html?type=' + type + '&studioId=' + item.Id + '&serverId=' + item.ServerId; - } - - if (item.Type == 'MusicArtist') { - return 'list.html?type=' + type + '&artistId=' + item.Id + '&serverId=' + item.ServerId; - } - - if (item.Type == 'Person') { - return 'list.html?type=' + type + '&personId=' + item.Id + '&serverId=' + item.ServerId; - } - - return 'list.html?type=' + type + '&parentId=' + item.Id + '&serverId=' + item.ServerId; + if (item.ProgramCount && item.Type === 'Person') { + sections.push({ + name: globalize.translate('HeaderUpcomingOnTV'), + type: 'Program' + }); } - function addCurrentItemToQuery(query, item) { - if (item.Type == 'Person') { - query.PersonIds = item.Id; - } else if (item.Type == 'Genre') { - query.Genres = item.Name; - } else if (item.Type == 'MusicGenre') { - query.Genres = item.Name; - } else if (item.Type == 'GameGenre') { - query.Genres = item.Name; - } else if (item.Type == 'Studio') { - query.StudioIds = item.Id; - } else if (item.Type == 'MusicArtist') { - query.AlbumArtistIds = item.Id; + if (item.MovieCount) { + sections.push({ + name: globalize.translate('Movies'), + type: 'Movie' + }); + } + + if (item.SeriesCount) { + sections.push({ + name: globalize.translate('Shows'), + type: 'Series' + }); + } + + if (item.EpisodeCount) { + sections.push({ + name: globalize.translate('Episodes'), + type: 'Episode' + }); + } + + if (item.TrailerCount) { + sections.push({ + name: globalize.translate('Trailers'), + type: 'Trailer' + }); + } + + if (item.AlbumCount) { + sections.push({ + name: globalize.translate('Albums'), + type: 'MusicAlbum' + }); + } + + if (item.MusicVideoCount) { + sections.push({ + name: globalize.translate('HeaderMusicVideos'), + type: 'MusicVideo' + }); + } + + const elem = page.querySelector('#childrenContent'); + elem.innerHTML = sections.map(function (section) { + let html = ''; + let sectionClass = 'verticalSection'; + + if (section.type === 'Audio') { + sectionClass += ' verticalSection-extrabottompadding'; } + + html += '
    '; + html += '
    '; + html += '

    '; + html += section.name; + html += '

    '; + html += ''; + html += '
    '; + html += '
    '; + html += '
    '; + html += '
    '; + return html; + }).join(''); + const sectionElems = elem.querySelectorAll('.verticalSection'); + + for (let i = 0, length = sectionElems.length; i < length; i++) { + renderSection(page, item, sectionElems[i], sectionElems[i].getAttribute('data-type')); + } +} + +function renderSection(page, item, element, type) { + switch (type) { + case 'Program': + loadItems(element, item, type, { + MediaTypes: '', + IncludeItemTypes: 'Program', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + Limit: 10, + SortBy: 'StartDate' + }, { + shape: 'overflowBackdrop', + showTitle: true, + centerText: true, + overlayMoreButton: true, + preferThumb: true, + overlayText: false, + showAirTime: true, + showAirDateTime: true, + showChannelName: true + }); + break; + + case 'Movie': + loadItems(element, item, type, { + MediaTypes: '', + IncludeItemTypes: 'Movie', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + Limit: 10, + SortBy: 'SortName' + }, { + shape: 'overflowPortrait', + showTitle: true, + centerText: true, + overlayMoreButton: true, + overlayText: false, + showYear: true + }); + break; + + case 'MusicVideo': + loadItems(element, item, type, { + MediaTypes: '', + IncludeItemTypes: 'MusicVideo', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + Limit: 10, + SortBy: 'SortName' + }, { + shape: 'overflowPortrait', + showTitle: true, + centerText: true, + overlayPlayButton: true + }); + break; + + case 'Trailer': + loadItems(element, item, type, { + MediaTypes: '', + IncludeItemTypes: 'Trailer', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + Limit: 10, + SortBy: 'SortName' + }, { + shape: 'overflowPortrait', + showTitle: true, + centerText: true, + overlayPlayButton: true + }); + break; + + case 'Series': + loadItems(element, item, type, { + MediaTypes: '', + IncludeItemTypes: 'Series', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + Limit: 10, + SortBy: 'SortName' + }, { + shape: 'overflowPortrait', + showTitle: true, + centerText: true, + overlayMoreButton: true + }); + break; + + case 'MusicAlbum': + loadItems(element, item, type, { + MediaTypes: '', + IncludeItemTypes: 'MusicAlbum', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + SortOrder: 'Descending', + SortBy: 'ProductionYear,Sortname' + }, { + shape: 'overflowSquare', + playFromHere: true, + showTitle: true, + showYear: true, + coverImage: true, + centerText: true, + overlayPlayButton: true + }); + break; + + case 'MusicArtist': + loadItems(element, item, type, { + MediaTypes: '', + IncludeItemTypes: 'MusicArtist', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + Limit: 8, + SortBy: 'SortName' + }, { + shape: 'overflowSquare', + playFromHere: true, + showTitle: true, + showParentTitle: true, + coverImage: true, + centerText: true, + overlayPlayButton: true + }); + break; + + case 'Episode': + loadItems(element, item, type, { + MediaTypes: '', + IncludeItemTypes: 'Episode', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + Limit: 6, + SortBy: 'SortName' + }, { + shape: 'overflowBackdrop', + showTitle: true, + showParentTitle: true, + centerText: true, + overlayPlayButton: true + }); + break; + + case 'Audio': + loadItems(element, item, type, { + MediaTypes: '', + IncludeItemTypes: 'Audio', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + SortBy: 'AlbumArtist,Album,SortName' + }, { + playFromHere: true, + action: 'playallfromhere', + smallIcon: true, + artist: true + }); + } +} + +function loadItems(element, item, type, query, listOptions) { + query = getQuery(query, item); + getItemsFunction(query, item)(query.StartIndex, query.Limit, query.Fields).then(function (result) { + let html = ''; + + if (query.Limit && result.TotalRecordCount > query.Limit) { + const link = element.querySelector('a'); + link.classList.remove('hide'); + link.setAttribute('href', getMoreItemsHref(item, type)); + } else { + element.querySelector('a').classList.add('hide'); + } + + listOptions.items = result.Items; + const itemsContainer = element.querySelector('.itemsContainer'); + + if (type === 'Audio') { + html = listView.getListViewHtml(listOptions); + itemsContainer.classList.remove('vertical-wrap'); + itemsContainer.classList.add('vertical-list'); + } else { + html = cardBuilder.getCardsHtml(listOptions); + itemsContainer.classList.add('vertical-wrap'); + itemsContainer.classList.remove('vertical-list'); + } + + itemsContainer.innerHTML = html; + imageLoader.lazyChildren(itemsContainer); + }); +} + +function getMoreItemsHref(item, type) { + if (item.Type === 'Genre') { + return 'list.html?type=' + type + '&genreId=' + item.Id + '&serverId=' + item.ServerId; } - function getQuery(options, item) { - var query = { - SortOrder: 'Ascending', - IncludeItemTypes: '', - Recursive: true, - Fields: 'AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo', - Limit: 100, - StartIndex: 0, - CollapseBoxSetItems: false - }; - query = Object.assign(query, options || {}); - addCurrentItemToQuery(query, item); - return query; + if (item.Type === 'MusicGenre') { + return 'list.html?type=' + type + '&musicGenreId=' + item.Id + '&serverId=' + item.ServerId; } - function getItemsFunction(options, item) { - var query = getQuery(options, item); - return function (index, limit, fields) { - query.StartIndex = index; - query.Limit = limit; - - if (fields) { - query.Fields += ',' + fields; - } - - var apiClient = connectionManager.getApiClient(item.ServerId); - - if (query.IncludeItemTypes === 'MusicArtist') { - query.IncludeItemTypes = null; - return apiClient.getAlbumArtists(apiClient.getCurrentUserId(), query); - } - - return apiClient.getItems(apiClient.getCurrentUserId(), query); - }; + if (item.Type === 'Studio') { + return 'list.html?type=' + type + '&studioId=' + item.Id + '&serverId=' + item.ServerId; } - window.ItemsByName = { - renderItems: renderItems + if (item.Type === 'MusicArtist') { + return 'list.html?type=' + type + '&artistId=' + item.Id + '&serverId=' + item.ServerId; + } + + if (item.Type === 'Person') { + return 'list.html?type=' + type + '&personId=' + item.Id + '&serverId=' + item.ServerId; + } + + return 'list.html?type=' + type + '&parentId=' + item.Id + '&serverId=' + item.ServerId; +} + +function addCurrentItemToQuery(query, item) { + if (item.Type === 'Person') { + query.PersonIds = item.Id; + } else if (item.Type === 'Genre') { + query.Genres = item.Name; + } else if (item.Type === 'MusicGenre') { + query.Genres = item.Name; + } else if (item.Type === 'GameGenre') { + query.Genres = item.Name; + } else if (item.Type === 'Studio') { + query.StudioIds = item.Id; + } else if (item.Type === 'MusicArtist') { + query.AlbumArtistIds = item.Id; + } +} + +function getQuery(options, item) { + let query = { + SortOrder: 'Ascending', + IncludeItemTypes: '', + Recursive: true, + Fields: 'AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo', + Limit: 100, + StartIndex: 0, + CollapseBoxSetItems: false }; -}); + query = Object.assign(query, options || {}); + addCurrentItemToQuery(query, item); + return query; +} + +function getItemsFunction(options, item) { + const query = getQuery(options, item); + return function (index, limit, fields) { + query.StartIndex = index; + query.Limit = limit; + + if (fields) { + query.Fields += ',' + fields; + } + + const apiClient = connectionManager.getApiClient(item.ServerId); + + if (query.IncludeItemTypes === 'MusicArtist') { + query.IncludeItemTypes = null; + return apiClient.getAlbumArtists(apiClient.getCurrentUserId(), query); + } + + return apiClient.getItems(apiClient.getCurrentUserId(), query); + }; +} + +window.ItemsByName = { + renderItems: renderItems +}; diff --git a/src/scripts/keyboardNavigation.js b/src/scripts/keyboardNavigation.js index 10a9611c33..ec354a7ba3 100644 --- a/src/scripts/keyboardNavigation.js +++ b/src/scripts/keyboardNavigation.js @@ -155,7 +155,7 @@ export function enable() { function attachGamepadScript(e) { console.log('Gamepad connected! Attaching gamepadtokey.js script'); window.removeEventListener('gamepadconnected', attachGamepadScript); - /* eslint-disable-next-line no-unused-expressions */ + /* eslint-disable-next-line @babel/no-unused-expressions */ import('scripts/gamepadtokey'); } diff --git a/src/scripts/libraryBrowser.js b/src/scripts/libraryBrowser.js index 46cda51e55..5b5a1aad80 100644 --- a/src/scripts/libraryBrowser.js +++ b/src/scripts/libraryBrowser.js @@ -105,11 +105,11 @@ export function getQueryPagingHtml (options) { } if (options.sortButton) { - html += ''; + html += ''; } if (options.filterButton) { - html += ''; + html += ''; } html += '
    '; @@ -119,7 +119,10 @@ export function getQueryPagingHtml (options) { } export function showSortMenu (options) { - require(['dialogHelper', 'emby-radio'], function (dialogHelper) { + Promise.all([ + import('dialogHelper'), + import('emby-radio') + ]).then(([{default: dialogHelper}]) => { function onSortByChange() { var newValue = this.value; diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index d2a68cd6e3..07d59c76cc 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -1,8 +1,26 @@ -define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', 'viewManager', 'libraryBrowser', 'appRouter', 'apphost', 'playbackManager', 'syncPlayManager', 'groupSelectionMenu', 'browser', 'globalize', 'scripts/imagehelper', 'paper-icon-button-light', 'material-icons', 'scrollStyles', 'flexStyles'], function (dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, syncPlayManager, groupSelectionMenu, browser, globalize, imageHelper) { - 'use strict'; +import dom from 'dom'; +import layoutManager from 'layoutManager'; +import inputManager from 'inputManager'; +import connectionManager from 'connectionManager'; +import events from 'events'; +import viewManager from 'viewManager'; +import appRouter from 'appRouter'; +import appHost from 'apphost'; +import playbackManager from 'playbackManager'; +import syncPlayManager from 'syncPlayManager'; +import * as groupSelectionMenu from 'groupSelectionMenu'; +import browser from 'browser'; +import globalize from 'globalize'; +import imageHelper from 'scripts/imagehelper'; +import 'paper-icon-button-light'; +import 'material-icons'; +import 'scrollStyles'; +import 'flexStyles'; + +/* eslint-disable indent */ function renderHeader() { - var html = ''; + let html = ''; html += '
    '; html += '
    '; html += ''; @@ -15,7 +33,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' html += ``; html += ``; html += ``; - html += ``; + html += ``; html += ''; html += '
    '; html += '
    '; @@ -46,7 +64,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function lazyLoadViewMenuBarImages() { - require(['imageLoader'], function (imageLoader) { + import('imageLoader').then(({default: imageLoader}) => { imageLoader.lazyChildren(skinHeader); }); } @@ -56,11 +74,11 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function updateUserInHeader(user) { - var hasImage; + let hasImage; if (user && user.name) { if (user.imageUrl) { - var url = user.imageUrl; + const url = user.imageUrl; updateHeaderUserButton(url); hasImage = true; } @@ -87,9 +105,9 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' headerCastButton.classList.remove('hide'); } - var policy = user.Policy ? user.Policy : user.localUser.Policy; + const policy = user.Policy ? user.Policy : user.localUser.Policy; - var apiClient = getCurrentApiClient(); + const apiClient = getCurrentApiClient(); if (headerSyncButton && policy && policy.SyncPlayAccess !== 'None' && apiClient.isMinServerVersion('10.6.0')) { headerSyncButton.classList.remove('hide'); } @@ -139,7 +157,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' mainDrawerButton.addEventListener('click', toggleMainDrawer); } - var headerBackButton = skinHeader.querySelector('.headerBackButton'); + const headerBackButton = skinHeader.querySelector('.headerBackButton'); if (headerBackButton) { headerBackButton.addEventListener('click', onBackClick); @@ -181,20 +199,20 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function onCastButtonClicked() { - var btn = this; + const btn = this; - require(['playerSelectionMenu'], function (playerSelectionMenu) { + import('playerSelectionMenu').then(({default: playerSelectionMenu}) => { playerSelectionMenu.show(btn); }); } function onSyncButtonClicked() { - var btn = this; + const btn = this; groupSelectionMenu.show(btn); } function onSyncPlayEnabled(event, enabled) { - var icon = headerSyncButton.querySelector('span'); + const icon = headerSyncButton.querySelector('span'); icon.classList.remove('sync', 'sync_disabled', 'sync_problem'); if (enabled) { icon.classList.add('sync'); @@ -204,7 +222,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function onSyncPlaySyncing(event, is_syncing, syncMethod) { - var icon = headerSyncButton.querySelector('span'); + const icon = headerSyncButton.querySelector('span'); icon.classList.remove('sync', 'sync_disabled', 'sync_problem'); if (is_syncing) { icon.classList.add('sync_problem'); @@ -250,9 +268,9 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function refreshLibraryInfoInDrawer(user, drawer) { - var html = ''; + let html = ''; html += '
    '; - html += '' + globalize.translate('ButtonHome') + ''; + html += '' + globalize.translate('Home') + ''; // libraries are added here html += '
    '; @@ -286,12 +304,12 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' // add buttons to navigation drawer navDrawerScrollContainer.innerHTML = html; - var btnSettings = navDrawerScrollContainer.querySelector('.btnSettings'); + const btnSettings = navDrawerScrollContainer.querySelector('.btnSettings'); if (btnSettings) { btnSettings.addEventListener('click', onSettingsClick); } - var btnLogout = navDrawerScrollContainer.querySelector('.btnLogout'); + const btnLogout = navDrawerScrollContainer.querySelector('.btnLogout'); if (btnLogout) { btnLogout.addEventListener('click', onLogoutClick); } @@ -313,20 +331,20 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function updateDashboardMenuSelectedItem() { - var links = navDrawerScrollContainer.querySelectorAll('.navMenuOption'); - var currentViewId = viewManager.currentView().id; + const links = navDrawerScrollContainer.querySelectorAll('.navMenuOption'); + const currentViewId = viewManager.currentView().id; - for (var i = 0, length = links.length; i < length; i++) { - var link = links[i]; - var selected = false; - var pageIds = link.getAttribute('data-pageids'); + for (let i = 0, length = links.length; i < length; i++) { + let link = links[i]; + let selected = false; + let pageIds = link.getAttribute('data-pageids'); if (pageIds) { pageIds = pageIds.split('|'); selected = pageIds.indexOf(currentViewId) != -1; } - var pageUrls = link.getAttribute('data-pageurls'); + let pageUrls = link.getAttribute('data-pageurls'); if (pageUrls) { pageUrls = pageUrls.split('|'); @@ -335,7 +353,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' if (selected) { link.classList.add('navMenuOption-selected'); - var title = ''; + let title = ''; link = link.querySelector('.navMenuOptionText') || link; title += (link.innerText || link.textContent).trim(); LibraryMenu.setTitle(title); @@ -346,7 +364,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function createToolsMenuList(pluginItems) { - var links = [{ + const links = [{ name: globalize.translate('TabServer') }, { name: globalize.translate('TabDashboard'), @@ -359,7 +377,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' pageIds: ['dashboardGeneralPage'], icon: 'settings' }, { - name: globalize.translate('TabUsers'), + name: globalize.translate('HeaderUsers'), href: 'userprofiles.html', pageIds: ['userProfilesPage', 'newUserPage', 'editUserPage', 'userLibraryAccessPage', 'userParentalControlPage', 'userPasswordPage'], icon: 'people' @@ -369,7 +387,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' pageIds: ['mediaLibraryPage', 'librarySettingsPage', 'libraryDisplayPage', 'metadataImagesConfigurationPage', 'metadataNfoPage'], icon: 'folder' }, { - name: globalize.translate('TabPlayback'), + name: globalize.translate('TitlePlayback'), icon: 'play_arrow', href: 'encodingsettings.html', pageIds: ['encodingSettingsPage', 'playbackConfigurationPage', 'streamingSettingsPage'] @@ -377,10 +395,10 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' addPluginPagesToMainMenu(links, pluginItems, 'server'); links.push({ divider: true, - name: globalize.translate('TabDevices') + name: globalize.translate('HeaderDevices') }); links.push({ - name: globalize.translate('TabDevices'), + name: globalize.translate('HeaderDevices'), href: 'devices.html', pageIds: ['devicesPage', 'devicePage'], icon: 'devices' @@ -399,16 +417,16 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' }); links.push({ divider: true, - name: globalize.translate('TabLiveTV') + name: globalize.translate('LiveTV') }); links.push({ - name: globalize.translate('TabLiveTV'), + name: globalize.translate('LiveTV'), href: 'livetvstatus.html', pageIds: ['liveTvStatusPage', 'liveTvTunerPage'], icon: 'live_tv' }); links.push({ - name: globalize.translate('TabDVR'), + name: globalize.translate('HeaderDVR'), href: 'livetvsettings.html', pageIds: ['liveTvSettingsPage'], icon: 'dvr' @@ -458,8 +476,8 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function addPluginPagesToMainMenu(links, pluginItems, section) { - for (var i = 0, length = pluginItems.length; i < length; i++) { - var pluginItem = pluginItems[i]; + for (let i = 0, length = pluginItems.length; i < length; i++) { + const pluginItem = pluginItems[i]; if (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section) { links.push({ @@ -479,10 +497,10 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function getToolsLinkHtml(item) { - var menuHtml = ''; - var pageIds = item.pageIds ? item.pageIds.join('|') : ''; + let menuHtml = ''; + let pageIds = item.pageIds ? item.pageIds.join('|') : ''; pageIds = pageIds ? ' data-pageids="' + pageIds + '"' : ''; - var pageUrls = item.pageUrls ? item.pageUrls.join('|') : ''; + let pageUrls = item.pageUrls ? item.pageUrls.join('|') : ''; pageUrls = pageUrls ? ' data-pageurls="' + pageUrls + '"' : ''; menuHtml += ''; @@ -498,11 +516,11 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' function getToolsMenuHtml(apiClient) { return getToolsMenuLinks(apiClient).then(function (items) { - var item; - var menuHtml = ''; + let item; + let menuHtml = ''; menuHtml += '
    '; - for (var i = 0; i < items.length; i++) { + for (let i = 0; i < items.length; i++) { item = items[i]; if (item.href) { @@ -520,7 +538,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' function createDashboardMenu(apiClient) { return getToolsMenuHtml(apiClient).then(function (toolsMenuHtml) { - var html = ''; + let html = ''; html += ''; @@ -531,25 +549,25 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function onSidebarLinkClick() { - var section = this.getElementsByClassName('sectionName')[0]; - var text = section ? section.innerHTML : this.innerHTML; + const section = this.getElementsByClassName('sectionName')[0]; + const text = section ? section.innerHTML : this.innerHTML; LibraryMenu.setTitle(text); } function getUserViews(apiClient, userId) { return apiClient.getUserViews({}, userId).then(function (result) { - var items = result.Items; - var list = []; + const items = result.Items; + const list = []; - for (var i = 0, length = items.length; i < length; i++) { - var view = items[i]; + for (let i = 0, length = items.length; i < length; i++) { + const view = items[i]; list.push(view); if (view.CollectionType == 'livetv') { view.ImageTags = {}; view.icon = 'live_tv'; - var guideView = Object.assign({}, view); - guideView.Name = globalize.translate('ButtonGuide'); + const guideView = Object.assign({}, view); + guideView.Name = globalize.translate('Guide'); guideView.ImageTags = {}; guideView.icon = 'dvr'; guideView.url = 'livetv.html?tab=1'; @@ -562,7 +580,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function showBySelector(selector, show) { - var elem = document.querySelector(selector); + const elem = document.querySelector(selector); if (elem) { if (show) { @@ -592,17 +610,17 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' showBySelector('.libraryMenuDownloads', false); } - var userId = Dashboard.getCurrentUserId(); - var apiClient = getCurrentApiClient(); - var libraryMenuOptions = document.querySelector('.libraryMenuOptions'); + const userId = Dashboard.getCurrentUserId(); + const apiClient = getCurrentApiClient(); + const libraryMenuOptions = document.querySelector('.libraryMenuOptions'); if (libraryMenuOptions) { getUserViews(apiClient, userId).then(function (result) { - var items = result; - var html = `

    ${globalize.translate('HeaderMedia')}

    `; + const items = result; + let html = `

    ${globalize.translate('HeaderMedia')}

    `; html += items.map(function (i) { - var icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType); - var itemId = i.Id; + const icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType); + const itemId = i.Id; return ` @@ -610,8 +628,8 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' `; }).join(''); libraryMenuOptions.innerHTML = html; - var elem = libraryMenuOptions; - var sidebarLinks = elem.querySelectorAll('.navMenuOption'); + const elem = libraryMenuOptions; + const sidebarLinks = elem.querySelectorAll('.navMenuOption'); for (const sidebarLink of sidebarLinks) { sidebarLink.removeEventListener('click', onSidebarLinkClick); @@ -640,9 +658,9 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function updateCastIcon() { - var context = document; - var info = playbackManager.getPlayerInfo(); - var icon = headerCastButton.querySelector('.material-icons'); + const context = document; + const info = playbackManager.getPlayerInfo(); + const icon = headerCastButton.querySelector('.material-icons'); icon.classList.remove('cast_connected', 'cast'); @@ -658,18 +676,16 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function updateLibraryNavLinks(page) { - var i; - var length; - var isLiveTvPage = page.classList.contains('liveTvPage'); - var isChannelsPage = page.classList.contains('channelsPage'); - var isEditorPage = page.classList.contains('metadataEditorPage'); - var isMySyncPage = page.classList.contains('mySyncPage'); - var id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains('allLibraryPage') ? '' : getTopParentId() || ''; - var elems = document.getElementsByClassName('lnkMediaFolder'); + const isLiveTvPage = page.classList.contains('liveTvPage'); + const isChannelsPage = page.classList.contains('channelsPage'); + const isEditorPage = page.classList.contains('metadataEditorPage'); + const isMySyncPage = page.classList.contains('mySyncPage'); + const id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains('allLibraryPage') ? '' : getTopParentId() || ''; + const elems = document.getElementsByClassName('lnkMediaFolder'); - for (var i = 0, length = elems.length; i < length; i++) { - var lnkMediaFolder = elems[i]; - var itemId = lnkMediaFolder.getAttribute('data-itemid'); + for (let i = 0, length = elems.length; i < length; i++) { + const lnkMediaFolder = elems[i]; + const itemId = lnkMediaFolder.getAttribute('data-itemid'); if (isChannelsPage && itemId === 'channels') { lnkMediaFolder.classList.add('navMenuOption-selected'); @@ -690,7 +706,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function updateMenuForPageType(isDashboardPage, isLibraryPage) { - var newPageType = isDashboardPage ? 2 : isLibraryPage ? 1 : 3; + const newPageType = isDashboardPage ? 2 : isLibraryPage ? 1 : 3; if (currentPageType !== newPageType) { currentPageType = newPageType; @@ -701,7 +717,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' skinHeader.classList.remove('headroomDisabled'); } - var bodyClassList = document.body.classList; + const bodyClassList = document.body.classList; if (isLibraryPage) { bodyClassList.add('libraryDocument'); @@ -738,7 +754,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function updateTitle(page) { - var title = page.getAttribute('data-title'); + const title = page.getAttribute('data-title'); if (title) { LibraryMenu.setTitle(title); @@ -762,8 +778,8 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function initHeadRoom(elem) { - require(['headroom'], function (Headroom) { - var headroom = new Headroom(elem); + import('headroom').then(({default: Headroom}) => { + const headroom = new Headroom(elem); headroom.init(); }); } @@ -783,7 +799,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function getNavDrawerOptions() { - var drawerWidth = screen.availWidth - 50; + let drawerWidth = window.screen.availWidth - 50; drawerWidth = Math.max(drawerWidth, 240); drawerWidth = Math.min(drawerWidth, 320); return { @@ -802,7 +818,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' navDrawerScrollContainer = navDrawerElement.querySelector('.scrollContainer'); navDrawerScrollContainer.addEventListener('click', onMainDrawerClick); return new Promise(function (resolve, reject) { - require(['navdrawer'], function (navdrawer) { + import('navdrawer').then(({default: navdrawer}) => { navDrawerInstance = new navdrawer(getNavDrawerOptions()); if (!layoutManager.tv) { @@ -814,98 +830,98 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' }); } - var navDrawerElement; - var navDrawerScrollContainer; - var navDrawerInstance; - var mainDrawerButton; - var headerHomeButton; - var currentDrawerType; - var pageTitleElement; - var headerBackButton; - var headerUserButton; - var currentUser; - var headerCastButton; - var headerSearchButton; - var headerAudioPlayerButton; - var headerSyncButton; - var enableLibraryNavDrawer = layoutManager.desktop; - var enableLibraryNavDrawerHome = !layoutManager.tv; - var skinHeader = document.querySelector('.skinHeader'); - var requiresUserRefresh = true; - window.LibraryMenu = { - getTopParentId: getTopParentId, - onHardwareMenuButtonClick: function () { - toggleMainDrawer(); - }, - setTabs: function (type, selectedIndex, builder) { - require(['mainTabsManager'], function (mainTabsManager) { - if (type) { - mainTabsManager.setTabs(viewManager.currentView(), selectedIndex, builder, function () { - return []; - }); - } else { - mainTabsManager.setTabs(null); - } - }); - }, - setDefaultTitle: function () { - if (!pageTitleElement) { - pageTitleElement = document.querySelector('.pageTitle'); - } + let navDrawerElement; + let navDrawerScrollContainer; + let navDrawerInstance; + let mainDrawerButton; + let headerHomeButton; + let currentDrawerType; + let pageTitleElement; + let headerBackButton; + let headerUserButton; + let currentUser; + let headerCastButton; + let headerSearchButton; + let headerAudioPlayerButton; + let headerSyncButton; + const enableLibraryNavDrawer = layoutManager.desktop; + const enableLibraryNavDrawerHome = !layoutManager.tv; + const skinHeader = document.querySelector('.skinHeader'); + let requiresUserRefresh = true; - if (pageTitleElement) { - pageTitleElement.classList.add('pageTitleWithLogo'); - pageTitleElement.classList.add('pageTitleWithDefaultLogo'); - pageTitleElement.style.backgroundImage = null; - pageTitleElement.innerHTML = ''; - } - - document.title = 'Jellyfin'; - }, - setTitle: function (title) { - if (title == null) { - return void LibraryMenu.setDefaultTitle(); - } - - if (title === '-') { - title = ''; - } - - var html = title; - - if (!pageTitleElement) { - pageTitleElement = document.querySelector('.pageTitle'); - } - - if (pageTitleElement) { - pageTitleElement.classList.remove('pageTitleWithLogo'); - pageTitleElement.classList.remove('pageTitleWithDefaultLogo'); - pageTitleElement.style.backgroundImage = null; - pageTitleElement.innerHTML = html || ''; - } - - document.title = title || 'Jellyfin'; - }, - setTransparentMenu: function (transparent) { - if (transparent) { - skinHeader.classList.add('semiTransparent'); + function setTabs (type, selectedIndex, builder) { + import('mainTabsManager').then((mainTabsManager) => { + if (type) { + mainTabsManager.setTabs(viewManager.currentView(), selectedIndex, builder, function () { + return []; + }); } else { - skinHeader.classList.remove('semiTransparent'); + mainTabsManager.setTabs(null); } + }); + } + + function setDefaultTitle () { + if (!pageTitleElement) { + pageTitleElement = document.querySelector('.pageTitle'); } - }; - var currentPageType; + + if (pageTitleElement) { + pageTitleElement.classList.add('pageTitleWithLogo'); + pageTitleElement.classList.add('pageTitleWithDefaultLogo'); + pageTitleElement.style.backgroundImage = null; + pageTitleElement.innerHTML = ''; + } + + document.title = 'Jellyfin'; + } + + function setTitle (title) { + if (title == null) { + return void LibraryMenu.setDefaultTitle(); + } + + if (title === '-') { + title = ''; + } + + const html = title; + + if (!pageTitleElement) { + pageTitleElement = document.querySelector('.pageTitle'); + } + + if (pageTitleElement) { + pageTitleElement.classList.remove('pageTitleWithLogo'); + pageTitleElement.classList.remove('pageTitleWithDefaultLogo'); + pageTitleElement.style.backgroundImage = null; + pageTitleElement.innerHTML = html || ''; + } + + document.title = title || 'Jellyfin'; + } + + function setTransparentMenu (transparent) { + if (transparent) { + skinHeader.classList.add('semiTransparent'); + } else { + skinHeader.classList.remove('semiTransparent'); + } + } + + let currentPageType; pageClassOn('pagebeforeshow', 'page', function (e) { if (!this.classList.contains('withTabs')) { LibraryMenu.setTabs(null); } }); + pageClassOn('pageshow', 'page', function (e) { - var page = this; - var isDashboardPage = page.classList.contains('type-interior'); - var isHomePage = page.classList.contains('homePage'); - var isLibraryPage = !isDashboardPage && page.classList.contains('libraryPage'); - var apiClient = getCurrentApiClient(); + const page = this; + const isDashboardPage = page.classList.contains('type-interior'); + const isHomePage = page.classList.contains('homePage'); + const isLibraryPage = !isDashboardPage && page.classList.contains('libraryPage'); + const apiClient = getCurrentApiClient(); if (isDashboardPage) { if (mainDrawerButton) { @@ -942,7 +958,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' renderHeader(); events.on(connectionManager, 'localusersignedin', function (e, user) { - var currentApiClient = connectionManager.getApiClient(user.ServerId); + const currentApiClient = connectionManager.getApiClient(user.ServerId); currentDrawerType = null; currentUser = { @@ -956,15 +972,32 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' updateUserInHeader(user); }); }); + events.on(connectionManager, 'localusersignedout', function () { currentUser = {}; updateUserInHeader(); }); + events.on(playbackManager, 'playerchange', updateCastIcon); events.on(syncPlayManager, 'enabled', onSyncPlayEnabled); events.on(syncPlayManager, 'syncing', onSyncPlaySyncing); loadNavDrawer(); - return LibraryMenu; -}); + + const LibraryMenu = { + getTopParentId: getTopParentId, + onHardwareMenuButtonClick: function () { + toggleMainDrawer(); + }, + setTabs: setTabs, + setDefaultTitle: setDefaultTitle, + setTitle: setTitle, + setTransparentMenu: setTransparentMenu + }; + + window.LibraryMenu = LibraryMenu; + +export default LibraryMenu; + +/* eslint-enable indent */ diff --git a/src/scripts/livetvcomponents.js b/src/scripts/livetvcomponents.js index fd1b48d0eb..46fb714763 100644 --- a/src/scripts/livetvcomponents.js +++ b/src/scripts/livetvcomponents.js @@ -1,115 +1,109 @@ -define(['layoutManager', 'datetime', 'cardBuilder', 'apphost'], function (layoutManager, datetime, cardBuilder, appHost) { - 'use strict'; +import layoutManager from 'layoutManager'; +import datetime from 'datetime'; +import cardBuilder from 'cardBuilder'; - function enableScrollX() { - return !layoutManager.desktop; +function enableScrollX() { + return !layoutManager.desktop; +} + +function getBackdropShape() { + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; +} + +function getTimersHtml(timers, options) { + options = options || {}; + + const items = timers.map(function (t) { + t.Type = 'Timer'; + return t; + }); + + const groups = []; + let currentGroupName = ''; + let currentGroup = []; + + for (const item of items) { + let dateText = ''; + + if (options.indexByDate !== false && item.StartDate) { + try { + const premiereDate = datetime.parseISO8601Date(item.StartDate, true); + dateText = datetime.toLocaleDateString(premiereDate, { + weekday: 'long', + month: 'short', + day: 'numeric' + }); + } catch (err) { + console.error('error parsing premiereDate:' + item.StartDate + '; error: ' + err); + } + } + + if (dateText != currentGroupName) { + if (currentGroup.length) { + groups.push({ + name: currentGroupName, + items: currentGroup + }); + } + + currentGroupName = dateText; + currentGroup = [item]; + } else { + currentGroup.push(item); + } } - function getBackdropShape() { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - } - - function getTimersHtml(timers, options) { - options = options || {}; - var i; - var length; - var items = timers.map(function (t) { - t.Type = 'Timer'; - return t; + if (currentGroup.length) { + groups.push({ + name: currentGroupName, + items: currentGroup }); - var groups = []; - var currentGroupName = ''; - var currentGroup = []; - - for (i = 0, length = items.length; i < length; i++) { - var item = items[i]; - var dateText = ''; - - if (options.indexByDate !== false && item.StartDate) { - try { - var premiereDate = datetime.parseISO8601Date(item.StartDate, true); - dateText = datetime.toLocaleDateString(premiereDate, { - weekday: 'long', - month: 'short', - day: 'numeric' - }); - } catch (err) { - console.error('error parsing premiereDate:' + item.StartDate + '; error: ' + err); - } - } - - if (dateText != currentGroupName) { - if (currentGroup.length) { - groups.push({ - name: currentGroupName, - items: currentGroup - }); - } - - currentGroupName = dateText; - currentGroup = [item]; - } else { - currentGroup.push(item); - } - } - - if (currentGroup.length) { - groups.push({ - name: currentGroupName, - items: currentGroup - }); - } - - var html = ''; - - for (i = 0, length = groups.length; i < length; i++) { - var group = groups[i]; - - if (group.name) { - html += '
    '; - html += '

    ' + group.name + '

    '; - } - if (enableScrollX()) { - var scrollXClass = 'scrollX hiddenScrollX'; - - if (layoutManager.tv) { - scrollXClass += ' smoothScrollX'; - } - - html += '
    '; - } else { - html += '
    '; - } - - html += cardBuilder.getCardsHtml({ - items: group.items, - shape: getBackdropShape(), - showParentTitleOrTitle: true, - showAirTime: true, - showAirEndTime: true, - showChannelName: false, - cardLayout: true, - centerText: false, - action: 'edit', - cardFooterAside: 'none', - preferThumb: true, - defaultShape: null, - coverImage: true, - allowBottomPadding: false, - overlayText: false, - showChannelLogo: true - }); - html += '
    '; - - if (group.name) { - html += '
    '; - } - } - - return Promise.resolve(html); } + let html = ''; + for (const group of groups) { + if (group.name) { + html += '
    '; + html += '

    ' + group.name + '

    '; + } - window.LiveTvHelpers = { - getTimersHtml: getTimersHtml - }; -}); + if (enableScrollX()) { + let scrollXClass = 'scrollX hiddenScrollX'; + if (layoutManager.tv) { + scrollXClass += ' smoothScrollX'; + } + html += '
    '; + } else { + html += '
    '; + } + + html += cardBuilder.getCardsHtml({ + items: group.items, + shape: getBackdropShape(), + showParentTitleOrTitle: true, + showAirTime: true, + showAirEndTime: true, + showChannelName: false, + cardLayout: true, + centerText: false, + action: 'edit', + cardFooterAside: 'none', + preferThumb: true, + defaultShape: null, + coverImage: true, + allowBottomPadding: false, + overlayText: false, + showChannelLogo: true + }); + + html += '
    '; + + if (group.name) { + html += '
    '; + } + } + return Promise.resolve(html); +} + +window.LiveTvHelpers = { + getTimersHtml: getTimersHtml +}; diff --git a/src/scripts/mouseManager.js b/src/scripts/mouseManager.js index d801d82393..40253fb91c 100644 --- a/src/scripts/mouseManager.js +++ b/src/scripts/mouseManager.js @@ -1,10 +1,15 @@ -define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'dom'], function (inputManager, focusManager, browser, layoutManager, events, dom) { - 'use strict'; +import inputManager from 'inputManager'; +import focusManager from 'focusManager'; +import browser from 'browser'; +import layoutManager from 'layoutManager'; +import events from 'events'; +import dom from 'dom'; +/* eslint-disable indent */ - var self = {}; + const self = {}; - var lastMouseInputTime = new Date().getTime(); - var isMouseIdle; + let lastMouseInputTime = new Date().getTime(); + let isMouseIdle; function mouseIdleTime() { return new Date().getTime() - lastMouseInputTime; @@ -15,14 +20,14 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd } function removeIdleClasses() { - var classList = document.body.classList; + const classList = document.body.classList; classList.remove('mouseIdle'); classList.remove('mouseIdle-tv'); } function addIdleClasses() { - var classList = document.body.classList; + const classList = document.body.classList; classList.add('mouseIdle'); @@ -31,7 +36,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd } } - function showCursor() { + export function showCursor() { if (isMouseIdle) { isMouseIdle = false; removeIdleClasses(); @@ -39,7 +44,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd } } - function hideCursor() { + export function hideCursor() { if (!isMouseIdle) { isMouseIdle = true; addIdleClasses(); @@ -47,17 +52,17 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd } } - var lastPointerMoveData; + let lastPointerMoveData; function onPointerMove(e) { - var eventX = e.screenX; - var eventY = e.screenY; + const eventX = e.screenX; + const eventY = e.screenY; // if coord don't exist how could it move if (typeof eventX === 'undefined' && typeof eventY === 'undefined') { return; } - var obj = lastPointerMoveData; + const obj = lastPointerMoveData; if (!obj) { lastPointerMoveData = { x: eventX, @@ -81,11 +86,11 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd } function onPointerEnter(e) { - var pointerType = e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'); + const pointerType = e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'); if (pointerType === 'mouse') { if (!isMouseIdle) { - var parent = focusManager.focusableParent(e.target); + const parent = focusManager.focusableParent(e.target); if (parent) { focusManager.focus(parent); } @@ -115,7 +120,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd } } - var mouseInterval; + let mouseInterval; function startMouseInterval() { if (!mouseInterval) { mouseInterval = setInterval(onMouseInterval, 5000); @@ -123,7 +128,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd } function stopMouseInterval() { - var interval = mouseInterval; + const interval = mouseInterval; if (interval) { clearInterval(interval); @@ -167,8 +172,10 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd events.on(layoutManager, 'modechange', initMouse); - self.hideCursor = hideCursor; - self.showCursor = showCursor; +/* eslint-enable indent */ + +export default { + hideCursor, + showCursor +}; - return self; -}); diff --git a/src/scripts/multiDownload.js b/src/scripts/multiDownload.js index b4ad95a975..d1c717af0e 100644 --- a/src/scripts/multiDownload.js +++ b/src/scripts/multiDownload.js @@ -31,7 +31,7 @@ function sameDomain(url) { var a = document.createElement('a'); a.href = url; - return location.hostname === a.hostname && location.protocol === a.protocol; + return window.location.hostname === a.hostname && window.location.protocol === a.protocol; } function download(url) { @@ -62,4 +62,3 @@ export default function (urls) { download(url); }); } - diff --git a/src/scripts/routes.js b/src/scripts/routes.js index 1d735e3018..4bb3eb25d9 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -1,18 +1,21 @@ -define([ - 'jQuery', - 'emby-button', - 'emby-input', - 'scripts/livetvcomponents', - 'paper-icon-button-light', - 'emby-itemscontainer', - 'emby-collapse', - 'emby-select', - 'livetvcss', - 'emby-checkbox', - 'emby-slider', - 'listViewStyle', - 'dashboardcss', - 'detailtablecss'], function () { +import 'emby-button'; +import 'emby-input'; +import 'scripts/livetvcomponents'; +import 'paper-icon-button-light'; +import 'emby-itemscontainer'; +import 'emby-collapse'; +import 'emby-select'; +import 'livetvcss'; +import 'emby-checkbox'; +import 'emby-slider'; +import 'listViewStyle'; +import 'dashboardcss'; +import 'detailtablecss'; + +/* eslint-disable indent */ + + console.groupCollapsed('defining core routes'); + function defineRoute(newRoute) { var path = newRoute.alias ? newRoute.alias : newRoute.path; console.debug('defining route: ' + path); @@ -20,8 +23,6 @@ define([ Emby.Page.addRoute(path, newRoute); } - console.debug('defining core routes'); - defineRoute({ alias: '/addserver.html', path: '/controllers/session/addServer/index.html', @@ -30,6 +31,7 @@ define([ startup: true, controller: 'session/addServer/index' }); + defineRoute({ alias: '/selectserver.html', path: '/controllers/session/selectServer/index.html', @@ -39,6 +41,7 @@ define([ controller: 'session/selectServer/index', type: 'selectserver' }); + defineRoute({ alias: '/login.html', path: '/controllers/session/login/index.html', @@ -48,6 +51,7 @@ define([ controller: 'session/login/index', type: 'login' }); + defineRoute({ alias: '/forgotpassword.html', path: '/controllers/session/forgotPassword/index.html', @@ -55,6 +59,7 @@ define([ startup: true, controller: 'session/forgotPassword/index' }); + defineRoute({ alias: '/forgotpasswordpin.html', path: '/controllers/session/redeemPassword/index.html', @@ -68,87 +73,108 @@ define([ alias: '/mypreferencesmenu.html', path: '/controllers/user/menu/index.html', autoFocus: false, - transition: 'fade', controller: 'user/menu/index' }); + defineRoute({ alias: '/myprofile.html', path: '/controllers/user/profile/index.html', autoFocus: false, - transition: 'fade', controller: 'user/profile/index' }); + defineRoute({ alias: '/mypreferencesdisplay.html', path: '/controllers/user/display/index.html', autoFocus: false, - transition: 'fade', controller: 'user/display/index' }); + defineRoute({ alias: '/mypreferenceshome.html', path: '/controllers/user/home/index.html', autoFocus: false, - transition: 'fade', controller: 'user/home/index' }); + defineRoute({ alias: '/mypreferencesplayback.html', path: '/controllers/user/playback/index.html', autoFocus: false, - transition: 'fade', controller: 'user/playback/index' }); + defineRoute({ alias: '/mypreferencessubtitles.html', path: '/controllers/user/subtitles/index.html', autoFocus: false, - transition: 'fade', controller: 'user/subtitles/index' }); defineRoute({ - path: '/dashboard.html', + alias: '/dashboard.html', + path: '/controllers/dashboard/dashboard.html', autoFocus: false, roles: 'admin', controller: 'dashboard/dashboard' }); + defineRoute({ - path: '/dashboardgeneral.html', + alias: '/dashboardgeneral.html', + path: '/controllers/dashboard/general.html', controller: 'dashboard/general', autoFocus: false, roles: 'admin' }); + defineRoute({ - path: '/networking.html', + alias: '/networking.html', + path: '/controllers/dashboard/networking.html', autoFocus: false, roles: 'admin', controller: 'dashboard/networking' }); + defineRoute({ - path: '/devices.html', + alias: '/devices.html', + path: '/controllers/dashboard/devices/devices.html', autoFocus: false, roles: 'admin', controller: 'dashboard/devices/devices' }); + defineRoute({ - path: '/device.html', + alias: '/device.html', + path: '/controllers/dashboard/devices/device.html', autoFocus: false, roles: 'admin', controller: 'dashboard/devices/device' }); + defineRoute({ - path: '/dlnaprofile.html', + alias: '/dlnaprofile.html', + path: '/controllers/dashboard/dlna/profile.html', autoFocus: false, roles: 'admin', controller: 'dashboard/dlna/profile' }); + defineRoute({ - path: '/dlnaprofiles.html', + alias: '/dlnaprofiles.html', + path: '/controllers/dashboard/dlna/profiles.html', autoFocus: false, roles: 'admin', controller: 'dashboard/dlna/profiles' }); + + defineRoute({ + alias: '/dlnasettings.html', + path: '/controllers/dashboard/dlna/settings.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/dlna/settings' + }); + defineRoute({ alias: '/addplugin.html', path: '/controllers/dashboard/plugins/add/index.html', @@ -156,52 +182,61 @@ define([ roles: 'admin', controller: 'dashboard/plugins/add/index' }); + defineRoute({ - path: '/library.html', + alias: '/library.html', + path: '/controllers/dashboard/library.html', autoFocus: false, roles: 'admin', - controller: 'dashboard/mediaLibrary' + controller: 'dashboard/library' }); + defineRoute({ - path: '/librarydisplay.html', + alias: '/librarydisplay.html', + path: '/controllers/dashboard/librarydisplay.html', autoFocus: false, roles: 'admin', controller: 'dashboard/librarydisplay' }); + defineRoute({ - path: '/dlnasettings.html', - autoFocus: false, - roles: 'admin', - controller: 'dashboard/dlna/settings' - }); - defineRoute({ - path: '/edititemmetadata.html', + alias: '/edititemmetadata.html', + path: '/controllers/edititemmetadata.html', controller: 'edititemmetadata', autoFocus: false }); + defineRoute({ - path: '/encodingsettings.html', + alias: '/encodingsettings.html', + path: '/controllers/dashboard/encodingsettings.html', autoFocus: false, roles: 'admin', controller: 'dashboard/encodingsettings' }); + defineRoute({ - path: '/log.html', + alias: '/log.html', + path: '/controllers/dashboard/logs.html', roles: 'admin', controller: 'dashboard/logs' }); + defineRoute({ - path: '/metadataimages.html', + alias: '/metadataimages.html', + path: '/controllers/dashboard/metadataimages.html', autoFocus: false, roles: 'admin', controller: 'dashboard/metadataImages' }); + defineRoute({ - path: '/metadatanfo.html', + alias: '/metadatanfo.html', + path: '/controllers/dashboard/metadatanfo.html', autoFocus: false, roles: 'admin', controller: 'dashboard/metadatanfo' }); + defineRoute({ alias: '/notificationsetting.html', path: '/controllers/dashboard/notifications/notification/index.html', @@ -209,6 +244,7 @@ define([ roles: 'admin', controller: 'dashboard/notifications/notification/index' }); + defineRoute({ alias: '/notificationsettings.html', path: '/controllers/dashboard/notifications/notifications/index.html', @@ -216,12 +252,15 @@ define([ autoFocus: false, roles: 'admin' }); + defineRoute({ - path: '/playbackconfiguration.html', + alias: '/playbackconfiguration.html', + path: '/controllers/dashboard/playback.html', autoFocus: false, roles: 'admin', controller: 'dashboard/playback' }); + defineRoute({ alias: '/availableplugins.html', path: '/controllers/dashboard/plugins/available/index.html', @@ -229,6 +268,7 @@ define([ roles: 'admin', controller: 'dashboard/plugins/available/index' }); + defineRoute({ alias: '/repositories.html', path: '/controllers/dashboard/plugins/repositories/index.html', @@ -238,70 +278,85 @@ define([ }); defineRoute({ - path: '/home.html', + alias: '/home.html', + path: '/controllers/home.html', autoFocus: false, controller: 'home', - transition: 'fade', type: 'home' }); + defineRoute({ - path: '/search.html', + alias: '/search.html', + path: '/controllers/search.html', controller: 'searchpage' }); + defineRoute({ - path: '/list.html', + alias: '/list.html', + path: '/controllers/list.html', autoFocus: false, - controller: 'list', - transition: 'fade' + controller: 'list' }); + defineRoute({ alias: '/details', path: '/controllers/itemDetails/index.html', controller: 'itemDetails/index', - autoFocus: false, - transition: 'fade' + autoFocus: false }); + defineRoute({ - path: '/livetv.html', + alias: '/livetv.html', + path: '/controllers/livetv.html', controller: 'livetv/livetvsuggested', - autoFocus: false, - transition: 'fade' + autoFocus: false }); + defineRoute({ - path: '/livetvguideprovider.html', + alias: '/livetvguideprovider.html', + path: '/controllers/livetvguideprovider.html', autoFocus: false, roles: 'admin', controller: 'livetvguideprovider' }); + defineRoute({ - path: '/livetvsettings.html', + alias: '/livetvsettings.html', + path: '/controllers/livetvsettings.html', autoFocus: false, controller: 'livetvsettings' }); + defineRoute({ - path: '/livetvstatus.html', + alias: '/livetvstatus.html', + path: '/controllers/livetvstatus.html', autoFocus: false, roles: 'admin', controller: 'livetvstatus' }); + defineRoute({ - path: '/livetvtuner.html', + alias: '/livetvtuner.html', + path: '/controllers/livetvtuner.html', autoFocus: false, roles: 'admin', controller: 'livetvtuner' }); + defineRoute({ - path: '/movies.html', + alias: '/movies.html', + path: '/controllers/movies/movies.html', autoFocus: false, - controller: 'movies/moviesrecommended', - transition: 'fade' + controller: 'movies/moviesrecommended' }); + defineRoute({ - path: '/music.html', + alias: '/music.html', + path: '/controllers/music/music.html', controller: 'music/musicrecommended', - autoFocus: false, - transition: 'fade' + autoFocus: false }); + defineRoute({ alias: '/installedplugins.html', path: '/controllers/dashboard/plugins/installed/index.html', @@ -309,74 +364,96 @@ define([ roles: 'admin', controller: 'dashboard/plugins/installed/index' }); + defineRoute({ - path: '/scheduledtask.html', + alias: '/scheduledtask.html', + path: '/controllers/dashboard/scheduledtasks/scheduledtask.html', autoFocus: false, roles: 'admin', controller: 'dashboard/scheduledtasks/scheduledtask' }); + defineRoute({ - path: '/scheduledtasks.html', + alias: '/scheduledtasks.html', + path: '/controllers/dashboard/scheduledtasks/scheduledtasks.html', autoFocus: false, roles: 'admin', controller: 'dashboard/scheduledtasks/scheduledtasks' }); + defineRoute({ - path: '/serveractivity.html', + alias: '/serveractivity.html', + path: '/controllers/dashboard/serveractivity.html', autoFocus: false, roles: 'admin', controller: 'dashboard/serveractivity' }); + defineRoute({ - path: '/apikeys.html', + alias: '/apikeys.html', + path: '/controllers/dashboard/apikeys.html', autoFocus: false, roles: 'admin', controller: 'dashboard/apikeys' }); + defineRoute({ - path: '/streamingsettings.html', + alias: '/streamingsettings.html', + path: '/controllers/dashboard/streaming.html', autoFocus: false, roles: 'admin', controller: 'dashboard/streaming' }); + defineRoute({ - path: '/tv.html', + alias: '/tv.html', + path: '/controllers/shows/tvrecommended.html', autoFocus: false, - controller: 'shows/tvrecommended', - transition: 'fade' + controller: 'shows/tvrecommended' }); defineRoute({ - path: '/useredit.html', + alias: '/useredit.html', + path: '/controllers/dashboard/users/useredit.html', autoFocus: false, roles: 'admin', controller: 'dashboard/users/useredit' }); + defineRoute({ - path: '/userlibraryaccess.html', + alias: '/userlibraryaccess.html', + path: '/controllers/dashboard/users/userlibraryaccess.html', autoFocus: false, roles: 'admin', controller: 'dashboard/users/userlibraryaccess' }); + defineRoute({ - path: '/usernew.html', + alias: '/usernew.html', + path: '/controllers/dashboard/users/usernew.html', autoFocus: false, roles: 'admin', controller: 'dashboard/users/usernew' }); + defineRoute({ - path: '/userparentalcontrol.html', + alias: '/userparentalcontrol.html', + path: '/controllers/dashboard/users/userparentalcontrol.html', autoFocus: false, roles: 'admin', controller: 'dashboard/users/userparentalcontrol' }); + defineRoute({ - path: '/userpassword.html', + alias: '/userpassword.html', + path: '/controllers/dashboard/users/userpassword.html', autoFocus: false, controller: 'dashboard/users/userpasswordpage' }); + defineRoute({ - path: '/userprofiles.html', + alias: '/userprofiles.html', + path: '/controllers/dashboard/users/userprofiles.html', autoFocus: false, roles: 'admin', controller: 'dashboard/users/userprofilespage' @@ -389,6 +466,7 @@ define([ anonymous: true, controller: 'wizard/remote/index' }); + defineRoute({ alias: '/wizardfinish.html', path: '/controllers/wizard/finish/index.html', @@ -396,12 +474,15 @@ define([ anonymous: true, controller: 'wizard/finish/index' }); + defineRoute({ - path: '/wizardlibrary.html', + alias: '/wizardlibrary.html', + path: '/controllers/wizard/library.html', autoFocus: false, anonymous: true, - controller: 'dashboard/mediaLibrary' + controller: 'dashboard/library' }); + defineRoute({ alias: '/wizardsettings.html', path: '/controllers/wizard/settings/index.html', @@ -409,6 +490,7 @@ define([ anonymous: true, controller: 'wizard/settings/index' }); + defineRoute({ alias: '/wizardstart.html', path: '/controllers/wizard/start/index.html', @@ -416,6 +498,7 @@ define([ anonymous: true, controller: 'wizard/start/index' }); + defineRoute({ alias: '/wizarduser.html', path: '/controllers/wizard/user/index.html', @@ -427,7 +510,6 @@ define([ defineRoute({ alias: '/video', path: '/controllers/playback/video/index.html', - transition: 'fade', controller: 'playback/video/index', autoFocus: false, type: 'video-osd', @@ -435,16 +517,17 @@ define([ fullscreen: true, enableMediaControl: false }); + defineRoute({ alias: '/queue', path: '/controllers/playback/queue/index.html', controller: 'playback/queue/index', autoFocus: false, - transition: 'fade', fullscreen: true, supportsThemeMedia: true, enableMediaControl: false }); + defineRoute({ path: '/configurationpage', autoFocus: false, @@ -458,9 +541,13 @@ define([ isDefaultRoute: true, autoFocus: false }); + defineRoute({ path: '/index.html', autoFocus: false, isDefaultRoute: true }); -}); + + console.groupEnd('defining core routes'); + +/* eslint-enable indent */ diff --git a/src/scripts/scrollHelper.js b/src/scripts/scrollHelper.js index 82413fe9cf..b867123683 100644 --- a/src/scripts/scrollHelper.js +++ b/src/scripts/scrollHelper.js @@ -1,135 +1,138 @@ -define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) { - 'use strict'; +import focusManager from 'focusManager'; +import dom from 'dom'; +import 'scrollStyles'; - function getBoundingClientRect(elem) { - // Support: BlackBerry 5, iOS 3 (original iPhone) - // If we don't have gBCR, just use 0,0 rather than error - if (elem.getBoundingClientRect) { - return elem.getBoundingClientRect(); - } else { - return { top: 0, left: 0 }; - } +function getBoundingClientRect(elem) { + // Support: BlackBerry 5, iOS 3 (original iPhone) + // If we don't have gBCR, just use 0,0 rather than error + if (elem.getBoundingClientRect) { + return elem.getBoundingClientRect(); + } else { + return { top: 0, left: 0 }; + } +} + +export function getPosition(scrollContainer, item, horizontal) { + const slideeOffset = getBoundingClientRect(scrollContainer); + const itemOffset = getBoundingClientRect(item); + + let offset = horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top; + let size = horizontal ? itemOffset.width : itemOffset.height; + if (!size && size !== 0) { + size = item[horizontal ? 'offsetWidth' : 'offsetHeight']; } - function getPosition(scrollContainer, item, horizontal) { - var slideeOffset = getBoundingClientRect(scrollContainer); - var itemOffset = getBoundingClientRect(item); + const currentStart = horizontal ? scrollContainer.scrollLeft : scrollContainer.scrollTop; - var offset = horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top; - var size = horizontal ? itemOffset.width : itemOffset.height; - if (!size && size !== 0) { - size = item[horizontal ? 'offsetWidth' : 'offsetHeight']; - } + offset += currentStart; - var currentStart = horizontal ? scrollContainer.scrollLeft : scrollContainer.scrollTop; + const frameSize = horizontal ? scrollContainer.offsetWidth : scrollContainer.offsetHeight; - offset += currentStart; + const currentEnd = currentStart + frameSize; - var frameSize = horizontal ? scrollContainer.offsetWidth : scrollContainer.offsetHeight; - - var currentEnd = currentStart + frameSize; - - var isVisible = offset >= currentStart && (offset + size) <= currentEnd; - - return { - start: offset, - center: (offset - (frameSize / 2) + (size / 2)), - end: offset - frameSize + size, - size: size, - isVisible: isVisible - }; - } - - function toCenter(container, elem, horizontal, skipWhenVisible) { - var pos = getPosition(container, elem, horizontal); - - if (skipWhenVisible && pos.isVisible) { - return; - } - - if (container.scrollTo) { - if (horizontal) { - container.scrollTo(pos.center, 0); - } else { - container.scrollTo(0, pos.center); - } - } else { - if (horizontal) { - container.scrollLeft = Math.round(pos.center); - } else { - container.scrollTop = Math.round(pos.center); - } - } - } - - function toStart(container, elem, horizontal, skipWhenVisible) { - var pos = getPosition(container, elem, horizontal); - - if (skipWhenVisible && pos.isVisible) { - return; - } - - if (container.scrollTo) { - if (horizontal) { - container.scrollTo(pos.start, 0); - } else { - container.scrollTo(0, pos.start); - } - } else { - if (horizontal) { - container.scrollLeft = Math.round(pos.start); - } else { - container.scrollTop = Math.round(pos.start); - } - } - } - - function centerOnFocus(e, scrollSlider, horizontal) { - var focused = focusManager.focusableParent(e.target); - - if (focused) { - toCenter(scrollSlider, focused, horizontal); - } - } - - function centerOnFocusHorizontal(e) { - centerOnFocus(e, this, true); - } - function centerOnFocusVertical(e) { - centerOnFocus(e, this, false); - } + const isVisible = offset >= currentStart && (offset + size) <= currentEnd; return { - getPosition: getPosition, - centerFocus: { - on: function (element, horizontal) { - if (horizontal) { - dom.addEventListener(element, 'focus', centerOnFocusHorizontal, { - capture: true, - passive: true - }); - } else { - dom.addEventListener(element, 'focus', centerOnFocusVertical, { - capture: true, - passive: true - }); - } - }, - off: function (element, horizontal) { - if (horizontal) { - dom.removeEventListener(element, 'focus', centerOnFocusHorizontal, { - capture: true, - passive: true - }); - } else { - dom.removeEventListener(element, 'focus', centerOnFocusVertical, { - capture: true, - passive: true - }); - } - } - }, - toCenter: toCenter, - toStart: toStart + start: offset, + center: (offset - (frameSize / 2) + (size / 2)), + end: offset - frameSize + size, + size: size, + isVisible: isVisible }; -}); +} + +export function toCenter(container, elem, horizontal, skipWhenVisible) { + const pos = getPosition(container, elem, horizontal); + + if (skipWhenVisible && pos.isVisible) { + return; + } + + if (container.scrollTo) { + if (horizontal) { + container.scrollTo(pos.center, 0); + } else { + container.scrollTo(0, pos.center); + } + } else { + if (horizontal) { + container.scrollLeft = Math.round(pos.center); + } else { + container.scrollTop = Math.round(pos.center); + } + } +} + +export function toStart(container, elem, horizontal, skipWhenVisible) { + const pos = getPosition(container, elem, horizontal); + + if (skipWhenVisible && pos.isVisible) { + return; + } + + if (container.scrollTo) { + if (horizontal) { + container.scrollTo(pos.start, 0); + } else { + container.scrollTo(0, pos.start); + } + } else { + if (horizontal) { + container.scrollLeft = Math.round(pos.start); + } else { + container.scrollTop = Math.round(pos.start); + } + } +} + +function centerOnFocus(e, scrollSlider, horizontal) { + const focused = focusManager.focusableParent(e.target); + + if (focused) { + toCenter(scrollSlider, focused, horizontal); + } +} + +function centerOnFocusHorizontal(e) { + centerOnFocus(e, this, true); +} + +function centerOnFocusVertical(e) { + centerOnFocus(e, this, false); +} + +export const centerFocus = { + on: function (element, horizontal) { + if (horizontal) { + dom.addEventListener(element, 'focus', centerOnFocusHorizontal, { + capture: true, + passive: true + }); + } else { + dom.addEventListener(element, 'focus', centerOnFocusVertical, { + capture: true, + passive: true + }); + } + }, + off: function (element, horizontal) { + if (horizontal) { + dom.removeEventListener(element, 'focus', centerOnFocusHorizontal, { + capture: true, + passive: true + }); + } else { + dom.removeEventListener(element, 'focus', centerOnFocusVertical, { + capture: true, + passive: true + }); + } + } +}; + +export default { + getPosition: getPosition, + centerFocus: centerFocus, + toCenter: toCenter, + toStart: toStart +}; diff --git a/src/scripts/searchtab.js b/src/scripts/searchtab.js deleted file mode 100644 index e012b8a4b2..0000000000 --- a/src/scripts/searchtab.js +++ /dev/null @@ -1,57 +0,0 @@ -define(['searchFields', 'searchResults', 'events'], function (SearchFields, SearchResults, events) { - 'use strict'; - - SearchFields = SearchFields.default || SearchFields; - SearchResults = SearchResults.default || SearchResults; - - function init(instance, tabContent, options) { - tabContent.innerHTML = '
    '; - instance.searchFields = new SearchFields({ - element: tabContent.querySelector('.searchFields') - }); - instance.searchResults = new SearchResults({ - element: tabContent.querySelector('.searchResults'), - serverId: ApiClient.serverId(), - parentId: options.parentId, - collectionType: options.collectionType - }); - events.on(instance.searchFields, 'search', function (e, value) { - instance.searchResults.search(value); - }); - } - - function SearchTab(view, tabContent, options) { - var self = this; - options = options || {}; - init(this, tabContent, options); - - self.preRender = function () {}; - - self.renderTab = function () { - var searchFields = this.searchFields; - - if (searchFields) { - searchFields.focus(); - } - }; - } - - SearchTab.prototype.destroy = function () { - var searchFields = this.searchFields; - - if (searchFields) { - searchFields.destroy(); - } - - this.searchFields = null; - var searchResults = this.searchResults; - - if (searchResults) { - searchResults.destroy(); - } - - this.searchResults = null; - }; - - return SearchTab; -}); diff --git a/src/scripts/serverNotifications.js b/src/scripts/serverNotifications.js index 331a75329c..2566d148f6 100644 --- a/src/scripts/serverNotifications.js +++ b/src/scripts/serverNotifications.js @@ -1,211 +1,216 @@ -define(['connectionManager', 'playbackManager', 'syncPlayManager', 'events', 'inputManager', 'focusManager', 'appRouter'], function (connectionManager, playbackManager, syncPlayManager, events, inputManager, focusManager, appRouter) { - 'use strict'; +import connectionManager from 'connectionManager'; +import playbackManager from 'playbackManager'; +import syncPlayManager from 'syncPlayManager'; +import events from 'events'; +import inputManager from 'inputManager'; +import focusManager from 'focusManager'; +import appRouter from 'appRouter'; - var serverNotifications = {}; +const serverNotifications = {}; - function notifyApp() { - inputManager.notify(); - } +function notifyApp() { + inputManager.notify(); +} - function displayMessage(cmd) { - var args = cmd.Arguments; - if (args.TimeoutMs) { - require(['toast'], function (toast) { - toast({ title: args.Header, text: args.Text }); - }); - } else { - require(['alert'], function (alert) { - alert.default({ title: args.Header, text: args.Text }); - }); - } - } - - function displayContent(cmd, apiClient) { - if (!playbackManager.isPlayingLocally(['Video', 'Book'])) { - appRouter.showItem(cmd.Arguments.ItemId, apiClient.serverId()); - } - } - - function playTrailers(apiClient, itemId) { - apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { - playbackManager.playTrailers(item); +function displayMessage(cmd) { + const args = cmd.Arguments; + if (args.TimeoutMs) { + import('toast').then(({default: toast}) => { + toast({ title: args.Header, text: args.Text }); + }); + } else { + import('alert').then(({default: alert}) => { + alert({ title: args.Header, text: args.Text }); }); } +} - function processGeneralCommand(cmd, apiClient) { - console.debug('Received command: ' + cmd.Name); - switch (cmd.Name) { - case 'Select': - inputManager.handleCommand('select'); - return; - case 'Back': - inputManager.handleCommand('back'); - return; - case 'MoveUp': - inputManager.handleCommand('up'); - return; - case 'MoveDown': - inputManager.handleCommand('down'); - return; - case 'MoveLeft': - inputManager.handleCommand('left'); - return; - case 'MoveRight': - inputManager.handleCommand('right'); - return; - case 'PageUp': - inputManager.handleCommand('pageup'); - return; - case 'PageDown': - inputManager.handleCommand('pagedown'); - return; - case 'PlayTrailers': - playTrailers(apiClient, cmd.Arguments.ItemId); - break; - case 'SetRepeatMode': - playbackManager.setRepeatMode(cmd.Arguments.RepeatMode); - break; - case 'SetShuffleQueue': - playbackManager.setQueueShuffleMode(cmd.Arguments.ShuffleMode); - break; - case 'VolumeUp': - inputManager.handleCommand('volumeup'); - return; - case 'VolumeDown': - inputManager.handleCommand('volumedown'); - return; - case 'ChannelUp': - inputManager.handleCommand('channelup'); - return; - case 'ChannelDown': - inputManager.handleCommand('channeldown'); - return; - case 'Mute': - inputManager.handleCommand('mute'); - return; - case 'Unmute': - inputManager.handleCommand('unmute'); - return; - case 'ToggleMute': - inputManager.handleCommand('togglemute'); - return; - case 'SetVolume': - notifyApp(); - playbackManager.setVolume(cmd.Arguments.Volume); - break; - case 'SetAudioStreamIndex': - notifyApp(); - playbackManager.setAudioStreamIndex(parseInt(cmd.Arguments.Index)); - break; - case 'SetSubtitleStreamIndex': - notifyApp(); - playbackManager.setSubtitleStreamIndex(parseInt(cmd.Arguments.Index)); - break; - case 'ToggleFullscreen': - inputManager.handleCommand('togglefullscreen'); - return; - case 'GoHome': - inputManager.handleCommand('home'); - return; - case 'GoToSettings': - inputManager.handleCommand('settings'); - return; - case 'DisplayContent': - displayContent(cmd, apiClient); - break; - case 'GoToSearch': - inputManager.handleCommand('search'); - return; - case 'DisplayMessage': - displayMessage(cmd); - break; - case 'ToggleOsd': - // todo - break; - case 'ToggleContextMenu': - // todo - break; - case 'TakeScreenShot': - // todo - break; - case 'SendKey': - // todo - break; - case 'SendString': - // todo - focusManager.sendText(cmd.Arguments.String); - break; - default: - console.debug('processGeneralCommand does not recognize: ' + cmd.Name); - break; - } - - notifyApp(); +function displayContent(cmd, apiClient) { + if (!playbackManager.isPlayingLocally(['Video', 'Book'])) { + appRouter.showItem(cmd.Arguments.ItemId, apiClient.serverId()); } +} - function onMessageReceived(e, msg) { - var apiClient = this; - if (msg.MessageType === 'Play') { - notifyApp(); - var serverId = apiClient.serverInfo().Id; - if (msg.Data.PlayCommand === 'PlayNext') { - playbackManager.queueNext({ ids: msg.Data.ItemIds, serverId: serverId }); - } else if (msg.Data.PlayCommand === 'PlayLast') { - playbackManager.queue({ ids: msg.Data.ItemIds, serverId: serverId }); - } else { - playbackManager.play({ - ids: msg.Data.ItemIds, - startPositionTicks: msg.Data.StartPositionTicks, - mediaSourceId: msg.Data.MediaSourceId, - audioStreamIndex: msg.Data.AudioStreamIndex, - subtitleStreamIndex: msg.Data.SubtitleStreamIndex, - startIndex: msg.Data.StartIndex, - serverId: serverId - }); - } - } else if (msg.MessageType === 'Playstate') { - if (msg.Data.Command === 'Stop') { - inputManager.handleCommand('stop'); - } else if (msg.Data.Command === 'Pause') { - inputManager.handleCommand('pause'); - } else if (msg.Data.Command === 'Unpause') { - inputManager.handleCommand('play'); - } else if (msg.Data.Command === 'PlayPause') { - inputManager.handleCommand('playpause'); - } else if (msg.Data.Command === 'Seek') { - playbackManager.seek(msg.Data.SeekPositionTicks); - } else if (msg.Data.Command === 'NextTrack') { - inputManager.handleCommand('next'); - } else if (msg.Data.Command === 'PreviousTrack') { - inputManager.handleCommand('previous'); - } else { - notifyApp(); - } - } else if (msg.MessageType === 'GeneralCommand') { - var cmd = msg.Data; - processGeneralCommand(cmd, apiClient); - } else if (msg.MessageType === 'UserDataChanged') { - if (msg.Data.UserId === apiClient.getCurrentUserId()) { - for (var i = 0, length = msg.Data.UserDataList.length; i < length; i++) { - events.trigger(serverNotifications, 'UserDataChanged', [apiClient, msg.Data.UserDataList[i]]); - } - } - } else if (msg.MessageType === 'SyncPlayCommand') { - syncPlayManager.processCommand(msg.Data, apiClient); - } else if (msg.MessageType === 'SyncPlayGroupUpdate') { - syncPlayManager.processGroupUpdate(msg.Data, apiClient); - } else { - events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]); - } - } - function bindEvents(apiClient) { - events.off(apiClient, 'message', onMessageReceived); - events.on(apiClient, 'message', onMessageReceived); - } - - connectionManager.getApiClients().forEach(bindEvents); - events.on(connectionManager, 'apiclientcreated', function (e, newApiClient) { - bindEvents(newApiClient); +function playTrailers(apiClient, itemId) { + apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { + playbackManager.playTrailers(item); }); - return serverNotifications; +} + +function processGeneralCommand(cmd, apiClient) { + console.debug('Received command: ' + cmd.Name); + switch (cmd.Name) { + case 'Select': + inputManager.handleCommand('select'); + return; + case 'Back': + inputManager.handleCommand('back'); + return; + case 'MoveUp': + inputManager.handleCommand('up'); + return; + case 'MoveDown': + inputManager.handleCommand('down'); + return; + case 'MoveLeft': + inputManager.handleCommand('left'); + return; + case 'MoveRight': + inputManager.handleCommand('right'); + return; + case 'PageUp': + inputManager.handleCommand('pageup'); + return; + case 'PageDown': + inputManager.handleCommand('pagedown'); + return; + case 'PlayTrailers': + playTrailers(apiClient, cmd.Arguments.ItemId); + break; + case 'SetRepeatMode': + playbackManager.setRepeatMode(cmd.Arguments.RepeatMode); + break; + case 'SetShuffleQueue': + playbackManager.setQueueShuffleMode(cmd.Arguments.ShuffleMode); + break; + case 'VolumeUp': + inputManager.handleCommand('volumeup'); + return; + case 'VolumeDown': + inputManager.handleCommand('volumedown'); + return; + case 'ChannelUp': + inputManager.handleCommand('channelup'); + return; + case 'ChannelDown': + inputManager.handleCommand('channeldown'); + return; + case 'Mute': + inputManager.handleCommand('mute'); + return; + case 'Unmute': + inputManager.handleCommand('unmute'); + return; + case 'ToggleMute': + inputManager.handleCommand('togglemute'); + return; + case 'SetVolume': + notifyApp(); + playbackManager.setVolume(cmd.Arguments.Volume); + break; + case 'SetAudioStreamIndex': + notifyApp(); + playbackManager.setAudioStreamIndex(parseInt(cmd.Arguments.Index)); + break; + case 'SetSubtitleStreamIndex': + notifyApp(); + playbackManager.setSubtitleStreamIndex(parseInt(cmd.Arguments.Index)); + break; + case 'ToggleFullscreen': + inputManager.handleCommand('togglefullscreen'); + return; + case 'GoHome': + inputManager.handleCommand('home'); + return; + case 'GoToSettings': + inputManager.handleCommand('settings'); + return; + case 'DisplayContent': + displayContent(cmd, apiClient); + break; + case 'GoToSearch': + inputManager.handleCommand('search'); + return; + case 'DisplayMessage': + displayMessage(cmd); + break; + case 'ToggleOsd': + // todo + break; + case 'ToggleContextMenu': + // todo + break; + case 'TakeScreenShot': + // todo + break; + case 'SendKey': + // todo + break; + case 'SendString': + // todo + focusManager.sendText(cmd.Arguments.String); + break; + default: + console.debug('processGeneralCommand does not recognize: ' + cmd.Name); + break; + } + + notifyApp(); +} + +function onMessageReceived(e, msg) { + const apiClient = this; + if (msg.MessageType === 'Play') { + notifyApp(); + const serverId = apiClient.serverInfo().Id; + if (msg.Data.PlayCommand === 'PlayNext') { + playbackManager.queueNext({ ids: msg.Data.ItemIds, serverId: serverId }); + } else if (msg.Data.PlayCommand === 'PlayLast') { + playbackManager.queue({ ids: msg.Data.ItemIds, serverId: serverId }); + } else { + playbackManager.play({ + ids: msg.Data.ItemIds, + startPositionTicks: msg.Data.StartPositionTicks, + mediaSourceId: msg.Data.MediaSourceId, + audioStreamIndex: msg.Data.AudioStreamIndex, + subtitleStreamIndex: msg.Data.SubtitleStreamIndex, + startIndex: msg.Data.StartIndex, + serverId: serverId + }); + } + } else if (msg.MessageType === 'Playstate') { + if (msg.Data.Command === 'Stop') { + inputManager.handleCommand('stop'); + } else if (msg.Data.Command === 'Pause') { + inputManager.handleCommand('pause'); + } else if (msg.Data.Command === 'Unpause') { + inputManager.handleCommand('play'); + } else if (msg.Data.Command === 'PlayPause') { + inputManager.handleCommand('playpause'); + } else if (msg.Data.Command === 'Seek') { + playbackManager.seek(msg.Data.SeekPositionTicks); + } else if (msg.Data.Command === 'NextTrack') { + inputManager.handleCommand('next'); + } else if (msg.Data.Command === 'PreviousTrack') { + inputManager.handleCommand('previous'); + } else { + notifyApp(); + } + } else if (msg.MessageType === 'GeneralCommand') { + const cmd = msg.Data; + processGeneralCommand(cmd, apiClient); + } else if (msg.MessageType === 'UserDataChanged') { + if (msg.Data.UserId === apiClient.getCurrentUserId()) { + for (let i = 0, length = msg.Data.UserDataList.length; i < length; i++) { + events.trigger(serverNotifications, 'UserDataChanged', [apiClient, msg.Data.UserDataList[i]]); + } + } + } else if (msg.MessageType === 'SyncPlayCommand') { + syncPlayManager.processCommand(msg.Data, apiClient); + } else if (msg.MessageType === 'SyncPlayGroupUpdate') { + syncPlayManager.processGroupUpdate(msg.Data, apiClient); + } else { + events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]); + } +} +function bindEvents(apiClient) { + events.off(apiClient, 'message', onMessageReceived); + events.on(apiClient, 'message', onMessageReceived); +} + +connectionManager.getApiClients().forEach(bindEvents); +events.on(connectionManager, 'apiclientcreated', function (e, newApiClient) { + bindEvents(newApiClient); }); + +export default serverNotifications; diff --git a/src/scripts/settings/appSettings.js b/src/scripts/settings/appSettings.js index ffd63b9561..ded62c94ae 100644 --- a/src/scripts/settings/appSettings.js +++ b/src/scripts/settings/appSettings.js @@ -80,43 +80,6 @@ import events from 'events'; return val ? parseInt(val) : null; } - export function syncOnlyOnWifi(val) { - if (val !== undefined) { - this.set('syncOnlyOnWifi', val.toString()); - } - - return this.get('syncOnlyOnWifi') !== 'false'; - } - - export function syncPath(val) { - if (val !== undefined) { - this.set('syncPath', val); - } - - return this.get('syncPath'); - } - - export function cameraUploadServers(val) { - if (val !== undefined) { - this.set('cameraUploadServers', val.join(',')); - } - - val = this.get('cameraUploadServers'); - if (val) { - return val.split(','); - } - - return []; - } - - export function runAtStartup(val) { - if (val !== undefined) { - this.set('runatstartup', val.toString()); - } - - return this.get('runatstartup') === 'true'; - } - export function set(name, value, userId) { const currentValue = this.get(name, userId); appStorage.setItem(getKey(name, userId), value); @@ -139,10 +102,6 @@ export default { maxStreamingBitrate: maxStreamingBitrate, maxStaticMusicBitrate: maxStaticMusicBitrate, maxChromecastBitrate: maxChromecastBitrate, - syncOnlyOnWifi: syncOnlyOnWifi, - syncPath: syncPath, - cameraUploadServers: cameraUploadServers, - runAtStartup: runAtStartup, set: set, get: get }; diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index bd6050b5fe..1235e0fa5f 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -15,6 +15,10 @@ function saveServerPreferences(instance) { instance.saveTimeout = setTimeout(onSaveTimeout.bind(instance), 50); } +const defaultSubtitleAppearanceSettings = { + verticalPosition: -3 +}; + export class UserSettings { constructor() { } @@ -412,7 +416,7 @@ export class UserSettings { */ getSubtitleAppearanceSettings(key) { key = key || 'localplayersubtitleappearance3'; - return JSON.parse(this.get(key, false) || '{}'); + return Object.assign(defaultSubtitleAppearanceSettings, JSON.parse(this.get(key, false) || '{}')); } /** diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js index 64989b4fc2..2ffe290d88 100644 --- a/src/scripts/settings/webSettings.js +++ b/src/scripts/settings/webSettings.js @@ -1,24 +1,43 @@ let data; -function getConfig() { +async function getConfig() { if (data) return Promise.resolve(data); - return fetch('config.json?nocache=' + new Date().getUTCMilliseconds()).then(response => { - data = response.json(); + try { + const response = await fetch('config.json', { + cache: 'no-cache' + }); + + if (!response.ok) { + throw new Error('network response was not ok'); + } + + data = await response.json(); + return data; - }).catch(error => { - console.warn('web config file is missing so the template will be used'); + } catch (error) { + console.warn('failed to fetch the web config file:', error); return getDefaultConfig(); - }); + } } -function getDefaultConfig() { - return fetch('config.template.json').then(function (response) { - data = response.json(); +async function getDefaultConfig() { + try { + const response = await fetch('config.template.json', { + cache: 'no-cache' + }); + + if (!response.ok) { + throw new Error('network response was not ok'); + } + + data = await response.json(); return data; - }); + } catch (error) { + console.error('failed to fetch the default web config file:', error); + } } -export function enableMultiServer() { +export function getMultiServer() { return getConfig().then(config => { return config.multiserver; }).catch(error => { @@ -26,3 +45,21 @@ export function enableMultiServer() { return false; }); } + +export function getThemes() { + return getConfig().then(config => { + return config.themes; + }).catch(error => { + console.log('cannot get web config:', error); + return []; + }); +} + +export function getPlugins() { + return getConfig().then(config => { + return config.plugins; + }).catch(error => { + console.log('cannot get web config:', error); + return []; + }); +} diff --git a/src/scripts/shell.js b/src/scripts/shell.js index 5a2afd9fd4..e42c7792a0 100644 --- a/src/scripts/shell.js +++ b/src/scripts/shell.js @@ -1,23 +1,20 @@ -define([], function () { - 'use strict'; - - return { - openUrl: function (url, target) { - if (window.NativeShell) { - window.NativeShell.openUrl(url, target); - } else { - window.open(url, target || '_blank'); - } - }, - enableFullscreen: function () { - if (window.NativeShell) { - window.NativeShell.enableFullscreen(); - } - }, - disableFullscreen: function () { - if (window.NativeShell) { - window.NativeShell.disableFullscreen(); - } +// TODO: This seems like a good candidate for deprecation +export default { + openUrl: function (url, target) { + if (window.NativeShell) { + window.NativeShell.openUrl(url, target); + } else { + window.open(url, target || '_blank'); } - }; -}); + }, + enableFullscreen: function () { + if (window.NativeShell) { + window.NativeShell.enableFullscreen(); + } + }, + disableFullscreen: function () { + if (window.NativeShell) { + window.NativeShell.disableFullscreen(); + } + } +}; diff --git a/src/scripts/site.js b/src/scripts/site.js index f1b49f6342..0e1e44251c 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -1,4 +1,4 @@ -function getWindowLocationSearch(win) { +window.getWindowLocationSearch = function(win) { 'use strict'; var search = (win || window).location.search; @@ -12,9 +12,9 @@ function getWindowLocationSearch(win) { } return search || ''; -} +}; -window.getParameterByName = function (name, url) { +window.getParameterByName = function(name, url) { 'use strict'; name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); @@ -29,7 +29,7 @@ window.getParameterByName = function (name, url) { return decodeURIComponent(results[1].replace(/\+/g, ' ')); }; -function pageClassOn(eventName, className, fn) { +window.pageClassOn = function(eventName, className, fn) { 'use strict'; document.addEventListener(eventName, function (event) { @@ -39,7 +39,7 @@ function pageClassOn(eventName, className, fn) { fn.call(target, event); } }); -} +}; window.pageIdOn = function(eventName, id, fn) { 'use strict'; @@ -53,187 +53,6 @@ window.pageIdOn = function(eventName, id, fn) { }); }; -var Dashboard = { - getCurrentUser: function () { - return window.ApiClient.getCurrentUser(false); - }, - - //TODO: investigate url prefix support for serverAddress function - serverAddress: function () { - if (AppInfo.isNativeApp) { - var apiClient = window.ApiClient; - - if (apiClient) { - return apiClient.serverAddress(); - } - - return null; - } - - var urlLower = window.location.href.toLowerCase(); - var index = urlLower.lastIndexOf('/web'); - - if (index != -1) { - return urlLower.substring(0, index); - } - - var loc = window.location; - var address = loc.protocol + '//' + loc.hostname; - - if (loc.port) { - address += ':' + loc.port; - } - - return address; - }, - getCurrentUserId: function () { - var apiClient = window.ApiClient; - - if (apiClient) { - return apiClient.getCurrentUserId(); - } - - return null; - }, - onServerChanged: function (userId, accessToken, apiClient) { - apiClient = apiClient || window.ApiClient; - window.ApiClient = apiClient; - }, - logout: function () { - ConnectionManager.logout().then(function () { - var loginPage; - - if (AppInfo.isNativeApp) { - loginPage = 'selectserver.html'; - window.ApiClient = null; - } else { - loginPage = 'login.html'; - } - - Dashboard.navigate(loginPage); - }); - }, - getConfigurationPageUrl: function (name) { - return 'configurationpage?name=' + encodeURIComponent(name); - }, - getConfigurationResourceUrl: function (name) { - if (AppInfo.isNativeApp) { - return ApiClient.getUrl('web/ConfigurationPage', { - name: name - }); - } - - return Dashboard.getConfigurationPageUrl(name); - }, - navigate: function (url, preserveQueryString) { - if (!url) { - throw new Error('url cannot be null or empty'); - } - - var queryString = getWindowLocationSearch(); - - if (preserveQueryString && queryString) { - url += queryString; - } - - return new Promise(function (resolve, reject) { - require(['appRouter'], function (appRouter) { - return appRouter.show(url).then(resolve, reject); - }); - }); - }, - navigate_direct: function (path) { - return new Promise(function (resolve, reject) { - require(['appRouter'], function (appRouter) { - return appRouter.showDirect(path).then(resolve, reject); - }); - }); - }, - processPluginConfigurationUpdateResult: function () { - require(['loading', 'toast'], function (loading, toast) { - loading.hide(); - toast(Globalize.translate('MessageSettingsSaved')); - }); - }, - processServerConfigurationUpdateResult: function (result) { - require(['loading', 'toast'], function (loading, toast) { - loading.hide(); - toast(Globalize.translate('MessageSettingsSaved')); - }); - }, - processErrorResponse: function (response) { - require(['loading'], function (loading) { - loading.hide(); - }); - - var status = '' + response.status; - - if (response.statusText) { - status = response.statusText; - } - - Dashboard.alert({ - title: status, - message: response.headers ? response.headers.get('X-Application-Error-Code') : null - }); - }, - alert: function (options) { - if (typeof options == 'string') { - return void require(['toast'], function (toast) { - toast({ - text: options - }); - }); - } - - require(['alert'], function (alert) { - alert.default({ - title: options.title || Globalize.translate('HeaderAlert'), - text: options.message - }).then(options.callback || function () {}); - }); - }, - capabilities: function (appHost) { - var capabilities = { - PlayableMediaTypes: ['Audio', 'Video'], - SupportedCommands: ['MoveUp', 'MoveDown', 'MoveLeft', 'MoveRight', 'PageUp', 'PageDown', 'PreviousLetter', 'NextLetter', 'ToggleOsd', 'ToggleContextMenu', 'Select', 'Back', 'SendKey', 'SendString', 'GoHome', 'GoToSettings', 'VolumeUp', 'VolumeDown', 'Mute', 'Unmute', 'ToggleMute', 'SetVolume', 'SetAudioStreamIndex', 'SetSubtitleStreamIndex', 'DisplayContent', 'GoToSearch', 'DisplayMessage', 'SetRepeatMode', 'SetShuffleQueue', 'ChannelUp', 'ChannelDown', 'PlayMediaSource', 'PlayTrailers'], - SupportsPersistentIdentifier: self.appMode === 'cordova' || self.appMode === 'android', - SupportsMediaControl: true - }; - appHost.getPushTokenInfo(); - return capabilities = Object.assign(capabilities, appHost.getPushTokenInfo()); - }, - selectServer: function () { - if (window.NativeShell && typeof window.NativeShell.selectServer === 'function') { - window.NativeShell.selectServer(); - } else { - Dashboard.navigate('selectserver.html'); - } - }, - hideLoadingMsg: function() { - 'use strict'; - require(['loading'], function(loading) { - loading.hide(); - }); - }, - showLoadingMsg: function() { - 'use strict'; - require(['loading'], function(loading) { - loading.show(); - }); - }, - confirm: function(message, title, callback) { - 'use strict'; - require(['confirm'], function(confirm) { - confirm(message, title).then(function() { - callback(!0); - }).catch(function() { - callback(!1); - }); - }); - } -}; - var AppInfo = {}; function initClient() { @@ -271,17 +90,16 @@ function initClient() { } function createConnectionManager() { - return require(['connectionManagerFactory', 'apphost', 'credentialprovider', 'events', 'userSettings'], function (ConnectionManager, apphost, credentialProvider, events, userSettings) { + return require(['connectionManagerFactory', 'apphost', 'credentialprovider', 'events', 'userSettings'], function (ConnectionManager, appHost, credentialProvider, events, userSettings) { + appHost = appHost.default || appHost; + var credentialProviderInstance = new credentialProvider(); - var promises = [apphost.getSyncProfile(), apphost.init()]; + var promises = [appHost.init()]; return Promise.all(promises).then(function (responses) { - var deviceProfile = responses[0]; - var capabilities = Dashboard.capabilities(apphost); + var capabilities = Dashboard.capabilities(appHost); - capabilities.DeviceProfile = deviceProfile; - - var connectionManager = new ConnectionManager(credentialProviderInstance, apphost.appName(), apphost.appVersion(), apphost.deviceName(), apphost.deviceId(), capabilities); + var connectionManager = new ConnectionManager(credentialProviderInstance, appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId(), capabilities); defineConnectionManager(connectionManager); bindConnectionManagerEvents(connectionManager, events, userSettings); @@ -289,10 +107,10 @@ function initClient() { if (!AppInfo.isNativeApp) { console.debug('loading ApiClient singleton'); - return require(['apiclient'], function (apiClientFactory) { + return require(['apiclient', 'clientUtils'], function (apiClientFactory, clientUtils) { console.debug('creating ApiClient singleton'); - var apiClient = new apiClientFactory(Dashboard.serverAddress(), apphost.appName(), apphost.appVersion(), apphost.deviceName(), apphost.deviceId()); + var apiClient = new apiClientFactory(Dashboard.serverAddress(), appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId()); apiClient.enableAutomaticNetworking = false; apiClient.manualAddressOnly = true; @@ -341,7 +159,7 @@ function initClient() { function getPlaybackManager(playbackManager) { window.addEventListener('beforeunload', function () { try { - playbackManager.onAppClose(); + playbackManager.default.onAppClose(); } catch (err) { console.error('error in onAppClose: ' + err); } @@ -350,6 +168,8 @@ function initClient() { } function getLayoutManager(layoutManager, appHost) { + layoutManager = layoutManager.default || layoutManager; + appHost = appHost.default || appHost; if (appHost.getDefaultLayout) { layoutManager.defaultLayout = appHost.getDefaultLayout(); } @@ -367,45 +187,21 @@ function initClient() { } function defineResizeObserver() { - if (self.ResizeObserver) { + if (window.ResizeObserver) { define('ResizeObserver', [], function () { - return self.ResizeObserver; + return window.ResizeObserver; }); } else { define('ResizeObserver', ['resize-observer-polyfill'], returnFirstDependency); } } - function initRequireWithBrowser() { - var componentsPath = getComponentsPath(); - var scriptsPath = getScriptsPath(); - - define('filesystem', [scriptsPath + '/filesystem'], returnFirstDependency); - - define('lazyLoader', [componentsPath + '/lazyLoader/lazyLoaderIntersectionObserver'], returnFirstDependency); - define('shell', [scriptsPath + '/shell'], returnFirstDependency); - - define('alert', [componentsPath + '/alert'], returnFirstDependency); - - defineResizeObserver(); - - define('dialog', [componentsPath + '/dialog/dialog'], returnFirstDependency); - - define('confirm', [componentsPath + '/confirm/confirm'], returnFirstDependency); - - define('prompt', [componentsPath + '/prompt/prompt'], returnFirstDependency); - - define('loading', [componentsPath + '/loading/loading'], returnFirstDependency); - define('multi-download', [scriptsPath + '/multiDownload'], returnFirstDependency); - define('fileDownloader', [scriptsPath + '/fileDownloader'], returnFirstDependency); - - define('castSenderApiLoader', [componentsPath + '/castSenderApi'], returnFirstDependency); - } - function init() { define('livetvcss', ['css!assets/css/livetv.css'], returnFirstDependency); define('detailtablecss', ['css!assets/css/detailtable.css'], returnFirstDependency); + require(['clientUtils']); + var promises = []; if (!window.fetch) { promises.push(require(['fetch'])); @@ -452,8 +248,8 @@ function initClient() { } function onGlobalizeInit(browser, globalize) { - if (self.appMode === 'android') { - if (self.location.href.toString().toLowerCase().indexOf('start=backgroundsync') !== -1) { + if (window.appMode === 'android') { + if (window.location.href.toString().toLowerCase().indexOf('start=backgroundsync') !== -1) { return onAppReady(browser); } } @@ -469,6 +265,8 @@ function initClient() { } require(['apphost', 'css!assets/css/librarybrowser'], function (appHost) { + appHost = appHost.default || appHost; + loadPlugins(appHost, browser).then(function () { onAppReady(browser); }); @@ -476,44 +274,45 @@ function initClient() { } function loadPlugins(appHost, browser, shell) { - console.debug('loading installed plugins'); - var list = [ - 'plugins/playAccessValidation/plugin', - 'plugins/experimentalWarnings/plugin', - 'plugins/htmlAudioPlayer/plugin', - 'plugins/htmlVideoPlayer/plugin', - 'plugins/photoPlayer/plugin', - 'plugins/bookPlayer/plugin', - 'plugins/youtubePlayer/plugin', - 'plugins/backdropScreensaver/plugin', - 'plugins/logoScreensaver/plugin' - ]; - - if (appHost.supports('remotecontrol')) { - list.push('plugins/sessionPlayer/plugin'); - - if (browser.chrome || browser.edgeChromium || browser.opera) { - list.push('plugins/chromecastPlayer/plugin'); - } - } - - if (window.NativeShell) { - list = list.concat(window.NativeShell.getPlugins()); - } - + console.groupCollapsed('loading installed plugins'); return new Promise(function (resolve, reject) { - Promise.all(list.map(loadPlugin)).then(function () { - require(['packageManager'], function (packageManager) { - packageManager.init().then(resolve, reject); + require(['webSettings'], function (webSettings) { + webSettings.getPlugins().then(function (list) { + // these two plugins are dependent on features + if (!appHost.supports('remotecontrol')) { + list.splice(list.indexOf('sessionPlayer'), 1); + + if (!browser.chrome && !browser.opera) { + list.splice(list.indexOf('chromecastPlayer', 1)); + } + } + + // add any native plugins + if (window.NativeShell) { + list = list.concat(window.NativeShell.getPlugins()); + } + + Promise.all(list.map(loadPlugin)) + .then(function () { + console.debug('finished loading plugins'); + }) + .catch(() => reject) + .finally(() => { + console.groupEnd('loading installed plugins'); + require(['packageManager'], function (packageManager) { + packageManager.default.init().then(resolve, reject); + }); + }) + ; }); - }, reject); + }); }); } function loadPlugin(url) { return new Promise(function (resolve, reject) { require(['pluginManager'], function (pluginManager) { - pluginManager.loadPlugin(url).then(resolve, reject); + pluginManager.default.loadPlugin(url).then(resolve, reject); }); }); } @@ -523,6 +322,9 @@ function initClient() { // ensure that appHost is loaded in this point require(['apphost', 'appRouter'], function (appHost, appRouter) { + appRouter = appRouter.default || appRouter; + appHost = appHost.default || appHost; + window.Emby = {}; console.debug('onAppReady: loading dependencies'); @@ -532,7 +334,7 @@ function initClient() { window.Emby.Page = appRouter; - require(['emby-button', 'scripts/themeLoader', 'libraryMenu', 'scripts/routes'], function () { + require(['emby-button', 'scripts/autoThemes', 'libraryMenu', 'scripts/routes'], function () { Emby.Page.start({ click: false, hashbang: true @@ -582,11 +384,15 @@ function initClient() { return response.text(); }) .then(function(css) { - // Inject the branding css as a dom element in body so it will take - // precedence over other stylesheets - var style = document.createElement('style'); - style.appendChild(document.createTextNode(css)); - document.body.appendChild(style); + let style = document.querySelector('#cssBranding'); + if (!style) { + // Inject the branding css as a dom element in body so it will take + // precedence over other stylesheets + style = document.createElement('style'); + style.id = 'cssBranding'; + document.body.appendChild(style); + } + style.textContent = css; }) .catch(function(err) { console.warn('Error applying custom css', err); @@ -598,7 +404,7 @@ function initClient() { function registerServiceWorker() { /* eslint-disable compat/compat */ - if (navigator.serviceWorker && self.appMode !== 'cordova' && self.appMode !== 'android') { + if (navigator.serviceWorker && window.appMode !== 'cordova' && window.appMode !== 'android') { try { navigator.serviceWorker.register('serviceworker.js'); } catch (err) { @@ -611,18 +417,41 @@ function initClient() { } function onWebComponentsReady() { - initRequireWithBrowser(); + var componentsPath = getComponentsPath(); + var scriptsPath = getScriptsPath(); - if (self.appMode === 'cordova' || self.appMode === 'android' || self.appMode === 'standalone') { + define('filesystem', [scriptsPath + '/filesystem'], returnFirstDependency); + + define('lazyLoader', [componentsPath + '/lazyLoader/lazyLoaderIntersectionObserver'], returnFirstDependency); + define('shell', [scriptsPath + '/shell'], returnFirstDependency); + + define('alert', [componentsPath + '/alert'], returnFirstDependency); + + defineResizeObserver(); + + define('dialog', [componentsPath + '/dialog/dialog'], returnFirstDependency); + + define('confirm', [componentsPath + '/confirm/confirm'], returnFirstDependency); + + define('prompt', [componentsPath + '/prompt/prompt'], returnFirstDependency); + + define('loading', [componentsPath + '/loading/loading'], returnFirstDependency); + define('multi-download', [scriptsPath + '/multiDownload'], returnFirstDependency); + define('fileDownloader', [scriptsPath + '/fileDownloader'], returnFirstDependency); + + define('castSenderApiLoader', [componentsPath + '/castSenderApi'], returnFirstDependency); + + if (window.appMode === 'cordova' || window.appMode === 'android' || window.appMode === 'standalone') { AppInfo.isNativeApp = true; } init(); } + var promise; var localApiClient; - (function () { + function initRequireJs() { var urlArgs = 'v=' + (window.dashboardVersion || new Date().getDate()); var bowerPath = getBowerPath(); @@ -654,7 +483,8 @@ function initClient() { pluginManager: componentsPath + '/pluginManager', packageManager: componentsPath + '/packageManager', screensaverManager: componentsPath + '/screensavermanager', - chromecastHelper: 'plugins/chromecastPlayer/chromecastHelpers' + clientUtils: scriptsPath + '/clientUtils', + appRouter: 'components/appRouter' }; requirejs.onError = onRequireJsError; @@ -703,20 +533,12 @@ function initClient() { onError: onRequireJsError }); - require(['fetch']); - require(['polyfill']); - require(['fast-text-encoding']); - require(['intersection-observer']); - require(['classlist-polyfill']); - - // Expose jQuery globally - require(['jQuery'], function(jQuery) { - window.$ = jQuery; - window.jQuery = jQuery; - }); - - require(['css!assets/css/site']); - require(['jellyfin-noto']); + promise = require(['fetch']) + .then(() => require(['jQuery', 'polyfill', 'fast-text-encoding', 'intersection-observer', 'classlist-polyfill', 'css!assets/css/site', 'jellyfin-noto'], (jQuery) => { + // Expose jQuery globally + window.$ = jQuery; + window.jQuery = jQuery; + })); // define styles // TODO determine which of these files can be moved to the components themselves @@ -827,8 +649,8 @@ function initClient() { define('tvguide', [componentsPath + '/guide/guide'], returnFirstDependency); define('guide-settings-dialog', [componentsPath + '/guide/guide-settings'], returnFirstDependency); define('viewManager', [componentsPath + '/viewManager/viewManager'], function (viewManager) { - window.ViewManager = viewManager; - viewManager.dispatchPageEvents(true); + window.ViewManager = viewManager.default; + viewManager.default.dispatchPageEvents(true); return viewManager; }); define('slideshow', [componentsPath + '/slideshow/slideshow'], returnFirstDependency); @@ -848,7 +670,7 @@ function initClient() { define('viewContainer', [componentsPath + '/viewContainer'], returnFirstDependency); define('dialogHelper', [componentsPath + '/dialogHelper/dialogHelper'], returnFirstDependency); define('serverNotifications', [scriptsPath + '/serverNotifications'], returnFirstDependency); - define('skinManager', [componentsPath + '/skinManager'], returnFirstDependency); + define('skinManager', [scriptsPath + '/themeManager'], returnFirstDependency); define('keyboardnavigation', [scriptsPath + '/keyboardNavigation'], returnFirstDependency); define('mouseManager', [scriptsPath + '/mouseManager'], returnFirstDependency); define('scrollManager', [componentsPath + '/scrollManager'], returnFirstDependency); @@ -861,268 +683,10 @@ function initClient() { return window.ApiClient; }; }); - define('appRouter', [componentsPath + '/appRouter', 'itemHelper'], function (appRouter, itemHelper) { - function showItem(item, serverId, options) { - if (typeof item == 'string') { - require(['connectionManager'], function (connectionManager) { - var apiClient = connectionManager.currentApiClient(); - apiClient.getItem(apiClient.getCurrentUserId(), item).then(function (item) { - appRouter.showItem(item, options); - }); - }); - } else { - if (arguments.length == 2) { - options = arguments[1]; - } + } - appRouter.show('/' + appRouter.getRouteUrl(item, options), { - item: item - }); - } - } - - appRouter.showLocalLogin = function (serverId, manualLogin) { - Dashboard.navigate('login.html?serverid=' + serverId); - }; - - appRouter.showVideoOsd = function () { - return Dashboard.navigate('video'); - }; - - appRouter.showSelectServer = function () { - Dashboard.navigate(AppInfo.isNativeApp ? 'selectserver.html' : 'login.html'); - }; - - appRouter.showWelcome = function () { - Dashboard.navigate(AppInfo.isNativeApp ? 'selectserver.html' : 'login.html'); - }; - - appRouter.showSettings = function () { - Dashboard.navigate('mypreferencesmenu.html'); - }; - - appRouter.showGuide = function () { - Dashboard.navigate('livetv.html?tab=1'); - }; - - appRouter.goHome = function () { - Dashboard.navigate('home.html'); - }; - - appRouter.showSearch = function () { - Dashboard.navigate('search.html'); - }; - - appRouter.showLiveTV = function () { - Dashboard.navigate('livetv.html'); - }; - - appRouter.showRecordedTV = function () { - Dashboard.navigate('livetv.html?tab=3'); - }; - - appRouter.showFavorites = function () { - Dashboard.navigate('home.html?tab=1'); - }; - - appRouter.showSettings = function () { - Dashboard.navigate('mypreferencesmenu.html'); - }; - - appRouter.setTitle = function (title) { - LibraryMenu.setTitle(title); - }; - - appRouter.getRouteUrl = function (item, options) { - if (!item) { - throw new Error('item cannot be null'); - } - - if (item.url) { - return item.url; - } - - var context = options ? options.context : null; - var id = item.Id || item.ItemId; - - if (!options) { - options = {}; - } - - var url; - var itemType = item.Type || (options ? options.itemType : null); - var serverId = item.ServerId || options.serverId; - - if (item === 'settings') { - return 'mypreferencesmenu.html'; - } - - if (item === 'wizard') { - return 'wizardstart.html'; - } - - if (item === 'manageserver') { - return 'dashboard.html'; - } - - if (item === 'recordedtv') { - return 'livetv.html?tab=3&serverId=' + options.serverId; - } - - if (item === 'nextup') { - return 'list.html?type=nextup&serverId=' + options.serverId; - } - - if (item === 'list') { - var url = 'list.html?serverId=' + options.serverId + '&type=' + options.itemTypes; - - if (options.isFavorite) { - url += '&IsFavorite=true'; - } - - return url; - } - - if (item === 'livetv') { - if (options.section === 'programs') { - return 'livetv.html?tab=0&serverId=' + options.serverId; - } - if (options.section === 'guide') { - return 'livetv.html?tab=1&serverId=' + options.serverId; - } - - if (options.section === 'movies') { - return 'list.html?type=Programs&IsMovie=true&serverId=' + options.serverId; - } - - if (options.section === 'shows') { - return 'list.html?type=Programs&IsSeries=true&IsMovie=false&IsNews=false&serverId=' + options.serverId; - } - - if (options.section === 'sports') { - return 'list.html?type=Programs&IsSports=true&serverId=' + options.serverId; - } - - if (options.section === 'kids') { - return 'list.html?type=Programs&IsKids=true&serverId=' + options.serverId; - } - - if (options.section === 'news') { - return 'list.html?type=Programs&IsNews=true&serverId=' + options.serverId; - } - - if (options.section === 'onnow') { - return 'list.html?type=Programs&IsAiring=true&serverId=' + options.serverId; - } - - if (options.section === 'dvrschedule') { - return 'livetv.html?tab=4&serverId=' + options.serverId; - } - - if (options.section === 'seriesrecording') { - return 'livetv.html?tab=5&serverId=' + options.serverId; - } - - return 'livetv.html?serverId=' + options.serverId; - } - - if (itemType == 'SeriesTimer') { - return 'details?seriesTimerId=' + id + '&serverId=' + serverId; - } - - if (item.CollectionType == 'livetv') { - return 'livetv.html'; - } - - if (item.Type === 'Genre') { - url = 'list.html?genreId=' + item.Id + '&serverId=' + serverId; - - if (context === 'livetv') { - url += '&type=Programs'; - } - - if (options.parentId) { - url += '&parentId=' + options.parentId; - } - - return url; - } - - if (item.Type === 'MusicGenre') { - url = 'list.html?musicGenreId=' + item.Id + '&serverId=' + serverId; - - if (options.parentId) { - url += '&parentId=' + options.parentId; - } - - return url; - } - - if (item.Type === 'Studio') { - url = 'list.html?studioId=' + item.Id + '&serverId=' + serverId; - - if (options.parentId) { - url += '&parentId=' + options.parentId; - } - - return url; - } - - if (context !== 'folders' && !itemHelper.isLocalItem(item)) { - if (item.CollectionType == 'movies') { - url = 'movies.html?topParentId=' + item.Id; - - if (options && options.section === 'latest') { - url += '&tab=1'; - } - - return url; - } - - if (item.CollectionType == 'tvshows') { - url = 'tv.html?topParentId=' + item.Id; - - if (options && options.section === 'latest') { - url += '&tab=2'; - } - - return url; - } - - if (item.CollectionType == 'music') { - return 'music.html?topParentId=' + item.Id; - } - } - - var itemTypes = ['Playlist', 'TvChannel', 'Program', 'BoxSet', 'MusicAlbum', 'MusicGenre', 'Person', 'Recording', 'MusicArtist']; - - if (itemTypes.indexOf(itemType) >= 0) { - return 'details?id=' + id + '&serverId=' + serverId; - } - - var contextSuffix = context ? '&context=' + context : ''; - - if (itemType == 'Series' || itemType == 'Season' || itemType == 'Episode') { - return 'details?id=' + id + contextSuffix + '&serverId=' + serverId; - } - - if (item.IsFolder) { - if (id) { - return 'list.html?parentId=' + id + '&serverId=' + serverId; - } - - return '#'; - } - - return 'details?id=' + id + '&serverId=' + serverId; - }; - - appRouter.showItem = showItem; - return appRouter; - }); - })(); - - return onWebComponentsReady(); + initRequireJs(); + promise.then(onWebComponentsReady); } initClient(); diff --git a/src/scripts/themeLoader.js b/src/scripts/themeLoader.js deleted file mode 100644 index f7b78e70ab..0000000000 --- a/src/scripts/themeLoader.js +++ /dev/null @@ -1,29 +0,0 @@ -import * as userSettings from 'userSettings'; -import skinManager from 'skinManager'; -import connectionManager from 'connectionManager'; -import events from 'events'; - -var currentViewType; -pageClassOn('viewbeforeshow', 'page', function () { - var classList = this.classList; - var viewType = classList.contains('type-interior') || classList.contains('wizardPage') ? 'a' : 'b'; - - if (viewType !== currentViewType) { - currentViewType = viewType; - var theme; - var context; - - if (viewType === 'a') { - theme = userSettings.dashboardTheme(); - context = 'serverdashboard'; - } else { - theme = userSettings.theme(); - } - - skinManager.setTheme(theme, context); - } -}); - -events.on(connectionManager, 'localusersignedin', function (e, user) { - currentViewType = null; -}); diff --git a/src/scripts/themeManager.js b/src/scripts/themeManager.js new file mode 100644 index 0000000000..03ca621749 --- /dev/null +++ b/src/scripts/themeManager.js @@ -0,0 +1,76 @@ +import * as webSettings from 'webSettings'; + +var themeStyleElement = document.querySelector('#cssTheme'); +var currentThemeId; + +function unloadTheme() { + var elem = themeStyleElement; + if (elem) { + elem.removeAttribute('href'); + currentThemeId = null; + } +} + +function getThemes() { + return webSettings.getThemes(); +} + +function getThemeStylesheetInfo(id) { + return getThemes().then(themes => { + var theme = themes.find(theme => { + return id ? theme.id === id : theme.default; + }); + + return { + stylesheetPath: 'themes/' + theme.id + '/theme.css', + themeId: theme.id + }; + }); +} + +function setTheme(id) { + return new Promise(function (resolve, reject) { + if (currentThemeId && currentThemeId === id) { + resolve(); + return; + } + + getThemeStylesheetInfo(id).then(function (info) { + if (currentThemeId && currentThemeId === info.themeId) { + resolve(); + return; + } + + var linkUrl = info.stylesheetPath; + unloadTheme(); + + let link = themeStyleElement; + + if (!link) { + // Inject the theme css as a dom element in body so it will take + // precedence over other stylesheets + link = document.createElement('link'); + link.id = 'cssTheme'; + link.setAttribute('rel', 'stylesheet'); + link.setAttribute('type', 'text/css'); + document.body.appendChild(link); + } + + const onLoad = function (e) { + e.target.removeEventListener('load', onLoad); + resolve(); + }; + + link.addEventListener('load', onLoad); + + link.setAttribute('href', linkUrl); + themeStyleElement = link; + currentThemeId = info.themeId; + }); + }); +} + +export default { + getThemes: getThemes, + setTheme: setTheme +}; diff --git a/src/strings/af.json b/src/strings/af.json index bab716af49..df3ca17f3f 100644 --- a/src/strings/af.json +++ b/src/strings/af.json @@ -2,7 +2,6 @@ "Auto": "Outo", "AuthProviderHelp": "Kies 'n Authentication Provider vir die egtheid van gebruiker se wagwoord.", "Audio": "Klank", - "AttributeNew": "Nuwe", "AspectRatio": "Aspek verhouding", "Ascending": "Boontoe", "AsManyAsPossible": "So veel moontlik", @@ -36,25 +35,16 @@ "AddToPlaylist": "Voeg by speellys", "AddToPlayQueue": "Plaas in wagtou", "AddToCollection": "Voeg by versameling", - "AddItemToCollectionHelp": "Voeg items by die versamelings deur hulle te soek en regs-kliek of kliek kieslys om hulle by versameling te voeg.", "Add": "Voeg by", "Actor": "Akteur", "AccessRestrictedTryAgainLater": "Toegang is beperk. Probeer weer later .", "Absolute": "Absoluut", "AlbumArtist": "Album Kunstenaar", "TabLatest": "Nuutste", - "TabInfo": "Inligting", - "TabGuide": "Gids", - "TabGenres": "Genres", - "TabFavorites": "Gunstellinge", - "TabEpisodes": "Episodes", - "TabDisplay": "Vertoon", "TabDirectPlay": "Speel Direk", - "TabDevices": "Toestelle", "TabDashboard": "Paneelbord", "TabContainers": "Houers", "Collections": "Versamelings", - "TabCollections": "Versamelings", "UnsupportedPlayback": "Jellyfin kan nie inhoud wat beskerm word deur DRM ontsuifer nie, maar daar sal 'n poging aangwend word inelkgeval, insluitend beskermde titels. Sommige leêrs mag geheel en al swart verksyn weens enkripsie of ander on-ondersteunde funksies, byvoorbeeld interaktiewe titels.", "OnApplicationStartup": "Op applikasie begin", "EveryXHours": "Elke {0} ure", @@ -84,7 +74,6 @@ "Watched": "Gekyk", "ViewPlaybackInfo": "Beskou terugspeel inligting", "ViewAlbum": "Beskou album", - "VideoRange": "Video reekse", "Vertical": "Vertikaal", "ValueVideoCodec": "Video Kodek: {0}", "ValueTimeLimitSingleHour": "Tyd limiet: 1 uur", @@ -112,7 +101,7 @@ "Up": "Op", "Unplayed": "Ongespeel", "Unmute": "Ontstom", - "UninstallPluginHeader": "Oninstalleer Plugin", + "HeaderUninstallPlugin": "Oninstalleer Plugin", "UninstallPluginConfirmation": "Is jy seker jy wil voortgaan met die oninstallasie {0}?", "Uniform": "Uniform", "TvLibraryHelp": "Hersien die {0}TV benamings gids{1}.", @@ -131,37 +120,20 @@ "ThemeVideos": "Tema Videos", "ThemeSongs": "Tema Liedjies", "TellUsAboutYourself": "Vertel ons van jouself", - "TabUsers": "Gebruikers", "TabUpcoming": "Komende", - "TabTranscoding": "Transkodering", - "TabTrailers": "Voorprente", - "TabSuggestions": "Voorstelle", "TabStreaming": "Stroom", - "TabSongs": "Liedjies", - "TabShows": "Programme", "TabSettings": "Instellings", "TabServer": "Bediener", - "TabSeries": "Reekse", "TabScheduledTasks": "Geskeduleerde Take", - "TabResumeSettings": "Hervat", "TabResponses": "Reaksies", - "TabRecordings": "Opnames", "TabProfiles": "Profiele", "TabProfile": "Profiel", - "TabPlaylists": "Speel lyste", - "TabPlaylist": "Speel lys", - "TabPlayback": "Terugspeel", - "TabPassword": "Wagwoord", "TabParentalControl": "Ouer Beheer", "TabOther": "Ander", "TabNotifications": "Kennisgewings", "TabNfoSettings": "NFO Instellings", "TabNetworking": "Netwerking", "TabNetworks": "Netwerke", - "TabMusicVideos": "Musiek Videos", "TabMusic": "Musiek", - "TabMovies": "Rolprente", - "TabMetadata": "Meta Inligting", - "TabLogs": "Logs", - "TabLiveTV": "Lewendige TV" + "TabLogs": "Logs" } diff --git a/src/strings/ar.json b/src/strings/ar.json index 216cbf7074..ba172b57ae 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -1,5 +1,4 @@ { - "AddItemToCollectionHelp": "أضف عناصر إلى المجاميع بالبحث عنهم واستخدام قائمة الزر الأيمن أو قئامة اللمس لإضافتهم إلى المجاميع.", "AdditionalNotificationServices": "تصفح كتالوج الملحقات لتثبيث خدمات إشعارات إضافية.", "Alerts": "التنبيهات", "All": "الكل", @@ -11,88 +10,62 @@ "BirthDateValue": "وُلد: {0}", "BirthPlaceValue": "مكان الميلاد: {0}", "Browse": "تصفح", - "BrowsePluginCatalogMessage": "تصفح قائمتنا للملحق لترى المتوفر من الملاحق.", - "ButtonAdd": "إضافة", + "MessageBrowsePluginCatalog": "تصفح قائمتنا للملحق لترى المتوفر من الملاحق.", "ButtonAddMediaLibrary": "إضافة مكتبة وسائط", "ButtonAddScheduledTaskTrigger": "إضافة زناد", "ButtonAddServer": "إضافة خادم", "ButtonAddUser": "اضافة مستخدم", - "ButtonArrowDown": "أسفل", "ButtonArrowLeft": "يسار", "ButtonArrowRight": "يمين", - "ButtonArrowUp": "أعلى", "ButtonAudioTracks": "المقاطع الصوتية", "ButtonBack": "خلف", "ButtonCancel": "الغاء", "ButtonChangeServer": "غير الخادم", - "ButtonConnect": "اتصل", - "ButtonDelete": "حذف", - "ButtonDeleteImage": "حذف الصورة", - "ButtonDown": "أسفل", - "ButtonDownload": "إنزال", - "ButtonEdit": "تعديل", - "ButtonEditImages": "تعديل الصور", "ButtonEditOtherUserPreferences": "اضبط إعدادات حساب المستخدم هذا، وصورته وتفضيلاته الشخصية.", - "ButtonFilter": "مرشِّح", "ButtonForgotPassword": "نسيت كلمة السر", "ButtonFullscreen": "ملء الشاشة", "ButtonGuide": "الدليل", - "ButtonHelp": "المساعدة", - "ButtonHome": "الرئيسية", "ButtonInfo": "معلومات", - "ButtonLearnMore": "إعرف المزيد", "ButtonLibraryAccess": "صلاحيات المكتبة", "ButtonManualLogin": "الدخول اليدوي", "ButtonMore": "المزيد", "ButtonNetwork": "الشبكة", - "ButtonNew": "جديد", "ButtonNextTrack": "المقطوعة التالية", - "ButtonOff": "إيقاف التشغيل", "ButtonOk": "موافق", "ButtonOpen": "إفتح", "ButtonParentalControl": "التحكم الأبوي", "ButtonPause": "توقف مؤقت", - "ButtonPlay": "تشغيل", "ButtonPreviousTrack": "المقطوعة السابقة", "ButtonProfile": "حساب", "ButtonQuickStartGuide": "دليل بدء الاستخدام السريع", - "ButtonRefresh": "إعادة تنشيط", "ButtonRefreshGuideData": "إعادة تنشيط بيانات الدليل", "ButtonRemove": "إزالة", "ButtonRename": "إعادة التسمية", - "ButtonRepeat": "كرر", "ButtonResetEasyPassword": "إعادة تهيئة الرمز الشخصي الميسر", "ButtonResetPassword": "إعادة تهيئة كلمة السر", "ButtonRestart": "إعادة التشغيل", "ButtonResume": "استأنف", "ButtonRevoke": "أرفض", - "ButtonSave": "حفظ", - "ButtonSearch": "بحث", "ButtonSelectDirectory": "إختر الدليلة", "ButtonSelectServer": "إختر الخادم", "ButtonSelectView": "إختر طريقة عرض", "ButtonSend": "إرسال", "ButtonSettings": "الإعدادات", - "ButtonShuffle": "إخلط", "ButtonShutdown": "إنهاء التشغيل", "ButtonSignIn": "تسجيل الدخول", "ButtonSignOut": "تسجيل الخروج", - "ButtonSort": "ترتيب", "ButtonStart": "إبدأ", "ButtonStop": "إيقاف", "ButtonSubmit": "تسليم", - "ButtonSubtitles": "ترجمات", "ButtonTrailer": "العرض الإعلاني", "ButtonUninstall": "إزالة التثبيت", - "ButtonUp": "أعلى", - "ButtonViewWebsite": "أنظر الموقع الإلكتروني", "ButtonWebsite": "موقع إلكتروني", "ChannelAccessHelp": "إختر قناة لمشاركتها مع هذا المستخدم. المدراء سيكونون قادرين على تغيير إعدادات القنوات باستخدام مدير واصفات البيانات.", "Channels": "القنوات", "CinemaModeConfigurationHelp": "الطور السينمائي يوفر أجواء سينمائية إلى قلب صالتك مع إمكانية تشغيل عروض إعلانية لأفلام أخرى وعرض مقدمات أخرى من انتقاءاتك قبل تشغيل الفيلم الرئيسي.", "CustomDlnaProfilesHelp": "إنشاء عرائض مخصوصه تستهدف جهازاً جديداً أو يمتطي حساباً نظامياً.", "DeathDateValue": "توفي: {0}", - "DefaultErrorMessage": "كان هناك خطأ في معالجة الطلب. الرجاء المحاولة لاحقاً.", + "ErrorDefault": "كان هناك خطأ في معالجة الطلب. الرجاء المحاولة لاحقاً.", "Delete": "حذف", "DeleteDeviceConfirmation": "هل أنت متأكد أنك تريد حذف هذا الجهاز؟ سيظهر الجهاز من جديد في المرة القادمة التي يسجل فها مستخدم دخوله عبره.", "DeleteImage": "حذف صورة", @@ -102,19 +75,19 @@ "DeleteUserConfirmation": "هل انت متاكد من انك تريد حذف هذا المستخدم ؟", "DeviceAccessHelp": "هذه الميزة تنطبق حصرياً على الأجهزة التي يمكن التعرف عليها فردياً ولن تمنع المتصفح من الدخول عليها. ترشيح الوصول لأجهزة المستخدم ستمنع المستخدمين من استعمال الأجهزة الجديدة إلى أن يتم اعتمادهم من هنا.", "DrmChannelsNotImported": "القنوات المجهزة بإدارة الحقوق الرقمية DRM لن تورّد.", - "EasyPasswordHelp": "الرمز الشخصي الميسرالخاص بك يمكنك من الاتصال إلى خادم مكتبتك، عبر تطبيقات أمبي على الأجهزة أو الدخول على حسابك في الشبكة الداخلية.", + "EasyPasswordHelp": "الرمز pin الميسر الخاص بك يستخدم للوصول بدون اتصل عبر التطبيقات المدعومة أو الدخول على حسابك في الشبكة الداخلية.", "EnablePhotos": "عرض الصور", - "EnablePhotosHelp": "سيتم اكتشاف الصور وعرضها مع ملفات الوسائط الأخرى", + "EnablePhotosHelp": "سيتم اكتشاف الصور وعرضها مع ملفات الوسائط الأخرى.", "ErrorAddingListingsToSchedulesDirect": "كان هناك خطأ في إضافة الاصطفاف لخدمة \"Schedules Direct\" الخاصة بك. خدمة \"Schedules Direct\" لا تسمح إلا بعدد محدود من الاصطفافات لكل حساب. قد تحتاج إلى تسجيل الدخول إلى موقع \"Schedules Direct\" لإزالة الاصطفافات الأخرى من حسابك قبل المتابعة.", "ErrorAddingMediaPathToVirtualFolder": "كان هناك خطأ في إضافة مسار الوسائط. الرجاء التأكد من صحة المسار وأن خادم أمبي لديه صلاحية الوصول إلى الموقع.", "ErrorAddingTunerDevice": "كان هناك خطأ في إضافة جهاز المولف. الرجاء التأكد من صلاحية الوصول إليه ثم عاود المحاولة.", "ErrorAddingXmlTvFile": "كان هناك خطأ في محاولة الوصول إلى ملف XMLTV. الرجاء التأكد من وجود الملف ثم حاول مرة أخرى.", "ErrorGettingTvLineups": "كان هناك خطأ في إنزال اصطفافات التلفاز. الرجاء التأكد من أن بياناتك صحيحة ثم عاود المحاولة.", - "ErrorMessageStartHourGreaterThanEnd": "وقت النهاية يجب أن يكون أكبر من وقت البداية.", + "ErrorStartHourGreaterThanEnd": "وقت النهاية يجب أن يكون أكبر من وقت البداية.", "ErrorPleaseSelectLineup": "الرجاء اختيار اصطفاف ثم المحاولة مرة أخرى. إن لم تتوفر أية اصطفافات، فالرجاء التأكد من اسم المستخدم وكلمة المرور الخاصة بك، وتأكد من صحة رمزك البريدي.", "ErrorSavingTvProvider": "كان هناك خطأ في حفظ مزود التلفزة. الرجاء التأكد من صلاحية الوصول إليه ثم عاود المحاولة.", "ExitFullscreen": "الخروج من الشاشة الكاملة", - "ExtractChapterImagesHelp": "استخلاص صور الأبواب سيسمح لتطبيقات أمبي أن تظهر لك قوائم تصويرية لتبويبات الأفلام. هذه العملية قد تكون بطيئة، وتستغل قدرة المعالج بشكل ملحوظ، وقد تحتاج إلى حيازة بضعة غيغابايتات من مساحة التخزين بشكل مؤقت. هذه المهمة تعمل خلال عملية استكشاف المقاطع المرئية، كما يمكن أن تحدد لتكون مهمة ليلية مجدولة. يمكنك جدولة العملية من قسم جدولة المهام. لا ينصح بتشغيل هذه المهمة خلال ساعات الذروة من دخول المستخدمين.", + "ExtractChapterImagesHelp": "استخلاص صور الفصول سيسمح للتطبيقات أن تظهر لك قوائم تصويرية لتبويبات الأفلام. هذه العملية قد تكون بطيئة، وتستغل موارد الجهاز بشكل ملحوظ، وقد تحتاج إلى حيازة بضعة غيغابايتات من مساحة التخزين بشكل مؤقت. هذه المهمة تعمل خلال عملية استكشاف المقاطع المرئية، كما يمكن أن تحدد لتكون مهمة ليلية مجدولة. يمكنك جدولة العملية من قسم جدولة المهام. لا ينصح بتشغيل هذه المهمة خلال ساعات الذروة من دخول المستخدمين.", "FFmpegSavePathNotFound": "لم نستطع تحديد موقع ffmpeg باستخدام المسار الذي أدخلته. سوف نحتاج تطبيق FFprobe أيضاً ويجب أن يتواجد في نفس المكان. إن هذه الأجزاء تكون بالعادة محزومة معاً في نفس ملف الإنزال. الرجاء التأكد من المسار المدخل والمحاولة مرة أخرى.", "FastForward": "التقديم السريع", "FileNotFound": "الملف غير موجود.", @@ -132,32 +105,25 @@ "GuideProviderSelectListings": "إختر المبوبات", "H264CrfHelp": "معامل المعدل الثابت CRF هو الجودة الافتراضية لإعدادات مشفر x264. بإمكانك إعطاء قيمة تتراوح بين 0 و 51، وكلما قلت القيمة فسينتج عن ذلك جودة أفضل (على حساب حجم تخزين أعلى). القيم المعقول تتراوح بين 18 و 28. الافتراضي لـ x264 هي 23، لذا فبإمكانك استخدام هذه القيمة كنقطة بداية.", "EncoderPresetHelp": "اختر قيمة أعلى لتحسين السرة والأداء وقيمة أقل لتحسين الجودة.", - "HardwareAccelerationWarning": "تمكين التسريع بعتاد الحاسوب قد يتسبب في عدم استقرار بعض أنواع الأنظمة. تأكد من أن نظام التشغيل الخاص بك محدث إلى آخر نسخة وأن سواقات الفيديو محدثة أيضاً. إذا واجهت أية صعوبات في تسغيل الفيديو بعد تمكين هذه الخاصية، فعليك إرجاع الإعداد إلى وضعية آلي.", + "HardwareAccelerationWarning": "تمكين التسريع بعتاد الحاسوب قد يتسبب في عدم استقرار بعض أنواع الأنظمة. تأكد من أن نظام التشغيل الخاص بك محدث إلى آخر نسخة وأن سواقات الفيديو محدثة أيضاً. إذا واجهت أية صعوبات في تسغيل الفيديو بعد تمكين هذه الخاصية، فعليك إرجاع الإعداد إلى وضعية بلا None.", "HeaderAccessSchedule": "جدول الدخولات", "HeaderAccessScheduleHelp": "إنشئ جدول دخولات لكي تتمكن من تحديد ساعات للدخول.", "HeaderActiveDevices": "الأجهزة المفعّلة", "HeaderActiveRecordings": "التسجيلات المفعلة", "HeaderActivity": "الأنشطة", - "HeaderAddScheduledTaskTrigger": "إضافة زناد", "HeaderAddUpdateImage": "إضافة/تحديث صورة", - "HeaderAddUser": "إضافة مستخدم", "HeaderAdditionalParts": "أدوار إضافية", "HeaderAdmin": "المدير", - "HeaderAlbums": "الألبومات", "HeaderAlert": "تنبيه", "HeaderAllowMediaDeletionFrom": "السماح بحذف الوسائط من قبل", "HeaderApiKey": "مفتاح API", "HeaderApiKeys": "مفاتيح API", - "HeaderApiKeysHelp": "التطبيقات الخارجية تحتاج أن تمتلك مفتاح api لكي تتصل بخادم أمبي. هذه المفاتيح تُصدر عن طريق تسجيل الدخول بحساب أمبي، أو عن طريق منح التطبيق مفتاحاً أصدر يدوياً.", + "HeaderApiKeysHelp": "التطبيقات الخارجية تحتاج أن تمتلك مفتاح api لكي تتصل بالخادم. هذه المفاتيح تُصدر عن طريق تسجيل الدخول بمستخدم عادي، أو عن طريق منح التطبيق مفتاحاً أصدر يدوياً.", "HeaderApp": "التطبيق", "HeaderAudioSettings": "إعدادات الصوت", - "HeaderAutomaticUpdates": "التحديثات الآلية", - "HeaderBooks": "الكتب", "HeaderBranding": "وسومات البرنامج", "HeaderCastAndCrew": "الممثلين وطاقم العمل", - "HeaderCastCrew": "الممثلين والطاقم", "HeaderChannelAccess": "صلاحيات القنوات", - "HeaderChannels": "القنوات", "HeaderCodecProfile": "عريضة الكودك", "HeaderCodecProfileHelp": "عرائض الكودك تشير إلى محدودية جهاز ما عند تشغيل وسيطة مشفر بكودك معيّن. إن كان هناك أي محدودية مذكورة فستحال الوسيطة إلى التشغير البيني، حتى لو كانت الصيغة مضبوطة للعمل بتلقائية.", "HeaderConfirmPluginInstallation": "أكد عملية تثبيت الملحق", @@ -180,18 +146,12 @@ "HeaderDevices": "الأجهزة", "HeaderDirectPlayProfile": "عريضة التشغيل المباشر", "HeaderDirectPlayProfileHelp": "أضف مباشرةً عريضة تشغيل للإشارة لأي صيغة يتمكن الجهاز من التعامل معه بتلقائية.", - "HeaderDisplay": "إظهار", "HeaderEasyPinCode": "الرمز الشخصي الميسر", - "HeaderEpisodes": "الحلقات", "HeaderError": "حدث خطأ", "HeaderFeatureAccess": "صلاحية الخاصية", - "HeaderFeatures": "المواصقات", "HeaderFetchImages": "إطهار الصور:", - "HeaderFilters": "مرشحات", "HeaderForKids": "للأطفال", - "HeaderForgotPassword": "نسيت كلمة السر", "HeaderFrequentlyPlayed": "تم تشغيله مراراً", - "HeaderGenres": "أنواع الأفلام", "HeaderGuideProviders": "مزودو الأدلة", "HeaderHttpHeaders": "رؤوس HTTP", "HeaderIdentification": "التعريفة", @@ -201,7 +161,6 @@ "HeaderImageSettings": "إعدادات الصورة", "HeaderInstall": "تثبيت", "HeaderInstantMix": "مزيج فوري", - "HeaderItems": "العناصر", "HeaderLatestEpisodes": "احدث الحلقات", "HeaderLatestMedia": "آحدث الوسائط", "HeaderLatestMovies": "أحدث الأفلام", @@ -210,24 +169,18 @@ "HeaderLibraries": "المكتبات", "HeaderLibraryAccess": "صلاحيات المكتبة", "HeaderLibraryFolders": "مجلدات الوسائط", - "HeaderLiveTV": "التلفاز المباشر", - "HeaderLiveTv": "التلفاز المباشر", "HeaderLoginFailure": "فشل في تسجيل الدخول", "HeaderMedia": "الوسائط", "HeaderMediaFolders": "مجلدات الوسائط", - "HeaderMediaInfo": "معلومات الوسيطة", "HeaderMoreLikeThis": "المزيد من الروابط لهذا", - "HeaderMovies": "الأفلام", "HeaderMusicVideos": "الفيديوهات الموسيقية", "HeaderMyMedia": "وسائطي", "HeaderNewApiKey": "مفتاح API جديد", - "HeaderNextUp": "التالي", "HeaderOtherItems": "عناصر أخرى", "HeaderParentalRatings": "التصنيف الأبوي", "HeaderPassword": "كلمة السر", "HeaderPasswordReset": "إعادة تهيئة كلمة السر", "HeaderPaths": "مسارات", - "HeaderPeople": "الناس", "HeaderPinCodeReset": "أعد تهيئة الرمز الشخصي", "HeaderPlayAll": "تشغيل الكل", "HeaderPlayback": "تشغيل الوسائط", @@ -236,7 +189,7 @@ "HeaderPreferredMetadataLanguage": "اللغة المفضلة لواصفات البيانات", "HeaderProfile": "الحساب", "HeaderProfileInformation": "معلومات العريضة", - "HeaderProfileServerSettingsHelp": "هذه القيم ستتحكم في كيفية تقديم شكل خادم أمبي في الجهاز", + "HeaderProfileServerSettingsHelp": "هذه القيم ستتحكم في كيفية تقديم شكل الخادم في للعملاء.", "HeaderRecentlyPlayed": "تم تشغيله مؤخراً", "HeaderRecordingPostProcessing": "تطبيق ما-بعد-المعالجة للتسجيل", "HeaderRemoteControl": "التحكم عن بعد", @@ -248,7 +201,6 @@ "HeaderRevisionHistory": "تاريخ المراجعات", "HeaderRunningTasks": "المهام المشغّلة", "HeaderScenes": "المشاهد", - "HeaderSchedule": "الجدول", "HeaderSeasons": "المواسم", "HeaderSelectCertificatePath": "إختر مسار الشهادة", "HeaderSelectMetadataPath": "إختر مسار واصفات البيانات", @@ -258,13 +210,11 @@ "HeaderSelectServerCachePath": "إختر مسار كاشة الخادم", "HeaderSelectServerCachePathHelp": "تصفح أو أدخل المسار الذي ترغب أن يُستخدم كاشة لملفات الخادم. يجب أن يكون هذا المجلد قابل للكتابة فيه.", "HeaderSelectTranscodingPath": "إختر المسار المؤقت للتشفير البيني", - "HeaderSelectTranscodingPathHelp": "تصفح أو أدخل المسار الذي ترغب أن يُستخدم للملفات المؤقتة للتشفير البيني. يجب أن يكون هذا المجلد قابل للكتابة فيه.", + "HeaderSelectTranscodingPathHelp": "تصفح أو أدخل المسار الذي ترغب أن يُستخدم لملفات التشفير البيني. يجب أن يكون هذا المجلد قابل للكتابة فيه.", "HeaderSendMessage": "أرسل رسالة", - "HeaderSeries": "المسلسلات", "HeaderServerSettings": "إعدادات الخادم", "HeaderSettings": "الإعدادات", "HeaderSetupLibrary": "ضبط مكتبة المحتوى الخاصة بك", - "HeaderShutdown": "إنهاء التشغيل", "HeaderSortBy": "ترتيب حسب", "HeaderSortOrder": "تسلسل الترتيب", "HeaderSpecialEpisodeInfo": "معلومات الحلقة الخاصة", @@ -274,7 +224,6 @@ "HeaderSubtitleProfiles": "عرائض الترجمة", "HeaderSubtitleProfilesHelp": "عرائض الترجمة تصف صيغ الترجمة المدعومة على الأجهزة المختلفة.", "HeaderSystemDlnaProfiles": "عرائض النظام", - "HeaderTags": "البطاقات", "HeaderTaskTriggers": "زنادات المهام", "HeaderThisUserIsCurrentlyDisabled": "هذا المستخدم موقف حالياً", "HeaderTracks": "المقاطع الصوتية", @@ -294,64 +243,58 @@ "HeaderXmlDocumentAttributes": "سمات مستند xml", "HeaderXmlSettings": "إعدادات xml", "HeaderYears": "السنوات", - "HeadersFolders": "مجلدات", - "ImportFavoriteChannelsHelp": "عند التفعيل، فقط القنوات التي علّمت في المفضلة على هذا المولف ستورد إلى النظام.", - "ImportMissingEpisodesHelp": "عند التمكين، المعلومات الناقصة للحلقات ستورّد إلى قاعدة بيانات أمبي وستعرض داخل المواسم والمسلسلات. قد تتسبب هذه بأوقات أطول بكثير عند تمشيط المكنبات.", + "ImportFavoriteChannelsHelp": "فقط القنوات التي علّمت في المفضلة على جهاز المولف ستورد.", + "ImportMissingEpisodesHelp": "المعلومات الناقصة للحلقات ستورّد إلى قاعدة بياناتك وستعرض داخل المواسم والمسلسلات. قد تتسبب هذه بأوقات أطول بكثير عند تمشيط المكتبات.", "LabelAbortedByServerShutdown": "(تم إهماله بسبب عملية إغلاق الخادم)", "LabelAccessDay": "يوم الأسبوع:", - "LabelAccessEnd": "تاريخ النهاية", - "LabelAccessStart": "تاريخ البداية", + "LabelAccessEnd": "وقت النهاية:", + "LabelAccessStart": "وقت البداية:", "LabelAirDays": "أيام البث:", "LabelAirTime": "وقت البث:", - "LabelAlbum": "الألبوم", + "LabelAlbum": "الألبوم:", "LabelAlbumArtHelp": "PN المستخدمة في رسومات الألبوم، داخل سمة dlna:profileID في upnp:albumArtURI. بعض الأجهزة تحتاج قيمة محددة، مهما كان حجم الصورة.", - "LabelAlbumArtMaxHeight": "الارتفاع الأقصى لرسومات الألبوم", + "LabelAlbumArtMaxHeight": "الارتفاع الأقصى لرسومات الألبوم:", "LabelAlbumArtMaxHeightHelp": "الدقة القصوى لرسومات الألبوم المظهّرة عبر سمة upnp:albumArtURI.", "LabelAlbumArtMaxWidth": "العرض الأقصى لرسوم الألبوم:", "LabelAlbumArtMaxWidthHelp": "الدقة القصوى لرسومات الألبوم المظهّرة عبر سمة upnp:albumArtURI.", "LabelAlbumArtPN": "رسومات الألبوم PN:", "LabelAlbumArtists": "فنانو الألبومات:", - "LabelAll": "الجميع", "LabelAllowHWTranscoding": "السماح بالتشفير البيني بعتاد الحاسب", - "LabelAllowServerAutoRestart": "السماح للخادم أن يعيد التشغيل آلياً لتفعيل التحديثات", - "LabelAllowServerAutoRestartHelp": "الخادم سيعيد التشغيل في فترات الركود فقط، حين لا يكون هناك أي مستخدمين متصلين.", "LabelAppName": "اسم التطبيق", - "LabelAppNameExample": "مثال: Sickbeard، NzbDrone", + "LabelAppNameExample": "مثال: Sickbeard، Sonarr", "LabelArtists": "الفنانون:", - "LabelArtistsHelp": "فصل الاستعمالات المتعددة ;", + "LabelArtistsHelp": "افصل بين الفنانين ب ; فاصلة منقوطة.", "LabelAudioLanguagePreference": "اللغة المفضلة للصوت:", "LabelBindToLocalNetworkAddress": "إربطه إلى عنوان شبكة محلي:", - "LabelBindToLocalNetworkAddressHelp": "هذا خياري. امتطي عنوان الآي بي المحلي لربطه بخادم http. إذا ترك فارغاً، فإن الخادم سيربطه بجميع العناوين المتاحة. تغيير هذه القيمة يتطلب إعادة تشغيل خادم أمبي.", - "LabelBlastMessageInterval": "فترات بث رسالة قيد التشغيل (بالثواني)", - "LabelBlastMessageIntervalHelp": "يحدد الفترة بالثواني بين يث رسائل قيد التشغيل", - "LabelCache": "ذاكرة الكاشة", - "LabelCachePath": "مسار ذاكرة الكاشة:", - "LabelCachePathHelp": "حدد موقع مخصص لملفات كاشة الخادم، مثل الصور وغيرها. أترك هذه الخانة فارغة لاستعمال القيمة التلقائية.", + "LabelBindToLocalNetworkAddressHelp": "تجاوز عنوان الآي بي المحلي لربطه بخادم http. إذا ترك فارغاً، فإن الخادم سيربطه بجميع العناوين المتاحة. تغيير هذه القيمة يتطلب إعادة تشغيل خادم جيلليفن.", + "LabelBlastMessageInterval": "فترات بث رسالة قيد التشغيل", + "LabelBlastMessageIntervalHelp": "يحدد الفترة بالثواني بين بث رسائل قيد التشغيل.", + "LabelCache": "مَخبأ (كاش):", + "LabelCachePath": "مسار ذاكرة الكاش:", + "LabelCachePathHelp": "حدد موقع مخصص لملفات الخادم المؤقتة، مثل الصور وغيرها. أترك هذه الخانة فارغة لاستعمال القيمة الافتراضية.", "LabelCancelled": "تم الإلغاء", - "LabelCollection": "المجموعة", + "LabelCollection": "المجموعة:", "LabelCommunityRating": "تقييم المجتمع:", - "LabelContentType": "نوع المحتوى", + "LabelContentType": "نوع المحتوى:", "LabelCountry": "البلد:", "LabelCurrentPassword": "كلمة السر الحالية:", - "LabelCustomCertificatePath": "مسار شهادة ssl مخصص:", + "LabelCustomCertificatePath": "مسار شهادة SSL المخصص:", "LabelCustomCertificatePathHelp": "مسار ملف PKCS # 12 يحتوي على شهادة ومفتاح خاص لتمكين دعم TLS على مجال مخصص.", - "LabelCustomCss": "تنيسق CSS مخصوص:", - "LabelCustomCssHelp": "طبق تنسيق css مخصوصة لواجهة الويب.", - "LabelCustomDeviceDisplayName": "اسم العرض:", - "LabelCustomDeviceDisplayNameHelp": "أذكر اسم عرض مخصوص أو أتركه فارغاً لاستخدام", + "LabelCustomCss": "تنيسق CSS مخصص:", + "LabelCustomCssHelp": "طبق تنسيقك css المخصص لواجهة الويب.", + "LabelCustomDeviceDisplayNameHelp": "أذكر اسم عرض مخصوص أو أتركه فارغاً لاستخدام الاسم المبلغ من الجهاز.", "LabelDateAddedBehavior": "كيف يتصرف المحتوى الجديد نحو \"تاريخ الإضافة\" الخاص به:", - "LabelDateAddedBehaviorHelp": "إذا استعرضت قيمة واصفات البيانا فإنها سوف تستخدم قبل أن تستخدم أي من هذه الخيارات.", + "LabelDateAddedBehaviorHelp": "إذا اخذت واصفات البيانات قيمة، فإنها سوف تستخدم قبل أن تستخدم أي من هذه الخيارات.", "LabelDay": "اليوم:", "LabelDeathDate": "تاريخ الوفاة:", - "LabelDefaultUser": "المستخدم الافتراضي", + "LabelDefaultUser": "المستخدم الافتراضي:", "LabelDefaultUserHelp": "لتحديد مكتبة المستخدم التي تظهر على الأجهزة المتصلة. بإمكان الامتطاء على هذه القيمة لكل جهاز عن طريق عرائض الأجهزة.", "LabelDeviceDescription": "وصف الجهاز", - "LabelDidlMode": "طور didl:", - "LabelDisplayMissingEpisodesWithinSeasons": "أظهر الحلقات المفقودة في مجلدات المواسم", + "LabelDidlMode": "طور DIDL:", "LabelDisplayName": "الاسم المعروض:", "LabelDisplaySpecialsWithinSeasons": "أظهر الحلقات الخاصة في المواسم التي بثت فيها", "LabelDownMixAudioScale": "تعزيز الصوت عند تقليل توزيع قنوات الصوت:", - "LabelDownMixAudioScaleHelp": "تعزيز الصوت عند تقليل توزيع قنوات الصوت. حدد القيمة بـ 1 للمحافظة على القيمة الأصلية للصوت.", + "LabelDownMixAudioScaleHelp": "تعزيز الصوت عند تقليل توزيع قنوات الصوت. حدد القيمة ب 1 للمحافظة على القيمة الأصلية للصوت.", "LabelDownloadLanguages": "إنزال اللغة:", "LabelDynamicExternalId": "معرفة {0}:", "LabelEasyPinCode": "الرمز الشخصي الميسر:", @@ -360,8 +303,8 @@ "LabelEnableAutomaticPortMap": "فعل الخاصية الآلية في التوفيق بين المنافذ", "LabelEnableAutomaticPortMapHelp": "حاول التوفيق بين المنفذ العالمي والمنفذ المحلي آلياً باستخدام آلية UPnP. هذه الخاصية قد لا تعمل مع بعض أنواع الراوترات.", "LabelEnableBlastAliveMessages": "بث رسائل قيد التشغيل", - "LabelEnableBlastAliveMessagesHelp": "فعل هذه الخاصية إذا كان الخادم لا يكتشف بكفاءة من قبل أجهزة UPnP الأخرى على شبكتك", - "LabelEnableDlnaClientDiscoveryInterval": "فترات استكشاف العملاء (بالثواني)", + "LabelEnableBlastAliveMessagesHelp": "فعل هذه الخاصية إذا كان الخادم لا يكتشف بكفاءة من قبل أجهزة UPnP الأخرى على شبكتك.", + "LabelEnableDlnaClientDiscoveryInterval": "فترات استكشاف العملاء", "LabelEnableDlnaClientDiscoveryIntervalHelp": "يحدد الفترة بالثواني بين عمليات بحث SSDP التي يقوم بها أمبي.", "LabelEnableDlnaDebugLogging": "تفعيل خاصية كشوفات أخطاء DLNA", "LabelEnableDlnaDebugLoggingHelp": "هذه ستنشئ سجلات كشفية ضخمة ولا ينبغي تفعيلها إلا عند الحاجة إليها بغرض استكشاف الأخطاء وحصرها.", @@ -462,7 +405,6 @@ "LabelNewPassword": "كلمة السر الجديدة:", "LabelNewPasswordConfirm": "تأكيد كلمة السر الجديدة:", "LabelNewsCategories": "التصنيفات الأخبارية:", - "LabelNext": "التالي", "LabelNotificationEnabled": "تفعيل هذه الإشعارات", "LabelNumberOfGuideDays": "عدد أيام بيانات الدليل للإنزال:", "LabelNumberOfGuideDaysHelp": "إنزال أيام أكثر من بيانات الدليل ستوفر أمكانية جدولة أيام أبعد وإظهار قوائم أطول للبرامج، لكنها ستأخذ وقتاً أطول للإنزال. االخيار الآلي سوف يتخيّر بناء على عدد القنوات المتاحة.", @@ -477,8 +419,6 @@ "LabelPostProcessorArguments": "معطيات سطر الأوامر لتطبيق ما بعد المعالجة", "LabelPostProcessorArgumentsHelp": "استخدم المسار: {path} كمسار لملف التسجيل.", "LabelPreferredDisplayLanguage": "لغة الواجهة المفضلة:", - "LabelPreferredDisplayLanguageHelp": "إن ترجمة أمبي هو مشروع جاري التنفيذ.", - "LabelPrevious": "السابق", "LabelProfileAudioCodecs": "كودك تشفير الصوت", "LabelProfileCodecs": "الكودكات:", "LabelProfileCodecsHelp": "يجب فصل العناصر بفواصل (,). يمكن أن تترك هذه فارغة إذا أريد تطبيقها على كل الكودكات.", @@ -492,7 +432,6 @@ "LabelPublicHttpPortHelp": "رقم المنفذ العالمي الذي يجب أن يوافق منفذ http المحلي.", "LabelPublicHttpsPort": "رقم منفذ https العالمي:", "LabelPublicHttpsPortHelp": "رقم المنفذ العالمي الذي يجب أن يوافق منفذ https المحلي.", - "LabelReadHowYouCanContribute": "تعرّف على كيفية المساهمة فيه.", "LabelRecordingPath": "المسار الافتراضي للمقاطع المسجلة:", "LabelRecordingPathHelp": "حدد موقع افتراضي لحفظ المقاطع المسجلة، لو تركت هذه الخانة فارغة، فسيستعمل مجلد بيانات البرنامج.", "LabelReleaseDate": "تاريخ الإصدار", @@ -527,12 +466,9 @@ "LabelTag": "البطاقة:", "LabelTime": "الوقت:", "LabelTimeLimitHours": "الوقت المحدد (بالساعة):", - "LabelTranscodingAudioCodec": "كودك تشفير الصوت:", - "LabelTranscodingContainer": "الحاوية:", "LabelTranscodingTempPathHelp": "هذا المجلد يحتوي على ملفات قيد الاستعمال من قبل المشفر البيني. حدد مساراً مخصوصاً او اتركه فارغاً لاستعمال القيمة الافتراضية في مجلد بيانات الخادم.", "LabelTranscodingThreadCount": "عدد مسارات التشفير البيني", "LabelTranscodingThreadCountHelp": "إختر الحد الأقصى المسموح به من مسارات التشفير البيني. إن تقليل عدد المسارات سيقلل من نسبة استخدام المعالج لكنه قد لا يحوّل الوسيطة بالسرعة المطلوبة لتشغيل سلس.", - "LabelTranscodingVideoCodec": "كودك تشفير الفيديو:", "LabelTriggerType": "نوع الزناد:", "LabelTunerIpAddress": "عنوان آي بي المولف:", "LabelTunerType": "نوع المولف:", @@ -552,7 +488,6 @@ "LabelXDlnaCapHelp": "تحدد محتوى عنصر X_DLNACAP في النطاق الاسمي لـ urn:schemas-dlna-org:device-1-0 .", "LabelXDlnaDoc": "وثيقة X-Dlna:", "LabelXDlnaDocHelp": "تحدد محتوى عنصر X_DLNADOC في النطاق الاسمي لـ urn:schemas-dlna-org:device-1-0 .", - "LabelYourFirstName": "الإسم الاول:", "LabelYoureDone": "تم الانتهاء!", "LabelZipCode": "الرمز البريدي:", "LabelffmpegPath": "مسار ffmpeg:", @@ -603,7 +538,6 @@ "MessageFileReadError": "حصل خطأ أثناء قراءة الملف. الرجاء المحاولة مرة اخرى.", "MessageForgotPasswordFileCreated": "الملف التالي قد أنشيء على خادمك وهو يحتوي على التوجيهات لكيفية البدء:", "MessageForgotPasswordInNetworkRequired": "الرجاء المحاولة من خلال شبكة المنزل لبدء عملية إعادة إعداد كملة السر.", - "MessageInstallPluginFromApp": "هذا الملحق يجب أن يثبت من داخل التطبيق الذي تريد استخدامه بداخله.", "MessageInvalidForgotPasswordPin": "لقد تم إدخال رمز شخصي غير صحيح أو منتهي الصلاحية. الرجاء المحاولة مرة أخرى.", "MessageInvalidUser": "اسم المستخدم أو كلمة السر غير صحيحة. الرجاء المحاولة مرة أخرى.", "MessageItemSaved": "تم حفظ العنصر.", @@ -618,7 +552,6 @@ "MessagePluginConfigurationRequiresLocalAccess": "لضبط", "MessagePluginInstallDisclaimer": "إن الملحقات التي بناها أعضاء مجتمع أمبي لهي طريقة رائعة لتحسين متعة استخدام أمبي وذلك بإضافة المزايا والخدمات الجديدة. قبل تثبيت الملحقات، نرجو أخذ العلم بالآثار التي قد تلحقها بخادم أمبي الخاص بك، مثل أوقات أطولة لتمشيط مكتبتك، والعمليات الخلفية الإضافية وتقليل استقرار نظامك.", "MessageReenableUser": "أنظر أدناه لإعادة التفعيل", - "MessageSettingsSaved": "تم حفظ الإعدادات.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "مكان الوسائط التالي سيزال من مكتبة أمبي الخاصة بك:", "MessageUnableToConnectToServer": "لم نستطع الاتصال إلى الخادم المختار في الوقت الحالي. الرجاء التأكد من أنه يعمل ثم المحاولة مرة أخرى.", "MessageUnsetContentHelp": "المحتوى سيعرض كمجدات اعتيادية. لأفضل النتائج استخدم مدير واصفات البيانات لإعداد نوع محتوى المجلدات الفرعية.", @@ -632,8 +565,8 @@ "MoreUsersCanBeAddedLater": "يمكن اضافة المستخدمين لاحقا من لوحة العدادات.", "Mute": "صامت", "NextUp": "التالي", - "NoNextUpItemsMessage": "لم يتم ايجاد شيء، إبدأ بمشاهدة برامجك!", - "NoPluginConfigurationMessage": "هذا الملحق ليس له إعدادات تضبط.", + "MessageNoNextUpItems": "لم يتم ايجاد شيء، إبدأ بمشاهدة برامجك!", + "MessageNoPluginConfiguration": "هذا الملحق ليس له إعدادات تضبط.", "NumLocationsValue": "{0} مجلد(ات)", "Option3D": "ثلاثي أبعاد", "OptionAdminUsers": "المدراء", @@ -656,7 +589,6 @@ "OptionArtist": "الفنان", "OptionAscending": "تصاعدي", "OptionAuto": "آلي", - "OptionAutomatic": "الآلي", "OptionAutomaticallyGroupSeries": "إدمج الحلقات الموزعة بين عدة مجلدات إلى مجلد واحد تلقائياً.", "OptionAutomaticallyGroupSeriesHelp": "في حال التفعيل فإن الحلقات الموزعة بين عدة مجلدات ستدمج تلقائياً في مجلد مسلسل واحد.", "OptionBlockBooks": "الكتب", @@ -708,7 +640,6 @@ "OptionExternallyDownloaded": "الإنزال من الخارج", "OptionExtractChapterImage": "تفعيل استخلاص صور الأبواب", "OptionFavorite": "المفضلات", - "OptionFriday": "الجمعة", "OptionHasSpecialFeatures": "المحتويات الخاصة", "OptionHasSubtitles": "الترجمة", "OptionHasThemeSong": "أغنية الشارة", @@ -726,10 +657,8 @@ "OptionLikes": "المحببات", "OptionMax": "الحد الأقصى", "OptionMissingEpisode": "حلفة مفقودة", - "OptionMonday": "الأثنين", "OptionNameSort": "الاسم", "OptionNone": "لا شيء", - "OptionOnAppStartup": "بناء على تشغيل الخادم", "OptionOnInterval": "بناء على فترة", "OptionParentalRating": "التصنيف الأبوي", "OptionPlainStorageFolders": "غرض جميع المجلدات كمجلدات تخزين بسيطة", @@ -751,19 +680,14 @@ "OptionResElement": "عناصر res", "OptionResumable": "إمكانية التكملة", "OptionRuntime": "زمن التشغيل", - "OptionSaturday": "السبت", "OptionSaveMetadataAsHidden": "حفظ واصفات البيانات والصور كملفات مخفية", "OptionSaveMetadataAsHiddenHelp": "إن تغيير هذه سيطبق على واصفات البيانات الجديدة من الآن. أما واصفات البيانات الموجودة مسبقاً، فهي ستحدث من قبل الخادم في المرة القادمة التي يتم حفظها.", "OptionSpecialEpisode": "حصريات", - "OptionSunday": "الأحد", - "OptionThursday": "الخميس", "OptionTrackName": "اسم المقطوعة", - "OptionTuesday": "الثلاثاء", "OptionTvdbRating": "تقييم Tvdb", "OptionUnairedEpisode": "حلفة لم تبثّ", "OptionUnplayed": "غير معزوف", "OptionWakeFromSleep": "استيقظ من السبات", - "OptionWednesday": "الأربعاء", "OptionWeekdays": "أيام الأسبوع", "OptionWeekends": "أيام العطلة", "OptionWeekly": "أسبوعي", @@ -772,7 +696,7 @@ "PasswordMatchError": "كلمة السر وتاكيدها يجب ان يتطابقان.", "PasswordResetComplete": "لقد تم اعادة تعيين كلمة السر.", "PasswordResetConfirmation": "هل انت متاكد من انك تريد اعادة تعيين كلمة السر؟", - "PasswordResetHeader": "إعادة تهيئة كلمة السر", + "HeaderResetPassword": "إعادة تهيئة كلمة السر", "PasswordSaved": "تم حفظ كلمة السر.", "PictureInPicture": "صورة داخل صورة", "PinCodeResetComplete": "تمت إعادة تهيئة الرمز الشخصي", @@ -783,7 +707,7 @@ "RecommendationBecauseYouWatched": "لأنك شاهدت {0}", "RecommendationDirectedBy": "إخراج {0}", "RecommendationStarring": "بطولة {0}", - "RecordingPathChangeMessage": "إن تغيير مجلد التسجيل لم يهجّر التسجيلات الموجودة من الموقع القديم إلى الموقع الجديد. سيتعين عليك أن تنقلهم بنفسك لو شئت.", + "MessageChangeRecordingPath": "إن تغيير مجلد التسجيل لم يهجّر التسجيلات الموجودة من الموقع القديم إلى الموقع الجديد. سيتعين عليك أن تنقلهم بنفسك لو شئت.", "RememberMe": "تذكرني", "Rewind": "الترجيع", "Saturday": "السبت", @@ -802,58 +726,29 @@ "SystemDlnaProfilesHelp": "عرائض النظام تكون مقفلة للقراءة-فقط. وأي تغيير على عريضة من عرائض النظام ستحفظ إلى عريضة مخصوصة جديدة.", "TabAccess": "الدخول", "TabAdvanced": "متقدم", - "TabAlbumArtists": "فنانو الألبومات", - "TabAlbums": "الألبومات", - "TabArtists": "الفنانون", "TabCatalog": "الكتالوج", - "TabChannels": "القنوات", "TabCodecs": "الكودكات", - "TabCollections": "المجاميع", "TabContainers": "الحاويات", "TabDashboard": "لوحة العدادات", - "TabDevices": "الأجهزة", "TabDirectPlay": "تشغيل مباشر", - "TabDisplay": "إظهار", - "TabEpisodes": "الحلقات", - "TabFavorites": "المفضلة", - "TabGenres": "أنواع الأفلام", - "TabGuide": "الدليل", - "TabInfo": "معلومات", "TabLatest": "الاخير", - "TabLiveTV": "التلفاز المباشر", "TabLogs": "الكشوفات", - "TabMetadata": "واصفات البيانات", - "TabMovies": "الفيلم", "TabMusic": "الموسيقى", - "TabMusicVideos": "الفيديوهات الموسيقية", "TabMyPlugins": "ملحقاتي", "TabNetworks": "الشبكات", "TabNfoSettings": "أعدادات Nfo", "TabNotifications": "إشعارات", "TabOther": "أخرى", "TabParentalControl": "التحكم الأبوي", - "TabPassword": "كلمة السر", - "TabPlayback": "تشغيل", - "TabPlaylist": "قائمة التشغيل", - "TabPlaylists": "قوائم التشغيل", "TabPlugins": "الملحقات", "TabProfile": "عريضة", "TabProfiles": "الحسابات", - "TabRecordings": "المقاطع المسجلة", "TabResponses": "الردود", - "TabResumeSettings": "استئناف الإعدادات", "TabScheduledTasks": "المهام المجدولة", - "TabSeries": "المسلسلات", "TabServer": "الخادم", "TabSettings": "الإعدادات", - "TabShows": "المسلسلات", - "TabSongs": "الاغانى", "TabStreaming": "التشغيل التدفقي", - "TabSuggestions": "مقترحات", - "TabTrailers": "العروض الإعلانية", - "TabTranscoding": "التشفير البيني", "TabUpcoming": "القادم", - "TabUsers": "المستخدمون", "TellUsAboutYourself": "اخبرنا عن نفسك", "ThisWizardWillGuideYou": "مرشد الاعدادات سيساعدك خلال خطوات عملية الاعدادات. للبدء، الرجاء اختيار لغتك المفضلة.", "Thursday": "الخميس", @@ -862,7 +757,7 @@ "TitlePlayback": "تشغيل", "Tuesday": "الثلاثاء", "UninstallPluginConfirmation": "هل انت متاكد انك تريد إزالة تثبيت {0}؟", - "UninstallPluginHeader": "الغاء الملحق", + "HeaderUninstallPlugin": "الغاء الملحق", "Unmute": "غير صامت", "UserProfilesIntro": "إمبي يتضمن الدعم التلقائي حسابات المستخدمين، ما يتيح لكل مستخدم أن يحفظ إعدادات العرض الخاصة وحالات تشغيل الوسائط وخواص الرقابة الأبوية.", "ValueAlbumCount": "{0} ألبومـ(ات)", @@ -938,11 +833,9 @@ "Banner": "بانر", "Backdrops": "خلفيات متغيرة للصفحة", "Backdrop": "خلفية متغيرة للصفحة", - "AutoBasedOnLanguageSetting": "تلقائي ( بناءً على إعدادات اللغة)", "Auto": "تلقائي", - "AuthProviderHelp": "حدد مقدم المصادقات ليتم استخدامه لمصادقة كلمة مرور هذا المستخدم.", + "AuthProviderHelp": "اختار مقدم المصادقة ليتم استخدامه لمصادقة كلمة مرور هذا المستخدم.", "AroundTime": "حول", - "AttributeNew": "جديد", "AspectRatio": "نسبة العرض الى الارتفاع", "Ascending": "تصاعدي", "AsManyAsPossible": "أكبر عدد ممكن", @@ -997,7 +890,6 @@ "MediaInfoStreamTypeEmbeddedImage": "الصورة المضمنة", "MediaInfoStreamTypeData": "البيانات", "MediaInfoStreamTypeAudio": "الصوت", - "MediaInfoSoftware": "البرمجيات", "MediaIsBeingConverted": "يتم تحويل الوسط الى صيغة متوافقة مع الحهاز الذي يشغل الوسط.", "MediaInfoStreamTypeVideo": "فيديو", "ContinueWatching": "اكمل المشاهدة", @@ -1049,7 +941,7 @@ "Director": "المخرج", "DirectPlaying": "بث بدون تحويل الصيغة", "DirectStreaming": "البث المباشر", - "DirectStreamHelp2": "البث المباشر للملف يستخدم طاقة معالجة قليلة جدًا دون أي خسارة في جودة الفيديو.", + "DirectStreamHelp2": "البث المباشر للملف يستخدم قوة معالجة قليلة جدًا دون أي خسارة في جودة الفيديو.", "DirectStreamHelp1": "الوسائط متوافقة مع الجهاز فيما يتعلق بالدقة ونوع الوسائط (H.264 ، AC3 ، إلخ) ، ولكنها في حاوية ملفات غير متوافقة (mkv ، avi ، wmv ، إلخ). سيتم إعادة حزم الفيديو في الوقت الحقيقي قبل بثه إلى الجهاز.", "DetectingDevices": "يتم الكشف عن الأجهزة", "Desktop": "سطح المكتب", @@ -1059,7 +951,6 @@ "DefaultSubtitlesHelp": "يتم تحميل الترجمات استنادًا إلى العلامات الافتراضية والقسرية في البيانات الوصفية المضمنة. سيتم اعتبار تفضيلات اللغة عند توفر خيارات متعددة.", "DefaultMetadataLangaugeDescription": "هذه هي إعداداتك الافتراضية ويمكن تخصيصها على أساس كل مكتبة.", "Default": "افتراضي", - "CopyStreamURLError": "توجد مشكله في نسخ الرابط", "CopyStreamURL": "نسخ عنوان الرابط", "Continuing": "مستمر", "CopyStreamURLSuccess": "URL copied successfully.", @@ -1069,7 +960,6 @@ "ClientSettings": "إعدادات التطبيق", "ButtonTogglePlaylist": "قائمة التشغيل", "BoxSet": "طقم", - "ButtonToggleContextMenu": "المزيد", "ButtonSplit": "تقسيم", "AllowFfmpegThrottlingHelp": "عندما يتقدم رمز تحويل أو إعادة تحويل بعيدًا بما فيه الكفاية عن موضع التشغيل الحالي ، أوقف العملية مؤقتًا حتى تستهلك موارد أقل. هذا مفيد للغاية عند المشاهدة دون البحث كثيرًا. أوقف هذا إذا واجهت مشاكل في التشغيل.", "InstallingPackage": "تثبيت {0} (الإصدار {1})", @@ -1082,7 +972,6 @@ "HeaderKeepRecording": "استمر في التسجيل", "HeaderIdentifyItemHelp": "أدخل معيار بحث واحد أو أكثر. إزالة المعايير لزيادة نتائج البحث.", "HeaderHttpsSettings": "إعدادات HTTPS", - "HeaderHome": "الصفحة الرئيسية", "HeaderFetcherSettings": "إعدادات الجلب", "HeaderFavoritePlaylists": "قوائم التشغيل المفضلة", "HeaderFavoriteVideos": "مقاطع الفيديو المفضلة", @@ -1125,9 +1014,7 @@ "ErrorDeletingItem": "حدث خطأ في حذف العنصر من سيرفر Jellyfin. يرجى التحقق من أن سيرفر Jellyfin لديه حق الوصول للكتابة إلى مجلد الوسائط وحاول مرة أخرى.", "Episode": "حلقة", "EnableThemeVideosHelp": "قم بتشغيل الفيديوهات الرئيسية في الخلفية أثناء تصفح المكتبة.", - "EnableThemeVideos": "الفيديوهات الرئيسية", "EnableThemeSongsHelp": "قم بتشغيل اللحن الرئيسي في الخلفية أثناء تصفح المكتبة.", - "EnableThemeSongs": "اللحن الرئيسي", "EnableStreamLoopingHelp": "قم بتمكين هذا إذا كانت عمليات البث المباشر تحتوي فقط على بضع ثوان من البيانات وتحتاج إلى إعادة طلب مستمر. قد يؤدي تمكين هذا عندما لا تكون هناك حاجة إلى مشاكل.", "EnableStreamLooping": "تكرار البث المباشر", "EnableHardwareEncoding": "تمكين تشفير الأجهزة", @@ -1137,7 +1024,6 @@ "EnableColorCodedBackgrounds": "تصنيف الخلفيات حسب اللون", "EnableCinemaMode": "وضع السينما", "EnableBackdropsHelp": "اعرض الخلفيات في خلفية بعض الصفحات أثناء تصفح المكتبة.", - "EnableBackdrops": "الخلفيات", "DownloadsValue": "عدد التنزيلات {0}", "Download": "تحميل", "Down": "أسفل", @@ -1151,5 +1037,50 @@ "Dislike": "لم يعجبنى", "ButtonSyncPlay": "SyncPlay", "ExtraLarge": "كبير جدا", - "EnableNextVideoInfoOverlayHelp": "في نهاية الفيديو, عرض معلومات عن الفيديو القادم في قائمة التشغيل." + "EnableNextVideoInfoOverlayHelp": "في نهاية الفيديو, عرض معلومات عن الفيديو القادم في قائمة التشغيل.", + "LabelDroppedFrames": "الاطارات الساقطة:", + "LabelDropImageHere": "اسقط صورة هنا، او ضغط تصفح.", + "LabelDisplayOrder": "ترتيب المعروض:", + "LabelDisplayMode": "وضع المعروض:", + "LabelDisplayLanguageHelp": "ترجمة جيلليفين هو مشروع مستمر.", + "LabelDisplayLanguage": "لغة العرض:", + "LabelDiscNumber": "رقم القرص:", + "LabelDeinterlaceMethod": "طريقة تقليل التشابك:", + "LabelDefaultScreen": "الشاشة الافتراضية:", + "LabelDateTimeLocale": "وقت و تاريخ محلي:", + "LabelDateAdded": "تاريخ الاضافة:", + "LabelCustomRating": "تقييم مخصص:", + "LabelCriticRating": "تقييم النقاد:", + "LabelCorruptedFrames": "الإطارات التالفة:", + "LabelChannels": "القنوات:", + "LabelCertificatePasswordHelp": "اذا تطلبت شهادتك الامنية كلمة مرور، من فضلك ادخلها هنا.", + "LabelCertificatePassword": "كلمة مرور الشهادة الامنية:", + "LabelBurnSubtitles": "الترجمات المحروقة:", + "LabelBlockContentWithTags": "احجب العناصر بالعلامات:", + "LabelBitrate": "معدل البت:", + "LabelBirthYear": "عام الميلاد:", + "LabelBirthDate": "تاريخ الميلاد:", + "LabelAutomaticallyRefreshInternetMetadataEvery": "حدث وصف البيانات تلقائيا من الانترنت:", + "LabelAuthProvider": "مقدم التصديق:", + "LabelAudioSampleRate": "سرعة معينة الصوت:", + "LabelAudioCodec": "ترميز الصوت:", + "LabelAudioChannels": "قنوات الصوت:", + "LabelAudioBitrate": "معدل بث الصوت:", + "LabelAudioBitDepth": "عمق بث الصوت:", + "LabelAllowedRemoteAddressesMode": "وضع مرشح عنوان المضيف IP البعيد:", + "LabelAllowedRemoteAddresses": "مرشح عنوان المضيف IP البعيد:", + "LabelAirsBeforeSeason": "عروض بث قبل الموسم:", + "LabelAirsBeforeEpisode": "عروض بث قبل الحلقة:", + "LabelAirsAfterSeason": "عروض بث بعد الموسم:", + "Label3DFormat": "صيغة ثلاثية الابعاد:", + "Kids": "اطفال", + "Items": "عناصر", + "ItemCount": "{0} عنصر", + "InstantMix": "خلط فوري", + "HeaderSyncPlayEnabled": "تزامن اللعب ممكَّن", + "HeaderSyncPlaySelectGroup": "انضم لمجموعة", + "EnableDetailsBannerHelp": "اظهر صوره اللافته اعلى عنصر تفاصيل الصفحة.", + "EnableDetailsBanner": "لافتة التفاصيل", + "EnableDecodingColorDepth10Vp9": "تمكين ترميز ال10 بت عبر العتاد الصلب من اجل VP9", + "EnableDecodingColorDepth10Hevc": "تمكين ترميز ال10 بت عبر العتاد الصلب من اجل HEVC" } diff --git a/src/strings/be-by.json b/src/strings/be-by.json index 28cf51bcde..adaa0e43e1 100644 --- a/src/strings/be-by.json +++ b/src/strings/be-by.json @@ -1,20 +1,14 @@ { "ButtonCancel": "Адмяніць", - "ButtonNew": "Новае", "ButtonOk": "ОК", "ButtonQuickStartGuide": "Кіраўніцтва па запуску", "ButtonSignOut": "Sign out", - "HeaderAddUser": "Даданне карыстальніка", "HeaderEasyPinCode": "Просты PIN-код", "HeaderPaths": "Шляхі", "HeaderTaskTriggers": "Трыгеры задачы", "LabelFinish": "Гатова", - "LabelNext": "Наступнае", - "LabelPrevious": "Папярэдняе", - "LabelYourFirstName": "Ваша імя:", "LabelYoureDone": "Вы скончылі!", "MoreUsersCanBeAddedLater": "Потым можна дадаць яшчэ карыстальнікаў праз «Інфапанэль».", - "TabPlaylist": "Плэйліст", "TellUsAboutYourself": "Раскажыце пра сябе", "ThisWizardWillGuideYou": "Гэты памочнік правядзе вас праз усе фазы ўстаноўкі і налады. Спачатку абярыце упадабаную мову.", "UserProfilesIntro": "У Jellyfin існуе ўбудаваная падтрымка для карыстальніцкіх профіляў, дазваляючы кожнаму карыстальніку валодаць сваімі ўласнымі параметрамі адлюстравання, станам прайгравання і кіраваннем ўтрымання.", diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 9af8c54435..a1909065a0 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -11,76 +11,53 @@ "AllLibraries": "Всички библиотеки", "Art": "Картина", "Artists": "Артисти", - "AttributeNew": "Нови", "Audio": "Звук", "Auto": "Автоматично", - "AutoBasedOnLanguageSetting": "Автоматично (според езика)", "Backdrop": "Фон", "Backdrops": "Фонове", "BirthDateValue": "Роден/а на: {0}", "BirthPlaceValue": "Родно място: {0}", "Books": "Книги", "Browse": "Разглеждане", - "ButtonAdd": "Добавяне", "ButtonAddMediaLibrary": "Добавяне на библиотека", "ButtonAddScheduledTaskTrigger": "Добавяне на спусък", "ButtonAddServer": "Добавяне на сървър", "ButtonAddUser": "Добавяне на потребител", - "ButtonArrowDown": "Надолу", "ButtonArrowLeft": "Наляво", "ButtonArrowRight": "Надясно", - "ButtonArrowUp": "Нагоре", "ButtonAudioTracks": "Звукови пътеки", "ButtonBack": "Назад", "ButtonCancel": "Отмяна", - "ButtonDelete": "Изтриване", - "ButtonDeleteImage": "Изтриване на изобр.", - "ButtonDownload": "Изтегляне", - "ButtonEdit": "Редактиране", - "ButtonEditImages": "Редактиране на изображенията", - "ButtonFilter": "Филтър", "ButtonForgotPassword": "Забравена парола", "ButtonGotIt": "Добре", "ButtonGuide": "Справочник", - "ButtonHelp": "Помощ", - "ButtonHome": "Начало", "ButtonInfo": "Сведения", - "ButtonLearnMore": "Научете повече", "ButtonLibraryAccess": "Достъп до библиотеката", "ButtonManualLogin": "Вход с име и парола", "ButtonMore": "Още", - "ButtonNew": "Нов", "ButtonNextTrack": "Следваща пътека", - "ButtonOff": "Изключено", "ButtonOk": "Добре", "ButtonOpen": "Отваряне", "ButtonParentalControl": "Родителски контрол", "ButtonPause": "Пауза", - "ButtonPlay": "Пускане", "ButtonPreviousTrack": "Предишна пътека", "ButtonProfile": "Профил", "ButtonQuickStartGuide": "Първи стъпки", - "ButtonRefresh": "Опресняване", "ButtonRefreshGuideData": "Обновяване на данните в справочника", "ButtonRemove": "Премахване", "ButtonRename": "Преименуване", "ButtonResetPassword": "Зануляване на паролата", "ButtonRestart": "Повторно пускане", "ButtonResume": "Продължаване", - "ButtonSave": "Запазване", "ButtonScanAllLibraries": "Сканиране на всички библиотеки", - "ButtonSearch": "Търсене", "ButtonSelectDirectory": "Изберете папка", "ButtonSend": "Изпращане", "ButtonSettings": "Настройки", - "ButtonShuffle": "Пускане в разбъркан ред", "ButtonShutdown": "Загасяне", "ButtonSignIn": "Вписване", "ButtonSignOut": "Отписване", - "ButtonSort": "Подреждане", "ButtonStop": "Спиране", "ButtonSubmit": "Подаване", - "ButtonSubtitles": "Субтитри", "ButtonUninstall": "Деинсталиране", "ButtonWebsite": "Сайт", "ChannelAccessHelp": "Изберете каналите, които да споделите с потребителя. Администраторите ще могат да редактират всички канали, използвайки управлението на метаданни.", @@ -112,9 +89,7 @@ "EditImages": "Редактиране на изображенията", "EditMetadata": "Редактиране на метаданните", "EditSubtitles": "Редактиране на субтитрите", - "EnableBackdrops": "Фонове", "EnableCinemaMode": "Режим \"Киносалон\"", - "EnableThemeSongs": "Тематични песни", "Ended": "Приключило", "EndsAtValue": "Свършва на {0}", "Episodes": "Епизоди", @@ -146,24 +121,17 @@ "HeaderActiveDevices": "Активни устройства", "HeaderActiveRecordings": "Активни записи", "HeaderActivity": "Дейност", - "HeaderAddScheduledTaskTrigger": "Добавяне на спусък", "HeaderAddToCollection": "Добавяне към колекция", "HeaderAddToPlaylist": "Добавяне към списък", "HeaderAddUpdateImage": "Добавяне/редактиране на изображение", - "HeaderAddUser": "+ Потребител", "HeaderAdditionalParts": "Допълнителни части", "HeaderAdmin": "Администриране", "HeaderAlbumArtists": "Изпълнители на албуми", - "HeaderAlbums": "Албуми", "HeaderApiKey": "ППИ ключ", "HeaderApiKeys": "ППИ ключове", "HeaderApp": "Програма", "HeaderAudioSettings": "Настройки на звука", - "HeaderAutomaticUpdates": "Автоматични обновления", - "HeaderBooks": "Книги", "HeaderCastAndCrew": "Артисти и изпълнители", - "HeaderCastCrew": "Артисти и изпълнители", - "HeaderChannels": "Канали", "HeaderCodecProfile": "Профил на кодека", "HeaderContainerProfile": "Профил на контейнера", "HeaderContinueListening": "Продължаване на слушането", @@ -174,20 +142,15 @@ "HeaderDeviceAccess": "Достъп на устройствата", "HeaderDevices": "Устройства", "HeaderDirectPlayProfile": "Direct Play профил", - "HeaderDisplay": "Показване", "HeaderDownloadSync": "Изтегляне и синхронизиране", "HeaderEasyPinCode": "Лесен ПИН код", "HeaderEditImages": "Редактиране на изображенията", "HeaderEnabledFields": "Включени полета", "HeaderError": "Грешка", "HeaderFeatureAccess": "Достъп до функции", - "HeaderFeatures": "Функции", "HeaderFetchImages": "Свали изображения:", - "HeaderFilters": "Филтри", "HeaderForKids": "Детски", - "HeaderForgotPassword": "Забравена парола", "HeaderFrequentlyPlayed": "Често пускани", - "HeaderGenres": "Жанрове", "HeaderGuideProviders": "Доставчици на справочници", "HeaderIdentification": "Идентификация", "HeaderImageSettings": "Настройки на картината", @@ -203,14 +166,10 @@ "HeaderLibraryFolders": "Папки на библиотеката", "HeaderLibraryOrder": "Подредба на библиотеката", "HeaderLibrarySettings": "Настройки на библиотеката", - "HeaderLiveTV": "Телевизия на живо", - "HeaderLiveTv": "Телевизия на живо", "HeaderMedia": "Медия", "HeaderMediaFolders": "Медийни папки", - "HeaderMediaInfo": "Сведения", "HeaderMetadataSettings": "Настройки на метаданните", "HeaderMoreLikeThis": "Подобни", - "HeaderMovies": "Филми", "HeaderMusicQuality": "Качество на музиката", "HeaderMusicVideos": "Музикални клипове", "HeaderMyDevice": "Моето устройство", @@ -219,19 +178,17 @@ "HeaderNewApiKey": "Нов ППИ ключ", "HeaderNewDevices": "Нови устройства", "HeaderNextEpisodePlayingInValue": "Следващият епизод ще се пусне след {0}", - "HeaderNextUp": "Следва", "HeaderOnNow": "На живо сега", "HeaderParentalRatings": "Родителска оценка", "HeaderPassword": "Парола", "HeaderPaths": "Пътища", - "HeaderPeople": "Хора", "HeaderPlayAll": "Пускане на всичко", "HeaderPlayOn": "Пускане на", "HeaderPleaseSignIn": "Моля, влезте", "HeaderPreferredMetadataLanguage": "Предпочитан език на метаданните", "HeaderProfile": "Профил", "HeaderProfileInformation": "Профил", - "HeaderProfileServerSettingsHelp": "Тези величини определят как Jellyfin сървърът ще се представя на устройствата.", + "HeaderProfileServerSettingsHelp": "Тези величини определят как Джелифин сървърът ще се представя на устройствата.", "HeaderRecentlyPlayed": "Скоро пускани", "HeaderRemoteControl": "Отдалечен контрол", "HeaderRemoveMediaFolder": "Премахване на медийна папка", @@ -240,12 +197,10 @@ "HeaderRevisionHistory": "Списък с промени", "HeaderRunningTasks": "Изпълняващи се задачи", "HeaderScenes": "Сцени", - "HeaderSchedule": "Разписание", "HeaderSeasons": "Сезони", "HeaderSecondsValue": "{0} секунди", "HeaderSelectPath": "Изберете път", "HeaderSendMessage": "Изпращане на съобщение", - "HeaderSeries": "Сериал", "HeaderServerSettings": "Настройки на сървъра", "HeaderSettings": "Настройки", "HeaderSetupLibrary": "Настройте своите медийни библиотеки", @@ -256,7 +211,6 @@ "HeaderStatus": "Състояние", "HeaderSubtitleAppearance": "Облик на субтитрите", "HeaderSystemDlnaProfiles": "Системни профили", - "HeaderTags": "Етикети", "HeaderTaskTriggers": "Спусъци на задачи", "HeaderTracks": "Песни", "HeaderTranscodingProfile": "Профил на транскодинг", @@ -267,7 +221,6 @@ "HeaderVideoQuality": "Качество на видеото", "HeaderVideos": "Видеоклипове", "HeaderYears": "Години", - "HeadersFolders": "Папки", "Help": "Помощ", "Hide": "Скриване", "HideWatchedContentFromLatestMedia": "Скриване на гледаното съдържание от последната медия", @@ -275,7 +228,7 @@ "Horizontal": "Водоравно", "Identify": "Разпознаване", "Images": "Изображения", - "ImportMissingEpisodesHelp": "Ако е активирано, информация за липсващи епизоди ще бъде добавена в базата данни на Jellyfin и ще бъде показвана заедно със сезони и серии. Това може да доведе до значително по-дълго сканиране на библиотеката.", + "ImportMissingEpisodesHelp": "Ако е активирано, информация за липсващи епизоди ще бъде добавена в базата данни на Джелифин и ще бъде показвана заедно със сезони и серии. Това може да доведе до значително по-дълго сканиране на библиотеката.", "InstallingPackage": "Инсталиране на {0} на версия {1})", "InstantMix": "Пускане на подобни", "Label3DFormat": "Триизмерен формат:", @@ -285,11 +238,9 @@ "LabelAlbumArtMaxWidth": "Максимална ширина на албумното изкуство:", "LabelAlbumArtPN": "ПН на албумното изкуство:", "LabelAlbumArtists": "Изпълнители на албума:", - "LabelAllowServerAutoRestart": "Разрешаване на сървъра автоматично да се пуска повторно за прилагане на обновления", - "LabelAllowServerAutoRestartHelp": "Сървърът ще се пуска наново само през ненатоварено време, когато няма активни потребители.", "LabelAppName": "Име", "LabelArtists": "Изпълнители:", - "LabelArtistsHelp": "Отделете няколко с ;", + "LabelArtistsHelp": "Отделете различните изпълнители с \";\".", "LabelAudioLanguagePreference": "Предпочитан език на звука:", "LabelCachePath": "Път към кеша:", "LabelCachePathHelp": "Определете място за сървърните кеш файлове, като изображения. Оставете празно, за да използвате мястото по подразбиране.", @@ -305,16 +256,13 @@ "LabelCustomCertificatePathHelp": "Път до файл с шифровъчен стандарт №12 (PKCS #12), съдържащ сертификат и частен ключ за поддръжка на протокол TLS на собствен домейн.", "LabelCustomCss": "CSS по избор:", "LabelCustomCssHelp": "Добавете собствен стил към уеб-интерфейса.", - "LabelCustomDeviceDisplayName": "Показвано име:", "LabelCustomRating": "Оценка по избор:", - "LabelDashboardTheme": "Облик на сървърното табло:", "LabelDateAdded": "Дата на добавяне:", "LabelDateTimeLocale": "Местоположение за дата и час:", "LabelDay": "Ден:", "LabelDeviceDescription": "Описание на устройството", "LabelDisplayLanguage": "Език на показване:", - "LabelDisplayLanguageHelp": "Превеждането на Емби е текущ проект.", - "LabelDisplayMissingEpisodesWithinSeasons": "Показване на липсващите епизоди в сезоните", + "LabelDisplayLanguageHelp": "Превеждането на Джелифин е текущ проект.", "LabelDisplayMode": "Режим на показване:", "LabelDisplayName": "Показвано име:", "LabelDisplayOrder": "Ред на показване:", @@ -326,15 +274,15 @@ "LabelDropShadow": "Сянка:", "LabelEmbedAlbumArtDidl": "Вградждане на албумно изкуство в Didl", "LabelEnableAutomaticPortMap": "Автоматично съответстване на портовете", - "LabelEnableDlnaClientDiscoveryInterval": "Интервал за откриване на клиенти (секунди)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Определя времетраенето в секунди между SSDP търсения направени от Jellyfin.", + "LabelEnableDlnaClientDiscoveryInterval": "Интервал за откриване на клиенти", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Определя времетраенето в секунди между SSDP търсения направени от Джелифин.", "LabelEnableDlnaDebugLogging": "Включване на журналите за грешки на ДЛНА", "LabelEnableDlnaPlayTo": "Включване на функцията \"възпроизвеждане с ДЛНА\"", "LabelEnableDlnaPlayToHelp": "Засичане на устройства в мрежата ви и предлагане на възможност за дистанционно управление.", "LabelEnableDlnaServer": "Включване на ДЛНА-сървър", "LabelEnableDlnaServerHelp": "Разрешава на UPnP устройства в мрежата да разглеждат и пускат Джелифин съдържание.", "LabelEnableRealtimeMonitor": "Активиране на наблюдение в реално време", - "LabelEnableRealtimeMonitorHelp": "Промените ще бъдат обработени веднага, на поддържани файлови системи.", + "LabelEnableRealtimeMonitorHelp": "Промените във файловете ще бъдат обработени веднага, на поддържаните файлови системи.", "LabelEpisodeNumber": "Номер на епизода:", "LabelEvent": "Събитие:", "LabelEveryXMinutes": "На всеки:", @@ -347,14 +295,14 @@ "LabelHomeNetworkQuality": "Качество на домашната мрежа:", "LabelHomeScreenSectionValue": "Раздел {0} на началния екран:", "LabelHttpsPort": "Локален HTTPS порт:", - "LabelHttpsPortHelp": "TCP портът на който HTTPS сървърът на Джелифин трябва да се закачи.", + "LabelHttpsPortHelp": "TCP порта на HTTPS сървъра.", "LabelImageType": "Вид изображение:", "LabelInternetQuality": "Качество на интернетната връзка:", "LabelKodiMetadataDateFormat": "Формат на датата на издаване:", "LabelKodiMetadataUserHelp": "Разрешете това, за да запазите данните за гледанията във файлове Nfo за употреба от други програми.", "LabelLanguage": "Език:", "LabelLocalHttpServerPortNumber": "Локален HTTP порт:", - "LabelLocalHttpServerPortNumberHelp": "TCP портът на който HTTP сървърът на Джелифин трябва да се закачи.", + "LabelLocalHttpServerPortNumberHelp": "TCP порта на HTTP сървъра.", "LabelLogs": "Журнали:", "LabelManufacturer": "Производител:", "LabelManufacturerUrl": "Адрес на производителя", @@ -376,15 +324,14 @@ "LabelModelName": "Модел", "LabelModelNumber": "Номер на модела", "LabelModelUrl": "Адрес на модела", - "LabelMovieRecordingPath": "Път за запис на филмите (по избор):", + "LabelMovieRecordingPath": "Път за запис на филмите:", "LabelName": "Име:", "LabelNewName": "Ново име:", "LabelNewPassword": "Нова парола:", "LabelNewPasswordConfirm": "Нова парола (отново):", - "LabelNext": "Следващ", "LabelNumberOfGuideDays": "Брой дни за които да се свали програма:", "LabelNumberOfGuideDaysHelp": "Изтеглянето на програма заповече дни дава възможност да планирате по-нататъшните записи предварително, но и отнема повече време, за да се изтегли. Автомат ще избере въз основа на броя на каналите.", - "LabelOptionalNetworkPath": "Споделена мрежова папка (незадължително):", + "LabelOptionalNetworkPath": "Споделена мрежова папка:", "LabelOriginalAspectRatio": "Оригинално съотношение:", "LabelOriginalTitle": "Оригинално заглавие:", "LabelOverview": "Обобщение:", @@ -397,9 +344,7 @@ "LabelPlayDefaultAudioTrack": "Да се пуска първоначалната звукова пътечка независимо от езика", "LabelPlaylist": "Списък:", "LabelPreferredDisplayLanguage": "Предпочитан език на показване:", - "LabelPreferredDisplayLanguageHelp": "Превеждането на Емби е текущ проект.", "LabelPreferredSubtitleLanguage": "Предпочитан език на субтитрите:", - "LabelPrevious": "Предишен", "LabelProfileAudioCodecs": "Звукови кодеци:", "LabelProfileCodecs": "Кодеци:", "LabelProfileCodecsHelp": "Разделени със запетая. Може да бъде оставено празно, за да се отнася за всички кодеци.", @@ -411,7 +356,6 @@ "LabelPublicHttpPortHelp": "Публичният порт, който да бъде съпоставен с локалния HTTP порт.", "LabelPublicHttpsPort": "Публичен HTTPS порт:", "LabelPublicHttpsPortHelp": "Публичният порт, който да бъде съпоставен с локалния HTTPS порт.", - "LabelReadHowYouCanContribute": "Научете как можете да допринесете.", "LabelRecordingPath": "Път за запис по подразбиране:", "LabelReleaseDate": "Дата на издаване:", "LabelRemoteClientBitrateLimit": "Ограничение на интернетното излъчване (мбит/сек):", @@ -421,7 +365,7 @@ "LabelSelectUsers": "Избери потребители:", "LabelSelectVersionToInstall": "Изберете версия за инсталиране:", "LabelSerialNumber": "Сериен номер", - "LabelSeriesRecordingPath": "Път за запис на сериалите (по избор):", + "LabelSeriesRecordingPath": "Път за запис на сериалите:", "LabelSkipIfAudioTrackPresent": "Да се пропусне, ако звуковата пътечка по подразбиране съвпада с езика", "LabelSkipIfGraphicalSubsPresent": "Да се пропусне, ако файлът съдържа вградени субтитри", "LabelSortBy": "Подреждане по:", @@ -432,7 +376,6 @@ "LabelStatus": "Състояние:", "LabelStopWhenPossible": "Спирай, когато е възможно:", "LabelSubtitlePlaybackMode": "Режим на субтитрите:", - "LabelSubtitles": "Субтитри", "LabelSupportedMediaTypes": "Поддържани типове медия:", "LabelTag": "Етикет:", "LabelTextColor": "Цвят на текста:", @@ -441,9 +384,7 @@ "LabelTime": "Време:", "LabelTimeLimitHours": "Времево ограничение (часове):", "LabelTitle": "Заглавие:", - "LabelTranscodingAudioCodec": "Звуков кодек:", "LabelTranscodingTempPathHelp": "Посочете персонализиран път за файлове,които е необходимо да бъдат транскодирани и доставени на клиентите. Оставете празно ,за да се използва мястото по подразбиране.", - "LabelTranscodingVideoCodec": "Видеокодек:", "LabelTriggerType": "Тип на спусъка:", "LabelType": "Вид:", "LabelTypeText": "Текст", @@ -452,13 +393,11 @@ "LabelUsername": "Потребителско име:", "LabelVersion": "Версия:", "LabelYear": "Година:", - "LabelYourFirstName": "Първото ви име:", "LabelYoureDone": "Готови сте!", "Large": "Голям", "LatestFromLibrary": "Последни {0}", "LibraryAccessHelp": "Изберете библиотеките, които да споделите с потребителя. Администраторите ще могат да редактират всички папки, използвайки управлението на метаданни.", "Like": "Харесване", - "LinksValue": "Препратки: {0}", "List": "Списък", "Live": "На живо", "LiveTV": "Телевизия на живо", @@ -482,13 +421,12 @@ "Menu": "Меню", "MessageAlreadyInstalled": "Версията вече е инсталирана.", "MessageAreYouSureYouWishToRemoveMediaFolder": "Сигурни ли сте, че искате да премахнете медийната папка?", - "MessageConfirmRestart": "Наистина ли искате да пуснете сървъра наново?", + "MessageConfirmRestart": "Наистина ли искате да рестартирате Джелифин?", "MessageConfirmShutdown": "Наистина ли искате да загасите сървъра?", "MessageNoAvailablePlugins": "Няма налични приставки.", "MessageNoPluginsInstalled": "Нямате инсталирани приставки.", "MessageNothingHere": "Тук няма нищо.", "MessagePleaseEnsureInternetMetadata": "Моля, уверете се че свалянето на метаданни от интернет е разрешено.", - "MessageSettingsSaved": "Настройките са запазени.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Следните местоположения ще бъдат премахнати от библиотеката ви:", "MessageYouHaveVersionInstalled": "В момента имате инсталирана версия {0}.", "MetadataManager": "Управление на метаданните", @@ -508,9 +446,8 @@ "NewEpisodes": "Нови епизоди", "NewEpisodesOnly": "Само нови епизоди", "News": "Новини", - "NoNextUpItemsMessage": "Нищо не е намерено. Започнете да гледате вашите предавания!", + "MessageNoNextUpItems": "Нищо не е намерено. Започнете да гледате вашите предавания!", "NoSubtitleSearchResultsFound": "Няма намерени резултати.", - "NoSubtitles": "Без", "None": "Нищо", "Normal": "Нормален", "NumLocationsValue": "{0} папки", @@ -531,7 +468,6 @@ "OptionArtist": "Изпълнител", "OptionAscending": "Възходящо", "OptionAuto": "Автоматично", - "OptionAutomatic": "Автоматично", "OptionBlockBooks": "Книги", "OptionBlockMovies": "Филми", "OptionBlockTvShows": "Телевизионни сериали", @@ -544,7 +480,7 @@ "OptionDatePlayed": "Дата на пускане", "OptionDescending": "Низходящо", "OptionDisableUser": "Дезактивирайте този потребител", - "OptionDisableUserHelp": "Ако е дезактивиран, сървърът няма да позволи каквито и да било връзки от този потребител. Съществуващите връзки ще бъдат внезапно прекратени.", + "OptionDisableUserHelp": "Сървърът няма да позволи каквито и да било връзки от този потребител. Съществуващите връзки ще бъдат внезапно прекратени.", "OptionDislikes": "Нехаресвания", "OptionDisplayFolderView": "Показване на изглед в папки", "OptionDownloadArtImage": "Картина", @@ -565,7 +501,6 @@ "OptionEveryday": "Всеки ден", "OptionExternallyDownloaded": "Външно сваляне", "OptionFavorite": "Любими", - "OptionFriday": "Петък", "OptionHasSpecialFeatures": "Специални функции", "OptionHasSubtitles": "Субтитри", "OptionHasThemeSong": "Фонова песен", @@ -579,11 +514,9 @@ "OptionIsSD": "СК", "OptionLikes": "Харесвания", "OptionMissingEpisode": "Липсващи епизоди", - "OptionMonday": "Понеделник", "OptionNameSort": "Име", "OptionNew": "Нов…", "OptionNone": "Нищо", - "OptionOnAppStartup": "Като се стартира приложението", "OptionOnInterval": "През интервал", "OptionParentalRating": "Родителска оценка", "OptionPlainStorageFolders": "Показвай всички папки като папки за обикновено съхранение", @@ -599,21 +532,16 @@ "OptionRequirePerfectSubtitleMatch": "Да се изтеглят само субтитри, които пасват идеално на файловете ми", "OptionResumable": "Възобновляемост", "OptionRuntime": "Времетраене", - "OptionSaturday": "Събота", "OptionSpecialEpisode": "Специални", - "OptionSunday": "Неделя", - "OptionThursday": "Четвъртък", "OptionTrackName": "Име на песента", - "OptionTuesday": "Вторник", "OptionUnairedEpisode": "Неизлъчени епизоди", "OptionUnplayed": "Непускано", "OptionWakeFromSleep": "Събуждане от сън", - "OptionWednesday": "Сряда", "OptionWeekly": "Ежеседмично", "OriginalAirDateValue": "Дата на първоначално излъчване: {0}", "Overview": "Обобщение", "ParentalRating": "Родителска оценка", - "PasswordResetHeader": "Зануляване на паролата", + "HeaderResetPassword": "Зануляване на паролата", "People": "Хора", "Photos": "Снимки", "PictureInPicture": "Картина в картина", @@ -622,7 +550,7 @@ "PlayNextEpisodeAutomatically": "Автоматично пускане на следващия епизод", "Played": "Пускано", "Playlists": "Списъци", - "PleaseRestartServerName": "Моля, пуснете сървъра отново - {0}.", + "PleaseRestartServerName": "Моля, пуснете Джелифин отново - {0}.", "PreferEmbeddedTitlesOverFileNames": "Да се предпочитат вградените заглавия пред имената на файлове", "Premiere": "Премиера", "Premieres": "Премиери", @@ -657,9 +585,9 @@ "SearchForSubtitles": "Търсене на субтитри", "SendMessage": "Изпращане на съобщение", "SeriesYearToPresent": "{0} - Настояще", - "ServerNameIsRestarting": "Сървърно издание Емби - {0} се пуска повторно.", - "ServerNameIsShuttingDown": "Сървърно издание Емби - {0} се изключва.", - "ServerRestartNeededAfterPluginInstall": "След инсталирането на приставка, сървърът ще трябва да бъде пуснат наново.", + "ServerNameIsRestarting": "Сървърът - {0} се пуска повторно.", + "ServerNameIsShuttingDown": "Сървърът във - {0} се изключва.", + "ServerRestartNeededAfterPluginInstall": "След инсталирането на приставка, Джелифин ще трябва да бъде пуснат наново.", "ServerUpdateNeeded": "Сървърът трябва да бъде обновен. Моля, посетете {0}, за да свалите последната версия.", "Settings": "Настройки", "SettingsSaved": "Настройките са запазени.", @@ -683,58 +611,29 @@ "TV": "Телевизор", "TabAccess": "Достъп", "TabAdvanced": "Допълнителни", - "TabAlbumArtists": "Изпълнители на албуми", - "TabAlbums": "Албуми", - "TabArtists": "Изпълнители", "TabCatalog": "Каталог", - "TabChannels": "Канали", "TabCodecs": "Кодеци", - "TabCollections": "Колекции", "TabContainers": "Контейнери", "TabDashboard": "Табло", - "TabDevices": "Устройства", "TabDirectPlay": "Директно пускане", - "TabDisplay": "Показване", - "TabEpisodes": "Епизоди", - "TabFavorites": "Любими", - "TabGenres": "Жанрове", - "TabGuide": "Ръководство", - "TabInfo": "Информация", "TabLatest": "Последни", - "TabLiveTV": "Телевизия на живо", "TabLogs": "Журнали", - "TabMetadata": "Метаданни", - "TabMovies": "Филми", "TabMusic": "Музика", - "TabMusicVideos": "Музикални клипове", "TabMyPlugins": "Моите приставки", "TabNetworks": "Мрежи", "TabNfoSettings": "Формат за метаданни NFO", "TabNotifications": "Известия", "TabOther": "Други", "TabParentalControl": "Родителски контрол", - "TabPassword": "Парола", - "TabPlayback": "Възпроизвеждане", - "TabPlaylist": "Списък", - "TabPlaylists": "Списъци", "TabPlugins": "Приставки", "TabProfile": "Профил", "TabProfiles": "Профили", - "TabRecordings": "Записи", "TabResponses": "Отговори", - "TabResumeSettings": "Възобнови", "TabScheduledTasks": "Планирани задачи", - "TabSeries": "Сериали", "TabServer": "Сървър", "TabSettings": "Настройки", - "TabShows": "Предавания", - "TabSongs": "Песни", "TabStreaming": "Излъчване", - "TabSuggestions": "Предложения", - "TabTrailers": "Трейлъри", - "TabTranscoding": "Прекодиране", "TabUpcoming": "Предстоящи", - "TabUsers": "Потребители", "Tags": "Етикети", "TagsValue": "Етикети: {0}", "TellUsAboutYourself": "Разкажете за себе си", @@ -748,7 +647,7 @@ "TrackCount": "{0} песни", "Trailers": "Трейлъри", "Tuesday": "Вторник", - "UninstallPluginHeader": "Деинсталиране на приставката", + "HeaderUninstallPlugin": "Деинсталиране на приставката", "Unmute": "Без заглушаване", "Unplayed": "Непускано", "Upload": "Качване", @@ -777,7 +676,7 @@ "ViewAlbum": "Преглед на албума", "Watched": "Изгледано", "Wednesday": "Сряда", - "WelcomeToProject": "Добре дошли в Емби!", + "WelcomeToProject": "Добре дошли в Джелифин!", "WizardCompleted": "Това е всичко, от което се нуждаем за момента. Джелифин започва да събира данни за библиотеката ви. Разгледайте някои от нашите приложения, после натиснете Готово, за да видите таблото на сървъра.", "Writer": "Писател", "AllowMediaConversion": "Разрешаване на медийни преобразувания", @@ -817,20 +716,14 @@ "ReplaceExistingImages": "Заменяне на текущите изображения", "Channels": "Канали", "Categories": "Категории", - "ButtonViewWebsite": "Преглед на сайта", - "ButtonUp": "Нагоре", "ButtonTrailer": "Предварителен откъс", "ButtonStart": "Пускане", "ButtonSelectView": "Изберете изглед", "ButtonSelectServer": "Изберете сървър", - "ButtonRepeat": "Повтаряне", "ButtonNetwork": "Мрежа", "ButtonFullscreen": "На цял екран", - "ButtonDown": "Надолу", - "ButtonConnect": "Свързване", "AllowOnTheFlySubtitleExtraction": "Позволява моментално извличане на поднадписи", "AllowHWTranscodingHelp": "Позволява на тунера да прекодира моментално. Това може да помогне за редуциране на прекодирането от сървъра.", - "AddItemToCollectionHelp": "Добавяне към колекция чрез търсенето им и използване на дясно-щракване с мишката или контекстното меню.", "Absolute": "Aбсолютен", "LabelLanNetworks": "Локални мрежи:", "LabelKodiMetadataSaveImagePathsHelp": "Това е препоръчително, ако наименованието на изображенията не са съобразени с изискванията на Kodi.", @@ -841,9 +734,9 @@ "OptionResElement": "рес. елемент", "ButtonChangeServer": "Смяна на сървър", "ButtonAddImage": "Добавяне на изображение", - "BrowsePluginCatalogMessage": "За да видите наличните добавки, прегледайте каталога с добавките.", + "MessageBrowsePluginCatalog": "За да видите наличните добавки, прегледайте каталога с добавките.", "Box": "Кутия", - "AlwaysPlaySubtitlesHelp": "Поднадписите, съвпадащи с езика от настройките, ще се зареждат, независимо от езика на аудио то.", + "AlwaysPlaySubtitlesHelp": "Субтитрите, съвпадащи с езика от настройките, ще се зареждат, независимо от езика на аудиото.", "BookLibraryHelp": "Поддържат се аудио книги такива съдържащи текст. Проверете ръководството за наименуване {1} на книги {0}.", "Blacklist": "Списък с блокирани", "BirthLocation": "Месторождение", @@ -858,7 +751,7 @@ "AnyLanguage": "Който и да е език", "AlwaysPlaySubtitles": "Постоянно изпълнение", "AllowRemoteAccessHelp": "Ако не е маркирано, всеки отдалечен достъп ще бъде блокиран.", - "AllowRemoteAccess": "Позволяване на отдалечен достъп до този Jellyfin сървър.", + "AllowRemoteAccess": "Позволяване на отдалечен достъп до този Джелифин сървър.", "AllowFfmpegThrottling": "Подтискане на прекодирането", "AllowMediaConversionHelp": "Даване или отнемане на права за функциите за конвертиране на медия.", "AlbumArtist": "Изпълнител", @@ -874,7 +767,7 @@ "ButtonEditOtherUserPreferences": "Редакция на потребителския профил, изображение и лични предпочитания.", "BoxRear": "Комплект (стар)", "BoxSet": "Комплект", - "AuthProviderHelp": "Избор на доставчик на услуга за Автентификация, която ще се използва за автентификация на потребителската парола.", + "AuthProviderHelp": "Избор на доставчик на услуга за автентификация, която ще се използва за автентификация на потребителската парола.", "AllowedRemoteAddressesHelp": "Списък с IP адреси или IP/маска записи, разделени със запетая, които ще имат отдалечен достъп. Ако полето не е попълнено всички адреси ще имат отдалечен достъп.", "BurnSubtitlesHelp": "Определя дали сървърът трябва да записва субтитри във видеофайлове при прекодиране. Избягването на това значително ще подобри производителността. Изберете Auto, за да запишете формати, базирани на изображения (VOBSUB, PGS, SUB, IDX) и някои ASS или SSA субтитри.", "AllowFfmpegThrottlingHelp": "Когато прекодирането или запазването на видео стигне достатъчно далеч напред от текущата позиция за възпроизвеждане, поставете на пауза процеса, така ще се изразходват по-малко ресурси. Това е най-полезно, когато се гледа, без да се търси често из видеото. Изключете това, ако имате проблеми с възпроизвеждането.", @@ -882,16 +775,15 @@ "CinemaModeConfigurationHelp": "Режимът на кино носи театрално изживяване направо във вашата всекидневна с възможност за пускане на трейлъри и персонализирани интродукции преди основния филм.", "ChangingMetadataImageSettingsNewContent": "Промените в настройките за изтегляне на метаданни или изображения ще се прилагат само за ново съдържание, добавено към вашата библиотека. За да приложите промените към съществуващите заглавия, ще трябва да обновите метаданните им ръчно.", "DefaultMetadataLangaugeDescription": "Това са настройки по подразбиране и могат да се променят на база библиотека.", - "DefaultErrorMessage": "Възникна грешка при изпълнение на заявката. Моля опитайте по-късно.", + "ErrorDefault": "Възникна грешка при изпълнение на заявката. Моля опитайте по-късно.", "CustomDlnaProfilesHelp": "Създаване на персонализиран профил за целево устройство или заменяне на системния профил.", "CopyStreamURL": "Копиране URL на стрийма", - "CopyStreamURLError": "Възникна грешка при копиране на URL.", "CopyStreamURLSuccess": "URL се копира успешно.", "Connect": "Свързване", - "ConfirmEndPlayerSession": "Искате ли да изключите Jellyfin на {0}?", + "ConfirmEndPlayerSession": "Искате ли да изключите Джелифин на {0}?", "ConfirmDeletion": "Потвърждаване на изтриването", "ConfirmDeleteItem": "Изтриването на елемента ще го премахне едновременно от файловата система и библиотеката. Сигурни ли сте, че искате да продължите?", - "ConfigureDateAdded": "Конфигурацията на добавянето на датата се определя в панела на Jellyfin сървъра в секцията за настройка на библиотека", + "ConfigureDateAdded": "Конфигурацията на добавянето на датата се определя в панела на Джелифин сървъра в секцията за настройка на библиотека", "ConfirmDeleteItems": "Изтриването на елементите ще ги премахне едновременно от файловата система и библиотеката. Сигурни ли сте, че искате да продължите?", "ColorTransfer": "Предаване на цвета", "ColorPrimaries": "Основни цветове", @@ -900,10 +792,9 @@ "DeleteImageConfirmation": "Сигурнили сте че искате да премахнете това Изображение?", "DeleteImage": "Премахване на Исображение", "ButtonTogglePlaylist": "Списък с изпълнения", - "ButtonToggleContextMenu": "Повече", "ErrorSavingTvProvider": "Има проблем със запазването на ТВ доставчика.Убедете се ,че е достъпен и опитайте отново.", "ErrorPleaseSelectLineup": "Моля изберете списък и опитайте отново.Ако няма налични списъци се убедете ,че името,паролата и пощенския код са точни.", - "ErrorMessageStartHourGreaterThanEnd": "Времето за край трябва да бъде по-голямо от началното време.", + "ErrorStartHourGreaterThanEnd": "Времето за край трябва да бъде по-голямо от началното време.", "ErrorGettingTvLineups": "Има проблем при опита да бъдат свалени списъци с ТВ.Убедете се ,че информацията е правилна и опитайте отново.", "ErrorDeletingItem": "Има проблем при опита да бъде изтрит файла от сървъра.Убедете се ,че сървъра има право да трие папки и опитайте отново.", "ErrorAddingXmlTvFile": "Има проблем при достъпа на XMLTV файла.Уверете се ,че е наличен и пробвайте отново.", @@ -913,7 +804,6 @@ "EnableDetailsBannerHelp": "Покажи картинка с банер в горната част на страницата с детайли.", "EnableDetailsBanner": "Банер с подробности", "EnableThemeVideosHelp": "Пускай тематични видеа на заден план ,докато се разглежда библиотеката.", - "EnableThemeVideos": "Тематични видеа", "EnableThemeSongsHelp": "Пускай тематична музика ,докато се разглежда библиотеката.", "EnableStreamLoopingHelp": "Включи това ,ако поточното видео се предава на кратки интервали и е необходимо да се изпращат заявки постоянно.Включването на тази опция без нужда може да породи проблеми.", "EnableStreamLooping": "Автоматично повторение на поточни видеа", @@ -951,7 +841,6 @@ "HeaderFavoriteMovies": "Любими филми", "HeaderFavoriteBooks": "Любими книги", "HeaderExternalIds": "Външни идентификатори:", - "HeaderEpisodes": "Епизоди", "HeaderEnabledFieldsHelp": "Махни отметката ,за да го заключиш и да предотвратиш неговата промяна.", "HeaderDVR": "DVR (Цифрово записващо устройство)", "HeaderDirectPlayProfileHelp": "Добави профили за директно възпроизвеждане ,за да се укаже кои формати може да възпроизвежда устройството.", @@ -1015,7 +904,6 @@ "HeaderSubtitleDownloads": "Сваляне на субтитри", "HeaderStopRecording": "Спри запис", "HeaderSpecialEpisodeInfo": "Информация за специалните епизоди", - "HeaderShutdown": "Изключване", "HeaderServerAddressSettings": "Настройки за адреса на сървъра", "HeaderSeriesStatus": "Състояние на сериала", "HeaderSeriesOptions": "Настройки на сериала", @@ -1045,14 +933,12 @@ "HeaderKodiMetadataHelp": "За да включиш или изключиш използването на NFO метаданните влез в настройките за библиотеки на сървъра и намери секцията за съхранение.", "HeaderKeepSeries": "Запази сериалите", "HeaderKeepRecording": "Запази записите", - "HeaderItems": "Елементи", "HeaderImageOptions": "Настройки на картини", "HeaderIdentifyItemHelp": "Въведете един или повече критерии за търсене.Премахнете ,ако искате да увеличите резултатите при търсенето.", "HeaderIdentificationHeader": "Идентификационен хедър", "HeaderIdentificationCriteriaHelp": "Въведете пони един критерии.", "HeaderHttpsSettings": "HTTPS настройки", "HeaderHttpHeaders": "HTTP Хедъри", - "HeaderHome": "Главна", "HeaderFetcherSettings": "Настройки на програмата за изтегляне", "HeaderFavoritePlaylists": "Любими списъци", "LabelDeathDate": "Дата на смърт:", @@ -1065,11 +951,11 @@ "LabelBurnSubtitles": "Вграждане на субтитри:", "LabelBlockContentWithTags": "Блокирай елементи с етикети:", "LabelBlastMessageIntervalHelp": "Определя продължителността в секунди при \"бомбардирането\" с активни съобщения.", - "LabelBlastMessageInterval": "Интервал на активните съобщения (в секунди)", + "LabelBlastMessageInterval": "Интервал на активните съобщения", "LabelBitrate": "Битрейт:", "LabelBirthYear": "Година на раждане:", "LabelBirthDate": "Дата на раждане:", - "LabelBindToLocalNetworkAddressHelp": "Не задължително.Замени локалния IP адрес за \"закачане\" към http сървъра.Ако полето е празно сървъра ще \"закачи\" всички налични адреси.Промяната на тази стойност изисква рестарт на сървъра.", + "LabelBindToLocalNetworkAddressHelp": "Замени локалния IP адрес за \"закачане\" към http сървъра.Ако полето е празно сървъра ще \"закачи\" всички налични адреси.Промяната на тази стойност изисква рестарт на сървъра.", "LabelBindToLocalNetworkAddress": "\"Закачи\" към локален мрежов адрес:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Автоматично обновявай метаданните от Интернет:", "LabelAuthProvider": "Доставчик за идентификация:", @@ -1078,12 +964,10 @@ "LabelAudioChannels": "Аудио канали:", "LabelAudioBitrate": "Скорост на предаване на аудиото:", "LabelAudioBitDepth": "Битова дълбочина на аудиото:", - "LabelAudio": "Аудио", "LabelAppNameExample": "Примерно: Sickbeard, Sonarr", "LabelAllowedRemoteAddressesMode": "Режим на филтъра за външни ИП адреси:", "LabelAllowedRemoteAddresses": "Филтър за външни ИП адреси:", "LabelAllowHWTranscoding": "Разреши хардуерно транскодиране", - "LabelAll": "Всички", "LabelAlbumArtMaxWidthHelp": "Максимална резолюция на обложките за албуми показани чрез upnp:albumArtURI.", "LabelAlbumArtMaxHeightHelp": "Максимална резолюция на обложките за албуми показани чрез upnp:albumArtURI.", "LabelAlbumArtMaxHeight": "Максимална височина на обложките за албуми:", @@ -1110,7 +994,7 @@ "LabelEndDate": "Крайна дата:", "LabelEnableSingleImageInDidlLimitHelp": "Някои устройства няма да го покажат правилно ,ако множество изображения са вградени в Didl.", "LabelEnableSingleImageInDidlLimit": "Ограничи до едно вградено изображение", - "LabelEnableHttpsHelp": "Позволява на сървъра да \"слуша\" на предварително зададен HTTPS порт.Необходимо е да има настроен валиден сертификат ,за да работи правилно настройката.", + "LabelEnableHttpsHelp": "Позволява на сървъра да \"слуша\" на предварително зададен HTTPS порт.Необходимо е да има валиден сертификат ,за да работи правилно настройката.", "LabelEnableHttps": "Включи HTTPS", "LabelEnableHardwareDecodingFor": "Включи хардуерно декодиране за:", "LabelEnableDlnaDebugLoggingHelp": "Създава големи журнали файлове и е редно да се използва само с цел отстраняване на проблеми.", @@ -1140,7 +1024,6 @@ "LabelNumber": "Номер:", "LabelNotificationEnabled": "Включване на известие", "LabelNewsCategories": "Категории новини:", - "LabelNightly": "Тестов", "LabelStable": "Стабилна", "LabelChromecastVersion": "Версия на Chromecast", "LabelMusicStreamingTranscodingBitrateHelp": "Посочете максимален битрейт при поточно предаване на музика.", @@ -1197,8 +1080,8 @@ "LabelProtocolInfo": "Информация за протокола:", "LabelPostProcessorArgumentsHelp": "Използвай {path},като път за записване на файла.", "LabelPostProcessorArguments": "Аргументи на командния ред след обработка:", - "EnableBlurhashHelp": "Изображенията, които все още се зареждат, ще се показват чрез функцията\"размито запълване\"", - "EnableBlurhash": "Активиране на функцията \"размито запълване\" за изображения", + "EnableBlurHashHelp": "Изображенията, които все още се зареждат, ще се показват чрез функцията\"размито запълване\".", + "EnableBlurHash": "Активиране на функцията \"размито запълване\" за изображения", "UnsupportedPlayback": "Джелифин не може да дешифрира съдържание, защитено с DRM, но въпреки това цялото съдържание ще бъде обработено, включително защитените заглавия. Някои файлове могат да изглеждат напълно черни поради криптиране или други неподдържани функции, например интерактивни заглавия.", "OnApplicationStartup": "При стартиране на приложението", "EveryXHours": "На всеки {0} часа", @@ -1210,7 +1093,7 @@ "LastSeen": "Последно видян {0}", "PersonRole": "като {0}", "ListPaging": "{0}-{1} от {2}", - "WriteAccessRequired": "Джелифин сървъра изисква достъп с права за запис до тази папка. Моля, осигурете достъп с права за запис и опитайте отново.", + "WriteAccessRequired": "Джелифин изисква достъп с права за запис до тази папка. Моля, осигурете достъп с права за запис и опитайте отново.", "PathNotFound": "Пътят не можа да бъде намерен. Моля, уверете се, че пътят е валиден и опитайте отново.", "Yesterday": "Вчера", "YadifBob": "YADIF х2", @@ -1223,7 +1106,6 @@ "XmlDocumentAttributeListHelp": "Тези атрибути се прилагат към коренния елемент на всеки XML отговор.", "Whitelist": "Бял списък", "ViewPlaybackInfo": "Вижте информация за възпроизвеждането", - "VideoRange": "Диапазон на видео", "ValueTimeLimitSingleHour": "Времеви лимит: 1 час", "ValueTimeLimitMultiHour": "Времеви лимит {0} часове", "ValueContainer": "Контейнер: {0}", @@ -1238,7 +1120,6 @@ "TitleHostingSettings": "Настройки за хостинг", "TitleHardwareAcceleration": "Хардуерно ускорение", "TabNetworking": "Работа в мрежа", - "TabDVR": "ДВР", "SystemDlnaProfilesHelp": "Системните профили са с достъп \"само за четене\".При промяна в системния профил ще бъде създаден нов персонализиран профил.", "SyncPlayAccessHelp": "Избери нивото на достъп ,който този потребител ще има за услугата \"Синхронизирано възпроизвеждане\".С нейна помощ може да синхронизирате възпроизвеждането с други устройства.", "SubtitleOffset": "Изместване на субтитрите", @@ -1253,7 +1134,7 @@ "LabelIdentificationFieldHelp": "Подниз или регулярен израз с различаване на главни букви.", "LabelScreensaver": "Скрийнсейвър:", "LabelScheduledTaskLastRan": "Последно пускан {0}, заел {1}.", - "LabelRuntimeMinutes": "Продължителност (в минути):", + "LabelRuntimeMinutes": "Продължителност:", "LabelRequireHttpsHelp": "Ако е отметнато сървъра ще пренасочва автоматично всички заявка от HTTP към HTTPS.Няма никакъв ефект ,ако сървъра не \"слуша\" по HTTPS.", "LabelRequireHttps": "Изисква HTTPS", "LabelRemoteClientBitrateLimitHelp": "Допълнително ограничаване битрейта на поточното предаване за всички мрежови устройства.Това е необходимо ,за да не допуснете устройствата да изискват по-висок битрейт, отколкото вашата интернет връзка позволява.Това може да доведе до повишено натоварване на процесора на вашия сървър, за щото видеата ще се прекодират \"в движение\" до по-нисък битрейт.", @@ -1262,7 +1143,6 @@ "LabelTranscodingFramerate": "Честота на кадрите при транскодиране:", "LabelTranscodes": "Транскодирания:", "LabelTranscodePath": "Път за транскодиране:", - "LabelTranscodingContainer": "Контейнер:", "LabelTrackNumber": "Номер на песен:", "LabelTextBackgroundColor": "Цвят на фона на текста:", "LabelTagline": "Ключова фраза:", @@ -1284,12 +1164,10 @@ "LabelStreamType": "Вид на потока:", "LabelStopping": "Спиране", "LabelSportsCategories": "Спортни категории:", - "LabelSoundEffects": "Звукови ефекти:", "LabelSortTitle": "Подреди по заглавие:", "LabelSonyAggregationFlags": "\"Флагове\" за статистическа обработка на Сони:", "LabelSkipIfGraphicalSubsPresentHelp": "Наличието на текстови версии на субтитрите ще доведе до по-ефективна доставка и намаляване на вероятността от транскодиране на видеото.", "LabelSkipIfAudioTrackPresentHelp": "Махнете отметката ,за да се гарантира ,че всички видеофайлове имат субтитри,независимо от езика на аудиото им.", - "LabelSkin": "Облик:", "LabelSize": "Размер:", "LabelSimultaneousConnectionLimit": "Ограничение на броя едновременни потоци:", "LabelServerName": "Име на сървъра:", @@ -1306,7 +1184,6 @@ "MessageConfirmAppExit": "Искате ли да излезете?", "MessageAreYouSureDeleteSubtitles": "Сигурни ли се ,че искате да изтриете файла със субтитри?", "MediaIsBeingConverted": "Медията е конвертирана във формат ,който е съвместим с устройството ,което ще я възпроизведе.", - "MediaInfoSoftware": "Софтуер", "MediaInfoTimestamp": "Времеви отпечатък", "MediaInfoSampleRate": "Кадрова честота", "MediaInfoRefFrames": "Ref кадри", @@ -1320,8 +1197,6 @@ "LiveBroadcasts": "Предавания на живо", "LeaveBlankToNotSetAPassword": "Можете да оставите това поле празно и да не задавате парола.", "LearnHowYouCanContribute": "Научете как можете да допринесете.", - "LaunchWebAppOnStartupHelp": "Отвори уеб клиента във браузъра по подразбиране при първото стартиране на сървъра.Това няма да се случи при използване на функцията на сървъра за рестартиране.", - "LaunchWebAppOnStartup": "Стартирай уеб интерфейса ,когато се стартира сървъра", "LanNetworksHelp": "Списък разделен със запетая съдържащ ИП адреси или записи за ИП/мрежова маски отнасящи се за мрежи ,които ще се считат за локални ,когато се налагат ограничения в честотната лента.Ако е зададено всички други ИП адреси ще се считат за принадлежащи към външни мрежи и за тях ще важат правилата за ограничения на външни ИП -та.Ако полето е празно ще се счита ,че само подмрежата на сървъра е част от локалната мрежа.", "LabelffmpegPathHelp": "Пътят към файла на приложението ffmpeg или папката, съдържаща ffmpeg.", "LabelffmpegPath": "Път към FFmpeg:", @@ -1363,7 +1238,7 @@ "MessageSyncPlayGroupDoesNotExist": "Неуспешно присъединяване към групата, защото не съществува.", "MessageSyncPlayPlaybackPermissionRequired": "Необходимо е разрешение за възпроизвеждане.", "MessageSyncPlayNoGroupsAvailable": "Няма налични групи.Пуснете нещо да се възпроизвежда.", - "MessageSyncPlayGroupWait": "{0} буферира се...", + "MessageSyncPlayGroupWait": "{0} буферира се…", "MessageSyncPlayUserLeft": "{0} е напуснал групата.", "MessageSyncPlayUserJoined": "{0} се присъедини към групата.", "MessageSyncPlayDisabled": "Услугата \"синхронизирано възпроизвеждане\" е изключена.", @@ -1383,10 +1258,8 @@ "MessageLeaveEmptyToInherit": "Оставете празни, за да наследите настройки от родителски елемент или глобалната стойност по подразбиране.", "MessageItemsAdded": "Добавени са елементи.", "MessageItemSaved": "Елементът е запазен.", - "MessageUnauthorizedUser": "Понастоящем нямате право да получите достъп до сървъра. Моля, свържете се с администратора на вашия сървър за повече информация.", "MessageInvalidUser": "Невалидно потребителско име или парола. Моля, опитайте отново.", "MessageInvalidForgotPasswordPin": "Въведен е невалиден или изтекъл пин код. Моля, опитайте отново.", - "MessageInstallPluginFromApp": "Този плъгин трябва да бъде инсталиран от приложението, в което възнамерявате да го използвате.", "MessageImageTypeNotSelected": "Изберете типът изображение от падащото меню.", "MessageImageFileTypeAllowed": "Поддържат се само файлове с разширение JPEG и PNG.", "MessageForgotPasswordInNetworkRequired": "Опитайте пак в домашната мрежа да повторите процеса по нулиране на паролата.", @@ -1413,28 +1286,25 @@ "SaveSubtitlesIntoMediaFoldersHelp": "Съхраняването на субтитрите при видео файлове ще позволи по-лесното им управление.", "SaveSubtitlesIntoMediaFolders": "Запазване на субтитрите в папките с медията", "SaveChanges": "Запазете промените", - "RunAtStartup": "Пускай при стартиране", "RepeatOne": "Повтори един път", "RepeatMode": "Режим на повторение", "RepeatEpisodes": "Повтори епизодите", "RepeatAll": "Повтори всички", - "ReleaseGroup": "Издаден от група", "RefreshQueued": "Назначено е обновяване.", "RefreshDialogHelp": "Метаданните се обновяват въз основа на настройките и интернет услугите, които са активирани от таблото за управление на сървъра.", "Recordings": "Записи", "RecordingScheduled": "Записът е насрочен.", - "RecordingPathChangeMessage": "Промяната на вашата папка за запис няма да мигрира съществуващите записи от старото местоположение към новото.Необходимо е да направите това ръчно.", + "MessageChangeRecordingPath": "Промяната на вашата папка за запис няма да мигрира съществуващите записи от старото местоположение към новото.Необходимо е да направите това ръчно.", "RecordSeries": "Запиши сериал", "RecommendationStarring": "В главните роли {0}", "RecommendationDirectedBy": "Режисьор {0}", "Rate": "Оценка", - "QueueAllFromHere": "Поред всичко от тук", "ProductionLocations": "Места на заснемане", "Previous": "Предишен", "PreferEmbeddedEpisodeInfosOverFileNames": "Предпочитай \"вградената\" информация за епизода вместо името на файла", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Това използва информацията за епизода от вградените метаданни, ако е налична.", "PreferEmbeddedTitlesOverFileNamesHelp": "Това определя заглавието по подразбиране, когато няма интернет метаданни или локални метаданни.", - "PluginInstalledMessage": "Добавката е успешно инсталирана. Джелифин ще трябва да бъде рестартиран, за да влязат в сила промените.", + "MessagePluginInstalled": "Добавката е успешно инсталирана. Джелифин ще трябва да бъде рестартиран, за да влязат в сила промените.", "PleaseSelectTwoItems": "Моля, изберете поне два елемента.", "PleaseEnterNameOrId": "Моля, въведете име или външен идентификатор.", "PleaseConfirmPluginInstallation": "Моля, щракнете върху OK, за да потвърдите, че сте прочели горното и искате да продължите с инсталирането на добавката.", @@ -1450,14 +1320,13 @@ "Person": "Личност", "PerfectMatch": "Перфектно съвпадение", "PasswordSaved": "Паролата е запазена.", - "PasswordResetProviderHelp": "Изберете доставчик за нулиране на пароли, който да се използва, когато този потребител поиска нулиране на паролата", + "PasswordResetProviderHelp": "Изберете доставчик за нулиране на пароли, който да се използва, когато този потребител поиска нулиране на паролата.", "PasswordResetConfirmation": "Сигурни ли сте, че искате да нулирате паролата?", "PasswordResetComplete": "Паролата е нулирана.", "PasswordMatchError": "Паролата и потвърждението на паролата трябва да съвпадат.", "PackageInstallFailed": "Инсталирането на {0} версия {1}) е неуспешно.", "PackageInstallCompleted": "Инсталирането на {0} версия {1}) е завършено.", "PackageInstallCancelled": "Инсталирането на {0} версия {1}) е отменено.", - "OtherArtist": "Друг изпълнител", "OptionWeekends": "Почивни дни", "OptionWeekdays": "Делници", "OptionTvdbRating": "Рейтинг според ТВДБ", @@ -1475,13 +1344,13 @@ "OptionProtocolHls": "Директно предаване по HTTP", "OptionPosterCard": "Плакат карта", "OptionPoster": "Плакат", - "OptionPlainVideoItemsHelp": "Ако е активирано, всички видеофайлове са представени в DIDL като \"object.item.videoItem\" вместо по-конкретен тип, като например \"object.item.videoItem.movie\".", - "OptionPlainStorageFoldersHelp": "Ако е активирано, всички папки са представени в DIDL като \"object.container.storageFolder\" вместо по-конкретен тип, като например \"object.container.person.musicArtist\".", + "OptionPlainVideoItemsHelp": "Всички видеофайлове са представени в DIDL като \"object.item.videoItem\" вместо по-конкретен тип, като например \"object.item.videoItem.movie\".", + "OptionPlainStorageFoldersHelp": "Всички папки са представени в DIDL като \"object.container.storageFolder\" вместо по-конкретен тип, като например \"object.container.person.musicArtist\".", "OptionMax": "Максимално", "OptionLoginAttemptsBeforeLockoutHelp": "Стойност нула означава наследяване по подразбиране на три опита за нормални потребители и пет за администратори. Задаването на това на -1 ще деактивира функцията.", "OptionLoginAttemptsBeforeLockout": "Определя колко неправилни опита за влизане могат да бъдат направени, преди да бъде блокиран.", "OptionList": "Списък", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Ако са активирани, тези заявки ще бъдат удовлетворени, но ще се пренебрегне заглавната част от обхвата на байтовете.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Тези заявки ще бъдат удовлетворени, но ще се пренебрегне заглавната част от обхвата на байтовете.", "OptionIgnoreTranscodeByteRangeRequests": "Игнорирайте заявките за обхват на байтове при прекодиране", "OptionHlsSegmentedSubtitles": "HLS сегментирани субтитри", "OptionExtractChapterImage": "Включи извличането на изображения от разделите", @@ -1504,12 +1373,12 @@ "OptionBlockLiveTvChannels": "Телевизионни канали на живо", "OptionBlockChannelContent": "Съдържание на интернет канала", "OptionBanner": "Банер", - "OptionAutomaticallyGroupSeriesHelp": "Ако е активирано, сезоните, които се намират в различни папки, ще бъдат автоматично обединени в един сериал.", + "OptionAutomaticallyGroupSeriesHelp": "Сеезоните, които се намират в различни папки, ще бъдат автоматично обединени в един сериал.", "OptionAutomaticallyGroupSeries": "Автоматично обединява сезони, които са разпределени в множество папки", "OptionAllowVideoPlaybackTranscoding": "Разреши възпроизвеждане на видео, което изисква транскодиране", "OptionAllowVideoPlaybackRemuxing": "Разреши възпроизвеждане на видео, което изисква преобразуване без повторно кодиране", "OptionAllowSyncTranscoding": "Разреши изтегляне и синхронизиране на медия, която изисква транскодиране", - "OptionAllowMediaPlaybackTranscodingHelp": "Ограничаването на достъпа до транскодирането може да доведе до проблеми при възпроизвеждането в приложенията на Джелифин поради неподдържани медийни формати.", + "OptionAllowMediaPlaybackTranscodingHelp": "Ограничаването на достъпа до транскодирането може да доведе до проблеми при възпроизвеждането в приложенията поради неподдържани медийни формати.", "OptionAllowLinkSharingHelp": "Споделят се само уеб страници, съдържащи медийна информация.Медийните файлове никога не се споделят публично. Споделянията са ограничени във времето и изтичат след {0} дни.", "OptionAllowContentDownloading": "Разрешаване на изтегляне и синхронизиране на медия", "OptionForceRemoteSourceTranscoding": "Принудително транскодиране на отдалечени медийни източници (като поточна ТВ)", @@ -1519,7 +1388,7 @@ "OnlyForcedSubtitles": "Само принудително", "OneChannel": "Един канал", "NoSubtitlesHelp": "Субтитрите няма да бъдат заредени по подразбиране. Те все още могат да бъдат включени ръчно по време на възпроизвеждане.", - "NoPluginConfigurationMessage": "Тази добавка няма настройки за конфигуриране.", + "MessageNoPluginConfiguration": "Тази добавка няма настройки за конфигуриране.", "NoNewDevicesFound": "Не са намерени нови устройства. За да добавите нов тунер, затворете този диалогов прозорец и въведете ръчно информацията за устройството.", "NoCreatedLibraries": "Изглежда, че все още не сте създали библиотеки. {0} Искате ли да ги създадете сега? {1}", "NextUp": "Следващ по ред", @@ -1559,5 +1428,19 @@ "EnableDecodingColorDepth10Hevc": "Включи 10 битово хардуерно декодиране за HEVC", "ButtonCast": "Стриймване", "ButtonSyncPlay": "SyncPlay", - "TabRepositories": "Хранилища" + "TabRepositories": "Хранилища", + "Preview": "Преглед", + "SubtitleVerticalPositionHelp": "Номер на ред, където се появява текст. Положителните числа показват отгоре надолу. Отрицателните числа показват отдолу нагоре.", + "LabelSubtitleVerticalPosition": "Вертикална позиция:", + "ClearQueue": "Изчисти опашката", + "StopPlayback": "Спри възпроизвеждане", + "ButtonPlayer": "Плеър", + "Writers": "Сценаристи", + "ViewAlbumArtist": "Виж албума на изпълнителя", + "PreviousTrack": "Прескочи към предишен", + "MessageGetInstalledPluginsError": "Възникна грешка при извличане на списъка с инсталираните добавки.", + "MessagePluginInstallError": "Възникна грешка при инсталирането на добавката.", + "PlaybackRate": "Скорост на възпроизвеждане", + "NextTrack": "Прескочи към следващ", + "LabelUnstable": "Нестабилна" } diff --git a/src/strings/bn_BD.json b/src/strings/bn_BD.json new file mode 100644 index 0000000000..3f11b4f050 --- /dev/null +++ b/src/strings/bn_BD.json @@ -0,0 +1,139 @@ +{ + "Actor": "অভিনেতা", + "AccessRestrictedTryAgainLater": "অ্যাক্সেস বর্তমানে সীমাবদ্ধ। অনুগ্রহ করে একটু পরে আবার চেষ্টা করুন.", + "AllLibraries": "সব লাইব্রেরি", + "AllLanguages": "সব ভাষা", + "AllEpisodes": "সব এপিসোড", + "AllComplexFormats": "সমস্ত জটিল ফর্ম্যাট", + "AllChannels": "সব চ্যানেল", + "All": "সবগুলি", + "Alerts": "এলার্টস", + "Albums": "অ্যালবাম সমূহ", + "AlbumArtist": "অ্যালবাম আর্টিস্ট", + "Album": "অ্যালবাম", + "AirDate": "উন্মুক্তের তারিখ", + "AdditionalNotificationServices": "আরো নোটিফিকেশন সার্ভিস ইনস্টল করতে প্লাগিন ক্যাটালগে ব্রাউস করুন।", + "AddedOnValue": "এডেড {০}", + "AddToPlaylist": "প্লেলিস্টে অ্যাড করুন", + "AddToPlayQueue": "প্লে কিউ তে অ্যাড করুন", + "AddToCollection": "কালেকশন এ অ্যাড করুন", + "ButtonPause": "বিরতি", + "ButtonParentalControl": "অভিভাবকীয় নিয়ন্ত্রণ", + "ButtonOpen": "খুলুন", + "ButtonOk": "আচ্ছা", + "ButtonNextTrack": "পরবর্তী ট্র্যাক", + "ButtonNetwork": "নেটওয়ার্ক", + "ButtonMore": "আরও", + "ButtonLibraryAccess": "লাইব্রেরি অ্যাক্সেস", + "ButtonInfo": "তথ্য", + "ButtonGuide": "গাইড", + "ButtonGotIt": "বুঝেছি", + "ButtonFullscreen": "ফুলস্ক্রিন", + "ButtonForgotPassword": "পাসওয়ার্ড ভুলে গেছি", + "ButtonEditOtherUserPreferences": "এই ব্যবহারকারীর প্রোফাইল, ছবি এবং ব্যক্তিগত পছন্দগুলি এডিট করুন।", + "ButtonChangeServer": "সার্ভার পরিবর্তন করুন", + "ButtonCancel": "বাতিল", + "ButtonBack": "অনগ্রসর", + "ButtonAudioTracks": "অডিও ট্র্যাকস", + "ButtonArrowRight": "ডান", + "ButtonArrowLeft": "বাম", + "ButtonAddUser": "ব্যবহারকারী যুক্ত করুন", + "ButtonAddServer": "সার্ভার যোগ করুন", + "ButtonAddScheduledTaskTrigger": "ট্রিগার যুক্ত করুন", + "ButtonAddMediaLibrary": "মিডিয়া লাইব্রেরি যুক্ত করুন", + "ButtonAddImage": "ছবি", + "MessageBrowsePluginCatalog": "এভিলেবল প্লাগইনগুলি দেখতে আমাদের প্লাগইন ক্যাটালগ ব্রাউজ করুন।", + "Browse": "ব্রাউজ", + "BoxRear": "বক্স (পিছন)", + "BoxSet": "বক্স সেট", + "Box": "বক্স", + "Books": "বই", + "BookLibraryHelp": "অডিও এবং পাঠ্য বই সমর্থিত। {0} বইয়ের নামকরণ গাইড {1} পর্যালোচনা করুন।", + "Blacklist": "নিষিদ্ধ তালিকা", + "BirthPlaceValue": "জন্ম স্থান: {0}", + "BirthLocation": "জন্মের অবস্থান", + "BirthDateValue": "জন্ম: {0}", + "Banner": "ব্যানার", + "Backdrop": "ব্যাকড্রপ", + "Auto": "অটো", + "Audio": "অডিও", + "AskAdminToCreateLibrary": "একজন প্রশাসককে একটি লাইব্রেরি তৈরি করতে বলুন।", + "Ascending": "ঊর্ধ্বগামী", + "AsManyAsPossible": "যতটা সম্ভব", + "Artists": "শিল্পীবৃন্দ", + "Artist": "শিল্পী", + "Art": "শিল্প", + "AroundTime": "কাছাকাছি", + "Anytime": "যে কোনো সময়", + "AnyLanguage": "যেকোনো ভাষা", + "AlwaysPlaySubtitlesHelp": "ভাষার পছন্দের সাথে মিলিয়ে সাবটাইটেলগুলি লোড করা হবে।", + "AlwaysPlaySubtitles": "সর্বদা চালান", + "AllowRemoteAccessHelp": "যদি টিক না দেয়া হয়, সব রিমোট সংযোগ ব্লক করা হবে।", + "AllowRemoteAccess": "এই সার্ভারে দূরবর্তী সংযোগের অনুমতি দিন।", + "AllowFfmpegThrottling": "থ্রটল ট্রান্সকোড", + "AllowOnTheFlySubtitleExtraction": "অনদাফ্লাই সাবটাইটেল বেরকরার অনুমতি", + "AllowMediaConversion": "মিডিয়া কনভার্টের অনুমতি দিন", + "AllowHWTranscodingHelp": "টিউনার কে স্ট্রিম ট্রান্সকোড করার সুযোগ দিন। এটি সার্ভার ট্রান্সকোডিং কমাতে সাহায্য করতে পারে।", + "Aired": "উন্মুক্ত করন", + "Add": "যোগ", + "ButtonPreviousTrack": "পূর্ববর্তী ট্র্যাক", + "ButtonProfile": "প্রোফাইল", + "ButtonResume": "রিসিউম", + "ButtonRestart": "রিস্টার্ট", + "ButtonResetPassword": "পাসওয়ার্ড রিসেট করুন", + "ButtonResetEasyPassword": "সহজ পিন কোডটি রিসেট করুন", + "ButtonRename": "নামান্তর", + "ButtonRemove": "সরান", + "ButtonRefreshGuideData": "গাইড ডেটা রিফ্রেশ করুন", + "ButtonQuickStartGuide": "দ্রুত শুরু করার নির্দেশাবলী", + "CopyStreamURL": "স্ট্রিম ইউআরএল কপি", + "ContinueWatching": "দেখা অব্যাহত রাখুন", + "Connect": "কানেক্ট", + "ConfirmEndPlayerSession": "আপনি কি জেলিফিনকে {0} এ বন্ধ করতে চান?", + "ConfirmDeletion": "মোছার বিষয়টি নিশ্চিত করুন", + "ConfirmDeleteItems": "এই আইটেমগুলি মোছা ফাইল ফাইল এবং আপনার মিডিয়া লাইব্রেরি উভয় থেকে মুছে ফেলা হবে। আপনি কি তাই চান?", + "ConfirmDeleteItem": "এই আইটেমটি মোছার ফলে এটি ফাইল সিস্টেম এবং আপনার মিডিয়া লাইব্রেরি উভয় থেকে মুছে যাবে। আপনি কি তাই চান?", + "ConfirmDeleteImage": "ছবি মুছবেন?", + "Absolute": "গুণাতীত", + "CriticRating": "ক্রিটিক রেটিং", + "DefaultMetadataLangaugeDescription": "এগুলি আপনার প্রত্যাশিত এবং প্রতি লাইব্রেরির ভিত্তিতে কাস্টমাইজ করা যায়।", + "ErrorDefault": "অনুরোধটি প্রক্রিয়াতে একটি সমস্যা হয়েছে । অনুগ্রহ করে একটু পরে আবার চেষ্টা করুন।", + "Default": "প্রত্যাশিত", + "DeathDateValue": "মৃত: {0}", + "DatePlayed": "তারিখে চলেছে", + "DateAdded": "তারিখে এসেছে", + "CustomDlnaProfilesHelp": "নতুন ডিভাইসের সিস্টেম প্রোফাইল ওভাররাইড করতে একটি কাস্টম প্রোফাইল তৈরি করুন।", + "DeleteImageConfirmation": "আপনি কি নিশ্চিত যে আপনি এই চিত্রটি মুছতে চান?", + "DeleteImage": "ছবি মুছুন", + "DeleteDeviceConfirmation": "আপনি কি নিশ্চিত যে আপনি এই ডিভাইসটি মুছতে চান? এটি পরবর্তীতে ব্যবহারকারীর সাইন ইন করার পর ব্যবহারকারীর সাথে এটি আবার প্রদর্শিত হবে।", + "Delete": "মুছে ফেলুন", + "DeinterlaceMethodHelp": "ইন্টারলেসড কন্টেন্ট ট্রান্সকোড করার সময় ব্যবহারের জন্য ডিএনটারলেসিং পদ্ধতিটি নির্বাচন করুন।", + "DefaultSubtitlesHelp": "এম্বেড থাকা মেটাডেটাতে ডিফল্ট এবং জোর করে দেওয়া ফ্ল্যাগের উপর ভিত্তি করে সাবটাইটেলগুলি লোড করা হয়। ভাষা পছন্দগুলি বিবেচনা করা হয় যখন একাধিক বিকল্প থাকে।", + "EditSubtitles": "সাবটাইটেল এডিট করুন", + "EditMetadata": "মেটাডেটা এডিট করুন", + "EditImages": "ছবিগুলি এডিট করুন", + "Edit": "এডিট", + "EasyPasswordHelp": "আপনার সহজ পিন কোড সমর্থিত ক্লায়েন্ট অফলাইন অ্যাকসেসের জন্য ব্যবহার করা হয় এছাড়াও সহজ-নেটওয়ার্কে ব্যবহার করা যেতে পারে।", + "DrmChannelsNotImported": "ডিআরএম সহ চ্যানেলগুলি ইম্পোর্ট করা হবে না।", + "DownloadsValue": "{0} ডাউনলোড সমূহ", + "Download": "ডাউনলোড", + "Down": "নিচে", + "DoNotRecord": "রেকর্ড করবেন না", + "DisplayMissingEpisodesWithinSeasonsHelp": "এটি অবশ্যই সার্ভার কনফিগারেশনে টিভি লাইব্রেরির জন্য ইনেবল করতে হবে।", + "DisplayInOtherHomeScreenSections": "সর্বশেষ মিডিয়া হিসাবে হোম স্ক্রিন বিভাগে প্রদর্শন করুন এবং দেখা চালিয়ে যান", + "DisplayInMyMedia": "হোম স্ক্রিনে প্রদর্শন করুন", + "Display": "ডিসপ্লে", + "Dislike": "ডিসলাইক", + "Disconnect": "ডিসকানেক্ট", + "Disc": "ডিস্ক", + "Directors": "পরিচালকবৃন্দ", + "Director": "পরিচালক", + "DirectPlaying": "ডাইরেক্ট প্লেয়িং", + "DetectingDevices": "ডিভাইস সনাক্ত করা হচ্ছে", + "Desktop": "ডেস্কটপ", + "Descending": "ডিসেন্ডিং", + "Depressed": "অবনমিত", + "DeleteUserConfirmation": "আপনি কি নিশ্চিত যে আপনি এই ব্যবহারকারীকে মুছতে চান?", + "DeleteUser": "ব্যবহারকারী মুছুন", + "DeleteMedia": "মিডিয়া মুছুন" +} diff --git a/src/strings/ca.json b/src/strings/ca.json index 2324c31e4c..c199cb2cbe 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -12,70 +12,48 @@ "Artists": "Artistes", "AsManyAsPossible": "Tants com sigui possible", "AspectRatio": "Relació d'aspecte", - "AttributeNew": "Nou", "Audio": "Àudio", - "BrowsePluginCatalogMessage": "Consulta el nostre catàleg per veure els complements disponibles.", - "ButtonAdd": "Afegeix", + "MessageBrowsePluginCatalog": "Consulta el nostre catàleg per veure els complements disponibles.", "ButtonAddMediaLibrary": "Afegir Biblioteca Multimèdia", "ButtonAddScheduledTaskTrigger": "Afegir Disparador", "ButtonAddServer": "Afegeix Servidor", "ButtonAddUser": "Afegir Usuari", - "ButtonArrowDown": "Avall", "ButtonArrowLeft": "Esquerra", "ButtonArrowRight": "Dreta", - "ButtonArrowUp": "Amunt", "ButtonBack": "Darrera", "ButtonCancel": "Cancel·la", "ButtonChangeServer": "Canvia Servidor", - "ButtonDelete": "Esborra", - "ButtonDeleteImage": "Esborra Imatge", - "ButtonDownload": "Descarrega", - "ButtonEdit": "Edita", - "ButtonEditImages": "Edita les imatges", "ButtonEditOtherUserPreferences": "Edita el perfil, la imatge i les preferències d'aquest usuari.", - "ButtonFilter": "Filtra", "ButtonForgotPassword": "He oblidat la contrasenya", "ButtonGotIt": "Entesos", "ButtonGuide": "Guia", - "ButtonHelp": "Ajuda", - "ButtonHome": "Inici", - "ButtonLearnMore": "Aprèn més", "ButtonLibraryAccess": "Accés a la biblioteca", "ButtonManualLogin": "Inici de sessió manual", "ButtonMore": "Més", - "ButtonNew": "Nou", "ButtonNextTrack": "Pista següent", "ButtonOk": "D'acord", "ButtonOpen": "Obre", "ButtonParentalControl": "Control parental", "ButtonPause": "Pausa", - "ButtonPlay": "Reprodueix", "ButtonPreviousTrack": "Pista anterior", "ButtonProfile": "Perfil", "ButtonQuickStartGuide": "Guia d'inici ràpid", - "ButtonRefresh": "Refresca", "ButtonRefreshGuideData": "Refresca les Dades de la Guia", "ButtonRemove": "Elimina", "ButtonResetEasyPassword": "Reinicia el codi pin senzill", "ButtonResetPassword": "Reiniciar Contrasenya", "ButtonRestart": "Reiniciar", "ButtonResume": "Reprèn", - "ButtonSave": "Desa", - "ButtonSearch": "Cercar", "ButtonSelectDirectory": "Selecciona Directori", "ButtonSelectServer": "Seleccionar servidor", "ButtonSend": "Envia", "ButtonSettings": "Preferències", - "ButtonShuffle": "Aleatori", "ButtonShutdown": "Atura", "ButtonSignIn": "Inicia Sessió", "ButtonSignOut": "Tanca sessió", - "ButtonSort": "Ordena", "ButtonStop": "Atura", "ButtonSubmit": "Envia", - "ButtonSubtitles": "Subtítols", "ButtonTrailer": "Tràiler", - "ButtonViewWebsite": "Veure website", "CancelRecording": "Cancel·la enregistrament", "CancelSeries": "Cancel·la sèrie", "ChannelAccessHelp": "Selecciona els canals a compartir amb aquest usuari. Els administradors podran editar tots els canals emprant el gestor de metadades.", @@ -84,7 +62,7 @@ "ConfirmDeletion": "Confirma supressió", "Connect": "Connecta", "Continuing": "Continuant", - "DefaultErrorMessage": "Hi ha hagut un error processant la petició. Intenta-ho més tard si et plau.", + "ErrorDefault": "Hi ha hagut un error processant la petició. Intenta-ho més tard si et plau.", "Delete": "Esborra", "DeleteImage": "Esborra Imatge", "DeleteImageConfirmation": "Esteu segur que voleu suprimir aquesta imatge?", @@ -128,24 +106,18 @@ "HeaderActiveDevices": "Dispositius Actius", "HeaderActiveRecordings": "Enregistraments Actius", "HeaderActivity": "Activitat", - "HeaderAddScheduledTaskTrigger": "Afegir Disparador", "HeaderAddToCollection": "Afegir a Col·lecció", "HeaderAddToPlaylist": "Afegir a la llista de reproducció", "HeaderAddUpdateImage": "Afegir/Actualitzar Imatge", - "HeaderAddUser": "Afegir Usuari", "HeaderAdditionalParts": "Parts addicionals", "HeaderApiKey": "Clau Api", "HeaderApiKeys": "Claus Api", "HeaderApiKeysHelp": "Les aplicacions externes requereixen una Api key pere tal de poder-se comunicar amb el Servidor d'Jellyfin. Les claus són emeses iniciant sessió amb un compte d'Jellyfin, o concedint manualment una clau a l'aplicació.", "HeaderAudioSettings": "Preferències d'Àudio", - "HeaderAutomaticUpdates": "Actualitzacions Automàtiques", - "HeaderBooks": "Llibres", "HeaderBranding": "Aparença", "HeaderCancelRecording": "Cancel·lar Enregistrament", "HeaderCancelSeries": "Cancel·lar Sèries", "HeaderCastAndCrew": "Repartiment i Equip", - "HeaderCastCrew": "Repartiment i Equip", - "HeaderChannels": "Canals", "HeaderCodecProfile": "Perfil de Còdec", "HeaderConfirmProfileDeletion": "Confirmar Supressió de Perfil", "HeaderConnectToServer": "Connectar al Servidor", @@ -162,18 +134,13 @@ "HeaderDeviceAccess": "Accés de Dispositiu", "HeaderDevices": "Dispositius", "HeaderDirectPlayProfile": "Perfil de Reproducció Directa", - "HeaderDisplay": "Visualització", "HeaderEasyPinCode": "Codi Pin Senzill", "HeaderEditImages": "Edita Imatges", "HeaderEnabledFields": "Camps Habilitats", "HeaderExternalIds": "Identificadors externs:", "HeaderFeatureAccess": "Accés a Funcions", - "HeaderFeatures": "Característiques", "HeaderFetchImages": "Obtingues Imatges:", - "HeaderFilters": "Filtres", - "HeaderForgotPassword": "He oblidat la contrasenya", "HeaderFrequentlyPlayed": "Reproduït Freqüentment", - "HeaderGenres": "Gèneres", "HeaderHttpHeaders": "Capçaleres Http", "HeaderIdentification": "Identificació", "HeaderIdentificationCriteriaHelp": "Insereix al menys un criteri d'identificació.", @@ -193,26 +160,20 @@ "HeaderLibraryFolders": "Directoris de la Llibreria", "HeaderLibraryOrder": "Ordre de la llibreria", "HeaderLibrarySettings": "Preferències de la Biblioteca", - "HeaderLiveTV": "TV en Directe", - "HeaderLiveTv": "TV en Directe", "HeaderMediaFolders": "Directoris Multimèdia", - "HeaderMediaInfo": "Info Multimèdia", "HeaderMetadataSettings": "Preferències de Metadades", - "HeaderMovies": "Pel·lícules", "HeaderMusicVideos": "Vídeos Musicals", "HeaderMyDevice": "El meu dispositiu", "HeaderMyMedia": "Els meus mitjans", "HeaderMyMediaSmall": "Els meus mitjans (petit)", "HeaderNewApiKey": "Nova Clau Api", "HeaderNextEpisodePlayingInValue": "Reproduint proper episodi en {0}", - "HeaderNextUp": "A continuació", "HeaderNextVideoPlayingInValue": "Reproduint proper vídeo en {0}", "HeaderOnNow": "En Directe Ara", "HeaderParentalRatings": "Classificacions Parentals", "HeaderPassword": "Contrasenya", "HeaderPasswordReset": "Reiniciar Contrasenya", "HeaderPaths": "Directoris", - "HeaderPeople": "Gent", "HeaderPlayAll": "Reprodueix Tot", "HeaderPlaybackError": "Error de Reproducció", "HeaderPleaseSignIn": "Si et plau, inicia sessió", @@ -226,12 +187,10 @@ "HeaderRestart": "Reiniciar", "HeaderRunningTasks": "Tasques Corrent", "HeaderScenes": "Escenes", - "HeaderSchedule": "Horari", "HeaderSeasons": "Temporades", "HeaderSecondsValue": "{0} segons", "HeaderSelectServer": "Seleccionar Servidor", "HeaderSendMessage": "Enviar Missatge", - "HeaderSeries": "Sèries:", "HeaderSeriesOptions": "Opcions de Sèries", "HeaderServerSettings": "Preferències del Servidor", "HeaderSettings": "Preferències", @@ -255,7 +214,6 @@ "HeaderXmlDocumentAttributes": "Atributs de Documents XML", "HeaderXmlSettings": "Preferències Xml", "HeaderYears": "Anys", - "HeadersFolders": "Directoris", "Help": "Ajuda", "Hide": "Amaga", "Identify": "Identifica", @@ -271,8 +229,6 @@ "LabelAlbum": "Àlbum:", "LabelAlbumArtMaxHeight": "Alçada màxima de l'art de l'àlbum:", "LabelAlbumArtMaxWidth": "Amplada màxima de l'art de l'àlbum:", - "LabelAllowServerAutoRestart": "Permetre el servidor reiniciar-se automàticament per aplicar actualitzacions", - "LabelAllowServerAutoRestartHelp": "El servidor només es reiniciarà durant períodes d'inactivitat, quan no tingui usuaris actius.", "LabelArtists": "Artistes:", "LabelArtistsHelp": "Separa'n varis emprant ;", "LabelAudioLanguagePreference": "Preferència de l'idioma de l'àudio:", @@ -291,8 +247,6 @@ "LabelCurrentPassword": "Contrasenya actual:", "LabelCustomCss": "CSS propi:", "LabelCustomCssHelp": "Aplica el teu propi css a la interfície web.", - "LabelCustomDeviceDisplayName": "Nom a mostrar:", - "LabelDashboardTheme": "Tema del tauler de control del servidor:", "LabelDateAdded": "Data afegit:", "LabelDay": "Dia:", "LabelDeathDate": "Data de defunció:", @@ -301,7 +255,6 @@ "LabelDeviceDescription": "Descripció del dispositiu", "LabelDiscNumber": "Disc:", "LabelDisplayLanguage": "Idioma de visualització:", - "LabelDisplayMissingEpisodesWithinSeasons": "Mostra els episodis que manquen dins les temporades", "LabelDisplayName": "Nom a mostrar:", "LabelDisplayOrder": "Ordre de visualització:", "LabelDisplaySpecialsWithinSeasons": "Mostra els especials dins les temporades en que van ser emesos", @@ -371,7 +324,6 @@ "LabelNewName": "Nou nom:", "LabelNewPassword": "Nova contrasenya:", "LabelNewPasswordConfirm": "Confirma la nova contrasenya:", - "LabelNext": "Següent", "LabelNotificationEnabled": "Habilita aquesta notificació", "LabelNumber": "Nombre:", "LabelNumberOfGuideDays": "Nombre de dies de dades de la guia per a descarregar:", @@ -387,9 +339,7 @@ "LabelPlayDefaultAudioTrack": "Reprodueix la pista d'àudio per defecte independentment de l'idioma", "LabelPlaylist": "Llista de rep.:", "LabelPreferredDisplayLanguage": "Idioma de visualització preferit:", - "LabelPreferredDisplayLanguageHelp": "La traducció d'Jellyfin és un projecte en curs.", "LabelPreferredSubtitleLanguage": "Idioma preferit de subtítols:", - "LabelPrevious": "Anterior", "LabelProfileAudioCodecs": "Còdecs d'àudio:", "LabelProfileCodecs": "Còdecs:", "LabelProfileContainer": "Contenidor:", @@ -397,7 +347,6 @@ "LabelProtocolInfo": "Informació del protocol:", "LabelPublicHttpPort": "Número públic del port http:", "LabelPublicHttpsPort": "Número públic del port https:", - "LabelReadHowYouCanContribute": "Aprèn com pots contribuir.", "LabelRecord": "Enregistra:", "LabelRecordingPath": "Directori de gravació per defecte:", "LabelRefreshMode": "Mode de refresc:", @@ -413,9 +362,7 @@ "LabelSendNotificationToUsers": "Envia la notificació a:", "LabelSerialNumber": "Nombre de sèrie", "LabelSeriesRecordingPath": "Directori de gravació de sèries (opcional):", - "LabelSkin": "Aspecte:", "LabelSortTitle": "Títol d'endreçat:", - "LabelSoundEffects": "Efectes de so:", "LabelSource": "Font:", "LabelStartWhenPossible": "Inicia quan sigui possible:", "LabelStatus": "Estat:", @@ -427,10 +374,7 @@ "LabelTimeLimitHours": "Temps límit (en hores):", "LabelTitle": "Títol:", "LabelTrackNumber": "Pista:", - "LabelTranscodingAudioCodec": "Còdec d'àudio", - "LabelTranscodingContainer": "Contenidor:", "LabelTranscodingTempPathHelp": "Aquest directori conté fitxers emprats pel transcodificador. Especifica un directori personalitzat o deixa-ho en blanc per emprar el per defecte dins el directori de dades del servidor.", - "LabelTranscodingVideoCodec": "Còdec de vídeo:", "LabelTriggerType": "Tipus de Disparador:", "LabelType": "Tipus:", "LabelUseNotificationServices": "Empra els següents serveis:", @@ -439,7 +383,6 @@ "LabelUsername": "Nom d'usuari:", "LabelValue": "Valor:", "LabelYear": "Any:", - "LabelYourFirstName": "El teu nom:", "LabelYoureDone": "Ja està!", "LatestFromLibrary": "Novetats a {0}", "LibraryAccessHelp": "Selecciona els directoris dels multimèdia a compartir amb aquest usuari. Els administradors podran editar tots els directoris emprant el gestor de metadades.", @@ -471,7 +414,6 @@ "MessageNoTrailersFound": "No s'han trobat tràilers. Instal·la el canal Trailer per millorar la teva experiència amb les pel·lícules afegint una llibreria de tràilers d'internet.", "MessageNothingHere": "Res aquí.", "MessagePleaseEnsureInternetMetadata": "Si et plau, assegura't que la descàrrega de metadades d'internet està habilitada.", - "MessageSettingsSaved": "Preferències desades.", "MessageYouHaveVersionInstalled": "Actualment tens la versió {0} instal·lada.", "MetadataManager": "Gestor de Metadades", "MinutesAfter": "minuts després", @@ -490,10 +432,9 @@ "NewCollectionNameExample": "Exemple: Col·leció Star Wars", "NewEpisodes": "Nous episodis", "NewEpisodesOnly": "Només nous episodis", - "NoNextUpItemsMessage": "Cap trobat. Comença a mirar els teus programes!", - "NoPluginConfigurationMessage": "Aquest complement no té opcions de configuració.", + "MessageNoNextUpItems": "Cap trobat. Comença a mirar els teus programes!", + "MessageNoPluginConfiguration": "Aquest complement no té opcions de configuració.", "NoSubtitleSearchResultsFound": "No s'han trobat resultats.", - "NoSubtitles": "Sense subtítols", "None": "Cap", "NumLocationsValue": "{0} directoris", "OnlyForcedSubtitles": "Només subtítols forçats", @@ -544,7 +485,6 @@ "OptionEveryday": "Cada dia", "OptionExternallyDownloaded": "Descàrrega externa", "OptionFavorite": "Preferits", - "OptionFriday": "Divendres", "OptionHasSpecialFeatures": "Característiques Especials", "OptionHasSubtitles": "Subtítols", "OptionHasThemeSong": "Cançó Temàtica", @@ -556,11 +496,9 @@ "OptionImdbRating": "Qualificació IMDb", "OptionLikes": "M'agrada", "OptionMissingEpisode": "Episodis Perduts", - "OptionMonday": "Dilluns", "OptionNameSort": "Nom", "OptionNew": "Nou...", "OptionNone": "Cap", - "OptionOnAppStartup": "En arrencar l'aplicació", "OptionOnInterval": "En un interval", "OptionParentalRating": "Classificació Parental", "OptionPlayCount": "Nombre de Reproduccions", @@ -571,18 +509,13 @@ "OptionReleaseDate": "Data de Publicació", "OptionResumable": "Continuable", "OptionRuntime": "Temps d'exec.", - "OptionSaturday": "Dissabte", "OptionSaveMetadataAsHidden": "Desa les metadades i les imatges com a fitxers ocults", "OptionSpecialEpisode": "Especials", "OptionSubstring": "Subcadena", - "OptionSunday": "Diumenge", - "OptionThursday": "Dijous", - "OptionTuesday": "Dimarts", "OptionTvdbRating": "Valoració TVDB", "OptionUnairedEpisode": "Episodis No Emesos", "OptionUnplayed": "No reproduït", "OptionWakeFromSleep": "Despertar", - "OptionWednesday": "Dimecres", "OptionWeekdays": "Entre setmana", "OptionWeekends": "Cap de setmana", "OptionWeekly": "Setmanal", @@ -604,7 +537,6 @@ "Producer": "Productor", "Programs": "Programes", "Quality": "Qualitat", - "QueueAllFromHere": "Afegeix tots a la cua des d'aquí", "RecentlyWatched": "Reproduït recentment", "RecommendationBecauseYouWatched": "Ja que has vist {0}", "Record": "Grava", @@ -623,7 +555,6 @@ "ReplaceAllMetadata": "Reemplaça totes les metadades", "ReplaceExistingImages": "Reemplaça imatges existents", "ResumeAt": "Reprodueix des de {0}", - "RunAtStartup": "Arrenca en iniciar", "Saturday": "Dissabte", "Save": "Desa", "Screenshots": "Captures de pantalla", @@ -651,54 +582,27 @@ "Sync": "Sincronitzar", "TabAccess": "Accés", "TabAdvanced": "Avançat", - "TabAlbums": "Àlbums", - "TabArtists": "Artistes:", "TabCatalog": "Catàleg", - "TabChannels": "Canals", "TabCodecs": "Còdecs", - "TabCollections": "Col·leccions", "TabContainers": "Contenidors", "TabDashboard": "Tauler de Control", - "TabDevices": "Dispositius", "TabDirectPlay": "Reproducció Directa", - "TabDisplay": "Visualització", - "TabEpisodes": "Episodis", - "TabFavorites": "Preferits", - "TabGenres": "Gèneres", - "TabGuide": "Guia", - "TabInfo": "Informació", "TabLatest": "Novetats", - "TabLiveTV": "TV en Directe", - "TabMetadata": "Metadades", - "TabMovies": "Pel·lícules", "TabMusic": "Música", - "TabMusicVideos": "Vídeos musicals", "TabMyPlugins": "Els meus complements", "TabNetworks": "Cadenes", "TabNfoSettings": "Preferències d'Nfo", "TabNotifications": "Notificacions", "TabOther": "Altres", "TabParentalControl": "Control Parental", - "TabPassword": "Contrasenya", - "TabPlayback": "Reproducció", - "TabPlaylist": "Llista de reproducció", - "TabPlaylists": "Llistes de reproducció", "TabPlugins": "Complements", "TabProfile": "Perfil", "TabProfiles": "Perfils", - "TabRecordings": "Enregistraments", "TabResponses": "Respostes", "TabScheduledTasks": "Tasques Programades", - "TabSeries": "Sèries", "TabServer": "Servidor", "TabSettings": "Preferències", - "TabShows": "Programes", - "TabSongs": "Cançons", - "TabSuggestions": "Suggerències", - "TabTrailers": "Tràilers", - "TabTranscoding": "Transcodificació", "TabUpcoming": "Properament", - "TabUsers": "Usuaris", "Tags": "Etiquetes", "TellUsAboutYourself": "Explica'ns sobre tu", "TheseSettingsAffectSubtitlesOnThisDevice": "Aquestes preferències afecten els subtítols d'aquest dispositiu", @@ -708,7 +612,7 @@ "TrackCount": "{0} pistes", "Tuesday": "Dimarts", "UninstallPluginConfirmation": "Estàs segur que vols desinstal·lar {0}?", - "UninstallPluginHeader": "Desinstal·lar Complement.", + "HeaderUninstallPlugin": "Desinstal·lar Complement.", "Unmute": "De-silencia", "Unrated": "Sense valorar", "Up": "Amunt", @@ -747,20 +651,16 @@ "ChannelNumber": "Número de canal", "Categories": "Categories", "ButtonWebsite": "Lloc web", - "ButtonUp": "Amunt", "ButtonUninstall": "Desinstal·lar", "ButtonSplit": "Dividir", "ButtonStart": "Començar", "ButtonSelectView": "Selecciona la vista", "ButtonScanAllLibraries": "Escanejar totes les biblioteques", "ButtonRevoke": "Revocar", - "ButtonRepeat": "Repetir", "ButtonRename": "Canviar el nom", "ButtonNetwork": "Xarxa", "ButtonInfo": "Informació", "ButtonFullscreen": "Pantalla completa", - "ButtonDown": "A baix", - "ButtonConnect": "Connectar", "ButtonAudioTracks": "Pistes d'àudio", "ButtonAddImage": "Afegir imatge", "Blacklist": "Llista negra", @@ -789,8 +689,7 @@ "Aired": "Transmès", "AirDate": "Data d'emissió", "AdditionalNotificationServices": "Examineu el catàleg de complements per instal·lar serveis de notificació addicionals.", - "AddedOnValue": "Afegit {0}", - "AddItemToCollectionHelp": "Afegiu els elements a les col·leccions buscant-los i fent clic amb el botó dret o toqueu els menús per afegir-los a una col·lecció.", + "AddedOnValue": "Afegit {0}", "Actor": "Actor", "Absolute": "Absolut", "ClientSettings": "Configuració del client", @@ -798,17 +697,14 @@ "ChannelNameOnly": "Número de canal", "ChangingMetadataImageSettingsNewContent": "Els canvis als paràmetres de descàrrega de metadades o d'obra d'art només s'apliquen al contingut nou afegit a la biblioteca. Per aplicar els canvis als títols existents, haureu de refrescar les metadades manualment.", "ButtonTogglePlaylist": "Llista de reproducció", - "ButtonToggleContextMenu": "més", - "ButtonOff": "Apagar", - "BurnSubtitlesHelp": "Determina si el servidor hauria de gravar-se en els subtítols en transcodificar vídeos. Evitar això millorarà molt el rendiment. Seleccioneu Automàtica per gravar formats basats en imatges (VOBSUB, PGS, SUB, IDX) i certs subtítols ASS o SSA.", + "BurnSubtitlesHelp": "Determina si el servidor hauria de gravar els subtítols en transcodificar vídeos. Evitar això millorarà molt el rendiment. Seleccioneu Automàtica per gravar formats basats en imatges (VOBSUB, PGS, SUB, IDX) i certs subtítols ASS o SSA.", "Browse": "Navega", "BoxRear": "Caixa (posterior)", "BoxSet": "conjunt de caixes", "Box": "Caixa", - "BookLibraryHelp": "Els àudio i llibres de text són compatibles. Reviseu la {0} guia de denominació de llibres {1}.", + "BookLibraryHelp": "L'àudio i els llibres de text són compatibles. Reviseu la {0} guia de denominació de llibres {1}.", "Backdrops": "Fons", "Backdrop": "Fons", - "AutoBasedOnLanguageSetting": "Auto (basada en la configuració de l’idioma)", "Artist": "Artista", "AllowedRemoteAddressesHelp": "Llista d’adreces IP o d’entrades IP / netmasca separades per comes per a xarxes que podran connectar-se de forma remota. Si es deixa en blanc, es permetran totes les adreces remotes.", "AllowFfmpegThrottlingHelp": "Quan un transcòdi o un remux estigui prou lluny de la posició de reproducció actual, feu una pausa en el procés perquè consumirà menys recursos. Això és més útil per mirar sense buscar sovint. Desactiveu-la si teniu problemes de reproducció.", @@ -816,5 +712,22 @@ "AllowOnTheFlySubtitleExtractionHelp": "Els subtítols incrustats es poden extreure de vídeos i entregar-los a clients en text senzill per tal d'evitar la transcodificació de vídeo. En alguns sistemes, això pot trigar molt i fer que la reproducció de vídeo s’aturi durant el procés d’extracció. Desactiveu-ho per tenir subtítols incrustats incrustats amb la transcodificació de vídeo quan no són compatibles amb el dispositiu client de forma nativa.", "AlbumArtist": "Album artista", "Album": "Album", - "ButtonSyncPlay": "SyncPlay" + "ButtonSyncPlay": "SyncPlay", + "CriticRating": "Ràting de la crítica", + "CopyStreamURLSuccess": "L'URL s'ha copiat correctament.", + "CopyStreamURL": "Copiar l'URL de reproducció", + "ContinueWatching": "Continuar mirant", + "ConfirmEndPlayerSession": "Vols tancar Jellyfin a {0}?", + "ConfirmDeleteItems": "L'esborrat d'aquests elements els eliminarà del sistema de fitxers i de la biblioteca multimèdia. Estàs segur que vols continuar?", + "ConfirmDeleteItem": "L'esborrat d'aquest element l'eliminarà del sistema de fitxers i de la biblioteca multimèdia. Estàs segur que vols continuar?", + "ConfigureDateAdded": "Configura com es determina la data d'afegit en el quadre de comandament dins les Preferències de la biblioteca", + "CommunityRating": "Ràting comunitari", + "ColorTransfer": "Transferència de color", + "ColorSpace": "Espai de color", + "ColorPrimaries": "Colors primaris", + "DefaultMetadataLangaugeDescription": "Aquests són els teus valors per defecte i poden ser personalitats per cada biblioteca.", + "Default": "Per defecte", + "DatePlayed": "Data reproduït", + "DateAdded": "Data d'afegit", + "CustomDlnaProfilesHelp": "Crear un perfil personalitzat per a un nou dispositiu o substitueix un perfil de sistema." } diff --git a/src/strings/cs.json b/src/strings/cs.json index 8cb6bc39ac..cf7b3cf2e9 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -2,7 +2,6 @@ "AccessRestrictedTryAgainLater": "Přístup je v současné době omezen. Prosím zkuste to znovu později.", "Actor": "Herec", "Add": "Přidat", - "AddItemToCollectionHelp": "Přidat položky do kolekce jejich vyhledáním a použitím pravého tlačítka myši nebo klepnutím na tlačítko menu - přidat do sbírky.", "AddToCollection": "Přidat do kolekce", "AddToPlayQueue": "Přidat do fronty k přehrání", "AddToPlaylist": "Přidat do playlistu", @@ -22,7 +21,6 @@ "Artists": "Umělci", "AsManyAsPossible": "Tolikrát jak je možné", "AspectRatio": "Poměr stran", - "AttributeNew": "Nové", "Audio": "Zvuk", "Auto": "Automaticky", "Backdrop": "Pozadí", @@ -34,78 +32,52 @@ "Books": "Knihy", "Box": "Pouzdro", "BoxRear": "Zadní část pouzdra", - "BrowsePluginCatalogMessage": "Prohlédněte si náš katalog, kde najdete dostupné zásuvné moduly.", - "ButtonAdd": "Přidat", + "MessageBrowsePluginCatalog": "Prohlédněte si náš katalog, kde najdete dostupné zásuvné moduly.", "ButtonAddMediaLibrary": "Přidat knihovnu médií", "ButtonAddScheduledTaskTrigger": "Přidat Spouštěč", "ButtonAddServer": "Přidat server", "ButtonAddUser": "Přidat uživatele", - "ButtonArrowDown": "Dolů", "ButtonArrowLeft": "Vlevo", "ButtonArrowRight": "Vpravo", - "ButtonArrowUp": "Nahoru", "ButtonAudioTracks": "Audio stopy", "ButtonBack": "Zpět", "ButtonCancel": "Zrušit", "ButtonChangeServer": "Změna serveru", - "ButtonConnect": "Připojit", - "ButtonDelete": "Odstranit", - "ButtonDeleteImage": "Odstranit obrázek", - "ButtonDown": "Zeslabit", - "ButtonDownload": "Stáhnout", - "ButtonEdit": "Upravit", - "ButtonEditImages": "Editovat obrázky", "ButtonEditOtherUserPreferences": "Editace uživatelského profilu, avataru a osobních preferencí.", - "ButtonFilter": "Filtr", "ButtonForgotPassword": "Zapomenuté heslo", "ButtonFullscreen": "Celá obrazovka", "ButtonGotIt": "Mám to", "ButtonGuide": "Programový průvodce", - "ButtonHelp": "Nápověda", - "ButtonHome": "Domů", - "ButtonLearnMore": "Zjistit více", "ButtonLibraryAccess": "Přístup ke knihovně", "ButtonManualLogin": "Manuální přihlášení", "ButtonMore": "Více", "ButtonNetwork": "Síť", - "ButtonNew": "Nové", "ButtonNextTrack": "Následující stopa", - "ButtonOff": "Vypnout", "ButtonOpen": "Otevřít", "ButtonParentalControl": "Rodičovská kontrola", "ButtonPause": "Pozastavit", - "ButtonPlay": "Přehrát", "ButtonPreviousTrack": "Předchozí stopa", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Rychlý průvodce", - "ButtonRefresh": "Obnovit", "ButtonRefreshGuideData": "Obnovit data programového průvodce", "ButtonRemove": "Odstranit", "ButtonRename": "Přejmenovat", - "ButtonRepeat": "Opakovat", "ButtonResetEasyPassword": "Obnovit easy pin kód", "ButtonResetPassword": "Obnovit heslo", "ButtonResume": "Pokračovat", "ButtonRevoke": "Odvolat", - "ButtonSave": "Uložit", - "ButtonSearch": "Hledání", "ButtonSelectDirectory": "Vybrat složku", "ButtonSelectServer": "Výběr serveru", "ButtonSelectView": "Výběr zobrazení", "ButtonSend": "Odeslat", "ButtonSettings": "Nastavení", - "ButtonShuffle": "Náhodně", "ButtonShutdown": "Vypnout", "ButtonSignIn": "Přihlásit se", "ButtonSignOut": "Odhlásit se", - "ButtonSort": "Seřadit", "ButtonStop": "Zastavit", "ButtonSubmit": "Potvrdit", - "ButtonSubtitles": "Titulky", "ButtonTrailer": "Upoutávka", "ButtonUninstall": "Odinstalovat", - "ButtonUp": "Zesílit", - "ButtonViewWebsite": "Přejít na webové stránky", "ButtonWebsite": "Webové stránky", "CancelRecording": "Zrušit nahrávání", "CancelSeries": "Ukončit Seriál", @@ -117,7 +89,7 @@ "Collections": "Kolekce", "CommunityRating": "Hodnocení komunity", "Composer": "Skladatel", - "ConfigureDateAdded": "Konfigurace přidání data je definována v nastavení knihovny na nástěnce serveru Jellyfin", + "ConfigureDateAdded": "Konfigurace přidání data je definována v nastavení knihovny na nástěnce", "ConfirmDeleteImage": "Odstranit obrázek?", "ConfirmDeleteItem": "Smazáním položky odstraníte soubor jak z knihovny médií tak ze souborového systému. Jste si jisti, že chcete pokračovat?", "ConfirmDeleteItems": "Odstraněním těchto položek odstraníte vaše média jak z knihovny médií, tak i ze souborového systému. Jste si jisti, že chcete pokračovat?", @@ -131,7 +103,7 @@ "DatePlayed": "Datum přehrání", "DeathDateValue": "Zemřel: {0}", "Default": "Výchozí", - "DefaultErrorMessage": "Došlo k chybě při zpracování požadavku. Prosím zkuste to znovu později.", + "ErrorDefault": "Došlo k chybě při zpracování požadavku. Prosím zkuste to znovu později.", "DefaultMetadataLangaugeDescription": "Toto jsou vaše výchozí hodnoty a lze je přizpůsobit na základě jednotlivých knihoven.", "DefaultSubtitlesHelp": "Titulky jsou načteny na základě výchozích a vynucených nastavení ve vložených metadatech. Jazykové preference jsou vzaty v úvahu, pokud je k dispozici více možností.", "Delete": "Odstranit", @@ -144,7 +116,7 @@ "Desktop": "PC", "DeviceAccessHelp": "Platí pouze pro zařízení, která mohou být jednoznačně identifikována. Těmto zařízením nebude bráněno v přístupu. Filtrování přístupu uživatelských zařízení bude bránit v užívání nových zařízení, dokud nebudou schváleny.", "DirectPlaying": "Přímé přehrání", - "DirectStreamHelp1": "Médium je kompatibilní se zařízením, pokud jde o rozlišení a typ média (H.264, AC3, atd.), ale je v nekompatibilním kontejneru (.mkv, .avi, .wmv, atd.). Video bude za běhu přebaleno, než bude streamováno do zařízení.", + "DirectStreamHelp1": "Médium je kompatibilní se zařízením, pokud jde o rozlišení a typ média (H.264, AC3, atd.), ale je v nekompatibilním kontejneru (.mkv, .avi, .wmv, atd.). Video bude za běhu přebaleno, než bude odesláno do zařízení.", "DirectStreaming": "Přímé streamování", "Director": "Režisér", "Disc": "Disk", @@ -163,7 +135,6 @@ "Edit": "Upravit", "EditImages": "Editovat obrázky", "EditSubtitles": "Editovat titulky", - "EnableBackdrops": "Povolit pozadí", "EnableBackdropsHelp": "Pokud je povoleno, pozadí je zobrazeno pro některé stránky při procházení vaší knihovny.", "EnableCinemaMode": "Režim Cinema", "EnableColorCodedBackgrounds": "Barevně označené pozadí", @@ -172,20 +143,18 @@ "EnableNextVideoInfoOverlay": "Zobrazit informaci o následujícím videu během přehrávání", "EnablePhotos": "Zobrazit fotky", "EnablePhotosHelp": "Obrázky budou detekovány a zobrazeny spolu s dalšími multimediálními soubory.", - "EnableThemeSongs": "Tématická hudba na pozadí", "EnableThemeSongsHelp": "Přehrát tématickou hudbu na pozadí při procházení knihovny.", - "EnableThemeVideos": "Tématická videa", "EnableThemeVideosHelp": "Přehrát tématické video na pozadí při procházení knihovny.", "Ended": "Ukončeno", "EndsAtValue": "Končí v {0}", "Episodes": "Epizody", "ErrorAddingListingsToSchedulesDirect": "Došlo k chybě při přidání sestavy do účtu vašeho Direct plánovače. Direct plánovač umožňuje pouze omezený počet sestav na účet. Možná se budete muset přihlásit do webových stránek Direct plánovače a před pokračováním odstranit ostatní výpisy ze svého účtu.", - "ErrorAddingMediaPathToVirtualFolder": "Při přidávání cesty k médiím došlo k chybě. Zkontrolujte zda je zadaná složka platná a zda má server Jellyfin k této složce přístup.", + "ErrorAddingMediaPathToVirtualFolder": "Při přidávání cesty k médiím došlo k chybě. Zkontrolujte zda je zadaná složka platná a zda má Jellyfin k této složce přístup.", "ErrorAddingTunerDevice": "Došlo k chybě při přidání zařízení tuneru. Prosím, ujistěte se, že je přístupný a zkuste to znovu.", "ErrorAddingXmlTvFile": "Nastala chyba při přístupu k XMLTV souboru. Ujistěte se, že soubor existuje a zkuste jej znovu otevřít.", - "ErrorDeletingItem": "Při odstranění položky ze serveru Jellyfin došlo k chybě. Zkontrolujte prosím, zda má server Jellyfin oprávnění k zápisu do složky médií, a zkuste to prosím znovu.", + "ErrorDeletingItem": "Při odstranění položky ze serveru došlo k chybě. Zkontrolujte prosím, zda má Jellyfin oprávnění k zápisu do složky médií, a zkuste to prosím znovu.", "ErrorGettingTvLineups": "Došlo k chybě při stahování TV sestav. Ujistěte se prosím, že zadané informace jsou správné a zkuste to znovu.", - "ErrorMessageStartHourGreaterThanEnd": "Čas ukončení musí být větší než čas startu.", + "ErrorStartHourGreaterThanEnd": "Čas ukončení musí být větší než čas startu.", "ErrorPleaseSelectLineup": "Vyberte prosím sestavu a zkuste to znovu. Pokud nejsou k dispozici žádné sestavy, zkontrolujte, zda je vaše uživatelské jméno, heslo a poštovní směrovací číslo správné.", "ErrorSavingTvProvider": "Při ukládání poskytovatele TV došlo k chybě. Prosím, ujistěte se, že je přístupný a zkuste to znovu.", "ExitFullscreen": "Opustit celou obrazovku", @@ -223,31 +192,24 @@ "HeaderActiveDevices": "Aktivní zařízení", "HeaderActiveRecordings": "Aktivní nahrávání", "HeaderActivity": "Aktivita", - "HeaderAddScheduledTaskTrigger": "Přidat Spouštěč", "HeaderAddToCollection": "Přidat do Kolekce", "HeaderAddToPlaylist": "Přidat do playlistu", "HeaderAddUpdateImage": "Přidat/aktualizovat obrázek", - "HeaderAddUser": "Přidat uživatele", "HeaderAdditionalParts": "Další součásti", "HeaderAdmin": "Administrátor", "HeaderAlbumArtists": "Umělci alba", - "HeaderAlbums": "Alba", "HeaderAlert": "Upozornění", "HeaderApiKey": "Klíč Api", "HeaderApiKeys": "Klíče API", - "HeaderApiKeysHelp": "Externí aplikace musí mít klíč k API, aby mohly komunikovat se serverem Jellyfin. Klíče jsou vydávány přihlášením k účtu Jellyfin nebo ruční žádostí o klíč.", + "HeaderApiKeysHelp": "Externí aplikace musí mít klíč k API, aby mohly komunikovat se serverem. Klíče jsou vydávány přihlášením k běžnému uživatelskému účtu nebo ruční žádostí o klíč.", "HeaderApp": "Aplikace", "HeaderAudioBooks": "Audio knihy", "HeaderAudioSettings": "Nastavení zvuku", - "HeaderAutomaticUpdates": "Automatické aktualizace", - "HeaderBooks": "Knihy", "HeaderBranding": "Branding", "HeaderCancelRecording": "Zrušit nahrávání", "HeaderCancelSeries": "Ukončit Seriál", "HeaderCastAndCrew": "Herci a obsazení", - "HeaderCastCrew": "Herci a obsazení", "HeaderChannelAccess": "Přístup ke kanálu", - "HeaderChannels": "Kanály", "HeaderCodecProfile": "Profil kodeků", "HeaderCodecProfileHelp": "Kodek profily označují omezení daného zařízení pro přehrávání pomocí specifických kodeků. Jestliže je omezení aplikováno, média budou překódovany i v případě, že kodek je nakonfigurován pro přímé přehrávání.", "HeaderConfirmPluginInstallation": "Potvrzení instalace zásuvného modulu", @@ -272,21 +234,15 @@ "HeaderDevices": "Zařízení", "HeaderDirectPlayProfile": "Profil Direct Play", "HeaderDirectPlayProfileHelp": "Přidat profil přímého přehrání pro definici formátů, které přístroj zvládne přehrávat nativně.", - "HeaderDisplay": "Zobrazení", "HeaderEasyPinCode": "Jednoduchý pin kód", "HeaderEditImages": "Editovat obrázky", "HeaderEnabledFields": "Povolené pole", "HeaderEnabledFieldsHelp": "Zrušte zaškrtnutí, abyste zabránily změnám dat.", - "HeaderEpisodes": "Epizody", "HeaderError": "Chyba", "HeaderFeatureAccess": "Přístup k funkcím", - "HeaderFeatures": "Funkce", "HeaderFetchImages": "Načíst obrázky:", - "HeaderFilters": "Filtry", "HeaderForKids": "Pro děti", - "HeaderForgotPassword": "Zapomenuté heslo", "HeaderFrequentlyPlayed": "Nejčastěji přehráváno", - "HeaderGenres": "Žánry", "HeaderGuideProviders": "Poskytovatelé programových průvodců", "HeaderHttpHeaders": "Http hlavičky", "HeaderIdentification": "Identifikace", @@ -296,7 +252,6 @@ "HeaderImageSettings": "Nastavení obrázků", "HeaderInstall": "Instalovat", "HeaderInstantMix": "Okamžité míchání", - "HeaderItems": "Položky", "HeaderKeepRecording": "Udržet nahrávání", "HeaderKeepSeries": "Udržet seriál", "HeaderLatestEpisodes": "Nejnovější díly", @@ -312,10 +267,8 @@ "HeaderLoginFailure": "Přihlášení selhalo", "HeaderMedia": "Média", "HeaderMediaFolders": "Složky médií", - "HeaderMediaInfo": "Informace o médiu", "HeaderMetadataSettings": "Nastavení metadat", "HeaderMoreLikeThis": "Podobné položky", - "HeaderMovies": "Filmy", "HeaderMusicQuality": "Kvalita hudby", "HeaderMusicVideos": "Hudební videa", "HeaderMyDevice": "Moje zařízení", @@ -323,7 +276,6 @@ "HeaderMyMediaSmall": "Moje média (malé)", "HeaderNewApiKey": "Nový klíč API", "HeaderNextEpisodePlayingInValue": "Přehrávání další epizody za {0}", - "HeaderNextUp": "Nadcházející", "HeaderNextVideoPlayingInValue": "Přehrávání dalšího videa za {0}", "HeaderOnNow": "Právě teď", "HeaderOtherItems": "Další položky", @@ -331,7 +283,6 @@ "HeaderPassword": "Heslo", "HeaderPasswordReset": "Obnova hesla", "HeaderPaths": "Cesty", - "HeaderPeople": "Lidé", "HeaderPinCodeReset": "Obnovit Pin kód", "HeaderPlayAll": "Přehrát vše", "HeaderPlayback": "Přehrání média", @@ -341,7 +292,7 @@ "HeaderPreferredMetadataLanguage": "Preferovaný jazyk metadat", "HeaderProfile": "Profil", "HeaderProfileInformation": "Informace o profilu", - "HeaderProfileServerSettingsHelp": "Tyto hodnoty určují, jak se server Jellyfin bude zobrazovat v zařízení.", + "HeaderProfileServerSettingsHelp": "Tyto hodnoty určují, jak se server bude zobrazovat klientům.", "HeaderRecentlyPlayed": "Naposledy přehráváno", "HeaderRecordingOptions": "Nastavení nahrávání", "HeaderRecordingPostProcessing": "Následné zpracování nahrávek", @@ -353,25 +304,22 @@ "HeaderRevisionHistory": "Historie verzí", "HeaderRunningTasks": "Běžící úlohy", "HeaderScenes": "Scény", - "HeaderSchedule": "Naplánování úlohy", "HeaderSeasons": "Sezóny", "HeaderSecondsValue": "{0} sekund", "HeaderSelectCertificatePath": "Vyber cestu k certifikátu", "HeaderSelectMetadataPath": "Vyberte cestu k metadatům", - "HeaderSelectMetadataPathHelp": "Výběr nebo zadání cesty, kde chcete uložit metadata. Složka musí být zapisovatelná.", + "HeaderSelectMetadataPathHelp": "Procházejte nebo zadejte cestu, kde chcete uložit metadata. Složka musí být zapisovatelná.", "HeaderSelectPath": "Vybrat složku", "HeaderSelectServer": "Vyber Server", "HeaderSelectServerCachePath": "Vyber složku pro vyrovnávací paměť serveru", "HeaderSelectServerCachePathHelp": "Vyberte nebo zadejte složku vyrovnávací paměti souborů. Složka musí být zapisovatelná.", "HeaderSelectTranscodingPath": "Zvolte dočasnou složku pro překódovávání médií", - "HeaderSelectTranscodingPathHelp": "Vyberte nebo zadejte složku pro dočasné soubory překódování. Složka musí být zapisovatelná.", + "HeaderSelectTranscodingPathHelp": "Vyberte nebo zadejte složku pro soubory překódování. Složka musí být zapisovatelná.", "HeaderSendMessage": "Poslat zprávu", - "HeaderSeries": "Seriál", "HeaderSeriesOptions": "Nastavení seriálu", "HeaderServerSettings": "Nastavení serveru", "HeaderSettings": "Nastavení", "HeaderSetupLibrary": "Nastavení Vašich knihoven médií", - "HeaderShutdown": "Vypnout", "HeaderSortBy": "Třídit dle", "HeaderSortOrder": "Pořadí třídění", "HeaderSpecialEpisodeInfo": "Infromace o speciální epizodě", @@ -383,7 +331,6 @@ "HeaderSubtitleProfiles": "Profily titulků", "HeaderSubtitleProfilesHelp": "Profily titulků popisují formáty titulků, které daná zařízení podporují.", "HeaderSystemDlnaProfiles": "Systémové profily", - "HeaderTags": "Tagy", "HeaderTaskTriggers": "Spouštěče úloh", "HeaderThisUserIsCurrentlyDisabled": "Tento uživatel je aktuálně zakázán", "HeaderTracks": "Stopy", @@ -403,15 +350,14 @@ "HeaderXmlDocumentAttributes": "Atributy XML dokumentu", "HeaderXmlSettings": "Nastavení XML", "HeaderYears": "Roky", - "HeadersFolders": "Složky", "Help": "Nápověda", "Hide": "Skrýt", "HideWatchedContentFromLatestMedia": "Skrýt přehrané položky ze seznamu nejnovějších médií", "Home": "Domů", "Identify": "Identifikovat", "Images": "Obrázky", - "ImportFavoriteChannelsHelp": "Pokud je povoleno, jen kanály označené jako oblíbené budou importována na zařízení tuneru.", - "ImportMissingEpisodesHelp": "Informace o chybějících epizodách budou importovány do databáze Jellyfin a zobrazí se u sezón a seriálů. Skenování knihovny se tím může značně prodloužit.", + "ImportFavoriteChannelsHelp": "Jen kanály označené jako oblíbené na zařízení tuneru budou importovány.", + "ImportMissingEpisodesHelp": "Informace o chybějících epizodách budou importovány do databáze a zobrazí se u sezón a seriálů. Skenování knihovny se tím může značně prodloužit.", "InstallingPackage": "Instalace {0} (Verze {1})", "InstantMix": "Okamžité míchání", "ItemCount": "{0} položek", @@ -434,21 +380,17 @@ "LabelAlbumArtMaxWidthHelp": "Maximální rozlišení alb nabízených prostřednictvím upnp:albumArtURI.", "LabelAlbumArtPN": "Alba PN:", "LabelAlbumArtists": "Alba umělce:", - "LabelAll": "Vše", "LabelAllowHWTranscoding": "Povolit hardwarové překódování", - "LabelAllowServerAutoRestart": "Povolit automatický restart serveru pro provedení aktualizace", - "LabelAllowServerAutoRestartHelp": "Server bude restartován pouze v době nečinnosti, pokud nejsou aktivní žádní uživatelé.", "LabelAppName": "Název aplikace", "LabelAppNameExample": "Příklad: Sickbeard, Sonarr", "LabelArtists": "Umělci:", - "LabelArtistsHelp": "Odděl pomocí ;", - "LabelAudio": "Zvuk", + "LabelArtistsHelp": "Více interpretů se odděluje pomocí středníku.", "LabelAudioLanguagePreference": "Preferovaný jazyk zvuku:", "LabelBindToLocalNetworkAddress": "Vázat na místní síťovou adresu:", - "LabelBindToLocalNetworkAddressHelp": "Volitelné. Změní místní IP adresu, na kterou se váže server HTTP. Pokud je ponecháno prázdné, server bude svázán se všemi dostupnými adresami. Změna této hodnoty vyžaduje restartování serveru Jellyfin.", + "LabelBindToLocalNetworkAddressHelp": "Změní místní IP adresu serveru HTTP. Pokud je ponecháno prázdné, server bude svázán se všemi dostupnými adresami. Změna této hodnoty vyžaduje restartování.", "LabelBirthDate": "Datum narození:", "LabelBirthYear": "Rok narození:", - "LabelBlastMessageInterval": "Doba zobrazení zprávy (v sekundách)", + "LabelBlastMessageInterval": "Doba zobrazení zprávy", "LabelBlastMessageIntervalHelp": "Určuje dobu trvání v sekundách mezi zobrazením aktuálních zpráv.", "LabelCachePath": "Složka pro cache:", "LabelCachePathHelp": "Zadejte vlastní umístění pro serverové dočasné soubory, jako jsou obrázky. Ponechte prázdné, pokud chcete použít výchozí nastavení serveru.", @@ -461,11 +403,9 @@ "LabelCriticRating": "Hodnocení kritiků:", "LabelCurrentPassword": "Aktuální heslo:", "LabelCustomCss": "Vlastní CSS:", - "LabelCustomCssHelp": "Aplikovat vaše vlastní styly do webového rozhraní.", - "LabelCustomDeviceDisplayName": "Jméno pro zobrazení:", + "LabelCustomCssHelp": "Aplikovat vaše vlastní styly webového rozhraní.", "LabelCustomDeviceDisplayNameHelp": "Nahradit vlastním názvem zobrazení nebo ponechte prázdné, aby název byl určen zařízením.", "LabelCustomRating": "Vlastní hodnocení:", - "LabelDashboardTheme": "Téma nástěnky serveru:", "LabelDateAdded": "Datum přidání:", "LabelDateAddedBehavior": "Nový obsah řadit dle data:", "LabelDateAddedBehaviorHelp": "Pokud je hodnota metadat přítomna, bude vždy použita před některou z těchto možností.", @@ -478,7 +418,6 @@ "LabelDiscNumber": "Číslo disku:", "LabelDisplayLanguage": "Jazyk rozhraní:", "LabelDisplayLanguageHelp": "Překlad projektu Jellyfin se neustále vyvíjí.", - "LabelDisplayMissingEpisodesWithinSeasons": "Zobrazit chybějící epizody", "LabelDisplayMode": "Režim zobrazení:", "LabelDisplayName": "Zobrazované jméno:", "LabelDisplayOrder": "Pořadí zobrazení:", @@ -495,16 +434,16 @@ "LabelEnableAutomaticPortMapHelp": "Automaticky zpřístupní port na vašem routeru pomocí technologie UPnP. Nemusí fungovat u některých routerů. Změny se projeví až po restartování serveru.", "LabelEnableBlastAliveMessages": "Vytroubit zprávu do světa", "LabelEnableBlastAliveMessagesHelp": "Tuto možnost povolte, pokud není server zjistitelný jinými UPnP zařízeními v síti.", - "LabelEnableDlnaClientDiscoveryInterval": "Čas pro vyhledání klienta (sekund)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Určuje interval mezi vyhledáváním SSDP, které Jellyfin provádí.", + "LabelEnableDlnaClientDiscoveryInterval": "Interval pro vyhledání klienta", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Určuje interval mezi vyhledáváním SSDP.", "LabelEnableDlnaDebugLogging": "Povolit DLNA protokolování (pro ladění)", "LabelEnableDlnaDebugLoggingHelp": "Vytváří velké soubory se záznamy a doporučuje se používat pouze pro potřeby odstraňování problémů.", "LabelEnableDlnaPlayTo": "Povolit DLNA přehrávání", - "LabelEnableDlnaPlayToHelp": "Umí detekovat zařízení v rámci vaší sítě a nabízí možnost jeho dálkového ovládání.", + "LabelEnableDlnaPlayToHelp": "Umí detekovat zařízení v rámci vaší sítě a nabízí možnost jejich dálkového ovládání.", "LabelEnableDlnaServer": "Povolit DLNA server", "LabelEnableDlnaServerHelp": "Umožňuje zařízením UPnP v síti procházet a přehrávat obsah.", "LabelEnableRealtimeMonitor": "Povolit sledování v reálném čase", - "LabelEnableRealtimeMonitorHelp": "Změny budou zpracovány okamžitě, v podporovaných souborových systémech.", + "LabelEnableRealtimeMonitorHelp": "V podporovaných souborových systémech budou změny zpracovány okamžitě.", "LabelEnableSingleImageInDidlLimit": "Limit na jednotlivé vložení obrázku", "LabelEnableSingleImageInDidlLimitHelp": "Některá zařízení nebudou videa zobrazovat správně, pokud je více obrazů uloženo v DIDL.", "LabelEndDate": "Datum ukončení:", @@ -521,14 +460,14 @@ "LabelFormat": "Formát:", "LabelFriendlyName": "Přívětivý název:", "LabelGroupMoviesIntoCollections": "Seskupit filmy do kolekcí", - "LabelGroupMoviesIntoCollectionsHelp": "Při zobrazení seznamů filmu, budou filmy patřící do kolekce, zobrazeny jako jedna položka.", + "LabelGroupMoviesIntoCollectionsHelp": "Při zobrazení seznamu filmů budou filmy v kolekci zobrazeny jako jedna položka.", "LabelH264Crf": "H264 kódování CRF:", "LabelEncoderPreset": "Přednastavení H264 kódování:", "LabelHardwareAccelerationType": "Hardwarová akcelerace:", "LabelHardwareAccelerationTypeHelp": "Hardwarová akcelerace vyžaduje další konfiguraci.", "LabelHomeScreenSectionValue": "Sekce domovské obrazovky {0}:", "LabelHttpsPort": "Lokální HTTPS port:", - "LabelHttpsPortHelp": "Číslo portu TCP, ke kterému by se měl HTTPS server Jellyfin připojit.", + "LabelHttpsPortHelp": "Číslo portu TCP serveru HTTPS.", "LabelIconMaxHeight": "Maximální výška ikon:", "LabelIconMaxHeightHelp": "Maximální rozlišení ikon nabízené prostřednictvím upnp:icon.", "LabelIconMaxWidth": "Maximální šířka ikon:", @@ -552,7 +491,7 @@ "LabelLanguage": "Jazyk:", "LabelLineup": "V pořadí:", "LabelLocalHttpServerPortNumber": "Lokální HTTP port:", - "LabelLocalHttpServerPortNumberHelp": "Číslo portu TCP, ke kterému by se měl HTTP server Jellyfin připojit.", + "LabelLocalHttpServerPortNumberHelp": "Číslo portu TCP HTTP serveru.", "LabelLockItemToPreventChanges": "Uzamknout položku pro zabránění budoucích změn", "LabelLoginDisclaimer": "Zřeknutí se zodpovědnosti při přihlášení:", "LabelLoginDisclaimerHelp": "Zpráva, která se zobrazí v dolní části přihlašovací stránky.", @@ -576,7 +515,7 @@ "LabelMetadataReaders": "Čtečky metadat:", "LabelMetadataReadersHelp": "Seřaďte své preferované lokální zdroje metadat dle priority. První nalezená data budou načtena.", "LabelMetadataSavers": "Střadatelé metadat:", - "LabelMetadataSaversHelp": "Vyberte formáty souborů pro uložení metadat.", + "LabelMetadataSaversHelp": "Vyberte formáty souborů, které chcete použít pro ukládání metadat.", "LabelMethod": "Metoda:", "LabelMinBackdropDownloadWidth": "Maximální šířka pro stažení pozadí:", "LabelMinResumeDuration": "Minimální doba trvání:", @@ -592,7 +531,7 @@ "LabelMovieCategories": "Filmové kategorie:", "LabelMoviePrefix": "Předpona filmu:", "LabelMoviePrefixHelp": "Pokud je v názvech filmů použita předpona, zadejte ji sem, aby ji server mohl správně zpracovat.", - "LabelMovieRecordingPath": "Složka pro nahrávání filmů (volitelné):", + "LabelMovieRecordingPath": "Umístění pro nahrávání filmů:", "LabelMusicStreamingTranscodingBitrate": "Datový tok pro překódování hudby:", "LabelMusicStreamingTranscodingBitrateHelp": "Zadejte maximální datový tok pro streamování hudby.", "LabelName": "Jméno:", @@ -600,12 +539,11 @@ "LabelNewPassword": "Nové heslo:", "LabelNewPasswordConfirm": "Potvrzení hesla:", "LabelNewsCategories": "Nové kategorie:", - "LabelNext": "Další", "LabelNotificationEnabled": "Povolit toto oznámení", "LabelNumber": "Číslo:", "LabelNumberOfGuideDays": "Počet dnů programového průvodce ke stažení:", "LabelNumberOfGuideDaysHelp": "Stažení více dnů televizního průvodce umožňuje naplánovat nahrávání na delší dobu dopředu, ale trvá déle. Automatické nastavení určí počet podle počtu kanálů.", - "LabelOptionalNetworkPath": "(Nepovinné) Sdílená síťová složka:", + "LabelOptionalNetworkPath": "Sdílená síťová složka:", "LabelOriginalAspectRatio": "Původní poměr stran:", "LabelOriginalTitle": "Originální název:", "LabelOverview": "Přehled:", @@ -622,9 +560,7 @@ "LabelPostProcessorArguments": "Argumenty příkazové řádky pro následné zpracování:", "LabelPostProcessorArgumentsHelp": "Použij {path} jako cestu k nahrávanému souboru.", "LabelPreferredDisplayLanguage": "Preferovaný jazyk zobrazení:", - "LabelPreferredDisplayLanguageHelp": "Překlad projektu Jellyfin se neustále vyvíjí.", "LabelPreferredSubtitleLanguage": "Preferovaný jazyk titulků:", - "LabelPrevious": "Předchozí", "LabelProfileAudioCodecs": "Audio kodeky:", "LabelProfileCodecs": "Kodeky:", "LabelProfileCodecsHelp": "Odděl čárkou. Pokud ponecháte prázdné, aplikují se všechny kodeky.", @@ -638,14 +574,13 @@ "LabelPublicHttpPortHelp": "Číslo veřejného portu, které by mělo být mapováno na místní port HTTP.", "LabelPublicHttpsPort": "Veřejný HTTPS port:", "LabelPublicHttpsPortHelp": "Číslo veřejného portu, které by mělo být mapováno na místní port HTTPS.", - "LabelReadHowYouCanContribute": "Zjistěte, jak můžete přispět.", "LabelRecord": "Záznam:", "LabelRecordingPath": "Standardní složka pro nahrávání:", "LabelRecordingPathHelp": "Určete výchozí umístění pro uložení nahrávky. Pokud je ponecháno prázdné, budou použity složky programu na serveru (data).", "LabelRefreshMode": "Mód obnovy:", "LabelReleaseDate": "Datum vydání:", "LabelRemoteClientBitrateLimit": "Datový tok streamování do Internetu (Mbps):", - "LabelRuntimeMinutes": "Délka (v minutách):", + "LabelRuntimeMinutes": "Délka:", "LabelSaveLocalMetadata": "Uložit přebaly a metadata do složky s médii", "LabelSaveLocalMetadataHelp": "Povolíte-li uložení přebalů a metadat do složky s médii bude možné je jednoduše upravovat.", "LabelScheduledTaskLastRan": "Poslední spuštění {0}, zabralo {1}.", @@ -657,7 +592,7 @@ "LabelSelectVersionToInstall": "Vyber verzi k instalaci:", "LabelSendNotificationToUsers": "Odeslat oznámení pro:", "LabelSerialNumber": "Sériové číslo", - "LabelSeriesRecordingPath": "Složka pro nahrávání seriálů (volitelné):", + "LabelSeriesRecordingPath": "Umístění pro nahrávání seriálů:", "LabelServerHostHelp": "192.168.1.100:8096 nebo https://mujserver.cz", "LabelSkipBackLength": "Délka posunu zpět:", "LabelSkipForwardLength": "Délka posunu vpřed:", @@ -668,7 +603,6 @@ "LabelSonyAggregationFlags": "Agregační příznaky Sony:", "LabelSonyAggregationFlagsHelp": "Určuje obsah prvku aggregationFlags ve jmenném prostoru urn:schemas-sonycom:av.", "LabelSortTitle": "Třídit dle názvu:", - "LabelSoundEffects": "Zvukové efekty:", "LabelSource": "Zdroj:", "LabelSportsCategories": "Sportovní kategorie:", "LabelStartWhenPossible": "Začít jakmile je to možné:", @@ -677,7 +611,6 @@ "LabelStopping": "Zastavování", "LabelSubtitleFormatHelp": "Příklad: srt", "LabelSubtitlePlaybackMode": "Mód titulků:", - "LabelSubtitles": "Titulky", "LabelSupportedMediaTypes": "Podporované typy médií:", "LabelTagline": "Slogan:", "LabelTextBackgroundColor": "Barva pozadí textu:", @@ -688,12 +621,9 @@ "LabelTimeLimitHours": "Časový limit (v hodinách):", "LabelTitle": "Název:", "LabelTrackNumber": "Číslo stopy:", - "LabelTranscodingAudioCodec": "Audio kodek:", - "LabelTranscodingContainer": "Obal:", "LabelTranscodingTempPathHelp": "Určete vlastní cestu pro překódované soubory odesílané klientům. Chcete-li použít výchozí nastavení serveru, ponechte pole prázdné.", "LabelTranscodingThreadCount": "Počet vláken pro překódování:", "LabelTranscodingThreadCountHelp": "Zadejte maximální počet vláken pro překódování. Snížením počtu vláken se sníží využití procesoru, ale převod nemusí být dostatečně rychlý pro plynulé přehrávání.", - "LabelTranscodingVideoCodec": "Video kodek:", "LabelTriggerType": "Typ úkolu:", "LabelTunerIpAddress": "IP adresa tuneru:", "LabelTunerType": "Typ tuneru:", @@ -713,11 +643,10 @@ "LabelXDlnaDoc": "Dokumentace X-DLNA:", "LabelXDlnaDocHelp": "Určuje obsah prvku X_DLNADOC ve jmenném prostoru urn:schemas-dlna-org:device-1-0.", "LabelYear": "Rok:", - "LabelYourFirstName": "Vaše jméno:", "LabelYoureDone": "Hotovo!", "LabelZipCode": "PSČ:", "LabelffmpegPath": "FFmpeg - cesta:", - "LabelffmpegPathHelp": "Cesta k souboru aplikace ffmpeg, nebo složka obsahující aplikaci ffmpeg.", + "LabelffmpegPathHelp": "Cesta k souboru aplikace ffmpeg nebo složka obsahující aplikaci ffmpeg.", "Large": "Velký", "LatestFromLibrary": "Nejnovější {0}", "LearnHowYouCanContribute": "Zjistěte, jak můžete přispět.", @@ -763,19 +692,18 @@ "MessageConfirmProfileDeletion": "Jste si jisti, že chcete smazat tento profil?", "MessageConfirmRecordingCancellation": "Zrušit nahrávání?", "MessageConfirmRemoveMediaLocation": "Jste si jist, že chcete odstranit toto umístění?", - "MessageConfirmRestart": "Opravdu chcete restartovat server Jellyfin?", - "MessageConfirmRevokeApiKey": "Opravdu chcete zrušit tento klíč k API? Připojení dané aplikace k serveru Jellyfin bude náhle ukončeno.", + "MessageConfirmRestart": "Opravdu chcete restartovat Jellyfin?", + "MessageConfirmRevokeApiKey": "Opravdu chcete zrušit tento klíč k API? Připojení dané aplikace k tomuto serveru bude náhle ukončeno.", "MessageConfirmShutdown": "Jste si jisti, že chcete server vypnout?", "MessageContactAdminToResetPassword": "Kontaktujte, prosím, vašeho systémového administrátora k obnovení vašeho hesla.", "MessageCreateAccountAt": "Vytvořit účet v {0}", "MessageDeleteTaskTrigger": "Opravdu si přejete odebrat spouštění úlohy?", - "MessageDirectoryPickerBSDInstruction": "V operačním systému FreeBSD či FreeNAS může být nutné nakonfigurovat úložiště přímo pomocí izolační funkce jail, aby k němu měl Jellyfin přístup.", + "MessageDirectoryPickerBSDInstruction": "U BSD může být potřeba nakonfigurovat úložiště přímo pomocí izolační funkce jail v FreeNAS, aby měl Jellyfin přístup k vašim médiím.", "MessageDirectoryPickerLinuxInstruction": "Pro systémy Linux jako Arch Linux, CentOS, Debian, Fedora, OpenSUSE nebo Ubuntu musíte udělit uživateli služby oprávnění alespoň pro čtení.", "MessageDownloadQueued": "Stažení zařazeno.", "MessageFileReadError": "Došlo k chybě při čtení souboru. Prosím zkuste to znovu.", "MessageForgotPasswordFileCreated": "Následující soubor byl vytvořen na serveru a obsahuje pokyny, jak postupovat:", "MessageForgotPasswordInNetworkRequired": "Zkuste to prosím znovu uvnitř vaší domácí sítě pro zahájení procesu resetování hesla.", - "MessageInstallPluginFromApp": "Tento plugin musí být nainstalován z aplikace, kterou chcete použít.", "MessageInvalidForgotPasswordPin": "Neplatné zadání pin kódu. Prosím, zkuste to znovu.", "MessageInvalidUser": "Neplatné uživatelské jméno nebo heslo. Zkuste znovu.", "MessageItemSaved": "Položka uložena.", @@ -790,15 +718,14 @@ "MessagePlayAccessRestricted": "Přehrávání tohoto obsahu je aktuálně omezeno. Další informace získáte od správce serveru.", "MessagePleaseEnsureInternetMetadata": "Prosím zkontrolujte, zda máte povoleno stahování metadat z internetu.", "MessagePluginConfigurationRequiresLocalAccess": "Pro konfiguraci zásuvného modulu se přihlaste přímo na lokální server.", - "MessagePluginInstallDisclaimer": "Zásuvné moduly vytvořené členy komunity Jellyfin jsou skvělým způsobem, jak si zlepšit prožitek z používání projektu Jellyfin. Před instalací se prosím seznamte se všemi dopady, které mohou doplňky mít na server Jellyfin, např.: pomalejší skenování knihovny, další zpracování na pozadí nebo snížení stability systému.", + "MessagePluginInstallDisclaimer": "Zásuvné moduly vytvořené členy komunity jsou skvělým způsobem, jak si zlepšit prožitek pomocí dalších funkcí. Před instalací se prosím seznamte se všemi dopady, které mohou doplňky na server mít, např.: pomalejší skenování knihovny, delší zpracování na pozadí nebo snížená stabilita systému.", "MessageReenableUser": "Viz níže pro znovuzapnutí", - "MessageSettingsSaved": "Nastavení uloženo.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Z vaší knihovny budou odstraněny následující zdroje médií:", "MessageUnableToConnectToServer": "Nejsme schopni se připojit k vybranému serveru právě teď. Prosím, ujistěte se, že je spuštěn a zkuste to znovu.", "MessageUnsetContentHelp": "Obsah je zobrazen pomocí prostých složek. Pro dosažení nejlepších výsledků pomocí správce metadat nastavte typy obsahu pod-složek.", "MessageYouHaveVersionInstalled": "V současné době máte instalovánu verzi {0}.", "MetadataManager": "Manažer metadat", - "MetadataSettingChangeHelp": "Změna nastavení metadat bude mít vliv na nový obsah, který bude přidáván. Chcete-li aktualizovat stávající obsah, otevřte obrazovku s detailem a klepněte na tlačítko Aktualizovat, nebo proveďte hromadnou aktualizaci pomocí správce metadat.", + "MetadataSettingChangeHelp": "Změna nastavení metadat bude mít vliv na obsah, který bude nově přidán v budoucnu. Chcete-li aktualizovat stávající obsah, otevřete obrazovku s podrobnostmi a klikněte na tlačítko Aktualizovat, nebo proveďte hromadnou aktualizaci pomocí správce metadat.", "MinutesAfter": "minut po", "MinutesBefore": "minut předem", "Mobile": "Mobilní", @@ -819,10 +746,9 @@ "News": "Zpravodajství", "Next": "Další", "No": "Ne", - "NoNextUpItemsMessage": "Nic nenalezeno. Začněte sledovat Vaše oblíbené seriály!", - "NoPluginConfigurationMessage": "Tento zásuvný modul nemá žádné nastavení.", + "MessageNoNextUpItems": "Nic nenalezeno. Začněte sledovat Vaše oblíbené seriály!", + "MessageNoPluginConfiguration": "Tento zásuvný modul nemá žádné nastavení.", "NoSubtitleSearchResultsFound": "Žádné výsledky.", - "NoSubtitles": "Žádné", "NoSubtitlesHelp": "Ve výchozím nastavení nebudou titulky načteny. Během přehrávání však mohou být manuálně zapnuty.", "None": "Žádný", "Normal": "Normální", @@ -850,9 +776,8 @@ "OptionArtist": "Umělec", "OptionAscending": "Vzestupně", "OptionAuto": "Automaticky", - "OptionAutomatic": "Automaticky", "OptionAutomaticallyGroupSeries": "Automatické sloučení k seriálu, které jsou ve více složkách", - "OptionAutomaticallyGroupSeriesHelp": "Pokud je povoleno, budou díly seriálu uložené ve více adresářích v této knihovně, automaticky sloučeny k jednomu seriálu.", + "OptionAutomaticallyGroupSeriesHelp": "Seriály uložené ve více složkách v této knihovně budou automaticky sloučeny do jednoho seriálu.", "OptionBlockBooks": "Knihy", "OptionBlockChannelContent": "Obsah internetového kanálu", "OptionBlockLiveTvChannels": "Televizní kanály", @@ -871,7 +796,7 @@ "OptionDatePlayed": "Datum přehrání", "OptionDescending": "Sestupně", "OptionDisableUser": "Zablokovat tohoto uživatele", - "OptionDisableUserHelp": "Pokud není povoleno, server nedovolí tomuto uživateli žádné připojení. Existující připojení bude okamžitě přerušeno.", + "OptionDisableUserHelp": "Server nedovolí tomuto uživateli žádné připojení. Existující připojení bude okamžitě přerušeno.", "OptionDislikes": "Nelíbí se", "OptionDisplayFolderView": "Zobrazit složku s originálním zobrazením složek médií", "OptionDisplayFolderViewHelp": "Zobrazte složky vedle vašich ostatních knihoven médií. To může být užitečné, pokud si přejete mít prosté zobrazení složky.", @@ -879,7 +804,7 @@ "OptionDownloadBackImage": "Zadek", "OptionDownloadDiscImage": "Disk", "OptionDownloadImagesInAdvance": "Stáhnout obrázky pokročilejším způsobem", - "OptionDownloadImagesInAdvanceHelp": "Ve výchozím nastavení se většina obrázků stahuje pouze na žádost aplikace Jellyfin. Povolením této možnosti dojde ke stažení všech obrázků předem současně s importem nových médií. Může způsobit výrazně delší skenování knihoven.", + "OptionDownloadImagesInAdvanceHelp": "Ve výchozím nastavení se většina obrázků stahuje pouze na žádost klienta. Povolením této možnosti dojde ke stažení všech obrázků předem současně s importem nových médií. Může způsobit výrazně delší skenování knihoven.", "OptionDownloadMenuImage": "Nabídka", "OptionDownloadPrimaryImage": "Primární", "OptionDownloadThumbImage": "Miniatura", @@ -900,7 +825,6 @@ "OptionExternallyDownloaded": "Externí stažení", "OptionExtractChapterImage": "Povolit extrakci obrázků z videa", "OptionFavorite": "Oblíbené", - "OptionFriday": "Pátek", "OptionHasSpecialFeatures": "Speciální funkce", "OptionHasSubtitles": "Titulky", "OptionHasThemeSong": "Tematická hudba", @@ -911,21 +835,19 @@ "OptionHlsSegmentedSubtitles": "Segmentované titulky HLS", "OptionHomeVideos": "Fotky", "OptionIgnoreTranscodeByteRangeRequests": "Ignorovat požadavky na překódování rozsahy bajtů", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Pokud je povoleno, budou tyto žádosti nadále plněny, ale budou ignorovány hlavičky bytových rozsahů.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Tyto žádosti budou nadále plněny, ale budou ignorovány hlavičky bajtových rozsahů.", "OptionImdbRating": "Hodnocení IMDb", "OptionLikes": "Líbí se", "OptionMissingEpisode": "Chybějící episody", - "OptionMonday": "Pondělí", "OptionNameSort": "Název", "OptionNew": "Nový…", "OptionNone": "Žádný", - "OptionOnAppStartup": "Při spuštění aplikace", "OptionOnInterval": "V intervalu", "OptionParentalRating": "Rodičovské hodnocení", "OptionPlainStorageFolders": "Zobrazit všechny složky jako obyčejné složky pro ukládání", - "OptionPlainStorageFoldersHelp": "Je-li povoleno, všechny složky jsou zastoupeny v DIDL jako \"object.container.storageFolder\" místo specifičtějšího typu, jako je například \"object.container.person.musicArtist\".", + "OptionPlainStorageFoldersHelp": "Všechny složky jsou prezentovány v DIDL jako \"object.container.storageFolder\" místo konkrétnějšího typu, například \"object.container.person.musicArtist\".", "OptionPlainVideoItems": "Zobrazit všechna videa jako s obyčejné video položky", - "OptionPlainVideoItemsHelp": "Je-li povoleno, všechna videa jsou prezentovány v DIDL jako \"object.item.videoItem\" místo specifičtějšího typu, jako je například \"object.item.videoItem.movie\".", + "OptionPlainVideoItemsHelp": "Všechna videa jsou prezentována v DIDL jako \"object.item.videoItem\" místo konkrétnějšího typu, například \"object.item.videoItem.movie\".", "OptionPlayCount": "Počet přehrání", "OptionPlayed": "Shlédnuto", "OptionPremiereDate": "Datum premiéry", @@ -938,20 +860,15 @@ "OptionResElement": "Prvek \"res\"", "OptionResumable": "Pozastavavitelný", "OptionRuntime": "Délka", - "OptionSaturday": "Sobota", "OptionSaveMetadataAsHidden": "Ukládat metadata a obrázky jako skryté soubory", - "OptionSaveMetadataAsHiddenHelp": "Změna se projeví u všech nově uložených metadat. Existující soubory metadat se aktualizují při příštím uložení serverem Jellyfin.", + "OptionSaveMetadataAsHiddenHelp": "Změna se projeví u všech nově uložených metadat. Existující soubory metadat se aktualizují při příštím uložení serverem.", "OptionSpecialEpisode": "Speciální", "OptionSubstring": "subřetězec", - "OptionSunday": "Neděle", - "OptionThursday": "Čtvrtek", "OptionTrackName": "Název skladby", - "OptionTuesday": "Úterý", "OptionTvdbRating": "Tvdb hodnocení", "OptionUnairedEpisode": "Neodvysílané epizody", "OptionUnplayed": "Neshlédnuto", "OptionWakeFromSleep": "Probuzení ze spánku", - "OptionWednesday": "Středa", "OptionWeekdays": "Pracovní dny", "OptionWeekends": "Víkendy", "OptionWeekly": "Týdenní", @@ -964,7 +881,7 @@ "PasswordMatchError": "Heslo a potvrzení hesla musí souhlasit.", "PasswordResetComplete": "Heslo bylo obnoveno.", "PasswordResetConfirmation": "Jste si jisti, že chcete obnovit heslo?", - "PasswordResetHeader": "Obnovit heslo", + "HeaderResetPassword": "Obnovit heslo", "PasswordSaved": "Heslo uloženo.", "People": "Lidé", "PerfectMatch": "Přesná shoda", @@ -985,7 +902,7 @@ "PleaseAddAtLeastOneFolder": "Přidejte prosím nejméně jednu složku do této knihovny pomocí tlačítka Přidat.", "PleaseConfirmPluginInstallation": "Pro potvrzení, že jste si přečetli text výše a chcete pokračovat v instalaci zásuvných modulů, klikněte na tlačítko OK.", "PleaseEnterNameOrId": "Prosím, zadejte název nebo externí Id.", - "PleaseRestartServerName": "Prosím restartuje server Jellyfin - {0}.", + "PleaseRestartServerName": "Prosím restartuje Jellyfin na serveru {0}.", "PleaseSelectTwoItems": "Vyberte nejméně dvě položky prosím.", "Premiere": "Premiéra", "Premieres": "Premiéry", @@ -995,7 +912,6 @@ "ProductionLocations": "Místo výroby", "Programs": "Programy", "Quality": "Kvalita", - "QueueAllFromHere": "Zařadit vše do fronty", "RecentlyWatched": "Nedávno shlédnuté", "RecommendationBecauseYouLike": "Protože se vám líbí {0}", "RecommendationBecauseYouWatched": "Protože jste sledovali {0}", @@ -1004,11 +920,11 @@ "Record": "Nahrávat", "RecordSeries": "Nahrát série", "RecordingCancelled": "Nahrávání zrušeno.", - "RecordingPathChangeMessage": "Změna záznamové složky automaticky nepřesune stávající záznamy ze starého umístění do nového. Budete muset přesunout ručně, pokud je to žádoucí.", + "MessageChangeRecordingPath": "Změna záznamové složky automaticky nepřesune stávající záznamy ze starého umístění do nového. Budete muset přesunout ručně, pokud je to žádoucí.", "RecordingScheduled": "Plán nahrávání.", "Recordings": "Nahrávky", "Refresh": "Obnovit", - "RefreshDialogHelp": "Metadata se aktualizují na základě nastavení a internetových služeb, které jsou povoleny na nástěnce serveru Jellyfin.", + "RefreshDialogHelp": "Metadata se aktualizují na základě nastavení a internetových služeb, které jsou povoleny na nástěnce.", "RefreshMetadata": "Obnovit metadata", "RefreshQueued": "Obnovení zařazeno.", "ReleaseDate": "Datum vydání", @@ -1024,7 +940,6 @@ "ReplaceExistingImages": "Nahradit existující obrázky", "ResumeAt": "Obnovit přehrávání od {0}", "Rewind": "Přetočit zpět", - "RunAtStartup": "Spustit po startu", "Runtime": "Délka", "Saturday": "Sobota", "Save": "Uložit", @@ -1043,9 +958,9 @@ "SeriesRecordingScheduled": "Plán nahrávání seriálu.", "SeriesSettings": "Nastavení seriálu", "SeriesYearToPresent": "{0} - Současnost", - "ServerNameIsRestarting": "Server Jellyfin - {0} se restartuje.", - "ServerNameIsShuttingDown": "Server Jellyfin - {0} se vypíná.", - "ServerUpdateNeeded": "Tento server Jellyfin je nutné aktualizovat. Chcete-li stáhnout nejnovější verzi, navštivte prosím {0}", + "ServerNameIsRestarting": "Server {0} se restartuje.", + "ServerNameIsShuttingDown": "Server {0} se vypíná.", + "ServerUpdateNeeded": "Tento server je nutné aktualizovat. Chcete-li stáhnout nejnovější verzi, navštivte prosím {0}", "Settings": "Nastavení", "SettingsSaved": "Nastavení uloženo.", "SettingsWarning": "Změna těchto hodnot může způsobit nestabilitu nebo selhání připojení. Pokud narazíte na nějaké problémy, doporučujeme jej změnit zpět na výchozí hodnotu.", @@ -1072,52 +987,27 @@ "SystemDlnaProfilesHelp": "Systémové profily jsou jen pro čtení. Chcete-li přepsat profil systému, vytvořit vlastní profil zaměřený na stejné zařízení.", "TabAccess": "Přístup", "TabAdvanced": "Pokročilé", - "TabAlbumArtists": "Umělci alba", - "TabAlbums": "Alba", - "TabArtists": "Umělec", "TabCatalog": "Katalog", - "TabChannels": "Kanály", "TabCodecs": "Kodeky", - "TabCollections": "Kolekce", "TabContainers": "Obaly", "TabDashboard": "Nástěnka", - "TabDevices": "Zařízení", - "TabDisplay": "Zobrazení", - "TabEpisodes": "Epizody", - "TabFavorites": "Oblíbené", - "TabGenres": "Žánry", - "TabGuide": "Programový průvodce", "TabLatest": "Nejnovější", "TabLogs": "Záznamy", - "TabMovies": "Filmy", "TabMusic": "Hudba", - "TabMusicVideos": "Hudební videa", "TabMyPlugins": "Moje zásuvné moduly", "TabNetworks": "Stanice", "TabNfoSettings": "NFO nastavení", "TabNotifications": "Oznámení", "TabOther": "Další", "TabParentalControl": "Rodičovská kontrola", - "TabPassword": "Heslo", - "TabPlayback": "Přehrávání", - "TabPlaylists": "Playlisty", "TabPlugins": "Zásuvné moduly", "TabProfile": "Profil", "TabProfiles": "Profily", - "TabRecordings": "Nahrané", "TabResponses": "Odpovědi", - "TabResumeSettings": "Obnovit", "TabScheduledTasks": "Naplánované úlohy", - "TabSeries": "Série", "TabSettings": "Nastavení", - "TabShows": "Seriály", - "TabSongs": "Skladby", "TabStreaming": "Streamování", - "TabSuggestions": "Návrhy", - "TabTrailers": "Upoutávky", - "TabTranscoding": "Překódování", "TabUpcoming": "Nadcházející", - "TabUsers": "Uživatelé", "Tags": "Tagy", "TellUsAboutYourself": "Řekněte nám něco o sobě", "TheseSettingsAffectSubtitlesOnThisDevice": "Tato nastavení ovlivní titulky na tomto zařízení", @@ -1131,7 +1021,7 @@ "Transcoding": "Překódování", "Tuesday": "Úterý", "UninstallPluginConfirmation": "Jste si jisti, že chcete odinstalovat {0}?", - "UninstallPluginHeader": "Odinstalovat zásuvný modul", + "HeaderUninstallPlugin": "Odinstalovat zásuvný modul", "Unmute": "Povolit zvuk", "Unrated": "Nehodnoceno", "Up": "Nahoru", @@ -1181,12 +1071,11 @@ "AllowMediaConversionHelp": "Povolit nebo zakázat přístup k funkci konverze médií.", "AllowOnTheFlySubtitleExtraction": "Povolit extrahování titulků za běhu", "AllowOnTheFlySubtitleExtractionHelp": "Vložené titulky je možné vytáhnout z videa a dodat klientům v textové podobě, aby nebylo nutné video překódovat. Na některých systémech to může trvat dlouho a způsobit zasekávání videa. Pokud tuto funkci vypnete a klientské zařízení vložené titulky nepodporuje, při překódování budou vypáleny přímo do obrazu.", - "AllowRemoteAccess": "Povolit vzdálené připojení k tomuto serveru Jellyfin.", + "AllowRemoteAccess": "Povolit vzdálené připojení k tomuto serveru.", "AllowRemoteAccessHelp": "Pokud není zapnuto, všechna vzdálená připojení budou blokována.", "AllowedRemoteAddressesHelp": "Seznam IP adres nebo síťových masek oddělených čárkou pro sítě, ze kterých se lze vzdáleně připojit. Pokud necháte prázdné, všechny adresy budou povoleny.", "AnyLanguage": "Jakýkoli jazyk", "Ascending": "Vzestupně", - "AutoBasedOnLanguageSetting": "Automaticky (na základě jazykového nastavení)", "Banner": "Výřez plakátu", "Blacklist": "Zakázat vše kromě výjimek", "Browse": "Procházet", @@ -1205,7 +1094,7 @@ "Depressed": "Vytlačené", "Descending": "Klesající", "DetectingDevices": "Hledání zařízení", - "DirectStreamHelp2": "Přímé streamování souboru používá velmi malý výkon bez ztráty kvality videa.", + "DirectStreamHelp2": "Přímé streamování souboru vyžaduje velmi malý výkon téměř bez ztráty kvality videa.", "Directors": "Režiséři", "Disabled": "Vypnuto", "DisplayInMyMedia": "Zobrazit na domovské obrazovce", @@ -1237,9 +1126,7 @@ "HeaderFavoriteVideos": "Oblíbená videa", "HeaderFetcherSettings": "Nastavení načítání", "HeaderImageOptions": "Volby obrázku", - "HeaderKodiMetadataHelp": "Chcete-li povolit nebo zakázat Nfo metadata, upravte nastavení knihovny v sekci ukládání metadat.", - "HeaderLiveTV": "Televize", - "HeaderLiveTv": "Televize", + "HeaderKodiMetadataHelp": "Chcete-li povolit nebo zakázat metadata v souborech NFO, upravte nastavení knihovny v sekci ukládání metadat.", "HeaderLiveTvTunerSetup": "Nastavení televizního tuneru", "HeaderNewDevices": "Nové zařízení", "HeaderPhotoAlbums": "Fotoalba", @@ -1275,14 +1162,13 @@ "LabelLanNetworks": "Sítě LAN:", "LabelMaxStreamingBitrate": "Maximální kvalita streamování:", "LabelMetadata": "Metadata:", - "LabelOptionalNetworkPathHelp": "Pokud je tato složka sdílena ve vaší síti, zadání cesty ke sdílené složce umožní aplikacím Jellyfin na jiných zařízeních přímý přístup k souborům s médii. Například {0} nebo {1}.", + "LabelOptionalNetworkPathHelp": "Pokud je tato složka sdílena ve vaší síti, zadání cesty ke sdílené složce umožní klientům na jiných zařízeních přímý přístup k souborům s médii. Například {0} nebo {1}.", "LabelPersonRole": "Úloha:", "LabelPlaylist": "Playlist:", "LabelReasonForTranscoding": "Důvod pro překódování:", "LabelRemoteClientBitrateLimitHelp": "Volitelný limit datového toku pro všechna síťová zařízení. To je užitečné, aby se zabránilo požadavkům na vyšší přenosovou rychlost než zvládne vaše připojení k internetu. To může mít za následek zvýšení zátěže procesoru, aby bylo možné převádět videa za běhu na nižší datový tok.", "LabelServerHost": "Host:", "LabelSimultaneousConnectionLimit": "Limit současně běžících streamů:", - "LabelSkin": "Vzhled:", "LabelSortBy": "Řadit podle:", "LabelSortOrder": "Pořadí řazení:", "LabelSpecialSeasonsDisplayName": "Zobrazovaný název pro zvláštní sezónu:", @@ -1296,16 +1182,14 @@ "LabelVideo": "Video", "LabelVideoCodec": "Video kodek:", "LeaveBlankToNotSetAPassword": "Můžete ponechat prázdné pro nastavení bez hesla.", - "LinksValue": "Odkazy: {0}", "LiveTV": "Televize", "Logo": "Logo", "ManageLibrary": "Spravovat knihovnu", "MediaInfoDefault": "Výchozí", - "MediaInfoSoftware": "Software", "MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeData": "Data", "MediaInfoStreamTypeVideo": "Video", - "AuthProviderHelp": "Vyberte poskytovatele ověřování, který bude použit k ověření hesla tohoto uživatele.", + "AuthProviderHelp": "Vyberte poskytovatele ověření, který bude použit k ověření hesla tohoto uživatele.", "HeaderFavoriteMovies": "Oblíbená videa", "HeaderFavoriteShows": "Oblíbené seriály", "HeaderFavoriteEpisodes": "Oblíbené epizody", @@ -1313,7 +1197,7 @@ "HeaderFavoriteArtists": "Oblíbení interpreti", "HeaderFavoriteSongs": "Oblíbená hudba", "LabelAuthProvider": "Poskytovatel ověření:", - "LabelServerNameHelp": "Tento název bude použit k identifikaci serveru a bude výchozí pro název počítače serveru.", + "LabelServerNameHelp": "Tento název bude použit k identifikaci serveru a ve výchozím nastavení bude použit název hostitele serveru.", "LabelPasswordResetProvider": "Poskytovatel obnovy hesla:", "LabelServerName": "Název serveru:", "LabelTranscodePath": "Cesta pro překódování:", @@ -1339,7 +1223,7 @@ "OnlyImageFormats": "Pouze obrazové formáty (VOBSUB, PGS, SUB, atd.)", "Option3D": "3D", "OptionAlbum": "Album", - "OptionAllowMediaPlaybackTranscodingHelp": "Omezení přístupu k překódování může způsobit selhání přehrávání v aplikacích Jellyfin kvůli nepodporovaným formátům médií.", + "OptionAllowMediaPlaybackTranscodingHelp": "Omezení přístupu k překódování může způsobit selhání přehrávání v klientech kvůli nepodporovaným formátům médií.", "OptionAllowSyncTranscoding": "Povolit stahování a synchronizaci médií, které vyžaduje překódování", "OptionBluray": "Blu-ray", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", @@ -1357,8 +1241,8 @@ "OptionProtocolHls": "Přímý přenos z internetu", "OptionProtocolHttp": "HTTP", "OptionRequirePerfectSubtitleMatchHelp": "Vyžadování dokonalé shody filtruje titulky tak, aby obsahovaly pouze ty, které byly testovány a ověřeny s vaším přesným videosouborem. Zrušení zaškrtnutí tohoto políčka zvýší pravděpodobnost stahování titulků, ale zvýší pravděpodobnost chybného nebo nesprávného textu titulků.", - "PasswordResetProviderHelp": "Zvolte poskytovatele resetování hesla, který bude použit, když tento uživatel o něj požádá", - "PluginInstalledMessage": "Zásuvný modul byl úspěšně nainstalován. Server Jellyfin bude nutné restartovat, aby se změny projevily.", + "PasswordResetProviderHelp": "Zvolte poskytovatele resetování hesla, který bude použit při žádosti tohoto uživatele o resetování hesla.", + "MessagePluginInstalled": "Zásuvný modul byl úspěšně nainstalován. Server bude nutné restartovat, aby se změny projevily.", "PreferEmbeddedTitlesOverFileNames": "Preferovat vložené názvy nad názvy souborů", "PreferEmbeddedTitlesOverFileNamesHelp": "Toto určuje výchozí název zobrazení, pokud nejsou k dispozici žádná metadata z internetu nebo místní metadata.", "Raised": "Vystupující", @@ -1367,7 +1251,7 @@ "SaveSubtitlesIntoMediaFoldersHelp": "Ukládání titulků vedle video souborů umožní jejich snadnější správu.", "ScanLibrary": "Skenovat knihovnu", "SeriesDisplayOrderHelp": "Seřadit epizody podle data vysílání, pořadí DVD nebo absolutního číslování.", - "ServerRestartNeededAfterPluginInstall": "Server Jellyfin bude nutné po instalaci zásuvného modulu restartovat.", + "ServerRestartNeededAfterPluginInstall": "Jellyfin bude nutné po instalaci zásuvného modulu restartovat.", "ShowAdvancedSettings": "Zobrazit rozšířená nastavení", "ShowTitle": "Zobrazit název", "ShowYear": "Zobrazit rok", @@ -1380,10 +1264,6 @@ "SubtitleDownloadersHelp": "Povolte a zařaďte preferované stahovače titulků v pořadí podle priority.", "TV": "TV", "TabDirectPlay": "Přímé přehrávání", - "TabInfo": "Info", - "TabLiveTV": "Televize", - "TabMetadata": "Metadata", - "TabPlaylist": "Playlist", "TabServer": "Server", "TagsValue": "Tagy: {0}", "ThemeSongs": "Tematická hudba", @@ -1397,14 +1277,10 @@ "ValueOneAlbum": "1 album", "ValueOneSong": "1 skladba", "Vertical": "Svisle", - "VideoRange": "Rozsah videa", "ViewPlaybackInfo": "Zobrazení informací o přehrávání", "Whitelist": "Povolit vše kromě výjimek", - "HeaderHome": "Domů", "DashboardOperatingSystem": "Operační systém: {0}", "DashboardArchitecture": "Architektura: {0}", - "LaunchWebAppOnStartup": "Spustit webové rozhraní po spustění serveru", - "LaunchWebAppOnStartupHelp": "Otevře se webový klient ve vašem výchozím webovém prohlížeči, když server se spustí. K tomu nedochází při použití funkce restartování serveru.", "MessageNoServersAvailable": "Pomocí automatického zjišťování nebyly nalezeny žádné servery.", "OptionBanner": "Banner", "OptionList": "Seznam", @@ -1446,7 +1322,6 @@ "HeaderNavigation": "Navigace", "ButtonSplit": "Rozdělit", "MessageConfirmAppExit": "Přejete si odejít?", - "CopyStreamURLError": "Při kopírování URL došlo k chybě.", "LabelVideoResolution": "Rozlišení videa:", "LabelStreamType": "Typ streamu:", "LabelPlayerDimensions": "Zobrazené rozlišení:", @@ -1460,11 +1335,9 @@ "BoxSet": "Sbírka", "Track": "Stopa", "Season": "Sezóna", - "ReleaseGroup": "Vydavatel", "PreferEmbeddedEpisodeInfosOverFileNames": "Preferovat vloženou informaci o epizodě před názvem souboru", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Používat informaci o epizodě z vložených metadat, pokud jsou k dispozici.", "Person": "Osoba", - "OtherArtist": "Ostatní interpreti", "Movie": "Film", "Episode": "Epizoda", "ClientSettings": "Nastavení klienta", @@ -1479,7 +1352,7 @@ "DailyAt": "Denně v {0}", "PersonRole": "{0}", "ListPaging": "{0}-{1} ze {2}", - "WriteAccessRequired": "Server Jellyfin vyžaduje oprávnění pro zápis do této složky. Zkontrolujte oprávnění a zkuste to znovu.", + "WriteAccessRequired": "Jellyfin vyžaduje oprávnění pro zápis do této složky. Zkontrolujte oprávnění a zkuste to znovu.", "PathNotFound": "Cesta nebyla nalezena. Zkontrolujte, zda je platná a zkuste to znovu.", "WeeklyAt": "V {0} v {1}", "LastSeen": "Naposledy zobrazené {0}", @@ -1490,23 +1363,19 @@ "LabelDeinterlaceMethod": "Metoda odstranění prokládání:", "DeinterlaceMethodHelp": "Vyberte metodu odstranění prokládání obrazu při překódování obsahu.", "UnsupportedPlayback": "Jellyfin nedokáže dešifrovat obsah chráněný Správou digitálních práv (DRM), ale pokusí se zobrazit veškerý obsah, včetně toho chráněného. Některé soubory se nemusí vůbec zobrazit kvůli šifrování nebo jiným nepodporovaným funkcím, např.: interaktivním názvům.", - "MessageUnauthorizedUser": "Momentálně nemáte oprávnění k přístupu na server. Další informace získáte od správce serveru.", "Filter": "Filtr", "New": "Nové", "ButtonTogglePlaylist": "Playlist", - "ButtonToggleContextMenu": "Více", - "LabelNightly": "Aktualizace každou noc", "LabelStable": "Stabilní", "LabelChromecastVersion": "Verze Chromecastu", "ApiKeysCaption": "Seznam povolených API klíčů", - "LabelEnableHttpsHelp": "Umožní serveru naslouchat na určeném portu HTTPS. K fungování je nutné nakonfigurovat i platný certifikát.", + "LabelEnableHttpsHelp": "Naslouchání na uvedeném portu HTTPS. K fungování je nutné nakonfigurovat i platný certifikát.", "LabelEnableHttps": "Povolit HTTPS", "HeaderServerAddressSettings": "Nastavení adresy serveru", "HeaderRemoteAccessSettings": "Nastavení vzdáleného přístupu", "HeaderHttpsSettings": "Nastavení HTTPS", "LabelRequireHttpsHelp": "Server automaticky přesměruje všechny požadavky z HTTP na HTTPS. Pokud server nenaslouchá na portu HTTPS, tato funkce nemá žádný účinek.", "LabelRequireHttps": "Vyžadovat HTTPS", - "TabDVR": "Nahrávání", "HeaderDVR": "Nahrávání", "SaveChanges": "Uložit změny", "LabelSyncPlayPlaybackDiff": "Rozdíl v době přehrávání:", @@ -1543,8 +1412,8 @@ "EnableDetailsBanner": "Obrázek detailu", "ShowMore": "Zobrazit více", "ShowLess": "Zobrazit méně", - "EnableBlurhashHelp": "Nenačtené obrázky budou zobrazeny pomocí neurčitých zástupných obrázků", - "EnableBlurhash": "Povolit zástupné obrázky", + "EnableBlurHashHelp": "Obrázky, které se ještě načítají, budou zobrazeny pomocí jedinečných zástupných obrázků.", + "EnableBlurHash": "Povolit zástupné obrázky", "ButtonCast": "Přehrát v zařízení", "ButtonSyncPlay": "SyncPlay", "MessageNoGenresAvailable": "Povolit některým poskytovatelům metadat stahovat informace o žánrech z Internetu.", @@ -1567,5 +1436,11 @@ "ViewAlbumArtist": "Zobrazit interpreta alba", "PreviousTrack": "Předchozí", "NextTrack": "Další", - "LabelUnstable": "Nestabilní" + "LabelUnstable": "Nestabilní", + "Preview": "Náhled", + "SubtitleVerticalPositionHelp": "Číslo řádku, na kterém se zobrazí text. Kladná čísla znamenají směr shora dolů. Záporná čísla zdola nahoru.", + "LabelSubtitleVerticalPosition": "Svislé umístění:", + "MessageGetInstalledPluginsError": "Při načítání seznamu nainstalovaných zásuvných modulů došlo k chybě.", + "MessagePluginInstallError": "Při instalaci zásuvného modulu došlo k chybě.", + "PlaybackRate": "Rychlost přehrávání" } diff --git a/src/strings/da.json b/src/strings/da.json index 9965294f4c..e097d93dd2 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -1,7 +1,6 @@ { "Actor": "Skuespiller", "Add": "Tilføj", - "AddItemToCollectionHelp": "Tilføj emner til samlinger ved at fremsøge dem, og herefter ved højre klik eller tap-menu at tilføje dem til samlinger.", "AddToCollection": "Tilføj til samling", "AddToPlayQueue": "Tilføj til afspilningskø", "AddToPlaylist": "Tilføj til afspilningsliste", @@ -24,81 +23,55 @@ "AroundTime": "Omkring {0}", "AsManyAsPossible": "Så mange som muligt", "AspectRatio": "Billedformat", - "AttributeNew": "Ny", "Audio": "Lyd", "BirthDateValue": "Født: {0}", "BirthLocation": "Fødselslokation", "BirthPlaceValue": "Fødselssted: {0}", "BookLibraryHelp": "Lyd- og tekstbøger er understøttet. Se {0}guiden til navngivning af bøger{1}.", "Browse": "Gennemse", - "BrowsePluginCatalogMessage": "Gennemse vores plugin-katalog for at se tilgængelige plugins.", - "ButtonAdd": "Tilføj", + "MessageBrowsePluginCatalog": "Gennemse vores plugin-katalog for at se tilgængelige plugins.", "ButtonAddMediaLibrary": "Tilføj Mediebibliotek", "ButtonAddScheduledTaskTrigger": "Tilføj udløser", "ButtonAddServer": "Tilføj Server", "ButtonAddUser": "Tilføj bruger", - "ButtonArrowDown": "Ned", "ButtonArrowLeft": "Venstre", "ButtonArrowRight": "Højre", - "ButtonArrowUp": "Op", "ButtonAudioTracks": "Lysspor", "ButtonBack": "Tilbage", "ButtonCancel": "Annuller", "ButtonChangeServer": "Skift server", - "ButtonConnect": "Forbind", - "ButtonDelete": "Slet", - "ButtonDeleteImage": "Slet billede", - "ButtonDown": "Ned", - "ButtonDownload": "Hent", - "ButtonEdit": "Rediger", - "ButtonEditImages": "Rediger billeder", "ButtonEditOtherUserPreferences": "Rediger denne brugers profil, billede og personlige indstillinger.", "ButtonForgotPassword": "Glemt Adgangskode", "ButtonFullscreen": "Fuld skærm", "ButtonGotIt": "Forstået", - "ButtonHelp": "Hjælp", - "ButtonHome": "Hjem", - "ButtonLearnMore": "Lær mere", "ButtonLibraryAccess": "Biblioteksadgang", "ButtonManualLogin": "Manuel Login", "ButtonMore": "Mere", "ButtonNetwork": "Netværk", - "ButtonNew": "Ny", "ButtonNextTrack": "Næste spor", - "ButtonOff": "Fra", "ButtonOpen": "Åben", "ButtonParentalControl": "Forældrekontrol", - "ButtonPlay": "Afspil", "ButtonPreviousTrack": "Forrige spor", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Hurtig-start guide", - "ButtonRefresh": "Opdater", "ButtonRefreshGuideData": "Opdater Guide data", "ButtonRemove": "Fjern", "ButtonRename": "Omdøb", - "ButtonRepeat": "Gentag", "ButtonResetEasyPassword": "Nulstil pinkode", "ButtonResetPassword": "Nulstil adgangskode", "ButtonRestart": "Genstart", "ButtonResume": "Genoptag", "ButtonRevoke": "Invalider", - "ButtonSave": "Gem", "ButtonScanAllLibraries": "Skan Alle Biblioteker", - "ButtonSearch": "Søg", "ButtonSelectDirectory": "Vælg mappe", "ButtonSelectServer": "Vælg server", "ButtonSelectView": "Vælg visning", "ButtonSettings": "Indstillinger", - "ButtonShuffle": "Bland", "ButtonShutdown": "Luk", "ButtonSignIn": "Log Ind", "ButtonSignOut": "Log ud", - "ButtonSort": "Sortér", "ButtonSubmit": "Indsend", - "ButtonSubtitles": "Undertekster", "ButtonUninstall": "Afinstaller", - "ButtonUp": "Op", - "ButtonViewWebsite": "Besøg hjemmeside", "ButtonWebsite": "Hjemmeside", "CancelRecording": "Annuller optagelse", "CancelSeries": "Annuller serie", @@ -119,7 +92,7 @@ "Continuing": "Forsættes", "CustomDlnaProfilesHelp": "Lav brugerdefinerede profiler til nye enheder eller for at overstyre en systemprofil.", "DeathDateValue": "Dødsdato: {0}", - "DefaultErrorMessage": "Det opstod en fejl ved behandlingen af forespørgslen. Prøv igen senere.", + "ErrorDefault": "Det opstod en fejl ved behandlingen af forespørgslen. Prøv igen senere.", "DefaultMetadataLangaugeDescription": "Dette er dine standarder og kan brugerdefineres på per-biblioteks basis.", "Delete": "Slet", "DeleteDeviceConfirmation": "Er du sikker på du ønsker at slette denne enhed? Den vil dukke op igen næste gang en bruger logger ind med den.", @@ -154,7 +127,7 @@ "ErrorAddingTunerDevice": "Der opstod en fejl under tilføjelse af tuner-enhed. Kontroller venligst at den er tilgængelig og prøv igen.", "ErrorAddingXmlTvFile": "Der opstod en fejl under tilgang til XMLTV-filen. Kontroller venligst at filen findes og prøv igen.", "ErrorGettingTvLineups": "Der opstod en fejl under download af TV-opstillinger. Kontroller venligst at dine informationer er korrekte og prøv igen.", - "ErrorMessageStartHourGreaterThanEnd": "Slut tid skal være større end start tid.", + "ErrorStartHourGreaterThanEnd": "Slut tid skal være større end start tid.", "ErrorPleaseSelectLineup": "Vælg venligst en opstilling og prøv igen. Hvis ingen opstillinger er tilgængelige, så kontroller venligst at dit brugernavn, adgangskode og postnummer er korrekt.", "ErrorSavingTvProvider": "Der opstod en fejl i forsøget på at gemme udbyder. Kontroller venligst at den er tilgængelig og prøv igen.", "EveryNDays": "Hver {0} dage", @@ -189,11 +162,9 @@ "HeaderActiveDevices": "Aktive enheder", "HeaderActiveRecordings": "Aktive optagelser", "HeaderActivity": "Aktivitet", - "HeaderAddScheduledTaskTrigger": "Tilføj udløser", "HeaderAddToCollection": "Tilføj til samling", "HeaderAddToPlaylist": "Tilføj til afspilningsliste", "HeaderAddUpdateImage": "Tilføj/opdater billede", - "HeaderAddUser": "Tilføj bruger", "HeaderAdditionalParts": "Andre stier", "HeaderAlert": "Advarsel", "HeaderAllowMediaDeletionFrom": "Tillad Media Sletning Fra", @@ -201,15 +172,11 @@ "HeaderApiKeys": "API Nøgler", "HeaderApiKeysHelp": "Eksterne applikationer skal have en API-nøgle for at kunne kommunikere med Jellyfin. Nøgler udstedes ved at logge ind med en Jellyfin konto, eller ved manuelt at tildele applikationen en nøgle.", "HeaderAudioSettings": "Lydindstillinger", - "HeaderAutomaticUpdates": "Automatiske opdateringer", "HeaderBlockItemsWithNoRating": "Klokér titler uden eller med ukendt bedømmelses information:", - "HeaderBooks": "Bøger", "HeaderCancelRecording": "Annuller Optagelse", "HeaderCancelSeries": "Annuller Serie", "HeaderCastAndCrew": "Medvirkende", - "HeaderCastCrew": "Medvirkende", "HeaderChannelAccess": "Adgang til kanaler", - "HeaderChannels": "Kanaler", "HeaderChapterImages": "Kapitel Billeder", "HeaderCodecProfile": "Codec profil", "HeaderCodecProfileHelp": "Codec profiler angiver begrænsninger på en enhed for et specifikt codec. Hvis en begrænsning nås, vil indholdet blive transkodet, selv om codec'et er angivet til direkte afspilning.", @@ -236,23 +203,17 @@ "HeaderDevices": "Enheder", "HeaderDirectPlayProfile": "Profil for direkte afspilning", "HeaderDirectPlayProfileHelp": "Tilføj profiler for direkte afspilning for at angive hvilke formater enheden selv kan håndtere.", - "HeaderDisplay": "Visning", "HeaderEasyPinCode": "Nem pinkode", "HeaderEditImages": "Rediger billeder", "HeaderEnabledFields": "Aktivér Felter", "HeaderEnabledFieldsHelp": "Fjern fluebenet fra et felt for at låse det og forhindre dets data fra at blive ændret.", - "HeaderEpisodes": "Episoder", "HeaderError": "Fejl", "HeaderExternalIds": "Eksterne ID'er:", "HeaderFeatureAccess": "Adgang til funktioner", - "HeaderFeatures": "Egenskaber", "HeaderFetchImages": "Hent billeder:", "HeaderFetcherSettings": "Henter indstillinger", - "HeaderFilters": "Filtre", "HeaderForKids": "For Børn", - "HeaderForgotPassword": "Glemt adgangskode", "HeaderFrequentlyPlayed": "Ofte afspillet", - "HeaderGenres": "Genrer", "HeaderGuideProviders": "Guide Udbydere", "HeaderHttpHeaders": "HTTP Headers", "HeaderIdentification": "Identifikation", @@ -263,7 +224,6 @@ "HeaderImageSettings": "Billedindstillinger", "HeaderInstall": "Installer", "HeaderInstantMix": "Øjeblikkelig Mix", - "HeaderItems": "Element", "HeaderKeepRecording": "Bevar Optagelse", "HeaderKeepSeries": "Bevar Serie", "HeaderKodiMetadataHelp": "For at aktivere eller deaktivere NFO-metadata skal du redigere et bibliotek i Jellyfin-biblioteksopsætningen og finde afsnittet om metadata.", @@ -280,23 +240,19 @@ "HeaderLoginFailure": "Login fejl", "HeaderMedia": "Medier", "HeaderMediaFolders": "Mediemapper", - "HeaderMediaInfo": "Medieinformation", "HeaderMetadataSettings": "Indstillinger for metadata", "HeaderMoreLikeThis": "Mere Som Denne", - "HeaderMovies": "Film", "HeaderMusicVideos": "Musikvideoer", "HeaderMyDevice": "Min Enhed", "HeaderMyMedia": "Mine medier", "HeaderNewApiKey": "Ny API Nøgle", "HeaderNewDevices": "Nye Enheder", - "HeaderNextUp": "Næste", "HeaderOnNow": "Vises Nu", "HeaderOtherItems": "Andre elementer", "HeaderParentalRatings": "Aldersgrænser", "HeaderPassword": "Adgangskode", "HeaderPasswordReset": "Nulstil adgangskode", "HeaderPaths": "Stier", - "HeaderPeople": "Mennesker", "HeaderPinCodeReset": "Nulstil pinkode", "HeaderPlayAll": "Afspil Alle", "HeaderPlayback": "Medieafspilning", @@ -319,7 +275,6 @@ "HeaderRevisionHistory": "Revisionshistorik", "HeaderRunningTasks": "Kørende opgaver", "HeaderScenes": "Scener", - "HeaderSchedule": "Skema", "HeaderSeasons": "Sæsoner", "HeaderSelectCertificatePath": "Vælg certifikatsti", "HeaderSelectMetadataPath": "Vælg Metadata Path", @@ -331,12 +286,10 @@ "HeaderSelectTranscodingPath": "Vælg \"Transcoding Temporary Path\"", "HeaderSelectTranscodingPathHelp": "Vælg eller indtast stien som skal benyttes til midlertidige transkodningsfiler. Mappen må ikke være skrivebeskyttet.", "HeaderSendMessage": "Send besked", - "HeaderSeries": "Series", "HeaderSeriesOptions": "Serieindstillinger", "HeaderServerSettings": "Serverindstillinger", "HeaderSettings": "Indstillinger", "HeaderSetupLibrary": "Opsæt dine mediebiblioteker", - "HeaderShutdown": "Luk", "HeaderSortBy": "Sorter Efter", "HeaderSortOrder": "Sorteringsorden", "HeaderSpecialEpisodeInfo": "Information om specialepisoder", @@ -365,7 +318,6 @@ "HeaderXmlDocumentAttributes": "XML dokumentattributter", "HeaderXmlSettings": "XML indstillinger", "HeaderYears": "År", - "HeadersFolders": "Mapper", "Help": "Hjælp", "HttpsRequiresCert": "For at aktivere sikre forbindelser, skal du angive et betroet SSL certifikat, såsom Let's Encrypt. Venligst angiv et certifikat eller deaktiver sikre forbindelser.", "Identify": "Identificer", @@ -393,10 +345,7 @@ "LabelAlbumArtMaxWidthHelp": "Maksimumopløsningen på album billede der bliver vist med upnp:albumArtURI.", "LabelAlbumArtPN": "Album billede PN:", "LabelAlbumArtists": "Albumartister:", - "LabelAll": "Alle", "LabelAllowHWTranscoding": "Tillad hardware-omkodning", - "LabelAllowServerAutoRestart": "Tillad serveren at genstarte automatisk for at påføre opdateringer", - "LabelAllowServerAutoRestartHelp": "Serveren vil kun genstarte i inaktive perioder, når ingen brugere er aktive.", "LabelAllowedRemoteAddresses": "Fjernadgang IP adresse filter:", "LabelAllowedRemoteAddressesMode": "Fjernadgang IP adresse filter mode:", "LabelAppName": "App navn", @@ -425,7 +374,6 @@ "LabelCustomCertificatePathHelp": "Sti til PKCS #12 fil indeholdende et certifikat og privat nøgle for at aktivere TLS understøttelse på et brugerdefineret domæne.", "LabelCustomCss": "Brugerdefineret CSS:", "LabelCustomCssHelp": "Anvend din egen stil til webinterfacet.", - "LabelCustomDeviceDisplayName": "Visningsnavn:", "LabelCustomDeviceDisplayNameHelp": "Angiv en brugerdefineret navn. hvis der ikke angives et navn, bruges det navn enheden sender.", "LabelCustomRating": "Brugerdefineret bedømmelse:", "LabelDateAdded": "Dato for tilføjelse:", @@ -438,7 +386,6 @@ "LabelDeviceDescription": "Beskrivelse af enhed", "LabelDidlMode": "DIDL tilstand:", "LabelDiscNumber": "Disk-nummer:", - "LabelDisplayMissingEpisodesWithinSeasons": "Vis manglende episoder i sæsoner", "LabelDisplayName": "Visningsnavn:", "LabelDisplayOrder": "Visningsorden:", "LabelDisplaySpecialsWithinSeasons": "Vis specialepisoder sammen med den sæson de blev sent i", @@ -556,7 +503,6 @@ "LabelNewPassword": "Ny kode:", "LabelNewPasswordConfirm": "Gentag ny adgangskode:", "LabelNewsCategories": "Nyhedskategorier:", - "LabelNext": "Næste", "LabelNotificationEnabled": "Aktiver denne underretning", "LabelNumber": "Nummer:", "LabelNumberOfGuideDays": "Antal dage af programguide data der skal hentes:", @@ -581,8 +527,6 @@ "LabelPostProcessorArguments": "Kommandolinjeargumenter til efterbehandler:", "LabelPostProcessorArgumentsHelp": "Benyt {path} som stien til optagelsesfilen.", "LabelPreferredDisplayLanguage": "Foretrukket sprog til visning:", - "LabelPreferredDisplayLanguageHelp": "Oversættelse af Jellyfin er et løbende projekt.", - "LabelPrevious": "Forrige", "LabelProfileAudioCodecs": "Lyd codecs:", "LabelProfileCodecsHelp": "Adskil med komma. Kan efterlades tom for at gælde for alle codecs.", "LabelProfileContainersHelp": "Adskil med komma. Kan efterlades tom for at gælde for alle containere.", @@ -593,7 +537,6 @@ "LabelPublicHttpPortHelp": "Det offentlige portnummer som bliver knyttet til det lokale HTTP-portnummer.", "LabelPublicHttpsPort": "Offentligt HTTPS portnummer:", "LabelPublicHttpsPortHelp": "Det offentlige portnummer som bliver knyttet til det lokale HTTPS portnummer.", - "LabelReadHowYouCanContribute": "Lær hvordan du kan bidrage.", "LabelRecord": "Optag:", "LabelRecordingPath": "Standard afspilningssti:", "LabelRecordingPathHelp": "Angiv standard-lokationen til at gemme afspilninger. Hvis efterladt blankt, benyttes serverens programdata-mappe.", @@ -635,7 +578,6 @@ "LabelTimeLimitHours": "Tidsgrænse (timer):", "LabelTitle": "Titel:", "LabelTrackNumber": "Spor nummer:", - "LabelTranscodingAudioCodec": "Lyd codec:", "LabelTranscodingTempPathHelp": "Definér en bugerdefineret sti til transkodede filer til klienter. Lad den stå tom for at bruge standardmappen i serverens datamappe.", "LabelTranscodingThreadCount": "Antal af omkodningstråde:", "LabelTranscodingThreadCountHelp": "Vælg det maksimale antal af tråde der bruges under transcoding. Reduktion af antallet af tråde sænker CPU-forbrug, men resulterer muligvis i at konverteringer ikke foregår hurtigt nok til en jævn afspilning.", @@ -657,7 +599,6 @@ "LabelVersionInstalled": "{0} installeret", "LabelXDlnaCapHelp": "Angiver indholdet i X_DLNACAP elementet i urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDocHelp": "Angiver indholdet i X_DLNADOC elementet i urn:schemas-dlna-org:device-1-0.", - "LabelYourFirstName": "Dit fornavn:", "LabelYoureDone": "Du er færdig!", "LabelZipCode": "Postnummer:", "LabelffmpegPath": "FFmpeg sti:", @@ -709,7 +650,6 @@ "MessageFileReadError": "Der opstod en fejl i forsøget på at læse filen.", "MessageForgotPasswordFileCreated": "Den følgende fil er blevet oprettet på din server og indeholder instruktioner vedrørende hvordan du skal fortsætte:", "MessageForgotPasswordInNetworkRequired": "Prøv igen inde i dit hjemmenetværk for at igangsætte nulstilling af din adgangskode.", - "MessageInstallPluginFromApp": "Dette plugin skal installeres fra den app, du har til hensigt at bruge det i.", "MessageInvalidForgotPasswordPin": "En ugyldig eller udløbet pinkode blev indtastet. Prøv igen.", "MessageInvalidUser": "Ukendt brugernavn eller adgangskode. Prøv igen.", "MessageItemSaved": "Element gemt.", @@ -726,7 +666,6 @@ "MessagePluginConfigurationRequiresLocalAccess": "For at konfigurerer dette plugin log da venligst direkte ind på din lokale server.", "MessagePluginInstallDisclaimer": "Plugins fremstillet af medlemmer fra Jellyfin-fællesskabet er en alle tiders måde at forbedre din oplevelse af Jellyfin med yderligere features og fordele. Før installation, bedes du venligst være opmærksom på de effekter de kan have på din Jellyfin Server; så som lange scantider på biblioteker, yderligere baggrundsbehandling og forringet systemstabilitet.", "MessageReenableUser": "Se nedenfor om genaktivering", - "MessageSettingsSaved": "Indstillinger er gemt.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Følgende medieplaceringer fjernes fra dit bibliotek:", "MessageUnableToConnectToServer": "Vi kan ikke forbinde til den valgte server på nuværende tidspunkt. Sikrer dig venligst at serveren kører og prøv igen.", "MessageUnsetContentHelp": "Indhold vil blive vist som almindelige mapper. For det bedste resultat benyt metadata manageren til at vælge indholdstypen i undermapper.", @@ -754,8 +693,8 @@ "News": "Nyheder", "NextUp": "Næste", "NoNewDevicesFound": "Ingen nye enheder fundet. For at tilføje en ny tuner, luk denne dialog og skriv enhedens informationer manuelt.", - "NoNextUpItemsMessage": "Ingen fundet. Se dine serier!", - "NoPluginConfigurationMessage": "Dette plugin har ingen indstillinger at konfigurere.", + "MessageNoNextUpItems": "Ingen fundet. Se dine serier!", + "MessageNoPluginConfiguration": "Dette plugin har ingen indstillinger at konfigurere.", "NoSubtitleSearchResultsFound": "Ingen resultater fundet.", "NumLocationsValue": "{0} mapper", "OneChannel": "En kanal", @@ -827,7 +766,6 @@ "OptionExternallyDownloaded": "Ekstern hentning", "OptionExtractChapterImage": "Aktiver udvinding af kapitelbillede", "OptionFavorite": "Favoritter", - "OptionFriday": "Fredag", "OptionHasSpecialFeatures": "Specielle egenskaber", "OptionHasSubtitles": "Undertekster", "OptionHasThemeSong": "Temasang", @@ -841,11 +779,9 @@ "OptionImdbRating": "IMDB bedømmelse", "OptionMax": "Maks", "OptionMissingEpisode": "Manglende episoder", - "OptionMonday": "Mandag", "OptionNameSort": "Navn", "OptionNew": "Ny...", "OptionNone": "Ingen", - "OptionOnAppStartup": "Ved opstart", "OptionOnInterval": "Interval", "OptionParentalRating": "Aldersgrænse", "OptionPlainStorageFolders": "Vis alle mapper som standardmapper", @@ -864,20 +800,15 @@ "OptionRequirePerfectSubtitleMatch": "Download kun undertekster der er perfekte matches for mine videofiler", "OptionResumable": "Kan genoptages", "OptionRuntime": "Varighed", - "OptionSaturday": "Lørdag", "OptionSaveMetadataAsHidden": "Gem metadata og billeder som skjulte filer", "OptionSaveMetadataAsHiddenHelp": "Ændring af dette vil blive anvendt på nyt metadata gemt fremadrettet. Allerede eksisterende metadata-filer opdateres næste gang de gemmes af Jellyfin Server.", "OptionSpecialEpisode": "Særudsendelser", "OptionSubstring": "Delstreng", - "OptionSunday": "Søndag", - "OptionThursday": "Torsdag", "OptionTrackName": "Nummerets navn", - "OptionTuesday": "Tirsdag", "OptionTvdbRating": "TVDB bedømmelse", "OptionUnairedEpisode": "Ikke sendte episoder", "OptionUnplayed": "Ikke afspillet", "OptionWakeFromSleep": "Vågner fra dvale", - "OptionWednesday": "Onsdag", "OptionWeekdays": "Hverdage", "OptionWeekends": "Weekender", "OptionWeekly": "Ugentlig", @@ -890,7 +821,7 @@ "PasswordMatchError": "Adgangskode og bekræft adgangskode skal være ens.", "PasswordResetComplete": "Adgangskoden er blevet nulstillet.", "PasswordResetConfirmation": "Er du sikker på at adgangskoden skal nulstilles?", - "PasswordResetHeader": "Nulstil adgangskode", + "HeaderResetPassword": "Nulstil adgangskode", "PasswordSaved": "Adgangskoden er gemt.", "People": "Personer", "PictureInPicture": "Billede i billede", @@ -906,7 +837,7 @@ "PleaseEnterNameOrId": "Indtast venligst et navn eller eksternt ID.", "PleaseRestartServerName": "Genstart venligst Jellyfin Server - {0}.", "PleaseSelectTwoItems": "Vælg venligst mindst to elementer.", - "PluginInstalledMessage": "Plugin blev installeret med success. Jellyfin serveren skal genstartes for at aktivere det.", + "MessagePluginInstalled": "Plugin blev installeret med success. Jellyfin serveren skal genstartes for at aktivere det.", "PreferEmbeddedTitlesOverFileNames": "Foretræk indlejrede titler over filnavne", "PreferEmbeddedTitlesOverFileNamesHelp": "Dette bestemmer standard visnings titel når ingen internet metadata eller lokal metadata er tilgængelig.", "Premieres": "Premiere", @@ -914,7 +845,6 @@ "ProductionLocations": "Produktionslokationer", "Programs": "Programmer", "Quality": "Kvalitet", - "QueueAllFromHere": "Set alt her i kø", "RecentlyWatched": "Nyligt sete", "RecommendationBecauseYouLike": "Fordi du kan lide {0}", "RecommendationBecauseYouWatched": "Fordi du har set {0}", @@ -923,7 +853,7 @@ "Record": "Optag", "RecordSeries": "Optag serie", "RecordingCancelled": "Optagelse annulleret.", - "RecordingPathChangeMessage": "Ændring af optagelsesmappe migrerer ikke eksisterende optagelser fra den gamle lokation til den nye. Du bliver nød til at flytte dem manuelt, hvis det ønskes.", + "MessageChangeRecordingPath": "Ændring af optagelsesmappe migrerer ikke eksisterende optagelser fra den gamle lokation til den nye. Du bliver nød til at flytte dem manuelt, hvis det ønskes.", "RecordingScheduled": "Optagelse planlagt.", "Refresh": "Opdater", "RefreshDialogHelp": "Metadata opdateres alt efter hvilke indstillinger og internet-servicer der er aktiveret i Jellyfin Server-kontrolpanelet.", @@ -982,48 +912,25 @@ "SystemDlnaProfilesHelp": "Systemprofiler kan ikke overskrives. Ændringer i en systemprofil vil blive gemt i en ny brugerdefineret profil.", "TabAccess": "Adgang", "TabAdvanced": "Avanceret", - "TabAlbumArtists": "Album-artister", - "TabArtists": "Kunstnere", "TabCatalog": "Katalog", - "TabChannels": "Kanaler", - "TabCollections": "Samlinger", "TabContainers": "Containere", "TabDashboard": "Betjeningspanel", - "TabDevices": "Enheder", "TabDirectPlay": "Direkte afspilning", - "TabDisplay": "Visning", - "TabEpisodes": "Episoder", - "TabFavorites": "Favoritter", - "TabGenres": "Genre", "TabLatest": "Seneste", - "TabMovies": "Film", "TabMusic": "Musik", - "TabMusicVideos": "Musikvideoer", "TabMyPlugins": "Mine tilføjelser", "TabNetworks": "Netværk", "TabNfoSettings": "NFO Indstillinger", "TabNotifications": "Underretninger", "TabOther": "Andet", "TabParentalControl": "Forældrekontrol", - "TabPassword": "Adgangskode", - "TabPlayback": "Afspilning", - "TabPlaylists": "Afspilningslister", "TabPlugins": "Tilføjelser", "TabProfile": "Profil", "TabProfiles": "Profiler", - "TabRecordings": "Optagelser", "TabResponses": "Svar", - "TabResumeSettings": "Genoptag", "TabScheduledTasks": "Planlagte opgaver", - "TabSeries": "Serier", "TabSettings": "Indstillinger", - "TabShows": "Serier", - "TabSongs": "Sange", - "TabSuggestions": "Forslag", - "TabTrailers": "Trailere", - "TabTranscoding": "Transkodning", "TabUpcoming": "Kommende", - "TabUsers": "Brugere", "TellUsAboutYourself": "Fortæl os lidt om dig selv", "ThisWizardWillGuideYou": "Denne guide vil hjælpe dig igennem opsætningen. For at begynde, vælg venligst dit fortrukne sprog.", "Thursday": "Torsdag", @@ -1034,7 +941,7 @@ "Tuesday": "Tirsdag", "TvLibraryHelp": "Gennemgå {0} TV-navneguiden {1}.", "UninstallPluginConfirmation": "Er du sikker på du vil afinstallere {0}?", - "UninstallPluginHeader": "Afinstaller plugin", + "HeaderUninstallPlugin": "Afinstaller plugin", "Unmute": "Genoptag lyd", "Unrated": "Ingen bedømmelse", "UserAgentHelp": "Angiv en brugerdefineret bruger-agent HTTP-header.", @@ -1083,14 +990,12 @@ "AllLanguages": "Alle sprog", "AlwaysPlaySubtitles": "Afspil Altid", "AlwaysPlaySubtitlesHelp": "Undertekster, der matcher dine sprogindstillinger, vil altid blive indlæst uanset lydsprog.", - "HeaderLiveTV": "Live-TV", "Shows": "Serier", "Songs": "Sange", "AnyLanguage": "Hvilken som helst sprog", "Art": "Kunst", "Ascending": "Stigende", "Auto": "Auto", - "AutoBasedOnLanguageSetting": "Automatisk (baseret på sprogindstilling)", "Backdrop": "Baggrund", "Backdrops": "Baggrunde", "Banner": "Banner", @@ -1098,7 +1003,6 @@ "Box": "Boks", "BoxRear": "Boks (bagside)", "BurnSubtitlesHelp": "Bestemmer om serveren skal brænde undertekster, når der afspilles transcoding videoer. Undgå dette vil forbedre ydelsen meget. Vælg Auto for at brænde billedbaserede formater (VOBSUB, PGS, SUB, IDX) og bestemte ASS- eller SSA-undertekster.", - "ButtonFilter": "Filter", "ButtonGuide": "Vejledning", "ButtonInfo": "Information", "ButtonOk": "Ok", @@ -1138,16 +1042,13 @@ "DownloadsValue": "{0} hentninger", "DropShadow": "Drop Skygge", "EditMetadata": "Redigér metadata", - "EnableBackdrops": "Baggrundsbilleder", "EnableBackdropsHelp": "Vis baggrundsbilleder i baggrunden af nogle sider mens man gennemser biblioteket.", "EnableDisplayMirroring": "Visning afspejling", "EnableExternalVideoPlayers": "Eksterne video afspillere", "EnableExternalVideoPlayersHelp": "En ekstern afspiller menu vil blive vist når video afspilning starter.", "EnableNextVideoInfoOverlay": "Vis næste video information mens der afspilles", "EnableNextVideoInfoOverlayHelp": "I slutningen af en video, vis information om den næste video i nuværende afspilningsliste.", - "EnableThemeSongs": "Tema sange", "EnableThemeSongsHelp": "Afspil tema sange i baggrunden mens man gennemser biblioteket.", - "EnableThemeVideos": "Tema videoer", "EnableThemeVideosHelp": "Afspil tema videoer i baggrunden mens man gennemser biblioteket.", "Episodes": "Afsnit", "ErrorDeletingItem": "Der skete en fejl ved sletningen af mediet fra Jellyfin Server. Tjek venligst at Jellyfin Server har skrive adgang til mediemappen og prøv igen.", @@ -1161,7 +1062,6 @@ "Guide": "Vejledning", "GuideProviderLogin": "Log Ind", "HeaderAdmin": "Admin", - "HeaderAlbums": "Albummer", "HeaderApp": "App", "HeaderAppearsOn": "Forekommer I", "HeaderAudioBooks": "Lydbøger", @@ -1170,7 +1070,6 @@ "HeaderDownloadSync": "Hentning Og Sync", "HeaderFavoritePlaylists": "Favorit Afspilningslister", "HeaderLibraryOrder": "Bibliotektsorden", - "HeaderLiveTv": "Live TV", "HeaderMusicQuality": "Musik Kvalitet", "HeaderMyMediaSmall": "Mine Medier (lille)", "HeaderNavigation": "Navigation", @@ -1184,7 +1083,6 @@ "HeaderStatus": "Status", "HeaderStopRecording": "Stop Optagelse", "HeaderSubtitleAppearance": "Undertekst Udseende", - "HeaderTags": "Mærker", "HeaderVideoQuality": "Video Kvalitet", "HeaderVideoType": "Video Type", "Hide": "Skjul", @@ -1193,13 +1091,11 @@ "Horizontal": "Horisontalt", "Label3DFormat": "3D format:", "LabelAlbum": "Album:", - "LabelAudio": "Lyd", "LabelBlockContentWithTags": "Blokér filer med etiketter:", "LabelBurnSubtitles": "Brænd undertekster:", "LabelCache": "Cache:", "LabelCertificatePassword": "Adgangskode til certifikat:", "LabelCertificatePasswordHelp": "Hvis dit certifikat kræver en adgangskode, skriv det venligst her.", - "LabelDashboardTheme": "Server dashboard tema:", "LabelDateTimeLocale": "Dato og tid område:", "LabelDefaultScreen": "Standard skærm:", "LabelDisplayLanguage": "Visningssprog:", @@ -1226,22 +1122,17 @@ "LabelScreensaver": "Pauseskærm:", "LabelSelectFolderGroups": "Gruppér automatisk indhold fra følgende mapper ind i visninger som Film, Musik og TV:", "LabelSelectFolderGroupsHelp": "Mapper der ikke er valgt vil blive vist for sig selv i deres egen visning.", - "LabelSkin": "Tema Skin:", "LabelSkipBackLength": "Gå tilbage længde:", "LabelSkipForwardLength": "Gå fremad længde:", "LabelSortBy": "Sortér efter:", "LabelSortOrder": "Sorteringsorden:", - "LabelSoundEffects": "Lydeffekter:", "LabelStatus": "Status:", - "LabelSubtitles": "Undertekster", "LabelTVHomeScreen": "TV modus hjemmeskærm:", "LabelTag": "Mærke:", "LabelTagline": "Taglinje:", "LabelTextBackgroundColor": "Tekst baggrundsfarve:", "LabelTextColor": "Tekstfarve:", "LabelTextSize": "Tekststørrelse:", - "LabelTranscodingContainer": "Beholder:", - "LabelTranscodingVideoCodec": "Video codec:", "LabelType": "Type:", "LabelVersion": "Version:", "LabelVideo": "Video", @@ -1253,7 +1144,6 @@ "LearnHowYouCanContribute": "Lær hvordan du kan bidrage.", "LeaveBlankToNotSetAPassword": "Du kan lade dette felt være tomt hvis du ikke ønsker adgangskode.", "Like": "Favorit", - "LinksValue": "Link: {0}", "List": "Liste", "Live": "Live", "LiveTV": "Se Live TV", @@ -1266,7 +1156,6 @@ "MediaInfoLayout": "Udlæg", "MediaInfoRefFrames": "Ref billeder", "MediaInfoSampleRate": "Sample rate", - "MediaInfoSoftware": "Software", "MediaInfoStreamTypeData": "Data", "MediaInfoStreamTypeVideo": "Video", "MediaIsBeingConverted": "Mediet bliver konverteret til et format der er kompatibel med enheden der afspiller mediet.", @@ -1278,7 +1167,6 @@ "Mobile": "Mobil", "Next": "Næste", "No": "Nej", - "NoSubtitles": "Ingen undertekster", "NoSubtitlesHelp": "Undertekster vil ikke blive indlæst som standard. De kan slåes til manuelt under afspilning.", "None": "Ingen", "Normal": "Normalt", @@ -1290,7 +1178,6 @@ "OptionAlbum": "Album", "OptionArtist": "Kunstner", "OptionAuto": "Automatisk", - "OptionAutomatic": "Automatisk", "OptionBanner": "Banner", "OptionBluray": "Blu-Ray", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", @@ -1323,7 +1210,6 @@ "RepeatAll": "Gentag alle", "RepeatMode": "Gentagelses tilstand", "RepeatOne": "Gentag én", - "RunAtStartup": "Kør ved opstart", "ScanForNewAndUpdatedFiles": "Skan for nye og opdaterede filer", "Schedule": "Tidsplan", "Screenshot": "Skærmbillede", @@ -1341,14 +1227,8 @@ "SubtitleAppearanceSettingsDisclaimer": "Disse indstillinger bliver ikke aktiveret på grafiske undertekster (PGS, DVD, etc) eller ASS/SSA undertekster der har deres egen indbyggede stil.", "Suggestions": "Forslag", "TV": "TV", - "TabAlbums": "Albummer", "TabCodecs": "Codeks", - "TabGuide": "Vejledning", - "TabInfo": "Information", - "TabLiveTV": "Live TV", "TabLogs": "Log", - "TabMetadata": "Metadata", - "TabPlaylist": "Afspilningsliste", "TabServer": "Server", "TabStreaming": "Streamer", "Tags": "Mærker", @@ -1371,7 +1251,6 @@ "ValueSpecialEpisodeName": "Special - {0}", "ValueVideoCodec": "Video Codek: {0}", "Vertical": "Vertikal", - "VideoRange": "Video rækkevidde", "Watched": "Set", "Whitelist": "Hvidliste", "Yes": "Ja", @@ -1382,7 +1261,6 @@ "HeaderFavoriteArtists": "Favoritkunstnere", "HeaderFavoriteSongs": "Favoritsange", "HeaderFavoriteVideos": "Favoritvideoer", - "HeaderHome": "Hjem", "LabelServerName": "Server navn:", "LabelUserLoginAttemptsBeforeLockout": "Fejlede loginforsøg før bruger lukkes ude:", "ButtonAddImage": "Tilføj billede", @@ -1407,14 +1285,12 @@ "SubtitleOffset": "Undertekst Offset", "SelectAdminUsername": "Vælg et brugernavn til administrator kontoen.", "Season": "Sæson", - "ReleaseGroup": "Release Group", "Premiere": "Premiere", "PreferEmbeddedEpisodeInfosOverFileNames": "Foretrækker integreret episode information frem for filnavne", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Dette bruger episode informationen fra de integrerede metadata, hvis den er tilgængelig.", "PlaybackData": "Afspilningsdata", "Person": "Person", "PasswordResetProviderHelp": "Vælg en leverandør af nulstil adgangskode, der skal bruges, når denne bruger anmoder om en nulstilling af adgangskode", - "OtherArtist": "Anden kunstner", "OptionThumbCard": "Thumb card", "OptionThumb": "Thumb", "OptionRandom": "Tilfældig", @@ -1437,8 +1313,6 @@ "MediaInfoStreamTypeSubtitle": "Undertekst", "MediaInfoStreamTypeEmbeddedImage": "Indlejret billede", "MediaInfoStreamTypeAudio": "Lyd", - "LaunchWebAppOnStartupHelp": "Åben web klienten i den standard web browser når serveren starter første gang. Dette vil ikke ske når restart server funktionen benyttes.", - "LaunchWebAppOnStartup": "Åben webinterfacet når serveren startes", "LabelWeb": "Web:", "LabelVideoResolution": "Videoopløsning:", "LabelVideoBitrate": "Video bitrate:", @@ -1478,7 +1352,6 @@ "FetchingData": "Henter yderligere data", "Episode": "Afsnit", "DeinterlaceMethodHelp": "Vælg hvilken konverteringsmulighed der skal bruges til transkodning af indhold.", - "CopyStreamURLError": "Der skete en fejl med at kopiere URL'en.", "CopyStreamURLSuccess": "URL blev kopieret.", "CopyStreamURL": "Kopiér stream URL", "ClientSettings": "Klient Indstillinger", @@ -1490,10 +1363,8 @@ "EveryXHours": "Hver {0} time", "OnApplicationStartup": "Ved programstart", "UnsupportedPlayback": "Jellyfin kan ikke dekryptere indhold, der er beskyttet af DRM, men alt indhold vil blive forsøgt afspillet uanset, inklusive beskyttede titler. Nogle filer kan eventuelt vises med sort skærm på grund af kryptering eller andre funktioner, der ikke understøttes, såsom interaktive titler.", - "MessageUnauthorizedUser": "Du har ikke tilladelse til at tilgå serveren på dette tidspunkt. Kontakt din serveradministrator for mere information.", "Filter": "Filtrer", "New": "Nye", "ButtonTogglePlaylist": "Spilleliste", - "ButtonToggleContextMenu": "Mere", "ButtonSyncPlay": "SyncPlay" } diff --git a/src/strings/de.json b/src/strings/de.json index 837feb42b9..756aa99ab4 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -3,7 +3,6 @@ "AccessRestrictedTryAgainLater": "Der Zugriff ist derzeit eingeschränkt. Bitte versuche es später erneut.", "Actor": "Darsteller(in)", "Add": "Hinzufügen", - "AddItemToCollectionHelp": "Fügen Sie Elemente zu Sammlungen hinzu, indem Sie sie suchen und deren Rechtsklick- oder Antippmenü benutzen.", "AddToCollection": "Zur Sammlung hinzufügen", "AddToPlayQueue": "Zur Warteschlange hinzufügen", "AddToPlaylist": "Zur Wiedergabeliste hinzufügen", @@ -23,7 +22,7 @@ "AllowMediaConversionHelp": "Erlaube oder unterbinde Zugriff auf die Medienkonvertierung.", "AllowOnTheFlySubtitleExtraction": "Erlaube Untertitelextraktion \"on-the-fly\"", "AllowOnTheFlySubtitleExtractionHelp": "Eingebettete Untertitel können aus Videos extrahiert und in Reintext an Clients gesendet werden, um eine Videotranskodierung zu vermeiden. Auf manchen Systemen kann dieser Vorgang eine lange Zeit in Anspruch nehmen und deswegen währenddessen die Videowiedergabe stoppen. Deaktiviere diese Option, um eingebettete Untertitel während des Videotranskodierens einbrennen zu lassen, wenn sie nicht nativ vom Client unterstützt werden.", - "AllowRemoteAccess": "Erlaube externe Verbindungen zu diesem Jellyfin Server.", + "AllowRemoteAccess": "Erlaube externe Verbindungen zu diesem Server.", "AllowRemoteAccessHelp": "Wenn deaktiviert werden alle externen Verbindungen blockiert.", "AllowedRemoteAddressesHelp": "Kommagetrennte Liste von IP Adressen oder IP/Netzmasken für Netzwerke, für die externe Verbindungen erlaubt sind. Wenn leer, sind alle Adressen erlaubt.", "AlwaysPlaySubtitles": "Immer anzeigen", @@ -35,8 +34,6 @@ "AsManyAsPossible": "So viele wie möglich", "Ascending": "Aufsteigend", "AspectRatio": "Seitenverhältnis", - "AttributeNew": "Neu", - "AutoBasedOnLanguageSetting": "Automatisch (basierend auf Spracheinstellung)", "Backdrop": "Hintergrund", "Backdrops": "Hintergründe", "BirthDateValue": "Geboren: {0}", @@ -46,76 +43,53 @@ "Books": "Bücher", "BoxRear": "Box (Rückseite)", "Browse": "Blättern", - "BrowsePluginCatalogMessage": "Durchsuche unsere Bibliothek, um alle verfügbaren Plugins anzuzeigen.", + "MessageBrowsePluginCatalog": "Durchsuche unsere Bibliothek, um alle verfügbaren Plugins anzuzeigen.", "BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel während der Videotranskodierung einbrennen soll. Deaktivieren verbessert die Serverperformance immens. Wähle Auto, um bildbasierte Formate (z.B. VOBSUB, PGS, SUB, IDX, ...) sowie bestimmte ASS- oder SSA-Untertitel einbrennen zu lassen.", - "ButtonAdd": "Hinzufügen", "ButtonAddMediaLibrary": "Füge Medienbibliothek hinzu", "ButtonAddScheduledTaskTrigger": "Auslöser hinzufügen", "ButtonAddServer": "Server hinzufügen", "ButtonAddUser": "User hinzufügen", - "ButtonArrowDown": "Ab", "ButtonArrowLeft": "Links", "ButtonArrowRight": "Rechts", - "ButtonArrowUp": "Auf", "ButtonAudioTracks": "Audiospuren", "ButtonBack": "Zurück", "ButtonCancel": "Abbrechen", "ButtonChangeServer": "Wechsel Server", - "ButtonConnect": "Verbinde", - "ButtonDelete": "Löschen", - "ButtonDeleteImage": "Lösche Bild", - "ButtonDown": "Runter", - "ButtonEdit": "Bearbeiten", - "ButtonEditImages": "Bearbeite Bilder", "ButtonEditOtherUserPreferences": "Bearbeite dieses Benutzerprofil, das Benutzerbild und die persönlichen Einstellungen.", "ButtonForgotPassword": "Passwort vergessen", "ButtonFullscreen": "Vollbild", "ButtonGotIt": "Verstanden", "ButtonGuide": "TV Guide", - "ButtonHelp": "Hilfe", - "ButtonLearnMore": "Erfahre mehr", "ButtonLibraryAccess": "Bibliothekszugang", "ButtonManualLogin": "Manuelle Anmeldung", "ButtonMore": "Mehr", "ButtonNetwork": "Netzwerk", - "ButtonNew": "Neu", "ButtonNextTrack": "Nächstes Stück", - "ButtonOff": "Ausschalten", "ButtonOpen": "Öffnen", "ButtonParentalControl": "Kindersicherung", - "ButtonPlay": "Abspielen", "ButtonPreviousTrack": "Vorheriges Stück", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Schnellstart Anleitung", - "ButtonRefresh": "Aktualisieren", "ButtonRefreshGuideData": "Aktualisiere TV-Programmdaten", "ButtonRemove": "Entfernen", "ButtonRename": "Umbenennen", - "ButtonRepeat": "Wiederholung", "ButtonResetEasyPassword": "Einfachen PIN zurücksetzen", "ButtonResetPassword": "Passwort zurücksetzten", "ButtonRestart": "Neustart", "ButtonResume": "Fortsetzen", "ButtonRevoke": "Zurücknehmen", - "ButtonSave": "Speichern", "ButtonScanAllLibraries": "Scanne alle Bibliotheken", - "ButtonSearch": "Suche", "ButtonSelectDirectory": "Wähle Verzeichnis", "ButtonSelectServer": "Wähle Server", "ButtonSelectView": "Ansicht wählen", "ButtonSend": "senden", "ButtonSettings": "Einstellungen", - "ButtonShuffle": "Zufallswiedergabe", "ButtonShutdown": "Herunterfahren", "ButtonSignIn": "Einloggen", "ButtonSignOut": "Abmelden", - "ButtonSort": "Sortieren", "ButtonStop": "Stopp", "ButtonSubmit": "Bestätigen", - "ButtonSubtitles": "Untertitel", "ButtonUninstall": "Deinstallieren", - "ButtonUp": "Hoch", - "ButtonViewWebsite": "Besuche die Website", "CancelRecording": "Aufnahme abbrechen", "CancelSeries": "Serien abbrechen", "Categories": "Kategorien", @@ -128,7 +102,7 @@ "ColorSpace": "Farbraum", "CommunityRating": "Community Bewertung", "Composer": "Komponist", - "ConfigureDateAdded": "Bestimme in den Bibliotheks-Einstellungen des Jellyfin Server Dashboards, wie das Feld \"Hinzugefügt am\" interpretiert werden soll", + "ConfigureDateAdded": "Bestimme in den Bibliotheks-Einstellungen des Dashboards, wie das Feld \"Hinzugefügt am\" interpretiert werden soll", "ConfirmDeleteImage": "Bild löschen?", "ConfirmDeleteItem": "Löschen dieses Eintrages bedeutet das Löschen der Datei und das Entfernen aus der Medien-Bibliothek. Möchtest du wirklich fortfahren?", "ConfirmDeleteItems": "Das Löschen dieser Objekte löscht die Dateien vom Laufwerk und in deiner Medienbibliothek. Bist du wirklich sicher?", @@ -143,7 +117,7 @@ "DatePlayed": "Abgespielt am", "DeathDateValue": "Gestorben: {0}", "Default": "Standard", - "DefaultErrorMessage": "Es gab einen Fehler beim verarbeiten der Anfrage. Bitte versuche es später erneut.", + "ErrorDefault": "Es gab einen Fehler beim verarbeiten der Anfrage. Bitte versuche es später erneut.", "DefaultMetadataLangaugeDescription": "Das sind deine Default-Werte, die bibliotheksspezifisch verändert werden können.", "DefaultSubtitlesHelp": "Untertitel werden gemäß der Standard- und Erzwungen-Ansicht aus den eingebetteten Metadaten geladen. Spracheinstellungen werden zur Verfügung gestellt, wenn mehrere Sprachen verfügbar sind.", "Delete": "Löschen", @@ -158,8 +132,8 @@ "DetectingDevices": "Suche Geräte", "DeviceAccessHelp": "Dies wird nur auf Geräte angewandt die eindeutig identifiziert werden können und verhindert nicht den Web-Zugriff. Gefilterter Zugriff auf Geräte verhindert die Nutzung neuer Geräte solange, bis der Zugriff für diese freigegeben wird.", "DirectPlaying": "Direktes Abspielen", - "DirectStreamHelp1": "Das Medium ist mit dem Abspielgerät kompatibel bzgl. Auflösung und Codecs (H.264, AC3, etc.), besitzt jedoch ein inkompatibles Containerformat (mkv, avi, wmv, etc.). Das Video wird in Echtzeit neuverpackt bevor es zum Abspielgerät gestreamt wird.", - "DirectStreamHelp2": "Direktes Streaming von Dateien benötigt sehr wenig Rechenleistung ohne Verlust der Videoqualität.", + "DirectStreamHelp1": "Das Medium ist mit dem Abspielgerät kompatibel bzgl. Auflösung und Codecs (H.264, AC3, etc.), besitzt jedoch ein inkompatibles Containerformat (mkv, avi, wmv, etc.). Das Video wird in Echtzeit neu verpackt bevor es zum Abspielgerät gesendet wird.", + "DirectStreamHelp2": "Direkt Stream benötigt sehr wenig Rechenleistung mit minimalem Verlust der Videoqualität.", "DirectStreaming": "Direktes Streaming", "Director": "Regisseur", "Directors": "Regisseure", @@ -183,7 +157,6 @@ "EditImages": "Bearbeite Bilder", "EditMetadata": "Bearbeite Metadaten", "EditSubtitles": "Untertitel bearbeiten", - "EnableBackdrops": "Hintergründe", "EnableBackdropsHelp": "Zeige während des Browsens durch die Bibliothek auf einigen Seiten passende Hintergründe an.", "EnableCinemaMode": "Kino-Modus", "EnableColorCodedBackgrounds": "Farbige Hintergründe", @@ -197,20 +170,18 @@ "EnablePhotosHelp": "Bilder werden erkannt und neben anderen Mediendateien angezeigt.", "EnableStreamLooping": "Auto-Schleife Live Streams", "EnableStreamLoopingHelp": "Aktivieren, wenn Live Streams nur ein paar Sekunden Daten enthalten und ständig angefragt werden müssen. Kann zu Problemen führen wenn aktiviert, obwohl nicht nötig.", - "EnableThemeSongs": "Titelmelodien", "EnableThemeSongsHelp": "Titelmusik wird während des Blätterns durch die Bibliothek im Hintergrund abgespielt.", - "EnableThemeVideos": "Titelvideos", "EnableThemeVideosHelp": "Titelvideos werden während des Blätterns durch die Bibliothek im Hintergrund abgespielt.", "Ended": "Beendent", "EndsAtValue": "Endet um {0}", "Episodes": "Episoden", "ErrorAddingListingsToSchedulesDirect": "Ein Fehler trat beim Hinzufügen Ihrer Zusammenstellung zu Ihrem Schedules Direct Konto auf. Schedules Direct erlaubt nur eine begrenzte Anzahl von Zusammenstellungen je Account. Sie sollten sich auf der Website in Ihrem Schedules-Direct Konto einloggen und ein paar Zusammenstellungen von Ihrem Konto löschen bevor Sie fortfahren.", - "ErrorAddingMediaPathToVirtualFolder": "Ein Fehler trat beim Hinzufügen eines Medienverzeichnisses auf. Bitte stellen Sie sicher, dass der Pfad gültig ist und der Jellyfin Server Prozess die notwendigen Zugriffsrechte besitzt.", + "ErrorAddingMediaPathToVirtualFolder": "Ein Fehler trat beim Hinzufügen eines Medienverzeichnisses auf. Bitte stellen Sie sicher, dass der Pfad gültig ist und Jellyfin die notwendigen Zugriffsrechte besitzt.", "ErrorAddingTunerDevice": "Es trat ein Fehler beim hinzufügen eines Tuners auf. Bitte stellen Sie sicher das dieser erreichbar ist und versuchen Sie es erneut.", "ErrorAddingXmlTvFile": "Fehler beim Zugriff auf die XMLTV Datei. Stelle bitte sicher, dass die Datei existiert und versuche es nochmal.", - "ErrorDeletingItem": "Fehler beim Löschen des Mediums vom Jellyfin Server. Bitte stelle sicher dass der Jellyfin Server Schreibzugriff auf den Dateiordner hat und versuche es erneut.", + "ErrorDeletingItem": "Fehler beim Löschen des Mediums vom Server. Bitte stelle sicher, dass Jellyfin Schreibzugriff auf den Dateiordner hat und versuche es erneut.", "ErrorGettingTvLineups": "Ein Fehler trat beim Herunterladen des Fernsehprogramms auf. Bitte stellen Sie sicher, dass Ihre Informationen korrekt sind und versuchen Sie es erneut.", - "ErrorMessageStartHourGreaterThanEnd": "Die Endzeit muss größer als die Startzeit sein.", + "ErrorStartHourGreaterThanEnd": "Die Endzeit muss größer als die Startzeit sein.", "ErrorPleaseSelectLineup": "Bitte wählen Sie ein TV Programm und versuchen Sie es erneut. Wenn keine Programme verfügbar sind prüfen Sie bitte Benutzername, Passwort und Ihre Postleitzahl.", "ErrorSavingTvProvider": "Ein Fehler beim speichern des TV Verzeichnisses trat auf. Bitte stellen Sie sicher das dieser erreichbar ist und versuchen Sie es erneut.", "EveryNDays": "Alle {0} Tage", @@ -251,32 +222,25 @@ "HeaderActiveDevices": "Aktive Geräte", "HeaderActiveRecordings": "Aktive Aufnahmen", "HeaderActivity": "Aktivitäten", - "HeaderAddScheduledTaskTrigger": "Auslöser hinzufügen", "HeaderAddToCollection": "Zu Sammlung hinzufügen", "HeaderAddToPlaylist": "Zur Wiedergabeliste hinzufügen", "HeaderAddUpdateImage": "Bild hinzufügen/aktualisieren", - "HeaderAddUser": "Benutzer anlegen", "HeaderAdditionalParts": "Zusätzliche Teile", "HeaderAlbumArtists": "Album-Interpreten", - "HeaderAlbums": "Alben", "HeaderAlert": "Alarm", "HeaderAllowMediaDeletionFrom": "Erlaube Medienlöschung von", "HeaderApiKey": "API-Schlüssel", "HeaderApiKeys": "API-Schlüssel", - "HeaderApiKeysHelp": "Externe Applikationen benötigen einen API-Schlüssel, um mit dem Jellyfin-Server zu kommunizieren. API-Schlüssel werden beim Anmelden mit einem Jellyfin-Konto oder durch eine manuelle Freigabe vergeben.", + "HeaderApiKeysHelp": "Externe Applikationen benötigen einen API-Schlüssel, um mit dem Server zu kommunizieren. API-Schlüssel werden beim Anmelden mit einem normalen Benutzerkonto oder durch eine manuelle Freigabe vergeben.", "HeaderAppearsOn": "Erscheint auf", "HeaderAudioBooks": "Hörbücher", "HeaderAudioSettings": "Audioeinstellungen", - "HeaderAutomaticUpdates": "Automatische Updates", "HeaderBlockItemsWithNoRating": "Blockiere Inhalte mit keiner oder nicht erkannter Altersfreigabe:", - "HeaderBooks": "Bücher", "HeaderBranding": "Branding / CSS", "HeaderCancelRecording": "Aufnahme abbrechen", "HeaderCancelSeries": "Serie abbrechen", "HeaderCastAndCrew": "Besetzung & Mitwirkende", - "HeaderCastCrew": "Besetzung & Crew", "HeaderChannelAccess": "Channelzugriff", - "HeaderChannels": "Kanäle", "HeaderChapterImages": "Kapitel Bilder", "HeaderCodecProfile": "Codec Profil", "HeaderCodecProfileHelp": "Codec Profile weisen auf Beschränkungen eines Gerätes beim Abspielen bestimmter Codecs hin. Wenn eine Beschränkung zutrifft, dann werden Medien transcodiert, auch wenn der Codec für die Direktwiedergabe konfiguriert ist.", @@ -304,22 +268,17 @@ "HeaderDevices": "Geräte", "HeaderDirectPlayProfile": "Direktwiedergabe Profil", "HeaderDirectPlayProfileHelp": "Füge Direct-Play Profile hinzu um die nativen Abspielmöglichkeiten von Geräten festzulegen.", - "HeaderDisplay": "Anzeige", "HeaderDownloadSync": "Herunterladen & Synchronisieren", "HeaderEasyPinCode": "Einfacher PIN Code", "HeaderEditImages": "Bilder bearbeiten", "HeaderEnabledFields": "Aktiviere Felder", "HeaderEnabledFieldsHelp": "Wähle Felder ab um das Ändern von Daten zu verhindern.", - "HeaderEpisodes": "Episoden", "HeaderError": "Fehler", "HeaderExternalIds": "Externe IDs:", "HeaderFeatureAccess": "Funktionszugriff", - "HeaderFeatures": "Funktionen", "HeaderFetchImages": "Bilder abrufen:", "HeaderFetcherSettings": "Fetcher Einstellungen", - "HeaderFilters": "Filter", "HeaderForKids": "Für Kinder", - "HeaderForgotPassword": "Passwort vergessen", "HeaderFrequentlyPlayed": "Oft gesehen", "HeaderGuideProviders": "Fernsehprogramm Quellen", "HeaderIdentification": "Identifizierung", @@ -330,10 +289,9 @@ "HeaderImageSettings": "Bild Einstellungen", "HeaderInstall": "Installieren", "HeaderInstantMix": "Schnellmix", - "HeaderItems": "Inhalte", "HeaderKeepRecording": "Aufnahme behalten", "HeaderKeepSeries": "Serie behalten", - "HeaderKodiMetadataHelp": "Jellyfin bietet native Unterstützung von NFO Metadatendateien. Um NFO Metadaten zu aktivieren oder deaktivieren, verwende den \"Metadaten\" Tab um die Optionen für deinen Medientypen zu konfigurieren.", + "HeaderKodiMetadataHelp": "Um NFO Metadaten zu aktivieren oder deaktivieren, bearbeite eine Bibliothek und mache den Metadaten-Speicherer Abschnitt ausfindig.", "HeaderLatestEpisodes": "Neueste Episoden", "HeaderLatestMedia": "Neueste Medien", "HeaderLatestMovies": "Neueste Filme", @@ -344,16 +302,12 @@ "HeaderLibraryFolders": "Bibliotheksverzeichnisse", "HeaderLibraryOrder": "Bibliotheksreihenfolge", "HeaderLibrarySettings": "Bibliothekseinstellungen", - "HeaderLiveTV": "Live TV", - "HeaderLiveTv": "Live-TV", "HeaderLiveTvTunerSetup": "TV Tuner Setup", "HeaderLoginFailure": "Login Fehler", "HeaderMedia": "Medien", "HeaderMediaFolders": "Medienverzeichnisse", - "HeaderMediaInfo": "Medieninformation", "HeaderMetadataSettings": "Metadaten Einstellungen", "HeaderMoreLikeThis": "Mehr wie dieses", - "HeaderMovies": "Filme", "HeaderMusicQuality": "Musikqualität", "HeaderMusicVideos": "Musikvideos", "HeaderMyDevice": "Mein Gerät", @@ -362,7 +316,6 @@ "HeaderNewApiKey": "Neuer API-Schlüssel", "HeaderNewDevices": "Neue Geräte", "HeaderNextEpisodePlayingInValue": "Nächste Episode wird abgespielt in {0}", - "HeaderNextUp": "Als Nächstes", "HeaderNextVideoPlayingInValue": "Nächstes Video wird abgespielt in {0}", "HeaderOnNow": "Gerade läuft", "HeaderOtherItems": "Andere Inhalte", @@ -370,7 +323,6 @@ "HeaderPassword": "Passwort", "HeaderPasswordReset": "Passwort zurücksetzen", "HeaderPaths": "Pfade", - "HeaderPeople": "Personen", "HeaderPhotoAlbums": "Fotoalben", "HeaderPinCodeReset": "PIN Code zurücksetzen", "HeaderPlayAll": "Alle abspielen", @@ -381,7 +333,7 @@ "HeaderPreferredMetadataLanguage": "Bevorzugte Sprache der Metadaten", "HeaderProfile": "Profil", "HeaderProfileInformation": "Profil Infomationen", - "HeaderProfileServerSettingsHelp": "Diese Werte geben an, wie Jellyfin Server sich Ihren Geräten präsentiert.", + "HeaderProfileServerSettingsHelp": "Diese Werte geben an, wie der Server sich Ihren Clients präsentiert.", "HeaderRecentlyPlayed": "Zuletzt gesehen", "HeaderRecordingOptions": "Aufnahmeeinstellungen", "HeaderRecordingPostProcessing": "Aufnahme Nachbearbeitung", @@ -394,26 +346,23 @@ "HeaderRevisionHistory": "Versionsverlauf", "HeaderRunningTasks": "Laufende Aufgaben", "HeaderScenes": "Szenen", - "HeaderSchedule": "Zeitplan", "HeaderSeasons": "Staffeln", "HeaderSecondsValue": "{0} Sekunden", "HeaderSelectCertificatePath": "Wählen Sie einen Zertifikat Ordner", "HeaderSelectMetadataPath": "Wähle Metadaten Pfad", - "HeaderSelectMetadataPathHelp": "Suche oder gib den Pfad für die Speicherung von Metadaten an. Das Verzeichnis muss beschreibbar sein.", + "HeaderSelectMetadataPathHelp": "Suche oder gib den Pfad für Metadaten an. Das Verzeichnis muss beschreibbar sein.", "HeaderSelectPath": "Verzeichnis Wählen", "HeaderSelectServer": "Wähle Server", "HeaderSelectServerCachePath": "Wähle Server Cache Pfad", "HeaderSelectServerCachePathHelp": "Suche oder gib den Pfad für die Speicherung von Server Cache Dateien an. Das Verzeichnis muss beschreibbar sein.", "HeaderSelectTranscodingPath": "Wähle Pfad für temporäre Transkodierdateien", - "HeaderSelectTranscodingPathHelp": "Suche oder gib den Pfad für die Speicherung von temporären Transkodierdateien an. Das Verzeichnis muss beschreibbar sein.", + "HeaderSelectTranscodingPathHelp": "Suche oder gib den Pfad für die Speicherung Transkodierdateien an. Das Verzeichnis muss beschreibbar sein.", "HeaderSendMessage": "Nachricht senden", - "HeaderSeries": "Serien", "HeaderSeriesOptions": "Serienoptionen", "HeaderSeriesStatus": "Serienstatus", "HeaderServerSettings": "Server Einstellungen", "HeaderSettings": "Einstellungen", "HeaderSetupLibrary": "Medienbibliotheken einrichten", - "HeaderShutdown": "Herunterfahren", "HeaderSortBy": "Sortiert nach", "HeaderSortOrder": "Sortierreihenfolge", "HeaderSpecialEpisodeInfo": "Spezialepisoden Information", @@ -445,15 +394,14 @@ "HeaderXmlDocumentAttributes": "XML-Dokument Eigenschaften", "HeaderXmlSettings": "XML Einstellungen", "HeaderYears": "Jahre", - "HeadersFolders": "Verzeichnisse", "Help": "Hilfe", "Hide": "Verstecke", "HideWatchedContentFromLatestMedia": "Verberge gesehene Inhalte von neuesten Medien", "HttpsRequiresCert": "Um https für externe Verbindungen zu erzwingen, benötigst du ein vertrauenswürdiges SSL-Zertifikat, z.B. von Let's Encrypt. Bitte stelle entweder ein Zertifikat bereit, oder deaktiviere sichere Verbindungen.", "Identify": "Identifizieren", "Images": "Bilder", - "ImportFavoriteChannelsHelp": "Wenn aktiviert, werden nur auf dem Tuner favorisierte Kanäle importiert.", - "ImportMissingEpisodesHelp": "Wenn aktiviert, werden Informationen über fehlende Episoden in Deine Jellyfin Datenbank importiert und innerhalb von Staffeln angezeigt. Dies kann zu deutlich längeren Bibliothek Scans führen.", + "ImportFavoriteChannelsHelp": "Nur auf dem Tuner favorisierte Kanäle werden importiert.", + "ImportMissingEpisodesHelp": "Informationen über fehlende Episoden werden in deine Datenbank importiert und innerhalb von Staffeln angezeigt. Dies kann zu deutlich längeren Bibliothek Scans führen.", "InstallingPackage": "Installiere {0} (Version {1})", "InstantMix": "Schnellmix", "ItemCount": "{0} Einträge", @@ -476,23 +424,20 @@ "LabelAlbumArtMaxWidthHelp": "Maximale Auflösung für durch UPnP übermittelte Album Art:albumArtURI.", "LabelAlbumArtPN": "Alben-Cover PN:", "LabelAlbumArtists": "Alben Interpreten:", - "LabelAll": "Alle", "LabelAllowHWTranscoding": "Erlaube Hardware Transkodierung", - "LabelAllowServerAutoRestart": "Erlaube dem Server sich automatisch neuzustarten, um Updates durchzuführen", - "LabelAllowServerAutoRestartHelp": "Der Server startet nur wenn keine Nutzer aktiv sind neu.", "LabelAllowedRemoteAddresses": "Remote-IP Adressen Filter:", "LabelAllowedRemoteAddressesMode": "Remote IP Adressen Filtermodus:", "LabelAppName": "App Name", "LabelAppNameExample": "Beispiel: Sickbeard, Sonarr", "LabelArtists": "Interpreten:", - "LabelArtistsHelp": "Trenne mehrere Einträge durch ;", + "LabelArtistsHelp": "Trenne mehrere Künstler durch ein Semikolon.", "LabelAudioLanguagePreference": "Bevorzugte Audiosprache:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Aktualisiere Metadaten automatisch aus dem Internet:", "LabelBindToLocalNetworkAddress": "Binde an lokale Netzwerkadresse:", - "LabelBindToLocalNetworkAddressHelp": "Optional. Überschreibt die lokale IP Adresse des HTTP Servers. Wenn leer, wird der Server an alle verfügbaren Adressen gebunden. Änderungen benötigen einen Neustart des Jellyfin Servers.", + "LabelBindToLocalNetworkAddressHelp": "Überschreibt die lokale IP-Adresse für den HTTP Server. Wenn leer, wird der Server an alle verfügbaren Adressen gebunden. Änderungen benötigen einen Neustart.", "LabelBirthDate": "Geburtsdatum:", "LabelBirthYear": "Geburtsjahr:", - "LabelBlastMessageInterval": "Alive Meldungsintervall (Sekunden)", + "LabelBlastMessageInterval": "Alive Meldungsintervall", "LabelBlastMessageIntervalHelp": "Legt die Dauer in Sekunden zwischen den Server-Alive-Meldungen fest.", "LabelBlockContentWithTags": "Blockiere Inhalte mit Tags:", "LabelBurnSubtitles": "Untertitel einbrennen:", @@ -511,11 +456,9 @@ "LabelCustomCertificatePath": "Benutzerdefinierter SSL-Zertifikatspfad:", "LabelCustomCertificatePathHelp": "Pfad zu einer PKCS #12 Datei die ein Zertifikat und einen privaten Schlüssel enthält, um TLS Unterstützung für eine eigene Domain zu aktivieren.", "LabelCustomCss": "Benutzerdefiniertes CSS:", - "LabelCustomCssHelp": "Wende dein eigenes benutzerdefiniertes Styling auf die Weboberfläche an.", - "LabelCustomDeviceDisplayName": "Angezeigter Name:", + "LabelCustomCssHelp": "Wende deine eigenen benutzerdefinierte Styles auf die Weboberfläche an.", "LabelCustomDeviceDisplayNameHelp": "Lege einen individuellen Anzeigenamen fest oder lasse das Feld leer, um den vom gerät übermittelten Namen zu nutzen.", "LabelCustomRating": "Eigene Bewertung:", - "LabelDashboardTheme": "Server Dashboard Theme:", "LabelDateAdded": "Hinzugefügt am:", "LabelDateAddedBehavior": "Verhalten für Hinzufügedatum bei neuen Inhalten:", "LabelDateAddedBehaviorHelp": "Wenn ein Metadatenwert vorhanden ist, wird dieser immer gegenüber den anderen Optionen bevorzugt werden.", @@ -530,7 +473,6 @@ "LabelDiscNumber": "Discnummer:", "LabelDisplayLanguage": "Anzeigesprache:", "LabelDisplayLanguageHelp": "Die Übersetzung von Jellyfin ist ein laufendes Projekt.", - "LabelDisplayMissingEpisodesWithinSeasons": "Zeige fehlende Episoden innerhalb von Staffeln", "LabelDisplayMode": "Bildschirmmodus:", "LabelDisplayName": "Anzeige Name:", "LabelDisplayOrder": "Anzeigereihenfolge:", @@ -547,12 +489,12 @@ "LabelEnableAutomaticPortMapHelp": "Leitet automatisch die öffentlichen Ports des Routers an die lokalen Ports des Servers mit Hilfe von UPnP weiter. Dies kann mit einigen Router-Modellen nicht funktionieren. Die Änderungen werden erst nach einem Neustart des Server aktiv.", "LabelEnableBlastAliveMessages": "Erzeuge Alive Meldungen", "LabelEnableBlastAliveMessagesHelp": "Aktiviere dies, wenn der Server nicht zuverlässig von anderen UPnP Geräten in ihrem Netzwerk erkannt wird.", - "LabelEnableDlnaClientDiscoveryInterval": "Client-Entdeckungs Intervall (Sekunden)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Ermittelt die Zeit in Sekunden zwischen SSDP Suchanfragen die durch Jellyfin ausgeführt wurden.", + "LabelEnableDlnaClientDiscoveryInterval": "Client-Entdeckungs Intervall", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Ermittelt die Zeit in Sekunden zwischen SSDP Suchanfragen.", "LabelEnableDlnaDebugLogging": "Aktiviere DLNA Debug Logging", "LabelEnableDlnaDebugLoggingHelp": "Erzeugt große Logdateien und sollte nur zur Fehlerbehebung benutzt werden.", "LabelEnableDlnaPlayTo": "Aktiviere DLNA Play To", - "LabelEnableDlnaPlayToHelp": "Jellyfin kann Geräte in Ihrem Netzwerk erkennen und bietet die Möglichkeit, diese fernzusteuern.", + "LabelEnableDlnaPlayToHelp": "Jellyfin kann Geräte in Ihrem Netzwerk erkennen und bietet die Möglichkeit diese fernzusteuern.", "LabelEnableDlnaServer": "DLNA-Server aktivieren", "LabelEnableDlnaServerHelp": "Erlaubt UPnP Geräten in Ihrem Netzwerk den Zugriff und die Wiedergabe von Inhalten.", "LabelEnableHardwareDecodingFor": "Aktiviere Hardware-Decoding für:", @@ -572,16 +514,16 @@ "LabelFont": "Schriftart:", "LabelForgotPasswordUsernameHelp": "Bitte gib deinen Benutzernamen ein, falls du dich daran erinnerst.", "LabelFriendlyName": "Benutzerfreundlicher Name:", - "LabelServerNameHelp": "Dieser Name wird benutzt um den Server zu identifizieren, standardmäßig wird der Server-/Computername verwendet.", + "LabelServerNameHelp": "Dieser Name wird benutzt, um den Server zu identifizieren, standardmäßig wird der Hostname des Servers verwendet.", "LabelGroupMoviesIntoCollections": "Gruppiere Filme in Collections", - "LabelGroupMoviesIntoCollectionsHelp": "Wenn Filmlisten angezeigt werden, dann werden Filme, die zu einer Collection gehören, als ein gruppiertes Element angezeigt.", + "LabelGroupMoviesIntoCollectionsHelp": "Wenn Filmlisten angezeigt werden, werden Filme in einer Sammlung als ein gruppiertes Element angezeigt.", "LabelEncoderPreset": "H264 Encoding Voreinstellung:", "LabelHardwareAccelerationType": "Hardware Beschleunigung:", "LabelHardwareAccelerationTypeHelp": "Hardwarebeschleunigung benötigt zusätzliche Konfiguration.", "LabelHomeNetworkQuality": "Heimnetzwerkqualität:", "LabelHomeScreenSectionValue": "Startseitenbereich {0}:", "LabelHttpsPort": "Lokale HTTPS-Portnummer:", - "LabelHttpsPortHelp": "Die TCP-Portnummer, die der HTTPS-Server von Jellyfin verwenden soll.", + "LabelHttpsPortHelp": "Die TCP-Portnummer für den HTTPS-Server.", "LabelIconMaxHeight": "Maximale Iconhöhe:", "LabelIconMaxHeightHelp": "Maximale Auflösung für durch UPnP übermittelte Icons:icon.", "LabelIconMaxWidth": "Maximale Iconbreite:", @@ -609,7 +551,7 @@ "LabelLanguage": "Sprache:", "LabelLineup": "TV Programm:", "LabelLocalHttpServerPortNumber": "Lokale HTTP Portnummer:", - "LabelLocalHttpServerPortNumberHelp": "Die TCP-Portnummer, die der HTTP-Server von Jellyfin verwenden soll.", + "LabelLocalHttpServerPortNumberHelp": "Die TCP-Portnummer für den HTTP-Server.", "LabelLockItemToPreventChanges": "Sperre diesen Eintrag um zukünftige Änderungen zu verhindern", "LabelLoginDisclaimer": "Anmeldung Haftungsausschluss:", "LabelLoginDisclaimerHelp": "Diese Nachricht wird am unteren Ende des Anmeldebildschirms angezeigt.", @@ -634,7 +576,7 @@ "LabelMetadataReaders": "Metadatenleser:", "LabelMetadataReadersHelp": "Lege deine bevorzugte lokale Metadatenquelle fest und ordne sie nach Prioritäten. Die erste Datei die gefunden wird, wird verwendet.", "LabelMetadataSavers": "Metadaten-Speicherer:", - "LabelMetadataSaversHelp": "Wähle das Dateiformat, in dem deine Metadaten gespeichert werden sollen.", + "LabelMetadataSaversHelp": "Wähle die Dateiformate, die beim Speichern deiner Metadaten verwendet werden sollen.", "LabelMethod": "Methode:", "LabelMinBackdropDownloadWidth": "Minimale Breite für zu herunterladende Hintergründe:", "LabelMinResumeDuration": "Minimale Dauer für Wiederaufnahme:", @@ -650,20 +592,19 @@ "LabelMovieCategories": "Filmkategorien:", "LabelMoviePrefix": "Filmpräfix:", "LabelMoviePrefixHelp": "Wenn ein Präfix in Filmtiteln angewendet wird, gib es hier ein damit der Server es korrekt behandeln kann.", - "LabelMovieRecordingPath": "Film Aufnahmepfad (Optional):", + "LabelMovieRecordingPath": "Film Aufnahmepfad:", "LabelMusicStreamingTranscodingBitrate": "Musik-Transkodierung Bitrate:", - "LabelMusicStreamingTranscodingBitrateHelp": "Wähle die maximale Bitrate für das streamen von Musik.", + "LabelMusicStreamingTranscodingBitrateHelp": "Wähle die maximale Bitrate für das Streamen von Musik.", "LabelNewName": "Neuer Name:", "LabelNewPassword": "Neues Passwort:", "LabelNewPasswordConfirm": "Neues Passwort wiederholen:", "LabelNewsCategories": "Nachrichtenkategorien:", - "LabelNext": "Nächstes", "LabelNotificationEnabled": "Aktiviere diese Benachrichtigung", "LabelNumber": "Nummer:", "LabelNumberOfGuideDays": "Anzahl von Tagen für die Programminformationen geladen werden sollen:", "LabelNumberOfGuideDaysHelp": "Das laden von zusätzlichen Programmdaten bietet einen besseren Überblick und die Möglichkeit weiter in die Zukunft zu planen. Aber es wird länger dauern alles herunterzuladen. Auto wählt auf Grundlage der Kanalanzahl.", - "LabelOptionalNetworkPath": "(Optionaler) Gemeinsamer Netzwerkordner:", - "LabelOptionalNetworkPathHelp": "Wenn dieser Ordner in deinem Netzwerk geteilt wird, kann die Weitergabe des Netzwerkpfades Jellyfin Apps auf anderen Geräten direkten Zugang zu den Mediendateien ermöglichen. Beispielsweise {0} oder {1}.", + "LabelOptionalNetworkPath": "Geteilter Netzwerkordner:", + "LabelOptionalNetworkPathHelp": "Wenn dieser Ordner in deinem Netzwerk geteilt wird, kann die Weitergabe des Netzwerkpfades Clients auf anderen Geräten direkten Zugang zu den Mediendateien ermöglichen. Beispielsweise {0} oder {1}.", "LabelOriginalAspectRatio": "Original Seitenverhältnis:", "LabelOriginalTitle": "Original Titel:", "LabelOverview": "Übersicht:", @@ -682,9 +623,7 @@ "LabelPostProcessorArguments": "Nachbearbeitung Kommandozeilen-Argumente:", "LabelPostProcessorArgumentsHelp": "Verwende {path} als das Verzeichnis für Aufnahmen.", "LabelPreferredDisplayLanguage": "Bevorzugte Anzeigesprache:", - "LabelPreferredDisplayLanguageHelp": "Die Übersetzung von Jellyfin ist ein laufendes Projekt.", "LabelPreferredSubtitleLanguage": "Bevorzugte Untertitelsprache:", - "LabelPrevious": "Vorheriges", "LabelProfileAudioCodecs": "Audio Codecs:", "LabelProfileCodecsHelp": "Getrennt durch Komma. Leerlassen, um auf alle Codecs anzuwenden.", "LabelProfileContainersHelp": "Getrennt durch Komma. Leerlassen, um auf alle Containerformate anzuwenden.", @@ -696,7 +635,6 @@ "LabelPublicHttpPortHelp": "Die öffentliche Portnummer sollte einem lokalen HTTP Port zugewiesen werden.", "LabelPublicHttpsPort": "Öffentliche HTTPS Portnummer:", "LabelPublicHttpsPortHelp": "Die öffentliche Portnummer sollte einem lokalen HTTPS Port zugewiesen werden.", - "LabelReadHowYouCanContribute": "Erfahren Sie, wie Sie unterstützen können.", "LabelReasonForTranscoding": "Grund für die Transkodierung:", "LabelRecord": "Aufnahme:", "LabelRecordingPath": "Standard Aufnahmepfad:", @@ -705,7 +643,7 @@ "LabelReleaseDate": "Veröffentlichungsdatum:", "LabelRemoteClientBitrateLimit": "Limit für die Internet Streaming Datenrate (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Ein optionales Bitratenlimit pro Stream für alle Geräte außerhalb des Netzwerkes. Dies ist nützlich um zu verhindern, dass Geräte eine höhere Datenrate verwenden als die Internetverbindung erlaubt. Es kann zu erhöhter CPU-Last auf deinem Server kommen, da ggf. Videos in Echtzeit in eine niedrigere Bitrate transkodiert werden müssen.", - "LabelRuntimeMinutes": "Laufzeit (Minuten):", + "LabelRuntimeMinutes": "Laufzeit:", "LabelSaveLocalMetadata": "Speichere Bildmaterial und Metadaten in den Medienverzeichnissen", "LabelSaveLocalMetadataHelp": "Durch die Speicherung von Bildmaterial und Metadaten direkt in den Medienverzeichnissen, befinden sich diese an einem Ort wo sie sehr leicht bearbeitet werden können.", "LabelScheduledTaskLastRan": "Zuletzt ausgeführt vor: {0}. Benötigte Zeit: {1}.", @@ -717,7 +655,7 @@ "LabelSelectVersionToInstall": "Wähle die Version für die Installation:", "LabelSendNotificationToUsers": "Sende die Benachrichtigung an:", "LabelSerialNumber": "Seriennummer", - "LabelSeriesRecordingPath": "Serien Aufnahmepfad (optional):", + "LabelSeriesRecordingPath": "Serien Aufnahmepfad:", "LabelServerHost": "Adresse:", "LabelServerHostHelp": "192.168.1.100 oder https://myserver.com", "LabelSimultaneousConnectionLimit": "Paralleler Streamlimit:", @@ -732,7 +670,6 @@ "LabelSortBy": "Sortiert nach:", "LabelSortOrder": "Sortierreihenfolge:", "LabelSortTitle": "Sortierungs Titel:", - "LabelSoundEffects": "Soundeffekte:", "LabelSource": "Quelle:", "LabelSpecialSeasonsDisplayName": "Anzeigename für Serien-Specials:", "LabelSportsCategories": "Sportkategorie:", @@ -742,7 +679,6 @@ "LabelSubtitleDownloaders": "Untertitel Downloader:", "LabelSubtitleFormatHelp": "Beispiel: srt", "LabelSubtitlePlaybackMode": "Untertitelmodus:", - "LabelSubtitles": "Untertitel", "LabelSupportedMediaTypes": "Unterstüzte Medientypen:", "LabelTVHomeScreen": "TV-Mode Startseite:", "LabelTextBackgroundColor": "Hintergrundfarbe des Textes:", @@ -753,11 +689,9 @@ "LabelTimeLimitHours": "Zeitlimit (Stunden):", "LabelTitle": "Titel:", "LabelTrackNumber": "Stück Nummer:", - "LabelTranscodingAudioCodec": "Audio Codec:", "LabelTranscodingTempPathHelp": "Wähle einen eigenen Pfad für transkodierte Dateien. Lasse das Feld frei, um den Standardspeicherort zu nutzen.", "LabelTranscodingThreadCount": "Anzahl Transkodierungs-Threads:", "LabelTranscodingThreadCountHelp": "Legen Sie die maximale Anzahl von Transkodierungs-Threads fest. Das Reduzieren der Thread-Anzahl verringert die CPU Auslastung, wird aber möglicherweise die Transkodierung nicht schnell genug für eine störungsfrei Wiedergabe ermöglichen.", - "LabelTranscodingVideoCodec": "Video Codec:", "LabelTriggerType": "Auslöser Typ:", "LabelTunerIpAddress": "Tuner IP Adresse:", "LabelTunerType": "Tuner Typ:", @@ -779,11 +713,10 @@ "LabelXDlnaDoc": "X-DLNA Dokument:", "LabelXDlnaDocHelp": "Legt den Inhalt des X_DLNADOC Elements in der urn:schemas-dlna-org:device-1-0 namespace fest.", "LabelYear": "Jahr:", - "LabelYourFirstName": "Vorname:", "LabelYoureDone": "Du bist fertig!", "LabelZipCode": "PLZ:", "LabelffmpegPath": "FFmpeg Verzeichnis:", - "LabelffmpegPathHelp": "Verzeichnis zur runtergeladenen FFmpeg Applikation oder zum Ordner, der FFMpeg enthält.", + "LabelffmpegPathHelp": "Verzeichnis zur FFmpeg Applikationsdatei oder zum Ordner, der FFmpeg enthält.", "LanNetworksHelp": "Komma separierte Liste von IP Adressen oder IP Masken die als lokale Netzwerke behandelt werden sollen um Bandbreitenlimitationen auszusetzen. Wenn befüllt werden alle anderen IP Adressen als externe Netzwerke behandelt und unterliegen den Bandbreitenlimitationen für externe Verbindungen. Wenn leer, wird nur das SubNetz des Servers als Lokales Netz gesetzt.", "Large": "Groß", "LatestFromLibrary": "Neueste {0}", @@ -826,20 +759,19 @@ "MessageConfirmProfileDeletion": "Bist du dir sicher, dass du dieses Profil löschen möchtest?", "MessageConfirmRecordingCancellation": "Aufnahme abbrechen?", "MessageConfirmRemoveMediaLocation": "Bist du dir sicher diese Medienquelle entfernen zu wollen?", - "MessageConfirmRestart": "Möchten Sie Jellyfin Server wirklich neu starten?", - "MessageConfirmRevokeApiKey": "Möchten Sie diesen API Schlüssel wirklich löschen? Die Verbindung der Anwendung zum Jellyfin Server wird sofort unterbrochen.", + "MessageConfirmRestart": "Möchten Sie Jellyfin wirklich neu starten?", + "MessageConfirmRevokeApiKey": "Möchten Sie diesen API Schlüssel wirklich löschen? Die Verbindung der Anwendung zum Server wird sofort unterbrochen.", "MessageConfirmShutdown": "Möchten Sie den Server wirklich herunterfahren?", "MessageContactAdminToResetPassword": "Bitte kontaktiere deinen Systemadministrator, um dein Passwort zurücksetzen zu lassen.", "MessageCreateAccountAt": "Erstellen Sie ein Konto bei {0}", "MessageDeleteTaskTrigger": "Bist du dir sicher, dass du diesen Aufgabenauslöser entfernen möchtest?", - "MessageDirectoryPickerBSDInstruction": "Für BSD müssen Sie ggf. Speicherplatz auf Ihrem FreeNAS Jail für Empby freigeben.", + "MessageDirectoryPickerBSDInstruction": "Für BSD müssen Sie ggf. Speicherplatz in deinem FreeNAS Jail konfigurieren, damit Jellyfin auf deine Medien zugreifen kann.", "MessageDirectoryPickerLinuxInstruction": "Für Linux auf Arch Linux, CentOS, Debian, Fedora, openSUSE oder Ubuntu muss der Service Benutzer mindestens lesenden Zugriff auf die Speicherorte der Medien besitzen.", "MessageDownloadQueued": "Download eingereiht.", "MessageEnablingOptionLongerScans": "Die Aktivierung dieser Option kann erheblich längere Bibliotheks-Scans verursachen.", "MessageFileReadError": "Es gab einen Fehler beim Lesen der Datei. Bitte versuche es erneut.", "MessageForgotPasswordFileCreated": "Die folgende Datei wurde auf deinem Server erstellt und enthält eine Anleitung, wie fortgefahren werden muss:", "MessageForgotPasswordInNetworkRequired": "Bitte versuche es erneut innerhalb deines Heimnetzwerks, um die Passwort Zurücksetzung zu starten.", - "MessageInstallPluginFromApp": "Dieses Plugin muss von der App aus installiert werden, in der du es benutzen willst.", "MessageInvalidForgotPasswordPin": "Ein ungültiger oder abgelaufener PIN-Code wurde eingegeben. Bitte versuche es noch einmal.", "MessageInvalidUser": "Falscher Benutzername oder Passwort. Bitte versuche es noch einmal.", "MessageItemSaved": "Element gespeichert.", @@ -855,16 +787,15 @@ "MessagePleaseEnsureInternetMetadata": "Bitte sicherstellen, dass das Herunterladen von Internet Metadaten aktiviert ist.", "MessagePleaseWait": "Bitte warten, dies kann eine Minute dauern.", "MessagePluginConfigurationRequiresLocalAccess": "Melde dich bitte direkt an deinem lokalen Server an, um dieses Plugin konfigurieren zu können.", - "MessagePluginInstallDisclaimer": "Plugins aus der Jellyfin Community sind eine gute Möglichkeit um Jellyfin mit weiteren Funktionen und Vorteilen aufzuwerten. Bevor Sie diese jedoch installieren, seien Sie sich den daraus resultierenden möglichen Umständen für Jellyfin bewusst. Dies können z.B. längere Bibliotheken Scans, weiterführende Verarbeitung von Daten im Hintergrund sowie Systeminstabilität sein.", + "MessagePluginInstallDisclaimer": "Plugins aus der Community sind eine gute Möglichkeit um dein Erlebnis mit weiteren Funktionen und Vorteilen aufzuwerten. Bevor du diese installierst, sei dir den daraus resultierenden möglichen Umständen für deinen Server bewusst. Dies können z.B. längere Bibliotheken Scans, weiterführende Verarbeitung von Daten im Hintergrund sowie Systeminstabilität sein.", "MessageReenableUser": "Für Reaktivierung schauen Sie unten", - "MessageSettingsSaved": "Einstellungen gespeichert.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Die folgenden Medienverzeichnisse werden aus der Bibliothek entfernt:", "MessageUnableToConnectToServer": "Wir können gerade keine Verbindung zum gewählten Server herstellen. Bitte stellen Sie sicher das dieser läuft und versuchen Sie es erneut.", "MessageUnsetContentHelp": "Inhalte werden als Verzeichnisse dargestellt. Für eine besser Anzeige nutzen Sie nach Möglichkeit den Meta-Data Manager und wählen Sie einen Medien-Typen für Unterverzeichnisse.", "MessageYouHaveVersionInstalled": "Du hast momentan Version {0} installiert.", "Metadata": "Metadaten", "MetadataManager": "Metadaten-Manager", - "MetadataSettingChangeHelp": "Das Verändern der Metadata-Einstellungen hat nur Einfluss auf neu hinzugefügte Inhalte. Um eine Aktualisierung bereits hinzugefügter Inhalte durchzuführen, öffnen Sie bitte die Detail Ansicht und klicken die Aktualisieren Schaltfläche. Die Aktualisierung mehrerer Inhalte kann im Metadata Manager durchgeführt werden.", + "MetadataSettingChangeHelp": "Das Verändern der Metadata-Einstellungen hat nur Einfluss auf neu hinzugefügte Inhalte. Um eine Aktualisierung bereits hinzugefügter Inhalte durchzuführen, öffnen Sie bitte die Detailansicht und klicken die Aktualisieren-Schaltfläche. Die Aktualisierung mehrerer Inhalte kann im Metadata Manager durchgeführt werden.", "MinutesAfter": "Minuten nach", "MinutesBefore": "Minuten vor", "Mobile": "Smartphone", @@ -888,10 +819,9 @@ "NextUp": "Es folgt", "No": "Nein", "NoNewDevicesFound": "Keine neuen Geräte gefunden. Um einen neuen Tuner hinzuzufügen, schließe diesen Dialog und gebe die Geräteinformationen manuell ein.", - "NoNextUpItemsMessage": "Es wurde nichts gefunden. Schau dir deine Shows an!", - "NoPluginConfigurationMessage": "Dieses Plugin hat keine konfigurierbaren Einstellungen.", + "MessageNoNextUpItems": "Es wurde nichts gefunden. Schau dir deine Shows an!", + "MessageNoPluginConfiguration": "Dieses Plugin hat keine konfigurierbaren Einstellungen.", "NoSubtitleSearchResultsFound": "Keine Ergebnisse gefunden.", - "NoSubtitles": "Keine", "NoSubtitlesHelp": "Untertitel werden standardmäßig nicht geladen. Sie können aber während der Wiedergabe manuell aktiviert werden.", "None": "Keines", "NumLocationsValue": "{0} Verzeichnisse", @@ -910,7 +840,7 @@ "OptionAllowLinkSharingHelp": "Es werden nur Web-Seiten mit Medieninformationen geteilt. Medien hingenen werden niemals öffentlich geteilt. Die geteilten Inhalte sind nur begrenzt zugänglich werden nach {0} Tagen ungültig.", "OptionAllowManageLiveTv": "Erlaube Live-TV Aufnahmeplanung", "OptionAllowMediaPlayback": "Erlaube Medienwiedergabe", - "OptionAllowMediaPlaybackTranscodingHelp": "Das Einschränken des Transcoding-Zugriffes kann bei nicht unterstützten Medienformaten Abspielfehler in Jellyfin Apps hervorrufen.", + "OptionAllowMediaPlaybackTranscodingHelp": "Das Einschränken des Transcoding-Zugriffes kann durch nicht unterstützte Medienformate Abspielfehler in Clients hervorrufen.", "OptionAllowRemoteControlOthers": "Erlaube Fernsteuerung anderer Benutzer", "OptionAllowRemoteSharedDevices": "Erlaube Fernsteuerung geteilter Geräte", "OptionAllowRemoteSharedDevicesHelp": "DLNA-Geräte werden als gemeinsam genutzt betrachtet, bis ein Benutzer die Steuerung übernimmt.", @@ -921,7 +851,7 @@ "OptionArtist": "Interpret", "OptionAscending": "Aufsteigend", "OptionAutomaticallyGroupSeries": "Vermische Serieninhalte, die in verschiedenen Ordnern abgelegt sind", - "OptionAutomaticallyGroupSeriesHelp": "Wenn aktiviert, werden Inhalte einer Serie in verschiedenen Ordnern innerhalb einer Bibliothek als eine Serie angezeigt.", + "OptionAutomaticallyGroupSeriesHelp": "Inhalte einer Serie in verschiedenen Ordnern werden innerhalb einer Bibliothek als eine Serie angezeigt.", "OptionBlockBooks": "Bücher", "OptionBlockChannelContent": "Internet Channelinhalte", "OptionBlockLiveTvChannels": "Live-TV Kanäle", @@ -940,7 +870,7 @@ "OptionDatePlayed": "Gesehen am", "OptionDescending": "Absteigend", "OptionDisableUser": "Sperre diesen Benutzer", - "OptionDisableUserHelp": "Wenn deaktiviert wird der Server keine Verbindung von diesem Benutzer erlauben. Bestehende Verbindungen werden sofort beendet.", + "OptionDisableUserHelp": "Der Server keine Verbindung von diesem Benutzer erlauben. Bestehende Verbindungen werden sofort beendet.", "OptionDislikes": "Mag ich nicht", "OptionDisplayFolderView": "Darstellung in Verzeichnisansicht zeigt Medien Verzechnisse", "OptionDisplayFolderViewHelp": "Zeige eine Verzeichnisansicht neben deinen Bibliotheken an. Dies kann praktisch sein, wenn man nur Verzeichnisansichten verwendet.", @@ -948,7 +878,7 @@ "OptionDownloadBackImage": "Zurück", "OptionDownloadDiscImage": "Disk", "OptionDownloadImagesInAdvance": "Bilder vorab herunterladen", - "OptionDownloadImagesInAdvanceHelp": "Grundsätzlich werden die meisten Bilder erst dann runter geladen, wenn eine Jellyfin-App diese anfragt. Schalten Sie diese Option ein um alle Bilder im Voraus herunterzuladen, wenn neue Medien importiert wurden. Diese Einstellung kann zu signifikant längeren Bibliothekscans führen.", + "OptionDownloadImagesInAdvanceHelp": "Standardmäßig werden die meisten Bilder erst dann heruntergeladen, wenn ein Client diese anfragt. Schalten Sie diese Option ein um alle Bilder im Voraus herunterzuladen, wenn neue Medien importiert werden. Diese Einstellung kann zu signifikant längeren Bibliothekscans führen.", "OptionDownloadMenuImage": "Menü", "OptionDownloadPrimaryImage": "Primär", "OptionDvd": "DVD", @@ -968,7 +898,6 @@ "OptionExternallyDownloaded": "Externer Download", "OptionExtractChapterImage": "Aktiviere Kapitelbild-Extrahierung", "OptionFavorite": "Favoriten", - "OptionFriday": "Freitag", "OptionHasSpecialFeatures": "Besonderes Merkmal", "OptionHasSubtitles": "Untertitel", "OptionHasThemeSong": "Titellied", @@ -978,20 +907,18 @@ "OptionHlsSegmentedSubtitles": "HLS segmentierte Untertitel", "OptionHomeVideos": "Fotos", "OptionIgnoreTranscodeByteRangeRequests": "Ignoriere Anfragen für Transkodierbytebereiche", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Falls aktiviert, werden diese Anfragen berücksichtigt aber Byte-Range-Header ignoriert werden.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Diese Anfragen werden berücksichtigt, aber den Byte-Range-Header ignorieren.", "OptionImdbRating": "IMDb Bewertung", "OptionLikes": "Mag ich", "OptionMissingEpisode": "Fehlende Episoden", - "OptionMonday": "Montag", "OptionNew": "Neu…", "OptionNone": "Keines", - "OptionOnAppStartup": "Bei Anwendungsstart", "OptionOnInterval": "Nach einem Intervall", "OptionParentalRating": "Altersfreigabe", "OptionPlainStorageFolders": "Zeige alle Verzeichnisse als reine Speicherorte an", - "OptionPlainStorageFoldersHelp": "Falls aktiviert, werden alle Verzeichnisse in DIDL als \"object.container.storageFolder\" angezeigt, anstatt eines spezifischen Typs wie beispielsweise \"object.container.person.musicArtist\".", + "OptionPlainStorageFoldersHelp": "Alle Verzeichnisse werden in DIDL als \"object.container.storageFolder\" angezeigt, anstatt eines spezifischen Typs wie beispielsweise \"object.container.person.musicArtist\".", "OptionPlainVideoItems": "Zeige alle Videos als reine Videodateien an", - "OptionPlainVideoItemsHelp": "Falls aktiviert, werden alle Videos in DIDL als \"object.item.videoItem\" angezeigt, anstatt eines spezifischen Typs wie beispielsweise \"object.item.videoItem.movie\".", + "OptionPlainVideoItemsHelp": "Alle Videos werden in DIDL als \"object.item.videoItem\" angezeigt, anstatt eines spezifischen Typs wie beispielsweise \"object.item.videoItem.movie\".", "OptionPlayCount": "Zähler", "OptionPlayed": "Gesehen", "OptionPremiereDate": "Premiere", @@ -1003,17 +930,12 @@ "OptionResElement": "Res Element", "OptionResumable": "Fortsetzen", "OptionRuntime": "Dauer", - "OptionSaturday": "Samstag", "OptionSaveMetadataAsHidden": "Speichere Metadaten und Bilder als versteckte Dateien", - "OptionSaveMetadataAsHiddenHelp": "Änderungen werden sich auf neue Metadaten angewendet. Bereits existierende Metadaten werden bei der nächsten Speicherung des Jellyfin Servers auf den neusten Stand gebracht.", - "OptionSunday": "Sonntag", - "OptionThursday": "Donnerstag", - "OptionTuesday": "Dienstag", + "OptionSaveMetadataAsHiddenHelp": "Änderungen werden sich auf neue Metadaten angewendet. Bereits existierende Metadaten werden bei der nächsten Speicherung des Servers auf den neusten Stand gebracht.", "OptionTvdbRating": "TVDB Bewertung", "OptionUnairedEpisode": "Nicht ausgestrahlte Episoden", "OptionUnplayed": "Ungesehen", "OptionWakeFromSleep": "Aufwachen nach dem Schlafen", - "OptionWednesday": "Mittwoch", "OptionWeekdays": "Wöchentlich", "OptionWeekends": "An Wochenenden", "OptionWeekly": "Wöchentlich", @@ -1026,7 +948,7 @@ "PasswordMatchError": "Die Passwörter müssen übereinstimmen.", "PasswordResetComplete": "Das Passwort wurde zurückgesetzt.", "PasswordResetConfirmation": "Möchtest du das Passwort wirklich zurücksetzen?", - "PasswordResetHeader": "Passwort zurücksetzen", + "HeaderResetPassword": "Passwort zurücksetzen", "PasswordSaved": "Passwort gespeichert.", "People": "Personen", "PerfectMatch": "Perfektes Ergbnis", @@ -1046,9 +968,9 @@ "PleaseAddAtLeastOneFolder": "Bitte fügen Sie mindestens ein Verzeichniss zur Bibliothek durch Klicken der \"Hinzufügen\"-Schaltfläche hinzu.", "PleaseConfirmPluginInstallation": "Bitte bestätigen Sie mit OK, dass Sie den oben stehenden Text gelesen haben und die Installation des Plugins fortführen möchten.", "PleaseEnterNameOrId": "Bitte gib einen Namen oder eine externe ID an.", - "PleaseRestartServerName": "Bitte starte Jellyfin Server - {0} neu.", + "PleaseRestartServerName": "Bitte starte Jellyfin an {0} neu.", "PleaseSelectTwoItems": "Bitte wähle mindestens zwei Optionen aus.", - "PluginInstalledMessage": "Das Plugin wurde erfolgreich installiert. Der Jellyfin-Server muss neu gestartet werden, um die Änderungen zu übernehmen.", + "MessagePluginInstalled": "Das Plugin wurde erfolgreich installiert. Der Server muss neu gestartet werden, um die Änderungen zu übernehmen.", "PreferEmbeddedTitlesOverFileNames": "Bevorzuge eingebettete Titel vor Dateinamen", "PreferEmbeddedTitlesOverFileNamesHelp": "Das bestimmt den Standard Displaytitel wenn keine lokale oder Internetmetadaten verfügbar sind.", "PreferEmbeddedEpisodeInfosOverFileNames": "Bevorzuge eingebettete Episodeninformationen vor Dateinamen", @@ -1060,7 +982,6 @@ "ProductionLocations": "Drehorte", "Programs": "Programme", "Quality": "Qualität", - "QueueAllFromHere": "Setze alles von hier auf Warteschlange", "Raised": "Angehoben", "Rate": "Bewerte", "RecentlyWatched": "Kürzlich gesehen", @@ -1071,11 +992,11 @@ "Record": "Aufnehmen", "RecordSeries": "Serie aufnehmen", "RecordingCancelled": "Aufnahme abgebrochen.", - "RecordingPathChangeMessage": "Das Ändern des Aufnahmeverzeichnisses wird alte Aufnahmen nicht automatisch verschieben. Wenn Du das möchtest, musst Du das selber machen.", + "MessageChangeRecordingPath": "Das Ändern des Aufnahmeverzeichnisses wird alte Aufnahmen nicht automatisch verschieben. Wenn Du das möchtest, musst Du das selber machen.", "RecordingScheduled": "Aufnahme geplant.", "Recordings": "Aufnahmen", "Refresh": "Aktualisieren", - "RefreshDialogHelp": "Metadaten werden auf Basis der Einstellungen und Internet Services in den Jellyfin Server Einstellungen aktualisiert.", + "RefreshDialogHelp": "Metadaten werden auf Basis der Einstellungen und Internet Services, die im Dashboard aktiviert sind, aktualisiert.", "RefreshMetadata": "Aktualisiere Metadaten", "RefreshQueued": "Aktualisierung eingereiht.", "ReleaseDate": "Veröffentlichungsdatum", @@ -1091,7 +1012,6 @@ "ReplaceExistingImages": "Ersetze vorhandene Bilder", "ResumeAt": "Fortsetzen bei {0}", "Rewind": "Zurückspulen", - "RunAtStartup": "Nach Hochfahren automatisch starten", "Runtime": "Laufzeit", "Saturday": "Samstag", "Save": "Speichern", @@ -1113,10 +1033,10 @@ "SeriesRecordingScheduled": "Serien-Aufnahme geplant.", "SeriesSettings": "Serieneinstellungen", "SeriesYearToPresent": "{0}-Heute", - "ServerNameIsRestarting": "Jellyfin Server - {0} startet neu.", - "ServerNameIsShuttingDown": "Jellyfin Server - {0} fährt herunter.", - "ServerRestartNeededAfterPluginInstall": "Der Jellyfin-Server muss nach der Installation eines Plugins neu gestartet werden.", - "ServerUpdateNeeded": "Dieser Jellyfin Server muss aktualisiert werden. Um die neueste Version herunterzuladen, besuche bitte {0}", + "ServerNameIsRestarting": "Jellyfin Server an {0} startet neu.", + "ServerNameIsShuttingDown": "Der Server an {0} fährt herunter.", + "ServerRestartNeededAfterPluginInstall": "Jellyfin muss nach der Installation eines Plugins neu gestartet werden.", + "ServerUpdateNeeded": "Dieser Server muss aktualisiert werden. Um die neueste Version herunterzuladen, besuche bitte {0}", "Settings": "Einstellungen", "SettingsSaved": "Einstellungen gespeichert.", "SettingsWarning": "Das Verändern dieser Werte kann Instabilität und Verbindungsprobleme hervorrufen. Wenn Probleme auftreten sollten empfehlen wir diese Einstellungen auf die Standardwerte zurück zu stellen.", @@ -1150,50 +1070,24 @@ "SystemDlnaProfilesHelp": "Systemprofile sind schreibgeschützt. Änderungen an einem Systemprofil werden als neues benutzerdefiniertes Profil gespeichert.", "TabAccess": "Zugang", "TabAdvanced": "Erweitert", - "TabAlbumArtists": "Album-Interpreten", - "TabAlbums": "Alben", - "TabArtists": "Interpreten", "TabCatalog": "Katalog", - "TabChannels": "Kanäle", - "TabCollections": "Sammlungen", "TabContainers": "Container", "TabDashboard": "Übersicht", - "TabDevices": "Geräte", "TabDirectPlay": "Direktwiedergabe", - "TabDisplay": "Anzeige", - "TabEpisodes": "Episoden", - "TabFavorites": "Favoriten", - "TabGuide": "Programm", "TabLatest": "Neueste", - "TabLiveTV": "Live-TV", - "TabMetadata": "Metadaten", - "TabMovies": "Filme", "TabMusic": "Musik", - "TabMusicVideos": "Musikvideos", "TabMyPlugins": "Meine Plugins", "TabNetworks": "Sendergruppen", "TabNfoSettings": "NFO Einstellungen", "TabNotifications": "Benachrichtigungen", "TabOther": "Andere", "TabParentalControl": "Kindersicherung", - "TabPassword": "Passwort", - "TabPlayback": "Wiedergabe", - "TabPlaylist": "Wiedergabeliste", - "TabPlaylists": "Wiedergabelisten", "TabProfile": "Profil", "TabProfiles": "Profile", - "TabRecordings": "Aufnahmen", "TabResponses": "Antworten", - "TabResumeSettings": "Fortsetzen", "TabScheduledTasks": "Geplante Aufgaben", - "TabSeries": "Serie", "TabSettings": "Einstellungen", - "TabShows": "Serien", - "TabSuggestions": "Empfehlungen", - "TabTrailers": "Trailer", - "TabTranscoding": "Transkodierung", "TabUpcoming": "Bevorstehend", - "TabUsers": "Benutzer", "TellUsAboutYourself": "Sagen Sie uns etwas über sich selbst", "ThemeSongs": "Titelsongs", "ThemeVideos": "Titelvideos", @@ -1209,7 +1103,7 @@ "TvLibraryHelp": "Überprüfe den {0}Serienbenennungsleitfaden{1}.", "Uniform": "Einheitlich", "UninstallPluginConfirmation": "Möchtest du {0} wirklich deinstallieren?", - "UninstallPluginHeader": "Plugin deinstallieren", + "HeaderUninstallPlugin": "Plugin deinstallieren", "Unmute": "Ton ein", "Unplayed": "Ungesehen", "Unrated": "Nicht bewertet", @@ -1255,9 +1149,6 @@ "Auto": "Auto", "Banner": "Banner", "Blacklist": "Sperrliste", - "ButtonDownload": "Download", - "ButtonFilter": "Filter", - "ButtonHome": "Startseite", "ButtonOk": "Ok", "ButtonPause": "Pause", "ButtonStart": "Start", @@ -1275,16 +1166,13 @@ "Genres": "Genres", "HeaderAdmin": "Admin", "HeaderApp": "App", - "HeaderGenres": "Genres", "HeaderHttpHeaders": "HTTP-Header", "HeaderPluginInstallation": "Plugininstallation", "HeaderStatus": "Status", - "HeaderTags": "Tags", "HeaderVideos": "Videos", "Home": "Startseite", "Horizontal": "Horizontal", "LabelAlbum": "Album:", - "LabelAudio": "Audio", "LabelCache": "Cache:", "LabelFormat": "Format:", "LabelH264Crf": "H264 Encodierungs-CRF:", @@ -1292,7 +1180,6 @@ "LabelName": "Name:", "LabelProfileCodecs": "Codecs:", "LabelProfileContainer": "Container:", - "LabelSkin": "Textur:", "Art": "Coverkunst", "Name": "Name", "Songs": "Songs", @@ -1304,13 +1191,11 @@ "LabelVersion": "Version:", "LabelVideo": "Video", "LeaveBlankToNotSetAPassword": "Dieses Feld frei lassen, um kein Passwort zu setzen.", - "LinksValue": "Links: {0}", "MessageImageFileTypeAllowed": "Nur JPEG- und PNG-Dateien werden unterstützt.", "MessageImageTypeNotSelected": "Bitte wähle einen Bildtyp aus dem Drop-Down Menü aus.", "Normal": "Normal", "LabelDynamicExternalId": "{0} Id:", "LabelStatus": "Status:", - "LabelTranscodingContainer": "Container:", "Live": "Live", "LiveTV": "Live-TV", "Logo": "Logo", @@ -1322,7 +1207,6 @@ "Option3D": "3D", "OptionAlbum": "Album", "OptionAuto": "Auto", - "OptionAutomatic": "Auto", "OptionBluray": "Blu-ray", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", "OptionDownloadBannerImage": "Banner", @@ -1343,12 +1227,9 @@ "Studios": "Studios", "TV": "TV", "TabCodecs": "Codecs", - "TabGenres": "Genres", - "TabInfo": "Info", "TabLogs": "Protokoll", "TabPlugins": "Plugins", "TabServer": "Server", - "TabSongs": "Songs", "TabStreaming": "Streaming", "Transcoding": "Transcoding", "ValueAudioCodec": "Audiocodec: {0}", @@ -1369,7 +1250,7 @@ "TagsValue": "Markierungen: {0}", "Thumb": "Miniaturansicht", "Whitelist": "Erlaubt", - "AuthProviderHelp": "Wähle einen Authentifizierungsanbieter, der zur Authentifizierung des Passworts dieses Benutzes verwendet werden soll.", + "AuthProviderHelp": "Wähle einen Authentifizierungsanbieter, der zur Authentifizierung des Passworts dieses Benutzers verwendet werden soll.", "Features": "Funktionen", "HeaderFavoriteBooks": "Lieblingsbücher", "HeaderFavoriteMovies": "Lieblingsfilme", @@ -1386,7 +1267,6 @@ "DashboardVersionNumber": "Version: {0}", "DashboardServerName": "Server: {0}", "LabelWeb": "Web:", - "MediaInfoSoftware": "Software", "MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeData": "Daten", "MediaInfoStreamTypeEmbeddedImage": "Eingebettetes Bild", @@ -1396,9 +1276,8 @@ "OptionDownloadBoxImage": "Box", "OptionLoginAttemptsBeforeLockout": "Legt fest, wie viele falsche Anmeldeversuche durchgeführt werden können, bevor es zur Sperrung kommt.", "OptionLoginAttemptsBeforeLockoutHelp": "Null (0) bedeutet den Standardwert von drei Versuchen für normale, sowie fünf für Administrator-Benutzer zu übernehmen. Ein Wert von -1 deaktiviert die Funktion.", - "PasswordResetProviderHelp": "Wählen Sie einen Password Reset Provider, der verwendet werden soll, wenn dieser Benutzer ein Passwort zurücksetzen möchte", + "PasswordResetProviderHelp": "Wählen Sie einen Password Reset Provider, der verwendet werden soll, wenn dieser Benutzer ein Passwort zurücksetzen möchte.", "Box": "Box", - "HeaderHome": "Startseite", "LabelAudioCodec": "Audiocodec:", "LabelAudioChannels": "Audiokanäle:", "HeaderTypeImageFetchers": "{0} Bildquellen", @@ -1414,15 +1293,13 @@ "LabelTranscodingFramerate": "Transcodierrate:", "LabelAudioSampleRate": "Audio-Abtastrate:", "LabelBaseUrl": "Basis URL:", - "LabelBaseUrlHelp": "Fügt ein benutzerdefiniertes Unterverzeichnis zur Server-URL hinzu, zum Beispiel: http://example.com/<baseurl>", + "LabelBaseUrlHelp": "Füge ein benutzerdefiniertes Unterverzeichnis zur Server-URL hinzu, zum Beispiel: http://example.com/<baseurl>", "LabelFolder": "Ordner:", "LabelPasswordResetProvider": "Anbieter zum Zurücksetzen des Passwortes:", "LabelPlayMethod": "Spielmethode:", "DashboardOperatingSystem": "Betriebssystem: {0}", "DashboardArchitecture": "Architektur: {0}", "LabelVideoCodec": "Videocodec:", - "LaunchWebAppOnStartup": "Das Webinterface öffnen, wenn der Server startet", - "LaunchWebAppOnStartupHelp": "Öffne den Webclient in Standard-Webbrowser, wenn der Server zum ersten Mal gestartet wird. Dies tritt bei Verwendung der Neustart-Serverfunktion nicht auf.", "MusicArtist": "Interpret", "MusicAlbum": "Musikalbum", "MoreMediaInfo": "Medieninformation", @@ -1441,11 +1318,9 @@ "MusicLibraryHelp": "Überprüfe den {0}Musikbenennungsguide{1}.", "OptionRandom": "Zufällig", "TabNetworking": "Netzwerk", - "VideoRange": "Videobereich", "ButtonSplit": "Trennen", "SelectAdminUsername": "Bitte wählen Sie einen Benutzernamen für den Administrator-Account.", "HeaderNavigation": "Navigation", - "CopyStreamURLError": "Beim Kopieren der URL ist ein Fehler aufgetreten.", "MessageConfirmAppExit": "Wirklich verlassen?", "LabelVideoResolution": "Videoauflösung:", "LabelStreamType": "Streamtyp:", @@ -1469,13 +1344,11 @@ "LastSeen": "Zuletzt gesehen {0}", "PersonRole": "als {0}", "ListPaging": "{0}-{1} von {2}", - "WriteAccessRequired": "Jellyfin Server benötigt Schreibrechte auf diesem Ordner. Bitte prüfe die Schreibrechte und versuche es erneut.", + "WriteAccessRequired": "Jellyfin benötigt Schreibrechte auf diesem Ordner. Bitte prüfe die Schreibrechte und versuche es erneut.", "PathNotFound": "Der Pfad konnte nicht gefunden werden. Bitte versichere dich dass der Pfad korrekt ist und versuche es erneut.", "Track": "Track", "Season": "Staffel", - "ReleaseGroup": "Veröffentlichungs-Gruppe", "Person": "Person", - "OtherArtist": "Andere Künstler", "Movie": "Film", "Episode": "Episode", "Artist": "Künstler", @@ -1491,20 +1364,16 @@ "UnsupportedPlayback": "Jellyfin kann keine DRM-geschützten Inhalte entschlüsseln, aber es wird versucht, alle Inhalte unabhängig davon zu entschlüsseln, einschließlich geschützter Titel. Einige Dateien können aufgrund der Verschlüsselung oder anderer nicht unterstützter Funktionen, wie z.B. interaktive Titel, komplett schwarz erscheinen.", "Filter": "Filter", "New": "Neu", - "MessageUnauthorizedUser": "Sie sind im Moment nicht berechtigt, auf den Server zuzugreifen. Bitte kontaktieren Sie Ihren Server-Administrator für weitere Informationen.", "HeaderFavoritePlaylists": "Lieblings-Wiedergabeliste", "ButtonTogglePlaylist": "Wiedergabeliste", - "ButtonToggleContextMenu": "Mehr", "ApiKeysCaption": "Liste der aktuell aktivierten API-Schlüssel", - "LabelNightly": "Nightly", "LabelStable": "Stable", "LabelChromecastVersion": "Chromecast Version", "HeaderDVR": "DVR", - "TabDVR": "DVR", "SaveChanges": "Änderungen speichern", "LabelRequireHttpsHelp": "Wenn dies ausgewählt ist, leitet der Server alle Anfragen über HTTP an HTTPS weiter. Dies hat keinen Effekt, falls der Server nicht auf HTTPS hört.", "LabelRequireHttps": "Erfordere HTTPS", - "LabelEnableHttpsHelp": "Erlaubt es dem Server, den konfigurierten HTTPS-Port zu beobachten. Damit dies geschehen kann, muss ein gültiges Zertifikat konfiguriert sein.", + "LabelEnableHttpsHelp": "Beobachtet den konfigurierten HTTPS-Port. Damit dies geschehen kann, muss ein gültiges Zertifikat bereitgestellt werden.", "LabelEnableHttps": "Aktiviere HTTPS", "HeaderServerAddressSettings": "Server-Adresseinstellungen", "HeaderRemoteAccessSettings": "Fernzugriffs-Einstellungen", @@ -1543,8 +1412,8 @@ "EnableDetailsBanner": "Detailbanner", "ShowMore": "Mehr anzeigen", "ShowLess": "Weniger anzeigen", - "EnableBlurhashHelp": "Bilder, die noch nicht fertig geladen wurden, werden mit einem verschwommenen Platzhalter dargestellt", - "EnableBlurhash": "Verschwommene Platzhalter für Bilder erlauben", + "EnableBlurHashHelp": "Bilder, die noch nicht fertig geladen wurden, werden mit einem verschwommenen Platzhalter dargestellt.", + "EnableBlurHash": "Verschwommene Platzhalter für Bilder erlauben", "EnableFasterAnimations": "Schnellere Animationen", "EnableDecodingColorDepth10Vp9": "Aktiviere 10-Bit-Hardware-Dekodierung für VP9", "EnableDecodingColorDepth10Hevc": "Aktiviere 10-Bit-Hardware-Dekodierung für HEVC", @@ -1564,5 +1433,14 @@ "Writers": "Autoren", "ClearQueue": "Wiedergabeliste leeren", "StopPlayback": "Wiedergabe anhalten", - "ViewAlbumArtist": "Zeige Albumkünstler" + "ViewAlbumArtist": "Zeige Albumkünstler", + "PreviousTrack": "Zum Vorherigen springen", + "NextTrack": "Zum Nächsten springen", + "LabelUnstable": "Instabil", + "SubtitleVerticalPositionHelp": "Zeilennummer, in der der Text angezeigt wird. Positive Zahlen geben die Zeile von oben an. Negative Zahlen geben die Zeile von unten an.", + "Preview": "Vorschau", + "LabelSubtitleVerticalPosition": "Vertikale Position:", + "MessageGetInstalledPluginsError": "Beim Abrufen der Liste der derzeit installierten Plugins ist ein Fehler aufgetreten.", + "MessagePluginInstallError": "Bei der Installation des Plugins ist ein Fehler aufgetreten.", + "PlaybackRate": "Wiedergabegeschwindigkeit" } diff --git a/src/strings/el.json b/src/strings/el.json index a1fbf85613..7ee61d2b62 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -29,10 +29,8 @@ "AsManyAsPossible": "Οσο το δυνατον περισσοτερα", "Ascending": "Αύξουσα", "AspectRatio": "Αναλογία απεικόνισης", - "AttributeNew": "Νέο", "Audio": "Ήχος", "Auto": "Αυτόματο", - "AutoBasedOnLanguageSetting": "Αυτόματα (με βάση τη ρύθμιση γλώσσας)", "Backdrop": "Φόντο", "Backdrops": "Σκηνικά", "Banner": "Πανό", @@ -43,80 +41,56 @@ "Books": "Βιβλία", "Box": "Κουτί", "Browse": "Αναζήτηση", - "BrowsePluginCatalogMessage": "Πλοηγηθείτε στον κατάλογο plugin μας για να δείτε τα διαθέσιμα plugins.", + "MessageBrowsePluginCatalog": "Πλοηγηθείτε στον κατάλογο plugin μας για να δείτε τα διαθέσιμα plugins.", "BurnSubtitlesHelp": "Καθορίζει αν ο διακομιστής πρέπει να εγγράψει τους υπότιτλους κατά τη μετατροπή βίντεο ανάλογα με τη μορφή των υπότιτλων. Η αποφυγή της εγγραφής στους υπότιτλους θα βελτιώσει την απόδοση του διακομιστή. Επιλέξτε Αυτόματα για να εγγράψετε μορφές βασισμένες σε εικόνες (VOBSUB, PGS, SUB / IDX κ.λπ.) και ορισμένους υπότιτλους ASS / SSA.", - "ButtonAdd": "Πρόσθεσε", "ButtonAddMediaLibrary": "Προσθήκη βιβλιοθήκης πολυμέσων", "ButtonAddScheduledTaskTrigger": "Προσθήκη διακόπτη", "ButtonAddServer": "Προσθήκη διακομιστή", "ButtonAddUser": "Προσθήκη χρήστη", - "ButtonArrowDown": "Κάτω", "ButtonArrowLeft": "Αριστερά", "ButtonArrowRight": "Δεξιά", - "ButtonArrowUp": "Επάνω", "ButtonAudioTracks": "Ηχητικά κομμάτια", "ButtonBack": "Πίσω", "ButtonCancel": "Ακύρωση", "ButtonChangeServer": "Αλλαγή Διακομιστή", - "ButtonConnect": "Σύνδεση", - "ButtonDelete": "Διαγραφή", - "ButtonDeleteImage": "Διαγραφή εικόνας", - "ButtonDown": "Κάτω", - "ButtonEdit": "Επεξεργασία", - "ButtonEditImages": "Επεξεργασία εικόνων", "ButtonEditOtherUserPreferences": "Επεξεργαστείτε το προφίλ, την εικόνα και τις προσωπικές προτιμήσεις αυτού του χρήστη.", - "ButtonFilter": "Φίλτρο", "ButtonForgotPassword": "Ξέχασα τον κωδικό", "ButtonFullscreen": "Πλήρης οθόνη", "ButtonGotIt": "Το κατάλαβα", "ButtonGuide": "Οδηγός", - "ButtonHelp": "Βοήθεια", - "ButtonHome": "Αρχική", "ButtonInfo": "Πληροφορία", - "ButtonLearnMore": "Μάθετε περισσότερα", "ButtonLibraryAccess": "Πρόσβαση στη βιβλιοθήκη", "ButtonManualLogin": "Χειροκίνητη Είσοδος", "ButtonMore": "Περισσότερα", - "ButtonNew": "Νέο", "ButtonNextTrack": "Επομενο", "ButtonOpen": "Άνοιγμα", "ButtonParentalControl": "Γονικός έλεγχος", "ButtonPause": "Παύση", - "ButtonPlay": "Αναπαραγωγή", "ButtonPreviousTrack": "Προηγουμενο", "ButtonProfile": "Προφίλ", "ButtonQuickStartGuide": "Οδηγός Γρήγορης Εκκίνησης", - "ButtonRefresh": "Ανανέωση", "ButtonRefreshGuideData": "Ανανέωση Δεδομένων Οδηγού", "ButtonRemove": "Κατάργηση", "ButtonRename": "Μετονομασία", - "ButtonRepeat": "Επανάληψη", "ButtonResetEasyPassword": "Επαναφορά εύκολου κωδικού PIN", "ButtonResetPassword": "Επαναφορά του κωδικού πρόσβασης", "ButtonRestart": "Επανεκκίνηση", "ButtonResume": "Συνέχιση", "ButtonRevoke": "Ανακαλώ", - "ButtonSave": "Αποθήκευση", "ButtonScanAllLibraries": "Σάρωση όλων των βιβλιοθηκών", - "ButtonSearch": "Αναζήτηση", "ButtonSelectDirectory": "Επιλογή Φακέλου", "ButtonSelectServer": "Επιλογή Διακομιστή", "ButtonSelectView": "Επιλέξτε Προβολή", "ButtonSend": "Αποστολή", "ButtonSettings": "Ρυθμίσεις", - "ButtonShuffle": "Τυχαία Αναπαραγωγή", "ButtonShutdown": "Απενεργοποίηση", "ButtonSignIn": "Είσοδος", "ButtonSignOut": "Έξοδος", - "ButtonSort": "Ταξινόμηση", "ButtonStart": "Έναρξη", "ButtonStop": "Διακοπή", "ButtonSubmit": "υποβολή", - "ButtonSubtitles": "Υπότιτλοι", "ButtonTrailer": "Τρέϊλερ", "ButtonUninstall": "Απεγκατάσταση", - "ButtonUp": "Επάνω", - "ButtonViewWebsite": "Εμφάνιση ιστοσελίδας", "ButtonWebsite": "Ιστοσελίδα", "CancelRecording": "Ακύρωση Εγγραφής", "CancelSeries": "Ακύρωση Σειράς", @@ -146,7 +120,7 @@ "DatePlayed": "Ημερομηνία Αναπαραγωγής", "DeathDateValue": "Πέθανε: {0}", "Default": "Προεπιλογή", - "DefaultErrorMessage": "Παρουσιάστηκε σφάλμα κατά την επεξεργασία του αιτήματός σας. Παρακαλώ δοκιμάστε ξανά αργότερα.", + "ErrorDefault": "Παρουσιάστηκε σφάλμα κατά την επεξεργασία του αιτήματός σας. Παρακαλώ δοκιμάστε ξανά αργότερα.", "DefaultMetadataLangaugeDescription": "Αυτές είναι οι προεπιλογές σας και μπορούν να προσαρμοστούν σε βάση ανά βιβλιοθήκη.", "DefaultSubtitlesHelp": "Οι υπότιτλοι φορτώνονται με βάση τις προεπιλεγμένες και αναγκασμένες σημαίες στα ενσωματωμένα μεταδεδομένα. Οι προτιμήσεις γλώσσας εξετάζονται όταν υπάρχουν πολλές επιλογές.", "Delete": "Διαγραφή", @@ -187,7 +161,6 @@ "EditImages": "Επεξεργασία εικόνων", "EditMetadata": "Επεξεργασία μεταδεδομένων", "EditSubtitles": "Επεξεργασία υποτίτλων", - "EnableBackdrops": "Ενεργοποίηση Σκηνικών", "EnableBackdropsHelp": "Eμφάνιση φόντων στο παρασκήνιο ορισμένων σελίδων κατά την περιήγηση στη βιβλιοθήκη.", "EnableCinemaMode": "Λειτουργία Κινηματογράφου", "EnableColorCodedBackgrounds": "Ενεργοποιήστε τα έγχρωμα κωδικοποιημένα φόντα", @@ -197,16 +170,14 @@ "EnableHardwareEncoding": "Ενεργοποίηση αποκωδικοποίησης υλικού", "EnableNextVideoInfoOverlay": "Ενεργοποιήστε τις επόμενες πληροφορίες βίντεο κατά την αναπαραγωγή", "EnableNextVideoInfoOverlayHelp": "Στο τέλος ενός βίντεο, εμφανίστε πληροφορίες σχετικά με το επόμενο βίντεο που εμφανίζεται στην τρέχουσα λίστα αναπαραγωγής.", - "EnableThemeSongs": "Ενεργοποίηση Θεματικών Τραγουδιών", "EnableThemeSongsHelp": "Αν είναι ενεργοποιημένη, τα τραγούδια θεμάτων θα αναπαραχθούν στο παρασκήνιο κατά την περιήγηση στη βιβλιοθήκη.", - "EnableThemeVideos": "Ενεργοποίηση βίντεο θέματος", "EnableThemeVideosHelp": "Αν είναι ενεργοποιημένη, τα βίντεο θεμάτων θα αναπαραχθούν στο παρασκήνιο κατά την περιήγηση στη βιβλιοθήκη.", "Ended": "Τέλος", "EndsAtValue": "Τελειώνει σε {0}", "Episodes": "Επεισόδια", "ErrorAddingMediaPathToVirtualFolder": "Παρουσιάστηκε σφάλμα κατά την προσθήκη της διαδρομής πολυμέσων. Βεβαιωθείτε ότι η διαδρομή είναι έγκυρη και ότι η διαδικασία του διακομιστή Jellyfin έχει πρόσβαση σε αυτήν τη θέση.", "ErrorDeletingItem": "Παρουσιάστηκε σφάλμα κατά τη διαγραφή του στοιχείου από τον διακομιστή Jellyfin. Βεβαιωθείτε ότι ο διακομιστής Jellyfin έχει πρόσβαση εγγραφής στο φάκελο πολυμέσων και προσπαθήστε ξανά.", - "ErrorMessageStartHourGreaterThanEnd": "Η ώρα λήξης πρέπει να είναι μεγαλύτερη από την ώρα έναρξης.", + "ErrorStartHourGreaterThanEnd": "Η ώρα λήξης πρέπει να είναι μεγαλύτερη από την ώρα έναρξης.", "EveryNDays": "Κάθε {0} μέρες", "ExitFullscreen": "Έξοδος από τη πλήρη οθόνη", "ExtraLarge": "Πολύ Μεγάλο", @@ -244,11 +215,9 @@ "HeaderActiveDevices": "Ενεργές Συσκευές", "HeaderActiveRecordings": "Ενεργές εγγραφές", "HeaderActivity": "Δραστηριότητα", - "HeaderAddScheduledTaskTrigger": "Προσθήκη διακόπτη", "HeaderAddToCollection": "Πρόσθεσε στη Συλλογή", "HeaderAddToPlaylist": "Πρόσθεσε σε Λίστα", "HeaderAddUpdateImage": "Προσθήκη / Ενημέρωση εικόνας", - "HeaderAddUser": "Προσθήκη Χρήστη", "HeaderAdditionalParts": "Πρόσθετα Μέρη", "HeaderAdmin": "Διαχειριστής", "HeaderAlbumArtists": "Καλλιτέχνες του Άλμπουμ", @@ -260,14 +229,10 @@ "HeaderAppearsOn": "Εμφανίζεται σε", "HeaderAudioBooks": "Μουσικά Βιβλία", "HeaderAudioSettings": "Ρυθμίσεις Ήχου", - "HeaderAutomaticUpdates": "Αυτόματες Ανανεώσεις", "HeaderBlockItemsWithNoRating": "Αποκλεισμός στοιχείων χωρίς ή μη αναγνωρισμένων πληροφοριών αξιολόγησης:", - "HeaderBooks": "Βιβλία", "HeaderCancelRecording": "Ακύρωση Εγγραφής", "HeaderCancelSeries": "Ακύρωση Σειράς", "HeaderCastAndCrew": "Ηθοποιοί και Συνεργείο", - "HeaderCastCrew": "Ηθοποιοί και συνεργείο", - "HeaderChannels": "Κανάλια", "HeaderCodecProfileHelp": "Τα προφίλ κωδικοποιητή υποδεικνύουν τους περιορισμούς μιας συσκευής κατά την αναπαραγωγή συγκεκριμένων κωδικοποιητών. Εάν ισχύει περιορισμός, τότε τα μέσα θα κωδικοποιηθούν, ακόμα και αν ο κωδικοποιητής έχει ρυθμιστεί για άμεση αναπαραγωγή.", "HeaderConfigureRemoteAccess": "Ρύθμιση απομακρυσμένης πρόσβασης", "HeaderConfirmPluginInstallation": "Επιβεβαιώστε την εγκατάσταση της προσθήκης", @@ -289,22 +254,16 @@ "HeaderDevices": "Συσκευές", "HeaderDirectPlayProfile": "Προφίλ Άμεσης Αναπαραγωγής", "HeaderDirectPlayProfileHelp": "Προσθέστε προφίλ άμεσης αναπαραγωγής για να δείξετε ποιες μορφές μπορεί να χειριστεί εγγενώς η συσκευή.", - "HeaderDisplay": "Εμφάνιση", "HeaderEasyPinCode": "Κωδικός PIN", "HeaderEditImages": "Επεξεργασία εικόνων", "HeaderEnabledFields": "Ενεργά Πεδία", "HeaderEnabledFieldsHelp": "Καταργήστε την επιλογή ενός πεδίου για να το κλειδώσετε και να αποτρέψετε την αλλαγή των δεδομένων του.", - "HeaderEpisodes": "Επεισόδια", "HeaderError": "Σφάλμα", "HeaderExternalIds": "Εξωτερικά ID:", "HeaderFeatureAccess": "Πρόσβαση χαρακτηριστικών", - "HeaderFeatures": "Χαρακτηριστικά", "HeaderFetchImages": "Λήψη εικόνων:", - "HeaderFilters": "Φίλτρα", "HeaderForKids": "Για τα Παιδιά", - "HeaderForgotPassword": "Ξέχασα τον κωδικό", "HeaderFrequentlyPlayed": "Συχνά έπαιξε", - "HeaderGenres": "Είδη", "HeaderIdentificationCriteriaHelp": "Καταχωρήστε τουλάχιστον ένα κριτήριο αναγνώρισης.", "HeaderIdentificationHeader": "Αναγνωριστικό Header", "HeaderIdentifyItemHelp": "Πληκτρολογήστε ένα ή περισσότερα κριτήρια αναζήτησης. Κατάργηση κριτηρίων για την αύξηση των αποτελεσμάτων αναζήτησης.", @@ -312,7 +271,6 @@ "HeaderImageSettings": "Ρυθμίσεις Εικόνας", "HeaderInstall": "Εγκατάσταση", "HeaderInstantMix": "Άμεση Mix", - "HeaderItems": "Στοιχεία", "HeaderKeepRecording": "Συνέχισε την Εγγραφή", "HeaderKeepSeries": "Συνέχισε την Σειρά", "HeaderLatestEpisodes": "Τελευταία επεισόδια", @@ -325,15 +283,11 @@ "HeaderLibraryFolders": "Φάκελος βιβλιοθηκών", "HeaderLibraryOrder": "Διάταξη Βιβλιοθήκης", "HeaderLibrarySettings": "Ρυθμίσεις Βιβλιοθήκης", - "HeaderLiveTV": "Ζωντανή Τηλεόραση", - "HeaderLiveTv": "ΖΩΝΤΑΝΗ ΤΗΛΕΩΡΑΣΗ", "HeaderLoginFailure": "Αποτυχία εισόδου", "HeaderMedia": "Πολυμέσα", "HeaderMediaFolders": "Φάκελοι Πολυμέσων", - "HeaderMediaInfo": "Πληροφορίες πολυμέσων", "HeaderMetadataSettings": "Ρυθμίσεις μεταδεδομένων", "HeaderMoreLikeThis": "Περισσότερα Σαν Αυτό", - "HeaderMovies": "Ταινίες", "HeaderMusicQuality": "Ποιότητα Μουσικής", "HeaderMusicVideos": "Βίντεο Μουσικής", "HeaderMyDevice": "Η Συσκευή μου", @@ -342,7 +296,6 @@ "HeaderNewApiKey": "Νέο κλειδί API", "HeaderNewDevices": "Νέες Συσκευές", "HeaderNextEpisodePlayingInValue": "Επόμενο επεισόδιο που θα παιχτεί σε {0}", - "HeaderNextUp": "Επόμενο", "HeaderNextVideoPlayingInValue": "Επόμενη αναπαραγωγή βίντεο σε {0}", "HeaderOnNow": "Τώρα", "HeaderOtherItems": "Άλλα Στοιχεία", @@ -371,18 +324,15 @@ "HeaderRevisionHistory": "Ιστορικό αναθεωρήσεων", "HeaderRunningTasks": "Προγραμματισμένες Εργασίες", "HeaderScenes": "Σκηνές", - "HeaderSchedule": "Πρόγραμμα", "HeaderSeasons": "Κύκλοι", "HeaderSecondsValue": "{0} δευτερόλεπτα", "HeaderSelectServer": "Επιλογή Διακομιστή", "HeaderSendMessage": "Αποστολή Μηνύματος", - "HeaderSeries": "Σειρές", "HeaderSeriesOptions": "Επιλογές Σειρών", "HeaderSeriesStatus": "Κατάσταση Σειράς", "HeaderServerSettings": "Ρυθμίσεις διακομιστή", "HeaderSettings": "Ρυθμίσεις", "HeaderSetupLibrary": "Ρυθμίστε τις βιβλιοθήκες πολυμέσων σας", - "HeaderShutdown": "Απενεργοποίηση", "HeaderSortBy": "Ταξινόμηση κατά", "HeaderSortOrder": "Σειρά ταξινόμησης", "HeaderSpecialEpisodeInfo": "Ειδικές πληροφορίες επεισοδίου", @@ -396,7 +346,6 @@ "HeaderSubtitleProfiles": "Προφίλ Υπότιτλων", "HeaderSubtitleProfilesHelp": "Τα προφίλ υποτίτλων περιγράφουν τις μορφές υπότιτλων που υποστηρίζει η συσκευή.", "HeaderSystemDlnaProfiles": "Προφίλ Συστήματος", - "HeaderTags": "Ετικέτες", "HeaderTaskTriggers": "Έναυσμα εργασιών", "HeaderThisUserIsCurrentlyDisabled": "Ο χρήστης είναι απενεργοποιημένος", "HeaderTranscodingProfileHelp": "Προσθέστε προφίλ αποκωδικοποίησης για να δηλώσετε ποιες μορφές θα πρέπει να χρησιμοποιηθούν όταν απαιτείται μετασύνδεση.", @@ -414,7 +363,6 @@ "HeaderXmlDocumentAttributes": "Χαρακτηριστικά εγγράφου Xml", "HeaderXmlSettings": "Ρυθμίσεις xml", "HeaderYears": "Χρονιές", - "HeadersFolders": "Φάκελοι", "Help": "Βοήθεια", "Hide": "Κρύψε", "HideWatchedContentFromLatestMedia": "Απόκρυψη προβληθέντων από τα πρόσφατα μέσα", @@ -442,14 +390,10 @@ "LabelAlbumArtMaxWidthHelp": "Μέγιστη ανάλυση του άλμπουμ art που εκτίθεται μέσω του upnp: albumArtURI.", "LabelAlbumArtPN": "PN άλμπουμ art:", "LabelAlbumArtists": "Καλλιτέχνες του 'Αλμπουμ:", - "LabelAll": "Όλα", - "LabelAllowServerAutoRestart": "Αυτόματη επανεκκίνηση του σέρβερ για να εγκαταστήσει τις αναβαθμίσεις", - "LabelAllowServerAutoRestartHelp": "Ο server θα κάνει επανεκκίνηση μόνο κατά τη διάρκεια αδρανών περιόδων, όταν δεν υπάρχουν ενεργοί χρήστες.", "LabelAppName": "Όνομα App", "LabelAppNameExample": "Παράδειγμα: Sickbeard, NzbDrone", "LabelArtists": "Καλλιτέχνες:", "LabelArtistsHelp": "Ξεχωρίστε πολλαπλά χρησιμοποιώντας;", - "LabelAudio": "Ήχος", "LabelAudioLanguagePreference": "Προτιμώμενη γλώσσα ήχου:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Αυτόματη ανανέωση μεταδεδομένων από το internet:", "LabelBirthDate": "Ημερομηνία Γενεθλίων:", @@ -472,9 +416,7 @@ "LabelCustomCertificatePathHelp": "Προσθέστε το δικό σας αρχείο .pfx πιστοποιητικού ssl.", "LabelCustomCss": "Προσαρμοσμένο css:", "LabelCustomCssHelp": "Εφαρμόστε το δικό σας προσαρμοσμένο css στην διεπαφή ιστού.", - "LabelCustomDeviceDisplayName": "Εμφάνιση ονόματος:", "LabelCustomRating": "Προσαρμοσμένη αξιολόγηση:", - "LabelDashboardTheme": "Θέμα εμφάνισης πίνακα ελέγχου server:", "LabelDateAdded": "Ημερνία προσθήκης:", "LabelDateTimeLocale": "Ημερομηνία τοπική ώρα:", "LabelDay": "Ημέρα:", @@ -486,7 +428,6 @@ "LabelDiscNumber": "Αριθμός Δίσκου:", "LabelDisplayLanguage": "Γλώσσα Εμφάνισης:", "LabelDisplayLanguageHelp": "Η μετάφραση του Jellyfin είναι ένα συνεχιζόμενο έργο.", - "LabelDisplayMissingEpisodesWithinSeasons": "Εμφάνιση επεισοδίων που λείπουν από την σαιζόν", "LabelDisplayMode": "Λειτουργία προβολής:", "LabelDisplayName": "Εμφάνιση ονόματος:", "LabelDisplayOrder": "Σειρά εμφάνισης:", @@ -594,7 +535,6 @@ "LabelNewPassword": "Νέος κωδικός πρόσβασης:", "LabelNewPasswordConfirm": "Επιβεβαίωση νέου κωδικού πρόσβασης:", "LabelNewsCategories": "Κατηγορίες ειδήσεων:", - "LabelNext": "Επόμενο", "LabelNotificationEnabled": "Ενεργοποίηση αυτής της ειδοποίησης", "LabelNumber": "Αριθμός:", "LabelNumberOfGuideDays": "Αριθμός ημερών οδηγιών για λήψη:", @@ -614,9 +554,7 @@ "LabelPlayDefaultAudioTrack": "Αναπαραγωγή προεπιλεγμένου κομματιού ήχου ανεξάρτητα από τη γλώσσα", "LabelPlaylist": "Λίστα:", "LabelPreferredDisplayLanguage": "Προτιμώμενη γλώσσα εμφάνισης:", - "LabelPreferredDisplayLanguageHelp": "Η μετάφραση του Jellyfin είναι ένα συνεχιζόμενο έργο.", "LabelPreferredSubtitleLanguage": "Προτεινόμενη Γλώσσα υποτίτλων:", - "LabelPrevious": "Προηγούμενο", "LabelProfileCodecsHelp": "Διαχωρίζονται με κόμμα. Αυτό μπορεί να μείνει κενό για να εφαρμοστεί σε όλα τα codecs.", "LabelProfileContainersHelp": "Διαχωρίζονται με κόμμα. Αυτό μπορεί να μείνει κενό για να εφαρμοστεί σε όλα τα containers.", "LabelProtocol": "Πρωτόκολλο:", @@ -624,7 +562,6 @@ "LabelPublicHttpPortHelp": "Ο αριθμός δημόσιας θύρας που πρέπει να αντιστοιχιστεί στην τοπική θύρα http.", "LabelPublicHttpsPort": "Αριθμός δημόσιας https θύρας:", "LabelPublicHttpsPortHelp": "Ο αριθμός δημόσιας θύρας που πρέπει να αντιστοιχιστεί στην τοπική θύρα https.", - "LabelReadHowYouCanContribute": "Μάθετε πώς μπορείτε να συμβάλλετε.", "LabelReasonForTranscoding": "Λόγος για την Κωδικοποίηση:", "LabelRecord": "Εγγραφή:", "LabelRecordingPath": "Προεπιλεγμένη διαδρομή εγγραφής:", @@ -655,7 +592,6 @@ "LabelSortBy": "Ταξινόμηση κατά:", "LabelSortOrder": "Σειρά ταξινόμησης:", "LabelSortTitle": "Τίτλος ταξινόμησης:", - "LabelSoundEffects": "Ηχητικά Εφέ:", "LabelSource": "Πηγή:", "LabelSpecialSeasonsDisplayName": "Ειδικό εμφανιζόμενο όνομα σεζόν:", "LabelStartWhenPossible": "Έναρξη όταν είναι δυνατό:", @@ -663,7 +599,6 @@ "LabelStopWhenPossible": "Διακοπή όταν είναι δυνατόν:", "LabelSubtitleFormatHelp": "Παράδειγμα: srt", "LabelSubtitlePlaybackMode": "Λειτουργία υποτίτλων:", - "LabelSubtitles": "Υπότιτλοι", "LabelSupportedMediaTypes": "Υποστηριζόμενοι τύποι μέσων:", "LabelTVHomeScreen": "Αρχική οθόνη λειτουργίας τηλεόρασης:", "LabelTag": "Ετικέτα:", @@ -696,7 +631,6 @@ "LabelXDlnaCapHelp": "Καθορίζει το περιεχόμενο του στοιχείου X_DLNACAP στο urn:schemas-dlna-org:device-1-0 namespace.", "LabelXDlnaDocHelp": "Καθορίζει το περιεχόμενο του στοιχείου X_DLNACAP στο urn:schemas-dlna-org:device-1-0 namespace.", "LabelYear": "Έτος:", - "LabelYourFirstName": "Το όνομά σας:", "LabelYoureDone": "Είστε Έτοιμοι!", "LabelZipCode": "Ταχυδ/κός κώδικας:", "Large": "Μεγάλο", @@ -704,7 +638,6 @@ "LearnHowYouCanContribute": "Μάθετε πώς μπορείτε να συμβάλλετε.", "LibraryAccessHelp": "Επιλέξτε τους φακέλους μέσων για να το μοιραστείτε με αυτόν το χρήστη. Οι διαχειριστές θα έχουν τη δυνατότητα να επεξεργάζεστε όλα φακέλους χρησιμοποιώντας τα μεταδεδομένα manager.", "Like": "Μου αρέσει", - "LinksValue": "Σύνδεσμοι: {0}", "List": "Λίστα", "Live": "Ζωντανά", "LiveBroadcasts": "Ζωντανές εκπομπές", @@ -749,7 +682,6 @@ "MessageFileReadError": "Παρουσιάστηκε σφάλμα κατά την ανάγνωση του αρχείου. Παρακαλώ προσπάθησε ξανά.", "MessageForgotPasswordFileCreated": "Το ακόλουθο αρχείο έχει δημιουργηθεί στο διακομιστή σας και περιέχει οδηγίες για το πώς να συνεχίσετε:", "MessageForgotPasswordInNetworkRequired": "Παρακαλώ δοκιμάστε ξανά μέσα στο οικιακό σας δίκτυο για να ξεκινήσετε τη διαδικασία επαναφοράς κωδικού πρόσβασης.", - "MessageInstallPluginFromApp": "Αυτό το πρόσθετο πρέπει να εγκατασταθεί την εφαρμογή που σκοπεύετε να χρησιμοποιήσετε.", "MessageInvalidForgotPasswordPin": "Καταχωρήθηκε ένα άκυρο ή ληγμένο PIN. Παρακαλώ προσπαθήστε ξανά.", "MessageInvalidUser": "Μη έγκυρο όνομα ή κωδικός. Παρακαλώ προσπαθήστε ξανά.", "MessageItemSaved": "Το στοιχείο αποθηκεύτηκε.", @@ -766,7 +698,6 @@ "MessagePleaseWait": "Παρακαλώ περιμένετε. Αυτό μπορεί να πάρει ένα λεπτό.", "MessagePluginConfigurationRequiresLocalAccess": "Για να ρυθμίσετε αυτό το πρόσθετο παρακαλώ συνδεθείτε στον τοπικό διακομιστή σας άμεσα.", "MessageReenableUser": "Δες παρακάτω για ενεργοποιήση", - "MessageSettingsSaved": "Οι ρυθμίσεις αποθηκεύτηκαν.", "MessageUnableToConnectToServer": "Δεν είναι δυνατή η σύνδεση με τον επιλεγμένο διακομιστή αυτή τη στιγμή. Βεβαιωθείτε ότι εκτελείται και προσπαθήστε ξανά.", "MessageYouHaveVersionInstalled": "Αυτήν τη στιγμή έχετε εγκατεστημένη την έκδοση {0}.", "Metadata": "Μεταδεδομένα", @@ -794,10 +725,9 @@ "Next": "Επόμενο", "NextUp": "Επόμενο", "No": "Οχι", - "NoNextUpItemsMessage": "Δεν βρέθηκε κανένα. Ξεκινήστε παρακολουθώντας τις εκπομπές σας!", - "NoPluginConfigurationMessage": "Αυτό το plugin δεν απαιτεί ρυθμίσεις.", + "MessageNoNextUpItems": "Δεν βρέθηκε κανένα. Ξεκινήστε παρακολουθώντας τις εκπομπές σας!", + "MessageNoPluginConfiguration": "Αυτό το plugin δεν απαιτεί ρυθμίσεις.", "NoSubtitleSearchResultsFound": "Δεν βρέθηκαν αποτελέσματα.", - "NoSubtitles": "Χωρίς Υπότιτλους", "NoSubtitlesHelp": "Οι υπότιτλοι δεν θα φορτωθούν από προεπιλογή.Μπορούν ακόμα να ενεργοποιούνται χειροκίνητα κατά την αναπαραγωγή.", "None": "Κανένα", "Normal": "Κανονικός", @@ -829,7 +759,6 @@ "OptionArtist": "Καλλιτέχνες", "OptionAscending": "Αύξουσα", "OptionAuto": "Αυτόματο", - "OptionAutomatic": "Αυτόματο", "OptionBlockBooks": "Βιβλία", "OptionBlockChannelContent": "Περιεχόμενο Διαδικτυακών Καναλιών", "OptionBlockLiveTvChannels": "ΚΑΝΑΛΙΑ ΖΩΝΤΑΝΗΣ ΤΗΛΕΟΡΑΣΗΣ", @@ -870,7 +799,6 @@ "OptionEveryday": "Κάθε μέρα", "OptionExternallyDownloaded": "Εξωτερική λήψη", "OptionFavorite": "Αγαπημένα", - "OptionFriday": "Παρασκευή", "OptionHasSpecialFeatures": "Ειδικά Χαρακτηριστικά", "OptionHasSubtitles": "Υπότιτλοι", "OptionHasThemeSong": "Θεματικό Τραγούδι", @@ -883,11 +811,9 @@ "OptionLikes": "Συμπαθεί", "OptionMax": "Μέγιστο", "OptionMissingEpisode": "Ελλειπή Επεισόδια", - "OptionMonday": "Δευτέρα", "OptionNameSort": "Όνομα", "OptionNew": "Νέο...", "OptionNone": "Κανένα", - "OptionOnAppStartup": "Κατά την εκκίνηση της εφαρμογής", "OptionOnInterval": "Σε ένα διάστημα", "OptionParentalRating": "Αξιολόγηση γονέων", "OptionPlainStorageFolders": "Εμφάνιση όλων των φακέλων ως φακέλων απλού χώρου αποθήκευσης", @@ -901,18 +827,13 @@ "OptionProfileVideo": "Βίντεο", "OptionReleaseDate": "Ημερομηνία Προβολής", "OptionResumable": "Αναληπτέος", - "OptionSaturday": "Σάββατο", "OptionSaveMetadataAsHidden": "Αποθηκεύστε τα μεταδεδομένα και τις εικόνες ως κρυφά αρχεία", "OptionSubstring": "Υποσύνολο", - "OptionSunday": "Κυρ", - "OptionThursday": "Πέμπτη", "OptionTrackName": "Όνομα Αρχείου", - "OptionTuesday": "Τρίτη", "OptionTvdbRating": "Tvdb Βαθμολογία", "OptionUnairedEpisode": "Επεισόδια που δεν προβλήθηκαν", "OptionUnplayed": "Δεν παίχθηκε", "OptionWakeFromSleep": "Επανεργοποιήση", - "OptionWednesday": "Τετάρτη", "OptionWeekdays": "Καθημερινές", "OptionWeekends": "Σαββατοκύριακα", "OptionWeekly": "Εβδομαδιαία", @@ -925,7 +846,7 @@ "PasswordMatchError": "Ο κωδικός πρόσβασης και ο κωδικός επιβεβαίωσης πρέπει να είναι ίδιοι.", "PasswordResetComplete": "Ο κωδικός πρόσβασης επαναφέρθηκε.", "PasswordResetConfirmation": "Είστε σίγουροι ότι θέλετε να επαναφέρετε τον κωδικό πρόσβασης;", - "PasswordResetHeader": "Επαναφορά του κωδικού πρόσβασης", + "HeaderResetPassword": "Επαναφορά του κωδικού πρόσβασης", "PasswordSaved": "Ο κωδικός πρόσβασης αποθηκεύτηκε.", "People": "Πρόσωπα", "PerfectMatch": "Τέλεια αντιστοίχιση", @@ -946,7 +867,7 @@ "PleaseEnterNameOrId": "Εισαγάγετε ένα όνομα ή ένα εξωτερικό αναγνωριστικό.", "PleaseRestartServerName": "Κάντε επανεκκίνηση του Jellyfin Server - {0}.", "PleaseSelectTwoItems": "Επιλέξτε τουλάχιστον δύο στοιχεία.", - "PluginInstalledMessage": "Η προσθήκη έχει εγκατασταθεί με επιτυχία. Θα πρέπει να γίνει επανεκκίνηση του διακομιστή Jellyfin για να εφαρμοστούν οι αλλαγές.", + "MessagePluginInstalled": "Η προσθήκη έχει εγκατασταθεί με επιτυχία. Θα πρέπει να γίνει επανεκκίνηση του διακομιστή Jellyfin για να εφαρμοστούν οι αλλαγές.", "Premiere": "Πρεμιέρα", "Premieres": "Πρεμιέρες", "Previous": "Προηγούμενο", @@ -955,7 +876,6 @@ "ProductionLocations": "Τοποθεσίες παραγωγής", "Programs": "Προγράμματα", "Quality": "Ποιότητα", - "QueueAllFromHere": "Τοποθετήστε στην ουρά αναπαραγωγής όλα από εδώ", "Raised": "Αυξήθηκε", "RecentlyWatched": "Πρόσφατα αναπαραχθέντα", "RecommendationBecauseYouLike": "Επειδή σας αρέσει {0}", @@ -983,7 +903,6 @@ "ReplaceExistingImages": "Αντικατάσταση υπαρχουσών εικόνων", "ResumeAt": "Συνέχιση από {0}", "Rewind": "Αναπαραγωγή προς τα πίσω", - "RunAtStartup": "Εκτέλεση κατά την εκκίνηση", "Runtime": "Χρόνος εκτέλεσης", "Saturday": "Σάββατο", "Save": "Αποθήκευση", @@ -1040,53 +959,26 @@ "TV": "Τηλεόραση", "TabAccess": "Πρόσβαση", "TabAdvanced": "Για προχωρημένους", - "TabAlbumArtists": "Άλμπουμ Καλλιτέχνες", - "TabAlbums": "Άλμπουμ", - "TabArtists": "Καλλιτέχνες", "TabCatalog": "Κατάλογος", - "TabChannels": "Κανάλια", - "TabCollections": "Συλλογές", "TabDashboard": "Πίνακας Ελέγχου", - "TabDevices": "Συσκευές", "TabDirectPlay": "Άμεση Αναπαραγωγή", - "TabDisplay": "Εμφάνιση", - "TabEpisodes": "Επεισόδια", - "TabFavorites": "Αγαπημένα", - "TabGenres": "Είδη", - "TabGuide": "Οδηγός", - "TabInfo": "Πληροφορία", "TabLatest": "Τελευταία", - "TabMetadata": "Μεταδεδομένα", - "TabMovies": "Ταινίες", "TabMusic": "Μουσική", - "TabMusicVideos": "Μουσικά βίντεο", "TabMyPlugins": "Τα πρόσθετα μου", "TabNetworks": "Δίκτυα", "TabNfoSettings": "Ρυθμίσεις NFO", "TabNotifications": "Ειδοποιήσεις", "TabOther": "Άλλα", "TabParentalControl": "Γονικός έλεγχος", - "TabPassword": "Κωδικός", - "TabPlayback": "Αναπαραγωγή", - "TabPlaylist": "Λίστα", - "TabPlaylists": "Λίστες αναπαραγωγής", "TabPlugins": "Πρόσθετα", "TabProfile": "Προφίλ", "TabProfiles": "Προφίλ", - "TabRecordings": "Εγγραφές", "TabResponses": "Απαντήσεις", "TabScheduledTasks": "Προγραμματισμένες Εργασίες", - "TabSeries": "Σειρές", "TabServer": "Διακομιστής", "TabSettings": "Ρυθμισεις", - "TabShows": "Επεισόδια", - "TabSongs": "Τραγούδια", "TabStreaming": "Ροή", - "TabSuggestions": "Προτάσεις", - "TabTrailers": "Τρέιλερς", - "TabTranscoding": "Κωδικοποίηση", "TabUpcoming": "Επερχόμενα", - "TabUsers": "Χρήστες", "Tags": "Ετικέτες", "TagsValue": "Ετικέτες: {0}", "TellUsAboutYourself": "Πείτε μας για εσάς", @@ -1103,7 +995,7 @@ "Tuesday": "Τρίτη", "Uniform": "ομοειδής", "UninstallPluginConfirmation": "Είστε σίγουροι ότι θέλετε να απεγκαταστήσετε;", - "UninstallPluginHeader": "απεγκατάστησετε το plugin", + "HeaderUninstallPlugin": "απεγκατάστησετε το plugin", "Unmute": "Με ήχο", "Unplayed": "Δεν παίχθηκε", "Unrated": "Χωρίς Βαθμολογία", @@ -1160,9 +1052,7 @@ "HeaderSelectMetadataPath": "Επιλέξτε Διαδρομή Μεταδεδομένων", "HeaderSelectCertificatePath": "Επιλέξτε Διαδρομή Πιστοποιητικού", "HeaderRemoveMediaFolder": "Αφαίρεση Φακέλου Μέσων", - "HeaderPeople": "Πρόσωπα", "HeaderIdentification": "Ταυτοποίηση", - "HeaderHome": "Αρχική", "HeaderGuideProviders": "Πάροχοι Δεδομένων Προγράμματος Τηλεόρασης", "HeaderFavoriteVideos": "Αγαπημένα Βίντεο", "HeaderFavoriteMovies": "Αγαπημένες Ταινίες", @@ -1173,7 +1063,6 @@ "HeaderChapterImages": "Εικόνες Κεφαλαίων", "HeaderChannelAccess": "Πρόσβαση σε Κανάλια", "HeaderApp": "Εφαρμογή", - "HeaderAlbums": "Άλμπουμ", "HeaderAccessScheduleHelp": "Δημιουργήστε ένα πρόγραμμα πρόσβασης για να περιορίσετε την πρόσβαση ορισμένες ώρες.", "HeaderAccessSchedule": "Πρόγραμμα Πρόσβασης", "LabelTranscodePath": "Διαδρομή μετατροπών:", @@ -1193,15 +1082,12 @@ "EnablePhotos": "Εμφάνιση φωτογραφιών", "DrmChannelsNotImported": "Κανάλια με DRM δεν θα εισαχθούν.", "ButtonOk": "Οκ", - "ButtonOff": "Απενεργοποίηση", "ButtonNetwork": "Δίκτυο", - "ButtonDownload": "Κατέβασμα", "AllowOnTheFlySubtitleExtractionHelp": "Οι ενσωματωμένοι υπότιτλοι μπορούν να εξαχθούν από βίντεο και να σταλούν στις συσκευές σε απλό κείμενο για να αποφευχθούν μετατροπές βίντεο. Σε μερικά συστήματα αυτό μπορεί να πάρει πολύ ώρα και να κάνει το βίντεο να κολλάει κατά την διάρκεια της εξαγωγής. Απενεργοποιήστε το για να έχετε ενσωματωμένους υπότιτλους πάνω στο βίντεο όταν αυτοί δεν υποστηρίζονται από την συσκευή.", "AllowOnTheFlySubtitleExtraction": "Επίτρεψε την εξαγωγή υποτίτλων σε πραγματικό χρόνο", "AllowMediaConversionHelp": "Παραχώρηση ή στέρηση πρόσβασης στην λειτουργία μετατροπής μέσων.", "AllowHWTranscodingHelp": "Επιτρέπει τον δέκτη να επανακωδικοποιεί τις ροές σε πραγματικό χρόνο. Αυτό μπορεί να μειώσει τον φόρτο κωδικοποίησης τον σέρβερ.", "Alerts": "Προειδοποίηση", - "AddItemToCollectionHelp": "Προσθέστε στις συλλογές κάνοντας αναζήτηση και δεξί κλικ ή μέσω των μενού.", "MediaInfoStreamTypeVideo": "Βίντεο", "MediaInfoStreamTypeSubtitle": "Υπότιτλος", "MediaInfoStreamTypeData": "Δεδομένα", @@ -1227,7 +1113,6 @@ "AllowedRemoteAddressesHelp": "Λίστα διαχωρισμένων διευθύνσεων IP ή καταχωρίσεων IP / netmask για δίκτυα που θα επιτρέπεται η σύνδεση εξ αποστάσεως. Εάν αφεθεί κενό, όλες οι απομακρυσμένες διευθύνσεις θα επιτρέπονται.", "AllowFfmpegThrottlingHelp": "Όταν ένας διακωδικοποιητής ή remux φτάσει αρκετά μπροστά από την τρέχουσα θέση αναπαραγωγής, διακόψτε τη διαδικασία ώστε να καταναλώσει λιγότερους πόρους. Αυτό είναι πιο χρήσιμο όταν παρακολουθείτε χωρίς να αναζητάτε συχνά. Απενεργοποιήστε το εάν αντιμετωπίζετε προβλήματα αναπαραγωγής.", "ButtonTogglePlaylist": "Λίστα αναπαραγωγής", - "ButtonToggleContextMenu": "Περισσότερα", "ButtonSplit": "Διαχωρισμός", "ButtonSyncPlay": "SyncPlay" } diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index 1947dc0c37..d44183a4a8 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1,6 +1,6 @@ { "AdditionalNotificationServices": "Browse the plugin catalogue to install additional notification services.", - "BrowsePluginCatalogMessage": "Browse our plugin catalogue to view available plugins.", + "MessageBrowsePluginCatalog": "Browse our plugin catalogue to view available plugins.", "CinemaModeConfigurationHelp": "Cinema mode brings the theatre experience straight to your living room with the ability to play trailers and custom intros before the main feature.", "ColorPrimaries": "Colour primaries", "ColorSpace": "Colour space", @@ -26,7 +26,6 @@ "PlaceFavoriteChannelsAtBeginning": "Place favourite channels at the beginning", "Programs": "Programs", "TabCatalog": "Catalogue", - "TabFavorites": "Favourites", "XmlTvKidsCategoriesHelp": "Programs with these categories will be displayed as programs for children. Separate multiple with '|'.", "XmlTvMovieCategoriesHelp": "Programs with these categories will be displayed as movies. Separate multiple with '|'.", "XmlTvNewsCategoriesHelp": "Programs with these categories will be displayed as news programs. Separate multiple with '|'.", @@ -40,8 +39,6 @@ "Genres": "Genres", "HeaderAlbumArtists": "Album Artists", "HeaderContinueWatching": "Continue Watching", - "HeaderLiveTV": "Live TV", - "HeaderNextUp": "Next Up", "Movies": "Movies", "Photos": "Photos", "Playlists": "Playlists", @@ -53,7 +50,6 @@ "AccessRestrictedTryAgainLater": "Access is currently restricted. Please try again later.", "Actor": "Actor", "Add": "Add", - "AddItemToCollectionHelp": "Add items to collections by searching for them and using their right-click or tap menus to add them to a collection.", "AddToCollection": "Add to collection", "AddToPlayQueue": "Add to play queue", "AddToPlaylist": "Add to playlist", @@ -84,11 +80,9 @@ "AsManyAsPossible": "As many as possible", "Ascending": "Ascending", "AspectRatio": "Aspect Ratio", - "AttributeNew": "New", "Audio": "Audio", "AuthProviderHelp": "Select an Authentication Provider to be used to authenticate this user's password.", "Auto": "Auto", - "AutoBasedOnLanguageSetting": "Auto (based on language setting)", "Backdrop": "Backdrop", "Backdrops": "Backdrops", "Banner": "Banner", @@ -101,82 +95,56 @@ "BoxRear": "Box (rear)", "Browse": "Browse", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX, …) and certain ASS or SSA subtitles.", - "ButtonAdd": "Add", "ButtonAddMediaLibrary": "Add Media Library", "ButtonAddScheduledTaskTrigger": "Add Trigger", "ButtonAddServer": "Add Server", "ButtonAddUser": "Add User", - "ButtonArrowDown": "Down", "ButtonArrowLeft": "Left", "ButtonArrowRight": "Right", - "ButtonArrowUp": "Up", "ButtonAudioTracks": "Audio Tracks", "ButtonBack": "Back", "ButtonCancel": "Cancel", "ButtonChangeServer": "Change Server", - "ButtonConnect": "Connect", - "ButtonDelete": "Delete", - "ButtonDeleteImage": "Delete Image", - "ButtonDown": "Down", - "ButtonDownload": "Download", - "ButtonEdit": "Edit", - "ButtonEditImages": "Edit images", "ButtonEditOtherUserPreferences": "Edit this user's profile, image and personal preferences.", - "ButtonFilter": "Filter", "ButtonForgotPassword": "Forgot Password", "ButtonFullscreen": "Fullscreen", "ButtonGotIt": "Got It", "ButtonGuide": "Guide", - "ButtonHelp": "Help", - "ButtonHome": "Home", "ButtonInfo": "Info", - "ButtonLearnMore": "Learn more", "ButtonLibraryAccess": "Library access", "ButtonManualLogin": "Manual Login", "ButtonMore": "More", "ButtonNetwork": "Network", - "ButtonNew": "New", "ButtonNextTrack": "Next track", - "ButtonOff": "Off", "ButtonOk": "OK", "ButtonOpen": "Open", "ButtonParentalControl": "Parental control", "ButtonPause": "Pause", - "ButtonPlay": "Play", "ButtonPreviousTrack": "Previous track", "ButtonProfile": "Profile", "ButtonQuickStartGuide": "Quick Start Guide", - "ButtonRefresh": "Refresh", "ButtonRefreshGuideData": "Refresh Guide Data", "ButtonRemove": "Remove", "ButtonRename": "Rename", - "ButtonRepeat": "Repeat", "ButtonResetEasyPassword": "Reset easy pin code", "ButtonResetPassword": "Reset Password", "ButtonRestart": "Restart", "ButtonResume": "Resume", "ButtonRevoke": "Revoke", - "ButtonSave": "Save", "ButtonScanAllLibraries": "Scan All Libraries", - "ButtonSearch": "Search", "ButtonSelectDirectory": "Select Directory", "ButtonSelectServer": "Select Server", "ButtonSelectView": "Select view", "ButtonSend": "Send", "ButtonSettings": "Settings", - "ButtonShuffle": "Shuffle", "ButtonShutdown": "Shutdown", "ButtonSignIn": "Sign In", "ButtonSignOut": "Sign Out", - "ButtonSort": "Sort", "ButtonStart": "Start", "ButtonStop": "Stop", "ButtonSubmit": "Submit", - "ButtonSubtitles": "Subtitles", "ButtonTrailer": "Trailer", "ButtonUninstall": "Uninstall", - "ButtonUp": "Up", - "ButtonViewWebsite": "View website", "ButtonWebsite": "Website", "CancelRecording": "Cancel recording", "CancelSeries": "Cancel series", @@ -202,7 +170,7 @@ "DatePlayed": "Date played", "DeathDateValue": "Died: {0}", "Default": "Default", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "ErrorDefault": "There was an error processing the request. Please try again later.", "DefaultSubtitlesHelp": "Subtitles are loaded based on the default and forced flags in the embedded metadata. Language preferences are considered when multiple options are available.", "Delete": "Delete", "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", @@ -243,7 +211,6 @@ "EditImages": "Edit images", "EditMetadata": "Edit metadata", "EditSubtitles": "Edit subtitles", - "EnableBackdrops": "Backdrops", "EnableBackdropsHelp": "Display backdrops in the background of some pages while browsing the library.", "EnableCinemaMode": "Cinema mode", "EnableDisplayMirroring": "Display mirroring", @@ -256,9 +223,7 @@ "EnablePhotosHelp": "Images will be detected and displayed alongside other media files.", "EnableStreamLooping": "Auto-loop live streams", "EnableStreamLoopingHelp": "Enable this if live streams only contain a few seconds of data and need to be continuously requested. Enabling this when not needed may cause problems.", - "EnableThemeSongs": "Theme songs", "EnableThemeSongsHelp": "Play theme songs in the background while browsing the library.", - "EnableThemeVideos": "Theme videos", "EnableThemeVideosHelp": "Play theme videos in the background while browsing the library.", "Ended": "Ended", "EndsAtValue": "Ends at {0}", @@ -269,7 +234,7 @@ "ErrorAddingXmlTvFile": "There was an error accessing the XMLTV file. Please ensure the file exists and try again.", "ErrorDeletingItem": "There was an error deleting the item from Jellyfin Server. Please check that Jellyfin Server has write access to the media folder and try again.", "ErrorGettingTvLineups": "There was an error downloading TV lineups. Please ensure your information is correct and try again.", - "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time.", + "ErrorStartHourGreaterThanEnd": "End time must be greater than the start time.", "ErrorPleaseSelectLineup": "Please select a lineup and try again. If no lineups are available, then please check that your username, password, and postal code is correct.", "ErrorSavingTvProvider": "There was an error saving the TV provider. Please ensure it is accessible and try again.", "EveryNDays": "Every {0} days", @@ -310,14 +275,11 @@ "HeaderActiveDevices": "Active Devices", "HeaderActiveRecordings": "Active Recordings", "HeaderActivity": "Activity", - "HeaderAddScheduledTaskTrigger": "Add Trigger", "HeaderAddToCollection": "Add to Collection", "HeaderAddToPlaylist": "Add to Playlist", "HeaderAddUpdateImage": "Add/Update Image", - "HeaderAddUser": "Add User", "HeaderAdditionalParts": "Additional Parts", "HeaderAdmin": "Admin", - "HeaderAlbums": "Albums", "HeaderAlert": "Alert", "HeaderAllowMediaDeletionFrom": "Allow Media Deletion From", "HeaderApiKey": "API Key", @@ -327,15 +289,11 @@ "HeaderAppearsOn": "Appears On", "HeaderAudioBooks": "Audio Books", "HeaderAudioSettings": "Audio Settings", - "HeaderAutomaticUpdates": "Automatic Updates", - "HeaderBooks": "Books", "HeaderBranding": "Branding", "HeaderCancelRecording": "Cancel Recording", "HeaderCancelSeries": "Cancel Series", "HeaderCastAndCrew": "Cast & Crew", - "HeaderCastCrew": "Cast & Crew", "HeaderChannelAccess": "Channel Access", - "HeaderChannels": "Channels", "HeaderChapterImages": "Chapter Images", "HeaderCodecProfile": "Codec Profile", "HeaderCodecProfileHelp": "Codec profiles indicate the limitations of a device when playing specific codecs. If a limitation applies then the media will be transcoded, even if the codec is configured for direct play.", @@ -362,13 +320,11 @@ "HeaderDevices": "Devices", "HeaderDirectPlayProfile": "Direct Play Profile", "HeaderDirectPlayProfileHelp": "Add direct play profiles to indicate which formats the device can handle natively.", - "HeaderDisplay": "Display", "HeaderDownloadSync": "Download & Sync", "HeaderEasyPinCode": "Easy Pin Code", "HeaderEditImages": "Edit Images", "HeaderEnabledFields": "Enabled Fields", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent its data from being changed.", - "HeaderEpisodes": "Episodes", "HeaderError": "Error", "HeaderExternalIds": "External IDs:", "HeaderFavoriteBooks": "Favourite Books", @@ -381,14 +337,10 @@ "HeaderFavoriteVideos": "Favourite Videos", "HeaderFavoritePlaylists": "Favourite Playlists", "HeaderFeatureAccess": "Feature Access", - "HeaderFeatures": "Features", "HeaderFetchImages": "Fetch Images:", "HeaderFetcherSettings": "Fetcher Settings", - "HeaderFilters": "Filters", "HeaderForKids": "For Kids", - "HeaderForgotPassword": "Forgot Password", "HeaderFrequentlyPlayed": "Frequently Played", - "HeaderGenres": "Genres", "HeaderGuideProviders": "TV Guide Data Providers", "HeaderHttpHeaders": "HTTP Headers", "HeaderIdentification": "Identification", @@ -399,7 +351,6 @@ "HeaderImageSettings": "Image Settings", "HeaderInstall": "Install", "HeaderInstantMix": "Instant Mix", - "HeaderItems": "Items", "HeaderKeepRecording": "Keep Recording", "HeaderKeepSeries": "Keep Series", "HeaderKodiMetadataHelp": "To enable or disable NFO metadata, edit a library in Jellyfin library setup and locate the metadata savers section.", @@ -413,15 +364,12 @@ "HeaderLibraryFolders": "Library Folders", "HeaderLibraryOrder": "Library Order", "HeaderLibrarySettings": "Library Settings", - "HeaderLiveTv": "Live TV", "HeaderLiveTvTunerSetup": "Live TV Tuner Setup", "HeaderLoginFailure": "Login Failure", "HeaderMedia": "Media", "HeaderMediaFolders": "Media Folders", - "HeaderMediaInfo": "Media Info", "HeaderMetadataSettings": "Metadata Settings", "HeaderMoreLikeThis": "More Like This", - "HeaderMovies": "Movies", "HeaderMusicQuality": "Music Quality", "HeaderMusicVideos": "Music Videos", "HeaderMyDevice": "My Device", @@ -466,7 +414,7 @@ "Unrated": "Unrated", "Unplayed": "Unplayed", "Unmute": "Unmute", - "UninstallPluginHeader": "Uninstall Plugin", + "HeaderUninstallPlugin": "Uninstall Plugin", "Trailers": "Trailers", "TrackCount": "{0} tracks", "TitlePlayback": "Playback", @@ -475,32 +423,17 @@ "Thursday": "Thursday", "ThisWizardWillGuideYou": "This wizard will help guide you through the setup process. To begin, please select your preferred language.", "TheseSettingsAffectSubtitlesOnThisDevice": "These settings affect subtitles on this device", - "TabShows": "Shows", "TabSettings": "Settings", "TabServer": "Server", - "TabSeries": "Series", "TabScheduledTasks": "Scheduled Tasks", - "TabResumeSettings": "Resume", "TabResponses": "Responses", - "TabRecordings": "Recordings", - "TabPlaylist": "Playlist", - "TabPlayback": "Playback", "TabOther": "Other", "TabNotifications": "Notifications", "TabNetworks": "Networks", "TabMyPlugins": "My Plugins", - "TabMusicVideos": "Music Videos", "TabMusic": "Music", - "TabMovies": "Movies", - "TabMetadata": "Metadata", "TabLogs": "Logs", - "TabDisplay": "Display", "TabDirectPlay": "Direct Play", - "TabDevices": "Devices", - "TabChannels": "Channels", - "TabArtists": "Artists", - "TabAlbums": "Albums", - "TabAlbumArtists": "Album Artists", "TabAdvanced": "Advanced", "TabAccess": "Access", "TV": "TV", @@ -548,7 +481,6 @@ "SaveSubtitlesIntoMediaFolders": "Save subtitles into media folders", "Saturday": "Saturday", "Runtime": "Runtime", - "RunAtStartup": "Run at startup", "Rewind": "Rewind", "ResumeAt": "Resume from {0}", "ReplaceExistingImages": "Replace existing images", @@ -567,7 +499,7 @@ "Refresh": "Refresh", "Recordings": "Recordings", "RecordingScheduled": "Recording scheduled.", - "RecordingPathChangeMessage": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.", + "MessageChangeRecordingPath": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.", "RecordingCancelled": "Recording cancelled.", "RecordSeries": "Record series", "Record": "Record", @@ -576,7 +508,6 @@ "RecommendationBecauseYouWatched": "Because you watched {0}", "Rate": "Rate", "Raised": "Raised", - "QueueAllFromHere": "Queue all from here", "Quality": "Quality", "Producer": "Producer", "Primary": "Primary", @@ -585,7 +516,7 @@ "Premiere": "Premiere", "PreferEmbeddedTitlesOverFileNamesHelp": "This determines the default display title when no internet metadata or local metadata is available.", "PreferEmbeddedTitlesOverFileNames": "Prefer embedded titles over filenames", - "PluginInstalledMessage": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.", + "MessagePluginInstalled": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.", "PleaseSelectTwoItems": "Please select at least two items.", "PleaseRestartServerName": "Please restart Jellyfin Server - {0}.", "PleaseConfirmPluginInstallation": "Please click OK to confirm you've read the above and wish to proceed with the plugin installation.", @@ -602,7 +533,7 @@ "PictureInPicture": "Picture in picture", "PerfectMatch": "Perfect match", "PasswordSaved": "Password saved.", - "PasswordResetHeader": "Reset Password", + "HeaderResetPassword": "Reset Password", "PasswordResetConfirmation": "Are you sure you wish to reset the password?", "PasswordResetComplete": "The password has been reset.", "PasswordMatchError": "Password and password confirmation must match.", @@ -614,20 +545,16 @@ "OptionWeekly": "Weekly", "OptionWeekends": "Weekends", "OptionWeekdays": "Weekdays", - "OptionWednesday": "Wednesday", "OptionWakeFromSleep": "Wake from sleep", "OptionUnplayed": "Unplayed", "OptionUnairedEpisode": "Unaired Episodes", "OptionTrackName": "Track Name", "OptionThumbCard": "Thumb card", "OptionThumb": "Thumb", - "OptionThursday": "Thursday", - "OptionSunday": "Sunday", "OptionSubstring": "Substring", "OptionSpecialEpisode": "Specials", "OptionSaveMetadataAsHiddenHelp": "Changing this will apply to new metadata saved going forward. Existing metadata files will be updated the next time they are saved by Jellyfin Server.", "OptionSaveMetadataAsHidden": "Save metadata and images as hidden files", - "OptionSaturday": "Saturday", "OptionRuntime": "Runtime", "OptionResumable": "Resumable", "OptionResElement": "res element", @@ -645,7 +572,6 @@ "OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".", "OptionParentalRating": "Parental Rating", "OptionOnInterval": "On an interval", - "OptionOnAppStartup": "On application startup", "OptionNone": "None", "OptionNew": "New…", "OptionMissingEpisode": "Missing Episodes", @@ -685,9 +611,8 @@ "Normal": "Normal", "None": "None", "NoSubtitlesHelp": "Subtitles will not be loaded by default. They can still be turned on manually during playback.", - "NoSubtitles": "None", - "NoPluginConfigurationMessage": "This plugin has no settings to configure.", - "NoNextUpItemsMessage": "None found. Start watching your shows!", + "MessageNoPluginConfiguration": "This plugin has no settings to configure.", + "MessageNoNextUpItems": "None found. Start watching your shows!", "No": "No", "NextUp": "Next Up", "NewEpisodesOnly": "New episodes only", @@ -713,7 +638,6 @@ "MessageNoAvailablePlugins": "No available plugins.", "MessageInvalidUser": "Invalid username or password. Please try again.", "MessageInvalidForgotPasswordPin": "An invalid or expired pin code was entered. Please try again.", - "MessageInstallPluginFromApp": "This plugin must be installed from within the app you intend to use it in.", "MessageImageTypeNotSelected": "Please select an image type from the drop-down menu.", "MessageImageFileTypeAllowed": "Only JPEG and PNG files are supported.", "MessageForgotPasswordInNetworkRequired": "Please try again within your home network to initiate the password reset process.", @@ -756,7 +680,6 @@ "LibraryAccessHelp": "Select the libraries to share with this user. Administrators will be able to edit all folders using the metadata manager.", "LeaveBlankToNotSetAPassword": "You can leave this field blank to set no password.", "LearnHowYouCanContribute": "Learn how you can contribute.", - "LaunchWebAppOnStartupHelp": "Open the web client in your default web browser when the server initially starts. This will not occur when using the restart server function.", "LanNetworksHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be considered on local network when enforcing bandwidth restrictions. If set, all other IP addresses will be considered to be on the external network and will be subject to the external bandwidth restrictions. If left blank, only the server's subnet is considered to be on the local network.", "LabelffmpegPathHelp": "The path to the ffmpeg application file, or folder containing ffmpeg.", "LabelffmpegPath": "FFmpeg path:", @@ -780,22 +703,18 @@ "LabelTypeText": "Text", "LabelTunerIpAddress": "Tuner IP Address:", "LabelTriggerType": "Trigger Type:", - "LabelTranscodingVideoCodec": "Video codec:", "LabelTranscodingThreadCountHelp": "Select the maximum number of threads to use when transcoding. Reducing the thread count will lower CPU usage but may not convert fast enough for a smooth playback experience.", "LabelTranscodingThreadCount": "Transcoding thread count:", "LabelTranscodingFramerate": "Transcoding framerate:", "LabelTranscodes": "Transcodes:", "LabelTranscodingTempPathHelp": "Specify a custom path for the transcode files served to clients. Leave blank to use the server default.", "LabelTranscodePath": "Transcode path:", - "LabelTranscodingContainer": "Container:", - "LabelTranscodingAudioCodec": "Audio codec:", "LabelTrackNumber": "Track number:", "LabelTitle": "Title:", "LabelTagline": "Tagline:", "LabelTag": "Tag:", "LabelTVHomeScreen": "TV mode home screen:", "LabelSupportedMediaTypes": "Supported Media Types:", - "LabelSubtitles": "Subtitles", "LabelSubtitlePlaybackMode": "Subtitle mode:", "LabelSubtitleFormatHelp": "Example: srt", "LabelSubtitleDownloaders": "Subtitle downloaders:", @@ -805,14 +724,12 @@ "LabelStartWhenPossible": "Start when possible:", "LabelSpecialSeasonsDisplayName": "Special season display name:", "LabelSource": "Source:", - "LabelSoundEffects": "Sound effects:", "LabelSortBy": "Sort by:", "LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.", "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery and decrease the likelihood of video transcoding.", "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", "LabelSkipBackLength": "Skip back length:", - "LabelSkin": "Skin:", "LabelSize": "Size:", "LabelSimultaneousConnectionLimit": "Simultaneous stream limit:", "LabelServerHost": "Host:", @@ -837,7 +754,6 @@ "LabelPublicHttpPortHelp": "The public port number that should be mapped to the local HTTP port.", "LabelPublicHttpPort": "Public HTTP port number:", "LabelMetadataDownloadersHelp": "Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.", - "LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons", "LabelDidlMode": "DIDL mode:", "LabelDefaultUser": "Default user:", "LabelDefaultScreen": "Default screen:", @@ -857,8 +773,6 @@ "MessageEnablingOptionLongerScans": "Enabling this option may result in significantly longer library scans.", "MessageConfirmRecordingCancellation": "Cancel recording?", "MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?", - "LaunchWebAppOnStartup": "Launch the web interface when starting the server", - "LabelYourFirstName": "Your first name:", "OnlyForcedSubtitles": "Only Forced", "Off": "Off", "NumLocationsValue": "{0} folders", @@ -936,11 +850,7 @@ "TellUsAboutYourself": "Tell us about yourself", "TagsValue": "Tags: {0}", "Tags": "Tags", - "TabUsers": "Users", "TabUpcoming": "Upcoming", - "TabTranscoding": "Transcoding", - "TabTrailers": "Trailers", - "TabSuggestions": "Suggestions", "LabelDisplayMode": "Display mode:", "LabelDisplayLanguageHelp": "Translating Jellyfin is an ongoing project.", "LabelDisplayLanguage": "Display language:", @@ -948,22 +858,14 @@ "LabelDeviceDescription": "Device description", "LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.", "TabStreaming": "Streaming", - "TabSongs": "Songs", "TabProfiles": "Profiles", "TabProfile": "Profile", "TabPlugins": "Plugins", - "TabPlaylists": "Playlists", "TabNfoSettings": "NFO Settings", "TabNetworking": "Networking", - "TabLiveTV": "Live TV", "TabLatest": "Latest", - "TabInfo": "Info", - "TabGuide": "Guide", - "TabGenres": "Genres", - "TabEpisodes": "Episodes", "TabDashboard": "Dashboard", "TabContainers": "Containers", - "TabCollections": "Collections", "TabCodecs": "Codecs", "Sort": "Sort", "Smaller": "Smaller", @@ -986,7 +888,6 @@ "LabelSeriesRecordingPath": "Series recording path (optional):", "LabelRecordingPathHelp": "Specify the default location to save recordings. If left empty, the server's program data folder will be used.", "LabelRecordingPath": "Default recording path:", - "LabelReadHowYouCanContribute": "Learn how you can contribute.", "LabelAlbumArtMaxWidth": "Album art max width:", "LabelCustomCssHelp": "Apply your own custom styling to the web interface.", "LabelBlastMessageIntervalHelp": "Determines the duration in seconds between blast alive messages.", @@ -1027,7 +928,6 @@ "LabelProfileCodecsHelp": "Separated by comma. This can be left empty to apply to all codecs.", "LabelProfileAudioCodecs": "Audio codecs:", "LabelPreferredSubtitleLanguage": "Preferred subtitle language:", - "LabelPreferredDisplayLanguageHelp": "Translating Jellyfin is an ongoing project.", "LabelPreferredDisplayLanguage": "Preferred display language:", "LabelPostProcessor": "Post-processing application:", "LabelPlayer": "Player:", @@ -1038,7 +938,6 @@ "LabelParentalRating": "Parental rating:", "LabelParentNumber": "Parent number:", "LabelOptionalNetworkPath": "(Optional) Shared network folder:", - "LabelNext": "Next", "LabelNewsCategories": "News categories:", "LabelNewPasswordConfirm": "New password confirm:", "LabelNewPassword": "New password:", @@ -1130,7 +1029,6 @@ "LabelDisplayOrder": "Display order:", "LabelDisplayName": "Display name:", "LabelDateAddedBehaviorHelp": "If a metadata value is present it will always be used before either of these options.", - "LabelCustomDeviceDisplayName": "Display name:", "LabelCustomCss": "Custom CSS:", "LabelCustomCertificatePathHelp": "Path to a PKCS #12 file containing a certificate and private key to enable TLS support on a custom domain.", "LabelCurrentPassword": "Current password:", @@ -1155,16 +1053,12 @@ "LabelAudioChannels": "Audio channels:", "LabelAudioBitrate": "Audio bitrate:", "LabelAudioBitDepth": "Audio bit depth:", - "LabelAudio": "Audio", "LabelArtistsHelp": "Separate multiple using ;", "LabelArtists": "Artists:", "LabelAppName": "App name", "LabelAllowedRemoteAddressesMode": "Remote IP address filter mode:", "LabelAllowedRemoteAddresses": "Remote IP address filter:", - "LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods when no users are active.", - "LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates", "LabelAllowHWTranscoding": "Allow hardware transcoding", - "LabelAll": "All", "LabelAlbumArtists": "Album artists:", "LabelAlbumArtPN": "Album art PN:", "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", @@ -1189,7 +1083,6 @@ "HideWatchedContentFromLatestMedia": "Hide watched content from latest media", "Hide": "Hide", "Help": "Help", - "HeadersFolders": "Folders", "HeaderXmlSettings": "XML Settings", "HeaderXmlDocumentAttributes": "XML Document Attributes", "HeaderXmlDocumentAttribute": "XML Document Attribute", @@ -1208,7 +1101,6 @@ "HeaderTracks": "Tracks", "HeaderThisUserIsCurrentlyDisabled": "This user is currently disabled", "HeaderTaskTriggers": "Task Triggers", - "HeaderTags": "Tags", "HeaderSystemDlnaProfiles": "System Profiles", "HeaderSubtitleProfilesHelp": "Subtitle profiles describe the subtitle formats supported by the device.", "HeaderSubtitleProfiles": "Subtitle Profiles", @@ -1253,7 +1145,6 @@ "Watched": "Watched", "ViewPlaybackInfo": "View playback info", "ViewAlbum": "View album", - "VideoRange": "Video range", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "These settings also apply to any Chromecast playback started by this device.", "Studios": "Studios", "StopRecording": "Stop recording", @@ -1266,7 +1157,6 @@ "OptionContinuing": "Continuing", "OptionCommunityRating": "Community Rating", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", - "LinksValue": "Links: {0}", "LabelSelectVersionToInstall": "Select version to install:", "LabelMetadataPathHelp": "Specify a custom location for downloaded artwork and metadata.", "OptionLikes": "Likes", @@ -1283,7 +1173,6 @@ "OptionHasThemeSong": "Theme Song", "OptionHasSubtitles": "Subtitles", "OptionHasSpecialFeatures": "Special Features", - "OptionFriday": "Friday", "OptionExtractChapterImage": "Enable chapter image extraction", "OptionExternallyDownloaded": "External download", "OptionEquals": "Equals", @@ -1320,17 +1209,14 @@ "Up": "Up", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", "MediaInfoStreamTypeSubtitle": "Subtitle", - "MediaInfoSoftware": "Software", "ValueOneSeries": "1 series", "MediaInfoBitrate": "Bitrate", "LabelVideo": "Video", - "LabelPrevious": "Previous", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelKodiMetadataEnableExtraThumbs": "Copy extrafanart to extrathumbs field", "LabelInternetQuality": "Internet quality:", "LabelFileOrUrl": "File or URL:", "LabelDateAdded": "Date added:", - "LabelDashboardTheme": "Server dashboard theme:", "LabelCustomRating": "Custom rating:", "LabelCollection": "Collection:", "LabelChannels": "Channels:", @@ -1338,13 +1224,11 @@ "ValueOneMovie": "1 movie", "ValueOneEpisode": "1 episode", "ValueEpisodeCount": "{0} episodes", - "TabPassword": "Password", "TabParentalControl": "Parental Control", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", "RefreshQueued": "Refresh queued.", "Play": "Play", "PasswordResetProviderHelp": "Choose a Password Reset Provider to be used when this user requests a password reset", - "OptionTuesday": "Tuesday", "OptionReleaseDate": "Release Date", "OptionDisplayFolderViewHelp": "Display folders alongside your other media libraries. This can be useful if you'd like to have a plain folder view.", "OptionDislikes": "Dislikes", @@ -1359,7 +1243,6 @@ "OptionBlockMusic": "Music", "OptionBlockLiveTvChannels": "Live TV Channels", "OptionBlockBooks": "Books", - "OptionAutomatic": "Auto", "OptionAuto": "Auto", "OptionAscending": "Ascending", "OptionAdminUsers": "Administrators", @@ -1371,7 +1254,6 @@ "MessageYouHaveVersionInstalled": "You currently have version {0} installed.", "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please ensure it is running and try again.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "The following media locations will be removed from your library:", - "MessageSettingsSaved": "Settings saved.", "MessageReenableUser": "See below to reenable", "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.", "MessageItemsAdded": "Items added.", @@ -1384,7 +1266,6 @@ "Save": "Save", "People": "People", "OptionNameSort": "Name", - "OptionMonday": "Monday", "MusicAlbum": "Music Album", "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and Albums. Click the + button to start creating collections.", "ShowTitle": "Show title", @@ -1395,13 +1276,11 @@ "HeaderSpecialEpisodeInfo": "Special Episode Info", "HeaderSortOrder": "Sort Order", "HeaderSortBy": "Sort By", - "HeaderShutdown": "Shutdown", "HeaderSetupLibrary": "Setup your media libraries", "HeaderSettings": "Settings", "HeaderServerSettings": "Server Settings", "HeaderSeriesStatus": "Series Status", "HeaderSeriesOptions": "Series Options", - "HeaderSeries": "Series", "HeaderSendMessage": "Send Message", "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.", "HeaderSubtitleDownloads": "Subtitle Downloads", @@ -1415,7 +1294,6 @@ "HeaderSelectCertificatePath": "Select Certificate Path", "HeaderSecondsValue": "{0} Seconds", "HeaderSeasons": "Seasons", - "HeaderSchedule": "Schedule", "HeaderScenes": "Scenes", "HeaderRunningTasks": "Running Tasks", "HeaderRevisionHistory": "Revision History", @@ -1439,8 +1317,6 @@ "HeaderPlayAll": "Play All", "HeaderPinCodeReset": "Reset Pin Code", "HeaderPhotoAlbums": "Photo Albums", - "HeaderPeople": "People", - "HeaderHome": "Home", "HeaderFavoritePeople": "Favourite People", "FetchingData": "Fetching additional data", "ButtonAddImage": "Add Image", @@ -1455,7 +1331,6 @@ "LabelPlayerDimensions": "Player dimensions:", "LabelDroppedFrames": "Dropped frames:", "LabelCorruptedFrames": "Corrupted frames:", - "CopyStreamURLError": "There was an error copying the URL.", "NoCreatedLibraries": "Seems like you haven't created any libraries yet. {0}Would you like to create one now?{1}", "AskAdminToCreateLibrary": "Ask an administrator to create a library.", "PlaybackErrorNoCompatibleStream": "This client isn't compatible with the media and the server isn't sending a compatible media format.", @@ -1477,11 +1352,9 @@ "Yadif": "YADIF", "Track": "Track", "Season": "Season", - "ReleaseGroup": "Release Group", "PreferEmbeddedEpisodeInfosOverFileNames": "Prefer embedded episode information over filenames", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "This uses the episode information from the embedded metadata if available.", "Person": "Person", - "OtherArtist": "Other Artist", "Movie": "Movie", "LabelLibraryPageSizeHelp": "Sets the amount of items to show on a library page. Set to 0 in order to disable paging.", "LabelLibraryPageSize": "Library page size:", @@ -1494,16 +1367,13 @@ "AlbumArtist": "Album Artist", "Album": "Album", "UnsupportedPlayback": "Jellyfin cannot decrypt content protected by DRM but all content will be attempted regardless, including protected titles. Some files may appear completely black due to encryption or other unsupported features, such as interactive titles.", - "MessageUnauthorizedUser": "You are not authorized to access the server at this time. Please contact your server administrator for more information.", "ButtonTogglePlaylist": "Playlist", - "ButtonToggleContextMenu": "More", "HeaderDVR": "DVR", "ApiKeysCaption": "List of the currently enabled API keys", "ButtonCast": "Cast", "ButtonSyncPlay": "SyncPlay", - "EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder", - "EnableBlurhash": "Enable blurred placeholders for images", - "TabDVR": "DVR", + "EnableBlurHashHelp": "Images that are still being loaded will be displayed with a blurred placeholder", + "EnableBlurHash": "Enable blurred placeholders for images", "TabRepositories": "Repositories", "SyncPlayAccessHelp": "Select the level of access this user has to the SyncPlay feature. SyncPlay enables to sync playback with other devices.", "ShowMore": "Show more", @@ -1546,7 +1416,6 @@ "LabelSyncPlayTimeOffset": "Time offset with the server:", "LabelRequireHttpsHelp": "If checked, the server will automatically redirect all requests over HTTP to HTTPS. This has no effect if the server is not listening on HTTPS.", "LabelRequireHttps": "Require HTTPS", - "LabelNightly": "Nightly", "LabelStable": "Stable", "LabelChromecastVersion": "Chromecast Version", "LabelEnableHttpsHelp": "Enables the server to listen on the configured HTTPS port. A valid certificate must also be configured in order for this to take effect.", diff --git a/src/strings/en-us.json b/src/strings/en-us.json index a148ef061f..f87c1a326e 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -3,7 +3,6 @@ "AccessRestrictedTryAgainLater": "Access is currently restricted. Please try again later.", "Actor": "Actor", "Add": "Add", - "AddItemToCollectionHelp": "Add items to collections by searching for them and using their right-click or tap menus to add them to a collection.", "AddToCollection": "Add to collection", "AddToPlayQueue": "Add to play queue", "AddToPlaylist": "Add to playlist", @@ -28,7 +27,7 @@ "AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text, in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.", "AllowFfmpegThrottling": "Throttle Transcodes", "AllowFfmpegThrottlingHelp": "When a transcode or remux gets far enough ahead from the current playback position, pause the process so it will consume less resources. This is most useful when watching without seeking often. Turn this off if you experience playback issues.", - "AllowRemoteAccess": "Allow remote connections to this Jellyfin Server.", + "AllowRemoteAccess": "Allow remote connections to this server.", "AllowRemoteAccessHelp": "If unchecked, all remote connections will be blocked.", "AllowedRemoteAddressesHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be allowed to connect remotely. If left blank, all remote addresses will be allowed.", "AlwaysPlaySubtitles": "Always Play", @@ -43,11 +42,9 @@ "Ascending": "Ascending", "AskAdminToCreateLibrary": "Ask an administrator to create a library.", "AspectRatio": "Aspect Ratio", - "AttributeNew": "New", "Audio": "Audio", - "AuthProviderHelp": "Select an Authentication Provider to be used to authenticate this user's password.", + "AuthProviderHelp": "Select an authentication provider to be used to authenticate this user's password.", "Auto": "Auto", - "AutoBasedOnLanguageSetting": "Auto (based on language setting)", "Backdrop": "Backdrop", "Backdrops": "Backdrops", "Banner": "Banner", @@ -61,88 +58,61 @@ "BoxSet": "Box Set", "BoxRear": "Box (rear)", "Browse": "Browse", - "BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins.", + "MessageBrowsePluginCatalog": "Browse our plugin catalog to view available plugins.", "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX, …) and certain ASS or SSA subtitles.", - "ButtonAdd": "Add", "ButtonAddImage": "Add Image", "ButtonAddMediaLibrary": "Add Media Library", "ButtonAddScheduledTaskTrigger": "Add Trigger", "ButtonAddServer": "Add Server", "ButtonAddUser": "Add User", - "ButtonArrowDown": "Down", "ButtonArrowLeft": "Left", "ButtonArrowRight": "Right", - "ButtonArrowUp": "Up", "ButtonAudioTracks": "Audio Tracks", "ButtonBack": "Back", "ButtonCancel": "Cancel", "ButtonChangeServer": "Change Server", - "ButtonConnect": "Connect", - "ButtonDelete": "Delete", - "ButtonDeleteImage": "Delete Image", - "ButtonDown": "Down", - "ButtonDownload": "Download", - "ButtonEdit": "Edit", - "ButtonEditImages": "Edit images", "ButtonEditOtherUserPreferences": "Edit this user's profile, image and personal preferences.", - "ButtonFilter": "Filter", "ButtonForgotPassword": "Forgot Password", "ButtonFullscreen": "Fullscreen", "ButtonGotIt": "Got It", "ButtonGuide": "Guide", - "ButtonHelp": "Help", - "ButtonHome": "Home", "ButtonInfo": "Info", - "ButtonLearnMore": "Learn more", "ButtonLibraryAccess": "Library access", "ButtonManualLogin": "Manual Login", "ButtonMore": "More", "ButtonNetwork": "Network", - "ButtonNew": "New", "ButtonNextTrack": "Next track", - "ButtonOff": "Off", "ButtonOk": "Ok", "ButtonOpen": "Open", "ButtonParentalControl": "Parental control", "ButtonPause": "Pause", - "ButtonPlay": "Play", "ButtonPreviousTrack": "Previous track", "ButtonProfile": "Profile", "ButtonQuickStartGuide": "Quick Start Guide", - "ButtonRefresh": "Refresh", "ButtonRefreshGuideData": "Refresh Guide Data", "ButtonRemove": "Remove", "ButtonRename": "Rename", - "ButtonRepeat": "Repeat", "ButtonResetEasyPassword": "Reset easy pin code", "ButtonResetPassword": "Reset Password", "ButtonRestart": "Restart", "ButtonResume": "Resume", "ButtonRevoke": "Revoke", - "ButtonSave": "Save", "ButtonScanAllLibraries": "Scan All Libraries", - "ButtonSearch": "Search", "ButtonSelectDirectory": "Select Directory", "ButtonSelectServer": "Select Server", "ButtonSelectView": "Select view", "ButtonSend": "Send", "ButtonSettings": "Settings", - "ButtonShuffle": "Shuffle", "ButtonShutdown": "Shutdown", "ButtonSignIn": "Sign In", "ButtonSignOut": "Sign Out", - "ButtonSort": "Sort", "ButtonStart": "Start", "ButtonStop": "Stop", "ButtonSplit": "Split", "ButtonSubmit": "Submit", - "ButtonSubtitles": "Subtitles", - "ButtonToggleContextMenu": "More", "ButtonTogglePlaylist": "Playlist", "ButtonTrailer": "Trailer", "ButtonUninstall": "Uninstall", - "ButtonUp": "Up", - "ButtonViewWebsite": "View website", "ButtonWebsite": "Website", "CancelRecording": "Cancel recording", "CancelSeries": "Cancel series", @@ -160,7 +130,7 @@ "ColorTransfer": "Color transfer", "CommunityRating": "Community rating", "Composer": "Composer", - "ConfigureDateAdded": "Configure how date added is determined in the Jellyfin Server dashboard under Library settings", + "ConfigureDateAdded": "Configure how date added is determined in the dashboard under the library settings", "ConfirmDeleteImage": "Delete image?", "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", @@ -171,14 +141,13 @@ "Continuing": "Continuing", "CopyStreamURL": "Copy Stream URL", "CopyStreamURLSuccess": "URL copied successfully.", - "CopyStreamURLError": "There was an error copying the URL.", "CriticRating": "Critic rating", "CustomDlnaProfilesHelp": "Create a custom profile to target a new device or override a system profile.", "DateAdded": "Date added", "DatePlayed": "Date played", "DeathDateValue": "Died: {0}", "Default": "Default", - "DefaultErrorMessage": "There was an error processing the request. Please try again later.", + "ErrorDefault": "There was an error processing the request. Please try again later.", "DefaultMetadataLangaugeDescription": "These are your defaults and can be customized on a per-library basis.", "DefaultSubtitlesHelp": "Subtitles are loaded based on the default and forced flags in the embedded metadata. Language preferences are considered when multiple options are available.", "DeinterlaceMethodHelp": "Select the deinterlacing method to use when transcoding interlaced content.", @@ -195,8 +164,8 @@ "DetectingDevices": "Detecting devices", "DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.", "DirectPlaying": "Direct playing", - "DirectStreamHelp1": "The media is compatible with the device regarding resolution and media type (H.264, AC3, etc), but is in an incompatible file container (mkv, avi, wmv, etc). The video will be re-packaged on the fly before streaming it to the device.", - "DirectStreamHelp2": "Direct Streaming a file uses very little processing power without any loss in video quality.", + "DirectStreamHelp1": "The media is compatible with the device regarding resolution and media type (H.264, AC3, etc), but in an incompatible file container (mkv, avi, wmv, etc). The video will be re-packaged on the fly before being sent to the device.", + "DirectStreamHelp2": "Direct stream uses very little processing power with a minimal loss in video quality.", "DirectStreaming": "Direct streaming", "Director": "Director", "Directors": "Directors", @@ -221,7 +190,6 @@ "EditImages": "Edit images", "EditMetadata": "Edit metadata", "EditSubtitles": "Edit subtitles", - "EnableBackdrops": "Backdrops", "EnableBackdropsHelp": "Display backdrops in the background of some pages while browsing the library.", "EnableCinemaMode": "Cinema mode", "EnableColorCodedBackgrounds": "Color coded backgrounds", @@ -237,9 +205,7 @@ "EnablePhotosHelp": "Images will be detected and displayed alongside other media files.", "EnableStreamLooping": "Auto-loop live streams", "EnableStreamLoopingHelp": "Enable this if live streams only contain a few seconds of data and need to be continuously requested. Enabling this when not needed may cause problems.", - "EnableThemeSongs": "Theme songs", "EnableThemeSongsHelp": "Play theme songs in the background while browsing the library.", - "EnableThemeVideos": "Theme videos", "EnableThemeVideosHelp": "Play theme videos in the background while browsing the library.", "EnableDetailsBanner": "Details Banner", "EnableDetailsBannerHelp": "Display a banner image at the top of the item details page.", @@ -248,12 +214,12 @@ "Episode": "Episode", "Episodes": "Episodes", "ErrorAddingListingsToSchedulesDirect": "There was an error adding the lineup to your Schedules Direct account. Schedules Direct only allows a limited number of lineups per account. You may need to log into the Schedules Direct website and remove others listings from your account before proceeding.", - "ErrorAddingMediaPathToVirtualFolder": "There was an error adding the media path. Please ensure the path is valid and the Jellyfin Server process has access to that location.", + "ErrorAddingMediaPathToVirtualFolder": "There was an error adding the media path. Please ensure the path is valid and Jellyfin has access to that location.", "ErrorAddingTunerDevice": "There was an error adding the tuner device. Please ensure it is accessible and try again.", "ErrorAddingXmlTvFile": "There was an error accessing the XMLTV file. Please ensure the file exists and try again.", - "ErrorDeletingItem": "There was an error deleting the item from Jellyfin Server. Please check that Jellyfin Server has write access to the media folder and try again.", + "ErrorDeletingItem": "There was an error deleting the item from the server. Please check that Jellyfin has write access to the media folder and try again.", "ErrorGettingTvLineups": "There was an error downloading TV lineups. Please ensure your information is correct and try again.", - "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time.", + "ErrorStartHourGreaterThanEnd": "End time must be greater than the start time.", "ErrorPleaseSelectLineup": "Please select a lineup and try again. If no lineups are available, then please check that your username, password, and postal code is correct.", "ErrorSavingTvProvider": "There was an error saving the TV provider. Please ensure it is accessible and try again.", "EveryNDays": "Every {0} days", @@ -300,35 +266,28 @@ "HeaderActiveDevices": "Active Devices", "HeaderActiveRecordings": "Active Recordings", "HeaderActivity": "Activity", - "HeaderAddScheduledTaskTrigger": "Add Trigger", "HeaderAddToCollection": "Add to Collection", "HeaderAddToPlaylist": "Add to Playlist", "HeaderAddUpdateImage": "Add/Update Image", - "HeaderAddUser": "Add User", "HeaderAdditionalParts": "Additional Parts", "HeaderAdmin": "Admin", "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", "HeaderAlert": "Alert", "HeaderAllowMediaDeletionFrom": "Allow Media Deletion From", "HeaderApiKey": "API Key", "HeaderApiKeys": "API Keys", - "HeaderApiKeysHelp": "External applications are required to have an API key in order to communicate with Jellyfin Server. Keys are issued by logging in with a Jellyfin account, or by manually granting the application a key.", + "HeaderApiKeysHelp": "External applications are required to have an API key in order to communicate with the server. Keys are issued by logging in with a normal user account or manually granting the application a key.", "ApiKeysCaption": "List of the currently enabled API keys", "HeaderApp": "App", "HeaderAppearsOn": "Appears On", "HeaderAudioBooks": "Audio Books", "HeaderAudioSettings": "Audio Settings", - "HeaderAutomaticUpdates": "Automatic Updates", "HeaderBlockItemsWithNoRating": "Block items with no or unrecognized rating information:", - "HeaderBooks": "Books", "HeaderBranding": "Branding", "HeaderCancelRecording": "Cancel Recording", "HeaderCancelSeries": "Cancel Series", "HeaderCastAndCrew": "Cast & Crew", - "HeaderCastCrew": "Cast & Crew", "HeaderChannelAccess": "Channel Access", - "HeaderChannels": "Channels", "HeaderChapterImages": "Chapter Images", "HeaderCodecProfile": "Codec Profile", "HeaderCodecProfileHelp": "Codec profiles indicate the limitations of a device when playing specific codecs. If a limitation applies then the media will be transcoded, even if the codec is configured for direct play.", @@ -356,14 +315,12 @@ "HeaderDevices": "Devices", "HeaderDirectPlayProfile": "Direct Play Profile", "HeaderDirectPlayProfileHelp": "Add direct play profiles to indicate which formats the device can handle natively.", - "HeaderDisplay": "Display", "HeaderDownloadSync": "Download & Sync", "HeaderDVR": "DVR", "HeaderEasyPinCode": "Easy Pin Code", "HeaderEditImages": "Edit Images", "HeaderEnabledFields": "Enabled Fields", "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent its data from being changed.", - "HeaderEpisodes": "Episodes", "HeaderError": "Error", "HeaderExternalIds": "External IDs:", "HeaderFavoriteBooks": "Favorite Books", @@ -377,16 +334,11 @@ "HeaderFavoriteVideos": "Favorite Videos", "HeaderFavoritePlaylists": "Favorite Playlists", "HeaderFeatureAccess": "Feature Access", - "HeaderFeatures": "Features", "HeaderFetchImages": "Fetch Images:", "HeaderFetcherSettings": "Fetcher Settings", - "HeaderFilters": "Filters", "HeaderForKids": "For Kids", - "HeaderForgotPassword": "Forgot Password", "HeaderFrequentlyPlayed": "Frequently Played", - "HeaderGenres": "Genres", "HeaderGuideProviders": "TV Guide Data Providers", - "HeaderHome": "Home", "HeaderHttpHeaders": "HTTP Headers", "HeaderHttpsSettings": "HTTPS Settings", "HeaderIdentification": "Identification", @@ -397,10 +349,9 @@ "HeaderImageSettings": "Image Settings", "HeaderInstall": "Install", "HeaderInstantMix": "Instant Mix", - "HeaderItems": "Items", "HeaderKeepRecording": "Keep Recording", "HeaderKeepSeries": "Keep Series", - "HeaderKodiMetadataHelp": "To enable or disable NFO metadata, edit a library in Jellyfin library setup and locate the metadata savers section.", + "HeaderKodiMetadataHelp": "To enable or disable NFO metadata, edit a library and locate the metadata savers section.", "HeaderLatestEpisodes": "Latest Episodes", "HeaderLatestMedia": "Latest Media", "HeaderLatestMovies": "Latest Movies", @@ -411,16 +362,12 @@ "HeaderLibraryFolders": "Library Folders", "HeaderLibraryOrder": "Library Order", "HeaderLibrarySettings": "Library Settings", - "HeaderLiveTV": "Live TV", - "HeaderLiveTv": "Live TV", "HeaderLiveTvTunerSetup": "Live TV Tuner Setup", "HeaderLoginFailure": "Login Failure", "HeaderMedia": "Media", "HeaderMediaFolders": "Media Folders", - "HeaderMediaInfo": "Media Info", "HeaderMetadataSettings": "Metadata Settings", "HeaderMoreLikeThis": "More Like This", - "HeaderMovies": "Movies", "HeaderMusicQuality": "Music Quality", "HeaderMusicVideos": "Music Videos", "HeaderMyDevice": "My Device", @@ -430,7 +377,6 @@ "HeaderNewApiKey": "New API Key", "HeaderNewDevices": "New Devices", "HeaderNextEpisodePlayingInValue": "Next Episode Playing in {0}", - "HeaderNextUp": "Next Up", "HeaderNextVideoPlayingInValue": "Next Video Playing in {0}", "HeaderOnNow": "On Now", "HeaderOtherItems": "Other Items", @@ -438,7 +384,6 @@ "HeaderPassword": "Password", "HeaderPasswordReset": "Password Reset", "HeaderPaths": "Paths", - "HeaderPeople": "People", "HeaderPhotoAlbums": "Photo Albums", "HeaderPinCodeReset": "Reset Pin Code", "HeaderPlayAll": "Play All", @@ -450,7 +395,7 @@ "HeaderPreferredMetadataLanguage": "Preferred Metadata Language", "HeaderProfile": "Profile", "HeaderProfileInformation": "Profile Information", - "HeaderProfileServerSettingsHelp": "These values control how Jellyfin Server will present itself to the device.", + "HeaderProfileServerSettingsHelp": "These values control how the server will present itself to clients.", "HeaderRecentlyPlayed": "Recently Played", "HeaderRecordingOptions": "Recording Options", "HeaderRecordingPostProcessing": "Recording Post Processing", @@ -464,27 +409,24 @@ "HeaderRevisionHistory": "Revision History", "HeaderRunningTasks": "Running Tasks", "HeaderScenes": "Scenes", - "HeaderSchedule": "Schedule", "HeaderSeasons": "Seasons", "HeaderSecondsValue": "{0} Seconds", "HeaderSelectCertificatePath": "Select Certificate Path", "HeaderSelectMetadataPath": "Select Metadata Path", - "HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to store metadata within. The folder must be writeable.", + "HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to use for metadata. The folder must be writeable.", "HeaderSelectPath": "Select Path", "HeaderSelectServer": "Select Server", "HeaderSelectServerCachePath": "Select Server Cache Path", "HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable.", "HeaderSelectTranscodingPath": "Select Transcoding Temporary Path", - "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.", + "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcode files. The folder must be writeable.", "HeaderSendMessage": "Send Message", - "HeaderSeries": "Series", "HeaderSeriesOptions": "Series Options", "HeaderSeriesStatus": "Series Status", "HeaderServerAddressSettings": "Server Address Settings", "HeaderServerSettings": "Server Settings", "HeaderSettings": "Settings", "HeaderSetupLibrary": "Setup your media libraries", - "HeaderShutdown": "Shutdown", "HeaderSortBy": "Sort By", "HeaderSortOrder": "Sort Order", "HeaderSpecialEpisodeInfo": "Special Episode Info", @@ -500,7 +442,6 @@ "HeaderSyncPlaySelectGroup": "Join a group", "HeaderSyncPlayEnabled": "SyncPlay enabled", "HeaderSystemDlnaProfiles": "System Profiles", - "HeaderTags": "Tags", "HeaderTaskTriggers": "Task Triggers", "HeaderThisUserIsCurrentlyDisabled": "This user is currently disabled", "HeaderTracks": "Tracks", @@ -522,7 +463,6 @@ "HeaderXmlDocumentAttributes": "Xml Document Attributes", "HeaderXmlSettings": "Xml Settings", "HeaderYears": "Years", - "HeadersFolders": "Folders", "Help": "Help", "Hide": "Hide", "HideWatchedContentFromLatestMedia": "Hide watched content from latest media", @@ -531,8 +471,8 @@ "HttpsRequiresCert": "To enable secure connections, you will need to supply a trusted SSL certificate, such as Let's Encrypt. Please either supply a certificate, or disable secure connections.", "Identify": "Identify", "Images": "Images", - "ImportFavoriteChannelsHelp": "If enabled, only channels that are marked as favorite on the tuner device will be imported.", - "ImportMissingEpisodesHelp": "If enabled, information about missing episodes will be imported into your Jellyfin database and displayed within seasons and series. This may cause significantly longer library scans.", + "ImportFavoriteChannelsHelp": "Only channels that are marked as favorite on the tuner device will be imported.", + "ImportMissingEpisodesHelp": "Information about missing episodes will be imported into your database and displayed within seasons and series. This may cause significantly longer library scans.", "InstallingPackage": "Installing {0} (version {1})", "InstantMix": "Instant mix", "ItemCount": "{0} items", @@ -556,17 +496,13 @@ "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", "LabelAlbumArtPN": "Album art PN:", "LabelAlbumArtists": "Album artists:", - "LabelAll": "All", "LabelAllowHWTranscoding": "Allow hardware transcoding", - "LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates", - "LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods when no users are active.", "LabelAllowedRemoteAddresses": "Remote IP address filter:", "LabelAllowedRemoteAddressesMode": "Remote IP address filter mode:", "LabelAppName": "App name", "LabelAppNameExample": "Example: Sickbeard, Sonarr", "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", - "LabelAudio": "Audio", + "LabelArtistsHelp": "Separate multiple artists with a semicolon.", "LabelAudioBitDepth": "Audio bit depth:", "LabelAudioBitrate": "Audio bitrate:", "LabelAudioChannels": "Audio channels:", @@ -576,11 +512,11 @@ "LabelAuthProvider": "Authentication Provider:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Automatically refresh metadata from the internet:", "LabelBindToLocalNetworkAddress": "Bind to local network address:", - "LabelBindToLocalNetworkAddressHelp": "Optional. Override the local IP address to bind the http server to. If left empty, the server will bind to all availabile addresses. Changing this value requires restarting Jellyfin Server.", + "LabelBindToLocalNetworkAddressHelp": "Override the local IP address for the HTTP server. If left empty, the server will bind to all availabile addresses. Changing this value requires a restart.", "LabelBirthDate": "Birth date:", "LabelBirthYear": "Birth year:", "LabelBitrate": "Bitrate:", - "LabelBlastMessageInterval": "Alive message interval (seconds)", + "LabelBlastMessageInterval": "Alive message interval", "LabelBlastMessageIntervalHelp": "Determines the duration in seconds between blast alive messages.", "LabelBlockContentWithTags": "Block items with tags:", "LabelBurnSubtitles": "Burn subtitles:", @@ -601,14 +537,12 @@ "LabelCustomCertificatePath": "Custom SSL certificate path:", "LabelCustomCertificatePathHelp": "Path to a PKCS #12 file containing a certificate and private key to enable TLS support on a custom domain.", "LabelCustomCss": "Custom CSS:", - "LabelCustomCssHelp": "Apply your own custom styling to the web interface.", - "LabelCustomDeviceDisplayName": "Display name:", + "LabelCustomCssHelp": "Apply your own custom styles on the web interface.", "LabelCustomDeviceDisplayNameHelp": "Supply a custom display name or leave empty to use the name reported by the device.", "LabelCustomRating": "Custom rating:", - "LabelDashboardTheme": "Server dashboard theme:", "LabelDateAdded": "Date added:", "LabelDateAddedBehavior": "Date added behavior for new content:", - "LabelDateAddedBehaviorHelp": "If a metadata value is present it will always be used before either of these options.", + "LabelDateAddedBehaviorHelp": "If a metadata value is present, it will always be used before either of these options.", "LabelDateTimeLocale": "Date time locale:", "LabelDay": "Day:", "LabelDeathDate": "Death date:", @@ -621,7 +555,6 @@ "LabelDiscNumber": "Disc number:", "LabelDisplayLanguage": "Display language:", "LabelDisplayLanguageHelp": "Translating Jellyfin is an ongoing project.", - "LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons", "LabelDisplayMode": "Display mode:", "LabelDisplayName": "Display name:", "LabelDisplayOrder": "Display order:", @@ -640,19 +573,19 @@ "LabelEnableAutomaticPortMapHelp": "Automatically forward public ports on your router to local ports on your server via UPnP. This may not work with some router models or network configurations. Changes will not apply until after a server restart.", "LabelEnableBlastAliveMessages": "Blast alive messages", "LabelEnableBlastAliveMessagesHelp": "Enable this if the server is not detected reliably by other UPnP devices on your network.", - "LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches performed by Jellyfin.", + "LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches.", "LabelEnableDlnaDebugLogging": "Enable DLNA debug logging", "LabelEnableDlnaDebugLoggingHelp": "Create large log files and should only be used as needed for troubleshooting purposes.", "LabelEnableDlnaPlayTo": "Enable DLNA Play To", - "LabelEnableDlnaPlayToHelp": "Detect devices within your network and offer the ability to remote control them.", + "LabelEnableDlnaPlayToHelp": "Detect devices within your network and offer the ability to control them remotely.", "LabelEnableDlnaServer": "Enable DLNA server", "LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play content.", "LabelEnableHardwareDecodingFor": "Enable hardware decoding for:", "LabelEnableHttps": "Enable HTTPS", - "LabelEnableHttpsHelp": "Enables the server to listen on the configured HTTPS port. A valid certificate must also be configured in order for this to take effect.", + "LabelEnableHttpsHelp": "Listen on the configured HTTPS port. A valid certificate must also be supplied for this to take effect.", "LabelEnableRealtimeMonitor": "Enable real time monitoring", - "LabelEnableRealtimeMonitorHelp": "Changes to files will be processed immediately, on supported file systems.", + "LabelEnableRealtimeMonitorHelp": "Changes to files will be processed immediately on supported file systems.", "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.", "LabelEndDate": "End date:", @@ -660,7 +593,7 @@ "LabelEvent": "Event:", "LabelEveryXMinutes": "Every:", "LabelBaseUrl": "Base URL:", - "LabelBaseUrlHelp": "Adds a custom subdirectory to the server URL. For example: http://example.com/<baseurl>", + "LabelBaseUrlHelp": "Add a custom subdirectory to the server URL. For example: http://example.com/<baseurl>", "LabelExtractChaptersDuringLibraryScan": "Extract chapter images during the library scan", "LabelExtractChaptersDuringLibraryScanHelp": "Generate chapter images when videos are imported during the library scan. Otherwise, they will be extracted during the chapter images scheduled task, allowing the regular library scan to complete faster.", "LabelFailed": "Failed", @@ -671,9 +604,9 @@ "LabelForgotPasswordUsernameHelp": "Enter your username, if you remember it.", "LabelFormat": "Format:", "LabelFriendlyName": "Friendly name:", - "LabelServerNameHelp": "This name will be used to identify the server and will default to the server's computer name.", + "LabelServerNameHelp": "This name will be used to identify the server and will default to the server's hostname.", "LabelGroupMoviesIntoCollections": "Group movies into collections", - "LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.", + "LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies in a collection will be displayed as one grouped item.", "LabelH264Crf": "H264 encoding CRF:", "LabelEncoderPreset": "H264 and H265 encoding preset:", "LabelHardwareAccelerationType": "Hardware acceleration:", @@ -681,7 +614,7 @@ "LabelHomeNetworkQuality": "Home network quality:", "LabelHomeScreenSectionValue": "Home screen section {0}:", "LabelHttpsPort": "Local HTTPS port number:", - "LabelHttpsPortHelp": "The TCP port number that Jellyfin's HTTPS server should bind to.", + "LabelHttpsPortHelp": "The TCP port number for the HTTPS server.", "LabelIconMaxHeight": "Icon maximum height:", "LabelIconMaxHeightHelp": "Maximum resolution of icons exposed via upnp:icon.", "LabelIconMaxWidth": "Icon maximum width:", @@ -711,7 +644,7 @@ "LabelLibraryPageSizeHelp": "Sets the amount of items to show on a library page. Set to 0 in order to disable paging.", "LabelLineup": "Lineup:", "LabelLocalHttpServerPortNumber": "Local HTTP port number:", - "LabelLocalHttpServerPortNumberHelp": "The TCP port number that Jellyfin's HTTP server should bind to.", + "LabelLocalHttpServerPortNumberHelp": "The TCP port number for the HTTP server.", "LabelLockItemToPreventChanges": "Lock this item to prevent future changes", "LabelLoginDisclaimer": "Login disclaimer:", "LabelLoginDisclaimerHelp": "A message that will be displayed at the bottom of the login page.", @@ -737,7 +670,7 @@ "LabelMetadataReaders": "Metadata readers:", "LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.", "LabelMetadataSavers": "Metadata savers:", - "LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.", + "LabelMetadataSaversHelp": "Choose the file formats to use when saving your metadata.", "LabelMethod": "Method:", "LabelMinBackdropDownloadWidth": "Minimum backdrop download width:", "LabelMinResumeDuration": "Minimum resume duration:", @@ -753,25 +686,23 @@ "LabelMovieCategories": "Movie categories:", "LabelMoviePrefix": "Movie prefix:", "LabelMoviePrefixHelp": "If a prefix is applied to movie titles, enter it here so the server can handle it properly.", - "LabelMovieRecordingPath": "Movie recording path (optional):", + "LabelMovieRecordingPath": "Movie recording path:", "LabelMusicStreamingTranscodingBitrate": "Music transcoding bitrate:", - "LabelMusicStreamingTranscodingBitrateHelp": "Specify a max bitrate when streaming music.", + "LabelMusicStreamingTranscodingBitrateHelp": "Specify a maximum bitrate when streaming music.", "LabelName": "Name:", "LabelChromecastVersion": "Chromecast Version", "LabelStable": "Stable", - "LabelNightly": "Nightly", "LabelUnstable": "Unstable", "LabelNewName": "New name:", "LabelNewPassword": "New password:", "LabelNewPasswordConfirm": "New password confirm:", "LabelNewsCategories": "News categories:", - "LabelNext": "Next", "LabelNotificationEnabled": "Enable this notification", "LabelNumber": "Number:", "LabelNumberOfGuideDays": "Number of days of guide data to download:", "LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.", - "LabelOptionalNetworkPath": "(Optional) Shared network folder:", - "LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Jellyfin apps on other devices to access media files directly. For example, {0} or {1}.", + "LabelOptionalNetworkPath": "Shared network folder:", + "LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow clients on other devices to access media files directly. For example, {0} or {1}.", "LabelOriginalAspectRatio": "Original aspect ratio:", "LabelOriginalTitle": "Original title:", "LabelOverview": "Overview:", @@ -795,9 +726,7 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPreferredDisplayLanguage": "Preferred display language:", - "LabelPreferredDisplayLanguageHelp": "Translating Jellyfin is an ongoing project.", "LabelPreferredSubtitleLanguage": "Preferred subtitle language:", - "LabelPrevious": "Previous", "LabelProfileAudioCodecs": "Audio codecs:", "LabelProfileCodecs": "Codecs:", "LabelProfileCodecsHelp": "Separated by comma. This can be left empty to apply to all codecs.", @@ -811,7 +740,6 @@ "LabelPublicHttpPortHelp": "The public port number that should be mapped to the local HTTP port.", "LabelPublicHttpsPort": "Public HTTPS port number:", "LabelPublicHttpsPortHelp": "The public port number that should be mapped to the local HTTPS port.", - "LabelReadHowYouCanContribute": "Learn how you can contribute.", "LabelReasonForTranscoding": "Reason for transcoding:", "LabelRecord": "Record:", "LabelRecordingPath": "Default recording path:", @@ -822,7 +750,7 @@ "LabelRemoteClientBitrateLimitHelp": "An optional per-stream bitrate limit for all out of network devices. This is useful to prevent devices from requesting a higher bitrate than your internet connection can handle. This may result in increased CPU load on your server in order to transcode videos on the fly to a lower bitrate.", "LabelRequireHttps": "Require HTTPS", "LabelRequireHttpsHelp": "If checked, the server will automatically redirect all requests over HTTP to HTTPS. This has no effect if the server is not listening on HTTPS.", - "LabelRuntimeMinutes": "Run time (minutes):", + "LabelRuntimeMinutes": "Runtime:", "LabelSaveLocalMetadata": "Save artwork into media folders", "LabelSaveLocalMetadataHelp": "Saving artwork into media folders will put them in a place where they can be easily edited.", "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.", @@ -836,13 +764,12 @@ "LabelSelectVersionToInstall": "Select version to install:", "LabelSendNotificationToUsers": "Send the notification to:", "LabelSerialNumber": "Serial number", - "LabelSeriesRecordingPath": "Series recording path (optional):", + "LabelSeriesRecordingPath": "Series recording path:", "LabelServerHost": "Host:", "LabelServerHostHelp": "192.168.1.100:8096 or https://myserver.com", "LabelServerName": "Server name:", "LabelSimultaneousConnectionLimit": "Simultaneous stream limit:", "LabelSize": "Size:", - "LabelSkin": "Skin:", "LabelSkipBackLength": "Skip back length:", "LabelSkipForwardLength": "Skip forward length:", "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", @@ -854,7 +781,6 @@ "LabelSortBy": "Sort by:", "LabelSortOrder": "Sort order:", "LabelSortTitle": "Sort title:", - "LabelSoundEffects": "Sound effects:", "LabelSource": "Source:", "LabelSpecialSeasonsDisplayName": "Special season display name:", "LabelSportsCategories": "Sports categories:", @@ -866,7 +792,6 @@ "LabelSubtitleDownloaders": "Subtitle downloaders:", "LabelSubtitleFormatHelp": "Example: srt", "LabelSubtitlePlaybackMode": "Subtitle mode:", - "LabelSubtitles": "Subtitles", "LabelSupportedMediaTypes": "Supported Media Types:", "LabelSyncPlayTimeOffset": "Time offset with the server:", "MillisecondsUnit": "ms", @@ -891,8 +816,6 @@ "LabelTimeLimitHours": "Time limit (hours):", "LabelTitle": "Title:", "LabelTrackNumber": "Track number:", - "LabelTranscodingAudioCodec": "Audio codec:", - "LabelTranscodingContainer": "Container:", "LabelTranscodePath": "Transcode path:", "LabelTranscodingTempPathHelp": "Specify a custom path for the transcode files served to clients. Leave blank to use the server default.", "LabelTranscodes": "Transcodes:", @@ -900,7 +823,6 @@ "LabelTranscodingProgress": "Transcoding progress:", "LabelTranscodingThreadCount": "Transcoding thread count:", "LabelTranscodingThreadCountHelp": "Select the maximum number of threads to use when transcoding. Reducing the thread count will lower CPU usage but may not convert fast enough for a smooth playback experience.", - "LabelTranscodingVideoCodec": "Video codec:", "LabelTriggerType": "Trigger Type:", "LabelTunerIpAddress": "Tuner IP Address:", "LabelTunerType": "Tuner type:", @@ -934,21 +856,17 @@ "LabelXDlnaDoc": "X-DLNA doc:", "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.", "LabelYear": "Year:", - "LabelYourFirstName": "Your first name:", "LabelYoureDone": "You're Done!", "LabelZipCode": "Zip Code:", "LabelffmpegPath": "FFmpeg path:", - "LabelffmpegPathHelp": "The path to the ffmpeg application file, or folder containing ffmpeg.", + "LabelffmpegPathHelp": "The path to the ffmpeg application file or folder containing ffmpeg.", "LanNetworksHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be considered on local network when enforcing bandwidth restrictions. If set, all other IP addresses will be considered to be on the external network and will be subject to the external bandwidth restrictions. If left blank, only the server's subnet is considered to be on the local network.", "Large": "Large", "LatestFromLibrary": "Latest {0}", - "LaunchWebAppOnStartup": "Launch the web interface when starting the server", - "LaunchWebAppOnStartupHelp": "Open the web client in your default web browser when the server initially starts. This will not occur when using the restart server function.", "LearnHowYouCanContribute": "Learn how you can contribute.", "LeaveBlankToNotSetAPassword": "You can leave this field blank to set no password.", "LibraryAccessHelp": "Select the libraries to share with this user. Administrators will be able to edit all folders using the metadata manager.", "Like": "Like", - "LinksValue": "Links: {0}", "List": "List", "Live": "Live", "LiveBroadcasts": "Live broadcasts", @@ -984,7 +902,6 @@ "MediaInfoSampleRate": "Sample rate", "MediaInfoSize": "Size", "MediaInfoTimestamp": "Timestamp", - "MediaInfoSoftware": "Software", "MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeData": "Data", "MediaInfoStreamTypeEmbeddedImage": "Embedded Image", @@ -1001,13 +918,13 @@ "MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?", "MessageConfirmRecordingCancellation": "Cancel recording?", "MessageConfirmRemoveMediaLocation": "Are you sure you wish to remove this location?", - "MessageConfirmRestart": "Are you sure you wish to restart Jellyfin Server?", - "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Jellyfin Server will be abruptly terminated.", + "MessageConfirmRestart": "Are you sure you wish to restart Jellyfin?", + "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this API key? The application's connection to this server will be abruptly terminated.", "MessageConfirmShutdown": "Are you sure you wish to shutdown the server?", "MessageContactAdminToResetPassword": "Please contact your system administrator to reset your password.", "MessageCreateAccountAt": "Create an account at {0}", "MessageDeleteTaskTrigger": "Are you sure you wish to delete this task trigger?", - "MessageDirectoryPickerBSDInstruction": "For BSD, you may need to configure storage within your FreeNAS Jail in order to allow Jellyfin to access it.", + "MessageDirectoryPickerBSDInstruction": "For BSD, you may need to configure storage within your FreeNAS Jail so Jellyfin can access your media.", "MessageDirectoryPickerLinuxInstruction": "For Linux on Arch Linux, CentOS, Debian, Fedora, openSUSE, or Ubuntu, you must grant the service user at least read access to your storage locations.", "MessageDownloadQueued": "Download queued.", "MessageEnablingOptionLongerScans": "Enabling this option may result in significantly longer library scans.", @@ -1016,10 +933,8 @@ "MessageForgotPasswordInNetworkRequired": "Please try again within your home network to initiate the password reset process.", "MessageImageFileTypeAllowed": "Only JPEG and PNG files are supported.", "MessageImageTypeNotSelected": "Please select an image type from the drop-down menu.", - "MessageInstallPluginFromApp": "This plugin must be installed from within the app you intend to use it in.", "MessageInvalidForgotPasswordPin": "An invalid or expired pin code was entered. Please try again.", "MessageInvalidUser": "Invalid username or password. Please try again.", - "MessageUnauthorizedUser": "You are not authorized to access the server at this time. Please contact your server administrator for more information.", "MessageItemSaved": "Item saved.", "MessageItemsAdded": "Items added.", "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.", @@ -1043,9 +958,8 @@ "MessagePleaseEnsureInternetMetadata": "Please ensure downloading of internet metadata is enabled.", "MessagePleaseWait": "Please wait. This may take a minute.", "MessagePluginConfigurationRequiresLocalAccess": "To configure this plugin please sign in to your local server directly.", - "MessagePluginInstallDisclaimer": "Plugins built by Jellyfin community members are a great way to enhance your Jellyfin experience with additional features and benefits. Before installing, please be aware of the effects they may have on your Jellyfin Server, such as longer library scans, additional background processing, and decreased system stability.", + "MessagePluginInstallDisclaimer": "Plugins built by community members are a great way to enhance your experience with additional features and benefits. Before installing, please be aware of the effects they may have on your server, such as longer library scans, additional background processing, and decreased system stability.", "MessageReenableUser": "See below to reenable", - "MessageSettingsSaved": "Settings saved.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "The following media locations will be removed from your library:", "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please ensure it is running and try again.", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", @@ -1067,7 +981,7 @@ "MessageSyncPlayErrorMedia": "Failed to enable SyncPlay! Media error.", "Metadata": "Metadata", "MetadataManager": "Metadata Manager", - "MetadataSettingChangeHelp": "Changing metadata settings will affect new content that is added going forward. To refresh existing content, open the detail screen and click the refresh button, or perform bulk refreshes using the metadata manager.", + "MetadataSettingChangeHelp": "Changing metadata settings will affect new content added going forward. To refresh existing content, open the detail screen and click the refresh button, or perform bulk refreshes using the metadata manager.", "MinutesAfter": "minutes after", "MinutesBefore": "minutes before", "Mobile": "Mobile", @@ -1100,10 +1014,9 @@ "No": "No", "NoCreatedLibraries": "Seems like you haven't created any libraries yet. {0}Would you like to create one now?{1}", "NoNewDevicesFound": "No new devices found. To add a new tuner, close this dialog and enter the device information manually.", - "NoNextUpItemsMessage": "None found. Start watching your shows!", - "NoPluginConfigurationMessage": "This plugin has no settings to configure.", + "MessageNoNextUpItems": "None found. Start watching your shows!", + "MessageNoPluginConfiguration": "This plugin has no settings to configure.", "NoSubtitleSearchResultsFound": "No results found.", - "NoSubtitles": "None", "NoSubtitlesHelp": "Subtitles will not be loaded by default. They can still be turned on manually during playback.", "None": "None", "Normal": "Normal", @@ -1126,7 +1039,7 @@ "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire after {0} days.", "OptionAllowManageLiveTv": "Allow Live TV recording management", "OptionAllowMediaPlayback": "Allow media playback", - "OptionAllowMediaPlaybackTranscodingHelp": "Restricting access to transcoding may cause playback failures in Jellyfin apps due to unsupported media formats.", + "OptionAllowMediaPlaybackTranscodingHelp": "Restricting access to transcoding may cause playback failures in clients due to unsupported media formats.", "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", "OptionAllowRemoteSharedDevicesHelp": "DLNA devices are considered shared until a user begins controlling them.", @@ -1137,9 +1050,8 @@ "OptionArtist": "Artist", "OptionAscending": "Ascending", "OptionAuto": "Auto", - "OptionAutomatic": "Auto", "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", - "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", + "OptionAutomaticallyGroupSeriesHelp": "Series that are spread across multiple folders within this library will be automatically merged into a single series.", "OptionBanner": "Banner", "OptionBlockBooks": "Books", "OptionBlockChannelContent": "Internet Channel Content", @@ -1161,7 +1073,7 @@ "OptionDatePlayed": "Date Played", "OptionDescending": "Descending", "OptionDisableUser": "Disable this user", - "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", + "OptionDisableUserHelp": "The server will not allow any connections from this user. Existing connections will be abruptly terminated.", "OptionDislikes": "Dislikes", "OptionDisplayFolderView": "Display a folder view to show plain media folders", "OptionDisplayFolderViewHelp": "Display folders alongside your other media libraries. This can be useful if you'd like to have a plain folder view.", @@ -1171,7 +1083,7 @@ "OptionDownloadBoxImage": "Box", "OptionDownloadDiscImage": "Disc", "OptionDownloadImagesInAdvance": "Download images in advance", - "OptionDownloadImagesInAdvanceHelp": "By default, most images are only downloaded when requested by a Jellyfin app. Enable this option to download all images in advance, as new media is imported. This may cause significantly longer library scans.", + "OptionDownloadImagesInAdvanceHelp": "By default, most images are only downloaded when requested by a client. Enable this option to download all images in advance, as new media is imported. This may cause significantly longer library scans.", "OptionDownloadLogoImage": "Logo", "OptionDownloadMenuImage": "Menu", "OptionDownloadPrimaryImage": "Primary", @@ -1193,7 +1105,6 @@ "OptionExternallyDownloaded": "External download", "OptionExtractChapterImage": "Enable chapter image extraction", "OptionFavorite": "Favorites", - "OptionFriday": "Friday", "OptionHasSpecialFeatures": "Special Features", "OptionHasSubtitles": "Subtitles", "OptionHasThemeSong": "Theme Song", @@ -1204,7 +1115,7 @@ "OptionHlsSegmentedSubtitles": "HLS segmented subtitles", "OptionHomeVideos": "Photos", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "These requests will be honored but will ignore the byte range header.", "OptionImdbRating": "IMDb Rating", "OptionIsHD": "HD", "OptionIsSD": "SD", @@ -1214,17 +1125,15 @@ "OptionLoginAttemptsBeforeLockoutHelp": "A value of zero means inheriting the default of three attempts for normal users and five for administrators. Setting this to -1 will disable the feature.", "OptionMax": "Max", "OptionMissingEpisode": "Missing Episodes", - "OptionMonday": "Monday", "OptionNameSort": "Name", "OptionNew": "New…", "OptionNone": "None", - "OptionOnAppStartup": "On application startup", "OptionOnInterval": "On an interval", "OptionParentalRating": "Parental Rating", "OptionPlainStorageFolders": "Display all folders as plain storage folders", - "OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".", + "OptionPlainStorageFoldersHelp": "All folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".", "OptionPlainVideoItems": "Display all videos as plain video items", - "OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".", + "OptionPlainVideoItemsHelp": "All videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".", "OptionPlayCount": "Play Count", "OptionPlayed": "Played", "OptionPoster": "Poster", @@ -1246,27 +1155,21 @@ "OptionResElement": "res element", "OptionResumable": "Resumable", "OptionRuntime": "Runtime", - "OptionSaturday": "Saturday", "OptionSaveMetadataAsHidden": "Save metadata and images as hidden files", - "OptionSaveMetadataAsHiddenHelp": "Changing this will apply to new metadata saved going forward. Existing metadata files will be updated the next time they are saved by Jellyfin Server.", + "OptionSaveMetadataAsHiddenHelp": "Changing this will apply to new metadata saved going forward. Existing metadata files will be updated the next time they are saved by the server.", "OptionSpecialEpisode": "Specials", "OptionSubstring": "Substring", - "OptionSunday": "Sunday", - "OptionThursday": "Thursday", "OptionThumb": "Thumb", "OptionThumbCard": "Thumb card", "OptionTrackName": "Track Name", - "OptionTuesday": "Tuesday", "OptionTvdbRating": "TVDB Rating", "OptionUnairedEpisode": "Unaired Episodes", "OptionUnplayed": "Unplayed", "OptionWakeFromSleep": "Wake from sleep", - "OptionWednesday": "Wednesday", "OptionWeekdays": "Weekdays", "OptionWeekends": "Weekends", "OptionWeekly": "Weekly", "OriginalAirDateValue": "Original air date: {0}", - "OtherArtist": "Other Artist", "Overview": "Overview", "PackageInstallCancelled": "{0} (version {1}) installation cancelled.", "PackageInstallCompleted": "{0} (version {1}) installation completed.", @@ -1275,8 +1178,8 @@ "PasswordMatchError": "Password and password confirmation must match.", "PasswordResetComplete": "The password has been reset.", "PasswordResetConfirmation": "Are you sure you wish to reset the password?", - "PasswordResetHeader": "Reset Password", - "PasswordResetProviderHelp": "Choose a Password Reset Provider to be used when this user requests a password reset", + "HeaderResetPassword": "Reset Password", + "PasswordResetProviderHelp": "Choose a password reset provider to be used when this user requests a password reset.", "PasswordSaved": "Password saved.", "People": "People", "PerfectMatch": "Perfect match", @@ -1289,6 +1192,7 @@ "Play": "Play", "PlayAllFromHere": "Play all from here", "PlaybackData": "Playback Data", + "PlaybackRate": "Playback Rate", "PlayCount": "Play count", "PlayFromBeginning": "Play from beginning", "PlayNext": "Play next", @@ -1299,9 +1203,11 @@ "PleaseAddAtLeastOneFolder": "Please add at least one folder to this library by clicking the Add button.", "PleaseConfirmPluginInstallation": "Please click OK to confirm you've read the above and wish to proceed with the plugin installation.", "PleaseEnterNameOrId": "Please enter a name or an external ID.", - "PleaseRestartServerName": "Please restart Jellyfin Server - {0}.", + "PleaseRestartServerName": "Please restart Jellyfin on {0}.", "PleaseSelectTwoItems": "Please select at least two items.", - "PluginInstalledMessage": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.", + "MessagePluginInstalled": "The plugin has been successfully installed. The server will need to be restarted for changes to take effect.", + "MessagePluginInstallError": "An error occured while installing the plugin.", + "MessageGetInstalledPluginsError": "An error occured while getting the list of currently installed plugins.", "PreferEmbeddedTitlesOverFileNames": "Prefer embedded titles over filenames", "PreferEmbeddedTitlesOverFileNamesHelp": "This determines the default display title when no internet metadata or local metadata is available.", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "This uses the episode information from the embedded metadata if available.", @@ -1315,7 +1221,6 @@ "ProductionLocations": "Production locations", "Programs": "Programs", "Quality": "Quality", - "QueueAllFromHere": "Queue all from here", "Raised": "Raised", "Rate": "Rate", "RecentlyWatched": "Recently watched", @@ -1326,15 +1231,14 @@ "Record": "Record", "RecordSeries": "Record series", "RecordingCancelled": "Recording cancelled.", - "RecordingPathChangeMessage": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.", + "MessageChangeRecordingPath": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.", "RecordingScheduled": "Recording scheduled.", "Recordings": "Recordings", "Refresh": "Refresh", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Jellyfin Server dashboard.", + "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the dashboard.", "RefreshMetadata": "Refresh metadata", "RefreshQueued": "Refresh queued.", "ReleaseDate": "Release date", - "ReleaseGroup": "Release Group", "RememberMe": "Remember Me", "RemoveFromCollection": "Remove from collection", "RemoveFromPlaylist": "Remove from playlist", @@ -1347,7 +1251,6 @@ "ReplaceExistingImages": "Replace existing images", "ResumeAt": "Resume from {0}", "Rewind": "Rewind", - "RunAtStartup": "Run at startup", "Runtime": "Runtime", "Saturday": "Saturday", "Save": "Save", @@ -1373,10 +1276,10 @@ "SeriesRecordingScheduled": "Series recording scheduled.", "SeriesSettings": "Series settings", "SeriesYearToPresent": "{0} - Present", - "ServerNameIsRestarting": "Jellyfin Server - {0} is restarting.", - "ServerNameIsShuttingDown": "Jellyfin Server - {0} is shutting down.", - "ServerRestartNeededAfterPluginInstall": "Jellyfin Server will need to be restarted after installing a plugin.", - "ServerUpdateNeeded": "This Jellyfin Server needs to be updated. To download the latest version, please visit {0}", + "ServerNameIsRestarting": "The server at {0} is restarting.", + "ServerNameIsShuttingDown": "The server at {0} is shutting down.", + "ServerRestartNeededAfterPluginInstall": "Jellyfin will need to be restarted after installing a plugin.", + "ServerUpdateNeeded": "This server needs to be updated. To download the latest version, please visit {0}", "Settings": "Settings", "SettingsSaved": "Settings saved.", "SettingsWarning": "Changing these values may cause instability or connectivity failures. If you experience any problems, we recommend changing them back to default.", @@ -1420,32 +1323,15 @@ "TV": "TV", "TabAccess": "Access", "TabAdvanced": "Advanced", - "TabAlbumArtists": "Album Artists", - "TabAlbums": "Albums", - "TabArtists": "Artists", "TabCatalog": "Catalog", "TabRepositories": "Repositories", - "TabChannels": "Channels", "TabCodecs": "Codecs", - "TabCollections": "Collections", "TabContainers": "Containers", "TabDashboard": "Dashboard", - "TabDevices": "Devices", "TabDirectPlay": "Direct Play", - "TabDisplay": "Display", - "TabDVR": "DVR", - "TabEpisodes": "Episodes", - "TabFavorites": "Favorites", - "TabGenres": "Genres", - "TabGuide": "Guide", - "TabInfo": "Info", "TabLatest": "Latest", - "TabLiveTV": "Live TV", "TabLogs": "Logs", - "TabMetadata": "Metadata", - "TabMovies": "Movies", "TabMusic": "Music", - "TabMusicVideos": "Music Videos", "TabMyPlugins": "My Plugins", "TabNetworks": "Networks", "TabNetworking": "Networking", @@ -1453,28 +1339,15 @@ "TabNotifications": "Notifications", "TabOther": "Other", "TabParentalControl": "Parental Control", - "TabPassword": "Password", - "TabPlayback": "Playback", - "TabPlaylist": "Playlist", - "TabPlaylists": "Playlists", "TabPlugins": "Plugins", "TabProfile": "Profile", "TabProfiles": "Profiles", - "TabRecordings": "Recordings", "TabResponses": "Responses", - "TabResumeSettings": "Resume", "TabScheduledTasks": "Scheduled Tasks", - "TabSeries": "Series", "TabServer": "Server", "TabSettings": "Settings", - "TabShows": "Shows", - "TabSongs": "Songs", "TabStreaming": "Streaming", - "TabSuggestions": "Suggestions", - "TabTrailers": "Trailers", - "TabTranscoding": "Transcoding", "TabUpcoming": "Upcoming", - "TabUsers": "Users", "Tags": "Tags", "TagsValue": "Tags: {0}", "TellUsAboutYourself": "Tell us about yourself", @@ -1495,7 +1368,7 @@ "TvLibraryHelp": "Review the {0}TV naming guide{1}.", "Uniform": "Uniform", "UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?", - "UninstallPluginHeader": "Uninstall Plugin", + "HeaderUninstallPlugin": "Uninstall Plugin", "Unmute": "Unmute", "Unplayed": "Unplayed", "Unrated": "Unrated", @@ -1527,7 +1400,6 @@ "ValueTimeLimitSingleHour": "Time limit: 1 hour", "ValueVideoCodec": "Video Codec: {0}", "Vertical": "Vertical", - "VideoRange": "Video range", "ViewAlbum": "View album", "ViewAlbumArtist": "View album artist", "ViewPlaybackInfo": "View playback info", @@ -1549,7 +1421,7 @@ "Yes": "Yes", "Yesterday": "Yesterday", "PathNotFound": "The path could not be found. Please ensure the path is valid and try again.", - "WriteAccessRequired": "Jellyfin Server requires write access to this folder. Please ensure write access and try again.", + "WriteAccessRequired": "Jellyfin requires write access to this folder. Please ensure write access and try again.", "ListPaging": "{0}-{1} of {2}", "PersonRole": "as {0}", "LastSeen": "Last seen {0}", @@ -1561,11 +1433,14 @@ "EveryXHours": "Every {0} hours", "OnApplicationStartup": "On application startup", "UnsupportedPlayback": "Jellyfin cannot decrypt content protected by DRM but all content will be attempted regardless, including protected titles. Some files may appear completely black due to encryption or other unsupported features, such as interactive titles.", - "EnableBlurhash": "Enable blurred placeholders for images", - "EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder", + "EnableBlurHash": "Enable blurred placeholders for images", + "EnableBlurHashHelp": "Images that are still being loaded will be displayed with a unique placeholder.", "ButtonSyncPlay": "SyncPlay", "ButtonCast": "Cast", "ButtonPlayer": "Player", "StopPlayback": "Stop playback", - "ClearQueue": "Clear queue" + "ClearQueue": "Clear queue", + "LabelSubtitleVerticalPosition": "Vertical position:", + "SubtitleVerticalPositionHelp": "Line number where text appears. Positive numbers indicate top down. Negative numbers indicate bottom up.", + "Preview": "Preview" } diff --git a/src/strings/eo.json b/src/strings/eo.json index e2eebac174..2a4adda538 100644 --- a/src/strings/eo.json +++ b/src/strings/eo.json @@ -18,7 +18,6 @@ "AddedOnValue": "aldonis {0}", "AddToPlaylist": "aldoni al playlist", "AddToPlayQueue": "Aldonu ludi voston", - "AddItemToCollectionHelp": "Aldonu erojn al kolektoj serĉante ilin kaj uzante ĝian alklakon aŭ frapetu menuojn por aldoni ilin al kolekto.", "Add": "Aldoni", "AccessRestrictedTryAgainLater": "Aliro nuntempe estas restriktita. Bonvolu reprovi poste." } diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index e64f1e7c6e..ce3a0c4b7a 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -3,23 +3,14 @@ "ButtonSignOut": "Cerrar sesión", "EnableHardwareEncoding": "Habilitar la codificación de hardware", "FolderTypeTvShows": "TV", - "HeaderAddUser": "Agregar Usuario", "HeaderLatestEpisodes": "Últimos capítulos", - "HeaderLiveTV": "TV en vivo", - "HeaderSeries": "Series", - "LabelAll": "Todo", - "LabelDisplayMissingEpisodesWithinSeasons": "Mostrar capítulos no disponibles en temporadas", "LabelFinish": "Terminar", - "LabelNext": "Siguiente", - "LabelPrevious": "Anterior", - "LabelYourFirstName": "Su nombre:", "LabelYoureDone": "Ha terminado!", "MoreUsersCanBeAddedLater": "Se pueden agregar más usuarios más tarde desde el tablero.", "NewCollectionNameExample": "Ejemplo: Colección de Star Wars", "OptionMissingEpisode": "Capítulos faltantes", "OptionUnairedEpisode": "Capítulos no emitidos", "ParentalRating": "Parental Rating", - "TabEpisodes": "Capítulos", "TellUsAboutYourself": "Contanos acerca de vos", "ThisWizardWillGuideYou": "Este asistente le ayudará a guiarlo durante el proceso de configuración. Para comenzar, seleccione su idioma preferido.", "UserProfilesIntro": "Jellyfin incluye soporte para perfiles de usuario con configuraciones de visualización granulares, estado de reproducción y controles parentales.", @@ -39,7 +30,6 @@ "Genres": "Géneros", "HeaderAlbumArtists": "Artistas de álbum", "HeaderContinueWatching": "Seguir viendo", - "HeaderNextUp": "Siguiente", "Movies": "Películas", "Photos": "Fotos", "Playlists": "Listas de reproducción", @@ -50,7 +40,6 @@ "AccessRestrictedTryAgainLater": "El acceso está actualmente restringido. Por favor intente nuevamente más tarde.", "Actor": "Actor", "Add": "Agregar", - "AddItemToCollectionHelp": "Agregue elementos a las colecciones buscándolos y usando el click derecho o tocando el menú para añadirlos a una colección.", "AddToCollection": "Añadir a la colección", "AddToPlayQueue": "Añadir a la cola de reproducción", "AddToPlaylist": "Añadir a la lista de reproducción", @@ -69,16 +58,14 @@ "AllowMediaConversionHelp": "Permitir o denegar acceso a la opción de convertir medios.", "AllowOnTheFlySubtitleExtraction": "Permitir extracción de subtítulos al vuelo", "AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados se pueden extraer de los videos y entregar a los clientes en texto plano, para ayudar a evitar la transcodificación de videos. En algunos sistemas, esto puede llevar mucho tiempo y provocar que la reproducción de video se detenga durante el proceso de extracción. Deshabilite esto para que los subtítulos incrustados se graben con la transcodificación de video cuando el dispositivo cliente no los admite de forma nativa.", - "AllowRemoteAccess": "Permitir conexiones remotas a este servidor Jellyfin.", + "AllowRemoteAccess": "Permitir conexiones remotas a este servidor.", "AllowRemoteAccessHelp": "Si no está tildado, todas las conexiones remotas serán bloqueadas.", "AlwaysPlaySubtitles": "Reproducir siempre", "AnyLanguage": "Cualquier idioma", "Anytime": "Cualquier fecha", "Ascending": "Ascendente", - "AttributeNew": "Nuevo", "Audio": "Audio", "Auto": "Auto", - "AutoBasedOnLanguageSetting": "Auto (basado en configuración de idioma)", "Backdrop": "Fondo", "AllowHWTranscodingHelp": "Permita que el sintonizador transcodifique transmisiones sobre la marcha. Esto puede ayudar a reducir la transcodificación requerida por el servidor.", "AllowedRemoteAddressesHelp": "Lista separada por comas de direcciones IP o IP/máscara de red para redes a las que se les permitirá conectarse de forma remota. Si se deja vacía, todas las direcciones remotas serán permitidas.", @@ -97,82 +84,56 @@ "Box": "Caja", "BoxRear": "Caja (lado opuesto)", "Browse": "Explorar", - "BrowsePluginCatalogMessage": "Explore nuestro catálogo de complementos para ver los complementos disponibles.", + "MessageBrowsePluginCatalog": "Explore nuestro catálogo de complementos para ver los complementos disponibles.", "BurnSubtitlesHelp": "Determina si el servidor debe grabarse en subtítulos al transcodificar videos. Evitar esto mejorará en gran medida el rendimiento. Seleccione Automático para grabar formatos basados en imágenes (VOBSUB, PGS, SUB, IDX, ...) y ciertos subtítulos ASS o SSA.", - "ButtonAdd": "Agregar", "ButtonAddMediaLibrary": "Agregar biblioteca de medios", "ButtonAddScheduledTaskTrigger": "Agregar desencadenador", "ButtonAddServer": "Agregar servidor", "ButtonAddUser": "Agregar usuario", - "ButtonArrowDown": "Abajo", "ButtonArrowLeft": "Izquierda", "ButtonArrowRight": "Derecha", - "ButtonArrowUp": "Arriba", "ButtonAudioTracks": "Pistas de audio", "ButtonBack": "Atrás", "ButtonCancel": "Cancelar", "ButtonChangeServer": "Cambiar servidor", - "ButtonConnect": "Conectar", - "ButtonDelete": "Eliminar", - "ButtonDeleteImage": "Eliminar imagen", - "ButtonDown": "Abajo", - "ButtonDownload": "Descargar", - "ButtonEdit": "Editar", - "ButtonEditImages": "Editar imágenes", "ButtonEditOtherUserPreferences": "Editar perfil, imagen y preferencias personales del usuario.", - "ButtonFilter": "Filtrar", "ButtonForgotPassword": "Olvidé mi contraseña", "ButtonFullscreen": "Pantalla completa", "ButtonGotIt": "Lo entendí", "ButtonGuide": "Guía", - "ButtonHelp": "Ayuda", - "ButtonHome": "Inicio", "ButtonInfo": "Información", - "ButtonLearnMore": "Aprender más", "ButtonLibraryAccess": "Acceso a la biblioteca", "ButtonManualLogin": "Inicio de sesión manual", "ButtonMore": "Más", "ButtonNetwork": "Red", - "ButtonNew": "Nuevo", "ButtonNextTrack": "Pista siguiente", - "ButtonOff": "Desactivado", "ButtonOk": "Aceptar", "ButtonOpen": "Abrir", "ButtonParentalControl": "Control parental", "ButtonPause": "Pausar", - "ButtonPlay": "Reproducir", "ButtonPreviousTrack": "Pista anterior", "ButtonProfile": "Perfil", - "ButtonRefresh": "Actualizar", "ButtonRefreshGuideData": "Actualizar datos de la guía", "ButtonRemove": "Quitar", "ButtonRename": "Renombrar", - "ButtonRepeat": "Repetir", "ButtonResetEasyPassword": "Restablecer código PIN", "ButtonResetPassword": "Restablecer contraseña", "ButtonRestart": "Reiniciar", "ButtonResume": "Resumir", "ButtonRevoke": "Revocar", - "ButtonSave": "Guardar", "ButtonScanAllLibraries": "Escanear todas las bibliotecas", - "ButtonSearch": "Buscar", "ButtonSelectDirectory": "Seleccionar directorio", "ButtonSelectServer": "Seleccionar servidor", "ButtonSelectView": "Seleccionar vista", "ButtonSend": "Enviar", "ButtonSettings": "Configuraciones", - "ButtonShuffle": "Aleatorio", "ButtonShutdown": "Apagar", "ButtonSignIn": "Iniciar sesión", - "ButtonSort": "Ordenar", "ButtonStart": "Iniciar", "ButtonStop": "Detener", "ButtonSubmit": "Enviar", - "ButtonSubtitles": "Subtítulos", "ButtonTrailer": "Avance", "ButtonUninstall": "Desinstalar", - "ButtonUp": "Arriba", - "ButtonViewWebsite": "Ver sitio web", "ButtonWebsite": "Sitio web", "CancelRecording": "Cancelar grabación", "CancelSeries": "Cancelar serie", @@ -187,7 +148,7 @@ "ColorTransfer": "Transferencia de color", "CommunityRating": "Puntuación de la comunidad", "Composer": "Compositor", - "ConfigureDateAdded": "Configura cómo se va a determinar las fechas de adición en la pestaña Bibliotecas del panel del servidor Jellyfin", + "ConfigureDateAdded": "Configure cómo se determina la fecha agregada en el panel en la configuración de la biblioteca", "ConfirmDeleteImage": "¿Eliminar imagen?", "ConfirmDeleteItem": "Eliminar este elemento lo eliminará tanto del sistema de archivos como de la biblioteca de medios. ¿Está seguro que desea continuar?", "ConfirmDeleteItems": "Eliminar estos elementos los eliminará tanto del sistema de archivos como de la biblioteca de medios. ¿Está seguro que desea continuar?", @@ -201,7 +162,7 @@ "DatePlayed": "Fecha de reproducción", "DeathDateValue": "Muerte: {0}", "Default": "Predeterminado", - "DefaultErrorMessage": "Hubo un error procesando la solicitud. Por favor intentalo nuevamente mas tarde.", + "ErrorDefault": "Hubo un error procesando la solicitud. Por favor intentalo nuevamente mas tarde.", "DefaultMetadataLangaugeDescription": "Estos son tus predeterminados y pueden ser personalizados por librería únicamente.", "Delete": "Borrar", "DeleteDeviceConfirmation": "Estas seguro que quieres borrar este dispositivo? Este va a volver a aparecer cuando una persona se registre.", @@ -241,11 +202,10 @@ "EditImages": "Editar imagenes", "EditMetadata": "Editar metadata", "EditSubtitles": "Editar subtitulos", - "EnableBackdrops": "Fondos", "EnableBackdropsHelp": "Muestra imágenes de fondo en el fondo de algunas páginas mientras se navega por la biblioteca.", "EnableCinemaMode": "Modo cine", "EnableColorCodedBackgrounds": "Habilitar colores en el fondo del código", - "AuthProviderHelp": "Seleccione un proveedor de autenticación que se utilizará para autenticar la contraseña de este usuario.", + "AuthProviderHelp": "Seleccione un proveedor de autenticación para ser utilizado para autenticar la contraseña de este usuario.", "CriticRating": "Valoración crítica", "DefaultSubtitlesHelp": "Los subtítulos se cargan según los indicadores predeterminados y forzados en los metadatos incrustados. Las preferencias de idioma se consideran cuando hay varias opciones disponibles.", "Dislike": "No me gusta", @@ -258,9 +218,7 @@ "EnablePhotosHelp": "Las imágenes serán detectadas y mostradas junto con otros archivos multimedia.", "EnableStreamLooping": "Repetir automáticamente transmisiones en vivo", "EnableStreamLoopingHelp": "Habilita esto sí las transmisiones en vivo sólo contienen unos cuantos segundos y es necesario solicitarlos continuamente. Habilitar esto cuando no es necesario puede causar problemas.", - "EnableThemeSongs": "Canciones temáticas", "EnableThemeSongsHelp": "Reproducir canciones temáticas en el fondo mientras se navega por la biblioteca.", - "EnableThemeVideos": "Videos temáticos", "EnableThemeVideosHelp": "Al habilitarse, los vídeos de tema se reproducirán de fondo mientras navegues por la biblioteca.", "Ended": "Finalizado", "EndsAtValue": "Termina en {0}", @@ -271,7 +229,7 @@ "ErrorAddingXmlTvFile": "Ocurrió un error al acceder al archivo de XmlTV. Por favor asegúrate de que el archivo existe e intenta de nuevo.", "ErrorDeletingItem": "Ocurrió un error al eliminar el ítem del servidor Jellyfin. Por favor verifica que el servidor Jellyfin tiene permiso de escritura a la carpeta de medios e intenta de nuevo.", "ErrorGettingTvLineups": "Ocurrió un error al descargar la guía de programación de TV. Por favor asegúrate que tu información es correcta e intenta de nuevo.", - "ErrorMessageStartHourGreaterThanEnd": "La hora de fin tiene que ser mayor que la de inicio.", + "ErrorStartHourGreaterThanEnd": "La hora de fin tiene que ser mayor que la de inicio.", "ErrorPleaseSelectLineup": "Por favor selecciona un alineamiento e intenta de nuevo. Si no existen alineamientos disponibles, asegúrate de que tu nombre de usuario, contraseña y código postal son correctos.", "ErrorSavingTvProvider": "Ocurrió un error al guardar el proveedor de TV. Por favor asegúrate de que está disponible e intenta de nuevo.", "EveryNDays": "Cada {0} días", @@ -310,7 +268,6 @@ "HeaderFavoriteArtists": "Artistas favoritos", "HeaderFavoriteAlbums": "Álbumes favoritos", "Shows": "Programas", - "CopyStreamURLError": "Hubo un error copiando la URL.", "CopyStreamURLSuccess": "URL copiada con éxito.", "CopyStreamURL": "Copiar URL de transmisión", "ButtonSplit": "Dividir", @@ -320,9 +277,7 @@ "AllowFfmpegThrottling": "Transcodificación Throttle", "HeaderCancelRecording": "Cancelar Grabación", "HeaderBranding": "Marca", - "HeaderBooks": "Libros", "HeaderBlockItemsWithNoRating": "Bloquear elementos con rating de información vacía o no reconocible:", - "HeaderAutomaticUpdates": "Actualizaciones Automáticas", "HeaderAudioSettings": "Configuraciones de audio", "HeaderAudioBooks": "Audiolibros", "HeaderAppearsOn": "Aparece en", @@ -332,13 +287,11 @@ "HeaderApiKey": "Contraseña API", "HeaderAllowMediaDeletionFrom": "Permitir el borrado de medios desde", "HeaderAlert": "Alerta", - "HeaderAlbums": "Albumes", "HeaderAdmin": "Admin", "HeaderAdditionalParts": "Partes adicionales", "HeaderAddUpdateImage": "Agregar/Actualizar imagen", "HeaderAddToPlaylist": "Agregar a la lista de reproducción", "HeaderAddToCollection": "Agregar a la Colección", - "HeaderAddScheduledTaskTrigger": "Agregar disparador", "HeaderActivity": "Actividad", "HeaderActiveRecordings": "Grabaciones activas", "HeaderActiveDevices": "Dispositivos activos", @@ -369,9 +322,7 @@ "HeaderCodecProfileHelp": "Los perfiles de códec indican las limitaciones de un dispositivo cuando se reproducen códecs específicos. Si se aplica una limitación, los medios se transcodificarán, incluso si el códec está configurado para reproducción directa.", "HeaderCodecProfile": "Perfil del códec", "HeaderChapterImages": "Imágenes del capitulo", - "HeaderChannels": "Canales", "HeaderChannelAccess": "Acceso al canal", - "HeaderCastCrew": "Reparto", "HeaderCastAndCrew": "Reparto", "HeaderCancelSeries": "Cancelar serie", "H264CrfHelp": "El Factor de velocidad constante (CRF) es la configuración de calidad predeterminada para el codificador x264. Puede establecer los valores entre 0 y 51, donde valores más bajos resultarían en una mejor calidad (a expensas de tamaños de archivo más altos). Los valores correctos están entre 18 y 28. El valor predeterminado para x264 es 23, por lo que puede usar esto como punto de partida.", @@ -382,12 +333,10 @@ "HeaderFavoriteBooks": "Libros favoritos", "HeaderExternalIds": "IDs externos:", "HeaderError": "Error", - "HeaderEpisodes": "Capítulos", "HeaderEnabledFields": "Campos habilitados", "HeaderEditImages": "Editar imágenes", "HeaderEasyPinCode": "Código PIN fácil", "HeaderDownloadSync": "Descargar y sincronizar", - "HeaderDisplay": "Pantalla", "HeaderDirectPlayProfile": "Perfil Direct Play", "HeaderDevices": "Dispositivos", "HeaderDeviceAccess": "Acceso al dispositivo", @@ -404,7 +353,6 @@ "HeaderMedia": "Medios", "HeaderLoginFailure": "Error al iniciar sesión", "HeaderLiveTvTunerSetup": "Configuración del sintonizador de TV en vivo", - "HeaderLiveTv": "TV en vivo", "HeaderLibrarySettings": "Configuraciones de biblioteca", "HeaderLibraryOrder": "Orden de biblioteca", "HeaderLibraryFolders": "Carpetas de biblioteca", @@ -416,7 +364,6 @@ "HeaderLatestMedia": "Medios recientes", "HeaderKeepSeries": "Mantener serie", "HeaderKeepRecording": "Mantener grabación", - "HeaderItems": "Artículos", "HeaderInstantMix": "Mezcla instantánea", "HeaderInstall": "Instalar", "HeaderImageSettings": "Configuraciones de imagen", @@ -426,27 +373,20 @@ "HeaderIdentificationCriteriaHelp": "Ingrese al menos un criterio de identificación.", "HeaderIdentification": "Identificación", "HeaderHttpHeaders": "Encabezados HTTP", - "HeaderHome": "Inicio", "HeaderGuideProviders": "Proveedores de datos de guías de TV", - "HeaderGenres": "Géneros", "HeaderFrequentlyPlayed": "Reproducido con frecuencia", - "HeaderForgotPassword": "Olvidé la contraseña", "HeaderForKids": "Para niños", - "HeaderFilters": "Filtros", "HeaderFetcherSettings": "Configuración del recuperador", "HeaderFetchImages": "Obtener imágenes:", - "HeaderFeatures": "Caracteristicas", "HeaderFeatureAccess": "Acceso a características", "HeaderFavoritePlaylists": "Listas de reproducción favoritas", "ButtonTogglePlaylist": "Lista de reproducción", - "ButtonToggleContextMenu": "Más", "HeaderPlaybackError": "Error de reproducción", "HeaderPlayback": "Reproducción de medios", "HeaderPlayOn": "Reproducir en", "HeaderPlayAll": "Reproducir todo", "HeaderPinCodeReset": "Restablecer código PIN", "HeaderPhotoAlbums": "Álbumes de fotos", - "HeaderPeople": "Personas", "HeaderPaths": "Rutas", "HeaderPasswordReset": "Restablecer contraseña", "HeaderPassword": "Contraseña", @@ -461,7 +401,6 @@ "HeaderMyDevice": "Mi dispositivo", "HeaderMusicVideos": "Videos musicales", "HeaderMusicQuality": "Calidad de música", - "HeaderMovies": "Películas", "LabelAccessDay": "Día de la semana:", "LabelAbortedByServerShutdown": "(Abortado por el apagado del servidor)", "Label3DFormat": "Formato 3D:", @@ -479,7 +418,6 @@ "HideWatchedContentFromLatestMedia": "Ocultar contenido visto de los últimos medios", "Hide": "Ocultar", "Help": "Ayuda", - "HeadersFolders": "Carpetas", "HeaderYears": "Años", "HeaderXmlSettings": "Configuraciones Xml", "HeaderXmlDocumentAttributes": "Atributos del documento Xml", @@ -500,7 +438,6 @@ "HeaderTracks": "Pistas", "HeaderThisUserIsCurrentlyDisabled": "Este usuario está actualmente deshabilitado", "HeaderTaskTriggers": "Desencadenantes de tareas", - "HeaderTags": "Etiquetas", "HeaderSystemDlnaProfiles": "Perfiles del sistema", "HeaderSubtitleProfilesHelp": "Los perfiles de subtítulos describen los formatos de subtítulos compatibles con el dispositivo.", "HeaderSubtitleProfiles": "Perfiles de subtítulos", @@ -514,7 +451,6 @@ "HeaderSpecialEpisodeInfo": "Información especial del capítulo", "HeaderSortOrder": "Orden de clasificación", "HeaderSortBy": "Ordenar por", - "HeaderShutdown": "Apagar", "HeaderSetupLibrary": "Configura tus bibliotecas de medios", "HeaderSettings": "Configuraciones", "HeaderServerSettings": "Configuración del servidor", @@ -533,7 +469,6 @@ "HeaderSelectCertificatePath": "Seleccionar ruta del certificado", "HeaderSecondsValue": "{0} segundos", "HeaderSeasons": "Temporadas", - "HeaderSchedule": "Programación", "HeaderScenes": "Escenas", "HeaderRunningTasks": "Ejecución de tareas", "HeaderRevisionHistory": "Revisión histórica", @@ -556,7 +491,6 @@ "HeaderNextEpisodePlayingInValue": "Reproducción del siguiente capítulo en {0}", "HeaderMoreLikeThis": "Más como esto", "HeaderMetadataSettings": "Configuraciones de metadatos", - "HeaderMediaInfo": "Información de medios", "HeaderHttpsSettings": "Configuraciones HTTPS", "HeaderEnabledFieldsHelp": "Desmarque un campo para bloquearlo y evitar que se modifiquen sus datos.", "HeaderDirectPlayProfileHelp": "Agregue perfiles de reproducción directa para indicar qué formatos puede manejar el dispositivo de forma nativa.", @@ -585,10 +519,7 @@ "LabelAudioCodec": "Códec de audio:", "LabelAudioChannels": "Canales de audio:", "LabelAudioBitrate": "Velocidad de bits de audio:", - "LabelAudio": "Audio", "LabelAllowedRemoteAddresses": "Filtro de dirección IP remota:", - "LabelAllowServerAutoRestartHelp": "El servidor solo se reiniciará durante los períodos de inactividad cuando no haya usuarios activos.", - "LabelAllowServerAutoRestart": "Permita que el servidor se reinicie automáticamente para aplicar actualizaciones", "LabelAllowHWTranscoding": "Permitir transcodificación con hardware", "LabelAlbumArtists": "Artistas del álbum:", "LabelContentType": "Tipo de contenido:", @@ -685,10 +616,8 @@ "LabelDateAddedBehaviorHelp": "Si un valor de metadatos está presente, siempre se usará antes de cualquiera de estas opciones.", "LabelDateAddedBehavior": "Comportamiento de fecha agregada para contenido nuevo:", "LabelDateAdded": "Fecha agregada:", - "LabelDashboardTheme": "Tema del panel del servidor:", "LabelCustomRating": "Calificación personalizada:", "LabelCustomDeviceDisplayNameHelp": "Proporcione un nombre personalizado para mostrar o déjelo vacío para usar el nombre informado por el dispositivo.", - "LabelCustomDeviceDisplayName": "Nombre para mostrar:", "LabelCustomCssHelp": "Aplique su propio estilo personalizado a la interfaz web.", "LabelCustomCss": "CSS personalizado:", "LabelCustomCertificatePathHelp": "Ruta a un archivo PKCS #12 que contiene un certificado y una clave privada para habilitar el soporte TLS en un dominio personalizado.", @@ -728,7 +657,6 @@ "MillisecondsUnit": "ms", "LabelSyncPlayTimeOffset": "Compensación horaria con el servidor:", "LabelSupportedMediaTypes": "Tipos de medios soportados:", - "LabelSubtitles": "Subtítulos", "LabelSubtitlePlaybackMode": "Modo de subtítulos:", "LabelSubtitleFormatHelp": "Ejemplo: srt", "LabelSubtitleDownloaders": "Descargadores de subtítulos:", @@ -738,7 +666,6 @@ "LabelSportsCategories": "Categorías de deportes:", "LabelSpecialSeasonsDisplayName": "Nombre de la temporada especial:", "LabelSource": "Fuente:", - "LabelSoundEffects": "Efectos de sonido:", "LabelSortTitle": "Ordenar título:", "LabelSortOrder": "Orden de clasificación:", "LabelSortBy": "Ordenar por:", @@ -749,7 +676,6 @@ "LabelSkipIfAudioTrackPresentHelp": "Desmarque esto para asegurarse de que todos los videos tengan subtítulos, independientemente del idioma de audio.", "LabelSkipIfAudioTrackPresent": "Omita si la pista de audio predeterminada coincide con el idioma de descarga", "LabelSkipBackLength": "Saltar de nuevo la longitud:", - "LabelSkin": "Piel:", "LabelSize": "Tamaño:", "LabelSimultaneousConnectionLimit": "Límite de transmisiones simultáneas:", "LabelServerName": "Nombre del servidor:", @@ -778,7 +704,6 @@ "LabelRecordingPath": "Ruta de grabación predeterminada:", "LabelRecord": "Grabar:", "LabelReasonForTranscoding": "Motivo de la transcodificación:", - "LabelReadHowYouCanContribute": "Aprende cómo puedes contribuir.", "LabelPublicHttpsPortHelp": "El número de puerto público que debe asignarse al puerto HTTPS local.", "LabelPublicHttpsPort": "Número de puerto HTTPS público:", "LabelPublicHttpPortHelp": "El número de puerto público que debe asignarse al puerto HTTP local.", @@ -793,7 +718,6 @@ "LabelProfileCodecs": "Códecs:", "LabelProfileAudioCodecs": "Códecs de audio:", "LabelPreferredSubtitleLanguage": "Idioma de subtítulos preferido:", - "LabelPreferredDisplayLanguageHelp": "La traducción de Jellyfin es un proyecto en curso.", "LabelPreferredDisplayLanguage": "Idioma de visualización preferido:", "LabelPostProcessorArgumentsHelp": "Use {ruta} como la ruta al archivo de grabación.", "LabelPostProcessorArguments": "Argumentos de la línea de comando del post-procesador:", @@ -827,7 +751,6 @@ "LabelNewPasswordConfirm": "Nueva contraseña confirmada:", "LabelNewPassword": "Nueva contraseña:", "LabelNewName": "Nuevo nombre:", - "LabelNightly": "Nocturna", "LabelStable": "Estable", "LabelChromecastVersion": "Versión de Chromecast", "LabelName": "Nombre:", @@ -882,7 +805,6 @@ "OptionBanner": "Pancarta", "OptionAutomaticallyGroupSeriesHelp": "Si está habilitado, las series que se distribuyen en varias carpetas dentro de esta biblioteca se fusionarán automáticamente en una sola serie.", "OptionAutomaticallyGroupSeries": "Combinar automáticamente series que se extienden a través de múltiples carpetas", - "OptionAutomatic": "Auto", "OptionAuto": "Auto", "OptionAscending": "Ascendente", "OptionArtist": "Artista", @@ -916,10 +838,9 @@ "Normal": "Normal", "None": "Nunguno", "NoSubtitlesHelp": "Los subtítulos no se cargarán de manera predeterminada. Todavía se pueden activar manualmente durante la reproducción.", - "NoSubtitles": "Ninguno", "NoSubtitleSearchResultsFound": "No se han encontrado resultados.", - "NoPluginConfigurationMessage": "Este complemento no tiene opciones para configurar.", - "NoNextUpItemsMessage": "Nada encontrado. ¡Comienza a ver tus shows!", + "MessageNoPluginConfiguration": "Este complemento no tiene opciones para configurar.", + "MessageNoNextUpItems": "Nada encontrado. ¡Comienza a ver tus shows!", "NoNewDevicesFound": "No se encontraron nuevos dispositivos. Para agregar un nuevo sintonizador, cierre este cuadro de diálogo e ingrese la información del dispositivo manualmente.", "NoCreatedLibraries": "Parece que todavía no has creado ninguna biblioteca. {0}¿Te gustaría crear una ahora?{1}", "No": "No", @@ -968,7 +889,6 @@ "MessageUnsetContentHelp": "El contenido se mostrará como carpetas simples. Para obtener mejores resultados, use el administrador de metadatos para configurar los tipos de contenido de las subcarpetas.", "MessageUnableToConnectToServer": "No podemos conectarnos al servidor seleccionado en este momento. Asegúrese de que se esté ejecutando e intente nuevamente.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Las siguientes ubicaciones de medios se eliminarán de su biblioteca:", - "MessageSettingsSaved": "Configuraciones guardadas.", "MessageReenableUser": "Ver abajo para volver a habilitar", "MessagePluginInstallDisclaimer": "Los complementos creados por miembros de la comunidad Jellyfin son una excelente manera de mejorar su experiencia Jellyfin con características y beneficios adicionales. Antes de la instalación, tenga en cuenta los efectos que pueden tener en su servidor Jellyfin, como escaneos de bibliotecas más largos, procesamiento en segundo plano adicional y disminución de la estabilidad del sistema.", "MessagePluginConfigurationRequiresLocalAccess": "Para configurar este complemento, inicie sesión directamente en su servidor local.", @@ -994,10 +914,8 @@ "MessageLeaveEmptyToInherit": "Deje en blanco para heredar la configuración de un elemento primario o el valor predeterminado global.", "MessageItemsAdded": "Artículos añadidos.", "MessageItemSaved": "Artículo guardado.", - "MessageUnauthorizedUser": "No tiene autorización para acceder al servidor en este momento. Póngase en contacto con el administrador del servidor para obtener más información.", "MessageInvalidUser": "Usuario o contraseña inválidos. Inténtalo de nuevo.", "MessageInvalidForgotPasswordPin": "Se ingresó un código PIN no válido o caducado. Inténtalo de nuevo.", - "MessageInstallPluginFromApp": "Este complemento debe instalarse desde la aplicación en la que desea utilizarlo.", "MessageImageTypeNotSelected": "Seleccione un tipo de imagen del menú desplegable.", "MessageImageFileTypeAllowed": "Solo se admiten archivos JPEG y PNG.", "MessageForgotPasswordInNetworkRequired": "Intente nuevamente dentro de su red doméstica para iniciar el proceso de restablecimiento de contraseña.", @@ -1029,7 +947,6 @@ "MediaInfoStreamTypeEmbeddedImage": "Imagen incrustada", "MediaInfoStreamTypeData": "Data", "MediaInfoStreamTypeAudio": "Audio", - "MediaInfoSoftware": "Software", "MediaInfoTimestamp": "Marca de tiempo", "MediaInfoSize": "Tamaño", "MediaInfoSampleRate": "Frecuencia de muestreo", @@ -1063,11 +980,9 @@ "LiveBroadcasts": "Transmisiones en vivo", "Live": "En vivo", "List": "Lista", - "LinksValue": "Enlaces: {0}", "Like": "Me gusta", "LeaveBlankToNotSetAPassword": "Puede dejar este campo en blanco para no establecer una contraseña.", "LearnHowYouCanContribute": "Aprende cómo puedes contribuir.", - "LaunchWebAppOnStartup": "Iniciar la interfaz web al iniciar el servidor", "LatestFromLibrary": "Últimos {0}", "Large": "Grande", "LabelffmpegPathHelp": "La ruta al archivo de la aplicación ffmpeg o la carpeta que contiene ffmpeg.", @@ -1101,7 +1016,6 @@ "LabelTunerType": "Tipo de sintonizador:", "LabelTunerIpAddress": "Dirección IP del sintonizador:", "LabelTriggerType": "Tipo de disparador:", - "LabelTranscodingVideoCodec": "Códec de vídeo:", "LabelTranscodingThreadCountHelp": "Elija el número máximo de hilos para usar al transcodificar. Reducir el recuento de hilos disminuirá el uso de la CPU, pero es posible que no se convierta lo suficientemente rápido para una experiencia de reproducción fluida.", "LabelTranscodingThreadCount": "Conteo de hilos de transcodificación:", "LabelTranscodingProgress": "Progreso de transcodificación:", @@ -1109,8 +1023,6 @@ "LabelTranscodes": "Transcodificaciones:", "LabelTranscodingTempPathHelp": "Especifique una ruta personalizada para los archivos de transcodificación servidos a los clientes. Déjelo en blanco para usar el servidor predeterminado.", "LabelTranscodePath": "Ruta para las transcodificaciones:", - "LabelTranscodingContainer": "Contenedor:", - "LabelTranscodingAudioCodec": "Códec de audio:", "LabelTrackNumber": "Número de pista:", "LabelTitle": "Título:", "LabelTimeLimitHours": "Límite de tiempo (horas):", @@ -1173,7 +1085,6 @@ "MusicLibraryHelp": "Revise la {0}guía de nomenclatura musical{1}.", "MovieLibraryHelp": "Revise la {0}guía de nombres de películas{1}.", "LibraryAccessHelp": "Seleccione las bibliotecas para compartir con este usuario. Los administradores podrán editar todas las carpetas con el administrador de metadatos.", - "LaunchWebAppOnStartupHelp": "Abra el cliente web en su navegador web predeterminado cuando el servidor arranque inicialmente. Esto no ocurrirá cuando use la función de reinicio del servidor.", "LanNetworksHelp": "Lista separada por comas de direcciones IP o entradas de IP/máscara de red para redes que se considerarán en la red local cuando se impongan restricciones de ancho de banda. Si se establece, todas las demás direcciones IP se considerarán en la red externa y estarán sujetas a las restricciones de ancho de banda externo. Si se deja en blanco, solo se considera que la subred del servidor está en la red local.", "LabelXDlnaDocHelp": "Determina el contenido del elemento X_DLNADOC en el espacio de nombres urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDoc": "Doc. X-DLNA:", @@ -1208,7 +1119,7 @@ "Refresh": "Actualizar", "Recordings": "Grabaciones", "RecordingScheduled": "Grabación programada.", - "RecordingPathChangeMessage": "Cambiar su carpeta de grabación no migrará las grabaciones existentes de la ubicación anterior a la nueva. Tendrá que moverlos manualmente si lo desea.", + "MessageChangeRecordingPath": "Cambiar su carpeta de grabación no migrará las grabaciones existentes de la ubicación anterior a la nueva. Tendrá que moverlos manualmente si lo desea.", "RecordingCancelled": "Grabación cancelada.", "RecordSeries": "Grabar series", "Record": "Grabar", @@ -1219,7 +1130,6 @@ "RecentlyWatched": "Recientemente visto", "Rate": "Velocidad", "Raised": "Elevado", - "QueueAllFromHere": "Hacer cola todo desde aquí", "Quality": "Calidad", "Programs": "Programas", "ProductionLocations": "Ubicaciones de producción", @@ -1232,7 +1142,7 @@ "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Esto usa la información de los metadatos incrustados del capítulo si está disponible.", "PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título de visualización predeterminado cuando no hay metadatos de Internet o metadatos locales disponibles.", "PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados sobre nombres de archivo", - "PluginInstalledMessage": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surtan efecto.", + "MessagePluginInstalled": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surtan efecto.", "PleaseSelectTwoItems": "Seleccione al menos dos elementos.", "PleaseRestartServerName": "Reinicie el servidor Jellyfin - {0}.", "PleaseEnterNameOrId": "Por favor, introduzca un nombre o una ID externa.", @@ -1256,7 +1166,7 @@ "People": "Personas", "PasswordSaved": "Contraseña guardada.", "PasswordResetProviderHelp": "Elija un proveedor de restablecimiento de contraseña para usar cuando este usuario solicite un restablecimiento de contraseña", - "PasswordResetHeader": "Restablecer contraseña", + "HeaderResetPassword": "Restablecer contraseña", "PasswordResetConfirmation": "¿Estás seguro de que deseas restablecer la contraseña?", "PasswordResetComplete": "La contraseña ha sido restablecida.", "PasswordMatchError": "La contraseña y la confirmación de la contraseña deben coincidir.", @@ -1264,26 +1174,20 @@ "PackageInstallCompleted": "Instalación {0} (versión {1}) completada.", "PackageInstallCancelled": "Instalación de {0} (versión {1}) cancelada.", "Overview": "Visión general", - "OtherArtist": "Otro artista", "OriginalAirDateValue": "Fecha de emisión original: {0}", "OptionWeekly": "Semanal", "OptionWeekends": "Fines de semana", "OptionWeekdays": "Días de la semana", - "OptionWednesday": "Miércoles", "OptionWakeFromSleep": "Despertarse del sueño", "OptionUnplayed": "No reproducido", "OptionTvdbRating": "Calificación de TVDB", - "OptionTuesday": "Martes", "OptionTrackName": "Nombre de la pista", "OptionThumbCard": "Tarjeta del pulgar", "OptionThumb": "Pulgar", - "OptionThursday": "Jueves", - "OptionSunday": "Domingo", "OptionSubstring": "Subcadena", "OptionSpecialEpisode": "Especiales", "OptionSaveMetadataAsHiddenHelp": "Cambiar esto se aplicará a los nuevos metadatos guardados en el futuro. Los archivos de metadatos existentes se actualizarán la próxima vez que el servidor Jellyfin los guarde.", "OptionSaveMetadataAsHidden": "Guardar metadatos e imágenes como archivos ocultos", - "OptionSaturday": "Sábado", "OptionRuntime": "Tiempo de ejecución", "OptionResumable": "Reanudable", "OptionResElement": "elemento res", @@ -1311,11 +1215,9 @@ "OptionPlainStorageFolders": "Mostrar todas las carpetas como carpetas de almacenamiento sin formato", "OptionParentalRating": "Calificación parental", "OptionOnInterval": "En un intervalo", - "OptionOnAppStartup": "En el inicio de la aplicación", "OptionNone": "Ninguno", "OptionNew": "Nuevo…", "OptionNameSort": "Nombre", - "OptionMonday": "Lunes", "OptionMax": "Máx.", "OptionLoginAttemptsBeforeLockoutHelp": "Un valor de cero significa heredar el valor predeterminado de tres intentos para usuarios normales y cinco para administradores. Establecer esto en -1 deshabilitará la función.", "OptionLoginAttemptsBeforeLockout": "Determina cuántos intentos de inicio de sesión incorrectos se pueden realizar antes de que ocurra el bloqueo.", @@ -1335,7 +1237,6 @@ "OptionHasThemeSong": "Tema musical", "OptionHasSubtitles": "Subtítulos", "OptionHasSpecialFeatures": "Características especiales", - "OptionFriday": "Viernes", "OptionFavorite": "Favoritos", "OptionExtractChapterImage": "Habilitar la extracción de imágenes de capítulos", "OptionExternallyDownloaded": "Descarga externa", @@ -1354,11 +1255,10 @@ "RemoveFromPlaylist": "Eliminar de la lista de reproducción", "RemoveFromCollection": "Eliminar de la colección", "RememberMe": "Recuérdame", - "ReleaseGroup": "Grupo de lanzamiento", "ButtonCast": "Transmitir", "ButtonSyncPlay": "SyncPlay", - "EnableBlurhashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso", - "EnableBlurhash": "Habilitar marcadores de posición borrosos para imágenes", + "EnableBlurHashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso", + "EnableBlurHash": "Habilitar marcadores de posición borrosos para imágenes", "OnApplicationStartup": "En el inicio de la aplicación", "EveryXHours": "Cada {0} horas", "EveryHour": "Cada hora", @@ -1386,7 +1286,6 @@ "Watched": "Visto", "ViewPlaybackInfo": "Ver información de reproducción", "ViewAlbum": "Ver álbum", - "VideoRange": "Rango de video", "Vertical": "Vertical", "ValueTimeLimitSingleHour": "Límite de tiempo: 1 hora", "ValueTimeLimitMultiHour": "Límite de tiempo: {0} horas", @@ -1412,7 +1311,7 @@ "Unrated": "Sin calificación", "Unplayed": "No reproducido", "Unmute": "Dejar de silenciar", - "UninstallPluginHeader": "Desinstalar complemento", + "HeaderUninstallPlugin": "Desinstalar complemento", "UninstallPluginConfirmation": "¿Estás seguro de que deseas desinstalar {0}?", "Uniform": "Uniforme", "TvLibraryHelp": "Revise la {0}guía de nombres de TV{1}.", @@ -1430,32 +1329,19 @@ "ThemeSongs": "Canciones temáticas", "TagsValue": "Etiquetas: {0}", "Tags": "Etiquetas", - "TabUsers": "Usuarios", "TabUpcoming": "Próximamente", - "TabTranscoding": "Transcodificación", "MarkUnplayed": "Marcar no reproducido", "MarkPlayed": "Marcar reproducido", "LabelSkipForwardLength": "Saltar hacia adelante longitud:", "Trailers": "Avances", - "TabTrailers": "Avances", - "TabSuggestions": "Sugerencias", "TabStreaming": "Transmisión", - "TabSongs": "Canciones", - "TabShows": "Programas", "TabSettings": "Configuraciones", "TabServer": "Servidor", - "TabSeries": "Series", "TabScheduledTasks": "Tareas programadas", - "TabResumeSettings": "Continuar", "TabResponses": "Respuestas", - "TabRecordings": "Grabaciones", "TabProfiles": "Perfiles", "TabProfile": "Perfil", "TabPlugins": "Complementos", - "TabPlaylists": "Listas de reproducción", - "TabPlaylist": "Lista de reproducción", - "TabPlayback": "Reproducción", - "TabPassword": "Contraseña", "TabParentalControl": "Control parental", "TabOther": "Otro", "TabNotifications": "Notificaciones", @@ -1463,31 +1349,15 @@ "TabNetworking": "Redes", "TabNetworks": "Redes", "TabMyPlugins": "Mis complementos", - "TabMusicVideos": "Videos musicales", "TabMusic": "Música", - "TabMovies": "Películas", - "TabMetadata": "Metadatos", "TabLogs": "Registros", - "TabLiveTV": "TV en vivo", "TabLatest": "Último", - "TabInfo": "Información", - "TabGuide": "Guía", - "TabGenres": "Géneros", - "TabFavorites": "Favoritos", - "TabDVR": "DVR", - "TabDisplay": "Pantalla", "TabDirectPlay": "Reproducción directa", - "TabDevices": "Dispositivos", "TabDashboard": "Tablero", "TabContainers": "Contenedores", - "TabCollections": "Colecciones", "TabCodecs": "Códecs", - "TabChannels": "Canales", "TabRepositories": "Repositorios", "TabCatalog": "Catálogo", - "TabArtists": "Artistas", - "TabAlbums": "Álbumes", - "TabAlbumArtists": "Artistas del álbum", "TabAdvanced": "Avanzado", "TabAccess": "Acceso", "TV": "TV", @@ -1557,12 +1427,19 @@ "Save": "Guardar", "Saturday": "Sábado", "Runtime": "Tiempo de ejecución", - "RunAtStartup": "Ejecutar en el arranque", "Rewind": "Rebobinar", "ResumeAt": "Reanudar desde {0}", "ButtonPlayer": "Reproductor", "Writers": "Escritores", "ClearQueue": "Eliminar cola", "StopPlayback": "Detener reproducción", - "ViewAlbumArtist": "Ver artista del álbum" + "ViewAlbumArtist": "Ver artista del álbum", + "Preview": "Avance", + "SubtitleVerticalPositionHelp": "Número de línea donde aparece el texto. Los números positivos indican de arriba hacia abajo. Los números negativos indican de abajo hacia arriba.", + "LabelSubtitleVerticalPosition": "Posición vertical:", + "PreviousTrack": "Pasar al anterior", + "MessageGetInstalledPluginsError": "Se produjo un error al obtener la lista de complementos instalados actualmente.", + "MessagePluginInstallError": "Ocurrió un error al instalar el complemento.", + "NextTrack": "Pasar al siguiente", + "LabelUnstable": "Inestable" } diff --git a/src/strings/es-mx.json b/src/strings/es-mx.json index 5500a26ce6..7c392f04b6 100644 --- a/src/strings/es-mx.json +++ b/src/strings/es-mx.json @@ -2,7 +2,6 @@ "Absolute": "Absoluto", "AccessRestrictedTryAgainLater": "El acceso está restringido actualmente. Por favor, inténtalo más tarde.", "Add": "Agregar", - "AddItemToCollectionHelp": "Agrega elementos a las colecciones buscándolos y utilizando sus menúes al hacer clic derecho o al tocarlos para agregarlos a una colección.", "AddToCollection": "Agregar a colección", "AddToPlayQueue": "Agregar a la cola de reproducción", "AddToPlaylist": "Agregar a lista de reproducción", @@ -36,8 +35,6 @@ "AsManyAsPossible": "Tantos como sea posible", "Ascending": "Ascendente", "AspectRatio": "Relación de aspecto", - "AttributeNew": "Nuevo", - "AutoBasedOnLanguageSetting": "Auto (basado en la configuración del idioma)", "Backdrop": "Imagen de fondo", "Backdrops": "Imágenes de fondo", "Banner": "Banner", @@ -50,81 +47,55 @@ "Box": "Caja", "BoxRear": "Caja (parte trasera)", "Browse": "Explorar", - "BrowsePluginCatalogMessage": "Explora nuestro catálogo de complementos para ver los complementos disponibles.", + "MessageBrowsePluginCatalog": "Explora nuestro catálogo de complementos para ver los complementos disponibles.", "BurnSubtitlesHelp": "Determina si el servidor debería quemar los subtítulos al transcodificar videos. Evitar esto mejorará altamente el rendimiento del servidor. Seleccione Auto para grabar formatos basados en imágenes (VOBSUB, PGS, SUB, IDX...) y ciertos subtítulos ASS o SSA.", - "ButtonAdd": "Agregar", "ButtonAddMediaLibrary": "Agregar biblioteca de medios", "ButtonAddScheduledTaskTrigger": "Agregar disparador", "ButtonAddServer": "Agregar servidor", "ButtonAddUser": "Agregar usuario", - "ButtonArrowDown": "Abajo", "ButtonArrowLeft": "Izquierda", "ButtonArrowRight": "Derecha", - "ButtonArrowUp": "Arriba", "ButtonAudioTracks": "Pistas de audio", "ButtonBack": "Atrás", "ButtonCancel": "Cancelar", "ButtonChangeServer": "Cambiar servidor", - "ButtonConnect": "Conectar", - "ButtonDelete": "Eliminar", - "ButtonDeleteImage": "Eliminar imagen", - "ButtonDown": "Abajo", - "ButtonDownload": "Descargar", - "ButtonEdit": "Editar", - "ButtonEditImages": "Editar imágenes", "ButtonEditOtherUserPreferences": "Editar el perfil, la imagen y las preferencias personales de este usuario.", - "ButtonFilter": "Filtro", "ButtonForgotPassword": "Olvidé mi contraseña", "ButtonFullscreen": "Pantalla completa", "ButtonGotIt": "Hecho", "ButtonGuide": "Guía", - "ButtonHelp": "Ayuda", - "ButtonHome": "Inicio", - "ButtonLearnMore": "Aprender más", "ButtonLibraryAccess": "Acceso a biblioteca(s)", "ButtonManualLogin": "Inicio de sesión manual", "ButtonMore": "Más", "ButtonNetwork": "Red", - "ButtonNew": "Nuevo", "ButtonNextTrack": "Pista siguiente", - "ButtonOff": "Apagar", "ButtonOpen": "Abrir", "ButtonParentalControl": "Control parental", "ButtonPause": "Pausar", - "ButtonPlay": "Reproducir", "ButtonPreviousTrack": "Pista anterior", "ButtonProfile": "Perfil", "ButtonQuickStartGuide": "Guía de inicio rápido", - "ButtonRefresh": "Actualizar", "ButtonRefreshGuideData": "Actualizar datos de la guía", "ButtonRemove": "Remover", "ButtonRename": "Renombrar", - "ButtonRepeat": "Repetir", "ButtonResetEasyPassword": "Restablecer código PIN sencillo", "ButtonResetPassword": "Restablecer contraseña", "ButtonRestart": "Reiniciar", "ButtonResume": "Continuar", "ButtonRevoke": "Revocar", - "ButtonSave": "Guardar", "ButtonScanAllLibraries": "Escanear todas las bibliotecas", - "ButtonSearch": "Búsqueda", "ButtonSelectDirectory": "Seleccionar directorio", "ButtonSelectServer": "Seleccionar servidor", "ButtonSelectView": "Seleccionar vista", "ButtonSend": "Enviar", "ButtonSettings": "Configuración", - "ButtonShuffle": "Aleatorio", "ButtonShutdown": "Apagar", "ButtonSignIn": "Iniciar sesión", "ButtonSignOut": "Cerrar sesión", - "ButtonSort": "Ordenar", "ButtonStart": "Iniciar", "ButtonStop": "Detener", "ButtonSubmit": "Enviar", - "ButtonSubtitles": "Subtítulos", "ButtonUninstall": "Desinstalar", - "ButtonUp": "Arriba", - "ButtonViewWebsite": "Ver sitio web", "ButtonWebsite": "Sitio web", "CancelRecording": "Cancelar grabación", "CancelSeries": "Cancelar serie", @@ -156,7 +127,7 @@ "DatePlayed": "Fecha de reproducción", "DeathDateValue": "Falleció: {0}", "Default": "Por defecto", - "DefaultErrorMessage": "Ha ocurrido un error al procesar la solicitud. Por favor, inténtalo de nuevo más tarde.", + "ErrorDefault": "Ha ocurrido un error al procesar la solicitud. Por favor, inténtalo de nuevo más tarde.", "DefaultMetadataLangaugeDescription": "Estos son sus valores por defecto y pueden ser personalizados en cada biblioteca.", "DefaultSubtitlesHelp": "Los subtítulos se cargan basados en los indicadores «por defecto» y «forzado» incluidos en los metadatos. Las preferencias de idioma son consideradas cuando hay múltiples opciones disponibles.", "Delete": "Eliminar", @@ -197,7 +168,6 @@ "EditImages": "Editar imágenes", "EditMetadata": "Editar metadatos", "EditSubtitles": "Editar subtítulos", - "EnableBackdrops": "Imágenes de fondo", "EnableBackdropsHelp": "Muestra imágenes de fondo en el fondo de algunas páginas mientras se navega por la biblioteca.", "EnableCinemaMode": "Modo cine", "EnableColorCodedBackgrounds": "Fondos de colores codificados", @@ -211,9 +181,7 @@ "EnablePhotosHelp": "Las imágenes serán detectadas y mostradas junto con otros archivos multimedia.", "EnableStreamLooping": "Repetir automáticamente las transmisiones en vivo", "EnableStreamLoopingHelp": "Habilita esta opción si las transmisiones en vivo contienen solo unos pocos segundos de datos y necesitan ser solicitadas continuamente. Habilitar esto cuando no es requerido puede causar problemas.", - "EnableThemeSongs": "Canciones temáticas", "EnableThemeSongsHelp": "Reproducir canciones temáticas en el fondo mientras se navega por la biblioteca.", - "EnableThemeVideos": "Videos temáticos", "EnableThemeVideosHelp": "Reproducir videos temáticos en el fondo mientras se navega por la biblioteca.", "Ended": "Finalizado", "EndsAtValue": "Termina a las {0}", @@ -224,7 +192,7 @@ "ErrorAddingXmlTvFile": "Hubo un error accediendo al archivo XMLTV. Por favor, asegúrate de que el archivo existe e inténtalo de nuevo.", "ErrorDeletingItem": "Hubo un error eliminando el elemento del servidor Jellyfin. Por favor, verifica que el servidor Jellyfin tiene permisos de escritura en la carpeta del medio e inténtalo de nuevo.", "ErrorGettingTvLineups": "Hubo un error al descargar la programación de TV. Por favor, asegúrate de que tu información sea correcta e inténtalo de nuevo.", - "ErrorMessageStartHourGreaterThanEnd": "La hora de finalización debe ser mayor que la hora de inicio.", + "ErrorStartHourGreaterThanEnd": "La hora de finalización debe ser mayor que la hora de inicio.", "ErrorPleaseSelectLineup": "Por favor, selecciona una programación e inténtalo de nuevo. Si no hay disponible ninguna, entonces, por favor, verifica que tu nombre de usuario, contraseña, y código postal sean correctos.", "ErrorSavingTvProvider": "Hubo un error al guardar el proveedor de TV. Por favor, asegúrate de que sea accesible e inténtalo de nuevo.", "EveryNDays": "Cada {0} días", @@ -268,14 +236,11 @@ "HeaderActiveDevices": "Dispositivos activos", "HeaderActiveRecordings": "Grabaciones activas", "HeaderActivity": "Actividad", - "HeaderAddScheduledTaskTrigger": "Agregar disparador", "HeaderAddToCollection": "Agregar a colección", "HeaderAddToPlaylist": "Agregar a lista de reproducción", "HeaderAddUpdateImage": "Agregar/Actualizar Imagen", - "HeaderAddUser": "Agregar usuario", "HeaderAdditionalParts": "Partes adicionales", "HeaderAlbumArtists": "Artistas del álbum", - "HeaderAlbums": "Álbumes", "HeaderAlert": "Alerta", "HeaderAllowMediaDeletionFrom": "Permitir eliminación de medios de", "HeaderApiKey": "Clave API", @@ -284,16 +249,12 @@ "HeaderAppearsOn": "Aparece en", "HeaderAudioBooks": "Audiolibros", "HeaderAudioSettings": "Configuración de audio", - "HeaderAutomaticUpdates": "Actualizaciones automáticas", "HeaderBlockItemsWithNoRating": "Bloquear elementos sin clasificación o con información de clasificación desconocida:", - "HeaderBooks": "Libros", "HeaderBranding": "Establecer marca", "HeaderCancelRecording": "Cancelar grabación", "HeaderCancelSeries": "Cancelar serie", "HeaderCastAndCrew": "Reparto y equipo", - "HeaderCastCrew": "Reparto y equipo", "HeaderChannelAccess": "Acceso a los canales", - "HeaderChannels": "Canales", "HeaderChapterImages": "Imágenes de los capítulos", "HeaderCodecProfile": "Perfil de códec", "HeaderCodecProfileHelp": "Los perfiles de códecs indican las limitaciones de un dispositivo al reproducir códecs específicos. Si una limitación se aplica entonces el medio será transcodificado, incluso si el códec ha sido configurado para reproducción directa.", @@ -321,23 +282,17 @@ "HeaderDevices": "Dispositivos", "HeaderDirectPlayProfile": "Perfil de reproducción directa", "HeaderDirectPlayProfileHelp": "Agrega perfiles de reproducción directa para indicar qué formatos puede manejar el dispositivo de forma nativa.", - "HeaderDisplay": "Pantalla", "HeaderDownloadSync": "Descargar y sincronizar", "HeaderEasyPinCode": "Código PIN sencillo", "HeaderEditImages": "Editar imágenes", "HeaderEnabledFields": "Campos habilitados", "HeaderEnabledFieldsHelp": "Desmarca un campo para bloquearlo y prevenir que sus datos sean cambiados.", - "HeaderEpisodes": "Episodios", "HeaderExternalIds": "IDs externos:", "HeaderFeatureAccess": "Acceso a características", - "HeaderFeatures": "Características", "HeaderFetchImages": "Obtener imágenes:", "HeaderFetcherSettings": "Configuración del recolector", - "HeaderFilters": "Filtros", "HeaderForKids": "Para niños", - "HeaderForgotPassword": "Olvidé mi contraseña", "HeaderFrequentlyPlayed": "Reproducido frecuentemente", - "HeaderGenres": "Géneros", "HeaderGuideProviders": "Proveedores de Guías de TV", "HeaderHttpHeaders": "Encabezados HTTP", "HeaderIdentification": "Identificación", @@ -348,7 +303,6 @@ "HeaderImageSettings": "Configuración de imagen", "HeaderInstall": "Instalar", "HeaderInstantMix": "Mix instantáneo", - "HeaderItems": "Elementos", "HeaderKeepRecording": "Conservar grabación", "HeaderKeepSeries": "Conservar serie", "HeaderKodiMetadataHelp": "Para habilitar o deshabilitar los metadatos NFO, edite una biblioteca en la configuración de bibliotecas de Jellyfin y ubica la sección grabadores de metadatos.", @@ -362,16 +316,12 @@ "HeaderLibraryFolders": "Carpetas de bibliotecas", "HeaderLibraryOrder": "Orden de las bibliotecas", "HeaderLibrarySettings": "Configuraciones de biblioteca", - "HeaderLiveTV": "TV en vivo", - "HeaderLiveTv": "TV en vivo", "HeaderLiveTvTunerSetup": "Configuración del sintonizador de TV", "HeaderLoginFailure": "Falló el inicio de sesión", "HeaderMedia": "Medios", "HeaderMediaFolders": "Carpetas de medios", - "HeaderMediaInfo": "Info del medio", "HeaderMetadataSettings": "Configuración de metadatos", "HeaderMoreLikeThis": "Más como esto", - "HeaderMovies": "Películas", "HeaderMusicQuality": "Calidad de la música", "HeaderMusicVideos": "Videos musicales", "HeaderMyDevice": "Mi dispositivo", @@ -380,7 +330,6 @@ "HeaderNewApiKey": "Nueva clave API", "HeaderNewDevices": "Nuevos dispositivos", "HeaderNextEpisodePlayingInValue": "El siguiente episodio se reproducirá en {0}", - "HeaderNextUp": "A continuación", "HeaderNextVideoPlayingInValue": "El siguiente video se reproducirá en {0}", "HeaderOnNow": "Transmitiendo ahora", "HeaderOtherItems": "Otros elementos", @@ -388,7 +337,6 @@ "HeaderPassword": "Contraseña", "HeaderPasswordReset": "Restablecer contraseña", "HeaderPaths": "Rutas", - "HeaderPeople": "Personas", "HeaderPhotoAlbums": "Álbumes de fotos", "HeaderPinCodeReset": "Restablecer código PIN", "HeaderPlayAll": "Reproducir todo", @@ -413,7 +361,6 @@ "HeaderRevisionHistory": "Historial de versiones", "HeaderRunningTasks": "Tareas en ejecución", "HeaderScenes": "Escenas", - "HeaderSchedule": "Programación", "HeaderSeasons": "Temporadas", "HeaderSecondsValue": "{0} segundos", "HeaderSelectCertificatePath": "Selecciona la ruta del certificado", @@ -426,13 +373,11 @@ "HeaderSelectTranscodingPath": "Selecciona la ruta para los archivos temporales de transcodificación", "HeaderSelectTranscodingPathHelp": "Explora o introduce la ruta a utilizar para los archivos temporales de transcodificación. Se debe tener permisos de escritura en dicha carpeta.", "HeaderSendMessage": "Enviar mensaje", - "HeaderSeries": "Series", "HeaderSeriesOptions": "Opciones de serie", "HeaderSeriesStatus": "Estado de la serie", "HeaderServerSettings": "Configuración del servidor", "HeaderSettings": "Configuración", "HeaderSetupLibrary": "Configura tus bibliotecas de medios", - "HeaderShutdown": "Apagar", "HeaderSortBy": "Ordenar por", "HeaderSortOrder": "Clasificar ordenado", "HeaderSpecialEpisodeInfo": "Información del episodio especial", @@ -446,7 +391,6 @@ "HeaderSubtitleProfiles": "Perfiles de subtítulo", "HeaderSubtitleProfilesHelp": "Los perfiles de subtítulo describen los formatos de subtítulo soportados por el dispositivo.", "HeaderSystemDlnaProfiles": "Perfiles del sistema", - "HeaderTags": "Etiquetas", "HeaderTaskTriggers": "Disparadores de tarea", "HeaderThisUserIsCurrentlyDisabled": "Este usuario se encuentra actualmente deshabilitado", "HeaderTracks": "Pistas", @@ -467,7 +411,6 @@ "HeaderXmlDocumentAttributes": "Atributos del documento XML", "HeaderXmlSettings": "Configuración XML", "HeaderYears": "Años", - "HeadersFolders": "Carpetas", "Help": "Ayuda", "Hide": "Ocultar", "HideWatchedContentFromLatestMedia": "Ocultar contenido ya visto de últimos medios", @@ -500,10 +443,7 @@ "LabelAlbumArtMaxWidthHelp": "Resolución máxima del arte del álbum expuesta vía upnp:albumArtURI.", "LabelAlbumArtPN": "PN del arte del álbum:", "LabelAlbumArtists": "Artistas del álbum:", - "LabelAll": "Todos", "LabelAllowHWTranscoding": "Permitir transcodificación por hardware", - "LabelAllowServerAutoRestart": "Permite al servidor reiniciarse automáticamente para aplicar actualizaciones", - "LabelAllowServerAutoRestartHelp": "El servidor solo se reiniciará durante los períodos de inactividad cuando no haya usuarios activos.", "LabelAllowedRemoteAddresses": "Filtro de direcciones IP remotas:", "LabelAllowedRemoteAddressesMode": "Modo de filtrado de direcciones IP remotas:", "LabelAppName": "Nombre de la aplicación", @@ -537,10 +477,8 @@ "LabelCustomCertificatePathHelp": "Ruta a un archivo PKCS #12 que contiene un certificado y una clave privada para habilitar el soporte TLS en un dominio personalizado.", "LabelCustomCss": "CSS personalizado:", "LabelCustomCssHelp": "Aplica tu propio estilo personalizado a la interfaz web.", - "LabelCustomDeviceDisplayName": "Nombre a mostrar:", "LabelCustomDeviceDisplayNameHelp": "Proporcione un nombre personalizado para mostrar o déjalo vacío para usar el nombre reportado por el dispositivo.", "LabelCustomRating": "Calificación personalizada:", - "LabelDashboardTheme": "Tema del panel de control del servidor:", "LabelDateAdded": "Fecha de adición:", "LabelDateAddedBehavior": "Comportamiento de la fecha de adición para nuevo contenido:", "LabelDateAddedBehaviorHelp": "Si un valor de metadatos está presente, siempre se utilizará antes de cualquiera de estas opciones.", @@ -555,7 +493,6 @@ "LabelDiscNumber": "Número de disco:", "LabelDisplayLanguage": "Idioma de pantalla:", "LabelDisplayLanguageHelp": "La traducción de Jellyfin es un proyecto en curso.", - "LabelDisplayMissingEpisodesWithinSeasons": "Mostrar episodios faltantes en las temporadas", "LabelDisplayMode": "Modo de pantalla:", "LabelDisplayName": "Nombre a mostrar:", "LabelDisplayOrder": "Orden para mostrar:", @@ -686,7 +623,6 @@ "LabelNewPassword": "Contraseña nueva:", "LabelNewPasswordConfirm": "Confirmación de contraseña nueva:", "LabelNewsCategories": "Categorías de noticias:", - "LabelNext": "Siguiente", "LabelNotificationEnabled": "Habilitar esta notificación", "LabelNumber": "Número:", "LabelNumberOfGuideDays": "Número de días de datos de la programación a descargar:", @@ -711,9 +647,7 @@ "LabelPostProcessorArguments": "Argumentos de la línea de comandos del post-procesador:", "LabelPostProcessorArgumentsHelp": "Usar {path} como la ruta del archivo grabado.", "LabelPreferredDisplayLanguage": "Idioma de pantalla preferido:", - "LabelPreferredDisplayLanguageHelp": "La traducción de Jellyfin es un proyecto en curso.", "LabelPreferredSubtitleLanguage": "Idioma preferido para los subtítulos:", - "LabelPrevious": "Anterior", "LabelProfileAudioCodecs": "Códecs de audio:", "LabelProfileCodecsHelp": "Separados por comas. Puede dejarse vacío para aplicarlo a todos los códecs.", "LabelProfileContainer": "Contenedor:", @@ -726,7 +660,6 @@ "LabelPublicHttpPortHelp": "El número de puerto público que debe asignarse al puerto HTTP local.", "LabelPublicHttpsPort": "Número de puerto HTTPS público:", "LabelPublicHttpsPortHelp": "El número de puerto público que debe asignarse al puerto HTTPS local.", - "LabelReadHowYouCanContribute": "Aprende cómo puedes contribuir.", "LabelReasonForTranscoding": "Motivo para transcodificar:", "LabelRecord": "Grabar:", "LabelRecordingPath": "Ruta por defecto para las grabaciones:", @@ -751,7 +684,6 @@ "LabelServerHost": "Servidor:", "LabelServerHostHelp": "192.168.1.100:8096 o https://miservidor.com", "LabelSimultaneousConnectionLimit": "Límite de transmisiones simultáneas:", - "LabelSkin": "Apariencia:", "LabelSkipBackLength": "Longitud de salto hacia atrás:", "LabelSkipForwardLength": "Longitud de salto hacia adelante:", "LabelSkipIfAudioTrackPresent": "Omitir si la pista de audio por defecto coincide con el idioma de descarga", @@ -763,7 +695,6 @@ "LabelSortBy": "Ordenar por:", "LabelSortOrder": "Clasificar ordenado:", "LabelSortTitle": "Título para ordenar:", - "LabelSoundEffects": "Efectos de sonido:", "LabelSource": "Fuente:", "LabelSpecialSeasonsDisplayName": "Nombre de la temporada de especiales:", "LabelSportsCategories": "Categorías de deportes:", @@ -774,7 +705,6 @@ "LabelSubtitleDownloaders": "Recolectores de subtítulos:", "LabelSubtitleFormatHelp": "Ejemplo: srt", "LabelSubtitlePlaybackMode": "Modo de subtítulo:", - "LabelSubtitles": "Subtítulos", "LabelSupportedMediaTypes": "Tipos de medios soportados:", "LabelTVHomeScreen": "Modo de pantalla de TV:", "LabelTag": "Etiqueta:", @@ -787,12 +717,9 @@ "LabelTimeLimitHours": "Límite de tiempo (horas):", "LabelTitle": "Título:", "LabelTrackNumber": "Número de pista:", - "LabelTranscodingAudioCodec": "Códec de audio:", - "LabelTranscodingContainer": "Contenedor:", "LabelTranscodingTempPathHelp": "Especifica una ruta personalizada para los archivos de transcodificación servidos a los clientes. Deja en blanco para utilizar el predeterminado del servidor.", "LabelTranscodingThreadCount": "Conteo de hilos de la transcodificación:", "LabelTranscodingThreadCountHelp": "Selecciona el número máximo de hilos a utilizar al transcodificar. Reducir el número de hilos reducirá el uso de la CPU, pero es posible que no se convierta lo suficientemente rápido como para que la experiencia de reproducción sea fluida.", - "LabelTranscodingVideoCodec": "Códec de video:", "LabelTriggerType": "Tipo de disparador:", "LabelTunerIpAddress": "Dirección IP del sintonizador:", "LabelTunerType": "Tipo de sintonizador:", @@ -816,7 +743,6 @@ "LabelXDlnaDoc": "Documento X-DLNA:", "LabelXDlnaDocHelp": "Determina el contenido del elemento X_DLNADOC en el namespace urn:schemas-dlna-org:device-1-0.", "LabelYear": "Año:", - "LabelYourFirstName": "Tu nombre:", "LabelYoureDone": "¡Has terminado!", "LabelZipCode": "Código postal:", "LabelffmpegPath": "Ruta del FFmpeg:", @@ -827,7 +753,6 @@ "LearnHowYouCanContribute": "Aprende cómo puedes contribuir.", "LibraryAccessHelp": "Selecciona las bibliotecas que deseas compartir con este usuario. Los administradores podrán editar todas las carpetas utilizando el gestor de metadatos.", "Like": "Me gusta", - "LinksValue": "Enlaces: {0}", "List": "Lista", "Live": "En vivo", "LiveBroadcasts": "Emisiones en vivo", @@ -885,7 +810,6 @@ "MessageFileReadError": "Hubo un error al leer el archivo. Por favor, intenta de nuevo.", "MessageForgotPasswordFileCreated": "El siguiente archivo fue creado en tu servidor y contiene instrucciones de como proceder:", "MessageForgotPasswordInNetworkRequired": "Por favor, intenta de nuevo dentro de tu red local para iniciar el proceso de restablecimiento de contraseña.", - "MessageInstallPluginFromApp": "Este complemento debe ser instalado desde dentro de la aplicación en la que deseas usarlo.", "MessageInvalidForgotPasswordPin": "Se ha introducido un código PIN inválido o expirado. Por favor, inténtalo de nuevo.", "MessageInvalidUser": "Nombre de usuario o contraseña inválidos. Por favor, intenta de nuevo.", "MessageItemSaved": "Elemento guardado.", @@ -903,7 +827,6 @@ "MessagePluginConfigurationRequiresLocalAccess": "Para configurar este complemento por favor, inicia sesión en tu servidor local directamente.", "MessagePluginInstallDisclaimer": "Los complementos desarrollados por miembros de la comunidad Jellyfin son una gran forma de mejorar tu experiencia con Jellyfin con características y beneficios adicionales. Antes de instalar, por favor, conoce el impacto que pueden ocasionar en tu servidor Jellyfin, tales como escaneo más largo de bibliotecas, procesamiento en segundo plano adicional y reducción de la estabilidad del sistema.", "MessageReenableUser": "Ver abajo para volver a habilitar", - "MessageSettingsSaved": "Configuraciones guardadas.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Las siguientes ubicaciones de medios se removerán de tu biblioteca:", "MessageUnableToConnectToServer": "No podemos conectarnos al servidor seleccionado en este momento. Por favor, asegúrate de que está funcionando e inténtalo de nuevo.", "MessageUnsetContentHelp": "El contenido será mostrado como carpetas simples. Para mejores resultados utiliza el administrador de metadatos para establecer los tipos de contenido para las subcarpetas.", @@ -934,10 +857,9 @@ "Next": "Siguiente", "NextUp": "A continuación", "NoNewDevicesFound": "No se encontraron nuevos dispositivos. Para agregar un sintonizador nuevo, cierra este diálogo e introduce la información del dispositivo manualmente.", - "NoNextUpItemsMessage": "No se encontró nada. ¡Comienza a ver tus programas!", - "NoPluginConfigurationMessage": "Este complemento no tiene configuraciones disponibles.", + "MessageNoNextUpItems": "No se encontró nada. ¡Comienza a ver tus programas!", + "MessageNoPluginConfiguration": "Este complemento no tiene configuraciones disponibles.", "NoSubtitleSearchResultsFound": "No se encontraron resultados.", - "NoSubtitles": "Ninguno", "NoSubtitlesHelp": "Los subtítulos no serán cargados por defecto. Pueden ser activados manualmente durante la reproducción.", "None": "Ninguno", "NumLocationsValue": "{0} carpetas", @@ -968,7 +890,6 @@ "OptionArtist": "Artista", "OptionAscending": "Ascendente", "OptionAuto": "Automático", - "OptionAutomatic": "Automático", "OptionAutomaticallyGroupSeries": "Fusionar automáticamente series esparcidas a través de múltiples carpetas", "OptionAutomaticallyGroupSeriesHelp": "Si se habilita, las series que se reparten a través de múltiples carpetas dentro de esta biblioteca serán fusionadas en una sola serie.", "OptionBlockBooks": "Libros", @@ -1020,7 +941,6 @@ "OptionExternallyDownloaded": "Descarga externa", "OptionExtractChapterImage": "Habilitar la extracción de imágenes de los capítulos", "OptionFavorite": "Favoritos", - "OptionFriday": "Viernes", "OptionHasSpecialFeatures": "Características especiales", "OptionHasSubtitles": "Subtítulos", "OptionHasThemeSong": "Canción temática", @@ -1036,11 +956,9 @@ "OptionLikes": "Me gusta", "OptionMax": "Máximo", "OptionMissingEpisode": "Episodios faltantes", - "OptionMonday": "Lunes", "OptionNameSort": "Nombre", "OptionNew": "Nuevo…", "OptionNone": "Ninguno", - "OptionOnAppStartup": "Al iniciar la aplicación", "OptionOnInterval": "En un intervalo", "OptionParentalRating": "Clasificación parental", "OptionPlainStorageFolders": "Mostrar todas las carpetas como carpetas de almacenamiento simples", @@ -1061,20 +979,15 @@ "OptionResElement": "Elemento res", "OptionResumable": "Reanudable", "OptionRuntime": "Duración", - "OptionSaturday": "Sábado", "OptionSaveMetadataAsHidden": "Guardar metadatos e imágenes como archivos ocultos", "OptionSaveMetadataAsHiddenHelp": "Cambiar esto se aplicará a los nuevos metadatos guardados en el futuro. Los archivos de metadatos existentes serán actualizados la próxima vez que sean guardados por el servidor Jellyfin.", "OptionSpecialEpisode": "Especiales", "OptionSubstring": "Subcadena", - "OptionSunday": "Domingo", - "OptionThursday": "Jueves", "OptionTrackName": "Nombre de la pista", - "OptionTuesday": "Martes", "OptionTvdbRating": "Calificación de TVDB", "OptionUnairedEpisode": "Episodios no emitidos", "OptionUnplayed": "No reproducido", "OptionWakeFromSleep": "Despertar de la suspensión", - "OptionWednesday": "Miércoles", "OptionWeekdays": "Días de semana", "OptionWeekends": "Fines de semana", "OptionWeekly": "Semanal", @@ -1087,7 +1000,7 @@ "PasswordMatchError": "La contraseña y la confirmación de la contraseña deben coincidir.", "PasswordResetComplete": "La contraseña ha sido restablecida.", "PasswordResetConfirmation": "¿Estás seguro de querer restablecer la contraseña?", - "PasswordResetHeader": "Restablecer contraseña", + "HeaderResetPassword": "Restablecer contraseña", "PasswordSaved": "Contraseña guardada.", "People": "Personas", "PerfectMatch": "Coincidencia perfecta", @@ -1109,7 +1022,7 @@ "PleaseEnterNameOrId": "Por favor, introduce un nombre o ID externo.", "PleaseRestartServerName": "Por favor, reinicia el servidor Jellyfin - {0}.", "PleaseSelectTwoItems": "Por favor, selecciona al menos dos elementos.", - "PluginInstalledMessage": "El complemento ha sido instalado con éxito. El servidor Jellyfin necesitará ser reiniciado para que los cambios surtan efecto.", + "MessagePluginInstalled": "El complemento ha sido instalado con éxito. El servidor Jellyfin necesitará ser reiniciado para que los cambios surtan efecto.", "PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados a los nombres de archivo", "PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título mostrado por defecto cuando no hay disponibles metadatos en Internet o localmente.", "Premiere": "Estreno", @@ -1120,7 +1033,6 @@ "ProductionLocations": "Lugares de producción", "Programs": "Programas", "Quality": "Calidad", - "QueueAllFromHere": "Encolar todos desde aquí", "Raised": "Elevado", "Rate": "Calificación", "RecentlyWatched": "Visto recientemente", @@ -1131,7 +1043,7 @@ "Record": "Grabar", "RecordSeries": "Grabar series", "RecordingCancelled": "Grabación cancelada.", - "RecordingPathChangeMessage": "Cambiar la carpeta de grabaciones no moverá las grabaciones existentes de la antigua ubicación a la nueva. Necesitan moverse manualmente si se desea.", + "MessageChangeRecordingPath": "Cambiar la carpeta de grabaciones no moverá las grabaciones existentes de la antigua ubicación a la nueva. Necesitan moverse manualmente si se desea.", "RecordingScheduled": "Grabación programada.", "Recordings": "Grabaciones", "Refresh": "Actualizar", @@ -1151,7 +1063,6 @@ "ReplaceExistingImages": "Reemplazar imágenes existentes", "ResumeAt": "Reanudar desde {0}", "Rewind": "Rebobinar", - "RunAtStartup": "Ejecutar al iniciar", "Runtime": "Duración", "Saturday": "Sábado", "Save": "Guardar", @@ -1213,55 +1124,28 @@ "SystemDlnaProfilesHelp": "Los perfiles del sistema son de solo lectura. Los cambios a un perfil del sistema serán guardados en un nuevo perfil personalizado.", "TabAccess": "Acceso", "TabAdvanced": "Avanzado", - "TabAlbumArtists": "Artistas del álbum", - "TabAlbums": "Álbumes", - "TabArtists": "Artistas", "TabCatalog": "Catálogo", - "TabChannels": "Canales", - "TabCollections": "Colecciones", "TabContainers": "Contenedores", "TabDashboard": "Panel de control", - "TabDevices": "Dispositivos", "TabDirectPlay": "Reproducción directa", - "TabDisplay": "Mostrar", - "TabEpisodes": "Episodios", - "TabFavorites": "Favoritos", - "TabGenres": "Géneros", - "TabGuide": "Guía", "TabLatest": "Recientes", - "TabLiveTV": "TV en vivo", "TabLogs": "Registros", - "TabMetadata": "Metadatos", - "TabMovies": "Películas", "TabMusic": "Música", - "TabMusicVideos": "Videos musicales", "TabMyPlugins": "Mis complementos", "TabNetworks": "Cadenas", "TabNfoSettings": "Configuración de NFO", "TabNotifications": "Notificaciones", "TabOther": "Otros", "TabParentalControl": "Control parental", - "TabPassword": "Contraseña", - "TabPlayback": "Reproducción", - "TabPlaylist": "Lista de reproducción", - "TabPlaylists": "Listas de reproducción", "TabPlugins": "Complementos", "TabProfile": "Perfil", "TabProfiles": "Perfiles", - "TabRecordings": "Grabaciones", "TabResponses": "Respuestas", - "TabResumeSettings": "Reanudar", "TabScheduledTasks": "Tareas programadas", "TabServer": "Servidor", "TabSettings": "Configuración", - "TabShows": "Programas", - "TabSongs": "Canciones", "TabStreaming": "Transmisión", - "TabSuggestions": "Sugerencias", - "TabTrailers": "Trailers", - "TabTranscoding": "Transcodificación", "TabUpcoming": "Próximamente", - "TabUsers": "Usuarios", "Tags": "Etiquetas", "TagsValue": "Etiquetas: {0}", "TellUsAboutYourself": "Háblanos de ti", @@ -1281,7 +1165,7 @@ "TvLibraryHelp": "Revisa la {0}guía de nombrado de series de TV{1}.", "Uniform": "Uniforme", "UninstallPluginConfirmation": "¿Estás seguro de querer desinstalar {0}?", - "UninstallPluginHeader": "Desinstalar complemento", + "HeaderUninstallPlugin": "Desinstalar complemento", "Unmute": "Activar sonido", "Unplayed": "No reproducido", "Unrated": "Sin clasificar", @@ -1310,7 +1194,6 @@ "ValueTimeLimitMultiHour": "Límite de tiempo: {0} horas", "ValueTimeLimitSingleHour": "Límite de tiempo: 1 hora", "ValueVideoCodec": "Códec de video: {0}", - "VideoRange": "Rango de video", "ViewAlbum": "Ver álbum", "ViewPlaybackInfo": "Ver información de reproducción", "Watched": "Visto", @@ -1347,10 +1230,8 @@ "HeaderFavoriteArtists": "Artistas favoritos", "HeaderFavoriteSongs": "Canciones favoritas", "HeaderFavoriteVideos": "Videos favoritos", - "HeaderHome": "Inicio", "HeaderVideos": "Videos", "Horizontal": "Horizontal", - "LabelAudio": "Audio", "LabelAuthProvider": "Proveedor de autenticación:", "LabelDynamicExternalId": "{0} Id:", "LabelPasswordResetProvider": "Proveedor de restablecimiento de contraseña:", @@ -1365,11 +1246,8 @@ "DashboardArchitecture": "Arquitectura: {0}", "LabelVideo": "Video", "LabelWeb": "Web:", - "LaunchWebAppOnStartup": "Iniciar la interfaz web al iniciar el servidor", - "LaunchWebAppOnStartupHelp": "Abre el cliente web en su navegador web predeterminado cuando se inicia el servidor. Esto no ocurrirá cuando se utilice la función de reinicio del servidor.", "LeaveBlankToNotSetAPassword": "Puedes dejar este campo en blanco para no establecer ninguna contraseña.", "MediaInfoCodec": "Códec", - "MediaInfoSoftware": "Software", "MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeData": "Dato", "MediaInfoStreamTypeEmbeddedImage": "Imagen incrustada", @@ -1406,8 +1284,6 @@ "SubtitleOffset": "Desplazamiento de subtítulos", "TV": "TV", "TabCodecs": "Códecs", - "TabInfo": "Información", - "TabSeries": "Series", "ValueMinutes": "{0} min", "ValueSeriesCount": "{0} series", "Vertical": "Vertical", @@ -1440,7 +1316,6 @@ "LabelSize": "Tamaño:", "SelectAdminUsername": "Por favor, selecciona un nombre de usuario para la cuenta de administrador.", "LabelDroppedFrames": "Cuadros saltados:", - "CopyStreamURLError": "Hubo un error al copiar la URL.", "ButtonSplit": "Dividir", "WeeklyAt": "{0}s a las {1}", "OnApplicationStartup": "Cuando se inicia la aplicación", @@ -1456,12 +1331,10 @@ "PathNotFound": "No se pudo encontrar la ruta. Por favor, asegúrate de que la ruta es válida e inténtalo de nuevo.", "Track": "Pista", "Season": "Temporada", - "ReleaseGroup": "Grupo que lo estrenó", "PreferEmbeddedEpisodeInfosOverFileNames": "Preferir información del episodio incrustada a los nombres de archivo", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Esto utiliza la información del episodio desde los metadatos incrustados si están disponibles.", "PlaybackErrorNoCompatibleStream": "Este cliente no es compatible con los medios y el servidor no está enviando un formato de medios compatible.", "Person": "Persona", - "OtherArtist": "Otro artista", "OptionRandom": "Aleatorio", "OptionForceRemoteSourceTranscoding": "Forzar transcodificación de fuentes remotas (como TV en vivo)", "NoCreatedLibraries": "Parece que no has creado ninguna biblioteca todavía. {0}¿Quisieras crear una ahora?{1}", @@ -1488,18 +1361,14 @@ "DeinterlaceMethodHelp": "Seleccione el método de desentrelazado que se usará al transcodificar contenido entrelazado.", "Filter": "Filtro", "New": "Nuevo", - "MessageUnauthorizedUser": "No estás autorizado para acceder al servidor en este momento. Por favor, contacta al administrador del servidor para más información.", "LabelLibraryPageSizeHelp": "Establece el número de elementos a mostrar en una página de biblioteca. Establece en 0 para deshabilitar el paginado.", "LabelLibraryPageSize": "Tamaño de las páginas de las bibliotecas:", "HeaderFavoritePlaylists": "Listas de reproducción favoritas", "ButtonTogglePlaylist": "Lista de reproducción", - "ButtonToggleContextMenu": "Más", "UnsupportedPlayback": "Jellyfin no puede desencriptar contenido protegido por DRM de todas formas todo el contenido será intentado, incluyendo los títulos protegidos. Algunos archivos pueden aparecer completamente en negro debido al encriptado o características no soportadas, como títulos interactivos.", - "TabDVR": "DVR", "SaveChanges": "Guardar cambios", "LabelRequireHttpsHelp": "Si se marca, el servidor redirigirá automáticamente todas las solicitudes a través de HTTP a HTTPS. Esto no tiene efecto si el servidor no está escuchando en HTTPS.", "LabelRequireHttps": "Requerir HTTPS", - "LabelNightly": "Nocturno", "LabelStable": "Estable", "LabelChromecastVersion": "Versión de Chromecast", "LabelEnableHttpsHelp": "Permite al servidor escuchar en el puerto HTTPS configurado. Un certificado válido también debe ser configurado para que esto tenga efecto.", @@ -1544,8 +1413,8 @@ "ButtonSyncPlay": "SyncPlay", "ButtonPlayer": "Reproductor", "ButtonCast": "Elenco", - "EnableBlurhashHelp": "Imágenes que aún están siendo cargadas serán mostradas difuminadas", - "EnableBlurhash": "Habilitar imágenes de fondo difuminadas", + "EnableBlurHashHelp": "Imágenes que aún están siendo cargadas serán mostradas difuminadas", + "EnableBlurHash": "Habilitar imágenes de fondo difuminadas", "TabRepositories": "Repositorios", "ShowMore": "Mostrar más", "ShowLess": "Mostrar menos", diff --git a/src/strings/es.json b/src/strings/es.json index 23bc5c9330..b77192611c 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1,7 +1,6 @@ { "AccessRestrictedTryAgainLater": "Actualmente el acceso está restringido. Por favor, inténtalo de nuevo más tarde.", "Add": "Añadir", - "AddItemToCollectionHelp": "Puedes añadir elementos a las colecciones buscándolos en tu biblioteca. Una vez hecho esto, abre el menú y selecciona 'Añadir a una colección'.", "AddToCollection": "Añadir a una colección", "AddToPlaylist": "Añadir a una lista de reproducción", "AddedOnValue": "Añadido {0}", @@ -28,7 +27,6 @@ "Artists": "Artistas", "AsManyAsPossible": "Tantos como sea posible", "AspectRatio": "Relación de aspecto", - "AttributeNew": "Nuevo", "Backdrop": "Imagen de fondo", "Backdrops": "Imágenes de fondo", "BirthDateValue": "Nacido: {0}", @@ -40,82 +38,56 @@ "Box": "Caja", "BoxRear": "Caja (trasera)", "Browse": "Explorar", - "BrowsePluginCatalogMessage": "Explore el catálogo de extensiones para ver las extensiones disponibles.", - "ButtonAdd": "Añadir", + "MessageBrowsePluginCatalog": "Explore el catálogo de extensiones para ver las extensiones disponibles.", "ButtonAddMediaLibrary": "Añadir biblioteca de medios", "ButtonAddScheduledTaskTrigger": "Agregar Activador", "ButtonAddServer": "Añadir servidor", "ButtonAddUser": "Agregar Usuario", - "ButtonArrowDown": "Abajo", "ButtonArrowLeft": "Izquierda", "ButtonArrowRight": "Derecha", - "ButtonArrowUp": "Arriba", "ButtonAudioTracks": "Pistas de audio", "ButtonBack": "Atrás", "ButtonCancel": "Cancelar", "ButtonChangeServer": "Cambiar servidor", - "ButtonConnect": "Conectar", - "ButtonDelete": "Borrar", - "ButtonDeleteImage": "Borrar imagen", - "ButtonDown": "Abajo", - "ButtonDownload": "Descargar", - "ButtonEdit": "Editar", - "ButtonEditImages": "Editar imágenes", "ButtonEditOtherUserPreferences": "Editar este perfil, la imagen y los ajustes personales.", - "ButtonFilter": "Filtro", "ButtonForgotPassword": "Contraseña olvidada", "ButtonFullscreen": "Pantalla completa", "ButtonGotIt": "Entendido", "ButtonGuide": "Guía", - "ButtonHelp": "Ayuda", - "ButtonHome": "Inicio", - "ButtonLearnMore": "Aprende más", "ButtonLibraryAccess": "Acceso a la biblioteca", "ButtonManualLogin": "Acceder manualmente", "ButtonMore": "Más", "ButtonNetwork": "Red", - "ButtonNew": "Nuevo", "ButtonNextTrack": "Pista siguiente", - "ButtonOff": "Apagado", "ButtonOk": "OK", "ButtonOpen": "Abrir", "ButtonParentalControl": "Control parental", "ButtonPause": "Pausa", - "ButtonPlay": "Reproducir", "ButtonPreviousTrack": "Pista anterior", "ButtonProfile": "Perfil", "ButtonQuickStartGuide": "Guía de inicio rápido", - "ButtonRefresh": "Refrescar", "ButtonRefreshGuideData": "Actualizar datos de la guía", "ButtonRemove": "Quitar", "ButtonRename": "Renombrar", - "ButtonRepeat": "Repetir", "ButtonResetEasyPassword": "Restablecer código PIN", "ButtonResetPassword": "Reiniciar Contraseña", "ButtonRestart": "Reiniciar", "ButtonResume": "Continuar", "ButtonRevoke": "Revocar", - "ButtonSave": "Guardar", "ButtonScanAllLibraries": "Escanear todas las bibliotecas", - "ButtonSearch": "Buscar", "ButtonSelectDirectory": "Seleccionar directorio", "ButtonSelectServer": "Elegir servidor", "ButtonSelectView": "Seleccionar vista", "ButtonSend": "Enviar", "ButtonSettings": "Opciones", - "ButtonShuffle": "Mezclar", "ButtonShutdown": "Apagar", "ButtonSignIn": "Iniciar sesión", "ButtonSignOut": "Desconectarse", - "ButtonSort": "Ordenar", "ButtonStart": "Inicio", "ButtonStop": "Detener", "ButtonSubmit": "Enviar", - "ButtonSubtitles": "Subtítulos", "ButtonTrailer": "Tráiler", "ButtonUninstall": "Desinstalar", - "ButtonUp": "Arriba", - "ButtonViewWebsite": "Ver sitio web", "ButtonWebsite": "Sitio web", "CancelRecording": "Cancelar grabación", "CancelSeries": "Cancelar series", @@ -138,7 +110,7 @@ "CustomDlnaProfilesHelp": "Crear un perfil personalizado para un nuevo dispositivo o reemplazar un perfil del sistema.", "DeathDateValue": "Murió: {0}", "Default": "Por defecto", - "DefaultErrorMessage": "Ha habido un error procesando la solicitud. Por favor inténtalo más tarde.", + "ErrorDefault": "Ha habido un error procesando la solicitud. Por favor inténtalo más tarde.", "DefaultMetadataLangaugeDescription": "Estos son tus ajustes y se pueden personalizar para cada biblioteca.", "DefaultSubtitlesHelp": "Los subtítulos que se utilizarán dependerán de como estén etiquetadas las pistas de los archivos (si \"por defecto\" o \"forzado\"). Los ajustes de idioma se tienen en cuenta cuando hay varias opciones disponibles.", "Delete": "Borrar", @@ -176,7 +148,6 @@ "EnablePhotosHelp": "Las imágenes se detectarán y se mostrarán junto con otros archivos multimedia.", "EnableStreamLooping": "Bucle automático de las emisiones en directo", "EnableStreamLoopingHelp": "Habilite esto si las emisiones en directo sólo contienen unos pocos segundos de datos y necesitan ser solicitados continuamente.", - "EnableThemeVideos": "Vídeos temáticos", "Ended": "Finalizado", "EndsAtValue": "Termina a las {0}", "Episodes": "Episodios", @@ -185,7 +156,7 @@ "ErrorAddingTunerDevice": "Ha habido un error añadiendo el dispositivo sintonizador. Por favor, asegúrate de que es accesible e inténtalo otra vez.", "ErrorAddingXmlTvFile": "Ha sucedido un error accediendo al archivo XML. Por favor, asegúrate que el archivo existe e inténtalo de nuevo.", "ErrorGettingTvLineups": "Ha habido un error descargando la programación de TV. Por favor, asegúrese que la información es correcta e inténtalo de nuevo.", - "ErrorMessageStartHourGreaterThanEnd": "La hora de finalización tiene que ser mayor que la de inicio.", + "ErrorStartHourGreaterThanEnd": "La hora de finalización tiene que ser mayor que la de inicio.", "ErrorPleaseSelectLineup": "Por favor selecciona una alineación e inténtalo otra vez. Si no hay alineaciones disponibles, revisa que tu nombre de usuario, contraseña y código postal son correctos.", "ErrorSavingTvProvider": "Ha habido un error guardando el proveedor de TV. Por favor, asegúrate de que es accesible e inténtalo otra vez.", "EveryNDays": "Cada {0} días", @@ -223,29 +194,23 @@ "HeaderActiveDevices": "Dispositivos activos", "HeaderActiveRecordings": "Grabaciones activas", "HeaderActivity": "Actividad", - "HeaderAddScheduledTaskTrigger": "Agregar Activador", "HeaderAddToCollection": "Agregar a la colección", "HeaderAddToPlaylist": "Añadir a la lista de reproducción", "HeaderAddUpdateImage": "Añadir/Actualizar imagen", - "HeaderAddUser": "Agregar usuario", "HeaderAdditionalParts": "Partes adicionales", "HeaderAdmin": "Administrador", "HeaderAlert": "Alerta", "HeaderAllowMediaDeletionFrom": "Permitir borrar contenido desde", "HeaderApiKey": "Clave API", "HeaderApiKeys": "Claves API", - "HeaderApiKeysHelp": "Las aplicaciones externas requieren de una clave API para comunicarse con el servidor Jellyfin. Las claves se facilitan iniciando sesión con una cuenta de Jellyfin, u otorgando manualmente una clave a la aplicación.", + "HeaderApiKeysHelp": "Las aplicaciones externas requieren de una clave API para comunicarse con el servidor. Las claves se facilitan iniciando sesión con una cuenta de usuario en Jellyfin, u otorgando manualmente una clave a la aplicación.", "HeaderAudioBooks": "Audiolibros", "HeaderAudioSettings": "Ajustes de audio", - "HeaderAutomaticUpdates": "Actualizaciones automáticas", "HeaderBlockItemsWithNoRating": "Bloquear artículos sin valoraciones o si son desconocidas:", - "HeaderBooks": "Libros", "HeaderCancelRecording": "Cancelar grabación", "HeaderCancelSeries": "Cancelar series", "HeaderCastAndCrew": "Reparto y equipo", - "HeaderCastCrew": "Reparto y equipo técnico", "HeaderChannelAccess": "Acceso a los canales", - "HeaderChannels": "Canales", "HeaderChapterImages": "Imágenes de capítulos", "HeaderCodecProfile": "Perfil de códec", "HeaderCodecProfileHelp": "Los perfiles de los códecs indican las limitaciones de un dispositivo cuando reproduce un códec en específico. Si lo que se va a reproducir no está dentro de estos límites (por ejemplo, bitrate demasiado alto), el contenido se convertirá, incluso si el códec está configurado para reproducción directa.", @@ -273,23 +238,17 @@ "HeaderDevices": "Dispositivos", "HeaderDirectPlayProfile": "Perfil de reproducción directa", "HeaderDirectPlayProfileHelp": "Añadir perfiles de reproducción directa para indicar qué formatos puede utilizar el dispositivo de forma nativa.", - "HeaderDisplay": "Mostrar", "HeaderDownloadSync": "Descargar y sincronizar", "HeaderEasyPinCode": "Código PIN", "HeaderEditImages": "Editar imágenes", "HeaderEnabledFields": "Campos activados", "HeaderEnabledFieldsHelp": "Desmarca un campo para bloquearlo y evitar que se cambie su contenido.", - "HeaderEpisodes": "Episodios", "HeaderExternalIds": "IDs externos:", "HeaderFeatureAccess": "Permisos de acceso", - "HeaderFeatures": "Características", "HeaderFetchImages": "Buscar imágenes:", "HeaderFetcherSettings": "Ajustes del capturador", - "HeaderFilters": "Filtros", "HeaderForKids": "Para niños", - "HeaderForgotPassword": "Contraseña olvidada", "HeaderFrequentlyPlayed": "Reproducido frecuentemente", - "HeaderGenres": "Géneros", "HeaderGuideProviders": "Proveedores de guías", "HeaderHttpHeaders": "Cabeceras HTTP", "HeaderIdentification": "Identificación", @@ -300,7 +259,6 @@ "HeaderImageSettings": "Ajustes de imagen", "HeaderInstall": "Instalar", "HeaderInstantMix": "Mezcla instantánea", - "HeaderItems": "Elementos", "HeaderKeepRecording": "Mantener grabación", "HeaderKeepSeries": "Mantener series", "HeaderKodiMetadataHelp": "Puedes activar o desactivar las etiquetas en formato NFO abriendo la configuración de una biblioteca y revisando los ajustes en la sección de etiquetas.", @@ -314,16 +272,12 @@ "HeaderLibraryFolders": "Carpetas de la biblioteca", "HeaderLibraryOrder": "Orden de la biblioteca", "HeaderLibrarySettings": "Ajustes de la biblioteca", - "HeaderLiveTV": "Televisión en directo", - "HeaderLiveTv": "Televisión en directo", "HeaderLiveTvTunerSetup": "Ajustes del sintonizador de televisión", "HeaderLoginFailure": "Fallo de inicio de sesión", "HeaderMedia": "Medios", "HeaderMediaFolders": "Carpetas de medios", - "HeaderMediaInfo": "Información multimedia", "HeaderMetadataSettings": "Ajustes de etiquetas", "HeaderMoreLikeThis": "Más como este", - "HeaderMovies": "Películas", "HeaderMusicVideos": "Vídeos musicales", "HeaderMyDevice": "Mi dispositivo", "HeaderMyMedia": "Mis contenidos", @@ -331,7 +285,6 @@ "HeaderNewApiKey": "Nueva clave API", "HeaderNewDevices": "Nuevos dispositivos", "HeaderNextEpisodePlayingInValue": "Siguiente episodio empezará en {0}", - "HeaderNextUp": "Siguiente", "HeaderNextVideoPlayingInValue": "Siguiente vídeo empezará en {0}", "HeaderOnNow": "Transmitiendo ahora", "HeaderOtherItems": "Otros elementos", @@ -339,7 +292,6 @@ "HeaderPassword": "Contraseña", "HeaderPasswordReset": "Reestablecer contraseña", "HeaderPaths": "Ruta", - "HeaderPeople": "Gente", "HeaderPinCodeReset": "Restablecer código PIN", "HeaderPlayAll": "Reproducir todo", "HeaderPlayOn": "Reproducir en", @@ -350,7 +302,7 @@ "HeaderPreferredMetadataLanguage": "Idioma preferido para las etiquetas", "HeaderProfile": "Perfil", "HeaderProfileInformation": "Información del perfil", - "HeaderProfileServerSettingsHelp": "Estos valores controlan como el servidor Jellyfin se presenta al dispositivo.", + "HeaderProfileServerSettingsHelp": "Estos valores controlan cómo el servidor será presentado a los clientes.", "HeaderRecentlyPlayed": "Reproducido recientemente", "HeaderRecordingOptions": "Ajustes de grabación", "HeaderRecordingPostProcessing": "Grabación post procesamiento", @@ -363,7 +315,6 @@ "HeaderRevisionHistory": "Histórico de revisiones", "HeaderRunningTasks": "Tareas en ejecución", "HeaderScenes": "Escenas", - "HeaderSchedule": "Horario", "HeaderSeasons": "Temporadas", "HeaderSecondsValue": "{0} segundos", "HeaderSelectCertificatePath": "Elige la ruta del certificado", @@ -374,14 +325,12 @@ "HeaderSelectServerCachePath": "Seleccione la ruta para el caché del servidor", "HeaderSelectServerCachePathHelp": "Navega o introduce la ruta para alojar los archivos caché del servidor. Tienes que tener permisos de escritura en esa carpeta.", "HeaderSelectTranscodingPath": "Ruta para los archivos temporales de las conversiones", - "HeaderSelectTranscodingPathHelp": "Busca o escribe la ruta que se utilizará para guardar los archivos temporales que se generarán mientras se convierten los archivos. Jellyfin debe tener permisos de escritura en la carpeta.", + "HeaderSelectTranscodingPathHelp": "Busca o escribe la ruta que se utilizará para guardar los archivos que se generarán mientras se convierten los archivos. Jellyfin debe tener permisos de escritura en la carpeta.", "HeaderSendMessage": "Enviar mensaje", - "HeaderSeries": "Series", "HeaderSeriesOptions": "Opciones de series", "HeaderServerSettings": "Ajustes del servidor", "HeaderSettings": "Ajustes", "HeaderSetupLibrary": "Configure sus bibliotecas de medios", - "HeaderShutdown": "Apagar", "HeaderSortBy": "Ordenar por", "HeaderSortOrder": "Orden", "HeaderSpecialEpisodeInfo": "Información del episodio especial", @@ -394,7 +343,6 @@ "HeaderSubtitleProfiles": "Perfil de los subtítulos", "HeaderSubtitleProfilesHelp": "El perfil de los subtítulos describe el formato soportado por el dispositivo.", "HeaderSystemDlnaProfiles": "Perfiles del sistema", - "HeaderTags": "Etiquetas", "HeaderTaskTriggers": "Tareas de activación", "HeaderThisUserIsCurrentlyDisabled": "Este usuario está desactivado", "HeaderTranscodingProfile": "Parámetros de conversión", @@ -414,15 +362,14 @@ "HeaderXmlDocumentAttributes": "Atributos del documento xml", "HeaderXmlSettings": "Ajustes xml", "HeaderYears": "Años", - "HeadersFolders": "Carpetas", "Help": "Ayuda", "Hide": "Ocultar", "HideWatchedContentFromLatestMedia": "Esconder medios vistos de los medios más recientes", "HttpsRequiresCert": "Para activar la conexión segura, necesitas un certificado SSL de confianza, como Let's Encrypt. De lo contrario, desactive las conexiones seguras.", "Identify": "Identificar", "Images": "Imágenes", - "ImportFavoriteChannelsHelp": "Si está activado, sólo los canales guardados como favoritos en el sintonizador se importarán.", - "ImportMissingEpisodesHelp": "Si está activada, la información sobre los episodios que faltan se importará en su base de datos Jellyfin y se mostrará en temporadas y series. Esto puede causar exploraciones de bibliotecas significativamente más largas.", + "ImportFavoriteChannelsHelp": "Sólo los canales guardados como favoritos en el sintonizador se importarán.", + "ImportMissingEpisodesHelp": "La información sobre los episodios que faltan se importará en su base de datos y se mostrará en temporadas y series. Esto puede causar exploraciones de bibliotecas significativamente más largas.", "InstallingPackage": "Instalando {0} (versión {1})", "InstantMix": "Mix instantáneo", "ItemCount": "Elementos {0}", @@ -446,20 +393,17 @@ "LabelAlbumArtMaxWidthHelp": "Resolución máxima de la carátula del álbum expuesta a través de upnp: albumArtURI.", "LabelAlbumArtPN": "Carátula del album PN:", "LabelAlbumArtists": "Artistas de los álbumes:", - "LabelAll": "Todo", "LabelAllowHWTranscoding": "Activar la conversión acelerada por hardware", - "LabelAllowServerAutoRestart": "Permitir al servidor reiniciarse automáticamente para aplicar las actualizaciones", - "LabelAllowServerAutoRestartHelp": "El servidor solo se reiniciará durante periodos de reposo, cuando no haya usuarios activos.", "LabelAllowedRemoteAddresses": "Filtro de dirección IP remota:", "LabelAllowedRemoteAddressesMode": "Modo de filtro de dirección IP remota:", "LabelAppName": "Nombre de la aplicación", "LabelAppNameExample": "Ejemplo: Sickbeard, Sonarr", "LabelArtists": "Artistas:", - "LabelArtistsHelp": "Separar múltiples artistas usando ;", + "LabelArtistsHelp": "Separar múltiples artistas utilizando punto y coma.", "LabelAudioLanguagePreference": "Idioma de audio preferido:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Actualizar las etiquetas automáticamente desde Internet:", "LabelBindToLocalNetworkAddress": "Vincular a la dirección de red local:", - "LabelBindToLocalNetworkAddressHelp": "Opcional. Anule la dirección IP local para enlazar el servidor HTTP. Si se deja vacío, el servidor se enlazará a todas las direcciones disponibles. Para cambiar este valor, debe reiniciar el servidor Jellyfin.", + "LabelBindToLocalNetworkAddressHelp": "Anule la dirección IP local para enlazar el servidor HTTP. Si se deja vacío, el servidor se enlazará a todas las direcciones disponibles. Para cambiar este valor, debe reiniciar el servidor Jellyfin.", "LabelBirthDate": "Fecha de nacimiento:", "LabelBirthYear": "Año de nacimiento:", "LabelBlastMessageInterval": "Intervalo para mensajes en vivo (segundos)", @@ -482,7 +426,6 @@ "LabelCustomCertificatePathHelp": "Ruta a un archivo PKCS # 12 que contiene un certificado y una clave privada para habilitar el soporte de TLS en un dominio personalizado.", "LabelCustomCss": "CSS personalizado:", "LabelCustomCssHelp": "Aplicar su propio CSS personalizado a la interfaz de la web.", - "LabelCustomDeviceDisplayName": "Nombre para mostrar:", "LabelCustomDeviceDisplayNameHelp": "Proporcione un nombre para mostrar o déjelo vacío para usar el nombre proporcionado por el dispositivo.", "LabelCustomRating": "Valoración pesonalizada:", "LabelDateAdded": "Fecha de añadido:", @@ -491,11 +434,10 @@ "LabelDay": "Día:", "LabelDeathDate": "Fecha de muerte:", "LabelDefaultUser": "Usuario por defecto:", - "LabelDefaultUserHelp": "Determina de qúe usuario se utilizará su biblioteca de medios para mostrarla por defecto en los dipositivos conectados. Esto puede cambiarse para cada dispositivo mediante el uso de perfiles.", + "LabelDefaultUserHelp": "Determina de qué usuario se utilizará su biblioteca de medios para mostrarla por defecto en los dipositivos conectados. Esto puede cambiarse para cada dispositivo mediante el uso de perfiles.", "LabelDeviceDescription": "Descripción del dispositivo", "LabelDidlMode": "Modo DIDL:", "LabelDiscNumber": "Número de disco:", - "LabelDisplayMissingEpisodesWithinSeasons": "Mostar episodios no disponibles en temporadas", "LabelDisplayMode": "Modo de visualización:", "LabelDisplayName": "Mostrar nombre:", "LabelDisplayOrder": "Mostrar orden:", @@ -625,7 +567,6 @@ "LabelNewPassword": "Nueva contraseña:", "LabelNewPasswordConfirm": "Confirmación de la nueva contraseña:", "LabelNewsCategories": "Categorías de noticias:", - "LabelNext": "Siguiente", "LabelNotificationEnabled": "Activar esta notificación", "LabelNumber": "Número:", "LabelNumberOfGuideDays": "Número de días a descargar de la guía:", @@ -648,9 +589,7 @@ "LabelPostProcessorArguments": "Argumentos de línea de comandos posprocesador:", "LabelPostProcessorArgumentsHelp": "Utilice {path} como ruta del archivo de grabación.", "LabelPreferredDisplayLanguage": "Idioma preferido visualizado:", - "LabelPreferredDisplayLanguageHelp": "La traducción de Jellyfin es un proyecto en marcha.", "LabelPreferredSubtitleLanguage": "Idioma de subtítulos preferido:", - "LabelPrevious": "Anterior", "LabelProfileAudioCodecs": "Códecs de audio:", "LabelProfileCodecs": "Códecs:", "LabelProfileCodecsHelp": "Separados por comas. Esto se puede dejar vacío para aplicar a todos los códecs.", @@ -664,7 +603,6 @@ "LabelPublicHttpPortHelp": "Número de puerto público que debe ser enlazado al puerto HTTP local.", "LabelPublicHttpsPort": "Puerto público HTTPS:", "LabelPublicHttpsPortHelp": "Puerto público que debe ser enlazado al puerto local HTTPS.", - "LabelReadHowYouCanContribute": "Aprenda cómo contribuir.", "LabelReasonForTranscoding": "Motivo por el que se realiza la conversión:", "LabelRecord": "Grabar:", "LabelRecordingPath": "Ruta de grabaciones por defecto:", @@ -716,12 +654,9 @@ "LabelTimeLimitHours": "Límite de tiempo (horas):", "LabelTitle": "Título:", "LabelTrackNumber": "Número de pista:", - "LabelTranscodingAudioCodec": "Códec de audio:", - "LabelTranscodingContainer": "Contenedor:", "LabelTranscodingTempPathHelp": "Establece la carpeta que se usará para almacenar los archivos temporales de las conversiones. Déjalo en blanco para usar la ruta por defecto.", "LabelTranscodingThreadCount": "Núcleos a utilizar durante la conversión:", "LabelTranscodingThreadCountHelp": "Selecciona el número de núcleos a utilizar para la conversión. A menos núcleos, menor será el uso del procesador, pero puede que la conversión no vaya lo suficientemente rápido para una reproducción fluida.", - "LabelTranscodingVideoCodec": "Códec de video:", "LabelTriggerType": "Tipo de evento:", "LabelTunerIpAddress": "IP del sintonizador:", "LabelTunerType": "Tipo de sintonizador:", @@ -742,7 +677,6 @@ "LabelXDlnaCapHelp": "Determina el contenido del elemento X_DLNACAP en el espacio de nombre urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDocHelp": "Determina el contenido del elemento X_DLNADOC en el espacio de nombreurn:schemas-dlna-org:device-1-0.", "LabelYear": "Año:", - "LabelYourFirstName": "Tu nombre:", "LabelYoureDone": "¡Ya está!", "LabelZipCode": "Código postal:", "LabelffmpegPath": "Ruta de ffmpeg:", @@ -807,7 +741,6 @@ "MessageFileReadError": "Ha habido un error leyendo el fichero. Por favor, inténtalo más tarde.", "MessageForgotPasswordFileCreated": "Se ha creado el siguiente archivo en tu servidor y contiene instrucciones de cómo proceder:", "MessageForgotPasswordInNetworkRequired": "Por favor, inténtalo de nuevo desde tu red de casa para iniciar el proceso de restablecimiento de la contraseña.", - "MessageInstallPluginFromApp": "Este complemento debe instalarse desde la aplicación en la que lo vayas a usar.", "MessageInvalidForgotPasswordPin": "Ha introducido un código PIN inválido o expirado. Por favor, inténtelo de nuevo.", "MessageInvalidUser": "Usuario o contraseña inválidos. Por favor, inténtalo otra vez.", "MessageItemSaved": "Elemento grabado.", @@ -824,7 +757,6 @@ "MessagePluginConfigurationRequiresLocalAccess": "Para configurar este complemento inicia sesión en tu servidor local directamente.", "MessagePluginInstallDisclaimer": "Las extensiones creadas por los miembros de la comunidad de Jellyfin son una buena forma de mejorar tu experiencia con características adicionales y otros beneficios. Antes de instalarlos considera los efectos que pueden tener en tu servidor Jellyfin, como escaneos de la biblioteca más largos, procesado en segundo plano adicional y una reducción de la estabilidad del sistema.", "MessageReenableUser": "Mira abajo para reactivarlo", - "MessageSettingsSaved": "Ajustes guardados.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Se eliminarán las siguientes ubicaciones de medios de tu biblioteca:", "MessageUnableToConnectToServer": "No podemos conectar con el servidor seleccionado ahora mismo. Por favor, asegúrate de que esta funcionando e inténtalo otra vez.", "MessageUnsetContentHelp": "El contenido se mostrará como carpetas planas. Para tener mejores resultados utiliza el gestor de metadatos para establecer los tipos de contenidos de las sub-carpetas.", @@ -854,10 +786,9 @@ "Next": "Siguiente", "NextUp": "Seguidamente", "NoNewDevicesFound": "No se han encontrado nuevos dispositivos. Para añadir un sintonizador cierra este diálogo e introduce la información del dispositivo manualmente.", - "NoNextUpItemsMessage": "Nada encontrado. ¡Comienza a ver tus programas!", - "NoPluginConfigurationMessage": "Este complemento no tiene opciones que configurar.", + "MessageNoNextUpItems": "Nada encontrado. ¡Comienza a ver tus programas!", + "MessageNoPluginConfiguration": "Este complemento no tiene opciones que configurar.", "NoSubtitleSearchResultsFound": "No se han encontrado resultados.", - "NoSubtitles": "Sin subtítulos", "NoSubtitlesHelp": "Los subtítulos no se cargarán de forma predeterminada. Tienen que ser activados manualmente durante la reproducción.", "None": "Nada", "NumLocationsValue": "{0} carpetas", @@ -935,7 +866,6 @@ "OptionExternallyDownloaded": "Descarga externa", "OptionExtractChapterImage": "Habilitar la extracción de imágenes de los capítulos", "OptionFavorite": "Favoritos", - "OptionFriday": "Viernes", "OptionHasSpecialFeatures": "Características especiales", "OptionHasSubtitles": "Subtítulos", "OptionHasThemeSong": "Banda sonora", @@ -950,11 +880,9 @@ "OptionLikes": "Me gusta", "OptionMax": "Máximo", "OptionMissingEpisode": "Episodios que faltan", - "OptionMonday": "Lunes", "OptionNameSort": "Nombre", "OptionNew": "Nuevo…", "OptionNone": "Nada", - "OptionOnAppStartup": "Al iniciar la aplicación", "OptionOnInterval": "En un intervalo", "OptionParentalRating": "Clasificación parental", "OptionPlainStorageFolders": "Ver todas las carpetas como carpetas de almacenamiento sin formato", @@ -975,19 +903,14 @@ "OptionResElement": "Elemento res", "OptionResumable": "Se puede continuar", "OptionRuntime": "Tiempo", - "OptionSaturday": "Sábado", "OptionSaveMetadataAsHidden": "Guardar las etiquetas e imágenes como archivos ocultos", "OptionSaveMetadataAsHiddenHelp": "La configuración se aplicará a las nuevas etiquetas que se creen. Las etiquetas existentes se actualizarán la próxima vez que sean guardadas por Jellyfin.", "OptionSpecialEpisode": "Especiales", - "OptionSunday": "Domingo", - "OptionThursday": "Jueves", "OptionTrackName": "Nombre de pista", - "OptionTuesday": "Martes", "OptionTvdbRating": "Valoración TVDB", "OptionUnairedEpisode": "Episodios no emitidos", "OptionUnplayed": "No reproducido", "OptionWakeFromSleep": "Despertar", - "OptionWednesday": "Miércoles", "OptionWeekdays": "Días de la semana", "OptionWeekends": "Fines de semana", "OptionWeekly": "Semanal", @@ -1000,7 +923,7 @@ "PasswordMatchError": "La contraseña y la confirmación de la contraseña deben de ser iguales.", "PasswordResetComplete": "La contraseña se ha restablecido.", "PasswordResetConfirmation": "¿Esta seguro de que desea restablecer la contraseña?", - "PasswordResetHeader": "Restablecer contraseña", + "HeaderResetPassword": "Restablecer contraseña", "PasswordSaved": "Contraseña guardada.", "People": "Gente", "PinCodeResetComplete": "El código PIN se ha restablecido.", @@ -1017,7 +940,7 @@ "PleaseEnterNameOrId": "Introduzca un nombre o un identificador externo.", "PleaseRestartServerName": "Por favor, reinicie el Servidor de Jellyfin - {0}.", "PleaseSelectTwoItems": "Seleccione al menos dos elementos.", - "PluginInstalledMessage": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surjan efecto.", + "MessagePluginInstalled": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surjan efecto.", "PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados sobre los nombres de archivo", "PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título que se utilizará cuando un elemento no tenga etiquetas ni estas se hayan podido descargar de Internet.", "Premieres": "Estrenos", @@ -1027,7 +950,6 @@ "ProductionLocations": "Localizaciones de producción", "Programs": "Programas", "Quality": "Calidad", - "QueueAllFromHere": "En cola todos desde aquí", "Rate": "Califica", "RecentlyWatched": "Vistos recientemente", "RecommendationBecauseYouLike": "Ya que te ha gustado {0}, quizá te pueda interesar", @@ -1037,7 +959,7 @@ "Record": "Grabar", "RecordSeries": "Grabar serie", "RecordingCancelled": "Grabación cancelada.", - "RecordingPathChangeMessage": "Cambiar la carpeta de grabación no migrará las grabaciones existentes de la ubicación antigua a la nueva. Tendrá que moverlos manualmente si lo desea.", + "MessageChangeRecordingPath": "Cambiar la carpeta de grabación no migrará las grabaciones existentes de la ubicación antigua a la nueva. Tendrá que moverlos manualmente si lo desea.", "RecordingScheduled": "Grabación programada.", "Recordings": "Grabaciones", "Refresh": "Refrescar", @@ -1108,53 +1030,27 @@ "SystemDlnaProfilesHelp": "El perfil del sistema es solo lectura. Cambios al perfil del sistema seran guardados en un perfil nuevo modificado.", "TabAccess": "Acceso", "TabAdvanced": "Avanzado", - "TabAlbumArtists": "Artistas de los álbumes", - "TabAlbums": "Álbumes", - "TabArtists": "Artistas", "TabCatalog": "Catálogo", - "TabChannels": "Canales", "TabCodecs": "Códecs", - "TabCollections": "Colecciones", "TabContainers": "Contenedores", "TabDashboard": "Panel de control", - "TabDevices": "Dispositivos", "TabDirectPlay": "Reproducción directa", - "TabDisplay": "Pantalla", - "TabEpisodes": "Episodios", - "TabFavorites": "Favoritos", - "TabGenres": "Géneros", - "TabGuide": "Guía", "TabLatest": "Novedades", - "TabLiveTV": "Televisión en directo", - "TabMetadata": "Etiquetas", - "TabMovies": "Películas", "TabMusic": "Música", - "TabMusicVideos": "Videos musicales", "TabMyPlugins": "Mis extensiones", "TabNetworks": "Cadenas", "TabNfoSettings": "Ajustes de NFO", "TabNotifications": "Notificaciones", "TabOther": "Otros", "TabParentalControl": "Control parental", - "TabPassword": "Contraseña", - "TabPlayback": "Reproducción", - "TabPlaylist": "Lista de reproducción", - "TabPlaylists": "Listas de reproducción", "TabProfile": "Perfil", "TabProfiles": "Perfiles", - "TabRecordings": "Grabaciones", "TabResponses": "Respuestas", - "TabResumeSettings": "Reanudación", "TabScheduledTasks": "Tareas programadas", "TabServer": "Servidor", "TabSettings": "Opciones", - "TabShows": "Programas", - "TabSongs": "Canciones", "TabStreaming": "Transmisión", - "TabSuggestions": "Sugerencias", - "TabTranscoding": "Conversión", "TabUpcoming": "Próximos", - "TabUsers": "Usuarios", "Tags": "Etiquetas", "TellUsAboutYourself": "Háblenos acerca de usted", "TheseSettingsAffectSubtitlesOnThisDevice": "Estas opciones afectan a los subtítulos en este dispositivo", @@ -1169,7 +1065,7 @@ "Tuesday": "Martes", "TvLibraryHelp": "Revisar la {0}guía de nombres de los programas de TV{1}.", "UninstallPluginConfirmation": "¿Esta seguro que desea desinstalar {0}?", - "UninstallPluginHeader": "Desinstalar complemento", + "HeaderUninstallPlugin": "Desinstalar complemento", "Unmute": "Activar audio", "Unrated": "Sin clasificar", "Up": "Arriba", @@ -1224,7 +1120,6 @@ "Ascending": "Ascendente", "Audio": "Audio", "Auto": "Automático", - "AutoBasedOnLanguageSetting": "Automático (basado en la configuración de idioma)", "Banner": "Pancarta", "BurnSubtitlesHelp": "Determina si el servidor debe grabar los subtítulos en el vídeo al transcodificar. Desactivar esta opción puede mejorar el rendimiento. Seleccione 'Auto' para grabar formatos basados en imágenes (VOBSUB, PGS, SUB/IDX) y ciertos subtítulos ASS o SSA.", "ButtonInfo": "Información", @@ -1239,7 +1134,7 @@ "DatePlayed": "Reproducido el", "Descending": "Descendiente", "DirectStreamHelp1": "El tipo de archivo (H.264, AC3, etc.) y la resolución son compatibles con el dispositivo, pero no el contenedor (mkv, avi, wmv, etc.). El vídeo será re-empaquetado al vuelo antes de transmitirlo al dispositivo.", - "DirectStreamHelp2": "La transmisión directa del archivo usa muy poco procesamiento sin ninguna pérdida de calidad en el vídeo.", + "DirectStreamHelp2": "La transmisión directa del archivo usa muy poco procesamiento sin mínima pérdida de calidad en el vídeo.", "Director": "Dirección de", "Directors": "Directores", "Display": "Mostrar", @@ -1249,12 +1144,10 @@ "DisplayMissingEpisodesWithinSeasonsHelp": "Esto también debe ser habilitado para la biblioteca de TV en la configuración del servidor.", "DropShadow": "Eliminar sombra", "EditMetadata": "Editar etiquetas", - "EnableBackdrops": "Imágenes de fondo", "EnableBackdropsHelp": "Mostrar imágenes de fondo en algunas páginas mientras se explora la biblioteca.", "EnableColorCodedBackgrounds": "Fondos con código de colores", "EnableExternalVideoPlayersHelp": "Se mostrará un menú para reproductor externo cuando comience la reproducción del vídeo.", "EnableNextVideoInfoOverlayHelp": "Al finalizar un vídeo, mostrar información sobre el siguiente de la lista de reproducción actual.", - "EnableThemeSongs": "Canciones temáticas", "EnableThemeSongsHelp": "Reproducir las canciones temáticas de fondo mientras se explora la biblioteca.", "EnableThemeVideosHelp": "Reproducir vídeos temáticos de fondo mientras se explora la biblioteca.", "ErrorDeletingItem": "Se ha producido un error eliminando el elemento del servidor Jellyfin. Por favor, comprueba que el servidor Jellyfin tiene permisos de escritura y prueba de nuevo.", @@ -1267,7 +1160,6 @@ "GroupBySeries": "Agrupar por series", "GuideProviderLogin": "Credenciales", "HeaderAlbumArtists": "Artistas del álbum", - "HeaderAlbums": "Álbumes", "HeaderApp": "Aplicación", "HeaderAppearsOn": "Aparece en", "HeaderBranding": "Remarcado", @@ -1280,9 +1172,7 @@ "HeaderVideoType": "Tipo de vídeo", "Home": "Inicio", "Horizontal": "Horizontal", - "LabelAudio": "Audio", "LabelBurnSubtitles": "Incrustar subtítulos:", - "LabelDashboardTheme": "Tema para la interfaz del servidor:", "LabelDateTimeLocale": "Fecha y hora local:", "LabelDefaultScreen": "Pantalla por defecto:", "LabelDisplayLanguage": "Mostrar idioma:", @@ -1292,13 +1182,10 @@ "LabelParentNumber": "Número del elemento padre:", "LabelPersonRoleHelp": "Ejemplo: Conductor de camión de helados", "LabelServerHost": "Host:", - "LabelSkin": "Tema:", "LabelSkipBackLength": "Tiempo de retroceso:", "LabelSkipForwardLength": "Tiempo de avance:", "LabelSortBy": "Ordenar por:", "LabelSortOrder": "Orden:", - "LabelSoundEffects": "Efectos de sonido:", - "LabelSubtitles": "Subtítulos", "LabelTVHomeScreen": "Modo televisión en pantalla de inicio:", "LabelVersion": "Versión:", "LabelVideo": "Vídeo", @@ -1306,7 +1193,6 @@ "LabelXDlnaDoc": "X-DLNA doc:", "LearnHowYouCanContribute": "Descubre cómo puedes contribuir.", "LeaveBlankToNotSetAPassword": "Puedes dejarlo en blanco para no configurar una contraseña.", - "LinksValue": "Enlaces: {0}", "List": "Lista", "Logo": "Logo", "MediaIsBeingConverted": "El medio está siendo convertido en un formato compatible con el dispositivo que lo está reproduciendo.", @@ -1322,7 +1208,6 @@ "Off": "Apagado", "Option3D": "3D", "OptionAuto": "Automático", - "OptionAutomatic": "Automático", "OptionBanner": "Cabecera", "OptionBlockTrailers": "Tráilers", "OptionBluray": "Blu-ray", @@ -1339,7 +1224,6 @@ "HeaderFavoriteArtists": "Artistas favoritos", "HeaderFavoriteSongs": "Canciones favoritas", "HeaderFavoriteVideos": "Vídeos favoritos", - "HeaderHome": "Inicio", "LabelAuthProvider": "Proveedor de autenticación:", "LabelPasswordResetProvider": "Proveedor de restablecimiento de contraseña:", "LabelServerName": "Nombre del servidor:", @@ -1351,9 +1235,6 @@ "DashboardOperatingSystem": "Sistema operativo: {0}", "DashboardArchitecture": "Arquitectura: {0}", "LabelWeb": "Web:", - "LaunchWebAppOnStartup": "Iniciar la aplicación web al iniciar el servidor", - "LaunchWebAppOnStartupHelp": "Abrir el cliente web en el navegador por defecto al iniciar el servidor. Esto no ocurrirá al utilizar la función de reinicio del servidor.", - "MediaInfoSoftware": "Software", "MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeData": "Datos", "MediaInfoStreamTypeEmbeddedImage": "Imagen incrustada", @@ -1385,7 +1266,6 @@ "Premiere": "Estreno", "Raised": "Elevación", "RefreshDialogHelp": "Las etiquetas se actualizan basándose en las configuraciones y los servicios de internet activados desde el panel de control de Jellyfin.", - "RunAtStartup": "Ejecutar al iniciar", "Series": "Series", "SeriesDisplayOrderHelp": "Ordena los episodios por fecha de emisión, orden de DVD o número absoluto.", "ShowTitle": "Mostrar título", @@ -1398,11 +1278,8 @@ "SubtitleAppearanceSettingsDisclaimer": "Estos ajustes no se aplicarán a los subtítulos gráficos (PGS, DVD, etc.), ni a ASS/SSA que tengan incluidos sus propios estilos.", "SubtitleOffset": "Desplazamiento de subtítulos", "TV": "Televisión", - "TabInfo": "Info", "TabLogs": "Registros", "TabPlugins": "Extensiones", - "TabSeries": "Series", - "TabTrailers": "Tráilers", "TagsValue": "Etiquetas: {0}", "ThemeSongs": "Banda sonora", "Trailers": "Tráilers", @@ -1412,7 +1289,6 @@ "ValueMinutes": "{0} min", "ValueSeriesCount": "{0} series", "Vertical": "Vertical", - "VideoRange": "Rango de vídeo", "ThemeVideos": "Vídeos de tema", "TabNetworking": "Redes", "CopyStreamURL": "Copiar URL de Stream", @@ -1447,7 +1323,6 @@ "MessageConfirmAppExit": "¿Quieres salir?", "EnableFasterAnimationsHelp": "Las animaciones y transiciones durarán menos tiempo", "EnableFasterAnimations": "Animaciones más rápidas", - "CopyStreamURLError": "Ha habido un error copiando la dirección.", "AllowFfmpegThrottlingHelp": "Las conversiones se pausarán cuando se adelanten lo suficiente desde la posición en la que se encuentre el reproductor. Puede reducir la carga en el servidor y es útil cuando se reproduce de forma continua, sin saltar entre intervalos de tiempo, pero puede que tengas que desactivarlo si experimentas problemas en la reproducción o cambias de posición frecuentemente mientras reproduces contenido.", "PlaybackErrorNoCompatibleStream": "Este contenido no es compatible con este dispositivo y no se puede reproducir: No se puede obtener del servidor en un formato compatible.", "OptionForceRemoteSourceTranscoding": "Forzar la conversión para fuentes externas (como la televisión en directo)", @@ -1476,9 +1351,7 @@ "OnApplicationStartup": "Al iniciarse el servidor", "Track": "Pista", "Season": "Temporada", - "ReleaseGroup": "Grupo de salida", "Person": "Persona", - "OtherArtist": "Otro artista", "Movie": "Película", "Episode": "Episodio", "BoxSet": "Box Set", @@ -1492,14 +1365,11 @@ "UnsupportedPlayback": "No es posible desencriptar contenido protegido mediante DRM; sin embargo se intentará su reproducción. Algunos archivos pueden aparecer completamente negros debido a encriptación u otras características no soportadas, como títulos interactivos.", "YadifBob": "YADIF Bob", "Yadif": "YADIF", - "MessageUnauthorizedUser": "No tiene autorización para acceder al servidor en este momento. Póngase en contacto con el administrador del servidor para obtener más información.", "ButtonTogglePlaylist": "Lista de reproducción", - "ButtonToggleContextMenu": "Más", "Filter": "Filtro", "New": "Nuevo", "HeaderFavoritePlaylists": "Lista reproducción favorita", "ApiKeysCaption": "Lista de las claves API actuales", - "LabelNightly": "Nightly", "LabelStable": "Estable", "LabelChromecastVersion": "Versión de Chromecast", "HeaderServerAddressSettings": "Configuración de la dirección del Servidor", @@ -1509,10 +1379,9 @@ "LabelRequireHttps": "Necesita HTTPS", "LabelEnableHttpsHelp": "Permite que el servidor escuche en el puerto HTTPS configurado. También se debe configurar un certificado válido para que esto surta efecto.", "LabelEnableHttps": "Activar HTTPS", - "TabDVR": "DVR", "SaveChanges": "Guardar cambios", - "EnableBlurhash": "Mostrar una representación de las imágenes mientras cargan", - "EnableBlurhashHelp": "Aparecerá una representación de los colores de las imágenes antes de que terminen de cargar", + "EnableBlurHash": "Mostrar una representación de las imágenes mientras cargan", + "EnableBlurHashHelp": "Aparecerá una representación de los colores de las imágenes antes de que terminen de cargar", "HeaderDVR": "DVR", "SyncPlayAccessHelp": "Selecciona el nivel de acceso de este usuario para utilizar SyncPlay. SyncPlay te permite sincronizar la reproducción entre varios dispositivos.", "MessageSyncPlayErrorMedia": "¡No se pudo activar SyncPlay! Error de medio.", @@ -1564,5 +1433,11 @@ "MessageNoRepositories": "Sin repositorios.", "Writers": "Escritores", "StopPlayback": "Detener la reproducción", - "ClearQueue": "Borrar la cola" + "ClearQueue": "Borrar la cola", + "LabelSubtitleVerticalPosition": "Posición vertical:", + "PreviousTrack": "Saltar al anterior", + "MessageGetInstalledPluginsError": "Ha ocurrido un error al recuperar la lista de plugins instalados.", + "MessagePluginInstallError": "Ha ocurrido un error al instalar este plugin.", + "NextTrack": "Saltar al siguiente", + "LabelUnstable": "Inestable" } diff --git a/src/strings/es_419.json b/src/strings/es_419.json index 2e02dd6b3d..3278f5e367 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -6,8 +6,6 @@ "Playlists": "Listas de reproducción", "Photos": "Fotos", "Movies": "Películas", - "HeaderNextUp": "A continuación", - "HeaderLiveTV": "TV en vivo", "HeaderFavoriteSongs": "Canciones favoritas", "HeaderFavoriteShows": "Programas favoritos", "HeaderFavoriteEpisodes": "Episodios favoritos", @@ -34,21 +32,17 @@ "AddToPlaylist": "Agregar a lista de reproducción", "AddToPlayQueue": "Agregar a la cola de reproducción", "AddToCollection": "Agregar a colección", - "AddItemToCollectionHelp": "Agrega elementos a las colecciones buscándolos y utilizando sus menúes al hacer clic derecho o al tocarlos para agregarlos a una colección.", "Add": "Agregar", "Actor": "Actor", "AccessRestrictedTryAgainLater": "El acceso está restringido actualmente. Por favor, inténtalo más tarde.", "Absolute": "Absoluto", "YadifBob": "YADIF Bob", "Trailers": "Trailers", - "TabTrailers": "Trailers", - "ReleaseGroup": "Grupo que lo estrenó", "OptionThumbCard": "Miniatura de imagen", "OptionResElement": "elemento reanudable", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", "OptionBluray": "Blu-ray", "OptionBlockTrailers": "Trailers", - "LabelNightly": "Construcciones nocturnas", "HeaderVideos": "Videos", "Director": "Director", "Depressed": "No presionado", @@ -64,7 +58,7 @@ "LastSeen": "Ultima vez visto {0}", "PersonRole": "como {0}", "ListPaging": "{0}-{1} de {2}", - "WriteAccessRequired": "El servidor Jellyfin requiere permiso de escritura en esta carpeta. Por favor, asegúrate de tener acceso de escritura e inténtalo de nuevo.", + "WriteAccessRequired": "Jellyfin requiere permiso de escritura en esta carpeta. Por favor, asegúrate de tener acceso de escritura e inténtalo de nuevo.", "PathNotFound": "No se pudo encontrar la ruta. Por favor, asegúrate de que la ruta es válida e inténtalo de nuevo.", "Yesterday": "Ayer", "Yes": "Sí", @@ -83,7 +77,6 @@ "Watched": "Visto", "ViewPlaybackInfo": "Ver información de reproducción", "ViewAlbum": "Ver álbum", - "VideoRange": "Rango de video", "Vertical": "Vertical", "ValueVideoCodec": "Códec de video: {0}", "ValueTimeLimitSingleHour": "Límite de tiempo: 1 hora", @@ -114,7 +107,7 @@ "Unrated": "Sin clasificar", "Unplayed": "No reproducido", "Unmute": "Activar sonido", - "UninstallPluginHeader": "Desinstalar complemento", + "HeaderUninstallPlugin": "Desinstalar complemento", "UninstallPluginConfirmation": "¿Estás seguro de querer desinstalar {0}?", "Uniform": "Uniforme", "TvLibraryHelp": "Revisa la {0}guía de nombrado de series de TV{1}.", @@ -134,27 +127,15 @@ "TellUsAboutYourself": "Háblanos de ti", "TagsValue": "Etiquetas: {0}", "Tags": "Etiquetas", - "TabUsers": "Usuarios", "TabUpcoming": "Próximamente", - "TabTranscoding": "Transcodificación", - "TabSuggestions": "Sugerencias", "TabStreaming": "Transmisión", - "TabSongs": "Canciones", - "TabShows": "Programas", "TabSettings": "Configuración", "TabServer": "Servidor", - "TabSeries": "Series", "TabScheduledTasks": "Tareas programadas", - "TabResumeSettings": "Reanudar", "TabResponses": "Respuestas", - "TabRecordings": "Grabaciones", "TabProfiles": "Perfiles", "TabProfile": "Perfil", "TabPlugins": "Complementos", - "TabPlaylists": "Listas de reproducción", - "TabPlaylist": "Lista de reproducción", - "TabPlayback": "Reproducción", - "TabPassword": "Contraseña", "TabParentalControl": "Control parental", "TabOther": "Otros", "TabNotifications": "Notificaciones", @@ -162,41 +143,25 @@ "TabNetworking": "Redes", "TabNetworks": "Cadenas", "TabMyPlugins": "Mis complementos", - "TabMusicVideos": "Videos musicales", "TabMusic": "Música", - "TabMovies": "Películas", - "TabMetadata": "Metadatos", "TabLogs": "Registros", - "TabLiveTV": "TV en vivo", - "TabInfo": "Información", - "TabGuide": "Guía", - "TabGenres": "Géneros", - "TabFavorites": "Favoritos", - "TabEpisodes": "Episodios", - "TabDVR": "DVR", - "TabDisplay": "Mostrar", "TabDirectPlay": "Reproducción directa", - "TabDevices": "Dispositivos", "TabDashboard": "Panel de control", "TabContainers": "Contenedores", - "TabCollections": "Colecciones", "TabCodecs": "Códecs", - "TabChannels": "Canales", "TabCatalog": "Catálogo", "OptionPoster": "Póster", "OptionPlayed": "Reproducido", "OptionPlayCount": "Contador de reproducciones", - "OptionPlainVideoItemsHelp": "Si se habilita, todos los videos serán representados en DIDL como «object.item.videoItem» en lugar de un tipo más específico, como «object.item.videoItem.movie».", + "OptionPlainVideoItemsHelp": "Todos los videos serán representados en DIDL como «object.item.videoItem» en lugar de un tipo más específico, como «object.item.videoItem.movie».", "OptionPlainVideoItems": "Mostrar todos los videos como elementos de video simples", - "OptionPlainStorageFoldersHelp": "Si se habilita, todos las carpetas serán representadas en DIDL como «object.container.storageFolder» en lugar de un tipo más específico, como «object.container.person.musicArtist».", + "OptionPlainStorageFoldersHelp": "Todos las carpetas serán representadas en DIDL como «object.container.storageFolder» en lugar de un tipo más específico, como «object.container.person.musicArtist».", "OptionPlainStorageFolders": "Mostrar todas las carpetas como carpetas de almacenamiento simples", "OptionParentalRating": "Clasificación parental", "OptionOnInterval": "En un intervalo", - "OptionOnAppStartup": "Al iniciar la aplicación", "OptionNone": "Ninguno", "OptionNew": "Nuevo…", "OptionNameSort": "Nombre", - "OptionMonday": "Lunes", "OptionMissingEpisode": "Episodios faltantes", "OptionMax": "Máximo", "OptionLoginAttemptsBeforeLockoutHelp": "Un valor de cero significa heredar el valor predeterminado de tres intentos para los usuarios normales y cinco para los administradores. Ajustar esto a -1 deshabilitará la función.", @@ -206,7 +171,7 @@ "OptionIsSD": "SD", "OptionIsHD": "HD", "OptionImdbRating": "Calificación de IMDb", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Si se habilita, estas solicitudes serán honradas pero se ignorará el encabezado de rango de bytes.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Estas solicitudes serán consideradas pero se ignorará el encabezado de rango de bytes.", "OptionIgnoreTranscodeByteRangeRequests": "Ignorar solicitudes de transcodificación de rango de bytes", "OptionHomeVideos": "Fotos", "OptionHlsSegmentedSubtitles": "Subtítulos segmentados HLS", @@ -217,7 +182,6 @@ "OptionHasThemeSong": "Canción temática", "OptionHasSubtitles": "Subtítulos", "OptionHasSpecialFeatures": "Características especiales", - "OptionFriday": "Viernes", "OptionFavorite": "Favoritos", "OptionExtractChapterImage": "Habilitar la extracción de imágenes de los capítulos", "OptionExternallyDownloaded": "Descarga externa", @@ -239,7 +203,7 @@ "OptionDownloadPrimaryImage": "Principal", "OptionDownloadMenuImage": "Menú", "OptionDownloadLogoImage": "Logo", - "OptionDownloadImagesInAdvanceHelp": "Por defecto, la mayoría de las imágenes solo son descargadas cuando son solicitadas por una aplicación Jellyfin. Habilita esta opción para descargar todas las imágenes por adelantado, a medida que se agreguen nuevos medios. Esto podría causar escaneos de bibliotecas significativamente más largos.", + "OptionDownloadImagesInAdvanceHelp": "Por defecto, la mayoría de las imágenes se descargan cuando son solicitadas por un cliente. Habilita esta opción para descargarlas todas por adelantado, a medida que se agreguen nuevos medios. Esto podría causar que los escaneos de bibliotecas sean significativamente más largos.", "OptionDownloadImagesInAdvance": "Descargar las imágenes con antelación", "OptionDownloadDiscImage": "Disco", "OptionDownloadBoxImage": "Caja", @@ -249,7 +213,7 @@ "OptionDisplayFolderViewHelp": "Muestra las carpetas junto con sus otras bibliotecas de medios. Esto puede ser útil si deseas tener una vista simple de carpeta.", "OptionDisplayFolderView": "Mostrar una vista de carpetas para mostrar las carpetas simples de los medios", "OptionDislikes": "No me gusta", - "OptionDisableUserHelp": "Si se desactiva, el servidor no aceptará conexiones de este usuario. Las conexiones existentes serán finalizadas abruptamente.", + "OptionDisableUserHelp": "El servidor no aceptará conexiones de este usuario. Las conexiones existentes serán finalizadas abruptamente.", "OptionDisableUser": "Desactivar este usuario", "OptionDescending": "Descendente", "OptionDatePlayed": "Fecha de reproducción", @@ -268,9 +232,8 @@ "OptionBlockChannelContent": "Contenido de canales de Internet", "OptionBlockBooks": "Libros", "OptionBanner": "Banner", - "OptionAutomaticallyGroupSeriesHelp": "Si se habilita, las series que se reparten a través de múltiples carpetas dentro de esta biblioteca serán fusionadas en una sola serie.", + "OptionAutomaticallyGroupSeriesHelp": "Series que estén repartidas en múltiples carpetas dentro de esta biblioteca serán automáticamente fusionadas en una sola serie.", "OptionAutomaticallyGroupSeries": "Fusionar automáticamente series esparcidas a través de múltiples carpetas", - "OptionAutomatic": "Automático", "OptionAuto": "Automático", "OptionAscending": "Ascendente", "OptionArtist": "Artista", @@ -281,7 +244,7 @@ "OptionAllowRemoteSharedDevicesHelp": "Los dispositivos DLNA se considerarán compartidos hasta que un usuario comience a controlarlos.", "OptionAllowRemoteSharedDevices": "Permitir control remoto de dispositivos compartidos", "OptionAllowRemoteControlOthers": "Permitir control remoto de otros usuarios", - "OptionAllowMediaPlaybackTranscodingHelp": "Restringir el acceso a la transcodificación podría causar fallas en la reproducción en las aplicaciones Jellyfin debido a los formatos de medios no soportados.", + "OptionAllowMediaPlaybackTranscodingHelp": "Restringir el acceso a la transcodificación podría causar fallas en la reproducción en los clientes debido a formatos de medios no soportados.", "OptionAllowMediaPlayback": "Permitir reproducción de medios", "OptionAllowManageLiveTv": "Permitir gestión de grabación de TV en vivo", "OptionAllowLinkSharingHelp": "Solo son compartidas páginas web que contienen información sobre los medios. Los archivos de medios nunca son compartidos públicamente. Los compartidos tienen un límite de tiempo y expirarán después de {0} días.", @@ -304,10 +267,9 @@ "Normal": "Normal", "None": "Ninguno", "NoSubtitlesHelp": "Los subtítulos no serán cargados por defecto. Pueden ser activados manualmente durante la reproducción.", - "NoSubtitles": "Ninguno", "NoSubtitleSearchResultsFound": "No se encontraron resultados.", - "NoPluginConfigurationMessage": "Este complemento no tiene configuraciones disponibles.", - "NoNextUpItemsMessage": "No se encontró nada. ¡Comienza a ver tus programas!", + "MessageNoPluginConfiguration": "Este complemento no tiene configuraciones disponibles.", + "MessageNoNextUpItems": "No se encontró nada. ¡Comienza a ver tus programas!", "NoNewDevicesFound": "No se encontraron nuevos dispositivos. Para agregar un sintonizador nuevo, cierra este diálogo e introduce la información del dispositivo manualmente.", "NoCreatedLibraries": "Parece que no has creado ninguna biblioteca todavía. {0}¿Quisieras crear una ahora?{1}", "No": "No", @@ -338,7 +300,7 @@ "Mobile": "Móvil", "MinutesBefore": "minutos antes", "MinutesAfter": "minutos después", - "MetadataSettingChangeHelp": "Cambiar la configuración de los metadatos afectará al nuevo contenido que se añada en el futuro. Para actualizar el contenido existente, abre la pantalla de detalles y haz clic en el botón actualizar, o realiza actualizaciones masivas usando el administrador de metadatos.", + "MetadataSettingChangeHelp": "Cambiar la configuración de los metadatos afectará al nuevo contenido que se añada en el futuro. Para actualizar el contenido existente, abre la pantalla de detalles y haz clic en el botón actualizar, o haz actualizaciones masivas usando el administrador de metadatos.", "MetadataManager": "Administrador de metadatos", "Metadata": "Metadatos", "MessageSyncPlayErrorMedia": "¡Fallo al activar SyncPlay! Error en el archivo de medios.", @@ -360,9 +322,8 @@ "MessageUnsetContentHelp": "El contenido será mostrado como carpetas simples. Para mejores resultados utiliza el administrador de metadatos para establecer los tipos de contenido para las subcarpetas.", "MessageUnableToConnectToServer": "No podemos conectarnos al servidor seleccionado en este momento. Por favor, asegúrate de que está funcionando e inténtalo de nuevo.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Las siguientes ubicaciones de medios se removerán de tu biblioteca:", - "MessageSettingsSaved": "Configuraciones guardadas.", "MessageReenableUser": "Ver abajo para volver a habilitar", - "MessagePluginInstallDisclaimer": "Los complementos desarrollados por miembros de la comunidad Jellyfin son una gran forma de mejorar tu experiencia con Jellyfin con características y beneficios adicionales. Antes de instalar, por favor, conoce el impacto que pueden ocasionar en tu servidor Jellyfin, tales como escaneo más largo de bibliotecas, procesamiento en segundo plano adicional y reducción de la estabilidad del sistema.", + "MessagePluginInstallDisclaimer": "Los complementos desarrollados por miembros de la comunidad son una gran forma de mejorar tu experiencia con características y beneficios adicionales. Antes de instalar, por favor, conoce el impacto que pueden ocasionar en tu servidor, tales como escaneo más largo de bibliotecas, procesamiento en segundo plano adicional y reducción de la estabilidad del sistema.", "MessagePluginConfigurationRequiresLocalAccess": "Para configurar este complemento por favor, inicia sesión en tu servidor local directamente.", "MessagePleaseWait": "Por favor, espera. Esto podría tomar un minuto.", "MessagePleaseEnsureInternetMetadata": "Por favor, asegúrate de que la descarga de metadatos de Internet está habilitada.", @@ -378,10 +339,8 @@ "MessageLeaveEmptyToInherit": "Dejar vacío para heredar la configuración de un elemento superior o del valor predeterminado global.", "MessageItemsAdded": "Elementos agregados.", "MessageItemSaved": "Elemento guardado.", - "MessageUnauthorizedUser": "No estás autorizado para acceder al servidor en este momento. Por favor, contacta al administrador del servidor para más información.", "MessageInvalidUser": "Nombre de usuario o contraseña inválidos. Por favor, intenta de nuevo.", "MessageInvalidForgotPasswordPin": "Se ha introducido un código PIN inválido o expirado. Por favor, inténtalo de nuevo.", - "MessageInstallPluginFromApp": "Este complemento debe ser instalado desde dentro de la aplicación en la que deseas usarlo.", "MessageImageTypeNotSelected": "Por favor, selecciona un tipo de imagen del menú desplegable.", "MessageImageFileTypeAllowed": "Solo son soportados archivos JPEG y PNG.", "MessageForgotPasswordInNetworkRequired": "Por favor, intenta de nuevo dentro de tu red local para iniciar el proceso de restablecimiento de contraseña.", @@ -390,23 +349,19 @@ "MessageEnablingOptionLongerScans": "Habilitar esta opción podría resultar en escaneos de bibliotecas significativamente más largos.", "MessageDownloadQueued": "Descarga puesta en la cola.", "MessageDirectoryPickerLinuxInstruction": "Para Linux en Arch Linux, CentOS, Debian, Fedora, openSUSE o Ubuntu, debes conceder al usuario del servicio al menos permisos de lectura a tus ubicaciones de almacenamiento.", - "MessageDirectoryPickerBSDInstruction": "Para BSD, quizás necesites configurar el almacenamiento dentro de tu «FreeNAS Jail» de manera que permita a Jellyfin accederlo.", + "MessageDirectoryPickerBSDInstruction": "Para BSD, quizás necesites configurar el almacenamiento dentro de tu «jail FreeNAS» de manera que Jellyfin pueda acceder a tus medios.", "List": "Lista", - "LinksValue": "Enlaces: {0}", "Like": "Me gusta", "LibraryAccessHelp": "Selecciona las bibliotecas que deseas compartir con este usuario. Los administradores podrán editar todas las carpetas utilizando el gestor de metadatos.", "LeaveBlankToNotSetAPassword": "Puedes dejar este campo en blanco para no establecer ninguna contraseña.", "LearnHowYouCanContribute": "Aprende cómo puedes contribuir.", - "LaunchWebAppOnStartupHelp": "Abre el cliente web en su navegador web predeterminado cuando se inicia el servidor. Esto no ocurrirá cuando se utilice la función de reinicio del servidor.", - "LaunchWebAppOnStartup": "Iniciar la interfaz web al iniciar el servidor", "LatestFromLibrary": "Últimas - {0}", "Large": "Grande", "LanNetworksHelp": "Lista separada por comas de direcciones IP o entradas de IP/máscara de red para las redes que se considerarán en la red local al aplicar las restricciones de ancho de banda. Si se establecen, todas las demás direcciones IP se considerarán como parte de la red externa y estarán sujetas a las restricciones de ancho de banda externa. Si se deja en blanco, solo se considera a la subred del servidor estar en la red local.", - "LabelffmpegPathHelp": "La ruta hacia el archivo de la aplicación ffmpeg, o la carpeta que contenga ffmpeg.", + "LabelffmpegPathHelp": "La ruta hacia el archivo ejecutable ffmpeg, o la carpeta que contenga ffmpeg.", "LabelffmpegPath": "Ruta del FFmpeg:", "LabelZipCode": "Código postal:", "LabelYoureDone": "¡Has terminado!", - "LabelYourFirstName": "Tu nombre:", "LabelYear": "Año:", "LabelXDlnaDocHelp": "Determina el contenido del elemento X_DLNADOC en el namespace urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDoc": "Documento X-DLNA:", @@ -440,7 +395,6 @@ "LabelTunerType": "Tipo de sintonizador:", "LabelTunerIpAddress": "Dirección IP del sintonizador:", "LabelTriggerType": "Tipo de disparador:", - "LabelTranscodingVideoCodec": "Códec de video:", "LabelTranscodingThreadCountHelp": "Selecciona el número máximo de hilos a utilizar al transcodificar. Reducir el número de hilos reducirá el uso de la CPU, pero es posible que no se convierta lo suficientemente rápido como para que la experiencia de reproducción sea fluida.", "LabelTranscodingThreadCount": "Conteo de hilos de la transcodificación:", "LabelTranscodingProgress": "Progreso de la transcodificación:", @@ -448,8 +402,6 @@ "LabelTranscodes": "Transcodificaciones:", "LabelTranscodingTempPathHelp": "Especifica una ruta personalizada para los archivos de transcodificación servidos a los clientes. Deja en blanco para utilizar el predeterminado del servidor.", "LabelTranscodePath": "Ruta de transcodificación:", - "LabelTranscodingContainer": "Contenedor:", - "LabelTranscodingAudioCodec": "Códec de audio:", "LabelTrackNumber": "Número de pista:", "LabelTitle": "Título:", "LabelTimeLimitHours": "Límite de tiempo (horas):", @@ -474,7 +426,6 @@ "MillisecondsUnit": "ms", "LabelSyncPlayTimeOffset": "Tiempo compensado respecto al servidor:", "LabelSupportedMediaTypes": "Tipos de medios soportados:", - "LabelSubtitles": "Subtítulos", "LabelSubtitlePlaybackMode": "Modo de subtítulo:", "LabelSubtitleFormatHelp": "Ejemplo: srt", "LabelSubtitleDownloaders": "Recolectores de subtítulos:", @@ -486,7 +437,6 @@ "LabelSportsCategories": "Categorías de deportes:", "LabelSpecialSeasonsDisplayName": "Nombre de la temporada de especiales:", "LabelSource": "Fuente:", - "LabelSoundEffects": "Efectos de sonido:", "LabelSortTitle": "Título para ordenar:", "LabelSortOrder": "Clasificar ordenado:", "LabelSortBy": "Ordenar por:", @@ -531,10 +481,10 @@ "SettingsWarning": "Cambiar estos valores podría causar inestabilidad o fallas de conexión. Si experimentas cualquier problema, recomendamos volver a los valores por defecto.", "SettingsSaved": "Configuración guardada.", "Settings": "Configuración", - "ServerUpdateNeeded": "Este servidor Jellyfin necesita ser actualizado. Para descargar la última versión, por favor, visita {0}", - "ServerRestartNeededAfterPluginInstall": "El servidor Jellyfin necesitará reiniciarse después de instalar un complemento.", - "ServerNameIsShuttingDown": "El servidor Jellyfin - {0} se está apagando.", - "ServerNameIsRestarting": "El servidor Jellyfin - {0} se está reiniciando.", + "ServerUpdateNeeded": "Este servidor necesita ser actualizado. Para descargar la última versión, por favor, visita {0}", + "ServerRestartNeededAfterPluginInstall": "Jellyfin necesitará reiniciarse después de instalar un complemento.", + "ServerNameIsShuttingDown": "El servidor en {0} se está apagando.", + "ServerNameIsRestarting": "El servidor en {0} se está reiniciando.", "SeriesYearToPresent": "{0} - Actualidad", "SeriesSettings": "Configuración de la serie", "SeriesRecordingScheduled": "Grabación de series programadas.", @@ -560,7 +510,6 @@ "Save": "Guardar", "Saturday": "Sábado", "Runtime": "Duración", - "RunAtStartup": "Ejecutar al iniciar", "Rewind": "Rebobinar", "ResumeAt": "Reanudar desde {0}", "ReplaceExistingImages": "Reemplazar imágenes existentes", @@ -576,11 +525,11 @@ "ReleaseDate": "Fecha de estreno", "RefreshQueued": "Actualización puesta en la cola.", "RefreshMetadata": "Actualizar metadatos", - "RefreshDialogHelp": "Los metadatos son actualizados basándose en las configuraciones y servicios de Internet que estén activados en el panel de control de tu servidor Jellyfin.", + "RefreshDialogHelp": "Los metadatos se actualizan según las configuraciones y servicios de internet que se habilitan en el panel de control.", "Refresh": "Actualizar", "Recordings": "Grabaciones", "RecordingScheduled": "Grabación programada.", - "RecordingPathChangeMessage": "Cambiar la carpeta de grabaciones no moverá las grabaciones existentes de la antigua ubicación a la nueva. Necesitan moverse manualmente si se desea.", + "MessageChangeRecordingPath": "Cambiar la carpeta de grabaciones no moverá las grabaciones existentes de la antigua ubicación a la nueva. Necesitan moverse manualmente si se desea.", "RecordingCancelled": "Grabación cancelada.", "RecordSeries": "Grabar series", "Record": "Grabar", @@ -591,7 +540,6 @@ "RecentlyWatched": "Visto recientemente", "Rate": "Calificación", "Raised": "Elevado", - "QueueAllFromHere": "Encolar todos desde aquí", "Quality": "Calidad", "Programs": "Programas", "ProductionLocations": "Lugares de producción", @@ -604,9 +552,9 @@ "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Esto utiliza la información del episodio desde los metadatos incrustados si están disponibles.", "PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título mostrado por defecto cuando no hay disponibles metadatos en Internet o localmente.", "PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados a los nombres de archivo", - "PluginInstalledMessage": "El complemento ha sido instalado con éxito. El servidor Jellyfin necesitará ser reiniciado para que los cambios surtan efecto.", + "MessagePluginInstalled": "El complemento ha sido instalado con éxito. El servidor necesitará ser reiniciado para que los cambios surtan efecto.", "PleaseSelectTwoItems": "Por favor, selecciona al menos dos elementos.", - "PleaseRestartServerName": "Por favor, reinicia el servidor Jellyfin - {0}.", + "PleaseRestartServerName": "Por favor, reinicia Jellyfin en {0}.", "PleaseEnterNameOrId": "Por favor, introduce un nombre o ID externo.", "PleaseConfirmPluginInstallation": "Por favor, haz clic en OK para confirmar que has leído lo que se encuentra arriba y que deseas proceder con la instalación del complemento.", "PleaseAddAtLeastOneFolder": "Por favor, agrega al menos una carpeta a esta biblioteca dando clic al botón Agregar.", @@ -627,8 +575,8 @@ "PerfectMatch": "Coincidencia perfecta", "People": "Personas", "PasswordSaved": "Contraseña guardada.", - "PasswordResetProviderHelp": "Elige un proveedor de restablecimiento de contraseña para usar cuando este usuario solicite un restablecimiento de contraseña", - "PasswordResetHeader": "Restablecer contraseña", + "PasswordResetProviderHelp": "Elige un proveedor de restablecimiento de contraseña para usar cuando este usuario solicite un restablecimiento de contraseña.", + "HeaderResetPassword": "Restablecer contraseña", "PasswordResetConfirmation": "¿Estás seguro de querer restablecer la contraseña?", "PasswordResetComplete": "La contraseña ha sido restablecida.", "PasswordMatchError": "La contraseña y la confirmación de la contraseña deben coincidir.", @@ -637,26 +585,20 @@ "PackageInstallCompleted": "Instalación completada de {0} (versión {1}).", "PackageInstallCancelled": "Instalación cancelada de {0} (versión {1}).", "Overview": "Resumen", - "OtherArtist": "Otro artista", "OriginalAirDateValue": "Fecha de emisión original: {0}", "OptionWeekly": "Semanal", "OptionWeekends": "Fines de semana", "OptionWeekdays": "Días de semana", - "OptionWednesday": "Miércoles", "OptionWakeFromSleep": "Despertar de la suspensión", "OptionUnplayed": "No reproducido", "OptionUnairedEpisode": "Episodios no emitidos", "OptionTvdbRating": "Calificación de TVDB", - "OptionTuesday": "Martes", "OptionTrackName": "Nombre de la pista", "OptionThumb": "Miniatura", - "OptionThursday": "Jueves", - "OptionSunday": "Domingo", "OptionSubstring": "Subcadena", "OptionSpecialEpisode": "Especiales", - "OptionSaveMetadataAsHiddenHelp": "Cambiar esto se aplicará a los nuevos metadatos guardados en el futuro. Los archivos de metadatos existentes serán actualizados la próxima vez que sean guardados por el servidor Jellyfin.", + "OptionSaveMetadataAsHiddenHelp": "Cambiar esto se aplicará a los nuevos metadatos guardados en el futuro. Los archivos de metadatos existentes serán actualizados la próxima vez que sean guardados por el servidor.", "OptionSaveMetadataAsHidden": "Guardar metadatos e imágenes como archivos ocultos", - "OptionSaturday": "Sábado", "OptionRuntime": "Duración", "OptionResumable": "Reanudable", "OptionRequirePerfectSubtitleMatchHelp": "Solicitar una coincidencia perfecta filtrará los subtítulos para incluir solo aquellos que han sido probados y verificados exactamente con tu archivo de video. Desmarcar esta opción incrementará las probabilidades de que se descarguen subtítulos, pero incrementará las posibilidades de obtener subtítulos mal sincronizados o con texto incorrecto.", @@ -674,13 +616,12 @@ "OptionProfileAudio": "Audio", "OptionPremiereDate": "Fecha de estreno", "OptionPosterCard": "Ficha de póster", - "LabelSkin": "Apariencia:", "LabelSize": "Tamaño:", "LabelSimultaneousConnectionLimit": "Límite de transmisiones simultáneas:", "LabelServerName": "Nombre del servidor:", "LabelServerHostHelp": "192.168.1.100:8096 o https://miservidor.com", "LabelServerHost": "Servidor:", - "LabelSeriesRecordingPath": "Ruta para las grabaciones de series (opcional):", + "LabelSeriesRecordingPath": "Ruta para las grabaciones de series:", "LabelSerialNumber": "Número de serie", "LabelSendNotificationToUsers": "Enviar la notificación a:", "LabelSelectVersionToInstall": "Seleccionar versión a instalar:", @@ -692,7 +633,7 @@ "LabelScheduledTaskLastRan": "Última ejecución {0}, tomando {1}.", "LabelSaveLocalMetadataHelp": "Guardar ilustraciones en las carpetas de los medios los colocará en un lugar donde se pueden editar fácilmente.", "LabelSaveLocalMetadata": "Guardar las ilustraciones en las carpetas de los medios", - "LabelRuntimeMinutes": "Duración (minutos):", + "LabelRuntimeMinutes": "Duración:", "LabelRequireHttpsHelp": "Si se marca, el servidor redirigirá automáticamente todas las solicitudes a través de HTTP a HTTPS. Esto no tiene efecto si el servidor no está escuchando en HTTPS.", "LabelRequireHttps": "Requerir HTTPS", "LabelRemoteClientBitrateLimitHelp": "Un límite opcional de velocidad de bits por transmisión para todos los dispositivos fuera de la red. Esto es útil para evitar que los dispositivos soliciten una tasa de bits más alta de la que puede manejar tu conexión a Internet. Esto puede provocar un aumento de la carga de la CPU en el servidor para transcodificar los videos sobre la marcha a una velocidad de bits inferior.", @@ -703,7 +644,6 @@ "LabelRecordingPath": "Ruta por defecto para las grabaciones:", "LabelRecord": "Grabar:", "LabelReasonForTranscoding": "Motivo para transcodificar:", - "LabelReadHowYouCanContribute": "Aprende cómo puedes contribuir.", "LabelPublicHttpsPortHelp": "El número de puerto público que debe asignarse al puerto HTTPS local.", "LabelPublicHttpsPort": "Número de puerto HTTPS público:", "LabelPublicHttpPortHelp": "El número de puerto público que debe asignarse al puerto HTTP local.", @@ -717,9 +657,7 @@ "LabelProfileCodecsHelp": "Separados por comas. Puede dejarse vacío para aplicarlo a todos los códecs.", "LabelProfileCodecs": "Códecs:", "LabelProfileAudioCodecs": "Códecs de audio:", - "LabelPrevious": "Anterior", "LabelPreferredSubtitleLanguage": "Idioma preferido para los subtítulos:", - "LabelPreferredDisplayLanguageHelp": "La traducción de Jellyfin es un proyecto en curso.", "LabelPreferredDisplayLanguage": "Idioma de pantalla preferido:", "LabelPostProcessorArgumentsHelp": "Usar {path} como la ruta del archivo grabado.", "LabelPostProcessorArguments": "Argumentos de la línea de comandos del post-procesador:", @@ -743,13 +681,12 @@ "LabelOverview": "Resumen:", "LabelOriginalTitle": "Título original:", "LabelOriginalAspectRatio": "Relación de aspecto original:", - "LabelOptionalNetworkPathHelp": "Si esta carpeta es compartida en su red, proveer la ruta del recurso compartido de red puede permitir a las aplicaciones Jellyfin en otros dispositivos acceder a los archivos de medios directamente. Por ejemplo, {0} o {1}.", - "LabelOptionalNetworkPath": "(Opcional) Carpeta de red compartida:", + "LabelOptionalNetworkPathHelp": "Si esta carpeta es compartida en su red, proveer la ruta del recurso compartido de red puede permitir a los clientes en otros dispositivos acceder a los archivos de medios directamente. Por ejemplo, {0} o {1}.", + "LabelOptionalNetworkPath": "Carpeta de red compartida:", "LabelNumberOfGuideDaysHelp": "Descargar más días de datos de programación permite programar con mayor anticipación y ver más listados, pero tomará más tiempo en descargar. Auto hará la selección basada en el número de canales.", "LabelNumberOfGuideDays": "Número de días de datos de la programación a descargar:", "LabelNumber": "Número:", "LabelNotificationEnabled": "Habilitar esta notificación", - "LabelNext": "Siguiente", "LabelNewsCategories": "Categorías de noticias:", "LabelNewPasswordConfirm": "Confirmación de contraseña nueva:", "LabelNewPassword": "Contraseña nueva:", @@ -757,9 +694,9 @@ "LabelStable": "Estable", "LabelChromecastVersion": "Versión de Chromecast", "LabelName": "Nombre:", - "LabelMusicStreamingTranscodingBitrateHelp": "Especifica la velocidad de bits máxima al transmitir música.", + "LabelMusicStreamingTranscodingBitrateHelp": "Especifica la máxima velocidad de bits al transmitir música.", "LabelMusicStreamingTranscodingBitrate": "Velocidad de bits de transcodificación de música:", - "LabelMovieRecordingPath": "Ruta para las grabaciones de películas (opcional):", + "LabelMovieRecordingPath": "Ruta para las grabaciones de películas:", "LabelMoviePrefixHelp": "Si un prefijo es aplicado al título de las películas, introdúcelo aquí para que el servidor pueda manejarlo correctamente.", "LabelMoviePrefix": "Prefijo de la película:", "LabelMovieCategories": "Categorías de películas:", @@ -775,7 +712,7 @@ "LabelMinResumeDuration": "Duración mínima para la reanudación:", "LabelMinBackdropDownloadWidth": "Anchura mínima de descarga de imágenes de fondo:", "LabelMethod": "Método:", - "LabelMetadataSaversHelp": "Selecciona los formatos de archivo con los que se guardarán tus metadatos.", + "LabelMetadataSaversHelp": "Selecciona los formatos de archivo a usar cuando se guarden tus metadatos.", "LabelMetadataSavers": "Grabadores de metadatos:", "LabelMetadataReadersHelp": "Ordena tus fuentes de metadatos locales por prioridad. El primer archivo encontrado será leído.", "LabelMetadataReaders": "Lectores de metadatos:", @@ -793,7 +730,7 @@ "LabelIconMaxWidth": "Ancho máximo del ícono:", "LabelIconMaxHeightHelp": "Resolución máxima de los íconos expuestos vía upnp:icon.", "LabelIconMaxHeight": "Altura máxima del ícono:", - "LabelHttpsPortHelp": "El número de puerto TCP al que el servidor HTTPS de Jellyfin debería enlazar.", + "LabelHttpsPortHelp": "El número de puerto TCP para el servidor HTTPS.", "LabelHttpsPort": "Número de puerto local HTTPS:", "LabelHomeScreenSectionValue": "Sección {0} de la pantalla de inicio:", "LabelHomeNetworkQuality": "Calidad en red local:", @@ -801,9 +738,9 @@ "LabelHardwareAccelerationType": "Aceleración por hardware:", "LabelEncoderPreset": "Codificación H264 y H265 preestablecida:", "LabelH264Crf": "CRF de codificación H264:", - "LabelGroupMoviesIntoCollectionsHelp": "Cuando se muestran listados de películas, las películas que pertenecen a una colección serán mostradas agrupadas en un solo artículo.", + "LabelGroupMoviesIntoCollectionsHelp": "Cuando se muestran listados de películas, las películas que estén en alguna colección serán mostradas agrupadas en un solo artículo.", "LabelGroupMoviesIntoCollections": "Agrupar películas en colecciones", - "LabelServerNameHelp": "Este nombre se usará para identificar el servidor y se predeterminará al nombre de la computadora del servidor.", + "LabelServerNameHelp": "Este nombre se usará para identificar el servidor y se predeterminará al nombre del servidor.", "LabelFriendlyName": "Nombre amistoso:", "LabelFormat": "Formato:", "LabelForgotPasswordUsernameHelp": "Introduce tu nombre de usuario, si lo recuerdas.", @@ -824,7 +761,7 @@ "LabelEnableSingleImageInDidlLimit": "Limitar a una sola imagen incrustada", "LabelEnableRealtimeMonitorHelp": "Los cambios en los archivos serán procesados inmediatamente, en los sistemas de archivo soportados.", "LabelEnableRealtimeMonitor": "Activar monitoreo en tiempo real", - "LabelEnableHttpsHelp": "Permite que el servidor escuche en el puerto HTTPS configurado. También se debe configurar un certificado válido para que esto surta efecto.", + "LabelEnableHttpsHelp": "Escuchar en el puerto HTTPS configurado. También se debe proporcionar un certificado válido para que esto surta efecto.", "LabelEnableHttps": "Habilitar HTTPS", "LabelEnableHardwareDecodingFor": "Habilitar decodificación por hardware para:", "LabelEnableDlnaServerHelp": "Permite a dispositivos UPnP en tu red explorar y reproducir contenido.", @@ -833,8 +770,8 @@ "LabelEnableDlnaPlayTo": "Habilitar Reproducir En mediante DLNA", "LabelEnableDlnaDebugLoggingHelp": "Crea grandes archivos de registro y solo se debe usar cuando se requiera para solucionar problemas.", "LabelEnableDlnaDebugLogging": "Habilitar el registro de depuración de DLNA", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina la duración en segundos entre búsquedas SSDP realizadas por Jellyfin.", - "LabelEnableDlnaClientDiscoveryInterval": "Intervalo de descubrimiento de clientes (segundos)", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina la duración en segundos entre búsquedas SSDP.", + "LabelEnableDlnaClientDiscoveryInterval": "Intervalo de descubrimiento de clientes", "LabelEnableBlastAliveMessagesHelp": "Habilita esto si el servidor no es detectado de manera confiable por otros dispositivos UPnP en tu red.", "LabelEnableBlastAliveMessages": "Bombardeo de mensajes de vida", "LabelEnableAutomaticPortMapHelp": "Redirecciona automáticamente los puertos públicos de tu router a los puertos locales de tu servidor a través de UPnP. Esto puede no funcionar con algunos modelos de routers o configuraciones de red. Los cambios no se aplicarán hasta después de reiniciar el servidor.", @@ -853,7 +790,6 @@ "LabelDisplayOrder": "Orden para mostrar:", "LabelDisplayName": "Nombre a mostrar:", "LabelDisplayMode": "Modo de pantalla:", - "LabelDisplayMissingEpisodesWithinSeasons": "Mostrar episodios faltantes en las temporadas", "LabelDisplayLanguageHelp": "La traducción de Jellyfin es un proyecto en curso.", "LabelDisplayLanguage": "Idioma de pantalla:", "LabelDiscNumber": "Número de disco:", @@ -869,10 +805,8 @@ "LabelDateAddedBehaviorHelp": "Si un valor de metadatos está presente, siempre se utilizará antes de cualquiera de estas opciones.", "LabelDateAddedBehavior": "Comportamiento de la fecha de adición para nuevo contenido:", "LabelDateAdded": "Fecha de adición:", - "LabelDashboardTheme": "Tema del panel de control del servidor:", "LabelCustomRating": "Calificación personalizada:", "LabelCustomDeviceDisplayNameHelp": "Proporcione un nombre personalizado para mostrar o déjalo vacío para usar el nombre reportado por el dispositivo.", - "LabelCustomDeviceDisplayName": "Nombre a mostrar:", "LabelCustomCssHelp": "Aplica tu propio estilo personalizado a la interfaz web.", "LabelCustomCss": "CSS personalizado:", "LabelCustomCertificatePathHelp": "Ruta a un archivo PKCS #12 que contiene un certificado y una clave privada para habilitar el soporte TLS en un dominio personalizado.", @@ -887,9 +821,6 @@ "LabelChannels": "Canales:", "LabelCertificatePasswordHelp": "Si tu certificado requiere una contraseña, por favor, introdúcela aquí.", "LabelCertificatePassword": "Contraseña del certificado:", - "TabArtists": "Artistas", - "TabAlbums": "Álbumes", - "TabAlbumArtists": "Artistas del álbum", "TabAdvanced": "Avanzado", "TabAccess": "Acceso", "TV": "TV", @@ -899,8 +830,8 @@ "MessageCreateAccountAt": "Crear una cuenta en {0}", "MessageContactAdminToResetPassword": "Por favor, contacta a tu administrador para restablecer tu contraseña.", "MessageConfirmShutdown": "¿Estás seguro de que deseas apagar el servidor?", - "MessageConfirmRevokeApiKey": "¿Estás seguro de querer revocar esta clave API? La conexión de la aplicación con el servidor Jellyfin será terminada abruptamente.", - "MessageConfirmRestart": "¿Estás seguro de que deseas reiniciar el servidor Jellyfin?", + "MessageConfirmRevokeApiKey": "¿Estás seguro de querer revocar esta clave API? La conexión de la aplicación a este servidor será terminada abruptamente.", + "MessageConfirmRestart": "¿Estás seguro de que deseas reiniciar Jellyfin?", "MessageConfirmRemoveMediaLocation": "¿Estás seguro de querer remover esta ubicación?", "MessageConfirmRecordingCancellation": "¿Cancelar grabación?", "MessageConfirmProfileDeletion": "¿Estás seguro de querer eliminar este perfil?", @@ -917,7 +848,6 @@ "MediaInfoStreamTypeEmbeddedImage": "Imagen incrustada", "MediaInfoStreamTypeData": "Dato", "MediaInfoStreamTypeAudio": "Audio", - "MediaInfoSoftware": "Software", "MediaInfoTimestamp": "Fecha y hora", "MediaInfoSize": "Tamaño", "MediaInfoSampleRate": "Tasa de muestreo", @@ -959,11 +889,11 @@ "LabelBurnSubtitles": "Quemar subtítulos:", "LabelBlockContentWithTags": "Bloquear elementos con las etiquetas:", "LabelBlastMessageIntervalHelp": "Determina la duración en segundos del intervalo entre mensajes de vida.", - "LabelBlastMessageInterval": "Intervalo de mensajes de vida (segundos)", + "LabelBlastMessageInterval": "Intervalo de mensajes de vida", "LabelBitrate": "Velocidad de bits:", "LabelBirthYear": "Año de nacimiento:", "LabelBirthDate": "Fecha de nacimiento:", - "LabelBindToLocalNetworkAddressHelp": "Opcional. Sobrescribe la dirección IP local a la que se vincula el servidor http. Si se deja vacío, el servidor se vinculará a todas las direcciones disponibles. Cambiar este valor requiere reiniciar el servidor Jellyfin.", + "LabelBindToLocalNetworkAddressHelp": "Sobrescribe la dirección IP local del servidor HTTP. Si se deja vacío, el servidor se vinculará a todas las direcciones disponibles. Cambiar este valor requiere un reinicio.", "LabelBindToLocalNetworkAddress": "Vincular a la dirección de red local:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Actualizar automáticamente los metadatos desde Internet:", "LabelAuthProvider": "Proveedor de autenticación:", @@ -973,17 +903,13 @@ "LabelAudioChannels": "Canales de audio:", "LabelAudioBitrate": "Velocidad de bits de audio:", "LabelAudioBitDepth": "Profundidad de bits de audio:", - "LabelAudio": "Audio", - "LabelArtistsHelp": "Separar múltiples empleando ;", + "LabelArtistsHelp": "Separar múltiples artistas por punto y coma.", "LabelArtists": "Artistas:", "LabelAppNameExample": "Ejemplo: Sickbeard, Sonarr", "LabelAppName": "Nombre de la aplicación", "LabelAllowedRemoteAddressesMode": "Modo de filtrado de direcciones IP remotas:", "LabelAllowedRemoteAddresses": "Filtro de direcciones IP remotas:", - "LabelAllowServerAutoRestartHelp": "El servidor solo se reiniciará durante los períodos de inactividad cuando no haya usuarios activos.", - "LabelAllowServerAutoRestart": "Permite al servidor reiniciarse automáticamente para aplicar actualizaciones", "LabelAllowHWTranscoding": "Permitir transcodificación por hardware", - "LabelAll": "Todos", "LabelAlbumArtists": "Artistas del álbum:", "LabelAlbumArtPN": "PN del arte del álbum:", "LabelAlbumArtMaxWidthHelp": "Resolución máxima del arte del álbum expuesta vía upnp:albumArtURI.", @@ -1007,8 +933,8 @@ "ItemCount": "{0} elementos", "InstantMix": "Mix instantáneo", "InstallingPackage": "Instalando {0} (versión {1})", - "ImportMissingEpisodesHelp": "Si se habilita, la información sobre los episodios faltantes se importará a la base de datos de Jellyfin y se mostrarán dentro de las temporadas y series. Esto puede causar escaneos de biblioteca significativamente más largos.", - "ImportFavoriteChannelsHelp": "Si se habilita, solo los canales marcados como favoritos en el dispositivo sintonizador serán importados.", + "ImportMissingEpisodesHelp": "La información sobre los episodios faltantes se importará a la base de datos y se mostrarán dentro de las temporadas y series. Esto puede causar escaneos de biblioteca significativamente más largos.", + "ImportFavoriteChannelsHelp": "Solo los canales marcados como favoritos en el dispositivo sintonizador serán importados.", "Images": "Imágenes", "Identify": "Identificar", "HttpsRequiresCert": "Para habilitar las conexiones seguras, necesitarás proporcionar un certificado SSL de confianza, como el de Let's Encrypt. Por favor, proporciona un certificado o desactiva las conexiones seguras.", @@ -1017,7 +943,6 @@ "HideWatchedContentFromLatestMedia": "Ocultar contenido ya visto de últimos medios", "Hide": "Ocultar", "Help": "Ayuda", - "HeadersFolders": "Carpetas", "HeaderYears": "Años", "HeaderXmlSettings": "Configuración XML", "HeaderXmlDocumentAttributes": "Atributos del documento XML", @@ -1037,7 +962,6 @@ "HeaderTracks": "Pistas", "HeaderThisUserIsCurrentlyDisabled": "Este usuario se encuentra actualmente deshabilitado", "HeaderTaskTriggers": "Disparadores de tarea", - "HeaderTags": "Etiquetas", "HeaderSystemDlnaProfiles": "Perfiles del sistema", "HeaderSyncPlayEnabled": "SyncPlay habilitado", "HeaderSyncPlaySelectGroup": "Unirse a un grupo", @@ -1053,7 +977,6 @@ "HeaderSpecialEpisodeInfo": "Información del episodio especial", "HeaderSortOrder": "Clasificar ordenado", "HeaderSortBy": "Ordenar por", - "HeaderShutdown": "Apagar", "HeaderSetupLibrary": "Configura tus bibliotecas de medios", "HeaderSettings": "Configuración", "HeaderServerSettings": "Configuración del servidor", @@ -1061,12 +984,11 @@ "HeaderSelectServerCachePath": "Seleccionar ruta para la caché del servidor", "HeaderSelectServer": "Seleccionar servidor", "HeaderSelectPath": "Seleccionar ruta", - "HeaderSelectMetadataPathHelp": "Explora o introduce la ruta donde deseas almacenar los metadatos. Se debe tener permisos de escritura en dicha carpeta.", + "HeaderSelectMetadataPathHelp": "Explora o introduce la ruta que deseas usar para los metadatos. Se debe tener permisos de escritura en esa carpeta.", "HeaderSelectMetadataPath": "Selecciona la ruta para los metadatos", "HeaderSelectCertificatePath": "Selecciona la ruta del certificado", "HeaderSecondsValue": "{0} segundos", "HeaderSeasons": "Temporadas", - "HeaderSchedule": "Programación", "HeaderScenes": "Escenas", "HeaderRunningTasks": "Tareas en ejecución", "HeaderRevisionHistory": "Historial de versiones", @@ -1080,7 +1002,7 @@ "HeaderRecordingPostProcessing": "Post procesado de las grabaciones", "HeaderRecordingOptions": "Opciones de grabación", "HeaderRecentlyPlayed": "Reproducido recientemente", - "HeaderProfileServerSettingsHelp": "Estos valores controlan como el servidor Jellyfin se presentará al dispositivo.", + "HeaderProfileServerSettingsHelp": "Estos valores controlan cómo el servidor se presentará a los clientes.", "HeaderProfileInformation": "Información del perfil", "HeaderProfile": "Perfil", "HeaderPreferredMetadataLanguage": "Idioma preferido para los metadatos", @@ -1092,7 +1014,6 @@ "HeaderPlayAll": "Reproducir todo", "HeaderPinCodeReset": "Restablecer código PIN", "HeaderPhotoAlbums": "Álbumes de fotos", - "HeaderPeople": "Personas", "HeaderPaths": "Rutas", "HeaderPasswordReset": "Restablecer contraseña", "HeaderPassword": "Contraseña", @@ -1109,15 +1030,12 @@ "HeaderMyDevice": "Mi dispositivo", "HeaderMusicVideos": "Videos musicales", "HeaderMusicQuality": "Calidad de la música", - "HeaderMovies": "Películas", "HeaderMoreLikeThis": "Más como esto", "HeaderMetadataSettings": "Configuración de metadatos", - "HeaderMediaInfo": "Info del medio", "HeaderMediaFolders": "Carpetas de medios", "HeaderMedia": "Medios", "HeaderLoginFailure": "Falló el inicio de sesión", "HeaderLiveTvTunerSetup": "Configuración del sintonizador de TV", - "HeaderLiveTv": "TV en vivo", "HeaderLibrarySettings": "Configuraciones de biblioteca", "HeaderLibraryOrder": "Orden de las bibliotecas", "HeaderLibraryFolders": "Carpetas de bibliotecas", @@ -1128,10 +1046,9 @@ "HeaderLatestMovies": "Últimas películas", "HeaderLatestMedia": "Últimos medios", "HeaderLatestEpisodes": "Últimos episodios", - "HeaderKodiMetadataHelp": "Para habilitar o deshabilitar los metadatos NFO, edite una biblioteca en la configuración de bibliotecas de Jellyfin y ubica la sección grabadores de metadatos.", + "HeaderKodiMetadataHelp": "Para habilitar o deshabilitar los metadatos NFO, edita una biblioteca y ubica la sección de grabadores de metadatos.", "HeaderKeepSeries": "Conservar serie", "HeaderKeepRecording": "Conservar grabación", - "HeaderItems": "Elementos", "HeaderInstantMix": "Mix instantáneo", "HeaderInstall": "Instalar", "HeaderImageSettings": "Configuración de imagen", @@ -1142,16 +1059,11 @@ "HeaderIdentification": "Identificación", "HeaderHttpsSettings": "Opciones HTTPS", "HeaderHttpHeaders": "Encabezados HTTP", - "HeaderHome": "Inicio", "HeaderGuideProviders": "Proveedores de Guías de TV", - "HeaderGenres": "Géneros", "HeaderFrequentlyPlayed": "Reproducido frecuentemente", - "HeaderForgotPassword": "Olvidé mi contraseña", "HeaderForKids": "Para niños", - "HeaderFilters": "Filtros", "HeaderFetcherSettings": "Configuración del recolector", "HeaderFetchImages": "Obtener imágenes:", - "HeaderFeatures": "Características", "HeaderFeatureAccess": "Acceso a características", "HeaderFavoritePlaylists": "Listas de reproducción favoritas", "HeaderFavoriteVideos": "Videos favoritos", @@ -1176,7 +1088,7 @@ "LabelLoginDisclaimerHelp": "Un mensaje que se mostrará en la parte inferior de la página de inicio de sesión.", "LabelLoginDisclaimer": "Aviso legal:", "LabelLockItemToPreventChanges": "Bloquear este elemento para evitar cambios futuros", - "LabelLocalHttpServerPortNumberHelp": "El número de puerto TCP al que el servidor HTTP de Jellyfin debería enlazar.", + "LabelLocalHttpServerPortNumberHelp": "El número de puerto TCP para el servidor HTTP.", "LabelLocalHttpServerPortNumber": "Número de puerto local HTTP:", "LabelLineup": "Programación:", "LabelLibraryPageSizeHelp": "Establece el número de elementos a mostrar en una página de biblioteca. Establece en 0 para deshabilitar el paginado.", @@ -1198,14 +1110,12 @@ "HeaderFavoriteBooks": "Libros favoritos", "HeaderExternalIds": "IDs externos:", "HeaderError": "Error", - "HeaderEpisodes": "Episodios", "HeaderEnabledFieldsHelp": "Desmarca un campo para bloquearlo y prevenir que sus datos sean cambiados.", "HeaderEnabledFields": "Campos habilitados", "HeaderEditImages": "Editar imágenes", "HeaderEasyPinCode": "Código PIN sencillo", "HeaderDVR": "DVR", "HeaderDownloadSync": "Descargar y sincronizar", - "HeaderDisplay": "Pantalla", "HeaderDirectPlayProfileHelp": "Agrega perfiles de reproducción directa para indicar qué formatos puede manejar el dispositivo de forma nativa.", "HeaderDirectPlayProfile": "Perfil de reproducción directa", "HeaderDevices": "Dispositivos", @@ -1232,34 +1142,27 @@ "HeaderCodecProfileHelp": "Los perfiles de códecs indican las limitaciones de un dispositivo al reproducir códecs específicos. Si una limitación se aplica entonces el medio será transcodificado, incluso si el códec ha sido configurado para reproducción directa.", "HeaderCodecProfile": "Perfil de códec", "HeaderChapterImages": "Imágenes de los capítulos", - "HeaderChannels": "Canales", "HeaderChannelAccess": "Acceso a los canales", - "HeaderCastCrew": "Reparto y equipo", "HeaderCastAndCrew": "Reparto y equipo", "HeaderCancelSeries": "Cancelar serie", "HeaderCancelRecording": "Cancelar grabación", "HeaderBranding": "Establecer marca", - "HeaderBooks": "Libros", "HeaderBlockItemsWithNoRating": "Bloquear elementos sin clasificación o con información de clasificación desconocida:", - "HeaderAutomaticUpdates": "Actualizaciones automáticas", "HeaderAudioSettings": "Configuración de audio", "HeaderAudioBooks": "Audiolibros", "HeaderAppearsOn": "Aparece en", "HeaderApp": "Aplicación", "ApiKeysCaption": "Lista de claves API actualmente habilitadas", - "HeaderApiKeysHelp": "Las aplicaciones externas deben tener una clave API para poder comunicarse con el servidor Jellyfin. Las claves se emiten al iniciar sesión con una cuenta Jellyfin, o al otorgar manualmente una clave a la aplicación.", + "HeaderApiKeysHelp": "Las aplicaciones externas deben tener una clave API para poder comunicarse con el servidor. Las claves se emiten al iniciar sesión con una cuenta de usuario, o al otorgar manualmente una clave a la aplicación.", "HeaderApiKeys": "Claves API", "HeaderApiKey": "Clave API", "HeaderAllowMediaDeletionFrom": "Permitir eliminación de medios de", "HeaderAlert": "Alerta", - "HeaderAlbums": "Álbumes", "HeaderAdmin": "Administrador", "HeaderAdditionalParts": "Partes adicionales", - "HeaderAddUser": "Agregar usuario", "HeaderAddUpdateImage": "Agregar/Actualizar Imagen", "HeaderAddToPlaylist": "Agregar a lista de reproducción", "HeaderAddToCollection": "Agregar a colección", - "HeaderAddScheduledTaskTrigger": "Agregar disparador", "HeaderActivity": "Actividad", "HeaderActiveRecordings": "Grabaciones activas", "HeaderActiveDevices": "Dispositivos activos", @@ -1303,12 +1206,12 @@ "EveryNDays": "Cada {0} días", "ErrorSavingTvProvider": "Hubo un error al guardar el proveedor de TV. Por favor, asegúrate de que sea accesible e inténtalo de nuevo.", "ErrorPleaseSelectLineup": "Por favor, selecciona una programación e inténtalo de nuevo. Si no hay disponible ninguna, entonces, por favor, verifica que tu nombre de usuario, contraseña, y código postal sean correctos.", - "ErrorMessageStartHourGreaterThanEnd": "La hora de finalización debe ser mayor que la hora de inicio.", + "ErrorStartHourGreaterThanEnd": "La hora de finalización debe ser mayor que la hora de inicio.", "ErrorGettingTvLineups": "Hubo un error al descargar la programación de TV. Por favor, asegúrate de que tu información sea correcta e inténtalo de nuevo.", - "ErrorDeletingItem": "Hubo un error eliminando el elemento del servidor Jellyfin. Por favor, verifica que el servidor Jellyfin tiene permisos de escritura en la carpeta del medio e inténtalo de nuevo.", + "ErrorDeletingItem": "Hubo un error eliminando el elemento del servidor. Por favor, verifica que Jellyfin tenga permisos de escritura en la carpeta del medio e inténtalo de nuevo.", "ErrorAddingXmlTvFile": "Hubo un error accediendo al archivo XMLTV. Por favor, asegúrate de que el archivo existe e inténtalo de nuevo.", "ErrorAddingTunerDevice": "Hubo un error al agregar el dispositivo sintonizador. Por favor, asegúrate de que esté disponible e inténtalo de nuevo.", - "ErrorAddingMediaPathToVirtualFolder": "Hubo un error agregando la ruta de medios. Por favor, asegúrate de que la ruta es válida y que el proceso del servidor Jellyfin tiene acceso a ese destino.", + "ErrorAddingMediaPathToVirtualFolder": "Hubo un error agregando la ruta de medios. Por favor, asegúrate de que la ruta es válida y que Jellyfin tiene acceso a ese destino.", "ErrorAddingListingsToSchedulesDirect": "Hubo un error agregando la programación de tu cuenta de Schedules Direct. Schedules Direct solo permite un numero limitado de programaciones por cuenta. Tal vez necesites acceder al sitio web de Schedules Direct y eliminar otras programaciones de tu cuenta antes de continuar.", "Episodes": "Episodios", "Episode": "Episodio", @@ -1317,9 +1220,7 @@ "EnableDetailsBannerHelp": "Mostrar una imagen banner en la parte superior de la página de detalles del elemento.", "EnableDetailsBanner": "Banner de detalles", "EnableThemeVideosHelp": "Reproducir videos temáticos en el fondo mientras se navega por la biblioteca.", - "EnableThemeVideos": "Videos temáticos", "EnableThemeSongsHelp": "Reproducir canciones temáticas en el fondo mientras se navega por la biblioteca.", - "EnableThemeSongs": "Canciones temáticas", "EnableStreamLoopingHelp": "Habilita esta opción si las transmisiones en vivo contienen solo unos pocos segundos de datos y necesitan ser solicitadas continuamente. Habilitar esto cuando no es requerido puede causar problemas.", "EnableStreamLooping": "Repetir automáticamente las transmisiones en vivo", "EnablePhotosHelp": "Las imágenes serán detectadas y mostradas junto con otros archivos multimedia.", @@ -1333,7 +1234,6 @@ "EnableColorCodedBackgrounds": "Fondos de colores codificados", "EnableCinemaMode": "Modo cine", "EnableBackdropsHelp": "Muestra imágenes de fondo en el fondo de algunas páginas mientras se navega por la biblioteca.", - "EnableBackdrops": "Imágenes de fondo", "EditSubtitles": "Editar subtítulos", "EditMetadata": "Editar metadatos", "EditImages": "Editar imágenes", @@ -1357,8 +1257,8 @@ "Disabled": "Desactivado", "Directors": "Directores", "DirectStreaming": "Transmisión directa", - "DirectStreamHelp2": "Transmitir directamente un archivo usa muy poco poder de procesamiento sin ninguna perdida en la calidad de video.", - "DirectStreamHelp1": "El medio es compatible con el dispositivo en cuanto a la resolución y tipo de medio (H.264, AC3, etc.), pero está en un contenedor de archivo incompatible (mkv, avi, wmv, etc.). El video será reempaquetado sobre la marcha antes de transmitirlo al dispositivo.", + "DirectStreamHelp2": "Transmitir directamente un archivo usa muy poco poder de procesamiento sin pérdida en la calidad de video.", + "DirectStreamHelp1": "El medio es compatible con el dispositivo en cuanto a la resolución y tipo de medio (H.264, AC3, etc.), pero está en un contenedor de archivo incompatible (mkv, avi, wmv, etc.). El video será reempaquetado sobre la marcha antes de ser enviado al dispositivo.", "DirectPlaying": "Reproducción directa", "DeviceAccessHelp": "Esto solo se aplica a los dispositivos que pueden ser identificados de manera única y no impedirá el acceso desde navegadores. Filtrar el acceso a los dispositivos de los usuarios les impedirá usar nuevos dispositivos hasta que hayan sido aprobados aquí.", "DetectingDevices": "Detectando dispositivos", @@ -1374,14 +1274,13 @@ "DeinterlaceMethodHelp": "Seleccione el método de desentrelazado que se usará al transcodificar contenido entrelazado.", "DefaultSubtitlesHelp": "Los subtítulos se cargan basados en los indicadores «por defecto» y «forzado» incluidos en los metadatos. Las preferencias de idioma son consideradas cuando hay múltiples opciones disponibles.", "DefaultMetadataLangaugeDescription": "Estos son sus valores por defecto y pueden ser personalizados en cada biblioteca.", - "DefaultErrorMessage": "Ha ocurrido un error al procesar la solicitud. Por favor, inténtalo de nuevo más tarde.", + "ErrorDefault": "Ha ocurrido un error al procesar la solicitud. Por favor, inténtalo de nuevo más tarde.", "Default": "Por defecto", "DeathDateValue": "Falleció: {0}", "DatePlayed": "Fecha de reproducción", "DateAdded": "Fecha de adición", "CustomDlnaProfilesHelp": "Crear un perfil personalizado para un nuevo dispositivo o reemplazar un perfil del sistema.", "CriticRating": "Calificación de los críticos", - "CopyStreamURLError": "Hubo un error al copiar la URL.", "CopyStreamURLSuccess": "URL copiada con éxito.", "CopyStreamURL": "Copiar la URL de la transmisión", "Continuing": "Continuando", @@ -1392,14 +1291,13 @@ "HeaderServerAddressSettings": "Configuración de la dirección del servidor", "HeaderSeriesStatus": "Estado de la serie", "HeaderSeriesOptions": "Opciones de serie", - "HeaderSeries": "Series", "HeaderSendMessage": "Enviar mensaje", - "HeaderSelectTranscodingPathHelp": "Explora o introduce la ruta a utilizar para los archivos temporales de transcodificación. Se debe tener permisos de escritura en dicha carpeta.", + "HeaderSelectTranscodingPathHelp": "Explora o introduce la ruta para los archivos de transcodificación. Se debe tener permisos de escritura en esa carpeta.", "HeaderSelectTranscodingPath": "Selecciona la ruta para los archivos temporales de transcodificación", "ConfirmDeleteItems": "Eliminar estos elementos los eliminará tanto del sistema como de tu biblioteca de medios. ¿Estás seguro de querer continuar?", "ConfirmDeleteItem": "Eliminar este elemento lo eliminará tanto del sistema como de tu biblioteca de medios. ¿Estás seguro de querer continuar?", "ConfirmDeleteImage": "¿Eliminar imagen?", - "ConfigureDateAdded": "Configura cómo se determina la fecha de adición en el panel de control del servidor Jellyfin en la configuración de la biblioteca", + "ConfigureDateAdded": "Configura cómo se determina la fecha de adición en el panel de control en la configuración de la biblioteca", "Composer": "Compositor", "CommunityRating": "Calificación de la comunidad", "ColorTransfer": "Transferencia de color", @@ -1415,88 +1313,61 @@ "CancelSeries": "Cancelar serie", "CancelRecording": "Cancelar grabación", "ButtonWebsite": "Sitio web", - "ButtonViewWebsite": "Ver sitio web", - "ButtonUp": "Arriba", "ButtonUninstall": "Desinstalar", "ButtonTrailer": "Trailer", "ButtonTogglePlaylist": "Lista de reproducción", - "ButtonToggleContextMenu": "Más", - "ButtonSubtitles": "Subtítulos", "ButtonSubmit": "Enviar", "ButtonSplit": "Dividir", "ButtonStop": "Detener", "ButtonStart": "Iniciar", - "ButtonSort": "Ordenar", "ButtonSignOut": "Cerrar sesión", "ButtonSignIn": "Iniciar sesión", "ButtonShutdown": "Apagar", - "ButtonShuffle": "Aleatorio", "ButtonSettings": "Configuración", "ButtonSend": "Enviar", "ButtonSelectView": "Seleccionar vista", "ButtonSelectServer": "Seleccionar servidor", "ButtonSelectDirectory": "Seleccionar directorio", - "ButtonSearch": "Búsqueda", "ButtonScanAllLibraries": "Escanear todas las bibliotecas", - "ButtonSave": "Guardar", "ButtonRevoke": "Revocar", "ButtonResume": "Continuar", "ButtonRestart": "Reiniciar", "ButtonResetPassword": "Restablecer contraseña", "ButtonResetEasyPassword": "Restablecer código PIN sencillo", - "ButtonRepeat": "Repetir", "ButtonRename": "Renombrar", "ButtonRemove": "Remover", "ButtonRefreshGuideData": "Actualizar datos de la guía", - "ButtonRefresh": "Actualizar", "ButtonQuickStartGuide": "Guía de inicio rápido", "ButtonProfile": "Perfil", "ButtonPreviousTrack": "Pista anterior", - "ButtonPlay": "Reproducir", "ButtonPause": "Pausar", "ButtonParentalControl": "Control parental", "ButtonOpen": "Abrir", "ButtonOk": "OK", - "ButtonOff": "Apagar", "ButtonNextTrack": "Pista siguiente", - "ButtonNew": "Nuevo", "ButtonNetwork": "Red", "ButtonMore": "Más", "ButtonManualLogin": "Inicio de sesión manual", "ButtonLibraryAccess": "Acceso a biblioteca(s)", - "ButtonLearnMore": "Aprender más", "ButtonInfo": "Info", - "ButtonHome": "Inicio", - "ButtonHelp": "Ayuda", "ButtonGuide": "Guía", "ButtonGotIt": "Hecho", "ButtonFullscreen": "Pantalla completa", "ButtonForgotPassword": "Olvidé mi contraseña", - "ButtonFilter": "Filtro", "ButtonEditOtherUserPreferences": "Editar el perfil, la imagen y las preferencias personales de este usuario.", - "ButtonEditImages": "Editar imágenes", - "ButtonEdit": "Editar", - "ButtonDownload": "Descargar", - "ButtonDown": "Abajo", - "ButtonDeleteImage": "Eliminar imagen", - "ButtonDelete": "Eliminar", - "ButtonConnect": "Conectar", "ButtonChangeServer": "Cambiar servidor", "ButtonCancel": "Cancelar", "ButtonBack": "Atrás", "ButtonAudioTracks": "Pistas de audio", - "ButtonArrowUp": "Arriba", "ButtonArrowRight": "Derecha", "ButtonArrowLeft": "Izquierda", - "ButtonArrowDown": "Abajo", "ButtonAddUser": "Agregar usuario", "ButtonAddServer": "Agregar servidor", "ButtonAddScheduledTaskTrigger": "Agregar disparador", "ButtonAddMediaLibrary": "Agregar biblioteca de medios", "ButtonAddImage": "Agregar imagen", - "ButtonAdd": "Agregar", "BurnSubtitlesHelp": "Determina si el servidor debería quemar los subtítulos al transcodificar videos. Evitar esto mejorará altamente el rendimiento del servidor. Seleccione Auto para grabar formatos basados en imágenes (VOBSUB, PGS, SUB, IDX...) y ciertos subtítulos ASS o SSA.", - "BrowsePluginCatalogMessage": "Explora nuestro catálogo de complementos para ver los complementos disponibles.", + "MessageBrowsePluginCatalog": "Explora nuestro catálogo de complementos para ver los complementos disponibles.", "Browse": "Explorar", "BoxRear": "Caja (parte trasera)", "Box": "Caja", @@ -1508,11 +1379,9 @@ "Banner": "Banner", "Backdrops": "Imágenes de fondo", "Backdrop": "Imagen de fondo", - "AutoBasedOnLanguageSetting": "Auto (basado en la configuración del idioma)", "Auto": "Auto", "AuthProviderHelp": "Selecciona un proveedor de autenticación que se utilizará para autenticar la contraseña de este usuario.", "Audio": "Audio", - "AttributeNew": "Nuevo", "AspectRatio": "Relación de aspecto", "AskAdminToCreateLibrary": "Pide a un administrador crear una biblioteca.", "Ascending": "Ascendente", @@ -1526,7 +1395,7 @@ "AlwaysPlaySubtitles": "Siempre reproducir", "AllowedRemoteAddressesHelp": "Lista separada por comas de direcciones IP/máscaras de red para las redes a las que se les permitirá conectarse remotamente. Si se deja en blanco, se les permitirá a todas las direcciones remotas.", "AllowRemoteAccessHelp": "Si no se marca, se bloquearán todas las conexiones remotas.", - "AllowRemoteAccess": "Permitir conexiones remotas a este servidor Jellyfin.", + "AllowRemoteAccess": "Permitir conexiones remotas a este servidor.", "AllowFfmpegThrottlingHelp": "Cuando una transcodificación o remuxeado se adelanta lo suficiente de la posición de reproducción actual, se pausa el proceso para que consuma menos recursos. Esto es más útil cuando se mira sin buscar con frecuencia. Apaga esto si experimentas problemas de reproducción.", "AllowFfmpegThrottling": "Regular transcodificaciones", "AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados pueden extraerse de los videos y entregarse a los clientes en texto plano para ayudar a evitar la transcodificación de video. En algunos sistemas, esto puede tardar mucho tiempo y provocar que la reproducción de video se detenga durante el proceso de extracción. Deshabilite esta opción para que los subtítulos incrustados se graben con transcodificación de video cuando no estén soportados de forma nativa por el dispositivo cliente.", @@ -1541,10 +1410,10 @@ "AllChannels": "Todos los canales", "All": "Todo", "Alerts": "Alertas", - "EnableBlurhash": "Habilitar marcadores de posición borrosos para imágenes", + "EnableBlurHash": "Habilitar marcadores de posición borrosos para imágenes", "ShowMore": "Mostrar más", "ShowLess": "Mostrar menos", - "EnableBlurhashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso", + "EnableBlurHashHelp": "Las imágenes que aún se están cargando se mostrarán con uno temporal.", "ButtonSyncPlay": "SyncPlay", "MessageNoGenresAvailable": "Permitir a algunos proveedores de metadatos obtener géneros desde Internet.", "MessageAddRepository": "Si desea agregar un repositorio, haga clic en el botón al lado del encabezado y complete la información solicitada.", @@ -1564,5 +1433,14 @@ "ButtonCast": "Emitir", "Writers": "Escritores", "ViewAlbumArtist": "Ver Álbum de Artista", - "TabRepositories": "Repositorios" + "TabRepositories": "Repositorios", + "NextTrack": "Saltar al siguiente", + "LabelUnstable": "Inestable", + "Preview": "Vista previa", + "SubtitleVerticalPositionHelp": "Número de línea donde aparece el texto. Números positivos representan de arriba hacia abajo. Números negativos representan de abajo hacia arriba.", + "LabelSubtitleVerticalPosition": "Posición vertical:", + "PreviousTrack": "Saltar al anterior", + "MessageGetInstalledPluginsError": "Ocurrió un error buscando la lista de complementos instalados.", + "MessagePluginInstallError": "Ocurrió un error instalando el complemento.", + "PlaybackRate": "Tasa de reproducción" } diff --git a/src/strings/fa.json b/src/strings/fa.json index 3b3cb07e00..c68bab1124 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -7,16 +7,10 @@ "Browse": "مرور کردن", "ButtonAddUser": "افزودن کاربر", "ButtonCancel": "لغو کردن", - "ButtonDeleteImage": "حذف عکس", - "ButtonFilter": "فیلتر", - "ButtonNew": "جدید", "ButtonOk": "خوب", - "ButtonPlay": "پخش", "ButtonQuickStartGuide": "راهنمای شروع سریع", "ButtonResetPassword": "تنظیم مجدد رمز", - "ButtonSave": "ذخیره", "ButtonSignOut": "Sign out", - "ButtonSort": "مرتب سازی", "DeleteMedia": "حذف رسانه", "Disabled": "غیرفعال شده", "FolderTypeBooks": "کتاب‌ها", @@ -24,18 +18,15 @@ "FolderTypeMusic": "موسیقی‌ها", "FolderTypeMusicVideos": "موزیک ویدیوها", "FolderTypeTvShows": "سریال‌های تلویزیونی", - "HeaderAddUser": "اضافه کردن کاربر", "HeaderContinueWatching": "ادامه تماشا", "HeaderCustomDlnaProfiles": "پروفایل های سفارشی", "HeaderDeviceAccess": "دسترسی دستگاه", "HeaderEasyPinCode": "پین کد آسان", "HeaderFetcherSettings": "تنظیمات ورودی", - "HeaderFilters": "فیلتر ها", "HeaderImageOptions": "گزینه های تصویر", "HeaderInstantMix": "درهم کردن فوری", "HeaderKodiMetadataHelp": "برای فعال یا غیرفعال سازی ابرداده‌های Nfo ، یک کتابخانه را در صفحه تنظیم کتابخانه Jellyfin ویرایش کرده و قسمت سرورهای ابرداده را مسیردهی کنید.", "HeaderLatestEpisodes": "آخرین قسمت ها", - "HeaderNextUp": "قسمت بعدی", "HeaderPaths": "مسیرها", "HeaderPlayAll": "پخش همه", "HeaderPreferredMetadataLanguage": "زبان مدنظر اطلاعات محتوی", @@ -50,21 +41,17 @@ "LabelCurrentPassword": "رمز فعلی:", "LabelCustomCertificatePath": "مسیر اختصاصی گواهینامه SSL:", "LabelCustomCertificatePathHelp": "پچ به فایل PKCS #12 حاوی یک گواهینامه و کلید خصوصی است تا پشتیبانی از TLS را در یک دامنه شخصی فعال کند.", - "LabelDisplayMissingEpisodesWithinSeasons": "نمایش قسمت های ناموجود در بین فصل ها", "LabelFinish": "پایان", "LabelLanguage": "زبان:", "LabelMaxParentalRating": "حداکثر امتیاز سنی مجاز والدین:", "LabelNewPassword": "رمز جدید:", "LabelNewPasswordConfirm": "تایید رمز جدید:", - "LabelNext": "بعدی", - "LabelPrevious": "قبلی", "LabelProfileCodecsHelp": "جدا شده توسط کاما این می تواند برای همه کدک ها اعمال شود.", "LabelSaveLocalMetadata": "پوستر در پوشه مدیا ذخیره گردد", "LabelSaveLocalMetadataHelp": "ذخیره ی پوستر ها داخل پوشه های رسانه، امکان ویرایش آسان آنها را در یک مکان میسر میکند.", "LabelSelectUsers": "انتخاب کاربران:", "LabelTimeLimitHours": "محدودیت زمان (ساعت):", "LabelTypeMetadataDownloaders": "{0} دانلود کننده فراداده:", - "LabelYourFirstName": "اسم کوچک شما:", "LabelYoureDone": "به پایان رسید!", "LibraryAccessHelp": "انتخاب پوشه های رسانه برای اشتراک گذاری با این کاربر. مدیر سیستم میتواند با استفاده از مدیریت متاداده همه ی پوشه ها را ویرایش کند.", "ManageLibrary": "مدیریت کتابخانه", @@ -73,7 +60,7 @@ "MessagePleaseEnsureInternetMetadata": "لطفا مطمئن شوید دانلود متاداده از اینترنت فعال است.", "MoreUsersCanBeAddedLater": "بعدا میتوانید کاربران بیشتری را در داشبورد اضافه کنید.", "NextUp": "بعدی چیه", - "NoNextUpItemsMessage": "چیزی یافت نشد. دیدن سریال ها یتان را شروع کنید!", + "MessageNoNextUpItems": "چیزی یافت نشد. دیدن سریال ها یتان را شروع کنید!", "OptionAscending": "صعودی", "OptionDescending": "نزولی", "OptionDislikes": "پسندیده نشده ها", @@ -88,23 +75,11 @@ "ShowAdvancedSettings": "نمایش تنظیمات پیشرفته", "TabAccess": "دسترسی", "TabAdvanced": "پیشرفته", - "TabAlbumArtists": "هنرمندان آلبوم", - "TabAlbums": "آلبوم ها", - "TabArtists": "هنرمندان", - "TabEpisodes": "قسمت ها", - "TabGenres": "ژانرها", "TabLatest": "جدیدترین‌ها", - "TabMetadata": "فراداده", - "TabMusicVideos": "موزیک ویدیوها", "TabNetworks": "شبکه ها", "TabNotifications": "اعلان ها", - "TabPassword": "رمز عبور", - "TabPlaylist": "لیست پخش", "TabProfile": "پروفایل", "TabProfiles": "پروفایل ها", - "TabShows": "سریال ها", - "TabSongs": "آهنگ ها", - "TabSuggestions": "پیشنهادها", "TabUpcoming": "بزودی", "TellUsAboutYourself": "در مورد خودتان به ما بگویید", "ThisWizardWillGuideYou": "این عمل برای انجام تنظیمات به شما کمک می‌کند. برای شروع، لطفا زبان مورد نظر خود را انتخاب کنید.", @@ -125,7 +100,6 @@ "HeaderFavoriteAlbums": "آلبوم‌های مورد علاقه", "HeaderFavoriteArtists": "هنرمندان مورد علاقه", "HeaderFavoriteSongs": "آهنگ‌های مورد علاقه", - "HeaderLiveTV": "پخش زنده", "Movies": "فیلم‌ها", "Photos": "عکس‌ها", "Playlists": "لیست‌های پخش", @@ -141,58 +115,41 @@ "Add": "افزودن", "Actor": "بازیگر", "AccessRestrictedTryAgainLater": "دسترسی در حال حاضر محدود شده است. لطفا دوباره تلاش کنید.", - "ButtonShuffle": "مخلوط کردن", "ButtonSettings": "تنظیمات", "ButtonSend": "ارسال", "ButtonSelectView": "انتخاب نما", "ButtonSelectServer": "انتخاب سرور", - "ButtonSearch": "جستجو", "ButtonScanAllLibraries": "اسکن تمام کتابخانه‌ها", "ButtonRevoke": "ابطال", "ButtonResume": "ادامه", "ButtonRestart": "راه اندازی مجدد", "ButtonResetEasyPassword": "بازنشانی کد پین آسان", - "ButtonRepeat": "تکرار", "ButtonRename": "تغییر نام", "ButtonRemove": "حذف", "ButtonRefreshGuideData": "به‌روز‌رسانی داده‌ی راهنما", - "ButtonRefresh": "به‌روز‌رسانی", "ButtonProfile": "نمایه", "ButtonNextTrack": "ترانه پسین", "ButtonPreviousTrack": "ترانه پیشین", "ButtonPause": "مکث", "ButtonParentalControl": "رتبه بندی والدین", "ButtonOpen": "باز", - "ButtonOff": "خاموش", "ButtonNetwork": "شبکه", "ButtonMore": "بیشتر", "ButtonManualLogin": "ورود دستی", "ButtonLibraryAccess": "دسترسی به کتابخانه", - "ButtonLearnMore": "بیشتر بدانید", "ButtonInfo": "اطلاعات", - "ButtonHome": "خانه", - "ButtonHelp": "کمک", "ButtonGuide": "راهنما", "ButtonGotIt": "متوجه شدم", "ButtonFullscreen": "تمام صفحه", "ButtonForgotPassword": "فراموشی گذرواژه", - "ButtonEditImages": "ویرایش عکس‌ها", - "ButtonEdit": "ویرایش", - "ButtonDownload": "بارگیری", - "ButtonDown": "پایین", - "ButtonDelete": "حذف", - "ButtonConnect": "اتصال", "ButtonChangeServer": "تغییر سرور", "ButtonBack": "بازگشت", - "ButtonArrowUp": "بالا", "ButtonArrowRight": "راست", "ButtonArrowLeft": "چپ", - "ButtonArrowDown": "پایین", "ButtonAddServer": "افزودن سرور", "ButtonAddScheduledTaskTrigger": "افزودن راه انداز", "ButtonAddMediaLibrary": "افزودن کتابخانه رسانه", "ButtonAddImage": "افزودن تصویر", - "ButtonAdd": "افزودن", "BoxRear": "جعبه (پشت)", "Box": "جعبه", "Blacklist": "لیست سیاه", @@ -202,10 +159,8 @@ "Banner": "سرصفحه", "Backdrops": "پس زمینه‌ها", "Backdrop": "پس زمینه", - "AutoBasedOnLanguageSetting": "خودکار (بر اساس تنظیمات زبانی)", "Auto": "خودکار", "Audio": "صدا", - "AttributeNew": "جدید", "AspectRatio": "نسبت ابعاد", "AskAdminToCreateLibrary": "از کاربر مدیر بخواهید که یک کتابخانه ایجاد کند.", "Ascending": "بالا رونده", @@ -225,12 +180,10 @@ "AddToCollection": "افزودن به مجموعه", "ExitFullscreen": "خروج از تمام صفحه", "EveryNDays": "هر {0} روز", - "ErrorMessageStartHourGreaterThanEnd": "زمان پایان باید پس از زمان شروع باشد.", + "ErrorStartHourGreaterThanEnd": "زمان پایان باید پس از زمان شروع باشد.", "Episodes": "قسمت‌ها", "EndsAtValue": "تمام شده در {0}", "Ended": "تمام شده", - "EnableThemeVideos": "تم فیلم‌ها", - "EnableThemeSongs": "آهنگ‌های تم", "EnableStreamLooping": "چرخش خودکار پخش‌های زنده", "EnablePhotos": "نمایش عکس‌ها", "EnableNextVideoInfoOverlay": "نمایش اطلاعات ودیوی بعدی حین پخش ویدیو", @@ -239,7 +192,6 @@ "EnableExternalVideoPlayers": "پخش کننده ویدیوی خارجی", "EnableDisplayMirroring": "نمایش آینه", "EnableCinemaMode": "حالت سینما", - "EnableBackdrops": "پشت‌زمینه‌ها", "EditSubtitles": "ویرایش زیرنویس‌ها", "EditMetadata": "ویرایش فراداده", "EditImages": "ویرایش عکس‌ها", @@ -272,13 +224,12 @@ "DeleteDeviceConfirmation": "آیا از حذف این دستگاه اطمینان دارید؟ هنگامی که یک کاربر دوباره با آن دستگاه وارد شود، دوباره نمایش داده می‌شود.", "Delete": "حذف", "DefaultMetadataLangaugeDescription": "این موارد پیشفرض‌های شماست و می‌توانید برای هر کتابخانه آن را شخصی سازی کنید.", - "DefaultErrorMessage": "خطایی در پردازش درخواست رخ داد. لطفا اندکی بعد دوباره تلاش کنید.", + "ErrorDefault": "خطایی در پردازش درخواست رخ داد. لطفا اندکی بعد دوباره تلاش کنید.", "Default": "پیشفرض", "DeathDateValue": "تلف شد: {0}", "DatePlayed": "تاریخ پخش شده", "DateAdded": "تاریخ اضافه شده", "CriticRating": "امتیاز منتقدان", - "CopyStreamURLError": "در کپی کردن آدرس خطایی رخ داد.", "CopyStreamURLSuccess": "آدرس با موفقیت کپی شد.", "CopyStreamURL": "کپی آدرس پخش", "Continuing": "ادامه", @@ -299,11 +250,8 @@ "CancelSeries": "لغو سریال‌ها", "CancelRecording": "لغو ضبط", "ButtonWebsite": "وبسایت", - "ButtonViewWebsite": "بازدید وبسایت", - "ButtonUp": "بالا", "ButtonUninstall": "حذف نصب", "ButtonTrailer": "تریلر", - "ButtonSubtitles": "زیرنویس‌ها", "ButtonSubmit": "تایید", "ButtonSplit": "جدا کردن", "ButtonStop": "توقف", @@ -312,7 +260,7 @@ "ButtonShutdown": "خاموش", "ButtonSelectDirectory": "انتخاب مسیر", "ButtonEditOtherUserPreferences": "نمایه، تصویر و ترجیحات شخصی این کاربر را ویرایش کنید.", - "BrowsePluginCatalogMessage": "برای مرور کردن افزونه‌های موجود، به فروشگاه افزونه‌های ما سر بزنید.", + "MessageBrowsePluginCatalog": "برای مرور کردن افزونه‌های موجود، به فروشگاه افزونه‌های ما سر بزنید.", "AuthProviderHelp": "ارائه دهنده تأیید اعتبار را انتخاب کنید تا برای تأیید اعتبار گذرواژه این کاربر استفاده شود.", "HeaderRecordingPostProcessing": "در حال ضبط پس پردازش", "HeaderRecordingOptions": "گزینه‌های ضبط", @@ -326,7 +274,6 @@ "HeaderPlayOn": "پخش در", "HeaderPinCodeReset": "بازنشانی پین کد", "HeaderPhotoAlbums": "آلبوم‌های عکس", - "HeaderPeople": "افراد", "HeaderPasswordReset": "بازنشانی گذرواژه", "HeaderPassword": "گذرواژه", "HeaderParentalRatings": "رتبه بندی والدین", @@ -341,15 +288,12 @@ "HeaderMyDevice": "دستگاه‌های من", "HeaderMusicVideos": "موزیک ویدیوها", "HeaderMusicQuality": "کیفیت آهنگ", - "HeaderMovies": "فیلم‌ها", "HeaderMoreLikeThis": "موارد مشابه با این", "HeaderMetadataSettings": "تنظیمات ابرداده", - "HeaderMediaInfo": "اطلاعات رسانه", "HeaderMediaFolders": "پوشه‌های رسانه", "HeaderMedia": "رسانه", "HeaderLoginFailure": "ورود ناموفق", "HeaderLiveTvTunerSetup": "تنظیم تلویزیون زنده", - "HeaderLiveTv": "تلویزیون زنده", "HeaderLibrarySettings": "تنظیمات کتابخانه", "HeaderLibraryOrder": "ترتیت کتابخانه", "HeaderLibraryFolders": "پوشه‌های کتابخانه", @@ -361,7 +305,6 @@ "HeaderLatestMedia": "جدیدترین‌ رسانه‌ها", "HeaderKeepSeries": "سریال ادامه دهید", "HeaderKeepRecording": "ضبط را ادامه دهید", - "HeaderItems": "آیتم‌ها", "HeaderInstall": "نصب", "HeaderImageSettings": "تنظیمات عکس", "HeaderIdentifyItemHelp": "یک یا بیشتر مورد برای جستجو وارد کنید. موارد را حذف کنید تا نتیجه جستجو را افزایش دهید.", @@ -369,14 +312,10 @@ "HeaderIdentificationCriteriaHelp": "حداقل یک مورد تعیین هویت وارد کنید.", "HeaderIdentification": "تعیین هویت", "HeaderHttpHeaders": "سرفصل‌های HTTP", - "HeaderHome": "خانه", "HeaderGuideProviders": "ارائه دهنده داده راهنمای تلویزیونی", - "HeaderGenres": "ژانرها", "HeaderFrequentlyPlayed": "اغلب پخش شده", - "HeaderForgotPassword": "فراموشی گذرواژه", "HeaderForKids": "برای کودکان", "HeaderFetchImages": "دریافت عکس‌ها:", - "HeaderFeatures": "برجسته‌ها", "HeaderFeatureAccess": "دسترسی‌های برجسته", "HeaderFavoriteVideos": "ویدیو‌های مورد علاقه", "HeaderFavoritePeople": "افراد مورد علاقه", @@ -384,12 +323,10 @@ "HeaderFavoriteBooks": "کتاب‌های مورد علاقه", "HeaderExternalIds": "ID های خارجی:", "HeaderError": "خطا", - "HeaderEpisodes": "قسمت‌ها", "HeaderEnabledFieldsHelp": "یک فیلد را برای جلوگیری از تغییر در داده‌ی آن علامت بزنید تا قفل بشود.", "HeaderEnabledFields": "فیلد‌های فعال شده", "HeaderEditImages": "ویرایش عکس‌ها", "HeaderDownloadSync": "بارگیری و همگام‌سازی", - "HeaderDisplay": "نمایش", "HeaderDirectPlayProfileHelp": "نمایه‌ی پخش مستقیم را اضافه کنید تا مشخص کنید با چه فرمی دستگاه می‌تواند محلی برخورد کند.", "HeaderDirectPlayProfile": "نمایه‌ی پخش مستقیم", "HeaderDevices": "دستگاه‌ها", @@ -405,19 +342,15 @@ "HeaderCodecProfileHelp": "نمایه‌های کدک محدودیت‌های یک دستگاه را هنگام پخش کدک‌های خاص نشان می‌دهد. اگر محدودیتی اعمال شود، رسانه‌ها کد گذاری می‌شوند ، حتی اگر کدک برای پخش مستقیم پیکربندی شده باشد.", "HeaderCodecProfile": "نمایه کدک", "HeaderChapterImages": "عکس‌های سکانس", - "HeaderChannels": "کانال‌ها", "HeaderChannelAccess": "دسترسی به کانال", - "HeaderCastCrew": "بازیگران و کارکنان", "HeaderCastAndCrew": "بازیگران و کارکنان", "HeaderCancelSeries": "لغو سریال", "HeaderCancelRecording": "لغو ضبط", - "HeaderBooks": "کتاب‌ها", "HeaderBlockItemsWithNoRating": "موارد مسدود شده با نقص یا عدم وجود اطلاعات امتیاز:", "LabelSkipIfAudioTrackPresentHelp": "این گزینه را عدم انتخاب کنید تا اطمینان حاصل کنید که همه ویدیوها فارغ از زبان صوت، زیرنویس دارند.", "LabelSkipIfAudioTrackPresent": "اگر صدای پیش‌فرض با زبان دانلودی یکسان است پرش کن", "LabelSkipForwardLength": "میزان رفتن به جلو:", "LabelSkipBackLength": "میزان بازگشت به عقب:", - "LabelSkin": "پوسته:", "LabelSize": "سایز:", "LabelSimultaneousConnectionLimit": "محدودیت پخش همزمان:", "LabelServerName": "نام سرور:", @@ -433,7 +366,6 @@ "ButtonAudioTracks": "آهنگ‌ها", "AlbumArtist": "هنرمند آلبوم", "Album": "آلبوم", - "HeaderAddScheduledTaskTrigger": "افزودن فعال‌ساز", "HeaderActivity": "فعالیت‌ها", "HeaderActiveRecordings": "ضبط‌های فعال", "HeaderActiveDevices": "دستگاه‌های فعال", @@ -468,9 +400,7 @@ "FolderTypeUnset": "محتواهای مخلوط", "TabMyPlugins": "افزونه‌های من", "TabMusic": "موسیقی‌ها", - "TabMovies": "فیلم‌ها", "TabLogs": "واقعه نگار‌ها", - "TabLiveTV": "تلویزیون زنده", "LatestFromLibrary": "جدیدترین‌های {0}", "Large": "بزرگ", "LabelffmpegPath": "مسیر FFmpeg:", @@ -520,7 +450,7 @@ "Unrated": "بدون امتیاز", "Unplayed": "پخش نشده", "Unmute": "صدادار", - "UninstallPluginHeader": "حذف نصب افزونه", + "HeaderUninstallPlugin": "حذف نصب افزونه", "UninstallPluginConfirmation": "آیا اطمینان دارید که می‌خواهید {0} را حذف نصب کنید؟", "Uniform": "یکپارچه", "Tuesday": "سه‌شنبه", @@ -537,7 +467,6 @@ "ThemeSongs": "آهنگ‌های تم", "TagsValue": "برچسب‌ها: {0}", "Tags": "برچسب‌ها", - "TabUsers": "کاربران", "Absolute": "کامل", "Writer": "نویسنده", "Whitelist": "لیست سفید", @@ -545,7 +474,6 @@ "Watched": "مشاهده شده", "ViewPlaybackInfo": "مشاهده اطلاعات پخش", "ViewAlbum": "مشاهده آلبوم", - "VideoRange": "محدوده ویدیو", "Vertical": "عمودی", "ValueVideoCodec": "کدک ویدیو: {0}", "ValueTimeLimitSingleHour": "محدودیت زمانی: 1 ساعت", @@ -566,9 +494,7 @@ "ValueDiscNumber": "دیسک {0}", "LabelImportOnlyFavoriteChannels": "محدود کردن کانال‌هایی که به عنوان مورد علاقه انتخاب شده‌اند", "LabelDateAdded": "تاریخ اضافه شده:", - "LabelDashboardTheme": "تم داشبورد سرور:", "LabelCustomRating": "امتیازدهی سفارشی:", - "LabelCustomDeviceDisplayName": "نام نمایشی:", "LabelCustomCssHelp": "ظاهر سفارشی مورد نظر خود را در رابط وب اعمال کنید.", "LabelCustomCss": "CSS سفارشی:", "LabelCriticRating": "امتیاز منتقدان:", @@ -580,7 +506,6 @@ "LabelHomeNetworkQuality": "کیفیت شبکه خانگی:", "LabelHardwareAccelerationTypeHelp": "تسریع کننده سخت افزاری نیاز به پیکربندی اضافی دارد.", "LabelSupportedMediaTypes": "نوع‌ رسانه‌های پشتیبانی شده:", - "LabelSubtitles": "زیرنویس‌ها", "LabelSubtitlePlaybackMode": "حالت زیرنویس:", "LabelSubtitleFormatHelp": "مثال: srt", "LabelSubtitleDownloaders": "دانلود کننده زیرنویس:", @@ -592,7 +517,6 @@ "LabelSportsCategories": "دسته‌بندی‌های ورزشی:", "LabelSpecialSeasonsDisplayName": "نام نمایشی فصل مخصوص:", "LabelSource": "منبع:", - "LabelSoundEffects": "جلوه‌های صدا:", "LabelSortTitle": "مرتب‌سازی عنوان:", "LabelSortOrder": "ترتیب مرتب‌سازی:", "LabelSortBy": "مرتب‌سازی بر اساس:", @@ -611,12 +535,9 @@ "AdditionalNotificationServices": "برای نصب سرویس‌های اعلان اضافی، در فروشگاه افزونه‌ها جستجو کنید.", "OptionThumbCard": "کارت بندانگشتی", "OptionThumb": "بندانگشتی", - "OptionThursday": "پنجشنبه", - "OptionSunday": "یکشنبه", "OptionSubstring": "زیررشته", "OptionSpecialEpisode": "ویژه‌ها", "OptionSaveMetadataAsHidden": "ذخیره فراداده‌ها و عکس‌ها به عنوان فایل‌های پنهان", - "OptionSaturday": "شنبه", "OptionRuntime": "زمان اجرا", "OptionResumable": "قابل از سرگیری", "OptionResElement": "عنصر res", @@ -637,21 +558,12 @@ "OptionParentalRating": "رتبه بندی والدین", "OptionOnInterval": "در یک فاصله", "BookLibraryHelp": "کتاب‌های صوتی و متنی پشتیبانی می‌شوند. {0} راهنمای نامگذاری کتاب {1} را مرور کنید.", - "TabInfo": "اطلاعات", - "TabGuide": "راهنما", - "TabFavorites": "مورد علاقه‌ها", - "TabDisplay": "نمایش", "TabDirectPlay": "پخش مستقیم", - "TabDevices": "دستگاه‌ها", "TabDashboard": "داشبورد", - "TabCollections": "مجموعه‌ها", "TabCodecs": "کدک‌ها", - "TabChannels": "کانال‌ها", "TabCatalog": "فهرست", "TV": "تلویزیون", "Sunday": "یکشنبه", - "TabTranscoding": "کدگذاری", - "TabTrailers": "تریلرها", "Suggestions": "پیشنهادها", "Subtitles": "زیرنویس‌ها", "Studios": "استودیو‌ها", @@ -665,19 +577,13 @@ "Smaller": "کوچکتر", "Small": "کوچک", "ButtonTogglePlaylist": "لیست پخش", - "ButtonToggleContextMenu": "بیشتر", "TheseSettingsAffectSubtitlesOnThisDevice": "این تنظیمات روی زیرنویس‌ها در این دستگاه تأثیر می‌گذارد", "TabStreaming": "در حال پخش", "TabSettings": "تنظیمات", "TabServer": "سرور", - "TabSeries": "سریال‌ها", "TabScheduledTasks": "وظایف زمان بندی شده", - "TabResumeSettings": "ادامه", "TabResponses": "پاسخ‌ها", - "TabRecordings": "ضبط‌ها", "TabPlugins": "افزونه‌ها", - "TabPlaylists": "لیست‌های پخش", - "TabPlayback": "پخش", "TabParentalControl": "رتبه بندی والدین", "TabOther": "سایر", "TabNfoSettings": "تنظیمات NFO", @@ -694,11 +600,9 @@ "MessageNoAvailablePlugins": "افزونه‌ای موجود نیست.", "MessageItemsAdded": "آیتم‌ها اضافه شدند.", "MessageItemSaved": "آیتم ذخیره شد.", - "MessageUnauthorizedUser": "در حال حاضر مجاز به دسترسی به سرور نیستید. لطفا برای اطلاعات بیشتر با مدیر سرور خود تماس بگیرید.", "MessageInvalidUser": "نام کاربری یا گذرواژه نامعتبر است. لطفا دوباره تلاش کنید.", "MessageInvalidForgotPasswordPin": "کد پین نامعتبر یا منقضی شده وارد شد. لطفا دوباره تلاش کنید.", - "MessageInstallPluginFromApp": "این افزونه باید از داخل برنامه‌ای که قصد استفاده از آن را دارید نصب شود.", - "PasswordResetHeader": "بازنشانی گذرواژه", + "HeaderResetPassword": "بازنشانی گذرواژه", "PasswordResetConfirmation": "آیا واقعا تمایل به بازنشانی گذرواژه دارید؟", "PasswordResetComplete": "گذرواژه بازنشانی شد.", "PasswordMatchError": "گذرواژه و تکرار گذرواژه باید یکسان باشند.", @@ -706,16 +610,13 @@ "PackageInstallCompleted": "{0} (نسخه {1})نصب به پایان رسید.", "PackageInstallCancelled": "{0} ( نسخه {1})نصب لغو شد.", "Overview": "بررسی اجمالی", - "OtherArtist": "هنرمند دیگر", "OriginalAirDateValue": "زمان پخش اصلی : {0}", "OptionWeekly": "هفتگی", "OptionWeekends": "آخر هفته ها", "OptionWeekdays": "روز های هفته", - "OptionWednesday": "چهارشنبه", "OptionWakeFromSleep": "از خواب بیدار شدن", "OptionUnairedEpisode": "قسمت های پخش نشده", "OptionTvdbRating": "نمره TVDB", - "OptionTuesday": "سه شنبه", "OptionTrackName": "نام ترک", "OptionRequirePerfectSubtitleMatchHelp": "نتیجه کامل زیرنویس ها را به صورتی فیلتر می کند که فقط مواردی را که دقیقا با فایل تصویری شما آزمایش و تأیید شده اند ،شامل شود. حذف این گزینه احتمال بارگیری زیرنویس ها را افزایش می دهد ، اما شانس متن زیرنویس ناهماهنگ یا غلط نیز افزایش می یابد.", "ServerNameIsShuttingDown": "سرور جلی فین - {0} در حال خاموش شدن می باشد.", @@ -743,7 +644,7 @@ "Refresh": "به‌روز‌رسانی", "Recordings": "ضبط شده ها", "RecordingScheduled": "ضبط برنامه ریزی شد.", - "RecordingPathChangeMessage": "با تغییر محل ذخیره فایل های ضبط شده، فایل های موجود به صورت خودکار منتقل نمی شوند. در صورت نیاز، شما باید خودتان این کار را انجام دهید.", + "MessageChangeRecordingPath": "با تغییر محل ذخیره فایل های ضبط شده، فایل های موجود به صورت خودکار منتقل نمی شوند. در صورت نیاز، شما باید خودتان این کار را انجام دهید.", "RecordingCancelled": "ضبط شدن لغو شد.", "RecordSeries": "ضبط کردن سریال ها", "Record": "ضبط کردن", @@ -754,7 +655,6 @@ "RecentlyWatched": "اخیرا مشاهده شده", "Rate": "ارزیابی کن", "Raised": "مطرح شده", - "QueueAllFromHere": "همه را از اینجا در صف قرار بده", "Quality": "کیفیت", "Programs": "برنامه ها", "ProductionLocations": "محل تولید", @@ -767,7 +667,7 @@ "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "این از اطلاعات قسمت در فراداده های تعبیه شده در صورت موجود استفاده می کند.", "PreferEmbeddedTitlesOverFileNamesHelp": "این عنوان نمایش را به صورت پیش فرض تعیین می کند، زمانی که فراداده اینترنتی یا محلی موجود نباشند.", "PreferEmbeddedTitlesOverFileNames": "عنوان های تعبیه شده را به نام فایل ترجیح بده", - "PluginInstalledMessage": "افزونه با موفقیت نصب شد. برای اعمال تغییرات سرور جلیفین نیاز به بارگذاری مجدد دارد.", + "MessagePluginInstalled": "افزونه با موفقیت نصب شد. برای اعمال تغییرات سرور جلیفین نیاز به بارگذاری مجدد دارد.", "PleaseSelectTwoItems": "لطفا حداقل دو مورد را انتخاب کنید.", "PleaseRestartServerName": "لطفا سرور جلیفین را دوباره بارگذاری کنید - {0}.", "PleaseEnterNameOrId": "لطفا یک نام یا شناسه خارجی را وارد کنید.", @@ -794,10 +694,8 @@ "LabelSeasonNumber": "شماره فصل:", "ConfigureDateAdded": "تنظیم کنید که چگونه تاریخ اضافه شده در داشبورد سرور Jellyfin تحت تنظیمات کتابخانه تعیین می‌شود", "CinemaModeConfigurationHelp": "حالت سینما تجربه تئاتر گونه را مستقیم به اتاق نشیمن شما می‌آورد با قابلیت پخش تریلرها و پیش نمایش‌ها قبل از سایر ویژگی‌های اصلی.", - "LaunchWebAppOnStartup": "نمای وب هنگامی که سرور آغاز به کار می‌کند باز بشود", - "NoSubtitles": "خالی", "NoSubtitleSearchResultsFound": "نتیجه‌ای یافت نشد.", - "NoPluginConfigurationMessage": "این افزونه هیچ تنظیماتی برای پیکربندی ندارد.", + "MessageNoPluginConfiguration": "این افزونه هیچ تنظیماتی برای پیکربندی ندارد.", "No": "خیر", "Next": "بعدی", "News": "اخبار", @@ -813,7 +711,6 @@ "MusicArtist": "هنرمند موسیقی", "MusicAlbum": "آلبوم موسیقی", "Movie": "فیلم", - "AddItemToCollectionHelp": "افزودن موارد به مجموعه ها با جستجوی آنها و استفاده از منوهای راست کلیک یا ضربه بزنید تا آنها را به مجموعه اضافه کنید.", "AllowFfmpegThrottlingHelp": "هنگامی که یک transcode یا remux به اندازه کافی پیش از موقعیت پخش فعلی می شود ، روند را متوقف می کند تا منابع کمتری مصرف کند. این بیشتر مفید است در هنگام تماشای بدون به دنبال اغلب. اگر مسائل مربوط به پخش را تجربه کنید ، این را خاموش کنید.", "DefaultSubtitlesHelp": "زیرنویس ها بر اساس پرچم های پیش فرض و اجباری در ابرداده تعبیه شده بارگذاری می شوند. تنظیمات زبان در نظر گرفته می شوند زمانی که گزینه های متعدد در دسترس هستند.", "DeinterlaceMethodHelp": "روش deinterlacing برای استفاده از زمانی که transcoding محتوای هم آمیختن را انتخاب کنید.", @@ -844,7 +741,6 @@ "HeaderSelectTranscodingPath": "Select Transcoding Temporary Path", "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.", "LabelArtistsHelp": "Separate multiple using ;", - "LabelAudio": "Audio", "LabelAudioBitDepth": "Audio bit depth:", "LabelAudioBitrate": "Audio bitrate:", "LabelAudioChannels": "Audio channels:", @@ -934,7 +830,6 @@ "RefreshMetadata": "Refresh metadata", "RefreshQueued": "Refresh queued.", "ReleaseDate": "Release date", - "ReleaseGroup": "Release Group", "RememberMe": "Remember Me", "RemoveFromCollection": "Remove from collection", "RemoveFromPlaylist": "Remove from playlist", @@ -951,7 +846,6 @@ "HeaderAddUpdateImage": "Add/Update Image", "HeaderAdditionalParts": "Additional Parts", "HeaderAdmin": "Admin", - "HeaderAlbums": "Albums", "HeaderAlert": "Alert", "HeaderAllowMediaDeletionFrom": "Allow Media Deletion From", "HeaderApiKey": "API Key", @@ -1004,7 +898,6 @@ "OptionAllowVideoPlaybackTranscoding": "Allow video playback that requires transcoding", "OptionArtist": "Artist", "OptionAuto": "Auto", - "OptionAutomatic": "Auto", "OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders", "OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.", "OptionBanner": "Banner", @@ -1054,7 +947,6 @@ "OptionEveryday": "Every day", "OptionExternallyDownloaded": "External download", "OptionExtractChapterImage": "Enable chapter image extraction", - "OptionFriday": "Friday", "OptionHasSpecialFeatures": "Special Features", "OptionHasSubtitles": "Subtitles", "OptionHasThemeSong": "Theme Song", @@ -1063,13 +955,11 @@ "OptionHideUser": "Hide this user from login screens", "OptionHideUserFromLoginHelp": "Useful for private or hidden administrator accounts. The user will need to sign in manually by entering their username and password.", "HeaderSendMessage": "Send Message", - "HeaderSeries": "Series", "HeaderSeriesOptions": "Series Options", "HeaderSeriesStatus": "Series Status", "HeaderServerAddressSettings": "Server Address Settings", "HeaderServerSettings": "Server Settings", "HeaderSettings": "Settings", - "HeaderShutdown": "Shutdown", "HeaderSortBy": "Sort By", "HeaderSortOrder": "Sort Order", "HeaderSpecialEpisodeInfo": "Special Episode Info", @@ -1084,7 +974,6 @@ "HeaderSubtitleProfilesHelp": "Subtitle profiles describe the subtitle formats supported by the device.", "HeaderSyncPlaySelectGroup": "Join a group", "HeaderSyncPlayEnabled": "SyncPlay enabled", - "HeaderTags": "Tags", "HeaderThisUserIsCurrentlyDisabled": "This user is currently disabled", "HeaderTracks": "Tracks", "HeaderTranscodingProfile": "Transcoding Profile", @@ -1103,7 +992,6 @@ "HeaderXmlDocumentAttributes": "Xml Document Attributes", "HeaderXmlSettings": "Xml Settings", "HeaderYears": "Years", - "HeadersFolders": "Folders", "Help": "Help", "Hide": "Hide", "HideWatchedContentFromLatestMedia": "Hide watched content from latest media", @@ -1137,10 +1025,7 @@ "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", "LabelAlbumArtPN": "Album art PN:", "LabelAlbumArtists": "Album artists:", - "LabelAll": "All", "LabelAllowHWTranscoding": "Allow hardware transcoding", - "LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates", - "LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods when no users are active.", "LabelAllowedRemoteAddresses": "Remote IP address filter:", "LabelAllowedRemoteAddressesMode": "Remote IP address filter mode:", "LabelAppName": "App name", @@ -1158,11 +1043,9 @@ "OptionLoginAttemptsBeforeLockoutHelp": "A value of zero means inheriting the default of three attempts for normal users and five for administrators. Setting this to -1 will disable the feature.", "OptionMax": "Max", "OptionMissingEpisode": "Missing Episodes", - "OptionMonday": "Monday", "OptionNameSort": "Name", "OptionNew": "New…", "OptionNone": "None", - "OptionOnAppStartup": "On application startup", "LabelMaxResumePercentageHelp": "Titles are assumed fully played if stopped after this time.", "LabelMaxScreenshotsPerItem": "Maximum number of screenshots per item:", "LabelMaxStreamingBitrate": "Maximum streaming quality:", @@ -1199,7 +1082,6 @@ "LabelName": "Name:", "LabelChromecastVersion": "Chromecast Version", "LabelStable": "Stable", - "LabelNightly": "Nightly", "LabelNewName": "New name:", "LabelNewsCategories": "News categories:", "LabelNotificationEnabled": "Enable this notification", @@ -1231,7 +1113,6 @@ "LabelPostProcessorArguments": "Post-processor command line arguments:", "LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.", "LabelPreferredDisplayLanguage": "Preferred display language:", - "LabelPreferredDisplayLanguageHelp": "Translating Jellyfin is an ongoing project.", "LabelPreferredSubtitleLanguage": "Preferred subtitle language:", "LabelProfileAudioCodecs": "Audio codecs:", "LabelProfileCodecs": "Codecs:", @@ -1245,7 +1126,6 @@ "LabelPublicHttpPortHelp": "The public port number that should be mapped to the local HTTP port.", "LabelPublicHttpsPort": "Public HTTPS port number:", "LabelPublicHttpsPortHelp": "The public port number that should be mapped to the local HTTPS port.", - "LabelReadHowYouCanContribute": "Learn how you can contribute.", "LabelReasonForTranscoding": "Reason for transcoding:", "LabelRecord": "Record:", "LabelRecordingPath": "Default recording path:", @@ -1270,7 +1150,6 @@ "HeaderAppearsOn": "Appears On", "HeaderAudioBooks": "Audio Books", "HeaderAudioSettings": "Audio Settings", - "HeaderAutomaticUpdates": "Automatic Updates", "HeaderBranding": "Branding", "HeaderConfigureRemoteAccess": "Configure Remote Access", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -1296,7 +1175,6 @@ "HeaderRevisionHistory": "Revision History", "HeaderRunningTasks": "Running Tasks", "HeaderScenes": "Scenes", - "HeaderSchedule": "Schedule", "HeaderSeasons": "Seasons", "HeaderSecondsValue": "{0} Seconds", "HeaderSelectCertificatePath": "Select Certificate Path", @@ -1319,8 +1197,6 @@ "LabelTime": "Time:", "LabelTitle": "Title:", "LabelTrackNumber": "Track number:", - "LabelTranscodingAudioCodec": "Audio codec:", - "LabelTranscodingContainer": "Container:", "LabelTranscodePath": "Transcode path:", "LabelTranscodingTempPathHelp": "Specify a custom path for the transcode files served to clients. Leave blank to use the server default.", "LabelTranscodes": "Transcodes:", @@ -1328,7 +1204,6 @@ "LabelTranscodingProgress": "Transcoding progress:", "LabelTranscodingThreadCount": "Transcoding thread count:", "LabelTranscodingThreadCountHelp": "Select the maximum number of threads to use when transcoding. Reducing the thread count will lower CPU usage but may not convert fast enough for a smooth playback experience.", - "LabelTranscodingVideoCodec": "Video codec:", "LabelTriggerType": "Trigger Type:", "LabelTunerIpAddress": "Tuner IP Address:", "LabelTunerType": "Tuner type:", @@ -1344,11 +1219,9 @@ "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.", "LabelffmpegPathHelp": "The path to the ffmpeg application file, or folder containing ffmpeg.", "LanNetworksHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be considered on local network when enforcing bandwidth restrictions. If set, all other IP addresses will be considered to be on the external network and will be subject to the external bandwidth restrictions. If left blank, only the server's subnet is considered to be on the local network.", - "LaunchWebAppOnStartupHelp": "Open the web client in your default web browser when the server initially starts. This will not occur when using the restart server function.", "LearnHowYouCanContribute": "Learn how you can contribute.", "LeaveBlankToNotSetAPassword": "You can leave this field blank to set no password.", "Like": "Like", - "LinksValue": "Links: {0}", "List": "List", "Live": "Live", "LiveBroadcasts": "Live broadcasts", @@ -1382,7 +1255,6 @@ "MediaInfoSampleRate": "Sample rate", "MediaInfoSize": "Size", "MediaInfoTimestamp": "Timestamp", - "MediaInfoSoftware": "Software", "MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeData": "Data", "MediaInfoStreamTypeEmbeddedImage": "Embedded Image", @@ -1421,7 +1293,6 @@ "MessagePlayAccessRestricted": "Playback of this content is currently restricted. Please contact your server administrator for more information.", "MessagePluginInstallDisclaimer": "Plugins built by Jellyfin community members are a great way to enhance your Jellyfin experience with additional features and benefits. Before installing, please be aware of the effects they may have on your Jellyfin Server, such as longer library scans, additional background processing, and decreased system stability.", "MessageReenableUser": "See below to reenable", - "MessageSettingsSaved": "Settings saved.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "The following media locations will be removed from your library:", "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please ensure it is running and try again.", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", @@ -1440,7 +1311,6 @@ "ReplaceExistingImages": "Replace existing images", "ResumeAt": "Resume from {0}", "Rewind": "Rewind", - "RunAtStartup": "Run at startup", "Runtime": "Runtime", "Saturday": "Saturday", "Save": "Save", @@ -1539,11 +1409,10 @@ "SyncPlayAccessHelp": "Select the level of access this user has to the SyncPlay feature. SyncPlay enables to sync playback with other devices.", "SystemDlnaProfilesHelp": "System profiles are read-only. Changes to a system profile will be saved to a new custom profile.", "TabContainers": "Containers", - "TabDVR": "DVR", "TvLibraryHelp": "Review the {0}TV naming guide{1}.", "UserAgentHelp": "Supply a custom user-agent HTTP header.", "ValueContainer": "Container: {0}", - "EnableBlurhash": "Enable blurred placeholders for images", - "EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder", + "EnableBlurHash": "Enable blurred placeholders for images", + "EnableBlurHashHelp": "Images that are still being loaded will be displayed with a blurred placeholder", "ButtonSyncPlay": "SyncPlay" } diff --git a/src/strings/fi.json b/src/strings/fi.json index 657f1a4c32..9481f59b4f 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -1,10 +1,8 @@ { - "BrowsePluginCatalogMessage": "Selaa lisäosakuvastoamme katsoaksesi saatavilla olevia lisäosia.", + "MessageBrowsePluginCatalog": "Selaa lisäosakuvastoamme katsoaksesi saatavilla olevia lisäosia.", "ButtonAddUser": "Lisää Käyttäjä", "ButtonCancel": "Peruuta", - "ButtonDeleteImage": "Poista Kuva", "ButtonResetPassword": "Nollaa salasana", - "ButtonSave": "Tallenna", "ButtonSignOut": "Sign out", "Delete": "Poista", "DeleteImage": "Poista Kuva", @@ -15,21 +13,16 @@ "FileReadCancelled": "Tiedoston luku on peruutettu.", "FileReadError": "Virhe tiedoston luvun aikana.", "FolderTypeTvShows": "TV-sarjat", - "HeaderSeries": "Sarjat", "LabelAudioLanguagePreference": "Äänen ensisijainen kieli:", "LabelCountry": "Maa:", "LabelCurrentPassword": "Tämän hetkinen salsana:", - "LabelDisplayMissingEpisodesWithinSeasons": "Näytä puuttuvat jaksot kausien sisällä", "LabelFinish": "Valmis", "LabelLanguage": "Kieli:", "LabelMaxParentalRating": "Suurin sallittu ikäraja:", "LabelNewPassword": "Uusi salasana:", "LabelNewPasswordConfirm": "Uuden salasanan varmistus:", - "LabelNext": "Seuraava", - "LabelPrevious": "Edellinen", "LabelSaveLocalMetadata": "Tallenna kuvamateriaali mediakansioihin", "LabelSaveLocalMetadataHelp": "Kuvamateriaalin ja metadatan tallentaminen suoraan kansioihin missä niitä on helppo muuttaa.", - "LabelYourFirstName": "Etunimesi:", "LabelYoureDone": "Valmista!", "LibraryAccessHelp": "Valitse kirjastot, jotka haluat jakaa tämän käyttäjän kanssa. Järjestelmänvalvoja pystyy muokkaamaan kaikkia kansioita käyttäen metadatan hallintatyökalua.", "MaxParentalRatingHelp": "Suuremman luokituksen sisältö piilotetaan käyttäjältä.", @@ -41,13 +34,12 @@ "PasswordSaved": "Salasana tallennettu.", "Save": "Tallenna", "SettingsSaved": "Asetukset tallennettu.", - "TabPassword": "Salasana", "TabProfile": "Profiili", "TabProfiles": "Profiilit", "TellUsAboutYourself": "Kerro meille itsestäsi", "ThisWizardWillGuideYou": "Tämä työkalu auttaa sinua asennusprosessin aikana. Valitse kieli aloittaaksesi.", "UninstallPluginConfirmation": "Oletko varma, että haluat poistaa {0}?", - "UninstallPluginHeader": "Poista Lisäosa", + "HeaderUninstallPlugin": "Poista Lisäosa", "Absolute": "Ehdoton", "Actor": "Näyttelijä", "Add": "Lisää", @@ -67,7 +59,6 @@ "AllLibraries": "Kaikki kirjastot", "AllowOnTheFlySubtitleExtraction": "Salli tekstitysten purkaminen lennossa", "AccessRestrictedTryAgainLater": "Pääsy on toistaiseksi estetty. Yritä myöhemmin uudelleen.", - "AddItemToCollectionHelp": "Lisää nimikkeitä etsimällä niitä ja käyttämällä hiiren oikeaa nappia tai valikkoa lisätäksesi ne kokoelmaan.", "Aired": "Esityspäivä", "AllowHWTranscodingHelp": "Salli virittimen muuntaa bittivirtaa lennossa. Tämä voi vähentää muunnoksen tarvetta Jellyfin-palvelimella.", "AllowMediaConversion": "Salli median muunto", @@ -86,11 +77,9 @@ "AsManyAsPossible": "Niin monta kuin mahdollista", "Ascending": "Nousevassa järjestyksessä", "AspectRatio": "Kuvasuhde", - "AttributeNew": "Uusi", "Audio": "Ääni", "AuthProviderHelp": "Valitse todentamispalvelu, jota käytetään tämän käyttäjän salasanan todentamisessa.", "Auto": "Auto", - "AutoBasedOnLanguageSetting": "Automaattinen (perustuu kieliasetukseen)", "Backdrop": "Tausta", "Backdrops": "Taustat", "Banner": "Lippu", @@ -103,77 +92,53 @@ "Box": "Laatikko", "BoxRear": "Laatikko (takaa)", "Browse": "Selaa", - "ButtonAdd": "Lisää", "ButtonAddMediaLibrary": "Lisää Mediakirjasto", "ButtonAddScheduledTaskTrigger": "Lisää Liipaisin", "ButtonAddServer": "Lisää Palvelin", - "ButtonArrowDown": "Alas", "ButtonArrowLeft": "Vasen", "ButtonArrowRight": "Oikea", - "ButtonArrowUp": "Ylös", "ButtonAudioTracks": "Ääniraidat", "ButtonBack": "Takaisin", "ButtonChangeServer": "Vaihda Palvelinta", - "ButtonConnect": "Yhdistä", - "ButtonDelete": "Poista", - "ButtonDown": "Alas", - "ButtonDownload": "Lataa", - "ButtonEdit": "Muokkaa", - "ButtonEditImages": "Muokkaa kuvia", "ButtonEditOtherUserPreferences": "Muokkaa tämän käyttäjän profiilia, kuvaa ja henkilökohtaisia asetuksia.", - "ButtonFilter": "Suodata", "ButtonForgotPassword": "Unohtuiko salasana", "ButtonFullscreen": "Kokonäyttötila", "ButtonGotIt": "Selvä", "ButtonGuide": "Opas", - "ButtonHelp": "Apua", - "ButtonHome": "Koti", "ButtonInfo": "Tiedot", - "ButtonLearnMore": "Lue lisää", "ButtonLibraryAccess": "Kiraston pääsy", "ButtonManualLogin": "Manuaalinen kirjautuminen", "ButtonMore": "Lisää", "ButtonNetwork": "Verkko", - "ButtonNew": "Uusi", "ButtonNextTrack": "Seuraava raita", - "ButtonOff": "Pois päältä", "ButtonOk": "Ok", "ButtonOpen": "Avaa", "BurnSubtitlesHelp": "Määrittää mikäli palvelimen pitäisi polttaa tekstitykset suoraan videoon muunnoksen aikana riippuen tekstitysten formaatista. Tekstitysten polttamisen välttäminen parantaa palvelimen suorituskykyä. Valitse Automaattinen polttaaksesi sekä kuva- (esim. VOBSUB, PGS, SUB/IDX, jne.) että tekstipohjaiset (ASS/SSA) formaatit.", "ButtonParentalControl": "Lapsilukko", "ButtonPause": "Tauko", - "ButtonPlay": "Toista", "ButtonPreviousTrack": "Edellinen raita", "ButtonProfile": "Profiili", "ButtonQuickStartGuide": "Pikaopas", - "ButtonRefresh": "Päivitä", "ButtonRefreshGuideData": "Päivitä oppaan tiedot", "ButtonRemove": "Poista", "ButtonRename": "Nimeä uudelleen", - "ButtonRepeat": "Uudelleentoisto", "ButtonResetEasyPassword": "Nollaa helppo PIN-koodi", "ButtonRestart": "Käynnistä uudelleen", "ButtonResume": "Jatka", "ButtonRevoke": "Peruuta", "ButtonScanAllLibraries": "Skannaa kaikki kirjastot", - "ButtonSearch": "Haku", "ButtonSelectDirectory": "Valitse hakemisto", "ButtonSelectServer": "Valitse palvelin", "ButtonSelectView": "Valitse näkymä", "ButtonSend": "Lähetä", "ButtonSettings": "Asetukset", - "ButtonShuffle": "Satunnaistoisto", "ButtonShutdown": "Sammuta", "ButtonSignIn": "Kirjaudu sisään", - "ButtonSort": "Lajittele", "ButtonStart": "Käynnistä", "ButtonStop": "Pysäytä", "ButtonSubmit": "Lähetä", - "ButtonSubtitles": "Tekstitykset", "ButtonTrailer": "Traileri", "ButtonUninstall": "Poista asennus", - "ButtonUp": "Ylös", - "ButtonViewWebsite": "Näytä nettisivusto", "ButtonWebsite": "Nettisivusto", "CancelRecording": "Peruuta tallennus", "Categories": "Kategoriat", @@ -201,7 +166,7 @@ "DateAdded": "Lisäyspäivämäärä", "DatePlayed": "Toistopäivämäärä", "Default": "Oletus", - "DefaultErrorMessage": "Pyynnön käsittelyssä tapahtui virhe. Yritä myöhemmin uudelleen.", + "ErrorDefault": "Pyynnön käsittelyssä tapahtui virhe. Yritä myöhemmin uudelleen.", "DefaultMetadataLangaugeDescription": "Nämä ovat sinun oletuksetasetukset ja niitä voidaan muokata kirjastokohtaisesti.", "DefaultSubtitlesHelp": "Tekstitykset ladataan pakotettu- ja oletusmäärityksien upotetun metadatan mukaan. Kieliasetukset otetaan huomioon, kun on enemmän kuin yksi tekstitys josta valita.", "DeleteDeviceConfirmation": "Oletko varma, että haluat positaa tämän laitteen? Se ilmaantuu uudelleen seuraavan kerran, kun jokin käyttäjä kirjautuu sillä.", @@ -241,8 +206,6 @@ "CopyStreamURL": "Kopioi Toiston Osoite", "ButtonAddImage": "Lisää kuva", "Movies": "Elokuvat", - "HeaderNextUp": "Seuraavaksi", - "HeaderLiveTV": "Live-TV", "HeaderFavoriteSongs": "Lempikappaleet", "HeaderFavoriteShows": "Lempisarjat", "HeaderFavoriteEpisodes": "Lempijaksot", @@ -263,13 +226,11 @@ "CopyStreamURLSuccess": "Osoite kopioitu onnistuneesti.", "DeathDateValue": "Kuoli: {}", "CustomDlnaProfilesHelp": "Luo uusi profiili kohdistaaksesi uuteen laitteeseen tai ohittaaksesi järjestelmäprofiilin.", - "EnableBackdrops": "Taustat", "ErrorAddingMediaPathToVirtualFolder": "Media-polkua lisätessä ilmeni ongelma. Varmista, että polku on kirjoitettu oikein ja Jellyfin Palvelimella pääsy sijaintiin.", "Episodes": "Jaksot", "EndsAtValue": "Päättyy {0}", "Ended": "Päättynyt", "EnableThemeSongsHelp": "Soita tunnussäveliä taustalla selatessasi kirjastoa.", - "EnableThemeSongs": "Tunnuslaulut", "EnableStreamLoopingHelp": "Laita tämä päälle, jos suoratoistot sisältävät vain muutaman sekuntin verran dataa jota tarvitsee pyytää jatkuvasti. Tämän päälle laittaminen ilman toiminnon tarvetta voi aiheuttaa ongelmia.", "EnablePhotosHelp": "Kuvat tunnistetaan ja näytetään muiden media-tiedostojen ohessa.", "EnablePhotos": "Näytä valokuvat", @@ -282,7 +243,6 @@ "EnableBackdropsHelp": "Näytä taustat tietyillä sivuilla selatessasi kirjastoa.", "EnableExternalVideoPlayersHelp": "Videota soitettaessa näytetään erillinen valikko.", "Depressed": "Painettu", - "CopyStreamURLError": "Osoitteen kopioidessa tapahtui virhe.", "ButtonSplit": "jaa", "AskAdminToCreateLibrary": "Pyydä järjestelmän ylläpitäjää luomaan kirjasto.", "EnableStreamLooping": "Looppaa suoralähetykset", @@ -294,7 +254,6 @@ "ErrorAddingXmlTvFile": "XMLTV-tiedostoa käyttäessä tapahtui virhe. Varmista, että tiedosto on olemassa ja kokeile uudestaan.", "ErrorAddingTunerDevice": "Viritintä lisätessä ilmeni ongelma. Varmista, että se on kytketty oikein ja kokeile uudestaan.", "EnableThemeVideosHelp": "Soita tunnusvideoita taustalla, selatessasi kirjastoa.", - "EnableThemeVideos": "Tunnusvideot", "AlbumArtist": "Albumin Artisti", "Album": "Albumi", "Played": "Toistetut", @@ -303,7 +262,7 @@ "Play": "Toista", "PinCodeResetConfirmation": "Haluatko varmasti nollata PIN-koodin?", "People": "Ihmiset", - "PasswordResetHeader": "Nollaa salasana", + "HeaderResetPassword": "Nollaa salasana", "OriginalAirDateValue": "Alkuperäinen esityspäivä: {0}", "OptionWeekly": "Viikottainen", "OptionWeekends": "Viikonloput", @@ -332,10 +291,8 @@ "OptionPoster": "Juliste", "OptionPlayCount": "Toistokerrat", "OptionPlayed": "Toistettu", - "OptionOnAppStartup": "Käynnistyksen yhteydessä", "OptionNew": "Uusi…", "OptionNameSort": "Nimi", - "OptionMonday": "Maanantai", "OptionMissingEpisode": "Puuttuvat jaksot", "OptionMax": "Maksimi", "OptionList": "Lista", @@ -350,7 +307,6 @@ "OptionHasThemeSong": "Tunnuskappale", "OptionHasSubtitles": "Tekstitykset", "OptionHasSpecialFeatures": "Erikoisominaisuudet", - "OptionFriday": "Perjantai", "OptionFavorite": "Suosikit", "OptionExtractChapterImage": "Ota käyttöön kappalekuvien luonti", "OptionExternallyDownloaded": "Ulkoinen lataus", @@ -384,7 +340,6 @@ "MessagePluginConfigurationRequiresLocalAccess": "Kirjaudu suoraan paikalliselle palvelimellesi muokataksesi tätä liitännäistä.", "MessagePleaseEnsureInternetMetadata": "Varmista, että metadatan lataus on käytössä.", "MessageNoServersAvailable": "Automaattisen palvelintunnistuksen avulla ei löydy palvelimia.", - "MessageUnauthorizedUser": "Sinulla ei ole lupaa käyttää palvelinta tällä hetkellä. Ota yhteyttä palvelimen järjestelmänvalvojaan saadaksesi lisätietoja.", "MessageInvalidForgotPasswordPin": "PIN-koodi on kelpaa tai vanhentunut. Yritä uudelleen.", "MessageImageTypeNotSelected": "Valitse kuvatyyppi pudotusvalikosta.", "MessageImageFileTypeAllowed": "Vain JPEG ja PNG tiedostomuotoja tuetaan.", @@ -416,17 +371,13 @@ "LabelDisplayMode": "Näyttötila:", "LabelDateTimeLocale": "Päivämäärä ja aika:", "LabelCustomRating": "Mukautettu luokitus:", - "LabelCustomDeviceDisplayName": "Näyttönimi:", "LabelCustomCss": "Mukautettu CSS:", "LabelCertificatePassword": "Sertifikaatin salasana:", - "LabelAudio": "Audio", "LabelArtistsHelp": "Erota useita käyttämällä ;", "LabelAppNameExample": "Esimerkiksi: Sickbeard, Sonarr", "LabelAppName": "Sovelluksen nimi", "LabelAllowedRemoteAddressesMode": "Etä-IP-osoitesuodattimen tila:", "LabelAllowedRemoteAddresses": "Etä-IP-osoitesuodatin:", - "LabelAllowServerAutoRestartHelp": "Palvelin käynnistyy uudelleen vain hiljaisina aikoina, kun yksikään käyttäjä ei ole aktiivinen.", - "LabelAllowServerAutoRestart": "Salli palvelimen automaattinen uudelleenkäynnistys päivitysten asentamiseksi", "LabelAllowHWTranscoding": "Salli laitteistolla transkoodaus", "LabelAlbumArtMaxWidth": "Albumin kuvan maksimileveys:", "LabelAlbumArtMaxHeight": "Albumin kuvan maksimikorkeus:", @@ -448,7 +399,6 @@ "HeaderSeriesStatus": "Sarjan status", "HeaderSeriesOptions": "Sarjan asetukset", "HeaderSelectTranscodingPath": "Valitse transkoodauksen väliaikainen polku", - "HeaderSchedule": "Ajastus", "HeaderScenes": "Kohtaukset", "HeaderResponseProfile": "Vastausprofiili", "HeaderRemoveMediaLocation": "Poista mediasijainti", @@ -470,7 +420,6 @@ "HeaderLoginFailure": "Kirjautumisvirhe", "HeaderIdentifyItemHelp": "Anna yksi tai useampi hakukriteeri. Poista kriteerejä lisätäksesi hakutuloksia.", "HeaderIdentificationCriteriaHelp": "Lisää ainakin yksi tunnistuskriteeri.", - "HeaderFeatures": "Ominaisuudet", "HeaderFavoriteVideos": "Suosikkivideot", "HeaderFavoritePeople": "Suosikki-ihmiset", "HeaderFavoriteMovies": "Suosikkielokuvat", @@ -490,7 +439,6 @@ "HeaderConfirmPluginInstallation": "Vahvista liitännäisen asennus", "HeaderConfigureRemoteAccess": "Määritä etäkäyttö", "HeaderChapterImages": "Kappalekuvat", - "HeaderChannels": "Kanavat", "HeaderApp": "Sovellus", "HeaderAllowMediaDeletionFrom": "Salli median poisto", "HeaderAlert": "Hälytys", @@ -509,19 +457,15 @@ "OptionDateAdded": "Lisäyspäivä", "OptionDaily": "Päivittäinen", "OptionBluray": "Blu-ray", - "TabTrailers": "Trailerit", "OptionBlockTvShows": "TV-sarjat", "OptionBlockTrailers": "Trailerit", "OptionBlockMusic": "Musiikki", "OptionBlockMovies": "Elokuvat", - "HeaderMovies": "Elokuvat", "HeaderMoreLikeThis": "Lisää tällaista", "HeaderMetadataSettings": "Metadata-asetukset", "MoreMediaInfo": "Mediainfo", - "HeaderMediaInfo": "Mediainfo", "HeaderMediaFolders": "Mediakansiot", "HeaderMedia": "Media", - "HeaderLiveTv": "Live-TV", "HeaderLibraryFolders": "Kirjaston kansiot", "HeaderLatestMedia": "Uusin media", "HeaderLatestRecordings": "Uusimmat tallenteet", @@ -529,11 +473,9 @@ "HeaderLatestMovies": "Uusimmat elokuvat", "HeaderLatestEpisodes": "Uusimmat jaksot", "HeaderInstall": "Asenna", - "HeaderGenres": "Tyylilajit", "HeaderFrequentlyPlayed": "Usein toistetut", "HeaderFetcherSettings": "Hakijan asetukset", "HeaderFetchImages": "Hae kuvia:", - "HeaderFilters": "Suodattimet", "OptionBlockBooks": "Kirjat", "Filters": "Suodattimet", "FastForward": "Hyppää eteenpäin", @@ -551,7 +493,6 @@ "MediaInfoStreamTypeSubtitle": "Tekstitys", "MediaInfoStreamTypeData": "Data", "MediaInfoStreamTypeAudio": "Audio", - "MediaInfoSoftware": "Ohjelmisto", "MediaInfoTimestamp": "Aikaleima", "MediaInfoResolution": "Resoluutio", "MediaInfoSize": "Koko", @@ -575,7 +516,6 @@ "LiveBroadcasts": "Suorat lähetykset", "Live": "Suora", "List": "Lista", - "LinksValue": "Linkkejä: {0}", "LearnHowYouCanContribute": "Katso, miten voit auttaa.", "Large": "Suuri", "LabelffmpegPath": "FFmpeg polku:", @@ -609,7 +549,6 @@ "LabelTextBackgroundColor": "Tekstin taustaväri:", "LabelSupportedMediaTypes": "Tuetut mediatyypit:", "LabelTag": "Tunniste:", - "LabelSubtitles": "Tekstitykset", "LabelSubtitleFormatHelp": "Esimerkki: srt", "LabelStatus": "Status:", "LabelSource": "Lähde:", @@ -620,13 +559,11 @@ "LabelSeasonNumber": "Kauden numero:", "LabelScreensaver": "Näytönsäästäjä:", "LabelReasonForTranscoding": "Transkoodauksen syy:", - "LabelReadHowYouCanContribute": "Katso, miten voit auttaa.", "LabelPublicHttpsPort": "Julkinen HTTPS-porttinumero:", "LabelPublicHttpPort": "Julkinen HTTP-porttinumero:", "LabelProtocolInfo": "Protokollan info:", "LabelProtocol": "Protokolla:", "LabelPreferredSubtitleLanguage": "Ensisijainen tekstityksen kieli:", - "LabelPreferredDisplayLanguageHelp": "Jellyfinin kääntäminen on käynnissä oleva projekti.", "LabelPlayerDimensions": "Soittimen mitat:", "LabelPlayer": "Soitin:", "LabelPlaylist": "Soittolista:", @@ -664,7 +601,6 @@ "ExtraLarge": "Suurin", "EveryNDays": "Joka {0} päivä", "Raised": "Korotettu", - "TabShows": "Sarjat", "Yesterday": "Eilen", "Yes": "Kyllä", "Unplayed": "Toistamattomat", @@ -679,46 +615,21 @@ "ThemeSongs": "Tunnuslaulut", "TagsValue": "Tunnisteet: {0}", "Tags": "Tunnisteet", - "TabUsers": "Käyttäjät", "TabUpcoming": "Tulevat", - "TabTranscoding": "Transkoodaus", - "TabSuggestions": "Ehdotukset", - "TabSongs": "Kappaleet", "TabSettings": "Asetukset", "TabServer": "Palvelin", - "TabSeries": "Sarjat", "TabScheduledTasks": "Ajastetut tehtävät", - "TabResumeSettings": "Jatka", "TabResponses": "Vastaukset", - "TabRecordings": "Tallennukset", "TabPlugins": "Liitännäiset", - "TabPlaylists": "Soittolistat", - "TabPlaylist": "Soittolista", - "TabPlayback": "Toistaminen", "TabNfoSettings": "NFO-asetukset", "TabNetworks": "Verkot", "TabMyPlugins": "Omat liittännäiseni", - "TabMusicVideos": "Musiikkivideot", "TabMusic": "Musiikki", - "TabMovies": "Elokuvat", - "TabMetadata": "Metadata", "TabLogs": "Lokit", - "TabLiveTV": "Live-TV", "TabLatest": "Uusimmat", - "TabInfo": "Tiedot", - "TabGenres": "Tyylilajit", - "TabFavorites": "Suosikit", - "TabEpisodes": "Jaksot", - "TabDisplay": "Näyttö", "TabDirectPlay": "Suoratoisto", - "TabDevices": "Laitteet", "TabDashboard": "Päänäkymä", - "TabCollections": "Kokoelmat", - "TabChannels": "Kanavat", "TabCatalog": "Luettelo", - "TabArtists": "Artistit", - "TabAlbums": "Albumit", - "TabAlbumArtists": "Albumin artistit", "TabAdvanced": "Edistynyt", "TV": "TV", "Sunday": "Sunnuntai", @@ -770,7 +681,6 @@ "RecordingCancelled": "Tallennus peruttu.", "RecordSeries": "Tallenna sarja", "Record": "Tallenna", - "OptionAutomatic": "Auto", "OptionAuto": "Auto", "OptionAscending": "Nousevassa järjestyksessä", "OptionArtist": "Artisti", @@ -831,7 +741,7 @@ "OnApplicationStartup": "Käynnistyksen yhteydessä", "NumLocationsValue": "{0} kansiota", "NoSubtitleSearchResultsFound": "Ei tuloksia.", - "NoPluginConfigurationMessage": "Tällä liitännäisellä ei ole asetuksia muokattavaksi.", + "MessageNoPluginConfiguration": "Tällä liitännäisellä ei ole asetuksia muokattavaksi.", "NoCreatedLibraries": "Vaikuttaa siltä, ettet ole luonut vielä yhtään kirjastoa. {0} Haluaisitko luoda sellaisen nyt?{1}", "No": "Ei", "NextUp": "Seuraavana", @@ -851,7 +761,6 @@ "MetadataManager": "Metadatan hallintatyökalu", "Metadata": "Metadata", "MessageYouHaveVersionInstalled": "Sinulla on versio {0} asennettuna.", - "MessageSettingsSaved": "Asetukset tallennettu.", "MessagePleaseWait": "Ole hyvä ja odota. Tämä voi kestää hetken.", "MessageNothingHere": "Täällä ei ole mitään.", "MessageNoPluginsInstalled": "Sinulla ei ole asennettuna yhtään liitännäistä.", @@ -901,7 +810,6 @@ "LabelBirthYear": "Syntymävuosi:", "LabelBirthDate": "Syntymäaika:", "LabelArtists": "Artistit:", - "LabelAll": "Kaikki", "LabelAlbum": "Albumi:", "LabelAirTime": "Lähetysaika:", "LabelAccessDay": "Viikonpäivä:", @@ -909,16 +817,13 @@ "Kids": "Lapset", "Images": "Kuvat", "Hide": "Piilota", - "HeadersFolders": "Kansiot", "HeaderYears": "Vuodet", "HeaderVideos": "Videot", "HeaderVideoQuality": "Kuvanlaatu", "HeaderUsers": "Käyttäjät", "HeaderUser": "Käyttäjä", - "HeaderTags": "Tunnisteet", "HeaderSubtitleAppearance": "Tekstityksen ulkonäkö", "HeaderStatus": "Tila", - "HeaderShutdown": "Sammuta", "HeaderServerSettings": "Palvelimen asetukset", "HeaderSettings": "Asetukset", "HeaderSendMessage": "Lähetä viesti", @@ -927,7 +832,6 @@ "HeaderRestart": "Uudelleenkäynnistys", "HeaderProfile": "Profiili", "HeaderPlayAll": "Toista kaikki", - "HeaderPeople": "Ihmiset", "HeaderPassword": "Salasana", "HeaderNewApiKey": "Uusi API-avain", "HeaderNavigation": "Navigaatio", @@ -935,12 +839,9 @@ "HeaderMusicQuality": "Musiikin laatu", "HeaderLibraries": "Kirjastot", "HeaderIdentification": "Tunnistautuminen", - "HeaderForgotPassword": "Unohtuiko salasana", "HeaderForKids": "Lapsille", "HeaderError": "Virhe", - "HeaderEpisodes": "Jaksot", "HeaderEditImages": "Muokkaa kuvia", - "HeaderDisplay": "Näyttö", "HeaderDevices": "Laitteet", "HeaderDeleteItems": "Poista valitut", "HeaderDeleteItem": "Poista valittu", @@ -951,14 +852,10 @@ "HeaderAudioSettings": "Ääniasetukset", "GroupBySeries": "Ryhmitä sarjan perusteella", "Fullscreen": "Kokonäyttötila", - "HeaderBooks": "Kirjat", - "HeaderAutomaticUpdates": "Automaattiset päivitykset", "HeaderAudioBooks": "Äänikirjat", "HeaderApiKeys": "API-avaimet", "HeaderApiKey": "API-avain", "HeaderAdmin": "Ylläpitäjä", - "HeaderAlbums": "Albumit", - "HeaderAddUser": "Lisää käyttäjä", "HeaderAddUpdateImage": "Lisää/Päivitä kuva", "HeaderAddToPlaylist": "Lisää soittolistaan", "HeaderAddToCollection": "Lisää kokoelmaan", @@ -1001,17 +898,11 @@ "LabelDeviceDescription": "Laitteen kuvaus", "LabelDefaultScreen": "Oletusnäyttö:", "LabelDefaultUser": "Oletuskäyttäjä:", - "LabelDashboardTheme": "Palvelimen päänäkymän teema:", "LabelCustomCertificatePathHelp": "Polku PKCS # 12-tiedostoon, joka sisältää sertifikaatin ja yksityisen avaimen, jotta TLS-tuki voidaan sallia henkilökohtaiselle verkkotunnukselle.", "LabelCustomCertificatePath": "Mukautetun SSL-sertifikaatin polku:", "LabelContentType": "Sisältötyyppi:", "LabelChannels": "Kanavat:", "LabelCertificatePasswordHelp": "Jos sertifikaattisi vaatii salasanaa, laita se tähän.", - "OptionWednesday": "Keskiviikko", - "OptionTuesday": "Tiistai", - "OptionThursday": "Torstai", - "OptionSunday": "Sunnuntai", - "OptionSaturday": "Lauantai", "LabelRuntimeMinutes": "Pituus (minuutteja):", "LabelReleaseDate": "Julkaisupäivä:", "Genre": "Tyylilaji", @@ -1025,7 +916,6 @@ "ExitFullscreen": "Poistu kokonäyttötilasta", "Episode": "Jakso", "ButtonTogglePlaylist": "Soittolista", - "ButtonToggleContextMenu": "Lisää", "Artist": "Artisti", "RefreshQueued": "Päivitys odottamassa.", "SeriesCancelled": "Sarja peruttu.", @@ -1044,7 +934,6 @@ "TabOther": "Muut", "TabNotifications": "Ilmoitukset", "TabNetworking": "Verkkoasetukset", - "TabGuide": "Opas", "TabContainers": "Säiliöt", "TabCodecs": "Codecit", "Suggestions": "Ehdotukset", @@ -1074,7 +963,6 @@ "Off": "Poissa päältä", "Normal": "Normaali", "None": "Ei mitään", - "NoSubtitles": "Ei mitään", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Seuraavat mediasijainnit tullaan poistamaan kirjastostasi:", "MessageItemsAdded": "Kohteet lisätty.", "MessageItemSaved": "Kohde tallennettu.", @@ -1096,7 +984,6 @@ "LabelVideoBitrate": "Videon bitrate:", "LabelWeb": "Web:", "LabelVideoCodec": "Videon codec:", - "LabelTranscodingVideoCodec": "Video codec:", "LabelSkipIfGraphicalSubsPresent": "Ohita, jos video sisältää upotetut tekstitykset", "LabelInternetQuality": "Verkkoyhteyden laatu:", "LabelEmbedAlbumArtDidl": "Upota albumin kuvamateriaali Didl:iin", @@ -1116,7 +1003,6 @@ "HeaderOtherItems": "Muut kohteet", "HeaderLiveTvTunerSetup": "Live-TV virittimen määritys", "HeaderLibrarySettings": "Kirjaston asetukset", - "HeaderItems": "Kohteet", "HeaderGuideProviders": "TV-ohjelmaoppaiden tarjoajat", "HeaderFavoritePlaylists": "Suosikki soittolistat", "HeaderEnabledFields": "Käytössä olevat kentät", @@ -1151,11 +1037,8 @@ "LabelAudioChannels": "Audiokanavia:", "LabelAudioBitrate": "Audion bitrate:", "LabelAudioCodec": "Audio codec:", - "LabelTranscodingContainer": "Säiliö:", - "LabelTranscodingAudioCodec": "Audio codec:", "LabelSubtitleDownloaders": "Tekstitysten lataajat:", "LabelSpecialSeasonsDisplayName": "Erikoiskauden näyttönimi:", - "LabelSoundEffects": "Ääniefektit:", "LabelSortTitle": "Lajitteluotsikko:", "LabelSkipIfAudioTrackPresent": "Ohita, jos oletusääniraita vastaa latauskieltä", "LabelSkipBackLength": "Taaksepäin hyppäämisen pituus:", @@ -1216,7 +1099,7 @@ "FolderTypeUnset": "Sekalainen sisältö", "FetchingData": "Noudetaan lisätietoja", "Features": "Ominaisuudet", - "ErrorMessageStartHourGreaterThanEnd": "Loppumisajan on oltava myöhemmin kuin aloitusaika.", + "ErrorStartHourGreaterThanEnd": "Loppumisajan on oltava myöhemmin kuin aloitusaika.", "MediaInfoAnamorphic": "Anamorfinen", "ErrorGettingTvLineups": "TV esiintyjälistan lataamisessa tapahtui virhe. Varmista, että tiedot on oikein ja yritä uudelleen.", "EnableDetailsBannerHelp": "Näyttää julistekuvan yksityiskohdat -sivun ylälaidassa.", @@ -1237,7 +1120,6 @@ "ErrorAddingListingsToSchedulesDirect": "Lineuppia Schedules Direct -käyttäjätunnuksellesi lisättäessä ilmeni virhe. Schedules Direct sallii vain rajallisen määrän lineuppeja yhdelle käyttäjätunnukselle. Mikäli haluat jatkaa, voit esimerkiksi kirjautua Schedules Direct -sivustolle ja poistaa muita listauksia käyttäjätunnukseltasi.", "EnableDecodingColorDepth10Vp9": "Salli 10-bittinen hardware dekoodaus (VP9)", "EnableDecodingColorDepth10Hevc": "Salli 10-bittinen hardware dekoodaus (HEVC)", - "HeaderCastCrew": "Näyttelijät ja henkilökunta", "HeaderCastAndCrew": "Näyttelijät ja henkilökunta", "HeaderCancelSeries": "Peruuta sarja", "HeaderCancelRecording": "Peruuta tallennus", @@ -1247,6 +1129,5 @@ "ApiKeysCaption": "Lista aktiivisista API-avaimista", "HeaderApiKeysHelp": "Ulkoiset sovellukset tarvitsevat API-avaimen voidakseen toimia Jellyfin -palvelimen kanssa. Avaimet myönnetään joko kirjautumalla sisään Jellyfin -käyttäjätunnuksella tai myöntämällä sellainen sovellukselle manuaalisesti.", "HeaderAdditionalParts": "Muut osat", - "HeaderAddScheduledTaskTrigger": "Lisää laukaisin", "HeaderActiveRecordings": "Käynnissä olevat nauhoitukset" } diff --git a/src/strings/fr-ca.json b/src/strings/fr-ca.json index 00bc7320cd..0edd6168f6 100644 --- a/src/strings/fr-ca.json +++ b/src/strings/fr-ca.json @@ -2,7 +2,6 @@ "Add": "Ajouter", "AddToCollection": "Ajouter à la collection", "AddToPlaylist": "Ajouter à la liste de lecture", - "AttributeNew": "Nouveau", "ButtonCancel": "Annuler", "ButtonGotIt": "J'ai compris", "ButtonQuickStartGuide": "Guide de démarrage rapide", @@ -13,7 +12,7 @@ "Disconnect": "Se déconnecter", "Download": "Télécharger", "Edit": "Modifier", - "EnableDisplayMirroring": "Activer l'affichage mirroir", + "EnableDisplayMirroring": "Duplication d'écran", "EndsAtValue": "Se termine à {0}", "File": "Fichier", "FolderTypeTvShows": "Séries TV", @@ -24,19 +23,14 @@ "HeaderDeleteItem": "Supprimer l'élément", "HeaderMyMedia": "Mes Médias", "HeaderMyMediaSmall": "Mes médias (petit)", - "HeaderNextUp": "À Suivre", "HeaderRemoteControl": "Télécommande", - "HeaderSeries": "Series:", "Help": "Aide", "ItemCount": "{0} articles", "LabelFinish": "Terminer", "LabelLanguage": "Langue :", "LabelName": "Nom :", - "LabelNext": "Suivant", "LabelPlaylist": "Liste de lecture :", - "LabelPrevious": "Précédent", "LabelYear": "Année :", - "LabelYourFirstName": "Votre prénom :", "LabelYoureDone": "Vous avez terminé !", "Live": "En direct", "MessageItemsAdded": "Éléments ajoutés.", @@ -46,7 +40,7 @@ "NewCollectionHelp": "Les collections vous permettent de créer des regroupements personnalisés de films et d'autres contenus de la bibliothèque.", "NewCollectionNameExample": "Exemple: Collection Star Wars", "NoSubtitleSearchResultsFound": "Aucun résultat trouvé.", - "OptionNew": "Nouveau...", + "OptionNew": "Nouveau…", "OriginalAirDateValue": "Date de diffusion originale: {0}", "ParentalRating": "Classement parentale", "Premiere": "Première", @@ -63,7 +57,7 @@ "SearchForSubtitles": "Rechercher des sous-titres", "SeriesCancelled": "Série annulée.", "SeriesRecordingScheduled": "Enregistrement en série programmé.", - "ServerUpdateNeeded": "Ce serveur Jellyfin doit être mis à jour. Pour télécharger la dernière version, veuillez visiter {0}", + "ServerUpdateNeeded": "Ce serveur doit être mis à jour. Pour télécharger la dernière version, veuillez visiter {0}", "Share": "Partager", "Subtitles": "Sous-titres", "Sunday": "Dimanche", @@ -78,9 +72,8 @@ "WelcomeToProject": "Bienvenue dans Jellyfin !", "WizardCompleted": "C'est tout ce dont nous avons besoin pour l'instant. Jellyfin a commencé à collecter les informations de votre bibliothèque de médias. Jetez un oeil à quelques unes de nos applications, puis cliquez sur Terminer pour consulter le Tableau de bord du serveur.", "Absolute": "Absolu", - "AccessRestrictedTryAgainLater": "L'accès est actuellement restreint. Veuillez réessayer plus tard.", + "AccessRestrictedTryAgainLater": "Accès restreint. Veuillez réessayer plus tard.", "Actor": "Acteur(trice)", - "AddItemToCollectionHelp": "Ajoutez des éléments à des collections en les recherchant et en utilisant leurs menus contextuels (clic droit ou appuyez longtemps).", "AddToPlayQueue": "Ajouter à la file d'attente", "AddedOnValue": "Ajouté le {0}", "AdditionalNotificationServices": "Visitez le catalogue d'extensions pour installer des services de notifications supplémentaires.", @@ -98,7 +91,7 @@ "AllowMediaConversionHelp": "Autoriser ou refuser l'accès à la fonctionnalité de conversion des médias.", "AllowOnTheFlySubtitleExtraction": "Autoriser l'extraction des sous-titres à la volée", "AllowOnTheFlySubtitleExtractionHelp": "Les sous-titres intégrés peuvent être extraits des vidéos et distribués aux clients en format texte pour éviter le transcodage. Sur certains systèmes, cela peut prendre du temps et arrêter la lecture de la vidéo pendant le processus d'extraction. Désactivez cette option pour graver les sous-titres avec un transcodage quand l'appareil ne les prend pas en charge nativement.", - "AllowRemoteAccess": "Autoriser les connexions distantes à ce serveur Jellyfin.", + "AllowRemoteAccess": "Autoriser les connexions à distance sur ce serveur Jellyfin.", "AllowRemoteAccessHelp": "Si l'option est désactivée, toutes les connexions distantes seront bloquées.", "Artists": "Artistes", "Books": "Livres", @@ -108,7 +101,6 @@ "Folders": "Dossiers", "Genres": "Genres", "HeaderAlbumArtists": "Artistes de l'album", - "HeaderLiveTV": "TV en direct", "Movies": "Films", "Photos": "Photos", "Playlists": "Listes de lecture", @@ -116,17 +108,16 @@ "Songs": "Chansons", "Sync": "Synchroniser", "AllowedRemoteAddressesHelp": "Liste d'adresses IP ou d'IP/masque de sous-réseau séparées par des virgules qui seront autorisées à se connecter à distance. Si la liste est vide, toutes les adresses distantes seront autorisées.", - "AlwaysPlaySubtitles": "Toujours afficher les sous-titres", - "AlwaysPlaySubtitlesHelp": "Les sous-titres correspondant à la préférence linguistique seront chargés indépendamment de la langue de l'audio.", + "AlwaysPlaySubtitles": "Toujours afficher", + "AlwaysPlaySubtitlesHelp": "Les sous-titres correspondant à la préférence linguistique seront chargés sans tenir compte de la langue de l'audio.", "AnyLanguage": "N'importe quelle langue", "Anytime": "N'importe quand", - "AroundTime": "Aux environs de {0}", + "AroundTime": "Environ", "Art": "Illustration", "AsManyAsPossible": "Autant que possible", "Ascending": "Croissant", "Audio": "Audio", "Auto": "Auto", - "AutoBasedOnLanguageSetting": "Auto (basé sur le réglage de la langue)", "Backdrop": "Arrière-plan", "Backdrops": "Arrière-plans", "Banner": "Bannière", @@ -138,46 +129,32 @@ "Box": "Boîtier", "BoxRear": "Dos de boîtier", "Browse": "Parcourir", - "BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.", + "MessageBrowsePluginCatalog": "Explorer notre catalogue des plugins pour voir les plugins disponibles.", "AllowHWTranscodingHelp": "Permets au syntonisateur de transcoder les flux à la volée. Cela peut aider à réduire le transcodage requis par le serveur.", "BurnSubtitlesHelp": "Détermine si le serveur doit graver les sous-titres lors du transcodage vidéo. Éviter ceci améliorera les performances du serveur. Sélectionnez Auto pour graver les formats basés sur l'image (par exemple, VOBSUB, PGS, SUB/IDX etc) ainsi que certains sous-titres ASS/SSA.", - "ButtonAdd": "Ajouter", "ButtonAddMediaLibrary": "Ajouter une médiathèque", "ButtonAddScheduledTaskTrigger": "Ajouter un déclencheur", "ButtonAddServer": "Ajouter un serveur", "ButtonAddUser": "Ajouter un utilisateur", - "ButtonArrowDown": "Bas", "ButtonArrowLeft": "Gauche", "ButtonArrowRight": "Droite", - "ButtonArrowUp": "Haut", "ButtonAudioTracks": "Pistes Audio", "ButtonBack": "Retour arrière", "ButtonChangeServer": "Changer de serveur", - "ButtonConnect": "Connexion", - "ButtonDelete": "Supprimer", - "ButtonDeleteImage": "Supprimer l'image", - "ButtonDown": "Bas", - "ButtonDownload": "Téléchargement", - "ButtonEdit": "Modifier", - "ButtonEditImages": "Modifier les images", "ButtonEditOtherUserPreferences": "Modifier ce profil utilisateur, son avatar et ses préférences personnelles.", - "ButtonFilter": "Filtre", "ButtonForgotPassword": "Mot de passe oublié", "ButtonFullscreen": "Plein écran", "ButtonGuide": "Guide", - "ButtonHelp": "Aide", - "ButtonHome": "Accueil", "ButtonInfo": "Informations", - "ButtonLearnMore": "En savoir plus", "ButtonLibraryAccess": "Accès à la médiathèque", "ButtonManualLogin": "Connexion manuelle", "ButtonMore": "Plus", "ButtonNetwork": "Réseau", - "AspectRatio": "Format de visionnement", + "AspectRatio": "Format de l'image", "AskAdminToCreateLibrary": "Demander un administrateur de créer une médiathèque.", "Artist": "Artiste", - "AllowFfmpegThrottlingHelp": "Quand un transcodage ou rémux se déplace après la position de relecture, suspendre le processus pour consommer moins de ressources. Ceci est le plus utile pour chercher moins. Désactiver s'il y a des problèmes de relecture.", - "AllowFfmpegThrottling": "Restreindre la vitesse de transcodage", + "AllowFfmpegThrottlingHelp": "Quand un transcodage ou un remultiplexage a traité une période suffisamment longue depuis la position de lecture, le processus sera interrompu afin d'économiser des ressources. Ceci est utile principalement lors de lectures continues. À désactiver si vous éprouvez des problèmes de lecture.", + "AllowFfmpegThrottling": "Limiter la vitesse de transcodage", "AlbumArtist": "Artiste de l'Album", "Album": "Album", "AuthProviderHelp": "Sélectionner un fournisseur d'authentification pour authentifier le mot de passe de cet utilisateur.", @@ -192,8 +169,7 @@ "DatePlayed": "Date écoutée", "DateAdded": "Date d'ajout", "CriticRating": "Évaluation critique", - "CopyStreamURLError": "Une erreur est survenue en essayant de copier l'URL.", - "CopyStreamURLSuccess": "L'URL a été copié avec succès.", + "CopyStreamURLSuccess": "URL copié avec succès.", "CopyStreamURL": "Copier l'URL du stream", "ContinueWatching": "Continuer à visionner", "Connect": "Connexion", @@ -208,45 +184,53 @@ "Categories": "Catégories", "CancelSeries": "Annuler la série", "CancelRecording": "Annuler l'enregistrement", - "ButtonWebsite": "Site web", - "ButtonViewWebsite": "Voir le site web", - "ButtonUp": "Vers le haut", + "ButtonWebsite": "Site Web", "ButtonUninstall": "Désinstaller", "ButtonTogglePlaylist": "Liste de lecture", - "ButtonToggleContextMenu": "Plus", - "ButtonSubtitles": "Sous-titres", "ButtonSubmit": "Soumettre", "ButtonStop": "Arrêt", "ButtonStart": "Démarrer", - "ButtonSort": "Trier", "ButtonSignIn": "Se connecter", "ButtonShutdown": "Éteindre", - "ButtonShuffle": "Lecture aléatoire", "ButtonSettings": "Paramètres", "ButtonSend": "Envoyer", "ButtonSelectServer": "Sélectionner le serveur", "ButtonSelectDirectory": "Sélectionner le répertoire", - "ButtonSearch": "Rechercher", "ButtonScanAllLibraries": "Analyser toutes les médiathèques", - "ButtonSave": "Sauvegarder", "ButtonRevoke": "Révoquer", "ButtonResume": "Reprendre la lecture", "ButtonResetPassword": "Réinitialiser le mot de passe", "ButtonResetEasyPassword": "Remettre à nouveau le code NIP facile", - "ButtonRepeat": "Répéter", "ButtonRename": "Renommer", "ButtonRemove": "Enlever", "ButtonRefreshGuideData": "Rafraîchir les données de guide", - "ButtonRefresh": "Rafraîchir", "ButtonProfile": "Profil", "ButtonPreviousTrack": "Piste précédente", - "ButtonPlay": "Lecture", "ButtonPause": "Pause", "ButtonParentalControl": "Contrôle parentale", "ButtonOpen": "Ouvrir", "ButtonOk": "OK", "ButtonNextTrack": "Prochaine piste", - "ButtonNew": "Nouveau", "ButtonAddImage": "Ajouter l'image", - "BoxSet": "Coffret" + "BoxSet": "Coffret", + "ChangingMetadataImageSettingsNewContent": "Les modifications aux paramètres de téléchargement de métadonnées et d'illustrations seront appliquées seulement au nouveau contenu de votre médiathèque. Vous devrez actualiser les métadonnées manuellement pour que les changements soient appliqués à l'ensemble de votre contenu.", + "ButtonTrailer": "Bande-annonce", + "ButtonSplit": "Couper", + "ButtonSelectView": "Sélectionner l'affichage", + "LabelSubtitleVerticalPosition": "Position verticale :", + "ClearQueue": "Effacer la file d'attente", + "DashboardServerName": "Serveur : {0}", + "DashboardVersionNumber": "Version : {0}", + "LabelVersionInstalled": "{0} installée", + "LabelVersion": "Version :", + "LabelValue": "Valeur :", + "LabelVideo": "Vidéo", + "DashboardArchitecture": "Architecture : {0}", + "DashboardOperatingSystem": "Système d'exploitation : {0}", + "ConfigureDateAdded": "Configure la façon dont la date d'ajout est déterminée dans le tableau de board dans les paramètres de la médiathèque", + "Composer": "Compositeur(trice)", + "CommunityRating": "Évaluation de la communauté", + "ColorTransfer": "Transfert de couleur", + "ColorSpace": "Espace colorimétrique", + "ColorPrimaries": "Primaires colorimétriques" } diff --git a/src/strings/fr.json b/src/strings/fr.json index 63cf6b95f9..ad0c997ba7 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -3,7 +3,6 @@ "AccessRestrictedTryAgainLater": "L'accès est actuellement restreint. Veuillez réessayer plus tard.", "Actor": "Acteur(trice)", "Add": "Ajouter", - "AddItemToCollectionHelp": "Ajoutez des éléments à des collections en les recherchant et en utilisant leurs menus contextuels (clic droit ou appui long) pour les ajouter à une collection.", "AddToCollection": "Ajouter à la collection", "AddToPlayQueue": "Ajouter à la file d'attente", "AddToPlaylist": "Ajouter à la liste de lecture", @@ -23,10 +22,10 @@ "AllowMediaConversionHelp": "Autoriser ou refuser l'accès à la fonctionnalité de conversion des médias.", "AllowOnTheFlySubtitleExtraction": "Autoriser l'extraction des sous-titres à la volée", "AllowOnTheFlySubtitleExtractionHelp": "Les sous-titres intégrés peuvent être extraits des vidéos et envoyés vers les clients au format texte afin d'éviter le transcodage vidéo. Sur certains systèmes, cela peut prendre du temps et arrêter la lecture de la vidéo pendant le processus d'extraction. Désactivez cette option pour conserver les sous-titres pendant le transcodage si l'appareil client ne les prend pas en charge nativement.", - "AllowRemoteAccess": "Autoriser les connexions distantes à ce serveur Jellyfin.", + "AllowRemoteAccess": "Autoriser les connexions distantes à ce serveur.", "AllowRemoteAccessHelp": "Si l'option est désactivée, toutes les connexions distantes seront bloquées.", "AllowedRemoteAddressesHelp": "Liste d'adresses IP ou d'IP/masque de sous-réseau séparées par des virgules qui seront autorisées à se connecter à distance. Si la liste est vide, toutes les adresses distantes seront autorisées.", - "AlwaysPlaySubtitles": "Toujours afficher les sous-titres", + "AlwaysPlaySubtitles": "Toujours afficher", "AlwaysPlaySubtitlesHelp": "Les sous-titres correspondant à la préférence linguistique seront chargés indépendamment de la langue de l'audio.", "AnyLanguage": "N'importe quel langage", "Anytime": "N'importe quand", @@ -35,8 +34,6 @@ "AsManyAsPossible": "Autant que possible", "Ascending": "Croissant", "AspectRatio": "Format d'image", - "AttributeNew": "Nouveau", - "AutoBasedOnLanguageSetting": "Auto (basé sur le réglage de la langue)", "Backdrop": "Arrière-plan", "Backdrops": "Arrière-plans", "Banner": "Bannière", @@ -49,82 +46,56 @@ "Box": "Boîtier", "BoxRear": "Dos de boîtier", "Browse": "Parcourir", - "BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.", + "MessageBrowsePluginCatalog": "Explorer notre catalogue des plugins pour voir les plugins disponibles.", "BurnSubtitlesHelp": "Détermine si le serveur doit incruster les sous-titres lors du transcodage de la vidéo. Les performances seront grandement améliorées sans incrustation. Sélectionnez Auto pour incruster par image les formats (VOBSUB, PGS, SUB, IDX etc) et certains sous-titres ASS ou SSA.", - "ButtonAdd": "Ajouter", "ButtonAddMediaLibrary": "Ajouter une médiathèque", "ButtonAddScheduledTaskTrigger": "Ajouter un déclencheur", "ButtonAddServer": "Ajouter un serveur", "ButtonAddUser": "Ajouter un utilisateur", - "ButtonArrowDown": "Bas", "ButtonArrowLeft": "Gauche", "ButtonArrowRight": "Droite", - "ButtonArrowUp": "Haut", "ButtonAudioTracks": "Pistes Audio", "ButtonBack": "Retour arrière", "ButtonCancel": "Annuler", "ButtonChangeServer": "Changer de serveur", - "ButtonConnect": "Connexion", - "ButtonDelete": "Supprimer", - "ButtonDeleteImage": "Supprimer l'image", - "ButtonDown": "Bas", - "ButtonDownload": "Téléchargement", - "ButtonEdit": "Modifier", - "ButtonEditImages": "Modifier les images", "ButtonEditOtherUserPreferences": "Modifier ce profil utilisateur, son avatar et ses préférences personnelles.", - "ButtonFilter": "Filtre", "ButtonForgotPassword": "Mot de passe oublié", "ButtonFullscreen": "Plein écran", "ButtonGotIt": "Compris", - "ButtonHelp": "Aide", - "ButtonHome": "Accueil", "ButtonInfo": "Informations", - "ButtonLearnMore": "En savoir plus", "ButtonLibraryAccess": "Accès à la médiathèque", "ButtonManualLogin": "Connexion manuelle", "ButtonMore": "Plus", "ButtonNetwork": "Réseau", - "ButtonNew": "Nouveau", "ButtonNextTrack": "Piste suivante", - "ButtonOff": "Arrêt", "ButtonOk": "OK", "ButtonOpen": "Ouvrir", "ButtonParentalControl": "Contrôle parental", - "ButtonPlay": "Lire", "ButtonPreviousTrack": "Piste précédente", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Guide de démarrage rapide", - "ButtonRefresh": "Actualiser", "ButtonRefreshGuideData": "Actualiser les données du guide", "ButtonRemove": "Supprimer", "ButtonRename": "Renommer", - "ButtonRepeat": "Répéter", "ButtonResetEasyPassword": "Réinitialiser le code easy PIN", "ButtonResetPassword": "Réinitialiser le mot de passe", "ButtonRestart": "Redémarrer", "ButtonResume": "Reprendre", "ButtonRevoke": "Révoquer", - "ButtonSave": "Enregistrer", "ButtonScanAllLibraries": "Actualiser toutes les médiathèques", - "ButtonSearch": "Recherche", "ButtonSelectDirectory": "Sélectionner le répertoire", "ButtonSelectServer": "Sélectionner le serveur", "ButtonSelectView": "Sélectionnez une vue", "ButtonSend": "Envoyer", "ButtonSettings": "Paramètres", - "ButtonShuffle": "Aléatoire", "ButtonShutdown": "Éteindre", "ButtonSignIn": "Se connecter", "ButtonSignOut": "Se déconnecter", - "ButtonSort": "Trier", "ButtonStart": "Commencer", "ButtonStop": "Arrêter", "ButtonSubmit": "Soumettre", - "ButtonSubtitles": "Sous-titres", "ButtonTrailer": "Bande-annonce", "ButtonUninstall": "Désinstaller", - "ButtonUp": "Haut", - "ButtonViewWebsite": "Voir le site", "ButtonWebsite": "Site Web", "CancelRecording": "Annuler l'enregistrement", "CancelSeries": "Annuler la série", @@ -140,7 +111,7 @@ "ColorTransfer": "Transfert de couleur", "CommunityRating": "Note de la communauté", "Composer": "Compositeur(trice)", - "ConfigureDateAdded": "Configurez comment la date d'ajout est déterminée dans le tableau de bord du serveur Jellyfin, dans les paramètres de médiathèque", + "ConfigureDateAdded": "Configurez comment la date d'ajout est déterminée dans le tableau de bord sous paramètres de médiathèque", "ConfirmDeleteImage": "Supprimer l'image ?", "ConfirmDeleteItem": "Supprimer cet élément l'effacera à la fois du système de fichiers et de votre médiathèque. Voulez-vous vraiment continuer ?", "ConfirmDeleteItems": "Supprimer ces éléments les effacera à la fois du système de fichiers et de votre médiathèque. Voulez-vous vraiment continuer ?", @@ -155,7 +126,7 @@ "DatePlayed": "Date de lecture", "DeathDateValue": "Décédé(e) le {0}", "Default": "Par défaut", - "DefaultErrorMessage": "Il y a eu une erreur lors de l'exécution de la requête. Veuillez réessayer plus tard.", + "ErrorDefault": "Il y a eu une erreur lors de l'exécution de la requête. Veuillez réessayer plus tard.", "DefaultMetadataLangaugeDescription": "Ce sont vos réglages par défaut. Ils peuvent être personnalisés pour chaque médiathèque.", "DefaultSubtitlesHelp": "Les sous-titres seront chargés selon les marqueurs par défaut et forcé dans les métadonnées intégrées. Les langues préférées seront utilisées quand plusieurs options seront disponibles.", "Delete": "Supprimer", @@ -172,7 +143,7 @@ "DeviceAccessHelp": "Ceci ne s'applique qu'aux appareils qui peuvent être identifiés de manière unique et n'empêchera pas l'accès par navigateur. Le filtrage de l'accès aux appareil par utilisateur empêchera l'utilisation de nouveaux appareils jusqu'à ce qu'ils soient approuvés ici.", "DirectPlaying": "Lecture directe", "DirectStreamHelp1": "Le média est compatible avec l'appareil en ce qui concerne la résolution et le type de média (H.264, AC3, etc), mais se trouve dans un conteneur de fichiers incompatible (mkv, avi, wmv, etc). La vidéo sera rempaquetée à la volée avant d'être diffusée à l'appareil.", - "DirectStreamHelp2": "Le streaming en direct d'un fichier utilise très peu de puissance de traitement sans perte de qualité vidéo.", + "DirectStreamHelp2": "Le streaming en direct utilise très peu de puissance de traitement avec une perte minime de qualité vidéo.", "DirectStreaming": "Streaming direct", "Director": "Réalisateur(trice)", "Directors": "Réalisateurs", @@ -197,7 +168,6 @@ "EditImages": "Modifier les images", "EditMetadata": "Éditer les métadonnées", "EditSubtitles": "Modifier les sous-titres", - "EnableBackdrops": "Images d'arrière-plans", "EnableBackdropsHelp": "Afficher des images d'arrière-plans sur certaines pages pendant la navigation dans la médiathèque.", "EnableCinemaMode": "Mode cinéma", "EnableColorCodedBackgrounds": "Fonds avec code couleur", @@ -211,20 +181,18 @@ "EnablePhotosHelp": "Les images seront détectées et affichées avec les autres fichiers multimédia.", "EnableStreamLooping": "Reboucler les streaming en direct", "EnableStreamLoopingHelp": "Activez cette option si les streaming en direct ne contiennent que quelques secondes de données et doivent être redemandés continuellement. N'activez pas cette option sans raison car elle peut causer des problèmes.", - "EnableThemeSongs": "Thèmes musicaux", "EnableThemeSongsHelp": "Lire les thèmes musicaux en arrière-plan pendant la navigation dans la médiathèque.", - "EnableThemeVideos": "Thèmes vidéos", "EnableThemeVideosHelp": "Lire les thèmes vidéos en arrière-plan tout en parcourant la médiathèque.", "Ended": "Terminé", "EndsAtValue": "Se termine à {0}", "Episodes": "Épisodes", "ErrorAddingListingsToSchedulesDirect": "Une erreur est survenue pendant l'ajout de la programmation avec votre compte Schedules Direct. Schedules Direct autorise uniquement un nombre limité de programmations par compte. Vous devez vous connecter au site Schedules Direct et supprimer d'autres programmations depuis votre compte avant de pouvoir réessayer.", - "ErrorAddingMediaPathToVirtualFolder": "Une erreur est survenue pendant l'ajout du chemin des médias. Veuillez vérifier que le chemin est valide et que le processus du serveur Jellyfin peut y accéder.", + "ErrorAddingMediaPathToVirtualFolder": "Une erreur est survenue pendant l'ajout du chemin des médias. Veuillez vérifier que le chemin est valide et que Jellyfin peut y accéder.", "ErrorAddingTunerDevice": "Une erreur est survenue lors de l'ajout du tuner. Assurez-vous qu'il est accessible et réessayez.", "ErrorAddingXmlTvFile": "Une erreur est survenue lors de l'accès au fichier XMLTV. Assurez-vous que le fichier existe et réessayez.", - "ErrorDeletingItem": "Une erreur s'est produite lors de la suppression de l'élément du serveur Jellyfin. Vérifiez que le serveur Jellyfin a un accès en écriture au dossier multimédia et réessayez.", + "ErrorDeletingItem": "Une erreur s'est produite lors de la suppression de l'élément du serveur. Vérifiez que Jellyfin a un accès en écriture au dossier multimédia et réessayez.", "ErrorGettingTvLineups": "Une erreur est survenue pendant le téléchargement des programmes TV. Assurez-vous que vos informations sont correctes et réessayez.", - "ErrorMessageStartHourGreaterThanEnd": "La date de fin doit être postérieure à la date de début.", + "ErrorStartHourGreaterThanEnd": "La date de fin doit être postérieure à la date de début.", "ErrorPleaseSelectLineup": "Veuillez sélectionner une programmation et réessayer. Si aucune programmation n'est disponible, veuillez vérifier que vos identifiant, mot de passe et code postal sont corrects.", "ErrorSavingTvProvider": "Une erreur est survenue lors de la sauvegarde du fournisseur TV. Assurez-vous qu'il est accessible et réessayez.", "EveryNDays": "Tous les {0} jours", @@ -265,11 +233,9 @@ "HeaderActiveDevices": "Appareils actifs", "HeaderActiveRecordings": "Enregistrements actifs", "HeaderActivity": "Activité", - "HeaderAddScheduledTaskTrigger": "Ajouter un déclencheur", "HeaderAddToCollection": "Ajouter à la collection", "HeaderAddToPlaylist": "Ajouter à la liste de lecture", "HeaderAddUpdateImage": "Ajouter/Mettre à jour une image", - "HeaderAddUser": "Ajouter un utilisateur", "HeaderAdditionalParts": "Parties additionelles", "HeaderAdmin": "Administrateur", "HeaderAlbumArtists": "Artistes", @@ -277,21 +243,17 @@ "HeaderAllowMediaDeletionFrom": "Autoriser la suppression de médias à partir de", "HeaderApiKey": "Clé API", "HeaderApiKeys": "Clés API", - "HeaderApiKeysHelp": "Les applications externes ont besoin d'une clé d'API pour communiquer avec le serveur Jellyfin. Les clés sont distribuées lors d'une connexion avec un compte Jellyfin, ou bien en accordant manuellement une clé à une application.", + "HeaderApiKeysHelp": "Les applications externes ont besoin d'une clé d'API pour communiquer avec le serveur. Les clés sont distribuées lors d'une connexion avec un compte normal ou en accordant manuellement une clé à une application.", "HeaderApp": "Application", "HeaderAppearsOn": "Apparait dans", "HeaderAudioBooks": "Livres audios", "HeaderAudioSettings": "Réglages audio", - "HeaderAutomaticUpdates": "Mises à jour automatiques", "HeaderBlockItemsWithNoRating": "Bloquer les éléments avec des informations de classification inconnues ou n'en disposant pas :", - "HeaderBooks": "Livres", "HeaderBranding": "Slogan", "HeaderCancelRecording": "Annuler l'enregistrement", "HeaderCancelSeries": "Annuler la série", "HeaderCastAndCrew": "Distribution & équipe", - "HeaderCastCrew": "Distribution & équipe", "HeaderChannelAccess": "Accès aux chaînes", - "HeaderChannels": "Chaînes", "HeaderChapterImages": "Images des chapitres", "HeaderCodecProfile": "Profil de codec", "HeaderCodecProfileHelp": "Les profils de codec indiquent les limites d'un appareil lors de la lecture de codecs spécifiques. Si la limite s'applique au média, ce dernier sera transcodé, même si le codec est configuré pour la lecture directe.", @@ -319,22 +281,17 @@ "HeaderDevices": "Appareils", "HeaderDirectPlayProfile": "Profil de lecture directe :", "HeaderDirectPlayProfileHelp": "Ajoutez des profils de lecture directe pour indiquer quels formats l'appareil peut lire de façon native.", - "HeaderDisplay": "Affichage", "HeaderDownloadSync": "Télécharger et synchroniser", "HeaderEasyPinCode": "Code Easy PIN", "HeaderEditImages": "Modifier les images", "HeaderEnabledFields": "Activer les champs", "HeaderEnabledFieldsHelp": "Décocher un champ pour le verrouiller et empêcher ses données d'être modifiées.", - "HeaderEpisodes": "Épisodes", "HeaderError": "Erreur", "HeaderExternalIds": "Identifiants externes :", "HeaderFeatureAccess": "Accès aux fonctionnalités", - "HeaderFeatures": "Fonctionnalités", "HeaderFetchImages": "Télécharger les images :", "HeaderFetcherSettings": "Paramètres du récupérateur", - "HeaderFilters": "Filtres", "HeaderForKids": "Jeunesse", - "HeaderForgotPassword": "Mot de passe oublié", "HeaderFrequentlyPlayed": "Fréquemment lus", "HeaderGuideProviders": "Fournisseurs de données de guides TV", "HeaderHttpHeaders": "En-têtes HTTP", @@ -345,7 +302,6 @@ "HeaderImageSettings": "Paramètres d'image", "HeaderInstall": "Installer", "HeaderInstantMix": "Mix instantané", - "HeaderItems": "Éléments", "HeaderKeepRecording": "Garder l'enregistrement", "HeaderKeepSeries": "Garder la série", "HeaderKodiMetadataHelp": "Pour activer ou désactiver les métadonnées NFO, utilisez l'onglet Métadonnées et configurez les options pour vos types de médias.", @@ -359,16 +315,12 @@ "HeaderLibraryFolders": "Dossiers de la médiathèque", "HeaderLibraryOrder": "Ordre de la médiathèque", "HeaderLibrarySettings": "Paramètres de la médiathèque", - "HeaderLiveTV": "TV en direct", - "HeaderLiveTv": "TV en direct", "HeaderLiveTvTunerSetup": "Configuration du Tuner TV en direct", "HeaderLoginFailure": "Échec de la connexion", "HeaderMedia": "Média", "HeaderMediaFolders": "Dossiers multimédias", - "HeaderMediaInfo": "Informations du média", "HeaderMetadataSettings": "Paramètres des métadonnées", "HeaderMoreLikeThis": "Similaires", - "HeaderMovies": "Films", "HeaderMusicQuality": "Qualité de la musique :", "HeaderMusicVideos": "Vidéos musicales", "HeaderMyDevice": "Cet appareil", @@ -377,7 +329,6 @@ "HeaderNewApiKey": "Nouvelle clé API", "HeaderNewDevices": "Nouveaux appareils", "HeaderNextEpisodePlayingInValue": "Lecture du prochain épisode dans {0}", - "HeaderNextUp": "À suivre", "HeaderNextVideoPlayingInValue": "Lecture de la prochaine vidéo dans {0}", "HeaderOnNow": "En ce moment", "HeaderOtherItems": "Autres éléments", @@ -385,7 +336,6 @@ "HeaderPassword": "Mot de passe", "HeaderPasswordReset": "Mot de passe réinitialisé", "HeaderPaths": "Chemins", - "HeaderPeople": "Personnes", "HeaderPhotoAlbums": "Albums photo", "HeaderPinCodeReset": "Réinitialiser le code PIN", "HeaderPlayAll": "Tout lire", @@ -397,7 +347,7 @@ "HeaderPreferredMetadataLanguage": "Langue de métadonnées préférée", "HeaderProfile": "Profil", "HeaderProfileInformation": "Information de profil", - "HeaderProfileServerSettingsHelp": "Ces valeurs contrôlent la façon dont le serveur Jellyfin se présentera aux appareils.", + "HeaderProfileServerSettingsHelp": "Ces valeurs contrôlent la façon dont le serveur se présentera aux clients.", "HeaderRecentlyPlayed": "Lus récemment", "HeaderRecordingOptions": "Options d'enregistrement", "HeaderRecordingPostProcessing": "Traitement des enregistrements", @@ -410,7 +360,6 @@ "HeaderRevisionHistory": "Historique des révisions", "HeaderRunningTasks": "Tâches en cours d'exécution", "HeaderScenes": "Scènes", - "HeaderSchedule": "Planning", "HeaderSeasons": "Saisons", "HeaderSecondsValue": "{0} secondes", "HeaderSelectCertificatePath": "Sélectionnez le chemin du certificat", @@ -421,15 +370,13 @@ "HeaderSelectServerCachePath": "Sélectionner le chemin d'accès du cache de serveur", "HeaderSelectServerCachePathHelp": "Parcourir ou saisir le chemin d'accès à utiliser pour les fichiers cache du serveur. Le dossier doit être accessible en écriture.", "HeaderSelectTranscodingPath": "Sélectionner le chemin d'accès du dossier temporaire de transcodage", - "HeaderSelectTranscodingPathHelp": "Parcourir ou saisir le chemin d'accès à utiliser pour les fichiers de transcodage temporaires. Le dossier doit être accessible en écriture.", + "HeaderSelectTranscodingPathHelp": "Parcourir ou saisir le chemin d'accès à utiliser pour les fichiers de transcodage. Le dossier doit être accessible en écriture.", "HeaderSendMessage": "Envoyer un message", - "HeaderSeries": "Séries", "HeaderSeriesOptions": "Options de la série", "HeaderSeriesStatus": "Statut de la série", "HeaderServerSettings": "Paramètres du serveur", "HeaderSettings": "Paramètres", "HeaderSetupLibrary": "Configurer vos médiathèques", - "HeaderShutdown": "Éteindre", "HeaderSortBy": "Trier par", "HeaderSortOrder": "Ordre de tri", "HeaderSpecialEpisodeInfo": "Informations de l'épisode spécial", @@ -443,7 +390,6 @@ "HeaderSubtitleProfiles": "Profils de sous-titre", "HeaderSubtitleProfilesHelp": "Les profils de sous-titre décrivent les formats de sous-titre supportés par l'appareil.", "HeaderSystemDlnaProfiles": "Profils système", - "HeaderTags": "Étiquettes", "HeaderTaskTriggers": "Déclencheurs de tâches", "HeaderThisUserIsCurrentlyDisabled": "Cet utilisateur est actuellement désactivé", "HeaderTracks": "Pistes", @@ -464,15 +410,14 @@ "HeaderXmlDocumentAttributes": "Attributs des documents XML", "HeaderXmlSettings": "Paramètres XML", "HeaderYears": "Années", - "HeadersFolders": "Dossiers", "Help": "Aide", "Hide": "Cacher", "HideWatchedContentFromLatestMedia": "Masquer le contenu déjà vu dans les derniers médias", "Home": "Accueil", "HttpsRequiresCert": "Pour activer les connexions sécurisées, vous devrez fournir un certificat SSL vérifié, comme ceux fournis par Let's Encrypt. Veuillez fournir un certificat ou désactiver les connexions sécurisées.", "Identify": "Identifier", - "ImportFavoriteChannelsHelp": "Activez cette option pour n'importer que les chaînes ajoutées aux favoris sur le tuner.", - "ImportMissingEpisodesHelp": "Les informations à propos des épisodes manquants seront importées dans votre base de donnée Jellyfin et affichées dans les saisons et séries. Cela peut accroître significativement la durée d'actualisation de la médiathèque.", + "ImportFavoriteChannelsHelp": "Seules les chaînes ajoutées aux favoris sur le tuner seront importées.", + "ImportMissingEpisodesHelp": "Les informations à propos des épisodes manquants seront importées dans votre base de données et affichées dans les saisons et séries. Cela peut accroître significativement la durée d'actualisation de la médiathèque.", "InstallingPackage": "Installation de {0} (version {1})", "InstantMix": "Mix instantané", "ItemCount": "{0} éléments", @@ -496,23 +441,20 @@ "LabelAlbumArtMaxWidthHelp": "Résolution maximum des images d'album exposée par upnp:albumArtURI.", "LabelAlbumArtPN": "PN d'images d'album :", "LabelAlbumArtists": "Artistes de l'album :", - "LabelAll": "Tout", "LabelAllowHWTranscoding": "Autoriser le transcodage matériel", - "LabelAllowServerAutoRestart": "Autoriser le redémarrage automatique du serveur pour appliquer les mises à jour", - "LabelAllowServerAutoRestartHelp": "Le serveur ne redémarrera que pendant les périodes d'inactivité quand aucun utilisateur n'est connecté.", "LabelAllowedRemoteAddresses": "Filtre d'adresse IP distante :", "LabelAllowedRemoteAddressesMode": "Type de filtre des adresses IP distantes :", "LabelAppName": "Nom de l'application", "LabelAppNameExample": "Exemple: Sickbeard, Sonarr", "LabelArtists": "Artistes :", - "LabelArtistsHelp": "Séparer les différents éléments par ;", + "LabelArtistsHelp": "Séparer les différents éléments par un point-virgule.", "LabelAudioLanguagePreference": "Langue audio préférée :", "LabelAutomaticallyRefreshInternetMetadataEvery": "Actualiser automatiquement les métadonnées depuis internet :", "LabelBindToLocalNetworkAddress": "Lier à l'adresse de réseau local :", - "LabelBindToLocalNetworkAddressHelp": "Optionnel. Remplace l'adresse IP locale à laquelle se lie le serveur HTTP. Sans paramètre, le serveur va se lier à toutes les adresses disponibles. La modification de cette valeur nécessite le redémarrage du serveur Jellyfin.", + "LabelBindToLocalNetworkAddressHelp": "Remplace l'adresse IP locale du serveur HTTP. Sans paramètre, le serveur va se lier à toutes les adresses disponibles. La modification de cette valeur nécessite un redémarrage.", "LabelBirthDate": "Date de naissance :", "LabelBirthYear": "Année de naissance :", - "LabelBlastMessageInterval": "Intervalle des messages de présence (secondes)", + "LabelBlastMessageInterval": "Intervalle des messages de présence", "LabelBlastMessageIntervalHelp": "Détermine la durée en secondes entre les messages de présence.", "LabelBlockContentWithTags": "Bloquer les éléments avec les étiquettes :", "LabelBurnSubtitles": "Graver les sous-titres :", @@ -533,10 +475,8 @@ "LabelCustomCertificatePathHelp": "Chemin vers un fichier PKCS #12 contenant un certificat et une clé privée pour activer le support TLS sur un domaine utilisateur.", "LabelCustomCss": "CSS personnalisée :", "LabelCustomCssHelp": "Appliquez votre propre feuille de styles personnalisée à l'interface web.", - "LabelCustomDeviceDisplayName": "Nom d'affichage :", "LabelCustomDeviceDisplayNameHelp": "Entrez un nom d'affichage personnalisé ou laissez vide pour utiliser le nom rapporté par l'appareil.", "LabelCustomRating": "Note personnalisée :", - "LabelDashboardTheme": "Thème du tableau de bord du serveur :", "LabelDateAdded": "Date d'ajout :", "LabelDateAddedBehavior": "Choix de la date d'ajout pour le nouveau contenu :", "LabelDateAddedBehaviorHelp": "Si une métadonnée est présente, elle sera toujours utilisée avant ces options.", @@ -551,7 +491,6 @@ "LabelDiscNumber": "Numéro de disque :", "LabelDisplayLanguage": "Langue d'affichage :", "LabelDisplayLanguageHelp": "La traduction de Jellyfin est un projet en cours.", - "LabelDisplayMissingEpisodesWithinSeasons": "Afficher les épisodes manquants dans les saisons", "LabelDisplayMode": "Mode d'affichage :", "LabelDisplayName": "Nom d'affichage :", "LabelDisplayOrder": "Ordre d'affichage :", @@ -569,8 +508,8 @@ "LabelEnableAutomaticPortMapHelp": "Mapper automatiquement les ports publics vers des ports locaux via UPnP. Cela peut ne pas fonctionner avec certains modèles de routeurs. La modification de ce paramètre ne prendra effet qu'après redémarrage du serveur.", "LabelEnableBlastAliveMessages": "Diffuser des message de présence", "LabelEnableBlastAliveMessagesHelp": "Activer cette option si le serveur n'est pas détecté de manière fiable par les autres appareils UPnP sur votre réseau.", - "LabelEnableDlnaClientDiscoveryInterval": "Intervalle de découverte des clients (secondes)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Détermine la durée en secondes entre les recherches SSDP exécutées par Jellyfin.", + "LabelEnableDlnaClientDiscoveryInterval": "Intervalle de découverte des clients", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Détermine la durée en secondes entre les recherches SSDP.", "LabelEnableDlnaDebugLogging": "Activer le débogage DLNA dans le journal d'événements", "LabelEnableDlnaDebugLoggingHelp": "Génère de gros fichiers de journal d'événements et ne devrait être utilisé que pour des diagnostics d'erreur.", "LabelEnableDlnaPlayTo": "Activer la lecture en DLNA", @@ -579,7 +518,7 @@ "LabelEnableDlnaServerHelp": "Autorise les appareils UPnP de votre réseau à parcourir et à lire le contenu.", "LabelEnableHardwareDecodingFor": "Activer le décodage matériel pour :", "LabelEnableRealtimeMonitor": "Activer la surveillance en temps réel", - "LabelEnableRealtimeMonitorHelp": "Les modifications des fichiers seront traitées immédiatement, sur les systèmes de fichiers qui le permettent.", + "LabelEnableRealtimeMonitorHelp": "Les modifications des fichiers seront traitées immédiatement sur les systèmes de fichiers qui le permettent.", "LabelEnableSingleImageInDidlLimit": "Limiter à une seule image intégrée", "LabelEnableSingleImageInDidlLimitHelp": "Quelques périphériques ne fourniront pas un rendu correct si plusieurs images sont intégrées dans Didl.", "LabelEndDate": "Date de fin :", @@ -595,9 +534,9 @@ "LabelForgotPasswordUsernameHelp": "Saisissez votre nom d'utilisateur, si vous vous en souvenez.", "LabelFormat": "Format :", "LabelFriendlyName": "Nom d'affichage :", - "LabelServerNameHelp": "Ce nom sera utilisé pour identifier le serveur. La valeur par défaut est le nom d'ordinateur du serveur.", + "LabelServerNameHelp": "Ce nom sera utilisé pour identifier le serveur. La valeur par défaut est le nom d'hôte du serveur.", "LabelGroupMoviesIntoCollections": "Grouper les films en collections", - "LabelGroupMoviesIntoCollectionsHelp": "Dans l'affichage des listes de films, les films faisant partie d'une collection seront affichés comme un élément groupé.", + "LabelGroupMoviesIntoCollectionsHelp": "Dans l'affichage des listes de films, les films d'une collection seront affichés comme un élément groupé.", "LabelH264Crf": "CRF d'encodage H264 :", "LabelEncoderPreset": "Profil d'encodage H264 :", "LabelHardwareAccelerationType": "Accélération matérielle :", @@ -605,7 +544,7 @@ "LabelHomeNetworkQuality": "Qualité du réseau local :", "LabelHomeScreenSectionValue": "Section {0} de l'accueil :", "LabelHttpsPort": "Numéro de port HTTPS local :", - "LabelHttpsPortHelp": "Le port TCP que le serveur HTTPS de Jellyfin doit utiliser.", + "LabelHttpsPortHelp": "Le numéro de port TCP pour le serveur HTTPS.", "LabelIconMaxHeight": "Hauteur maximum des icônes :", "LabelIconMaxHeightHelp": "Résolution maximum des icônes exposée par upnp:icon.", "LabelIconMaxWidth": "Largeur maximum des icônes :", @@ -633,7 +572,7 @@ "LabelLanguage": "Langue :", "LabelLineup": "Programmation :", "LabelLocalHttpServerPortNumber": "Numéro de port HTTP local :", - "LabelLocalHttpServerPortNumberHelp": "Le port TCP que le serveur HTTP de Jellyfin doit utiliser.", + "LabelLocalHttpServerPortNumberHelp": "Le numéro de port TCP pour le serveur HTTP.", "LabelLockItemToPreventChanges": "Verrouiller cet élément pour éviter de futures modifications", "LabelLoginDisclaimer": "Avertissement sur la page d'accueil :", "LabelLoginDisclaimerHelp": "Le slogan sera affiché en bas de la page de connexion.", @@ -659,7 +598,7 @@ "LabelMetadataReaders": "Lecteurs de métadonnées :", "LabelMetadataReadersHelp": "Classez vos sources locales de métadonnées préférées dans l'ordre de priorité. Le premier fichier trouvé sera lu.", "LabelMetadataSavers": "Enregistreurs de métadonnées :", - "LabelMetadataSaversHelp": "Sélectionnez un format de fichier pour l'enregistrement des métadonnées.", + "LabelMetadataSaversHelp": "Sélectionnez un format de fichier qui sera utilisé pour l'enregistrement des métadonnées.", "LabelMethod": "Méthode :", "LabelMinBackdropDownloadWidth": "Largeur minimum d'image d'arrière-plan à télécharger :", "LabelMinResumeDuration": "Temps de reprise minimum :", @@ -675,7 +614,7 @@ "LabelMovieCategories": "Catégories de films :", "LabelMoviePrefix": "Préfixe de film :", "LabelMoviePrefixHelp": "Si un préfixe est appliqué aux titres de film, précisez-le ici afin que le serveur puisse le gérer convenablement.", - "LabelMovieRecordingPath": "Chemin d'enregistrement des films (optionnel) :", + "LabelMovieRecordingPath": "Chemin d'enregistrement des films :", "LabelMusicStreamingTranscodingBitrate": "Débit du transcodage de la musique :", "LabelMusicStreamingTranscodingBitrateHelp": "Spécifiez le débit maximum pendant la diffusion de musique.", "LabelName": "Nom :", @@ -683,13 +622,12 @@ "LabelNewPassword": "Nouveau mot de passe :", "LabelNewPasswordConfirm": "Confirmer le nouveau mot de passe :", "LabelNewsCategories": "Catégories des informations :", - "LabelNext": "Suivant", "LabelNotificationEnabled": "Activer cette notification", "LabelNumber": "Numéro :", "LabelNumberOfGuideDays": "Nombre de jours de données du guide à télécharger :", "LabelNumberOfGuideDaysHelp": "Télécharger plus de journées du guide permet de programmer des enregistrements plus longtemps à l'avance et de visualiser plus de contenus, mais prendra également plus de temps. Automatique permettra une sélection automatique basée sur le nombre de chaînes.", - "LabelOptionalNetworkPath": "(Optionnel) Dossier réseau partagé :", - "LabelOptionalNetworkPathHelp": "Si le dossier est partagé sur votre réseau, donner le chemin d'accès au dossier réseau peut permettre aux applications Jellyfin sur d'autres appareils d'avoir accès à ses fichiers directement. Par exemple, {0} ou {1}.", + "LabelOptionalNetworkPath": "Dossier réseau partagé :", + "LabelOptionalNetworkPathHelp": "Si le dossier est partagé sur votre réseau, donner le chemin d'accès au dossier réseau peut permettre aux clients sur d'autres appareils d'avoir accès à ses fichiers directement. Par exemple, {0} ou {1}.", "LabelOriginalAspectRatio": "Ratio d'aspect original :", "LabelOriginalTitle": "Titre original :", "LabelOverview": "Synopsis :", @@ -708,9 +646,7 @@ "LabelPostProcessorArguments": "Arguments en ligne de commande du post-processeur :", "LabelPostProcessorArgumentsHelp": "Utiliser {path} comme chemin d'accès au fichier d'enregistrement.", "LabelPreferredDisplayLanguage": "Langue d'affichage préférée :", - "LabelPreferredDisplayLanguageHelp": "La traduction de Jellyfin est un projet en cours.", "LabelPreferredSubtitleLanguage": "Langue de sous-titrage préférée :", - "LabelPrevious": "Précédent", "LabelProfileAudioCodecs": "Codecs audio :", "LabelProfileCodecs": "Codecs :", "LabelProfileCodecsHelp": "Séparés par des virgules. Peut être laissé vide pour s'appliquer à tous les codecs.", @@ -724,7 +660,6 @@ "LabelPublicHttpPortHelp": "Le numéro de port public à mapper sur le port HTTP local.", "LabelPublicHttpsPort": "Numéro de port HTTPS public :", "LabelPublicHttpsPortHelp": "Le numéro de port public à mapper sur le port HTTPS local.", - "LabelReadHowYouCanContribute": "Voir comment vous pouvez contribuer.", "LabelReasonForTranscoding": "Raison du transcodage :", "LabelRecord": "Enregistrer :", "LabelRecordingPath": "Chemin d'enregistrement par défaut :", @@ -733,7 +668,7 @@ "LabelReleaseDate": "Date de sortie :", "LabelRemoteClientBitrateLimit": "Limite de débit de streaming Internet (Mbps) :", "LabelRemoteClientBitrateLimitHelp": "Une limite de débit optionnelle par streaming pour les connexions hors du réseau local. Utile pour éviter que les appareils ne demandent un débit supérieur à ce que votre connexion internet peu fournir. Cela peut augmenter la charge du processeur de votre serveur pour transcoder les vidéos à la volée à un débit plus faible.", - "LabelRuntimeMinutes": "Durée (minutes) :", + "LabelRuntimeMinutes": "Durée :", "LabelSaveLocalMetadata": "Enregistrer les illustrations dans les dossiers des médias", "LabelSaveLocalMetadataHelp": "L'enregistrement des illustrations dans les dossiers des médias les placera à un endroit où elles seront facilement modifiables.", "LabelScheduledTaskLastRan": "Dernière exécution {0}, durée {1}.", @@ -745,11 +680,10 @@ "LabelSelectVersionToInstall": "Sélectionner la version à installer :", "LabelSendNotificationToUsers": "Envoyer la notification à :", "LabelSerialNumber": "Numéro de série", - "LabelSeriesRecordingPath": "Chemin d'enregistrement des séries (optionnel) :", + "LabelSeriesRecordingPath": "Chemin d'enregistrement des séries :", "LabelServerHost": "Nom d'hôte :", "LabelServerHostHelp": "192.168.1.1:8096 ou https://monserveur.com", "LabelSimultaneousConnectionLimit": "Limite de flux simultanée :", - "LabelSkin": "Habillage :", "LabelSkipBackLength": "Durée des sauts en arrière :", "LabelSkipForwardLength": "Durée des sauts en avant :", "LabelSkipIfAudioTrackPresent": "Sauter si la piste audio correspond à la langue de téléchargement", @@ -761,7 +695,6 @@ "LabelSortBy": "Trier par :", "LabelSortOrder": "Ordre de tri :", "LabelSortTitle": "Titre de tri :", - "LabelSoundEffects": "Effets sonores :", "LabelSource": "Source :", "LabelSpecialSeasonsDisplayName": "Nom d'affichage de la saison spécial :", "LabelSportsCategories": "Catégories des sports :", @@ -772,7 +705,6 @@ "LabelSubtitleDownloaders": "Outils de téléchargement de sous-titres :", "LabelSubtitleFormatHelp": "Exemple : srt", "LabelSubtitlePlaybackMode": "Mode des sous-titres :", - "LabelSubtitles": "Sous-titres", "LabelSupportedMediaTypes": "Types de médias supportés :", "LabelTVHomeScreen": "Écran d'accueil du mode TV :", "LabelTag": "Étiquette :", @@ -785,12 +717,9 @@ "LabelTimeLimitHours": "Limite de temps (heures) :", "LabelTitle": "Titre :", "LabelTrackNumber": "Numéro de piste :", - "LabelTranscodingAudioCodec": "Codec audio :", - "LabelTranscodingContainer": "Conteneur :", "LabelTranscodingTempPathHelp": "Spécifiez un chemin personnalisé pour les fichiers transcodés envoyés aux clients. Laissez vide pour utiliser le chemin par défaut du serveur.", "LabelTranscodingThreadCount": "Nombre de threads de transcodage :", "LabelTranscodingThreadCountHelp": "Sélectionnez le nombre maximum de threads à utiliser pour le transcodage. La réduction de cette valeur réduira l'utilisation du processeur mais pourrait ne pas suffire pour maintenir une lecture fluide.", - "LabelTranscodingVideoCodec": "Codec vidéo :", "LabelTriggerType": "Type de déclencheur :", "LabelTunerIpAddress": "Adresse IP du tuner :", "LabelTunerType": "Type de tuner :", @@ -815,18 +744,16 @@ "LabelXDlnaDoc": "Doc X-DLNA :", "LabelXDlnaDocHelp": "Détermine le contenu de l'élément X_DLNADOC dans l'espace de nom urn:schemas-dlna-org:device-1-0.", "LabelYear": "Année :", - "LabelYourFirstName": "Votre prénom :", "LabelYoureDone": "Vous avez terminé !", "LabelZipCode": "Code postal :", "LabelffmpegPath": "Chemin vers FFmpeg :", - "LabelffmpegPathHelp": "Le chemin d'accès vers l'application FFmpeg, ou un dossier contenant FFmpeg.", + "LabelffmpegPathHelp": "Le chemin d'accès vers l'application FFmpeg ou un dossier contenant FFmpeg.", "LanNetworksHelp": "Liste des adresses IP ou des entrées IP/masque de réseau séparées par des virgules pour les réseaux qui seront considérés comme locaux lors de l'application des restrictions de bande passante. Si elle est définie, toutes les autres adresses IP seront considérées sur le réseau externe et seront soumises aux restrictions de bande passante externe. Si elle est vide, seul le sous-réseau du serveur est considéré comme se trouvant sur le réseau local.", "Large": "Grand", "LatestFromLibrary": "{0}, ajouts récents", "LearnHowYouCanContribute": "Voir comment vous pouvez contribuer.", "LibraryAccessHelp": "Sélectionnez les médiathèques à partager avec cet utilisateur. Les administrateurs pourront modifier tous les dossiers en utilisant le gestionnaire de métadonnées.", "Like": "J'aime", - "LinksValue": "Liens: {0}", "List": "Liste", "Live": "En direct", "LiveBroadcasts": "Diffusions en direct", @@ -869,20 +796,19 @@ "MessageConfirmProfileDeletion": "Voulez-vous vraiment supprimer ce profil ?", "MessageConfirmRecordingCancellation": "Annuler l'enregistrement ?", "MessageConfirmRemoveMediaLocation": "Voulez-vous vraiment supprimer cet emplacement ?", - "MessageConfirmRestart": "Voulez-vous vraiment redémarrer le serveur Jellyfin ?", - "MessageConfirmRevokeApiKey": "Voulez-vous vraiment révoquer cette clé API ? La connexion de l'application au serveur Jellyfin sera brutalement interrompue.", + "MessageConfirmRestart": "Voulez-vous vraiment redémarrer Jellyfin ?", + "MessageConfirmRevokeApiKey": "Voulez-vous vraiment révoquer cette clé API ? La connexion de l'application à ce serveur sera brutalement interrompue.", "MessageConfirmShutdown": "Voulez-vous vraiment éteindre le serveur ?", "MessageContactAdminToResetPassword": "Veuillez contacter votre administrateur système pour réinitialiser votre mot de passe.", "MessageCreateAccountAt": "Créer un compte sur {0}", "MessageDeleteTaskTrigger": "Voulez-vous vraiment supprimer ce déclencheur de tâche ?", - "MessageDirectoryPickerBSDInstruction": "Sur BSD, vous devrez peut-être configurer le stockage de votre jail FreeNAS pour autoriser Jellyfin à y accéder.", + "MessageDirectoryPickerBSDInstruction": "Sur BSD, vous devrez peut-être configurer le stockage de votre jail FreeNAS pour autoriser Jellyfin à accéder à vos médias.", "MessageDirectoryPickerLinuxInstruction": "Pour Linux sur Arch Linux, CentOS, Debian, Fedora, openSUSE ou Ubuntu, vous devez au moins autoriser l'accès en lecture à vos répertoires de stockage pour l'utilisateur de service .", "MessageDownloadQueued": "Téléchargement mis en file d'attente.", "MessageEnablingOptionLongerScans": "Activer cette option peut accroître la durée d'actualisation de la médiathèque.", "MessageFileReadError": "Une erreur est survenue lors de la lecture du fichier. Veuillez réessayer.", "MessageForgotPasswordFileCreated": "Le fichier suivant a été créé sur votre serveur et contient les instructions sur la procédure à suivre :", "MessageForgotPasswordInNetworkRequired": "Veuillez réessayer à partir de votre réseau local pour démarrer la procédure de réinitialisation du mot de passe.", - "MessageInstallPluginFromApp": "Cette extension doit-être installée depuis l'application dans laquelle vous voulez l'utiliser.", "MessageInvalidForgotPasswordPin": "Le code PIN saisi est invalide ou a expiré. Veuillez réessayer.", "MessageInvalidUser": "Nom d'utilisateur ou mot de passe incorrect. Réessayez.", "MessageItemSaved": "Élément enregistré.", @@ -898,9 +824,8 @@ "MessagePleaseEnsureInternetMetadata": "Veuillez vous assurer que le téléchargement des métadonnées depuis Internet est activé.", "MessagePleaseWait": "Veuillez patienter. Ceci peut prendre quelques minutes.", "MessagePluginConfigurationRequiresLocalAccess": "Pour configurer cette extension, veuillez vous connecter directement à votre serveur local.", - "MessagePluginInstallDisclaimer": "Les extensions développées par les membres de la communauté Jellyfin sont une excellente manière d'améliorer votre expérience Jellyfin avec de nouvelles fonctionnalités. Avant toute installation, veuillez prendre connaissance de l'impact qu'elles peuvent avoir sur le serveur Jellyfin, comme l'augmentation de la durée d'actualisation de la médiathèque, de nouvelles tâches de fond, ou un système moins stable.", + "MessagePluginInstallDisclaimer": "Les extensions développées par les membres de la communauté sont une excellente manière d'améliorer votre expérience avec de nouvelles fonctionnalités. Avant toute installation, veuillez prendre connaissance de l'impact qu'elles peuvent avoir sur le serveur, comme l'augmentation de la durée d'actualisation de la médiathèque, de nouvelles tâches de fond, ou un système moins stable.", "MessageReenableUser": "Voir ci-dessous pour le réactiver", - "MessageSettingsSaved": "Paramètres enregistrés.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Ces emplacements de média vont être supprimés de votre médiathèque :", "MessageUnableToConnectToServer": "Nous sommes dans l'impossibilité de nous connecter au serveur sélectionné. Veuillez vérifier qu'il est opérationnel et réessayez.", "MessageUnsetContentHelp": "Le contenu sera affiché sous forme de dossiers. Pour un résultat optimal, utilisez le gestionnaire de métadonnées pour définir le type de contenu des sous-dossiers.", @@ -932,10 +857,9 @@ "NextUp": "A Suivre", "No": "Non", "NoNewDevicesFound": "Aucun nouvel appareil détecté. Pour en ajouter un, fermez cette fenêtre et saisissez les informations de l'appareil manuellement.", - "NoNextUpItemsMessage": "Aucun élément trouvé. Commencez à regarder vos émissions !", - "NoPluginConfigurationMessage": "Cette extension n'a aucun paramètre à configurer.", + "MessageNoNextUpItems": "Aucun élément trouvé. Commencez à regarder vos émissions !", + "MessageNoPluginConfiguration": "Cette extension n'a aucun paramètre à configurer.", "NoSubtitleSearchResultsFound": "Aucun résultat trouvé.", - "NoSubtitles": "Pas de sous-titres", "NoSubtitlesHelp": "Les sous-titres ne seront pas chargés par défaut. Ils peuvent toujours être activés manuellement pendant la lecture.", "None": "Aucun", "NumLocationsValue": "{0} dossiers", @@ -954,7 +878,7 @@ "OptionAllowLinkSharingHelp": "Seules les pages Web contenant des informations de médias sont partagés. Les fichiers multimédias ne sont jamais partagés publiquement. Les partages sont limités dans le temps et expirent après {0} jours.", "OptionAllowManageLiveTv": "Autoriser la gestion des enregistrements de TV en direct", "OptionAllowMediaPlayback": "Autoriser la lecture de média", - "OptionAllowMediaPlaybackTranscodingHelp": "Limiter l'accès au transcodage peut entraîner des échecs de lecture dans les applications Jellyfin en raison de formats de média non pris en charge.", + "OptionAllowMediaPlaybackTranscodingHelp": "Limiter l'accès au transcodage peut entraîner des échecs de lecture dans les clients en raison de formats de média non pris en charge.", "OptionAllowRemoteControlOthers": "Autoriser le contrôle à distance des autres utilisateurs", "OptionAllowRemoteSharedDevices": "Autoriser le contrôle à distance des appareils partagés", "OptionAllowRemoteSharedDevicesHelp": "Les appareils DLNA sont considérés comme partagés tant qu'un utilisateur ne commence pas à les contrôler.", @@ -965,7 +889,6 @@ "OptionArtist": "Artiste", "OptionAscending": "Croissant", "OptionAuto": "Automatique", - "OptionAutomatic": "Automatique", "OptionAutomaticallyGroupSeries": "Fusionner automatiquement les séries qui sont réparties en plusieurs dossiers", "OptionAutomaticallyGroupSeriesHelp": "Les séries qui sont réparties en plusieurs dossiers dans la médiathèque seront automatiquement fusionnées en une seule série.", "OptionBlockBooks": "Livres", @@ -986,7 +909,7 @@ "OptionDatePlayed": "Date de lecture", "OptionDescending": "Décroissant", "OptionDisableUser": "Désactiver cet utilisateur", - "OptionDisableUserHelp": "Si désactivé, le serveur n'autorisera pas de connexion de cet utilisateur. Les connexions existantes seront interrompues.", + "OptionDisableUserHelp": "Le serveur n'autorisera pas de connexion de cet utilisateur. Les connexions existantes seront interrompues.", "OptionDislikes": "Pas aimés", "OptionDisplayFolderView": "Afficher une vue de dossiers pour montrer les dossiers multimédia en intégralité", "OptionDisplayFolderViewHelp": "Afficher les dossier au côté de votre médiathèque. Cela peut être utile si vous souhaitez avoir une vue complète des dossiers.", @@ -995,7 +918,7 @@ "OptionDownloadBoxImage": "Boîtier", "OptionDownloadDiscImage": "Disque", "OptionDownloadImagesInAdvance": "Télécharger les images en avance", - "OptionDownloadImagesInAdvanceHelp": "Par défaut, la plupart des images sont téléchargées seulement lorsqu'une application Jellyfin le demande. Sélectionnez cette option pour télécharger toutes les images à l'avance, lorsqu'un nouveau média est importé. Cela peut allonger significativement la durée d'actualisation de la médiathèque.", + "OptionDownloadImagesInAdvanceHelp": "Par défaut, la plupart des images sont téléchargées seulement lorsqu'un client le demande. Sélectionnez cette option pour télécharger toutes les images à l'avance, lorsqu'un nouveau média est importé. Cela peut allonger significativement la durée d'actualisation de la médiathèque.", "OptionDownloadPrimaryImage": "Principal", "OptionDownloadThumbImage": "Vignette", "OptionDvd": "DVD", @@ -1015,7 +938,6 @@ "OptionExternallyDownloaded": "Téléchargement externe", "OptionExtractChapterImage": "Activer l'extraction des images de chapitres", "OptionFavorite": "Favoris", - "OptionFriday": "Vendredi", "OptionHasSpecialFeatures": "Bonus", "OptionHasSubtitles": "Sous-titres", "OptionHasThemeSong": "Chanson thème", @@ -1026,22 +948,20 @@ "OptionHlsSegmentedSubtitles": "Sous-titres segmentés HLS", "OptionHomeVideos": "Photos", "OptionIgnoreTranscodeByteRangeRequests": "Ignore les requêtes de transcodage de plage d'octets", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Si l'option est activée, ces requêtes seront honorées mais l'en-tête de plage d'octets sera ignoré.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Ces requêtes seront honorées mais l'en-tête de plage d'octets sera ignoré.", "OptionImdbRating": "Note IMDb", "OptionLikes": "Aimés", "OptionMax": "Maximum", "OptionMissingEpisode": "Épisodes manquantes", - "OptionMonday": "Lundi", "OptionNameSort": "Nom", "OptionNew": "Nouveau…", "OptionNone": "Aucun", - "OptionOnAppStartup": "Au démarrage de l'application", "OptionOnInterval": "Par intervalle", "OptionParentalRating": "Classification parentale", "OptionPlainStorageFolders": "Afficher tous les dossiers en tant que simples dossiers de stockage", - "OptionPlainStorageFoldersHelp": "Tous les répertoires seront affichés dans le DIDL en tant que \"object.container.storageFolder\" au lieu de formats plus spécifiques comme, par exemple \"object.container.person.musicArtist\".", + "OptionPlainStorageFoldersHelp": "Tous les répertoires seront affichés dans le DIDL en tant que \"object.container.storageFolder\" au lieu de formats plus spécifiques comme, par exemple \"object.container.person.musicArtist\".", "OptionPlainVideoItems": "Afficher les vidéos en tant que simples éléments vidéos", - "OptionPlainVideoItemsHelp": "Si activé, toutes les vidéos seront affichées dans le DIDL en tant que \"object.item.videoItem\" au lieu de formats plus spécifiques comme, par exemple \"object.item.videoItem.movie\".", + "OptionPlainVideoItemsHelp": "Toutes les vidéos seront affichées dans le DIDL en tant que \"object.item.videoItem\" au lieu de formats plus spécifiques comme, par exemple \"object.item.videoItem.movie\".", "OptionPlayCount": "Nombre de lectures", "OptionPlayed": "Lu", "OptionPremiereDate": "Date de la première", @@ -1056,20 +976,15 @@ "OptionResElement": "Résolution d'élément", "OptionResumable": "Reprise possible", "OptionRuntime": "Durée", - "OptionSaturday": "Samedi", "OptionSaveMetadataAsHidden": "Enregistrer les métadonnées et les images en tant que fichier cachés", - "OptionSaveMetadataAsHiddenHelp": "La modification s'appliquera aux nouvelles métadonnées enregistrées à l'avenir. Les fichiers de métadonnées existants seront mis à jour la prochaine fois qu'ils seront enregistrés par le serveur Jellyfin.", + "OptionSaveMetadataAsHiddenHelp": "La modification s'appliquera aux nouvelles métadonnées enregistrées à l'avenir. Les fichiers de métadonnées existants seront mis à jour la prochaine fois qu'ils seront enregistrés par le serveur.", "OptionSpecialEpisode": "Spéciaux", "OptionSubstring": "Sous-chaîne", - "OptionSunday": "Dimanche", - "OptionThursday": "Jeudi", "OptionTrackName": "Titre", - "OptionTuesday": "Mardi", "OptionTvdbRating": "Note d'évaluation TVDB", "OptionUnairedEpisode": "Épisodes non diffusés", "OptionUnplayed": "Non lu", "OptionWakeFromSleep": "Sortie de veille", - "OptionWednesday": "Mercredi", "OptionWeekdays": "Jours de la semaine", "OptionWeekends": "Week-ends", "OptionWeekly": "Hebdomadaire", @@ -1082,7 +997,7 @@ "PasswordMatchError": "Le mot de passe et sa confirmation doivent correspondre.", "PasswordResetComplete": "Le mot de passe a été réinitialisé.", "PasswordResetConfirmation": "Êtes-vous sûr de vouloir réinitialiser le mot de passe ?", - "PasswordResetHeader": "Réinitialiser le mot de passe", + "HeaderResetPassword": "Réinitialiser le mot de passe", "PasswordSaved": "Mot de passe sauvegardé.", "People": "Personnes", "PerfectMatch": "Correspondance parfaite", @@ -1101,9 +1016,9 @@ "PleaseAddAtLeastOneFolder": "Veuillez ajouter au moins un dossier à cette médiathèque en cliquant sur le bouton Ajouter.", "PleaseConfirmPluginInstallation": "Merci de cliquer sur OK pour confirmer que vous avez lu ce qui précède et que vous souhaitez poursuivre l'installation de l'extension.", "PleaseEnterNameOrId": "Veuillez saisir un nom ou un identifiant externe.", - "PleaseRestartServerName": "Veuillez redémarrer le serveur Jellyfin - {0}.", + "PleaseRestartServerName": "Veuillez redémarrer le serveur Jellyfin sur {0}.", "PleaseSelectTwoItems": "Veuillez sélectionner au moins deux éléments.", - "PluginInstalledMessage": "Cette extension a été installée avec succès. Le serveur Jellyfin doit être redémarré afin que les modifications soient prises en compte.", + "MessagePluginInstalled": "Cette extension a été installée avec succès. Le serveur doit être redémarré afin que les modifications soient prises en compte.", "PreferEmbeddedTitlesOverFileNames": "Préférer les titres intégrés aux médias aux noms des fichiers", "PreferEmbeddedTitlesOverFileNamesHelp": "Cela détermine le titre affiché par défaut quand il n'y a pas de métadonnées en ligne ou locales disponibles.", "Premieres": "Inédits", @@ -1113,7 +1028,6 @@ "ProductionLocations": "Sites de production", "Programs": "Programmes", "Quality": "Qualité", - "QueueAllFromHere": "Tout mettre en file d'attente à partir d'ici", "Raised": "Élevé", "Rate": "Débit", "RecentlyWatched": "Lu récemment", @@ -1124,11 +1038,11 @@ "Record": "Enregistrer", "RecordSeries": "Enregistrer la série", "RecordingCancelled": "Enregistrement annulé.", - "RecordingPathChangeMessage": "Modifier votre dossier d'enregistrement ne déplacera pas les enregistrements existants de l'ancien emplacement vers le nouveau. Vous devrez les déplacer manuellement si vous le souhaitez.", + "MessageChangeRecordingPath": "Modifier votre dossier d'enregistrement ne déplacera pas les enregistrements existants de l'ancien emplacement vers le nouveau. Vous devrez les déplacer manuellement si vous le souhaitez.", "RecordingScheduled": "Enregistrement planifié.", "Recordings": "Enregistrements", "Refresh": "Actualiser", - "RefreshDialogHelp": "Les métadonnées sont actualisées en fonction des paramètres et des services Internet qui sont activés dans le tableau de bord du serveur Jellyfin.", + "RefreshDialogHelp": "Les métadonnées sont actualisées en fonction des paramètres et des services Internet qui sont activés dans le tableau de bord.", "RefreshMetadata": "Actualiser les métadonnées", "RefreshQueued": "Actualisation mise en file d'attente.", "ReleaseDate": "Date de sortie", @@ -1144,7 +1058,6 @@ "ReplaceExistingImages": "Remplacer les images existantes", "ResumeAt": "Reprendre à {0}", "Rewind": "Rembobiner", - "RunAtStartup": "Exécuter au démarrage", "Runtime": "Durée", "Saturday": "Samedi", "Save": "Sauvegarder", @@ -1167,10 +1080,10 @@ "SeriesRecordingScheduled": "Enregistrement de la série planifié.", "SeriesSettings": "Paramètres de la série", "SeriesYearToPresent": "{0} - Présent", - "ServerNameIsRestarting": "Serveur Jellyfin - {0} redémarre.", - "ServerNameIsShuttingDown": "Serveur Jellyfin - {0} s'arrête.", - "ServerRestartNeededAfterPluginInstall": "Le serveur Jellyfin devra être redémarré après l'installation d'une extension.", - "ServerUpdateNeeded": "Le serveur Jellyfin doit être mis à jour. Pour télécharger la dernière version, veuillez visiter {0}", + "ServerNameIsRestarting": "Le serveur sur {0} redémarre.", + "ServerNameIsShuttingDown": "Le serveur sur {0} s'arrête.", + "ServerRestartNeededAfterPluginInstall": "Jellyfin devra être redémarré après l'installation d'une extension.", + "ServerUpdateNeeded": "Ce serveur doit être mis à jour. Pour télécharger la dernière version, veuillez visiter {0}", "Settings": "Paramètres", "SettingsSaved": "Paramètres enregistrés.", "SettingsWarning": "La modification de ces valeurs peut provoquer des défaillances de stabilité ou de connectivité. Si vous rencontrez des problèmes, nous vous recommandons de les remettre aux valeurs par défaut.", @@ -1204,48 +1117,25 @@ "SystemDlnaProfilesHelp": "Les profils système sont en lecture seule. Les modifications apportées à un profil système seront enregistrées sous un nouveau profil personnalisé.", "TabAccess": "Accès", "TabAdvanced": "Avancé", - "TabAlbumArtists": "Artistes de l'album", - "TabArtists": "Artistes", "TabCatalog": "Catalogue", - "TabChannels": "Chaînes", "TabContainers": "Conteneurs", "TabDashboard": "Tableau de bord", - "TabDevices": "Appareils", "TabDirectPlay": "Lecture directe", - "TabDisplay": "Affichage", - "TabEpisodes": "Épisodes", - "TabFavorites": "Favoris", "TabLatest": "Derniers", - "TabLiveTV": "TV en direct", "TabLogs": "Journaux", - "TabMetadata": "Métadonnées", - "TabMovies": "Films", "TabMusic": "Musique", - "TabMusicVideos": "Vidéos musicales", "TabMyPlugins": "Mes extensions", "TabNetworks": "Réseaux", "TabNfoSettings": "Paramètres NFO", "TabOther": "Autre", "TabParentalControl": "Contrôle Parental", - "TabPassword": "Mot de passe", - "TabPlayback": "Lecture", - "TabPlaylist": "Liste de lecture", - "TabPlaylists": "Listes de lecture", "TabProfile": "Profil", "TabProfiles": "Profils", - "TabRecordings": "Enregistrements", "TabResponses": "Réponses", - "TabResumeSettings": "Reprise", "TabScheduledTasks": "Tâches planifiées", - "TabSeries": "Séries", "TabServer": "Serveur", "TabSettings": "Paramètres", - "TabShows": "Séries", - "TabSongs": "Chansons", - "TabTrailers": "Bandes-annonces", - "TabTranscoding": "Transcodage", "TabUpcoming": "À venir", - "TabUsers": "Utilisateurs", "Tags": "Étiquettes", "TagsValue": "Mots clés: {0}", "TellUsAboutYourself": "Parlez-nous de vous", @@ -1265,7 +1155,7 @@ "TvLibraryHelp": "Consultez le {0}guide de nommage des émissions{1}.", "Uniform": "Uniforme", "UninstallPluginConfirmation": "Êtes-vous sûr de vouloir désinstaller {0} ?", - "UninstallPluginHeader": "Désinstaller Plug-in", + "HeaderUninstallPlugin": "Désinstaller Plug-in", "Unmute": "Rétablir le son", "Unplayed": "Non lu", "Unrated": "Non noté", @@ -1294,7 +1184,6 @@ "ValueTimeLimitSingleHour": "Limite de temps : 1 heure", "ValueVideoCodec": "Codec Vidéo : {0}", "Vertical": "Verticale", - "VideoRange": "Gamme vidéo", "ViewAlbum": "Voir l'album", "ViewPlaybackInfo": "Voir les informations de lecture", "Watched": "Lu", @@ -1324,13 +1213,10 @@ "Guide": "Guide", "GuestStar": "Guest star", "Photos": "Photos", - "HeaderAlbums": "Albums", - "HeaderGenres": "Genres", "HeaderIdentification": "Identification", "HeaderTuners": "Égaliseur", "Horizontal": "Horizontal", "Images": "Images", - "LabelAudio": "Audio", "LeaveBlankToNotSetAPassword": "Laissez vide pour ne pas définir de mot de passe.", "Logo": "Logo", "MediaInfoCodec": "Codec", @@ -1355,16 +1241,10 @@ "Studios": "Studios", "Suggestions": "Suggestions", "TV": "Tv", - "TabAlbums": "Albums", "TabCodecs": "Codecs", - "TabCollections": "Collections", - "TabGenres": "Genres", - "TabGuide": "Guide", - "TabInfo": "Informations", "TabNotifications": "Notifications", "TabPlugins": "Extensions", "TabStreaming": "Streaming", - "TabSuggestions": "Suggestions", "ValueAlbumCount": "{0} albums", "ValueMinutes": "{0} min", "ValueOneAlbum": "1 album", @@ -1380,19 +1260,15 @@ "DashboardVersionNumber": "Version : {0}", "DashboardServerName": "Serveur : {0}", "LabelWeb": "Web :", - "MediaInfoSoftware": "Logiciel", "MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeData": "Données", "MediaInfoStreamTypeSubtitle": "Sous-titres", "MediaInfoStreamTypeVideo": "Video", "AuthProviderHelp": "Sélectionner un fournisseur d'authentification pour authentifier le mot de passe de cet utilisateur.", - "PasswordResetProviderHelp": "Choisissez un Fournisseur de réinitialisation de mot de passe à utiliser lorsqu'un utilisateur demande la réinitialisation de son mot de passe", - "HeaderHome": "Accueil", + "PasswordResetProviderHelp": "Choisissez un fournisseur de réinitialisation de mot de passe à utiliser lorsqu'un utilisateur demande la réinitialisation de son mot de passe.", "LabelUserLoginAttemptsBeforeLockout": "Tentatives de connexion échouées avant que l'utilisateur ne soit verrouillé :", "DashboardOperatingSystem": "Système d'Exploitation: {0}", "DashboardArchitecture": "Architecture : {0}", - "LaunchWebAppOnStartup": "Démarrer l'interface web dans mon navigateur quand le serveur est démarré", - "LaunchWebAppOnStartupHelp": "Ouvrir l'application dans votre navigateur internet quand le serveur est démarré pour la première fois. Cela ne se produira pas quand le serveur redémarre.", "MediaInfoStreamTypeEmbeddedImage": "Miniature", "MessageNoCollectionsAvailable": "Les collections vous permettent de profiter de groupes personnalisés de Films, Séries et d'Albums. Cliquer sur le bouton + pour commencer à créer des collections.", "MessageNoServersAvailable": "Aucun serveur n'a été trouvé en utilisant la recherche automatique de serveur.", @@ -1450,7 +1326,6 @@ "LabelPlayerDimensions": "Dimension du lecteur :", "LabelDroppedFrames": "Images perdues :", "LabelCorruptedFrames": "Images corrompues :", - "CopyStreamURLError": "Une erreur est survenue lors de la copie de l'URL.", "AskAdminToCreateLibrary": "Demander à un administrateur de créer une médiathèque.", "AllowFfmpegThrottlingHelp": "Quand le transcodage ou le remultiplexage est suffisamment en avant de la position de lecture, le processus se mettra en pause afin d’économiser des ressources. Plus utile lors d’une lecture continue. À désactiver en cas de problèmes de lecture.", "AllowFfmpegThrottling": "Adapter la vitesse du transcodage", @@ -1461,9 +1336,7 @@ "ClientSettings": "Paramètres Client", "Track": "Piste", "Season": "Saison", - "ReleaseGroup": "Groupe de Parution", "Person": "Personne", - "OtherArtist": "Autre Artiste", "Movie": "Film", "Episode": "Épisode", "BoxSet": "Coffret", @@ -1480,7 +1353,7 @@ "LastSeen": "Vu pour la dernière fois {0}", "PersonRole": "en tant que {0}", "ListPaging": "{0}-{1} de {2}", - "WriteAccessRequired": "Le serveur Jellyfin a besoin d'un accès en écriture à ce dossier. Merci de vérifier l’accès en écriture et réessayez.", + "WriteAccessRequired": "Jellyfin a besoin d'un accès en écriture à ce dossier. Merci de vérifier l’accès en écriture et réessayez.", "PathNotFound": "Le chemin d'accès n'a pas pu être trouvé. Merci de le vérifier et de réessayer.", "YadifBob": "YADIF Bob", "Yadif": "YADIF", @@ -1489,15 +1362,12 @@ "LabelLibraryPageSize": "Taille de la page de la médiathèque :", "LabelLibraryPageSizeHelp": "Définit la quantité d'éléments à afficher sur une page de médiathèque. Définir à 0 afin de désactiver la pagination.", "UnsupportedPlayback": "Jellyfin ne peut pas décoder du contenu protégé par un système de gestion des droits numériques, mais une tentative de lecture sera effectuée sur tout le contenu, y compris les titres protégés. Certains fichiers peuvent apparaître complètement noir, du fait de protections ou de fonctionnalités non supportées, comme les titres interactifs.", - "MessageUnauthorizedUser": "Vous n'êtes pas autorisé à accéder au serveur pour le moment. Veuillez contacter l'administrateur de votre serveur pour plus d'informations.", "ButtonTogglePlaylist": "Liste de lecture", - "ButtonToggleContextMenu": "Plus", "Filter": "Filtre", "New": "Nouveau", "HeaderFavoritePlaylists": "Listes de lecture favorites", - "TabDVR": "DVR", "LabelChromecastVersion": "Version de Chromecast", - "LabelEnableHttpsHelp": "Autorise le serveur à écouter les requêtes HTTPS sur le port configuré. Un certificat valide doit être configuré pour permettre ce mode de fonctionnement.", + "LabelEnableHttpsHelp": "Écouter les requêtes HTTPS sur le port configuré. Un certificat valide doit être fourni pour permettre ce mode de fonctionnement.", "LabelEnableHttps": "Activer HTTPS", "HeaderServerAddressSettings": "Paramètres adresses serveur", "HeaderRemoteAccessSettings": "Paramètres d'accès distant", @@ -1507,7 +1377,6 @@ "SaveChanges": "Enregistrer les modifications", "LabelRequireHttpsHelp": "Si activé, le serveur va automatiquement rediriger toutes les requêtes en HTTP vers HTTPS. Cette option n'a aucun effet si le serveur n'écoute pas HTTPS.", "LabelRequireHttps": "Nécessite HTTPS", - "LabelNightly": "De nuit", "LabelStable": "Stable", "EnableDetailsBanner": "Bannière des détails", "EnableDetailsBannerHelp": "Affichez une image de bannière en haut de la page de détails de l'article.", @@ -1543,8 +1412,8 @@ "MessageSyncPlayErrorAccessingGroups": "Une erreur s'est produite pendant l'accès à la liste de groupes.", "ShowMore": "Voir plus", "ShowLess": "Voir moins", - "EnableBlurhashHelp": "Les images qui sont encore en cours de chargement seront remplacées par une image générique floue", - "EnableBlurhash": "Utilise des images génériques floues à la place des images", + "EnableBlurHashHelp": "Les images qui sont encore en cours de chargement seront remplacées par une image générique floue.", + "EnableBlurHash": "Utilise des images génériques floues à la place des images", "ButtonCast": "Diffuser", "ButtonSyncPlay": "SyncPlay", "TabRepositories": "Dépôts", @@ -1567,5 +1436,11 @@ "ViewAlbumArtist": "Voir l'album de l'artiste", "PreviousTrack": "Revenir au précédent", "NextTrack": "Passer au prochain", - "LabelUnstable": "Instable" + "LabelUnstable": "Instable", + "Preview": "Aperçu", + "SubtitleVerticalPositionHelp": "Numéro de ligne où le texte apparaît. Un nombre positif compte les lignes de haut en bas. Un nombre négatif, de bas en haut.", + "LabelSubtitleVerticalPosition": "Position verticale :", + "MessageGetInstalledPluginsError": "Une erreur est survenue lors de la récupération de la liste des extensions installées.", + "MessagePluginInstallError": "Une erreur est survenue durant l'installation de l'extension.", + "PlaybackRate": "Vitesse de lecture" } diff --git a/src/strings/gsw.json b/src/strings/gsw.json index dad75ae57d..a16a28910c 100644 --- a/src/strings/gsw.json +++ b/src/strings/gsw.json @@ -1,14 +1,10 @@ { "ButtonAddUser": "Erstell en User", "ButtonCancel": "Abbreche", - "ButtonDeleteImage": "Lösch Bild", - "ButtonNew": "Neu", "ButtonOk": "OK", "ButtonQuickStartGuide": "Schnellstart Instruktione", "ButtonResetPassword": "Passwort zrug setze", - "ButtonSave": "Speichere", "ButtonSignOut": "Uslogge", - "ButtonSort": "Sortiere", "ChannelAccessHelp": "Wähl en Kanal us, um de mit dem User z'teile. Administratore werded immer d'Möglichkeit ha alli Kanäl mitm Metadate Manager z'bearbeite.", "Continuing": "Fortlaufend", "DeviceAccessHelp": "Das betrifft nur Grät wo einzigartig indentifiziert werded und tuet ned Browser Zuegriff verhindere. En Filter för Grät Zuegriff verhindered, dass neui Grät dezue gfüegt werded, bovor si ned überprüefd worde sind.", @@ -19,17 +15,13 @@ "FolderTypeMusicVideos": "Musigvideos", "FolderTypeTvShows": "TV", "Friday": "Friitig", - "HeaderAddUser": "Erstell en User", - "HeaderAutomaticUpdates": "Automatischi Updates", "HeaderDeviceAccess": "Grät Zuegriff", "HeaderEasyPinCode": "Eifache Pin Code", "HeaderFrequentlyPlayed": "Vell gspellt", "HeaderLatestEpisodes": "Letschti Episode", "HeaderLatestMovies": "Letschti Film", - "HeaderNextUp": "Als Nächstes", "HeaderPaths": "Pfad", "HeaderRecentlyPlayed": "Erst grad dezue gfüegt", - "HeaderSeries": "Series", "HeaderUsers": "User", "LabelArtists": "Artist:", "LabelArtistsHelp": "Trenn mehreri iisträg dur es ;", @@ -37,19 +29,15 @@ "LabelContentType": "Date Art:", "LabelCountry": "Land:", "LabelCurrentPassword": "Jetzigs Passwort:", - "LabelDisplayMissingEpisodesWithinSeasons": "Zeig fehlendi Episode innerhalb vo de einzelne Staffle", "LabelFinish": "Beende", "LabelLanguage": "Sproch:", "LabelMaxParentalRating": "Maximum erlaubti Kindersicherig:", "LabelNewPassword": "Neus Passwort:", "LabelNewPasswordConfirm": "Neus Passwort bestätige:", - "LabelNext": "Nöchst", - "LabelPrevious": "Vorher", "LabelSaveLocalMetadata": "Speicher Bilder und Metadate i d'Medieordner", "LabelSaveLocalMetadataHelp": "Wennd Bilder und Metadate direkt i d'Medieordner speicherisch, chasch sie eifach weder finde und au bearbeite.", "LabelSelectUsers": "Wähl User:", "LabelTimeLimitHours": "Ziitlimit (h):", - "LabelYourFirstName": "Din Vorname:", "LabelYoureDone": "Du besch fertig!", "LibraryAccessHelp": "Wähl en Medieordner us, um de mit dem User z'teile. Administratore werded immer d'Möglichkeit ha alli Verzeichnis mitm Metadate Manager z'bearbeite.", "MaxParentalRatingHelp": "Date mit enere höhere Kindersicherig werded vo dem User versteckt.", @@ -58,7 +46,7 @@ "Monday": "Mäntig", "MoreUsersCanBeAddedLater": "Meh User chönt spöter im Dashboard hinzuegfüegt werde.", "NewCollectionNameExample": "Biispell: Star Wars Sammlig", - "NoNextUpItemsMessage": "Nix da. Fang mal a Serie luege!", + "MessageNoNextUpItems": "Nix da. Fang mal a Serie luege!", "OptionAlbumArtist": "Album-Artist", "OptionAscending": "Ufstiigend", "OptionBluray": "BluRay", @@ -74,10 +62,8 @@ "OptionEnableAccessToAllLibraries": "Aktiviere de Zuegriff zu allne Bibliotheke", "OptionEnded": "Beendent", "OptionFavorite": "Favorite", - "OptionFriday": "Friitig", "OptionHasSubtitles": "Undertitel", "OptionImdbRating": "IMDB Bewertig", - "OptionMonday": "Mäntig", "OptionParentalRating": "Altersfriigab", "OptionPlayCount": "Zähler", "OptionPlayed": "Gspellt", @@ -85,12 +71,7 @@ "OptionReleaseDate": "Release Ziit", "OptionResumable": "Chan fortgsetzt werde", "OptionRuntime": "Laufziit", - "OptionSaturday": "Samstig", - "OptionSunday": "Sonntig", - "OptionThursday": "Donnstig", - "OptionTuesday": "Tsischtig", "OptionUnplayed": "Ungspellt", - "OptionWednesday": "Mittwoch", "ParentalRating": "Parental Rating", "Saturday": "Samstig", "Save": "Speichere", @@ -98,25 +79,13 @@ "Sunday": "Sonntig", "TabAccess": "Zuegriff", "TabAdvanced": "Erwiitert", - "TabAlbumArtists": "Album-Artist", - "TabAlbums": "Albene", - "TabArtists": "Artist", "TabCatalog": "Katalog", - "TabEpisodes": "Episode", - "TabGenres": "Genre", "TabLatest": "Letschti", - "TabMetadata": "Metadate", - "TabMovies": "Film", - "TabMusicVideos": "Musigvideos", "TabMyPlugins": "Miini Plugins", "TabNetworks": "Studios", "TabNotifications": "Mitteilige", - "TabPassword": "Passwort", - "TabPlaylist": "Playliste", "TabProfile": "Profil", "TabProfiles": "Profil", - "TabShows": "Serie", - "TabSuggestions": "Vorschläg", "TabUpcoming": "Usstehend", "TellUsAboutYourself": "Verzell was über dech selber", "ThisWizardWillGuideYou": "De Assistent hilft der dur de Installations Prozess. Zum afange, wähl bitte dini Sproch us.", @@ -141,7 +110,6 @@ "HeaderFavoriteEpisodes": "Lieblingsepisoden", "HeaderFavoriteShows": "Lieblingsserien", "HeaderFavoriteSongs": "Lieblingslieder", - "HeaderLiveTV": "Live-Fernseh", "Movies": "Film", "Photos": "Fotis", "Playlists": "Wedergabeliste", diff --git a/src/strings/he.json b/src/strings/he.json index 4288b04762..828f140465 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -10,36 +10,25 @@ "AllEpisodes": "כל הפרקים", "AllLibraries": "כל הספריות", "Anytime": "בכל עת", - "AroundTime": "בסביבות {0}", + "AroundTime": "בסביבות", "AsManyAsPossible": "כמה שיותר", - "AttributeNew": "חדש", "Backdrops": "תמונות רקע", "BirthLocation": "מיקום לידה", - "BrowsePluginCatalogMessage": "עבור לקטלוג התוספים לראות אילו זמינים.", - "ButtonAdd": "הוסף", + "MessageBrowsePluginCatalog": "עבור לקטלוג התוספים לראות אילו זמינים.", "ButtonAddUser": "הוסף משתמש", "ButtonCancel": "בטל", - "ButtonDelete": "מחק", - "ButtonDeleteImage": "מחק תמונה", - "ButtonEdit": "ערוך", - "ButtonFilter": "מסנן", "ButtonGotIt": "הבנתי", "ButtonManualLogin": "התחברות ידנית", - "ButtonNew": "חדש", "ButtonOk": "בסדר", - "ButtonPlay": "נגן", "ButtonQuickStartGuide": "מדריך מהיר", "ButtonRefreshGuideData": "רענן את מדריך השידור", "ButtonRemove": "הסר", "ButtonResetPassword": "איפוס סיסמא", - "ButtonRestart": "איתחול", - "ButtonSave": "שמור", - "ButtonSearch": "חיפוש", + "ButtonRestart": "הפעל מחדש", "ButtonSelectDirectory": "בחר תיקיות", "ButtonShutdown": "כבה", "ButtonSignIn": "היכנס", - "ButtonSignOut": "Sign out", - "ButtonSort": "מיין", + "ButtonSignOut": "התנתק", "CancelRecording": "ביטול הקלטה", "CancelSeries": "בטל סדרה", "Categories": "קטגוריות", @@ -53,7 +42,7 @@ "ConfirmDeletion": "אשר מחיקה", "Continuing": "ממשיך", "CustomDlnaProfilesHelp": "צור פרופיל מותאם אישית למכשיר חדש או לעקיפת פרופיל מערכת.", - "DefaultErrorMessage": "אירעה שגיאה בעיבוד הבקשה. בבקשה נסה שוב מאוחר יותר.", + "ErrorDefault": "אירעה שגיאה בעיבוד הבקשה. בבקשה נסה שוב מאוחר יותר.", "Delete": "מחק", "DeleteImage": "מחק תמונה", "DeleteImageConfirmation": "האם אתה בטוח שברצונך למחוק תמונה זו?", @@ -86,13 +75,9 @@ "HeaderActiveRecordings": "הקלטות פעילות", "HeaderAddToCollection": "להוסיף לאוסף", "HeaderAddToPlaylist": "הוסף לרשימת ניגון", - "HeaderAddUser": "הוסף משתמש", "HeaderAdditionalParts": "חלקים נוספים", - "HeaderAutomaticUpdates": "עידכונים אוטומטים", "HeaderCancelRecording": "ביטול הקלטה", "HeaderCancelSeries": "בטל סדרה", - "HeaderCastCrew": "שחקנים וצוות", - "HeaderChannels": "ערוצים", "HeaderConfirmPluginInstallation": "אשר התקנת תוסף", "HeaderCustomDlnaProfiles": "פרופילים מותאמים אישית", "HeaderDeleteItem": "מחק פריט", @@ -113,13 +98,10 @@ "HeaderLatestMovies": "סרטים אחרונים שהוספו", "HeaderLatestMusic": "מוזיקה אחרונה", "HeaderLatestRecordings": "הקלטות אחרונות", - "HeaderLiveTV": "שידורים חיים", "HeaderMediaFolders": "ספריות מדיה", - "HeaderMetadataSettings": "הגדרות מטא נתונים", - "HeaderMovies": "סרטים", + "HeaderMetadataSettings": "הגדרות מטא-דאטה", "HeaderMusicVideos": "קליפים", - "HeaderMyMedia": "הספרייה שלי", - "HeaderNextUp": "הבא", + "HeaderMyMedia": "המדיה שלי", "HeaderPaths": "נתיבים", "HeaderPlayAll": "נגן הכל", "HeaderPleaseSignIn": "אנא היכנס", @@ -127,7 +109,6 @@ "HeaderRecordingOptions": "אפשרויות הקלטה", "HeaderRunningTasks": "משימות רצות", "HeaderScenes": "סצנות", - "HeaderSeries": "סדרה", "HeaderSeriesOptions": "אפשרויות סדרה", "HeaderServerSettings": "הגדרות שרת", "HeaderSetupLibrary": "הגדר את ספריית המדיה שלך", @@ -139,7 +120,7 @@ "Help": "עזרה", "Identify": "לזהות", "Images": "תמונות", - "InstallingPackage": "מתקין {0}", + "InstallingPackage": "מתקין {0} (גירסה {1})", "InstantMix": "מיקס מיידי", "ItemCount": "פריטים {0}", "Kids": "ילדים", @@ -151,16 +132,14 @@ "LabelAirsBeforeSeason": "באוויר לפני העונה:", "LabelAlbum": "אלבום:", "LabelAlbumArtists": "אלבום אומנים:", - "LabelAllowServerAutoRestart": "אפשר לשרת להתחיל אוטומטית כדי לאפשר את העידכונים", - "LabelAllowServerAutoRestartHelp": "השרת יתחיל מחדש רק כשאר אין משתמשים פעילים", "LabelArtists": "אומנים:", - "LabelArtistsHelp": "הפרד מרובים באמצעות;", + "LabelArtistsHelp": "הפרד אמנים מרובים באמצעות נקודה-פסיק (;).", "LabelAudioLanguagePreference": "שפת קול מועדפת:", "LabelBirthDate": "תאריך לידה:", "LabelBirthYear": "שנת לידה:", - "LabelBlastMessageInterval": "אינטרוול הודעות דחיפה (בשניות)", + "LabelBlastMessageInterval": "תדירות הודעות דחיפה", "LabelBlastMessageIntervalHelp": "מגדיר את משך הזמן בשניות בין הודעות דחיפה של השרת.", - "LabelCachePath": "נתיב cache:", + "LabelCachePath": "נתיב מטמון:", "LabelChannels": "ערוצים:", "LabelCollection": "אוספים:", "LabelCommunityRating": "דירוג הקהילה:", @@ -168,7 +147,7 @@ "LabelCountry": "מדינה:", "LabelCriticRating": "דירוג ביקורת:", "LabelCurrentPassword": "סיסמא נוכחית:", - "LabelCustomCss": "CSS מותאם אישית", + "LabelCustomCss": "CSS מותאם אישית:", "LabelCustomRating": "דירוג מותאם אישית:", "LabelDateAdded": "תאריך הוסף:", "LabelDay": "יום:", @@ -176,17 +155,16 @@ "LabelDefaultUser": "משתמש ברירת מחדש:", "LabelDefaultUserHelp": "מגדיר אילו ספריות משתמש יוצגו במכשירים מחוברים. ניתן לעקוף זאת לכל מכשיר על ידי שימוש בפרופילים.", "LabelDiscNumber": "מספר דיסק:", - "LabelDisplayMissingEpisodesWithinSeasons": "הצג פרקים חסרים בתוך העונות", "LabelDisplayOrder": "סדר תצוגה:", - "LabelDownMixAudioScaleHelp": "הגבר אודיו כאשר הוא ממוזג. הגדר ל-1 לשמור על ערך הווליום המקורי", + "LabelDownMixAudioScaleHelp": "הגבר את עוצמת השמע כאשר הוא ממוזג. ערך השווה ל-1 יישמר את העוצמה המקורית.", "LabelDynamicExternalId": "{0} תעודת זהות:", "LabelEnableBlastAliveMessages": "הודעות דחיפה", "LabelEnableBlastAliveMessagesHelp": "אפשר זאת אם השרת לא מזוהה כאמין על ידי מכשירי UPnP אחרים ברשת שלך.", - "LabelEnableDlnaClientDiscoveryInterval": "זמן גילוי קליינטים (בשניות)", + "LabelEnableDlnaClientDiscoveryInterval": "זמן גילוי קליינטים", "LabelEnableDlnaDebugLogging": "אפשר ניהול רישום באגים בDLNA", "LabelEnableDlnaDebugLoggingHelp": "אפשרות זו תיצור קבצי לוג גדולים יותר ועליך להשתמש בה רק על מנת לפתור תקלות.", "LabelEnableDlnaPlayTo": "מאפשר ניגון DLNA ל", - "LabelEnableDlnaServer": "אפשר שרת Dina", + "LabelEnableDlnaServer": "אפשר שרת DLNA", "LabelEnableRealtimeMonitor": "אפשר מעקב בזמן אמת", "LabelEnableRealtimeMonitorHelp": "שינויים יעשו באופן מיידית על מערכות קבצים נתמכות.", "LabelEndDate": "תאריך סיום:", @@ -198,27 +176,26 @@ "LabelServerNameHelp": "השם יתן לזיהוי השרת. אם מושאר ריק, שם השרת יהיה שם המחשב.", "LabelKeepUpTo": "שמור עד ל:", "LabelLanguage": "שפה:", - "LabelLocalHttpServerPortNumber": "מספר פורט HTTP מקומי", + "LabelLocalHttpServerPortNumber": "מספר פורט HTTP מקומי:", "LabelLockItemToPreventChanges": "נעל פריט זה כדי למנוע שינויים עתידיים", "LabelMaxBackdropsPerItem": "מספר תמונות רקע מקסימאלי לפריט:", "LabelMaxParentalRating": "דירוג הורים מקסימאלי:", - "LabelMaxResumePercentage": "אחוזי המשכה מקסימאלים", - "LabelMaxResumePercentageHelp": "קובץ מוגדר כנוגן במלואו אם נעצר אחרי הזמן הזה", + "LabelMaxResumePercentage": "אחוזי המשכה מקסימאלים:", + "LabelMaxResumePercentageHelp": "קובץ מוגדר כנוגן במלואו אם נעצר אחרי הזמן הזה.", "LabelMaxScreenshotsPerItem": "מספר תמונות מסך מקסימאלי לפריט:", "LabelMessageTitle": "כותרת הודעה:", "LabelMetadataDownloadLanguage": "שפת הורדה מועדפת:", - "LabelMetadataPath": "נתיב Metadata:", + "LabelMetadataPath": "נתיב מטא-דאטה:", "LabelMinBackdropDownloadWidth": "רוחב תמונת רקע מינימאלי להורדה:", - "LabelMinResumeDuration": "משך המשכה מינימאלי (בשניות):", + "LabelMinResumeDuration": "משך המשכה מינימאלי:", "LabelMinResumeDurationHelp": "קובץ קצר מזה לא יהיה ניתן להמשך ניגון מנקודת העצירה", "LabelMinResumePercentage": "אחוזי המשכה מינימאלים:", - "LabelMinResumePercentageHelp": "כותרים יוצגו כלא נוגנו אם נצרו לפני הזמן הזה", + "LabelMinResumePercentageHelp": "כותרים יוצגו כלא נוגנו אם נצרו לפני הזמן הזה.", "LabelMinScreenshotDownloadWidth": "רחוב תמונת מסך מינימאלית להורדה:", "LabelMonitorUsers": "עקוב אחר פעילות מ:", "LabelName": "שם:", "LabelNewPassword": "סיסמא חדשה:", "LabelNewPasswordConfirm": "אימות סיסמא חדשה:", - "LabelNext": "הבא", "LabelNotificationEnabled": "אפשר התראה זו", "LabelNumber": "מספר:", "LabelNumberOfGuideDays": "מספר ימים להורדה מלוח השידורים:", @@ -235,17 +212,14 @@ "LabelPlaceOfBirth": "מקום לידה:", "LabelPlaylist": "רשימת ניגון:", "LabelPreferredDisplayLanguage": "שפת תצוגה מועדפת:", - "LabelPreferredDisplayLanguageHelp": "תרגום Jellyfin הוא תהליך מתמשך.", - "LabelPrevious": "הקודם", "LabelProfileAudioCodecs": "מקודדי שמע:", "LabelProfileCodecs": "מקודדים:", "LabelProfileVideoCodecs": "‮מקודדי וידאו:", - "LabelPublicHttpPort": "מספר פורט HTTP פומבי", - "LabelReadHowYouCanContribute": "למד איך אתה יכול לתרום.", + "LabelPublicHttpPort": "מספר פורט HTTP פומבי:", "LabelRecord": "הקלטה:", "LabelRefreshMode": "מצב רענון:", "LabelReleaseDate": "תאריך הוצאה:", - "LabelRuntimeMinutes": "זמן ריצה (דקות):", + "LabelRuntimeMinutes": "זמן ריצה:", "LabelSaveLocalMetadata": "שמור תמונות רקע בתוך ספריות המדיה", "LabelSaveLocalMetadataHelp": "שמירת תמונות רקע בתוך ספריות המדיה תשים אותם במקום שבו יהיה קל לערוך אותם.", "LabelSeasonNumber": "מספר עונה:", @@ -266,9 +240,8 @@ "LabelUser": "משתמש:", "LabelUserLibrary": "ספריית משתמש:", "LabelYear": "שנה:", - "LabelYourFirstName": "שמך הפרטי:", "LabelYoureDone": "סיימת!", - "LibraryAccessHelp": "בחר את ספריות המדיה אשר ישותפו עם המשתמש. מנהלים יוכלו לערות את כל התיקיות באמצעות עורך המידע.", + "LibraryAccessHelp": "בחר את הספריות אשר ישותפו עם המשתמש. מנהלים יוכלו לערות את כל התיקיות באמצעות עורך המידע.", "Like": "אוהב", "Live": "שידור חי", "LiveBroadcasts": "שידורים חיים", @@ -298,7 +271,7 @@ "NewEpisodes": "פרקים חדשים", "NewEpisodesOnly": "פרקים חדשים בלבד", "News": "חדשות", - "NoNextUpItemsMessage": "לא נמצא כלום. התחלת לצפות בסדרות שלך!", + "MessageNoNextUpItems": "לא נמצא כלום. התחלת לצפות בסדרות שלך!", "NoSubtitleSearchResultsFound": "לא נמצאו תוצאות.", "Option3D": "תלת מימד", "OptionAdminUsers": "מנהלים", @@ -306,11 +279,10 @@ "OptionAlbumArtist": "אמן אלבום", "OptionAllUsers": "כל המשתמשים", "OptionAllowLinkSharing": "אפשר שיתוף ברשתות חברתיות", - "OptionAllowMediaPlayback": "הרשה נגינת מדיה", + "OptionAllowMediaPlayback": "אפשר ניגון מדיה", "OptionAllowUserToManageServer": "אפשר למשתמש זה לנהל את השרת", "OptionArtist": "אמן", "OptionAscending": "סדר עולה", - "OptionAutomatic": "אוטומטי", "OptionBlockMovies": "סרטים", "OptionBlockTvShows": "תוכניות טלויזיה", "OptionBluray": "בלו-ריי", @@ -318,12 +290,12 @@ "OptionContinuing": "ממשיך", "OptionCriticRating": "ציון מבקרים", "OptionCustomUsers": "מותאם אישית", - "OptionDaily": "יומי", + "OptionDaily": "כל יום", "OptionDateAdded": "תאריך הוספה", "OptionDatePlayed": "תאריך ניגון", "OptionDescending": "סדר יורד", "OptionDisableUser": "בטל משתמש זה", - "OptionDisableUserHelp": "אם מבוטל, השרת שלא יאפשר חיבורים ממשתמש זה. חיבורים פעילים יבוטלו מייד.", + "OptionDisableUserHelp": "השרת לא יאפשר חיבורים ממשתמש זה. חיבורים פעילים יבוטלו מייד.", "OptionDislikes": "לא אוהב", "OptionDownloadArtImage": "עטיפה", "OptionDownloadBackImage": "גב", @@ -336,47 +308,39 @@ "OptionDvd": "DVD", "OptionEnded": "הסתיים", "OptionFavorite": "מועדפים", - "OptionFriday": "שישי", "OptionHasSpecialFeatures": "מאפיינים מיוחדים", "OptionHasSubtitles": "כתוביות", "OptionHasThemeSong": "שיר נושא", "OptionHasThemeVideo": "סרט נושא", - "OptionHasTrailer": "טריילר", + "OptionHasTrailer": "קדימון", "OptionHideUser": "הסתר משתמש זה בחלון ההתחברות", "OptionImdbRating": "דירוג IMDb", "OptionLikes": "נבחרים", "OptionMissingEpisode": "פרקים חסרים", - "OptionMonday": "שני", "OptionNameSort": "שם", - "OptionNew": "חדש...", - "OptionOnAppStartup": "בהפעלת התוכנה", + "OptionNew": "חדש…", "OptionOnInterval": "כל פרק זמן", "OptionParentalRating": "דירוג בקרת הורים", - "OptionPlayCount": "מספר השמעות", + "OptionPlayCount": "כמות ניגונים", "OptionPlayed": "נוגן", - "OptionPremiereDate": "תאריך שידור ראשון", + "OptionPremiereDate": "תאריך בכורה", "OptionProfileAudio": "צליל", "OptionProfilePhoto": "תמונה", "OptionProfileVideo": "וידאו", "OptionProfileVideoAudio": "צליל וידאו", "OptionResumable": "ניתן להמשיך", - "OptionRuntime": "משך", - "OptionSaturday": "שבת", + "OptionRuntime": "זמן ריצה", "OptionSpecialEpisode": "ספיישלים", - "OptionSunday": "ראשון", - "OptionThursday": "חמישי", - "OptionTrackName": "שם השיר", - "OptionTuesday": "שלישי", - "OptionTvdbRating": "דירוג Tvdb", + "OptionTrackName": "שם הרצועה", + "OptionTvdbRating": "דירוג TVDB", "OptionUnairedEpisode": "פרקים שלא שודרו", "OptionUnplayed": "לא נוגן", "OptionWakeFromSleep": "הער ממצב שינה", - "OptionWednesday": "רביעי", - "OptionWeekly": "שבועי", + "OptionWeekly": "כל שבוע", "OriginalAirDateValue": "תאריך אוויר מקורי: {0}", "Overview": "סקירה כללית", - "PackageInstallCancelled": "{0} ההתקנה בוטלה.", - "PackageInstallFailed": "ההתקנה {0} נכשלה.", + "PackageInstallCancelled": "ההתקנה של {0} (גירסה {1}) בוטלה.", + "PackageInstallFailed": "ההתקנה של {0} (גירסה {1}) נכשלה.", "ParentalRating": "דירוג ההורים", "PasswordMatchError": "הסיסמא ואימות הסיסמא צריכות להיות זהות.", "PasswordResetComplete": "הסיסמא אופסה.", @@ -393,14 +357,13 @@ "Premieres": "בכורות", "Producer": "במאי", "ProductionLocations": "מיקומי ייצור", - "QueueAllFromHere": "הוסף הכל מכאן לתור", "RecentlyWatched": "נצפה לאחרונה", "Record": "הקלט", "RecordSeries": "הקלט סדרה", "RecordingCancelled": "הקלטה בוטלה.", "RecordingScheduled": "ההקלטה מתוזמנת.", "Refresh": "רענון", - "RefreshDialogHelp": "המטא נתונים מתרעננים על סמך הגדרות ושירותי אינטרנט שמופעלים בלוח המחוונים של מרכז אמבי.", + "RefreshDialogHelp": "המטא-דאטה מתרעננת על סמך הגדרות ושירותי אינטרנט שמופעלים בלוח הבקרה.", "RefreshQueued": "רענן תור.", "ReleaseDate": "תאריך שיחרור", "RemoveFromCollection": "הסר מאוספים", @@ -424,7 +387,7 @@ "SeriesSettings": "הגדרות סדרה", "SeriesYearToPresent": "{0} - היום", "ServerNameIsRestarting": "שרת Jellyfin - {0} מופעל מחדש.", - "ServerNameIsShuttingDown": "שרת Jellyfin - {0} נכבה.", + "ServerNameIsShuttingDown": "שרת Jellyfin - {0} בתהליך כיבוי.", "ServerUpdateNeeded": "שרת אמבי זה צריך להיות מעודכן. כדי להוריד את הגרסה העדכנית ביותר, בקר בכתובת {0}", "Settings": "הגדרות", "SettingsSaved": "ההגדרות נשמרו.", @@ -443,48 +406,27 @@ "SystemDlnaProfilesHelp": "פרופלי מערכת הם לקריאה בלבד. שינויים בפרופילי מערכת ישמרו לפרופיל מוצאם אישית חדש.", "TabAccess": "גישה", "TabAdvanced": "מתקדם", - "TabAlbumArtists": "אמני אלבום", - "TabAlbums": "אלבומים", - "TabArtists": "אמנים", "TabCatalog": "קטלוג", - "TabChannels": "ערוצים", "TabCodecs": "מקודדים", "TabDashboard": "לוח בקרה", - "TabEpisodes": "פרקים", - "TabFavorites": "מועדפים", - "TabGenres": "זאנרים", - "TabGuide": "מדריך", - "TabInfo": "מידע", "TabLatest": "אחרון", - "TabLiveTV": "שידור ישיר", - "TabMovies": "סרטים", "TabMusic": "מוסיקה", - "TabMusicVideos": "קליפים", "TabMyPlugins": "התוספים שלי", "TabNetworks": "רשתות", "TabNotifications": "התראות", - "TabPassword": "סיסמא", - "TabPlaylist": "רשימת נגינה", "TabProfile": "פרופיל", "TabProfiles": "פרופילים", - "TabRecordings": "הקלטות", - "TabSeries": "סדרות", "TabServer": "שרת", "TabSettings": "הגדרות", - "TabShows": "תוכניות", - "TabSongs": "שירים", - "TabSuggestions": "המלצות", - "TabTrailers": "טריילרים", - "TabTranscoding": "קידוד", "TabUpcoming": "בקרוב", - "Tags": "תגים", + "Tags": "מילות מפתח", "TellUsAboutYourself": "ספר לנו על עצמך", "ThisWizardWillGuideYou": "אשף זה יעזור לך בהתליך ההתקנה.", "Thursday": "חמישי", "TrackCount": "שירים {0}", "Tuesday": "שלישי", "UninstallPluginConfirmation": "האם אתה בטוח שברצונך להסיר {0}?", - "UninstallPluginHeader": "הסר תוסף", + "HeaderUninstallPlugin": "הסר תוסף", "Unrated": "אין דירוג", "ValueAlbumCount": "{0} אלבומים", "ValueDiscNumber": "דיסק {0}", @@ -520,8 +462,8 @@ "AllLanguages": "כל השפות", "Alerts": "התראות", "Box": "מארז", - "BirthPlaceValue": "מיקום לידה: {0}", - "BirthDateValue": "תאריך לידה: {0}", + "BirthPlaceValue": "מקום לידה: {0}", + "BirthDateValue": "נולד: {0}", "Backdrop": "רקע", "AuthProviderHelp": "בחר ספק אימות שישמש לאימות הסיסמה של משתמש זה.", "Audio": "שמע", @@ -536,10 +478,10 @@ "Yesterday": "אתמול", "HeaderAlbumArtists": "אמני האלבום", "Favorites": "מועדפים", - "HeaderFavoriteAlbums": "אלבומים שאהבתי", + "HeaderFavoriteAlbums": "אלבומים מועדפים", "HeaderFavoriteArtists": "אמנים מועדפים", "Folders": "תיקיות", - "HeaderFavoriteShows": "סדרות מועדפות", + "HeaderFavoriteShows": "תוכניות מועדפות", "HeaderFavoriteEpisodes": "פרקים מועדפים", "HeaderFavoriteSongs": "שירים מועדפים", "Collections": "אוספים", @@ -547,8 +489,7 @@ "HeaderContinueWatching": "המשך לצפות", "AllowOnTheFlySubtitleExtraction": "אפשר חילוץ כתוביות בזמן אמת", "AllowHWTranscodingHelp": "אפשר למלקט לקודד הזרמות בזמן אמת. זה עשוי לעזור בהפחתת הקידוד שנעשה ע\"י השרת.", - "AllComplexFormats": "כל הפורמטים המורכבים (ASS, SSA, VOBSUB, PGS, SUB/IDX)", - "AddItemToCollectionHelp": "הוסף חפצים לאוסף על ידי חיפושם ושימוש בתפריט הלחצן הימני או לחצן התפריט כדי להוסיפם לאוסף.", + "AllComplexFormats": "כל הפורמטים המורכבים (ASS, SSA, VOBSUB, PGS, SUB/IDX, …)", "Songs": "שירים", "Shows": "סדרות", "DownloadsValue": "{0} הורדות", @@ -566,7 +507,6 @@ "ContinueWatching": "המשך לצפות", "ButtonUninstall": "הסר התקנה", "ButtonTrailer": "קדימון", - "ButtonSubtitles": "כתוביות", "ButtonSplit": "פיצול", "ButtonStop": "עצור", "ButtonSettings": "הגדרות", @@ -578,29 +518,21 @@ "ButtonParentalControl": "בקרת הורים", "ButtonNetwork": "רשת", "ButtonMore": "עוד", - "ButtonLearnMore": "למד עוד", "ButtonInfo": "מידע", - "ButtonHome": "בית", - "ButtonHelp": "עזרה", "ButtonFullscreen": "מסך מלא", - "ButtonEditImages": "ערוך תמונות", - "ButtonConnect": "התחבר", "ButtonAddServer": "הוסף שרת", "ButtonAddMediaLibrary": "הוסף ספריית מדיה", "ButtonAddImage": "הוסף תמונה", "AskAdminToCreateLibrary": "בקש ממנהל ליצור ספרייה.", "Ascending": "סדר עולה", "Photos": "תמונות", - "TabCollections": "אוספים", "MessageConfirmShutdown": "‫האם אתה בטוח שברצונך לכבות את השרת?", "MessageConfirmRestart": "‫האם אתה בטוח שברצונך לאתחל את שרת ה-Jellyfin‏?", "HeaderThisUserIsCurrentlyDisabled": "משתמש זה אינו פעיל כרגע", "HeaderTaskTriggers": "טריגרים של המשימה", - "HeaderTags": "תגיות", "HeaderStopRecording": "עצור הקלטה", "HeaderSortOrder": "סדר מיון", "HeaderSortBy": "מיין לפי", - "HeaderShutdown": "כיבוי", "HeaderSettings": "הגדרות", "HeaderSendMessage": "שלח הודעה", "HeaderSelectServer": "בחר שרת", @@ -609,12 +541,11 @@ "HeaderRestart": "הפעלה מחדש", "HeaderProfileInformation": "מידע פרופיל", "HeaderProfile": "פרופיל", - "HeaderPreferredMetadataLanguage": "שפת מטא-נתונים מועדפת", + "HeaderPreferredMetadataLanguage": "שפת מטא-דאטה מועדפת", "HeaderPluginInstallation": "התקנת תוסף", "HeaderPlayOn": "נגן על", "HeaderPinCodeReset": "איפוס קוד סיכה", "HeaderPhotoAlbums": "אלבומי תמונות", - "HeaderPeople": "אנשים", "HeaderPasswordReset": "איפוס סיסמה", "HeaderPassword": "סיסמה", "HeaderOtherItems": "פריטים אחרים", @@ -624,25 +555,18 @@ "HeaderNewApiKey": "‫מפתח API חדש", "HeaderNavigation": "ניווט", "HeaderMyDevice": "המכשיר שלי", - "HeaderLiveTv": "שידורים חיים", "HeaderLibrarySettings": "הגדרות ספרייה", "HeaderLibraryFolders": "תיקיות הספרייה", "HeaderLibraries": "ספריות", - "HeaderItems": "פריטים", "HeaderInstall": "התקנה", "HeaderImageOptions": "הגדרות תמונה", - "HeaderHome": "בית", - "HeaderGenres": "ז'אנרים", "HeaderForKids": "עבור ילדים", - "HeaderFilters": "מסננים", "HeaderFavoriteVideos": "סרטונים מועדפים", "HeaderFavoritePeople": "אנשים מועדפים", "HeaderFavoriteMovies": "סרטים מועדפים", "HeaderFavoriteBooks": "ספרים מועדפים", "HeaderError": "שגיאה", - "HeaderEpisodes": "פרקים", "HeaderDownloadSync": "הורדה וסנכרון", - "TabDevices": "מכשירים", "HeaderDevices": "מכשירים", "HeaderDeveloperInfo": "מידע למפתח", "HeaderDeleteTaskTrigger": "מחק טריגר משימה", @@ -653,14 +577,11 @@ "HeaderConfirmRevokeApiKey": "‫בטל מפתח API", "HeaderCastAndCrew": "שחקנים וצוות", "HeaderBranding": "מיתוג", - "HeaderBooks": "ספרים", "HeaderAudioSettings": "הגדרות שמע", "HeaderAudioBooks": "ספרים מוקלטים", "HeaderApiKeys": "‫מפתחות API", "HeaderApiKey": "‫מפתח API", - "HeaderAlbums": "אלבומים", "HeaderAddUpdateImage": "הוסף/עדכן תמונה", - "HeaderAddScheduledTaskTrigger": "הוסף טריגר", "HeaderActivity": "פעילות", "Guide": "מדריך", "Genre": "ז'אנר", @@ -675,17 +596,15 @@ "ExtraLarge": "גדול מאוד", "ExitFullscreen": "צא ממסך מלא", "EveryNDays": "כל {0} ימים", - "ErrorMessageStartHourGreaterThanEnd": "שעת הסיום חייבת להיות לאחר שעת ההתחלה.", + "ErrorStartHourGreaterThanEnd": "שעת הסיום חייבת להיות לאחר שעת ההתחלה.", "Episodes": "פרקים", "EnableThemeSongsHelp": "נגן שירי פתיח ברגע בעת העיון בספרייה.", "ThemeSongs": "שירי פתיח", - "EnableThemeSongs": "שירי פתיח", "EnablePhotos": "הצג תמונות", "EnableHardwareEncoding": "הפעל קידוד חומרה", "EnableExternalVideoPlayers": "נגני וידאו חיצוניים", "EnableCinemaMode": "מצב קולנוע", - "EnableBackdrops": "תמונות רקע", - "EditMetadata": "ערוך מטא-נתונים", + "EditMetadata": "ערוך מטא-דאטה", "DrmChannelsNotImported": "‫ערוצים בעלי ניהול זכויות דיגיטלי (DRM) לא ייובאו.", "Down": "למטה", "Display": "תצוגה", @@ -695,51 +614,37 @@ "DirectPlaying": "ניגון ישיר", "DetectingDevices": "מזהה מכשירים", "DefaultMetadataLangaugeDescription": "אלו הגדרות ברירת המחדל שלך וניתן להתאים אותן לכל ספרייה בנפרד.", - "CopyStreamURLError": "אירעה שגיאה במהלך העתקת הקישור.", "CopyStreamURLSuccess": "הקישור הועתק בהצלחה.", "CopyStreamURL": "העתק קישור זרם", "Connect": "התחבר", "ConfirmEndPlayerSession": "‫האם לכבות את Jellyfin על {0}?", "CommunityRating": "דירוג קהילה", - "ButtonViewWebsite": "צפה באתר האינטרנט", "ButtonWebsite": "אתר אינטרנט", - "ButtonUp": "למעלה", "ButtonSubmit": "שלח", "ButtonStart": "התחל", - "ButtonShuffle": "ערבוב", "ButtonScanAllLibraries": "סרוק את כל הספריות", "ButtonRevoke": "בטל", "TabScheduledTasks": "משימות מתוזמנות", - "TabResumeSettings": "המשך צפייה", "ButtonResume": "המשך", - "ButtonRepeat": "חזרה", - "ButtonRefresh": "רענון", "ButtonProfile": "פרופיל", "ButtonOpen": "פתח", "HeaderTracks": "רצועות", "ButtonPreviousTrack": "הרצועה הקודמת", "ButtonNextTrack": "הרצועה הבאה", "ButtonGuide": "מדריך", - "HeaderForgotPassword": "שחזור סיסמה", "ButtonForgotPassword": "שחזור סיסמה", "ButtonEditOtherUserPreferences": "ערוך את הפרופיל, התמונה וההגדרות האישיות של משתמש זה.", - "ButtonDownload": "הורדה", - "ButtonDown": "למטה", "ButtonChangeServer": "החלף שרת", - "AutoBasedOnLanguageSetting": "אוטומטי (לפי הגדרות שפה)", "ButtonBack": "חזרה", "OptionBanner": "באנר", "ButtonAudioTracks": "רצועות שמע", - "ButtonArrowDown": "למטה", - "ButtonArrowUp": "למעלה", "ButtonArrowRight": "ימינה", "ButtonArrowLeft": "שמאלה", "ButtonAddScheduledTaskTrigger": "הוסף טריגר", "Browse": "עיין", "BoxRear": "מארז (מאחור)", - "BookLibraryHelp": "ניתן להוסיף ספרים מוקלטים וספרים כתובים. עיינו {0}במדריך מתן שמות לספרים{1}.", + "BookLibraryHelp": "ניתן להוסיף ספרים מוקלטים וספרים כתובים. עיינו {0} במדריך מתן שמות לספרים {1}.", "Desktop": "שולחן עבודה", - "MessageUnauthorizedUser": "אין לך גישה לשרת ברגע זה. אנא צור קשר עם מנהל השרת למידע נוסף.", "MessageDeleteTaskTrigger": "האם אתה בטוח שברצונך למחוק את מפעיל המשימה הזה?", "LastSeen": "נראה לאחרונה ב-{0}", "PersonRole": "כ-{0}", @@ -750,11 +655,10 @@ "DeleteDeviceConfirmation": "האם אתה בטוח שברצונך למחוק את המכשיר? הוא יופיע שוב בפעם הבאה שמשתמש ייכנס באמצעותו.", "ColorSpace": "מרחב צבע", "CinemaModeConfigurationHelp": "מצב קולנוע מביא את חוויית הקולנוע היישר אל הסלון עם האפשרות להפעיל טריילרים וקדימונים מותאמים אישית לפני הסרט.", - "ChannelAccessHelp": "בחר את הערוצים לשיתוף עם משתמש זה. מנהלים יוכלו לערוך את כל הערוצים בעזרת \"מנהל המטא-דאטה\".", + "ChannelAccessHelp": "בחר את הערוצים לשיתוף עם משתמש זה. מנהלים יוכלו לערוך את כל הערוצים בעזרת מנהל המטא-דאטה.", "ButtonResetEasyPassword": "אתחל קוד פין פשוט", - "ButtonOff": "כיבוי", "ButtonLibraryAccess": "הרשאות גישה לספרייה", - "BurnSubtitlesHelp": "מחליט אם על השרת לצרוב כתוביות בזמן קידוד וידאו. הימנעות מכך תשפר מאוד את הביצועים. בחר \"אוטומטי\" לצריבת כתוביות על בסיס פורמט תמונה (VOBSUB, PGS, SUB, IDX) וכתוביות ASS או SSA מסויימות.", + "BurnSubtitlesHelp": "מחליט אם על השרת לצרוב כתוביות בזמן קידוד וידאו. הימנעות מכך תשפר מאוד את הביצועים. בחר \"אוטומטי\" לצריבת כתוביות על בסיס פורמט תמונה (VOBSUB, PGS, SUB, IDX, …) וכתוביות ASS או SSA מסויימות.", "Artist": "אמן", "AllowedRemoteAddressesHelp": "רשימת IP \\ מיסוך רשת המופרדת בפסיקים עבור רשתות שיורשו להתחבר מרחוק. במידה ותישאר ריקה, כל הכתובות יורשו להתחבר.", "Album": "אלבום", @@ -767,11 +671,112 @@ "Raised": "מורם", "LabelSpecialSeasonsDisplayName": "שם תצוגת \"עונה מיוחדת\":", "LabelSource": "מקור:", - "LabelSoundEffects": "אפקטי סאונד:", "ButtonTogglePlaylist": "רשימת ניגון", - "ButtonToggleContextMenu": "עוד", "ButtonSyncPlay": "SyncPlay", "ButtonPlayer": "נגן", "StopPlayback": "הפסק הפעלה", - "ClearQueue": "נקה תור" + "ClearQueue": "נקה תור", + "DashboardServerName": "שרת: {0}", + "DashboardVersionNumber": "גירסה: {0}", + "DashboardArchitecture": "ארכיטקטורה: {0}", + "DashboardOperatingSystem": "מערכת הפעלה: {0}", + "HeaderMyMediaSmall": "המדיה שלי (קטן)", + "HeaderMusicQuality": "איכות מוזיקה", + "HeaderMoreLikeThis": "עוד כמו זה", + "HeaderMedia": "מדיה", + "LabelMetadata": "מטא-דאטה:", + "HeaderSelectMetadataPath": "בחר נתיב מטא-דאטה", + "NextUp": "הבא בתור", + "LabelBaseUrl": "כתובת בסיס:", + "LabelEnableHttpsHelp": "האזן על גבי פורט ה-HTTPS המוגדר. חובה לספק תעודה תקינה על מנת שהגדרה זו תכנס לתוקף.", + "LabelEnableHttps": "הפעל HTTPS", + "LabelEnableHardwareDecodingFor": "הפעל פענוח חומרה עבור:", + "LabelEnableDlnaServerHelp": "אפשר למכשירי UPnP ברשת שלך לעיין בתוכן ולנגן אותו.", + "LabelEnableAutomaticPortMap": "הפעל מיפוי פורט אוטומטי", + "LabelDropImageHere": "גרור תמונה לכאן, או לחץ כדי לעיין.", + "LabelDownloadLanguages": "הורד שפות:", + "LabelDownMixAudioScale": "הגברת עוצמת שמע כאשר הוא ממוזג:", + "LabelDisplaySpecialsWithinSeasons": "הצג פרקים מיוחדים בתוך העונות שבמהלכן הם שודרו", + "LabelDisplayName": "שם תצוגה:", + "LabelDisplayMode": "מצב תצוגה:", + "LabelDisplayLanguageHelp": "תרגום Jellyfin הוא פרויקט מתמשך.", + "LabelDisplayLanguage": "שפת תצוגה:", + "LabelDidlMode": "מצב DIDL:", + "LabelDeviceDescription": "תיאור מכשיר", + "LabelDefaultScreen": "מסך ברירת-מחדל:", + "LabelImageType": "סוג תמונה:", + "LabelHttpsPortHelp": "מספר פורט ה-TCP עבור שרת ה-HTTPS.", + "LabelHttpsPort": "מספר פורט HTTPS מקומי:", + "LabelGroupMoviesIntoCollections": "אגד סרטים לתוך אוספים", + "LabelFriendlyName": "שם ידידותי:", + "LabelFormat": "תבנית:", + "LabelForgotPasswordUsernameHelp": "הכנס/י את שם המשתמש שלך, אם את/ה זוכר/ת אותו.", + "LabelFont": "גופן:", + "LabelFolder": "תיקייה:", + "LabelFileOrUrl": "קובץ או כתובת אינטרנט:", + "Season": "עונה", + "OptionEnableAccessFromAllDevices": "אפשר גישה מכל המכשירים", + "Primary": "ראשי", + "Menu": "תפריט", + "LiveTV": "שידורים חיים", + "ManageLibrary": "נהל ספרייה", + "Logo": "לוגו", + "OptionDateAddedImportTime": "השתמש בתאריך הסריקה לתוך הספרייה", + "OptionDateAddedFileTime": "השתמש בתאריך יצירת הקובץ", + "OptionBlockTrailers": "קדימונים", + "OptionBlockMusic": "מוזיקה", + "OptionBlockLiveTvChannels": "ערוצי שידורים חיים", + "OptionBlockBooks": "ספרים", + "OptionAllowRemoteSharedDevices": "אפשר שליטה מרחוק על מכשירים משותפים", + "OptionAllowRemoteControlOthers": "אפשר שליטה מרחוק על משתמשים אחרים", + "SelectAdminUsername": "נא לבחור שם משתמש עבור חשבון המנהל.", + "OptionHideUserFromLoginHelp": "שימושי עבור חשבונות פרטיים או חשבונות מנהל מוסתרים. המשתמש יצטרך להזין את שם המשתמש והסיסמה ידנית על מנת להתחבר.", + "MessagePlayAccessRestricted": "התוכן הזה לא ניתן לניגון כרגע. למידע נוסף, נא ליצור קשר עם מנהל המערכת שלך.", + "MessageContactAdminToResetPassword": "נא ליצור קשר עם מנהל המערכת שלך על מנת לאפס את הסיסמה שלך.", + "HeaderAdmin": "מנהל", + "Suggestions": "המלצות", + "MessageSyncPlayNoGroupsAvailable": "אין קבוצות זמינות. התחל לנגן משהו קודם.", + "OptionHomeVideos": "תמונות", + "Home": "בית", + "LabelServerName": "שם השרת:", + "TabPlugins": "תוספים", + "MessageNoPluginsInstalled": "אין לך תוספים מותקנים.", + "MessageNoAvailablePlugins": "אין תוספים זמינים.", + "TabLogs": "יומני רישום", + "LabelLogs": "יומני רישום:", + "TabNetworking": "תקשורת", + "HeaderDVR": "ממיר-מקליט", + "LabelScheduledTaskLastRan": "רץ לאחרונה {0}, במשך {1}.", + "LabelTheme": "ערכת נושא:", + "LabelTextSize": "גודל טקסט:", + "LabelTextColor": "צבע טקסט:", + "LabelSyncPlayAccessNone": "מבוטל עבור משתמש זה", + "LabelSyncPlayAccessJoinGroups": "אפשר למשתמש להצטרף לקבוצות", + "LabelSyncPlayAccessCreateAndJoinGroups": "אפשר למשתמש ליצור קבוצות ולהצטרף אליהן", + "LabelSyncPlayLeaveGroup": "עזוב קבוצה", + "LabelSyncPlayNewGroupDescription": "צור קבוצה חדשה", + "LabelSyncPlayNewGroup": "קבוצה חדשה", + "MoreFromValue": "עוד מ{0}", + "Writers": "תסריטאים", + "DailyAt": "כל יום ב-{0}", + "OptionWeekends": "סופי שבוע", + "OptionWeekdays": "ימי חול", + "Unplayed": "לא נוגן", + "OptionSubstring": "מחרוזת משנה", + "OptionReleaseDate": "תאריך שחרור", + "OptionRegex": "ביטוי-רגולרי", + "OptionRandom": "אקראי", + "OptionPoster": "פוסטר", + "OptionNone": "כלום", + "OptionMax": "מקסימום", + "List": "רשימה", + "OptionList": "רשימה", + "OptionIsSD": "הבחנה רגילה (SD)", + "OptionIsHD": "הבחנה גבוהה (HD)", + "OptionExternallyDownloaded": "הורדה חיצונית", + "OptionEveryday": "כל יום", + "OptionEnableExternalContentInSuggestions": "הפעל תוכן חיצוני בהמלצות", + "OptionEnableAccessToAllLibraries": "אפשר גישה לכל הספריות", + "OptionEnableAccessToAllChannels": "אפשר גישה לכל הערוצים", + "HeaderSyncPlaySelectGroup": "הצטרף לקבוצה" } diff --git a/src/strings/hi-in.json b/src/strings/hi-in.json index 48b82c601f..bacff9aca2 100644 --- a/src/strings/hi-in.json +++ b/src/strings/hi-in.json @@ -1,11 +1,7 @@ { "ButtonQuickStartGuide": "तुरंत आरंभ मार्गदर्शिका", "ButtonSignOut": "Sign out", - "HeaderAddUser": "उपयोगकर्ता जोडें", "LabelFinish": "समाप्त", - "LabelNext": "अगला", - "LabelPrevious": "पिछला", - "LabelYourFirstName": "आपका प्रथम नामः", "LabelYoureDone": "आपने पूरा कर लिया है!", "MoreUsersCanBeAddedLater": "अधिक उपयोगकर्ताओं को बाद में डैशबोर्ड के अंतर्गत जोड़ा जा सकता है।", "TellUsAboutYourself": "हमें अपने बारे में बताएं", @@ -36,44 +32,28 @@ "AllowMediaConversionHelp": "मीडिया परिवर्तन के लिये अनुमति दें", "AllowMediaConversion": "मीडिया रूपांतरण की अनुमति दें", "ButtonOk": "ठीक", - "ButtonOff": "बंद", "ButtonNextTrack": "आगे धावन पथ", - "ButtonNew": "नया", "ButtonNetwork": "संजाल", "ButtonMore": "अधिक", "ButtonManualLogin": "मैनुअल लॉगिन", "ButtonLibraryAccess": "पुस्तकालय का उपयोग", - "ButtonLearnMore": "और अधिक जानें", "ButtonInfo": "जानकारी", - "ButtonHome": "घर", - "ButtonHelp": "मदद", "ButtonGuide": "मार्गदर्शक", "ButtonGotIt": "समझ गया", "ButtonFullscreen": "पूर्ण स्क्रीन", "ButtonForgotPassword": "पासवर्ड भूल गए", - "ButtonFilter": "निस्पंदन", "ButtonEditOtherUserPreferences": "इस उपयोगकर्ता की प्रोफ़ाइल, छवि और व्यक्तिगत प्राथमिकताएँ संपादित करें।", - "ButtonEditImages": "छवियों को संपादित करें", - "ButtonEdit": "संपादित करें", - "ButtonDownload": "डाउनलोड", - "ButtonDown": "नीचे", - "ButtonDeleteImage": "छवि हटाएं", - "ButtonDelete": "हटाएं", - "ButtonConnect": "जुडिये", "ButtonChangeServer": "सर्वर बदलें", "ButtonCancel": "रद्द करना", "ButtonBack": "वापस", "ButtonAudioTracks": "ऑडियो ट्रैक्स", - "ButtonArrowUp": "ऊपर", "ButtonArrowRight": "दाएँ", "ButtonArrowLeft": "बाएं", - "ButtonArrowDown": "नीचे", "ButtonAddUser": "उपयोगकर्ता जोड़ें", "ButtonAddServer": "सर्वर जोड़े", "ButtonAddScheduledTaskTrigger": "ट्रिगर जोड़ें", "ButtonAddMediaLibrary": "मीडिया लाइब्रेरी जोड़ें", "ButtonAddImage": "छवि जोड़ें", - "ButtonAdd": "जोड़ें", "UnsupportedPlayback": "Jellyfin DRM द्वारा संरक्षित सामग्री को डिक्रिप्ट नहीं कर सकता है, लेकिन सभी सामग्री की परवाह किए बिना, संरक्षित शीर्षकों सहित प्रयास किया जाएगा। एन्क्रिप्शन या अन्य असमर्थित सुविधाओं जैसे इंटरेक्टिव शीर्षक के कारण कुछ फाइलें पूरी तरह से काली दिखाई दे सकती हैं।", "BoxRear": "बॉक्स (पीछे)", "Box": "बॉक्स", @@ -86,11 +66,9 @@ "Banner": "झंडा", "Backdrops": "पृष्ठभूमि", "Backdrop": "पृष्ठभूमि", - "AutoBasedOnLanguageSetting": "ऑटो (भाषा सेटिंग के आधार पर)", "Auto": "ऑटो", "AuthProviderHelp": "इस उपयोगकर्ता के पासवर्ड को प्रमाणित करने के लिए एक प्रमाणीकरण प्रदाता का उपयोग करें।", "Audio": "नया", - "AttributeNew": "नया", "AspectRatio": "आस्पेक्ट अनुपात", "AskAdminToCreateLibrary": "लाइब्रेरी बनाने के लिए किसी व्यवस्थापक से पूछें।", "Ascending": "आरोही", @@ -112,9 +90,8 @@ "AlbumArtist": "चित्राधार कलाकार", "AllowOnTheFlySubtitleExtraction": "मक्खी पर उपशीर्षक निष्कर्षण की अनुमति दें", "Album": "एल्बम", - "AddItemToCollectionHelp": "उनके लिए खोज करके संग्रह में आइटम जोड़ें और उन्हें संग्रह में जोड़ने के लिए उनके राइट-क्लिक या टैप मेनू का उपयोग करें।", "ButtonSyncPlay": "SyncPlay", - "BrowsePluginCatalogMessage": "उपलब्ध प्लगिन्स देखने के लिए हमारे कैटलॉग को ब्राउज़ करें।", + "MessageBrowsePluginCatalog": "उपलब्ध प्लगिन्स देखने के लिए हमारे कैटलॉग को ब्राउज़ करें।", "Browse": "ब्राउज़", "BoxSet": "बॉक्स सेट", "BurnSubtitlesHelp": "निर्धारित करता है कि वीडियो ट्रांसकोडिंग करते समय सर्वर को उपशीर्षक बर्न-इन करना चाहिए। इससे बचने से प्रदर्शन में बहुत सुधार होगा। छवि आधारित उपशीर्षक (VOBSUB, PGS, SUB, IDX, …) एवं ASS अथवा SSA जैसे उपशीर्षक बर्न-इन करने के लिए ऑटो का चयन करें।" diff --git a/src/strings/hr.json b/src/strings/hr.json index db5c5499d2..169d50ad6c 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -1,7 +1,6 @@ { "Actor": "Glumac", "Add": "Dodaj", - "AddItemToCollectionHelp": "Pretraživanjem stavaka i korištenjem desnog klika ili izbornika dodavanja u kolekciju možete ih dodati u kolekciju.", "AddToCollection": "Dodaj u kolekciju", "AddToPlaylist": "Dodaj u popis", "AdditionalNotificationServices": "Pretražite katalog dodataka kako bi instalirali dodatne servise za obavijesti.", @@ -11,84 +10,58 @@ "Anytime": "Bilo kada", "AroundTime": "Oko", "AsManyAsPossible": "Što više je moguće", - "AttributeNew": "Novo", "Backdrops": "Pozadine", "BirthDateValue": "Rođen: {0}", "BirthLocation": "Lokacija rođenja", "BirthPlaceValue": "Mjesto rođenja: {0}", - "BrowsePluginCatalogMessage": "Pregledajte dostupne dodatke u našem katalogu.", - "ButtonAdd": "Dodaj", + "MessageBrowsePluginCatalog": "Pregledajte dostupne dodatke u našem katalogu.", "ButtonAddMediaLibrary": "Dodaj medijsku bibilioteku", "ButtonAddScheduledTaskTrigger": "Dodaj okidač", "ButtonAddServer": "Dodaj Server", "ButtonAddUser": "Dodaj korisnika", - "ButtonArrowDown": "Dolje", "ButtonArrowLeft": "Ljevo", "ButtonArrowRight": "Desno", - "ButtonArrowUp": "Gore", "ButtonAudioTracks": "Audio pjesme", "ButtonBack": "Nazad", "ButtonCancel": "Odustani", "ButtonChangeServer": "Promijeni Server", - "ButtonConnect": "Spoji", - "ButtonDelete": "Izbriši", - "ButtonDeleteImage": "Izbriši sliku", - "ButtonDown": "Dolje", - "ButtonDownload": "Preuzimanje", - "ButtonEdit": "Izmjeni", - "ButtonEditImages": "Uređivanje slika", "ButtonEditOtherUserPreferences": "Uredite ovaj korisnički profil, slike i osobne postavke.", "ButtonForgotPassword": "Zaboravili ste lozinku", "ButtonFullscreen": "Puni zaslon", "ButtonGotIt": "Shvaćam", "ButtonGuide": "Vodič", - "ButtonHelp": "Pomoć", - "ButtonHome": "Početna", - "ButtonLearnMore": "Nauči još", "ButtonLibraryAccess": "Pristup biblioteci", "ButtonManualLogin": "Ručna prijava", "ButtonMore": "Više", "ButtonNetwork": "Mreža", - "ButtonNew": "Novo", "ButtonNextTrack": "Sljedeća pjesma", - "ButtonOff": "Isključi", "ButtonOk": "U redu", "ButtonOpen": "Otvori", "ButtonParentalControl": "Roditeljska kontrola", "ButtonPause": "Pauza", - "ButtonPlay": "Pokreni", "ButtonPreviousTrack": "Prethodna pjesma", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Vodič za brzi početak", - "ButtonRefresh": "Osviježi", "ButtonRefreshGuideData": "Osvježi TV vodič", "ButtonRemove": "Ukloni", "ButtonRename": "Preimenuj", - "ButtonRepeat": "Ponovi", "ButtonResetEasyPassword": "Poništi jednostavan PIN kod", "ButtonResetPassword": "Resetiraj lozinku", "ButtonRestart": "Ponovo pokreni", "ButtonResume": "Nastavi", "ButtonRevoke": "Opozvati", - "ButtonSave": "Snimi", - "ButtonSearch": "Traži", "ButtonSelectDirectory": "Odaberi mapu", "ButtonSelectServer": "Odaberi Server", "ButtonSelectView": "Odaberi pogled", "ButtonSend": "Pošalji", "ButtonSettings": "Postavke", - "ButtonShuffle": "Miješaj", "ButtonShutdown": "Ugasi", "ButtonSignIn": "Prijava", "ButtonSignOut": "Odjava", - "ButtonSort": "Složi", "ButtonStart": "Početak", "ButtonSubmit": "Podnesi", - "ButtonSubtitles": "Titlovi", "ButtonTrailer": "Kratki video", "ButtonUninstall": "Ukloni", - "ButtonUp": "Gore", - "ButtonViewWebsite": "Posjeti web stranice", "ButtonWebsite": "Web stranica", "CancelRecording": "Prekini snimanje", "CancelSeries": "Odustani od serije", @@ -106,7 +79,7 @@ "Continuing": "Nastavlja se", "CustomDlnaProfilesHelp": "Kreiraj prilagođeni profili za novi uređaj ili doradi neki od sistemskih profila.", "DeathDateValue": "Umro: {0}", - "DefaultErrorMessage": "Došlo je do pogreške prilikom obrade zahtjeva. Molimo pokušajte ponovo kasnije.", + "ErrorDefault": "Došlo je do pogreške prilikom obrade zahtjeva. Molimo pokušajte ponovo kasnije.", "Delete": "Izbriši", "DeleteDeviceConfirmation": "Jeste li sigurni da želite izbrisati ovaj uređaj? Pojavit će se sljedeći put kad se korisnik prijavi s njim.", "DeleteImage": "Izbriši sliku", @@ -133,7 +106,7 @@ "ErrorAddingMediaPathToVirtualFolder": "Došlo je do pogreške prilikom dodavanja putanje medija. Provjerite dali je putanja valjana i da proces Jellyfin Server-a ima pristup tom mjestu.", "ErrorAddingTunerDevice": "Došlo je do pogreške prilikom dodavanja uređaja TV/radio pretraživača. Provjerite da je dostupan i pokušajte ponovno.", "ErrorGettingTvLineups": "Došlo je do pogreške prilikom preuzimanja TV postave. Provjerite dali su vaše informacije točne i pokušajte ponovno.", - "ErrorMessageStartHourGreaterThanEnd": "Vrijeme završetka mora biti veće od početka.", + "ErrorStartHourGreaterThanEnd": "Vrijeme završetka mora biti veće od početka.", "ErrorPleaseSelectLineup": "Odaberite postavu i pokušajte ponovno. Ako niti jedna postava nije dostupna provjerite dali su korisničko ime, lozinka i poštanski broj točni.", "ErrorSavingTvProvider": "Došlo je do pogreške prilikom snimanja TV pružatelja. Provjerite da je dostupan i pokušajte ponovno.", "ExtractChapterImagesHelp": "Izdvajanje slika poglavlja omogućiti će klijentima prikaz grafičkih izbornika za odabir scena. Proces može biti spor, resursi intenzivno korišteni i može zahtijevati nekoliko gigabajta prostora. Ono se pokreće kad je otkriven video, a također i kao noćni zadatak. Raspored je podesiv u području rasporeda zadataka. Ne preporučuje se za pokretanje ovog zadatka tijekom sati čestog korištenja.", @@ -164,11 +137,9 @@ "HeaderActiveDevices": "Aktivni uređaji", "HeaderActiveRecordings": "Aktivna snimanja", "HeaderActivity": "Aktivnosti", - "HeaderAddScheduledTaskTrigger": "Dodaj okidač", "HeaderAddToCollection": "Dodaj u kolekciju", "HeaderAddToPlaylist": "Dodaj u popis", "HeaderAddUpdateImage": "Dodaj/ažuriraj sliku", - "HeaderAddUser": "Dodaj korisnika", "HeaderAdditionalParts": "Dodatni djelovi", "HeaderAlert": "Uzbuna", "HeaderApiKey": "API ključ", @@ -176,15 +147,11 @@ "HeaderApiKeysHelp": "Vanjske aplikacije moraju imati API ključ kako bi komunicirale s Jellyfin Serverom. Ključevi se izdaju prijavom s Jellyfin računom ili ručnim odobravanjem zahtjeva ključa.", "HeaderApp": "Aplikacija", "HeaderAudioSettings": "Postavke zvuka", - "HeaderAutomaticUpdates": "Automatske nadogradnje", - "HeaderBooks": "Knjige", "HeaderBranding": "Brendiranje", "HeaderCancelRecording": "Prekini snimanje", "HeaderCancelSeries": "Otkaži serije", "HeaderCastAndCrew": "Glumci i ekipa", - "HeaderCastCrew": "Glumci i ekipa", "HeaderChannelAccess": "Pristup kanalima", - "HeaderChannels": "Kanali", "HeaderCodecProfile": "Profil kodeka", "HeaderCodecProfileHelp": "Profili kodeka definiraju ograničenja kada uređaji izvode sadržaj u specifičnom kodeku. Ako se ograničenja podudaraju tada će sadržaj biti transkodiran, iako je kodek konfiguriran za direktno izvođenje.", "HeaderConfirmPluginInstallation": "Potvrdi instalaciju dodatka", @@ -206,19 +173,14 @@ "HeaderDevices": "Uređaji", "HeaderDirectPlayProfile": "Profil za direktnu reprodukciju", "HeaderDirectPlayProfileHelp": "Dodaj izravne profile reprodukcije za označavanje kojim formatima uređaj može rukovati prirodno.", - "HeaderDisplay": "Prikaz", "HeaderEasyPinCode": "Lagan PIN", "HeaderEditImages": "Uređivanje slika", "HeaderEnabledFields": "Omogući polja", "HeaderEnabledFieldsHelp": "Poništi polje za zaključavanje i spriječi njihove podatke od toga da budu promijenjeni.", - "HeaderEpisodes": "Epizode", "HeaderError": "Greška", "HeaderFeatureAccess": "Pristup opcijama", - "HeaderFeatures": "Mogućnosti", "HeaderFetchImages": "Dohvati slike:", - "HeaderFilters": "Filtri", "HeaderForKids": "Za djecu", - "HeaderForgotPassword": "Zaboravili ste lozinku", "HeaderFrequentlyPlayed": "Često izvođeno", "HeaderGuideProviders": "Pružatelji vodiča", "HeaderHttpHeaders": "HTTP zaglavlja", @@ -228,7 +190,6 @@ "HeaderIdentifyItemHelp": "Unesite jednu ili više kriterija pretraživanja. Uklonite kriterije za povećanje rezultata pretraživanja.", "HeaderImageSettings": "Postavke slike", "HeaderInstall": "Instaliraj", - "HeaderItems": "Stavke", "HeaderKeepRecording": "Zadrži snimanje", "HeaderKeepSeries": "Zadrži serije", "HeaderLatestEpisodes": "Zadnje epizode", @@ -239,19 +200,14 @@ "HeaderLibraries": "Biblioteke", "HeaderLibraryAccess": "Pristup biblioteci", "HeaderLibraryFolders": "Mape medija", - "HeaderLiveTV": "TV uživo", - "HeaderLiveTv": "TV uživo", "HeaderLoginFailure": "Neuspjela prijava", "HeaderMedia": "Medij", "HeaderMediaFolders": "Medijska mapa", - "HeaderMediaInfo": "Info medija", "HeaderMetadataSettings": "Postavke meta-podataka", "HeaderMoreLikeThis": "Više ovakvih", - "HeaderMovies": "Filmovi", "HeaderMusicVideos": "Muzički spotovi", "HeaderMyMedia": "Moji mediji", "HeaderNewApiKey": "Novi API ključ", - "HeaderNextUp": "Sljedeće je", "HeaderOtherItems": "Ostale stavke", "HeaderPassword": "Lozinka", "HeaderPasswordReset": "Poništenje lozinke", @@ -275,7 +231,6 @@ "HeaderRevisionHistory": "Povijest revizije", "HeaderRunningTasks": "Zadatci koji se izvode", "HeaderScenes": "Scene", - "HeaderSchedule": "Raspored", "HeaderSeasons": "Sezone", "HeaderSelectCertificatePath": "Odaberi putanju certifikata", "HeaderSelectMetadataPath": "Odaberite putanju meta-podataka", @@ -287,12 +242,10 @@ "HeaderSelectTranscodingPath": "Odaberite privremenu putanju konvertiranja", "HeaderSelectTranscodingPathHelp": "Pregledajte ili unesite putanju za korištenje konvertiranja privremenih datoteka. U mapu se mora moći pisati.", "HeaderSendMessage": "Pošalji poruku", - "HeaderSeries": "Serija", "HeaderSeriesOptions": "Opcije serija", "HeaderServerSettings": "Postavke Servera", "HeaderSettings": "Postavke", "HeaderSetupLibrary": "Postavite vaše medijske biblioteke", - "HeaderShutdown": "Ugasi", "HeaderSortBy": "Složi po", "HeaderSortOrder": "Redoslijed", "HeaderSpecialEpisodeInfo": "Posebni podaci o epizodi", @@ -301,7 +254,6 @@ "HeaderSubtitleProfiles": "Profili titlova prijevoda", "HeaderSubtitleProfilesHelp": "Profili titlova prijevoda opisuju format titlova koji podržava uređaj.", "HeaderSystemDlnaProfiles": "Sistemski profil", - "HeaderTags": "Oznake", "HeaderTaskTriggers": "Okidači zadataka", "HeaderThisUserIsCurrentlyDisabled": "Ovaj je korisnik trenutno onemogućen", "HeaderTranscodingProfile": "Profil transkodiranja", @@ -319,7 +271,6 @@ "HeaderXmlDocumentAttributes": "Xml atributi dokumenta", "HeaderXmlSettings": "Xml postavke", "HeaderYears": "Godine", - "HeadersFolders": "Mape", "Help": "Pomoć", "Identify": "Identificiraj", "Images": "Slike", @@ -344,10 +295,7 @@ "LabelAlbumArtMaxWidthHelp": "Maksimalna rezolucija albuma izloženih putem UPnP:albumArtURI.", "LabelAlbumArtPN": "Grafika albuma PN:", "LabelAlbumArtists": "Izvođači albuma:", - "LabelAll": "Sve", "LabelAllowHWTranscoding": "Dopusti hardversko konvertiranje", - "LabelAllowServerAutoRestart": "Dopusti serveru da se automatski resetira kako bi proveo nadogradnje", - "LabelAllowServerAutoRestartHelp": "Server će se resetirati samo dok je u statusu mirovanja kada nema aktivnih korisnika.", "LabelAppName": "Ime aplikacije", "LabelAppNameExample": "Primjer: Sickbeard, Sonarr", "LabelArtists": "Izvođači:", @@ -372,7 +320,6 @@ "LabelCurrentPassword": "Sadašnja lozinka:", "LabelCustomCss": "Prilagođeni CSS:", "LabelCustomCssHelp": "Primijenite svoj vlastiti prilagođeni stil na web sučelje.", - "LabelCustomDeviceDisplayName": "Prikaz naziva:", "LabelCustomDeviceDisplayNameHelp": "Navedite naziv prilagođenog prikaza ili ostaviti prazno za korištenje naziva koji je izvijestio uređaj.", "LabelCustomRating": "Prilagođena ocjena:", "LabelDateAdded": "Datum dodavanja:", @@ -384,7 +331,6 @@ "LabelDefaultUserHelp": "Određuje koja će biblioteka biti prikazana na spojenim uređajima. Ovo se može zaobići za svaki uređaj koristeći profile.", "LabelDeviceDescription": "Opis uređaja", "LabelDidlMode": "DIDL način:", - "LabelDisplayMissingEpisodesWithinSeasons": "Prikaži epizode koje nedostaju unutar sezone", "LabelDisplayName": "Prikaz naziva:", "LabelDisplayOrder": "Poredak prikaza:", "LabelDisplaySpecialsWithinSeasons": "Prikaz specijalnih dodataka unutar sezona u kojima su emitirani", @@ -499,7 +445,6 @@ "LabelNewPassword": "Nova lozinka:", "LabelNewPasswordConfirm": "Potvrda nove lozinke:", "LabelNewsCategories": "Kategorije vijesti:", - "LabelNext": "Sljedeći", "LabelNotificationEnabled": "Omogući ovu obavijest", "LabelNumber": "Broj:", "LabelNumberOfGuideDays": "Broj dana TV vodiča za preuzet:", @@ -520,8 +465,6 @@ "LabelPlayDefaultAudioTrack": "Pokreni zadani audio zapis, bez obzira na jezik", "LabelPlaylist": "Popis:", "LabelPreferredDisplayLanguage": "Željeni jezik za prikaz:", - "LabelPreferredDisplayLanguageHelp": "Prevađanje Jellyfin-a je projekt u tijeku.", - "LabelPrevious": "Prethodni", "LabelProfileAudioCodecs": "Audio kodek:", "LabelProfileCodecs": "Kodeki:", "LabelProfileCodecsHelp": "Odvojeno sa točka-zrezom. Ovo može ostaviti prazno kao bi bilo postavljeno za sve codecs.", @@ -535,7 +478,6 @@ "LabelPublicHttpPortHelp": "Broj javnog broja porta koji treba biti mapiran na lokalni http port.", "LabelPublicHttpsPort": "Javni broj https porta:", "LabelPublicHttpsPortHelp": "Broj javnog broja porta koji treba biti mapiran na lokalni https port.", - "LabelReadHowYouCanContribute": "Naučite kako možete pridonijeti.", "LabelRecord": "Snimka:", "LabelRecordingPath": "Zadana putanja za snimanje:", "LabelRecordingPathHelp": "Odredite zadano mjesto za spremanje snimaka. Ako se ostavi prazno, koristit će se mapa poslužitelja programskih podaka.", @@ -574,12 +516,9 @@ "LabelTimeLimitHours": "Rok (sati):", "LabelTitle": "Naslov:", "LabelTrackNumber": "Broj pjesme:", - "LabelTranscodingAudioCodec": "Audio koder:", - "LabelTranscodingContainer": "Spremnik:", "LabelTranscodingTempPathHelp": "Ova mapa sadrži radne datoteke koje koristi konverter. Navedite prilagođenu putanju ili ostavite prazno za korištenje zadanog unutar mape podataka poslužitelja.", "LabelTranscodingThreadCount": "Broj niti konvertiranja:", "LabelTranscodingThreadCountHelp": "Odaberite maksimalan broj niti koje će se koristiti kada se konvertira. Manji broj niti će smanjiti upotrebu procesora, ali moguće da neće konvertirati dovoljno brzo za glatke reprodukcije.", - "LabelTranscodingVideoCodec": "Video koder:", "LabelTriggerType": "Tip pokretača:", "LabelTunerIpAddress": "IP adresa TV/Radio uređaja:", "LabelTunerType": "Vrsta pretraživača:", @@ -596,7 +535,6 @@ "LabelVersionInstalled": "{0} instaliran", "LabelXDlnaCapHelp": "Određuje sadržaj X_DLNACAP elementa u urn:shemas-dlna-org:device-1-0 namespace.", "LabelXDlnaDocHelp": "Određuje sadržaj X_DLNADOC elementa u urn:schemas-dlna-org:device-1-0 namespace.", - "LabelYourFirstName": "Ime:", "LabelYoureDone": "Završeno!", "LabelZipCode": "Poštanski broj:", "LabelffmpegPath": "FFmpeg putanja:", @@ -653,7 +591,6 @@ "MessageFileReadError": "Prilikom učitavanja datoteke desila se greška. Pokušajte ponovno.", "MessageForgotPasswordFileCreated": "Sljedeća datoteka je stvorena na vašem poslužitelju i sadrži upute o tome kako postupiti:", "MessageForgotPasswordInNetworkRequired": "Molim pokušajte ponovno unutar kućne mreže za pokretanje postupka za poništavanje zaporke.", - "MessageInstallPluginFromApp": "Ovaj dodatak mora biti instaliran unutar aplikacije u kojoj ga namjeravate koristiti.", "MessageInvalidForgotPasswordPin": "Upisan je neispravan ili zastarjele pin. Molim, pokušajte ponovno.", "MessageInvalidUser": "Pogrešno korisničko ime ili lozinka. Molim, pokušajte ponovo.", "MessageItemSaved": "Stavka je snimljena.", @@ -669,7 +606,6 @@ "MessagePluginConfigurationRequiresLocalAccess": "Za podešavanje ovog dodatka prijavite se izravno na lokalni server.", "MessagePluginInstallDisclaimer": "Dodaci izgrađeni od strane članova Jellyfin zajednice su sjajan način kako bi unaprijedili Vaše iskustvo Jellyfin s dodatnim značajkama i prednostima. Prije instaliranja budite svjesni učinaka koje mogu imati na vaš Jellyfin Server, kao što je duže skeniranje biblioteke, dodatna pozadinska obrada, a smanjena stabilnost sustava.", "MessageReenableUser": "Pogledajte dolje za ponovno omogućenje", - "MessageSettingsSaved": "Postavke spremljene.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Sljedeće lokacije medija biti će uklonjene iz vaše Jellyfin biblioteke:", "MessageUnableToConnectToServer": "Nismo u mogućnosti spojiti se na odabrani poslužitelj. Provjerite dali je pokrenut i pokušajte ponovno.", "MessageUnsetContentHelp": "Sadržaj će biti prikazan kao obične mape. Za najbolje rezultate upotrijebite upravitelj meta-podataka za postavljanje vrste sadržaja pod-mapa.", @@ -692,8 +628,8 @@ "NewEpisodes": "Nove epizode", "NewEpisodesOnly": "Samo nove epizode", "News": "Vijesti", - "NoNextUpItemsMessage": "Nije pronađeno. Krenite sa gledanjem vaše emisije!", - "NoPluginConfigurationMessage": "Ovaj dodatak nema postavke za podesiti.", + "MessageNoNextUpItems": "Nije pronađeno. Krenite sa gledanjem vaše emisije!", + "MessageNoPluginConfiguration": "Ovaj dodatak nema postavke za podesiti.", "NoSubtitleSearchResultsFound": "Nije ništa pronađeno.", "NumLocationsValue": "{0} mape", "OptionAdminUsers": "Administratori", @@ -716,7 +652,6 @@ "OptionArtist": "Izvođaču", "OptionAscending": "Uzlazno", "OptionAuto": "Automatski", - "OptionAutomatic": "Automatski", "OptionBlockBooks": "Knjige", "OptionBlockChannelContent": "Sadržaj Internet kanala", "OptionBlockLiveTvChannels": "TV kanali uživo", @@ -764,7 +699,6 @@ "OptionExternallyDownloaded": "Vanjsko preuzimanje", "OptionExtractChapterImage": "Omogući preuzimanje slika iz poglavlja", "OptionFavorite": "Omiljeni", - "OptionFriday": "Petak", "OptionHasSpecialFeatures": "Specijalne opcije", "OptionHasSubtitles": "Titlovi", "OptionHasThemeSong": "Pjesma teme", @@ -780,11 +714,9 @@ "OptionLikes": "Volim", "OptionMax": "Maksimalno", "OptionMissingEpisode": "Epizode koje nedostaju", - "OptionMonday": "Ponedjeljak", "OptionNameSort": "Nazivu", "OptionNew": "Novo…", "OptionNone": "Ništa", - "OptionOnAppStartup": "Kada se aplikacija pokrene", "OptionOnInterval": "U intervalu", "OptionParentalRating": "Roditeljska ocjena", "OptionPlainStorageFolders": "Prikaži sve mape kako jednostavne mape za skladištenje", @@ -802,20 +734,15 @@ "OptionRequirePerfectSubtitleMatch": "Samo preuzimanje titlova prijevoda koji su savršen izbor za moje video datoteke", "OptionResumable": "Nastavi", "OptionRuntime": "Trajanje", - "OptionSaturday": "Subota", "OptionSaveMetadataAsHidden": "Spremite meta-podatke i slike kao skrivene datoteke", "OptionSaveMetadataAsHiddenHelp": "Promjena ovoga će se primjenjivati na nove meta-podatke spremljene unaprijed. Postojeće datoteke meta-podataka će se ažurirati sljedeći puta kada ih spremi Jellyfin Server.", "OptionSpecialEpisode": "Specijal", "OptionSubstring": "Podniz", - "OptionSunday": "Nedjelja", - "OptionThursday": "Četvrtak", "OptionTrackName": "Nazivu pjesme", - "OptionTuesday": "Utorak", "OptionTvdbRating": "Ocjeni Tvdb", "OptionUnairedEpisode": "Ne emitirane epizode", "OptionUnplayed": "Neizvođeni", "OptionWakeFromSleep": "Pokreni iz stanja mirovanja", - "OptionWednesday": "Srijeda", "OptionWeekdays": "Radni dani", "OptionWeekends": "Vikendi", "OptionWeekly": "Tjedno", @@ -828,7 +755,7 @@ "PasswordMatchError": "Lozinka i lozinka potvrde moraju biti identične.", "PasswordResetComplete": "Lozinka je resetirana.", "PasswordResetConfirmation": "Da li ste sigurni da želite resetirati lozinku?", - "PasswordResetHeader": "Poništi lozinku", + "HeaderResetPassword": "Poništi lozinku", "PasswordSaved": "Lozinka snimljena.", "People": "Ljudi", "PinCodeResetComplete": "PIN je resetiran.", @@ -846,7 +773,6 @@ "Premieres": "Premijere", "Producer": "Producent", "ProductionLocations": "Lokacije proizvodnje", - "QueueAllFromHere": "Stavi u red čekanja sve odavde", "RecentlyWatched": "Nedavno pogledano", "RecommendationBecauseYouLike": "Zato što volite {0}", "RecommendationBecauseYouWatched": "Zato što ste gledali {0}", @@ -855,7 +781,7 @@ "Record": "Snimi", "RecordSeries": "Snimi serije", "RecordingCancelled": "Snimka je otkazana.", - "RecordingPathChangeMessage": "Promjena mape za snimanje neće migrirati postojeće snimke iz stare lokacije na novu. Morat ćete ih pomicati ručno, ako to želite.", + "MessageChangeRecordingPath": "Promjena mape za snimanje neće migrirati postojeće snimke iz stare lokacije na novu. Morat ćete ih pomicati ručno, ako to želite.", "RecordingScheduled": "Snimka je zakazana.", "Refresh": "Osviježi", "RefreshDialogHelp": "Meta-podaci se osvježavaju na temelju postavki i internet usluga koje su omogućene u nadzornoj ploči Jellyfin Server-a.", @@ -903,56 +829,28 @@ "SystemDlnaProfilesHelp": "Sistemski profili su samo za čitanje. Bilo kakve izmjene na sistemskom profilu biti će snimljene kao novi prilagođeni profil.", "TabAccess": "Pristup", "TabAdvanced": "Napredno", - "TabAlbumArtists": "Albumi izvođača", - "TabAlbums": "Albumi", - "TabArtists": "Izvođači", "TabCatalog": "Katalog", - "TabChannels": "Kanali", "TabCodecs": "Kodek", - "TabCollections": "Kolekcije", "TabContainers": "Spremnik", "TabDashboard": "Nadzorna ploča", - "TabDevices": "Uređaji", "TabDirectPlay": "Direktna reprodukcija", - "TabDisplay": "Prikaz", - "TabEpisodes": "Epizode", - "TabFavorites": "Omiljeni", - "TabGenres": "Žanrovi", - "TabGuide": "Vodič", "TabLatest": "Zadnje", - "TabLiveTV": "TV uživo", "TabLogs": "Dnevnici", - "TabMetadata": "Meta-podaci", - "TabMovies": "Filmovi", "TabMusic": "Glazba", - "TabMusicVideos": "Muzički spotovi", "TabMyPlugins": "Moji dodaci", "TabNetworks": "Mreže", "TabNfoSettings": "Nfo postavke", "TabNotifications": "Obavijesti", "TabOther": "Ostalo", "TabParentalControl": "Roditeljska kontrola", - "TabPassword": "Lozinka", - "TabPlayback": "Reprodukcija", - "TabPlaylist": "Lista izvođenja", - "TabPlaylists": "Popisi", "TabPlugins": "Dodaci", "TabProfile": "Profil", "TabProfiles": "Profili", - "TabRecordings": "Snimke", "TabResponses": "Odazivi", - "TabResumeSettings": "Postavke nastavka", "TabScheduledTasks": "Zakazani zadaci", - "TabSeries": "Serije", "TabSettings": "Postavke", - "TabShows": "Emisije", - "TabSongs": "Pjesme", "TabStreaming": "Strujanje", - "TabSuggestions": "Prijedlozi", - "TabTrailers": "Kratki filmovi", - "TabTranscoding": "Konvertiranje", "TabUpcoming": "Uskoro", - "TabUsers": "Korisnici", "Tags": "Oznake", "TellUsAboutYourself": "Recite nam nešto o sebi", "ThisWizardWillGuideYou": "Ovaj pomoćnik će Vas voditi kroz proces podešavanja. Za početak, odaberite željeni jezik.", @@ -963,7 +861,7 @@ "TrackCount": "{0} pjesme", "Tuesday": "Utorak", "UninstallPluginConfirmation": "Da li ste sigurni da želite ukloniti {0}?", - "UninstallPluginHeader": "Ukloni dodatak", + "HeaderUninstallPlugin": "Ukloni dodatak", "Unrated": "Neocijenjeno", "UserProfilesIntro": "Jellyfin uključuje ugrađenu podršku za korisničke profile što omogućuje svakom korisniku da ima svoje vlastite postavke prikaza, PlayStation i roditeljski nadzor.", "ValueAlbumCount": "{0} albuma", @@ -1048,7 +946,6 @@ "Album": "Album", "AddToPlayQueue": "Dodaj u red izvođenja", "Banner": "Zaglavlje", - "AutoBasedOnLanguageSetting": "Automatski (prema jezičnim postavkama)", "AspectRatio": "Omjer", "Ascending": "Uzlazno", "Art": "Grafike", @@ -1059,17 +956,14 @@ "Connect": "Spoji", "ClientSettings": "Postavke klijenta", "ButtonTogglePlaylist": "Lista izvođenja", - "ButtonToggleContextMenu": "Više", "ButtonSplit": "Odvoji", "ButtonStop": "Stop", "ButtonScanAllLibraries": "Skeniraj sve biblioteke", "ButtonInfo": "Info", - "ButtonFilter": "Filtriraj", "ButtonAddImage": "Dodaj sliku", "Box": "Kutija", "AskAdminToCreateLibrary": "Traži administratora da kreira biblioteku.", "PictureInPicture": "Slika u slici", - "OtherArtist": "Ostali izvođači", "OptionThumb": "Sličica", "OptionProtocolHttp": "HTTP", "OptionProfileVideo": "Video", @@ -1087,7 +981,6 @@ "Off": "Isključi", "Normal": "Normalno", "None": "Ništa", - "NoSubtitles": "Ništa", "No": "Ne", "NextUp": "Slijedi", "Next": "Slijedeće", @@ -1109,7 +1002,6 @@ "MediaInfoStreamTypeSubtitle": "Prijevod", "MediaInfoStreamTypeData": "Podaci", "MediaInfoStreamTypeAudio": "Audio", - "MediaInfoSoftware": "Softver", "Logo": "Logo", "List": "Lista", "LabelYear": "Godina:", @@ -1131,9 +1023,7 @@ "LabelSyncPlayNewGroupDescription": "Kreiraj novu grupu", "LabelSyncPlayNewGroup": "Nova grupa", "MillisecondsUnit": "ms", - "LabelSubtitles": "Prijevodi", "LabelStatus": "Status:", - "LabelSoundEffects": "Zvučni efekti:", "LabelSortOrder": "Redoslijed sortiranja:", "LabelSortBy": "Sortiranje po:", "LabelSize": "Veličina:", @@ -1154,7 +1044,6 @@ "LabelDisplayLanguage": "Jezik prikaza:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Automatski osvježi meta podatke sa interneta:", "LabelAudioChannels": "Audio kanali:", - "LabelAudio": "Audio", "LabelAlbum": "Album:", "Label3DFormat": "3D format:", "Items": "Stavke", @@ -1179,8 +1068,6 @@ "HeaderNavigation": "Navigacija", "HeaderMyDevice": "Moj uređaj", "HeaderLibrarySettings": "Postavke biblioteke", - "HeaderHome": "Početna", - "HeaderGenres": "Žanrovi", "HeaderFavoritePeople": "Omiljeni ljudi", "HeaderFavoriteMovies": "Omiljeni filmovi", "HeaderFavoriteBooks": "Omiljene knjige", @@ -1191,7 +1078,6 @@ "HeaderAudioBooks": "Audio knjige", "ApiKeysCaption": "Popis trenutno dostupnih API ključeva", "HeaderAllowMediaDeletionFrom": "Dozvoli brisanje datoteka iz", - "HeaderAlbums": "Albumi", "HeaderAdmin": "Administrator", "Guide": "Vodič", "GroupBySeries": "Grupiraj po serijama", @@ -1212,7 +1098,6 @@ "EnableDecodingColorDepth10Vp9": "Omogući 10-Bitno hardversko dekodiranje za VP9", "EnableDecodingColorDepth10Hevc": "Omogući 10-Bitno hardversko dekodiranje za HEVC", "EnableCinemaMode": "Kino mod", - "EnableBackdrops": "Pozadine", "EditMetadata": "Izmijeni meta podatke", "DisplayMissingEpisodesWithinSeasons": "Prikaži epizode koje nedostaju unutar sezona", "DisplayInMyMedia": "Prikaz na početnom ekranu", @@ -1229,7 +1114,6 @@ "DatePlayed": "Datum reprodukcije", "DateAdded": "Datum dodavanja", "CriticRating": "Rejting kritičara", - "CopyStreamURLError": "Došlo je do greške prilikom kopiranja URLa.", "ConfirmEndPlayerSession": "Da li želite ugasiti Jellyfin na {0}?", "CommunityRating": "Rejting zajednice", "Browse": "Pretraži", diff --git a/src/strings/hu.json b/src/strings/hu.json index ddf4cd9fe9..9360309359 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -10,70 +10,45 @@ "AllLanguages": "Összes nyelv", "AllLibraries": "Összes könyvtár", "Ascending": "Növekvő", - "AttributeNew": "Új", "Audio": "Audió", - "AutoBasedOnLanguageSetting": "Automatikus (a nyelvi beállítások alapján)", "BirthDateValue": "Született: {0}", "BirthPlaceValue": "Születési hely: {0}", "Books": "Könyvek", "Browse": "Tallózás", - "ButtonAdd": "Hozzáadás", "ButtonAddMediaLibrary": "Médiakönyvtár hozzáadása", "ButtonAddServer": "Szerver Hozzáadása", "ButtonAddUser": "Új felhasználó", - "ButtonArrowDown": "Le", - "ButtonArrowUp": "Fel", "ButtonAudioTracks": "Audió Sávok", "ButtonCancel": "Mégsem", "ButtonChangeServer": "Szerver váltás", - "ButtonConnect": "Kapcsolódás", - "ButtonDelete": "Törlés", - "ButtonDeleteImage": "Kép törlése", - "ButtonDown": "Le", - "ButtonDownload": "Letöltés", - "ButtonEdit": "Szerkesztés", - "ButtonEditImages": "Képek szerkesztése", - "ButtonFilter": "Szűrő", "ButtonForgotPassword": "Elfelejtett Jelszó", "ButtonGotIt": "Értettem", - "ButtonHelp": "Segítség", - "ButtonHome": "Kezdőlap", "ButtonLibraryAccess": "Könyvtár hozzáférés", "ButtonManualLogin": "Manuális belépés", "ButtonMore": "Tovább", - "ButtonNew": "Új", "ButtonNextTrack": "Következő sáv", - "ButtonOff": "Ki", "ButtonOpen": "Megnyitás", "ButtonParentalControl": "Szülői felügyelet", "ButtonPause": "Szünet", - "ButtonPlay": "Lejátszás", "ButtonPreviousTrack": "Előző sáv", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Gyorsbeállítás varázsló", - "ButtonRefresh": "Frissítés", "ButtonRemove": "Eltávolítás", "ButtonRename": "Átnevezés", - "ButtonRepeat": "Ismétlés", "ButtonResetEasyPassword": "Pin kód visszaállítása", "ButtonResetPassword": "Jelszó visszaállítás", "ButtonRestart": "Újraindítás", "ButtonResume": "Folytatás", - "ButtonSave": "Mentés", "ButtonScanAllLibraries": "Minden könyvtár beolvasása", - "ButtonSearch": "Keresés", "ButtonSelectDirectory": "Könyvtár választása", "ButtonSelectServer": "Szerver Kiválasztás", "ButtonSend": "Küldés", "ButtonSettings": "Beállítások", - "ButtonShuffle": "Keverés", "ButtonShutdown": "Leállítás", "ButtonSignIn": "Bejelentkezés", "ButtonSignOut": "Kijelentkezés", - "ButtonSort": "Rendezés", "ButtonStop": "Leállít", "ButtonSubmit": "Elküld", - "ButtonSubtitles": "Feliratok", "ButtonTrailer": "Előzetes", "ButtonUninstall": "Eltávolítás", "ButtonWebsite": "Weboldal", @@ -98,10 +73,8 @@ "EditImages": "Képek szerkesztése", "EditMetadata": "Metaadat szerkesztése", "EditSubtitles": "Feliratok szerkesztése", - "EnableBackdrops": "Háttérképek", "EnableBackdropsHelp": "A háttérképek a könyvtár böngészése közben néhány oldal hátterében jelennek meg.", "EnableHardwareEncoding": "Hardveres kódolás engedélyezése", - "EnableThemeSongs": "Főcímdalok", "EnableThemeSongsHelp": "Főcímdalok lejátszása háttérben a könyvtár böngészése közben.", "EndsAtValue": "Várható befejezés {0}", "Episodes": "Epizódok", @@ -127,14 +100,9 @@ "HeaderAddToCollection": "Hozzáadás gyűjteményhez", "HeaderAddToPlaylist": "Hozzáadás lejátszási listához", "HeaderAddUpdateImage": "Kép hozzáadása / frissítése", - "HeaderAddUser": "Új felhasználó", - "HeaderAlbums": "Albumok", "HeaderAudioBooks": "Hangos könyvek", "HeaderAudioSettings": "Audió Beállítások", - "HeaderAutomaticUpdates": "Automatikus frissitések", "HeaderCastAndCrew": "Szereplők és Stáb", - "HeaderCastCrew": "Szereplők és Stáb", - "HeaderChannels": "Csatornák", "HeaderConnectToServer": "Kapcsolódás a Szerverhez", "HeaderContinueWatching": "Megtekintés folytatása", "HeaderCustomDlnaProfiles": "Egyedi profilok", @@ -142,18 +110,12 @@ "HeaderDeveloperInfo": "Fejlesztői információk", "HeaderDeviceAccess": "Eszköz Hozzáférések", "HeaderDevices": "Eszközök", - "HeaderDisplay": "Megjelenítés", "HeaderDownloadSync": "Letöltés és szinkronizálás", "HeaderEasyPinCode": "Pin kód", "HeaderEditImages": "Képek szerkesztése", "HeaderEnabledFields": "Engedélyezett mezők", - "HeaderEpisodes": "Epizódok", "HeaderExternalIds": "Külső id-k:", - "HeaderFeatures": "Jellemzők", - "HeaderFilters": "Szűrők", - "HeaderForgotPassword": "Elfelejtett Jelszó", "HeaderFrequentlyPlayed": "Gyakran játszott", - "HeaderGenres": "Műfajok", "HeaderIdentifyItemHelp": "Adj meg egy vagy több keresési kritériumot. Távolítsd el a kritériumokat a keresési eredmények növelése érdekében.", "HeaderImageSettings": "Kép beállítások", "HeaderInstall": "Telepítés", @@ -168,20 +130,16 @@ "HeaderLiveTvTunerSetup": "Élő TV tuner beállítása", "HeaderMedia": "Média", "HeaderMediaFolders": "Médiakönyvtárak", - "HeaderMediaInfo": "Média Infó", "HeaderMetadataSettings": "Metaadat Beállítások", "HeaderMoreLikeThis": "Több ehhez hasonló", - "HeaderMovies": "Filmek", "HeaderMusicVideos": "Zenei videók", "HeaderMyDevice": "Jelenlegi eszköz", "HeaderMyMedia": "Médiatáram", "HeaderMyMediaSmall": "Médiatáram (kicsi)", - "HeaderNextUp": "Következik", "HeaderOnNow": "Most", "HeaderParentalRatings": "Korhatár besorolás", "HeaderPassword": "Jelszó", "HeaderPaths": "Útvonalak", - "HeaderPeople": "Személyek", "HeaderPinCodeReset": "Pin kód visszaállítása", "HeaderPlayAll": "Összes vetítése", "HeaderPlayOn": "Vetítés itt", @@ -200,17 +158,14 @@ "HeaderSelectMetadataPath": "Válaszd ki a metaadat útvonalat", "HeaderSelectServer": "Szerver Kiválasztás", "HeaderSendMessage": "Üzenet küldése", - "HeaderSeries": "Sorozatok", "HeaderSettings": "Beállítások", "HeaderSetupLibrary": "Média könyvtárak beállítása", - "HeaderShutdown": "Leállítás", "HeaderSortBy": "Megjelenítés", "HeaderSortOrder": "Sorrend", "HeaderSpecialFeatures": "Speciális lehetőségek", "HeaderStatus": "Állapot", "HeaderSubtitleDownloads": "Felirat letöltések", "HeaderSystemDlnaProfiles": "Rendszer profilok", - "HeaderTags": "Címkék", "HeaderTracks": "Sávok", "HeaderUploadImage": "Kép feltöltés", "HeaderUser": "Felhasználó", @@ -218,7 +173,6 @@ "HeaderVideoType": "Videó típusa", "HeaderVideos": "Videók", "HeaderYears": "Év", - "HeadersFolders": "Könyvtárak", "Help": "Segítség", "HideWatchedContentFromLatestMedia": "A megtekintett tartalom elrejtése a legújabb médiából", "Home": "Kezdőlap", @@ -227,11 +181,7 @@ "InstallingPackage": "{0} ({1} verzió) telepítése", "Label3DFormat": "3D formátum:", "LabelAlbumArtists": "Album előadók:", - "LabelAll": "Összes", - "LabelAllowServerAutoRestart": "Automatikus újraindítás engedélyezése a szervernek a frissítések telepítéséhez", - "LabelAllowServerAutoRestartHelp": "A szerver csak akkor indul újra ha nincs felhasználói tevékenység.", "LabelArtists": "Előadók:", - "LabelAudio": "Audió", "LabelAudioLanguagePreference": "Audió nyelvének beállítása:", "LabelBirthYear": "Születési év:", "LabelCachePath": "Gyorsítótár útvonal:", @@ -241,14 +191,11 @@ "LabelCountry": "Ország:", "LabelCriticRating": "Kritikusok értékelése:", "LabelCurrentPassword": "Jelenlegi jelszó:", - "LabelCustomDeviceDisplayName": "Megjelenítendő név:", "LabelCustomDeviceDisplayNameHelp": "Adj meg egy egyedi nevet, vagy hagyd üresen a készülék által elküldött név használatához.", "LabelCustomRating": "Egyéni értékelés:", - "LabelDashboardTheme": "Szerver vezérlőpult kinézete:", "LabelDateAdded": "Hozzáadva:", "LabelDateTimeLocale": "Dátum és idő formátum:", "LabelDay": "Nap:", - "LabelDisplayMissingEpisodesWithinSeasons": "Hiányzó évad epizódok megjelenítése", "LabelDisplayName": "Megjelenítendő név:", "LabelDisplayOrder": "Megjelenítési sorrend:", "LabelDownloadLanguages": "Nyelvek letöltése:", @@ -278,13 +225,12 @@ "LabelMetadataPath": "Metaadat útvonal:", "LabelMetadataReaders": "Metaadat olvasók:", "LabelMetadataSavers": "Metaadat mentés:", - "LabelMetadataSaversHelp": "A metaadat letöltésének formátuma.", + "LabelMetadataSaversHelp": "A metaadatok mentési fájlformátuma.", "LabelName": "Név:", "LabelNewPassword": "Új jelszó:", "LabelNewPasswordConfirm": "Új jelszó megerősítése:", - "LabelNext": "Következő", "LabelNotificationEnabled": "Értesítés engedélyezése", - "LabelOptionalNetworkPath": "(Opcionális) Megosztott hálózati mappa:", + "LabelOptionalNetworkPath": "Megosztott hálózati mappa:", "LabelOriginalAspectRatio": "Eredeti képarány:", "LabelOriginalTitle": "Eredeti cím:", "LabelOverview": "Tartalom:", @@ -295,15 +241,13 @@ "LabelPlayDefaultAudioTrack": "Az alapértelmezett hangsáv lejátszása a nyelvtől függetlenül", "LabelPlaylist": "Lejátszási lista:", "LabelPreferredDisplayLanguage": "Elsődleges megjelenítendő nyelv:", - "LabelPreferredDisplayLanguageHelp": "A Jellyfin fordítása egy folyamatos projekt.", - "LabelPrevious": "Előző", "LabelProfileAudioCodecs": "Audió kódekek:", "LabelProfileCodecs": "Kódek:", "LabelProfileContainer": "Tároló:", "LabelProfileVideoCodecs": "Videó kódekek:", "LabelRefreshMode": "Frissítési mód:", "LabelReleaseDate": "Megjelenés dátuma:", - "LabelRuntimeMinutes": "Játékidő (perc):", + "LabelRuntimeMinutes": "Játékidő:", "LabelSeasonNumber": "Évad száma:", "LabelSelectFolderGroups": "Automatikusan csoportosítsa a következő mappák tartalmát olyan nézetekre, mint a Filmek, a Zene és a TV:", "LabelSelectFolderGroupsHelp": "A ki nem választott mappák önmagukban, saját nézetben jelennek meg.", @@ -319,15 +263,11 @@ "LabelStopping": "Megállítás", "LabelSubtitleFormatHelp": "Például: srt", "LabelSubtitlePlaybackMode": "Felirat mód:", - "LabelSubtitles": "Feliratok", "LabelTagline": "Címke:", "LabelTheme": "Kinézet:", "LabelTime": "Idő:", "LabelTimeLimitHours": "Időlimit (óra):", "LabelTitle": "Cím:", - "LabelTranscodingAudioCodec": "Audió kódek:", - "LabelTranscodingContainer": "Tároló:", - "LabelTranscodingVideoCodec": "Videó kódek:", "LabelTunerType": "Tuner típusa:", "LabelType": "Típus:", "LabelTypeMetadataDownloaders": "{0} metaadat letöltő:", @@ -337,7 +277,6 @@ "LabelVersionInstalled": "{0} telepítve", "LabelVideo": "Videó", "LabelYear": "Év:", - "LabelYourFirstName": "Keresztneved:", "LabelYoureDone": "Készen vagy!", "LatestFromLibrary": "Nemrég hozzáadott {0}", "Like": "Tettszik", @@ -358,13 +297,12 @@ "MediaInfoResolution": "Felbontás", "MediaInfoSampleRate": "Mintavételi ráta", "MessageAlreadyInstalled": "Ez a verzió már telepítve van.", - "MessageConfirmRestart": "Biztosan újra szeretnéd indítani a Jellyfin Szervert?", + "MessageConfirmRestart": "Biztosan újra szeretnéd indítani a Jellyfint?", "MessageConfirmShutdown": "Biztosan le akarod állítani a Szervert?", "MessageItemsAdded": "Elem hozzáadva.", "MessageNoPluginsInstalled": "Nincs bővítmény telepítve.", "MessageNothingHere": "Nincs itt semmi.", "MessagePleaseEnsureInternetMetadata": "Kérlek ellenőrizd hogy az Internetes metaadat letöltés engedélyezve van.", - "MessageSettingsSaved": "Beállítások mentve.", "Metadata": "Metaadat", "MetadataManager": "Metaadat Manager", "Monday": "Hétfő", @@ -410,7 +348,6 @@ "OptionEnableAccessToAllLibraries": "Hozzáférés engedélyezése minden könyvtárhoz", "OptionExternallyDownloaded": "Külső letöltés", "OptionFavorite": "Kedvencek", - "OptionFriday": "Péntek", "OptionHasSpecialFeatures": "Speciális lehetőségek", "OptionHasSubtitles": "Feliratok", "OptionHasThemeSong": "Főcímdal", @@ -421,7 +358,6 @@ "OptionImdbRating": "IMDb értékelés", "OptionLikes": "Kedveltek", "OptionMissingEpisode": "Hiányzó Epizódok", - "OptionMonday": "Hétfő", "OptionNameSort": "Név", "OptionNew": "Új…", "OptionParentalRating": "Korhatár besorolás", @@ -432,14 +368,9 @@ "OptionReleaseDate": "Megjelenés dátuma", "OptionResumable": "Folytatható", "OptionRuntime": "Játékidő", - "OptionSaturday": "Szombat", - "OptionSunday": "Vasárnap", - "OptionThursday": "Csütörtök", "OptionTrackName": "Sáv Címe", - "OptionTuesday": "Kedd", "OptionUnairedEpisode": "Nem vetített Epizódok", "OptionUnplayed": "Nemjátszott", - "OptionWednesday": "Szerda", "OptionWeekly": "Heti", "OriginalAirDateValue": "Eredeti vetítés dátuma: {0}", "PackageInstallCancelled": "{0} ({1} verzió) telepítése megszakítva.", @@ -451,7 +382,7 @@ "PlayAllFromHere": "Összes vetítése innen", "PlayCount": "Lejátszások száma", "Played": "Megnézett", - "PleaseRestartServerName": "Kérlek indítsd újra a Jellyfin Szerver-t - {0}.", + "PleaseRestartServerName": "Kérlek indítsd újra a Jellyfint itt: {0}.", "Quality": "Minőség", "RecommendationBecauseYouLike": "Mert tetszett a(z) {0}", "RecommendationBecauseYouWatched": "Amiért megnézted ezt: {0}", @@ -459,7 +390,7 @@ "RecommendationStarring": "Főszerepben: {0}", "Record": "Felvétel", "Refresh": "Frissítés", - "RefreshDialogHelp": "A metaadatok frissítése a Jellyfin Server vezérlőpultjában engedélyezett beállítások és internetszolgáltatások alapján történik.", + "RefreshDialogHelp": "A metaadatok frissítése a vezérlőpultban engedélyezett beállítások és internetszolgáltatások alapján történik.", "RefreshMetadata": "Metaadat frissítése", "ReleaseDate": "Megjelenés dátuma", "RememberMe": "Emlékezz rám", @@ -481,9 +412,9 @@ "SearchResults": "A keresés eredménye", "SendMessage": "Üzenet küldés", "SeriesYearToPresent": "{0} - Napjainkig", - "ServerNameIsRestarting": "Jellyfin Szerver - {0} újraindul.", - "ServerNameIsShuttingDown": "Jellyfin Server - {0} leáll.", - "ServerUpdateNeeded": "Ezt a Jellyfin Szervert frissíteni kell. A legújabb verzió letöltéséhez kérjük, látogass el ide {0}", + "ServerNameIsRestarting": "A szerver újraindul itt: {0}.", + "ServerNameIsShuttingDown": "A szerver leáll itt: {0}.", + "ServerUpdateNeeded": "A Jellyfint frissíteni kell. A legújabb verzió letöltéséhez kérjük, látogass el ide {0}", "Settings": "Beállítások", "SettingsSaved": "Beállítások mentve.", "Share": "Megosztás", @@ -499,53 +430,26 @@ "Sync": "Szinkronizál", "TabAccess": "Hozzáférés", "TabAdvanced": "Haladó", - "TabAlbumArtists": "Album Előadók", - "TabAlbums": "Albumok", - "TabArtists": "Előadók", "TabCatalog": "Katalógus", - "TabChannels": "Csatornák", "TabCodecs": "Kódek", - "TabCollections": "Gyűjtemények", "TabContainers": "Tároló", "TabDashboard": "Vezérlőpult", - "TabDevices": "Eszközök", - "TabDisplay": "Megjelenítés", - "TabEpisodes": "Epizódok", - "TabFavorites": "Kedvencek", - "TabGenres": "Műfajok", - "TabGuide": "Leírás", - "TabInfo": "Infó", "TabLatest": "Legújabb", "TabLogs": "Naplók", - "TabMetadata": "Metaadat", - "TabMovies": "Filmek", "TabMusic": "Zene", - "TabMusicVideos": "Zenei Videók", "TabMyPlugins": "Telepített bővítmények", "TabNetworks": "Csatornák", "TabNfoSettings": "NFO Beállítások", "TabNotifications": "Értesítések", "TabOther": "Egyéb", "TabParentalControl": "Szülői Felügyelet", - "TabPassword": "Jelszó", - "TabPlayback": "Lejátszás", - "TabPlaylist": "Lejátszási lista", - "TabPlaylists": "Lejátszási listák", "TabPlugins": "Bővítmények", "TabProfile": "Profil", "TabProfiles": "Profilok", - "TabRecordings": "Felvételek", "TabScheduledTasks": "Ütemezett feladatok", - "TabSeries": "Sorozatok", "TabServer": "Szerver", "TabSettings": "Beállítások", - "TabShows": "Műsorok", - "TabSongs": "Dalok", - "TabSuggestions": "Javaslatok", - "TabTrailers": "Előzetesek", - "TabTranscoding": "Átkódolás", "TabUpcoming": "Hamarosan érkezik", - "TabUsers": "Felhasználók", "Tags": "Címkék", "TellUsAboutYourself": "Mondj valamit magadról", "ThisWizardWillGuideYou": "Ez a varázsló végigvezet a telepítésen. A kezdéshez válasz nyelvet.", @@ -554,7 +458,7 @@ "TitlePlayback": "Lejátszás", "Tuesday": "Kedd", "UninstallPluginConfirmation": "Biztosan el szeretnéd távolítani a következőt: {0} ?", - "UninstallPluginHeader": "Bővítmény Eltávolítása", + "HeaderUninstallPlugin": "Bővítmény Eltávolítása", "Unmute": "Hangosít", "Up": "Fel", "ValueAudioCodec": "Audió Kódek: {0}", @@ -586,7 +490,7 @@ "AllComplexFormats": "Minden összetett formátum (ASS, SSA, VOBSUB, PGS, SUB, IDX, ...)", "AllowMediaConversion": "Média konvertálás engedélyezése", "AllowMediaConversionHelp": "Add meg vagy tiltsd le a média konvertálás funkcióhoz való hozzáférést.", - "AllowRemoteAccess": "Engedélyezze a távoli kapcsolatokat a Jellyfin szerverhez.", + "AllowRemoteAccess": "Távoli kapcsolatok engedélyezése ehhez a szerverhez.", "AllowRemoteAccessHelp": "Ha nincs bekapcsolva, minden távoli kapcsolat blokkolva lesz.", "AlwaysPlaySubtitles": "Mindig jelenjen meg", "AnyLanguage": "Bármelyik nyelv", @@ -604,8 +508,7 @@ "Artists": "Előadók", "Blacklist": "Feketelista", "BookLibraryHelp": "Lehetőség van audió és hangoskönyvek visszajátszására. Nézd meg a {0} könyvelnevezési útmutatót {1}.", - "BrowsePluginCatalogMessage": "Böngéssz a Bővítmény katalógusunkban a rendelkezésre álló bővítmények megtekintéséhez.", - "AddItemToCollectionHelp": "Adj elemeket a gyűjteményekhez, ehhez keresed meg őket, majd kattints jobb egérgombbal, vagy kattints a menüre és add hozzá a gyűjteményhez.", + "MessageBrowsePluginCatalog": "Böngéssz a Bővítmény katalógusunkban a rendelkezésre álló bővítmények megtekintéséhez.", "AllowedRemoteAddressesHelp": "Vesszővel válaszd el az IP-címek vagy IP / netmask címek listáját annak a hálózatnak amelyből távolról csatlakozhatnak. Ha üresen marad, az összes távoli cím megengedett.", "BoxRear": "Box (hátsó)", "ButtonArrowLeft": "Bal", @@ -614,14 +517,11 @@ "ButtonEditOtherUserPreferences": "A felhasználó profiljának, képének és személyes beállításainak szerkesztése.", "ButtonFullscreen": "Teljes képernyő", "ButtonInfo": "Info", - "ButtonLearnMore": "Tudj meg többet", "ButtonNetwork": "Hálózat", "ButtonOk": "Ok", "ButtonRevoke": "Visszavon", "ButtonSelectView": "Válassz nézetet", "ButtonStart": "Start", - "ButtonUp": "Fel", - "ButtonViewWebsite": "Webhely megtekintése", "CancelRecording": "Felvétel törlése", "CancelSeries": "Sorozat törlése", "Categories": "Kategóriák", @@ -633,7 +533,7 @@ "ColorSpace": "Színtér", "ColorTransfer": "Színátvitel", "Composer": "Zeneszerző", - "ConfigureDateAdded": "Állítsd be a hozzáadott dátum meghatározását a Jellyfin Szerver Vezérlőpultjában a Könyvtár beállításai alatt", + "ConfigureDateAdded": "Állítsd be a hozzáadott dátum meghatározását a Vezérlőpultban a Könyvtár beállításai alatt", "ConfirmDeleteImage": "Kép törlése?", "ConfirmDeleteItem": "Az elem törlése mind a fájlrendszerből, mind a médiakönyvtárból törlődik. Biztosan folytatni akarod?", "ConfirmDeleteItems": "Az elem törlése mind a fájlrendszerből, mind a médiakönyvtárból törlődik. Biztosan folytatni akarod?", @@ -645,7 +545,7 @@ "CustomDlnaProfilesHelp": "Hozz létre egyéni profilt az új eszközhöz, vagy módosítsd a rendszerprofilt.", "DeathDateValue": "Elhunyt: {0}", "Default": "Alapértelmezett", - "DefaultErrorMessage": "Hiba történt a kérés feldolgozása során. Kérlek próbáld újra később.", + "ErrorDefault": "Hiba történt a kérés feldolgozása során. Kérlek próbáld újra később.", "DefaultMetadataLangaugeDescription": "Ezek az alapértelmezettek, és könyvtáranként testre szabhatók.", "DeleteDeviceConfirmation": "Biztosan törölni szeretnéd ezt az eszközt? Legközelebb akkor jelenik meg, amikor a felhasználó bejelentkezik róla.", "DeleteImage": "Kép törlése", @@ -655,7 +555,7 @@ "DetectingDevices": "Eszközök észlelése", "DirectPlaying": "Közvetlen lejátszás", "DirectStreamHelp1": "Az adathordozó kompatibilis a készülékkel a felbontás és a médiatípus (H.264, AC3, stb.) tekintetében, de nem kompatibilis a fájltárolóban (.mkv, .avi, .wmv, stb.). A videófelvétel újra csomagolásra kerül, mielőtt azt a készülékre továbbítaná.", - "DirectStreamHelp2": "A fájl közvetlen közvetítése (Direct Streaming) nagyon kevés feldolgozási erőforrást használ, ennek ellenére a videó nem veszít a minőségéből.", + "DirectStreamHelp2": "A fájl közvetlen közvetítése (Direct Streaming) nagyon kevés feldolgozási erőforrást használ, és a videóban is minimális a minőségvesztés.", "DirectStreaming": "Közvetlen streaming", "Disabled": "Tiltva", "Disc": "Lemez", @@ -678,11 +578,11 @@ "EnablePhotos": "Fotók megjelenítése", "EnablePhotosHelp": "A fényképeket a médiafájlok mellett észleli és megjeleníti.", "Ended": "Befejeződött", - "ErrorAddingMediaPathToVirtualFolder": "Hiba történt a média elérésekor. Kérlek győződjön meg róla, hogy az elérési út érvényes és a Jellyfin szerver hozzáfér az adott helyhez.", + "ErrorAddingMediaPathToVirtualFolder": "Hiba történt a média elérésekor. Kérlek győződj meg róla, hogy az elérési út érvényes és a szerver hozzáfér a megadott helyhez.", "ErrorAddingTunerDevice": "Hiba történt a tuner eszköz hozzáadásakor. Kérlek győződj meg róla, hogy az eszköz elérhető és próbáld meg újra.", "ErrorAddingXmlTvFile": "Hiba történt az XMLTV fájl elérésekor. Győződj meg róla, hogy a fájl létezik és próbáld meg újra.", - "ErrorDeletingItem": "Hiba történt az elem törlése során a Jellyfin Szerverről. Ellenőrizd, hogy a Jellyfin Szerver rendelkezik-e írási jogosultsággal a média mappához és próbálja újra.", - "ErrorMessageStartHourGreaterThanEnd": "A befejezési időnek nagyobbnak kell lennie mint a kezdési idő.", + "ErrorDeletingItem": "Hiba történt az elem szerverről való törlése során. Ellenőrizd, hogy a szerver rendelkezik-e írási jogosultsággal a média mappához és próbálja újra.", + "ErrorStartHourGreaterThanEnd": "A befejezési időnek nagyobbnak kell lennie mint a kezdési idő.", "ErrorSavingTvProvider": "Hiba történt a TV szolgáltató mentésekor. Kérlek győződj meg róla, hogy elérhető és próbálkozz meg újra.", "EveryNDays": "Minden {0} nap", "ExtraLarge": "Extra NAGY", @@ -711,7 +611,6 @@ "HeaderApiKey": "API Kulcs", "HeaderApiKeys": "API Kulcsok", "HeaderAppearsOn": "Megjelenik", - "HeaderBooks": "Könyvek", "HeaderCancelRecording": "Felvétel törlése", "HeaderCancelSeries": "Sorozat törlése", "HeaderChannelAccess": "Csatorna hozzáférés", @@ -745,13 +644,10 @@ "HeaderIdentificationHeader": "Azonosító fejléc", "HeaderImageOptions": "Képbeállítások", "HeaderInstantMix": "Azonnali keverés", - "HeaderItems": "Elemek", "HeaderKeepRecording": "Felvétel készítése", - "HeaderKodiMetadataHelp": "Az Nfo metaadatok engedélyezéséhez vagy letiltásához szerkeszd a könyvtárat a Jellyfin Médiatár beállításaiban és keresd meg a metaadat letöltő részt.", + "HeaderKodiMetadataHelp": "Az NFO metaadatok engedélyezéséhez vagy letiltásához szerkeszd a könyvtárat és keresd meg a metaadat letöltő részt.", "HeaderLatestMusic": "Legújabb Zene", "HeaderLatestRecordings": "Legújabb Felvételek", - "HeaderLiveTV": "Élő TV", - "HeaderLiveTv": "Élő TV", "HeaderLoginFailure": "Bejelentkezési hiba", "HeaderMusicQuality": "Zene minősége", "HeaderNewApiKey": "Új API kulcs", @@ -763,7 +659,7 @@ "HeaderPhotoAlbums": "Fényképalbumok", "HeaderPlaybackError": "Lejátszási hiba", "HeaderProfileInformation": "Profil információ", - "HeaderProfileServerSettingsHelp": "Ezek az értékek szabályozzák, hogy a Jellyfin Szerver hogyan jelenik meg az eszközökön.", + "HeaderProfileServerSettingsHelp": "Ezek az értékek szabályozzák, hogy a Szerver hogyan jelenik meg a kliensek számára.", "HeaderRecordingOptions": "Felvétel beállítások", "HeaderRecordingPostProcessing": "Felvétel utáni feldolgozás", "HeaderRemoveMediaFolder": "Média mappa eltávolítása", @@ -777,7 +673,7 @@ "HeaderSelectServerCachePath": "Válaszd ki a szerver gyorsítótár útvonalát", "HeaderSelectServerCachePathHelp": "Tallózd ki vagy írd be a szerver gyorsítótár fájljainak elérési útját. A mappának írhatónak kell lennie.", "HeaderSelectTranscodingPath": "Válaszd ki az Átkódolás ideiglenes útvonalát", - "HeaderSelectTranscodingPathHelp": "Tallózd ki vagy add meg az átmeneti fájlok átkódolásához használt útvonalat. A mappának írhatónak kell lennie.", + "HeaderSelectTranscodingPathHelp": "Tallózd ki vagy add meg a fájlok átkódolásához használt útvonalat. A mappának írhatónak kell lennie.", "HeaderSeriesOptions": "Sorozatok beállításai", "LabelTag": "Címke:", "MediaInfoCodecTag": "Kódek címke", @@ -786,10 +682,8 @@ "Shows": "Sorozatok", "Songs": "Dalok", "ValueSpecialEpisodeName": "Special - {0}", - "EnableThemeVideos": "Videótémák", "EnableThemeVideosHelp": "Videó témájának lejátszása háttérben a könyvtár böngészése közben.", "HeaderBlockItemsWithNoRating": "Blokkolja azokat az elemeket amelyek tiltott, vagy nem felismerhető minősítésűek:", - "HeaderSchedule": "Ütemezés", "HeaderSeriesStatus": "Sorozat állapot", "HeaderSpecialEpisodeInfo": "Speciális epizód információ", "HeaderStartNow": "Indítás most", @@ -814,7 +708,7 @@ "Hide": "Elrejtés", "Horizontal": "Vízszintes", "HttpsRequiresCert": "A biztonságos kapcsolatok engedélyezéséhez megbízható SSL-tanúsítványt kell használni, mint például a Let's Encrypt. Kérlek add meg a tanúsítványt, vagy tiltsd le a biztonságos kapcsolatokat.", - "ImportMissingEpisodesHelp": "Ha engedélyezve van, a hiányzó epizódokra vonatkozó információk a Jellyfin adatbázisába kerülnek importálásra és megjelenítésre kerülnek az évadokban és sorozatokban. Ez jelentősen hosszabb könyvtárvizsgálatot okozhat.", + "ImportMissingEpisodesHelp": "A hiányzó epizódokra vonatkozó információk a Jellyfin adatbázisába kerülnek importálásra és megjelenítésre kerülnek az évadokban és sorozatokban. Ez jelentősen hosszabb könyvtárvizsgálatot okozhat.", "InstantMix": "Azonnali keverés", "ItemCount": "{0} elem", "Items": "Elemek", @@ -836,9 +730,9 @@ "LabelAppNameExample": "Például: Sickbeard, Sonarr", "LabelAutomaticallyRefreshInternetMetadataEvery": "A metaadatok automatikus frissítése az internetről:", "LabelBindToLocalNetworkAddress": "Kötés a helyi hálózati címhez:", - "LabelBindToLocalNetworkAddressHelp": "Opcionális. A helyi IP cím felülbírálása a http szerverhez való csatlakozáshoz. Ha üres marad, a szerver minden elérhető címhez kötődik. Az érték megváltoztatásához a Jellyfin Szerver újraindítása szükséges.", + "LabelBindToLocalNetworkAddressHelp": "A helyi IP cím felülbírálása a HTTP szerverhez való csatlakozáshoz. Ha üres marad, a szerver minden elérhető címhez kötődik. Az érték megváltoztatásához a szerver újraindítása szükséges.", "LabelBirthDate": "Születési dátum:", - "LabelBlastMessageInterval": "Élő üzenetintervallum (másodperc)", + "LabelBlastMessageInterval": "Élő üzenetintervallum", "LabelBlastMessageIntervalHelp": "Meghatározza másodpercben az üzenetek közötti időtartamot.", "LabelBlockContentWithTags": "Blokkolja a címkével ellátott elemeket:", "LabelCache": "Gyorsítótár:", @@ -860,15 +754,15 @@ "LabelDisplayLanguage": "Megjelenítési nyelv:", "LabelDisplayLanguageHelp": "A Jellyfin fordítása egy folyamatos projekt.", "LabelDisplayMode": "Megjelenítési mód:", - "LabelArtistsHelp": "Ha több van használd a következő elválasztót ;", + "LabelArtistsHelp": "Ha több előadót adsz meg, pontosvesszővel válaszd el őket.", "LabelEnableAutomaticPortMapHelp": "A szerver az UPnP segítségével a routeren megpróbálja automatikusan átirányítani a nyilvános portot a helyi portra. Előfordulhat, hogy egyes router modellek, vagy hálózati konfigurációk esetén ez nem működik. A módosítások újraindítás után lépnek életbe.", "LabelEnableBlastAliveMessagesHelp": "Engedélyezd ezt ha a szerver nem észleli megbízhatóan a hálózat más UPnP-eszközeit.", - "LabelEnableDlnaClientDiscoveryInterval": "Kliens felderítési intervallum (másodperc)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "A Jellyfin által végrehajtott SSDP keresések időtartamát határozza meg másodpercben.", + "LabelEnableDlnaClientDiscoveryInterval": "Kliens felderítési intervallum", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "A szerver által végrehajtott SSDP keresések időtartamát határozza meg másodpercben.", "LabelEnableDlnaDebugLogging": "DLNA hibakeresési naplózás engedélyezése", "LabelEnableDlnaDebugLoggingHelp": "Ez nagy naplófájlokat hoz létre és csak hibaelhárítás céljából használható.", "LabelEnableDlnaPlayTo": "DLNA Play To engedélyezése", - "LabelEnableDlnaPlayToHelp": "Felismerheti a hálózaton belüli eszközöket, és lehetővé teszi azok távvezérlését.", + "LabelEnableDlnaPlayToHelp": "Felismerheti a hálózaton belüli eszközöket, és lehetővé teszi azok vezérlését.", "LabelEnableDlnaServer": "DLNA szerver engedélyezése", "LabelEnableDlnaServerHelp": "Lehetővé teszi a hálózaton található UPnP eszközöknek, hogy böngésszenek és lejátszanak tartalmat.", "LabelEnableSingleImageInDidlLimit": "Korlátozás egyetlen beágyazott képre", @@ -881,8 +775,8 @@ "LabelFont": "Betűtípus:", "LabelFormat": "Formátum:", "LabelFriendlyName": "Könnyen megjegyezhető név:", - "LabelServerNameHelp": "Ez a név kerül a Szerver azonosítására és alapértelmezetten a számítógép neve kerül felhasználásra.", - "LabelGroupMoviesIntoCollectionsHelp": "A filmlisták megjelenítésekor a gyűjteményhez tartozó filmek egy csoportos elemként jelennek meg.", + "LabelServerNameHelp": "Ez a név kerül a Szerver azonosítására és alapértelmezetten a hoszt neve kerül felhasználásra.", + "LabelGroupMoviesIntoCollectionsHelp": "A filmlisták megjelenítésekor a gyűjteményben lévő filmek egy csoportos elemként jelennek meg.", "LabelH264Crf": "H264 enkóder CRF:", "LabelHomeNetworkQuality": "Otthoni hálózat minősége:", "LabelHttpsPort": "Helyi HTTPS port száma:", @@ -921,12 +815,12 @@ "LabelMovieCategories": "Film kategóriák:", "LabelMoviePrefix": "Film előtag:", "LabelMoviePrefixHelp": "Ha a filmcímekhez előtagot használsz, írd be ide, hogy a szerver megfelelően kezelje.", - "LabelMovieRecordingPath": "Filmfelvételi útvonal (opcionális):", + "LabelMovieRecordingPath": "Filmfelvételi útvonal:", "LabelMusicStreamingTranscodingBitrate": "Zene átkódolási bitráta:", "LabelNewName": "Új név:", "LabelNewsCategories": "Hírek kategóriái:", "LabelNumber": "Szám:", - "LabelOptionalNetworkPathHelp": "Ha ez a mappa meg van osztva a hálózaton, a hálózati megosztási útvonal megadása lehetővé teszi, hogy a Jellyfin alkalmazások más eszközökön közvetlenül hozzáférjenek a médiafájlokhoz. Például: {0{ vagy {1}.", + "LabelOptionalNetworkPathHelp": "Ha ez a mappa meg van osztva a hálózaton, a hálózati megosztási útvonal megadása lehetővé teszi, hogy a kliensek más eszközökön közvetlenül hozzáférjenek a médiafájlokhoz. Például: {0{ vagy {1}.", "LabelPasswordConfirm": "Jelszó (megerősítés):", "LabelPlaceOfBirth": "Születési hely:", "LabelPostProcessor": "A feldolgozás utáni alkalmazás:", @@ -940,7 +834,6 @@ "LabelPublicHttpPortHelp": "A nyilvános port száma, amelyet a helyi HTTP portra kell átirányítani.", "LabelPublicHttpsPort": "Nyilvános HTTPS port száma:", "LabelPublicHttpsPortHelp": "A nyilvános port száma, amelyet a helyi HTTPS portra kell átirányítani.", - "LabelReadHowYouCanContribute": "Ismerd meg, hogyan járulhatsz hozzá.", "LabelReasonForTranscoding": "Az átkódolás oka:", "LabelRemoteClientBitrateLimit": "Internetes streaming bitráta limit (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Ez egy opcionális adatfolyam sebesség korlát a hálózaton kívüli eszközök számára. Ez akkor hasznos, amikor az eszközök magasabb bitrátát kérnek, mint amennyit az internetkapcsolat képes kezelni. Ez megnövelheti a szerver CPU terhelését, hogy átkódolja a videókat egy alacsonyabb bitrátára.", @@ -949,7 +842,7 @@ "LabelScheduledTaskLastRan": "Utoljára futtatva: {0}, Időtartam: {1}.", "LabelScreensaver": "Képernyővédő:", "LabelSerialNumber": "Sorozatszám", - "LabelSeriesRecordingPath": "Sorozatfelvétel útvonala (opcionális):", + "LabelSeriesRecordingPath": "Sorozatfelvétel útvonala:", "LabelServerHost": "Kiszolgáló:", "LabelVersion": "Verzió:", "MessageAreYouSureDeleteSubtitles": "Biztosan törölni szeretnéd ezt a feliratfájlt?", @@ -962,11 +855,9 @@ "LabelMinResumePercentage": "Minimum folytatás százalékban:", "LabelMinScreenshotDownloadWidth": "Minimális képernyőkép letöltési szélesség:", "LabelPreferredSubtitleLanguage": "Alapértelmezett feliratnyelv:", - "LabelSkin": "Kinézet:", "LabelSkipBackLength": "Ugrás vissza hossza:", "LabelSkipForwardLength": "Ugrás előre hossza:", "LabelSkipIfGraphicalSubsPresent": "Kihagyás, ha a videó már tartalmaz beágyazott feliratokat", - "LabelSoundEffects": "Hanghatások:", "LabelSportsCategories": "Sport kategóriák:", "LabelStartWhenPossible": "Elindul, amint lehetséges:", "LabelStopWhenPossible": "Leáll, amint lehetséges:", @@ -988,12 +879,11 @@ "LabelValue": "Érték:", "LabelZipCode": "Irányítószám:", "LabelffmpegPath": "FFmpeg útvonal:", - "LabelffmpegPathHelp": "Az ffmpeg alkalmazásfájl elérési útja, vagy az őt tartalmazó mappa.", + "LabelffmpegPathHelp": "Az ffmpeg alkalmazásfájl elérési útja vagy az őt tartalmazó mappa.", "Large": "Nagy", "LearnHowYouCanContribute": "Ismerd meg, hogyan járulhatsz hozzá.", "LeaveBlankToNotSetAPassword": "Ha nem szeretnél jelszót beállítani, hagyd ezt a mezőt üresen.", "LibraryAccessHelp": "Válaszd ki azokat a könyvtárakat amelyeket megosztani kívánsz ezzel a felhasználóval. A rendszergazdák a Metaadat Manager segítségével szerkeszthetik az összes mappát.", - "LinksValue": "Linkek: {0}", "List": "Lista", "LiveTV": "Élő TV", "Logo": "Logo", @@ -1024,7 +914,6 @@ "MessageEnablingOptionLongerScans": "Ennek az opciónak a bekapcsolása jelentősen hosszabb könyvtárbeolvasást eredményezhet.", "MessageImageFileTypeAllowed": "Csak JPEG és PNG fájlok támogatottak.", "MessageImageTypeNotSelected": "Kérlek válaszd ki a kép típusát a legördülő menüből.", - "MessageInstallPluginFromApp": "Ezt a bővítményt azon alkalmazásból kell telepíteni, amelyben használni kívánod.", "MessageInvalidForgotPasswordPin": "Érvénytelen vagy lejárt PIN kódot írtál be. Kérlek próbáld újra.", "MessageInvalidUser": "Érvénytelen felhasználónév vagy jelszó. Kérlek próbáld újra.", "MessageItemSaved": "Elem mentve.", @@ -1042,7 +931,7 @@ "LabelSpecialSeasonsDisplayName": "Speciális évad megjelenítési neve:", "LanNetworksHelp": "Vesszővel elválasztott lista az IP címekről vagy IP / netmask bejegyzésekről a hálózatokban, amelyeket a helyi hálózaton figyelembe kell venni a sávszélesség korlátozások végrehajtása során. Ha be van állítva, az összes többi IP cím külső hálózaton lesz, és a külső sávszélesség korlátozások szabálya alá tartozik. Ha üres marad, csak a szerver alhálózata tekinthető a helyi hálózatnak.", "LiveBroadcasts": "Élő adások", - "MessageConfirmRevokeApiKey": "Biztosan visszavonod ezt az API kulcsot? Az alkalmazás csatlakozása a Jellyfin Szerverhez hirtelen megszűnik.", + "MessageConfirmRevokeApiKey": "Biztosan visszavonod ezt az API kulcsot? Az alkalmazás csatlakozása a szerverhez hirtelen megszűnik.", "MessageDirectoryPickerLinuxInstruction": "Az Arch Linux, CentOS, Debian, Fedora, openSUSE vagy Ubuntu Linux operációs rendszereken a Jellyfin szolgáltatás felhasználójának legalább olvasási hozzáférést kell biztosítania a tárolóhelyekhez.", "MessageForgotPasswordInNetworkRequired": "Kérlek próbáld meg újra a jelszó visszaállítási folyamatot az otthoni hálózatban.", "MessageNoMovieSuggestionsAvailable": "Jelenleg nincsenek filmajánlatok. Kezdj el nézni és értékelni a filmeket, majd térj vissza, hogy megtekinthesd az ajánlásokat.", @@ -1050,7 +939,7 @@ "MessagePlayAccessRestricted": "A tartalom lejátszása jelenleg korlátozott. További információért fordulj a Szerver üzemeltetőjéhez.", "MessagePleaseWait": "Kérlek várj. Ez eltarthat egy percet.", "MessagePluginConfigurationRequiresLocalAccess": "A bővítmény beállításához jelentkezz be közvetlenül a helyi szerverre.", - "MessagePluginInstallDisclaimer": "A Jellyfin közösség tagjai által készített bővítmények nagyszerű módot adnak a Jellyfin élményének, funkcióinak bővítéséhez. Telepítés előtt kérlek vedd figyelembe a Jellyfin szerverre gyakorolt hatásokat, mint például a hosszabb könyvtárvizsgálatokat, a további háttérfeldolgozást, vagy akár a rendszer stabilitásának csökkenését.", + "MessagePluginInstallDisclaimer": "A közösség tagjai által készített bővítmények nagyszerű módot adnak a felhasználói élmény bővítéséhez. Telepítés előtt kérlek vedd figyelembe a szerverre gyakorolt hatásokat, mint például a hosszabb könyvtárvizsgálatokat, a további háttérfeldolgozást, vagy akár a rendszer stabilitásának csökkenését.", "MessageReenableUser": "Az újra engedélyezéshez lásd lentebb", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "A következő médiahelyek eltávolításra kerülnek a könyvtáradból:", "MessageUnableToConnectToServer": "Jelenleg nem tudunk csatlakozni a kiválasztott szerverhez. Győződj meg róla, hogy fut és próbáld meg újra.", @@ -1069,9 +958,8 @@ "NextUp": "Következik", "No": "Nem", "NoNewDevicesFound": "Nem található új eszköz. Új tuner hozzáadásához zárd be ezt a párbeszédablakot és add meg kézzel az eszköz adatait.", - "NoNextUpItemsMessage": "Nem található. Kezdj el nézni műsorokat!", - "NoPluginConfigurationMessage": "Ez a bővítmény nem rendelkezik konfigurációs beállításokkal.", - "NoSubtitles": "Nincs", + "MessageNoNextUpItems": "Nem található. Kezdj el nézni műsorokat!", + "MessageNoPluginConfiguration": "Ez a bővítmény nem rendelkezik konfigurációs beállításokkal.", "NoSubtitlesHelp": "A feliratok alapértelmezés szerint nem lesznek betöltve. Lejátszás közben kézzel is bekapcsolhatók.", "Off": "Ki", "OneChannel": "Egy csatorna", @@ -1083,16 +971,15 @@ "OptionAllowContentDownloading": "Média letöltésének és szinkronizálásának engedélyezése", "OptionAllowLinkSharingHelp": "Csak a médiaadatokat tartalmazó weboldalak oszthatók meg. A médiafájlok soha nem oszthatók meg nyilvánosan. A megosztás időlimithez van kötve, és lejár {0} nap elteltével.", "OptionAllowManageLiveTv": "Élő TV felvételkezelés engedélyezése", - "OptionAllowMediaPlaybackTranscodingHelp": "Az átkódoláshoz való hozzáférés korlátozása lejátszási hibákat okozhat a Jellyfin alkalmazásokban a nem támogatott médiaformátumok miatt.", + "OptionAllowMediaPlaybackTranscodingHelp": "Az átkódoláshoz való hozzáférés korlátozása lejátszási hibákat okozhat a kliens alkalmazásokban a nem támogatott médiaformátumok miatt.", "OptionAllowRemoteSharedDevicesHelp": "A DLNA eszközöket mindaddig megosztottnak tekintjük, amíg a felhasználó meg nem kezdi azok irányítását.", "OptionAllowSyncTranscoding": "Engedélyezze a média letöltését és szinkronizálását, amely átkódolást igényel", "OptionAllowVideoPlaybackRemuxing": "Olyan videólejátszás engedélyezése, amely átalakítást igényel újrakódolás nélkül", "OptionAllowVideoPlaybackTranscoding": "Engedélyezze az átkódolást igénylő videó lejátszást", "OptionArtist": "Előadó", "OptionAuto": "Auto", - "OptionAutomatic": "Auto", "OptionAutomaticallyGroupSeries": "A több mappában elosztott sorozat automatikus összevonása", - "OptionAutomaticallyGroupSeriesHelp": "Ha engedélyezve van, a több mappában elosztott sorozat automatikusan egyesül egy sorozatba.", + "OptionAutomaticallyGroupSeriesHelp": "A több mappában elosztott sorozat automatikusan egyesül egy sorozatba.", "OptionBlockBooks": "Könyvek", "OptionBlockLiveTvChannels": "Élő TV csatornák", "OptionBlockMusic": "Zene", @@ -1101,11 +988,11 @@ "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", "OptionContinuing": "Folytatva", "OptionDateAddedImportTime": "Használja a könyvtárba beolvasási dátumot", - "OptionDisableUserHelp": "Ha letiltod, a szerver nem engedélyezi a felhasználó csatlakozását. A meglévő kapcsolatok azonnal megszűnnek.", + "OptionDisableUserHelp": "A szerver nem engedélyezi a felhasználó csatlakozását. A meglévő kapcsolatok azonnal megszűnnek.", "OptionDisplayFolderView": "Az egyszerű média mappák mappanézetének megjelenítése", "OptionDisplayFolderViewHelp": "Jelenítse meg a mappákat a többi médiakönyvtár mellett. Ez hasznos lehet, ha egyszerű mappa nézeteket szeretnél látni.", "OptionDownloadImagesInAdvance": "Képek előzetes letöltése", - "OptionDownloadImagesInAdvanceHelp": "Alapértelmezés szerint a legtöbb kép csak akkor töltődik le, ha azt egy Jellyfin alkalmazás kéri. Engedélyezd ezt az opciót az összes kép előzetes letöltéséhez, mikor új médiát importál. Ez jelentősen hosszabb könyvtár vizsgálatot eredményezhet.", + "OptionDownloadImagesInAdvanceHelp": "Alapértelmezés szerint a legtöbb kép csak akkor töltődik le, ha azt egy kliens kéri. Engedélyezd ezt az opciót az összes kép előzetes letöltéséhez, mikor új médiát importál. Ez jelentősen hosszabb könyvtár vizsgálatot eredményezhet.", "OptionDownloadPrimaryImage": "Elsődleges", "OptionDvd": "DVD", "OptionEmbedSubtitles": "Beágyazva tárolóba", @@ -1126,12 +1013,11 @@ "OptionEveryday": "Minden nap", "OptionHideUserFromLoginHelp": "Hasznos a privát vagy a rejtett rendszergazdák számára. A felhasználónak kézzel kell bejelentkeznie a felhasználónevének és jelszavának megadásával.", "OptionIgnoreTranscodeByteRangeRequests": "Figyelmen kívül hagyja a transzkód bájt tartomány kéréseket", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Ha engedélyezve van, ezeket a kéréseket tiszteletben tartja, viszont figyelmen kívül hagyja a bájt tartomány fejlécét.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Ezeket a kéréseket tiszteletben tartja, viszont figyelmen kívül hagyja a bájt tartomány fejlécét.", "OptionIsHD": "HD", "OptionIsSD": "SD", "OptionMax": "Max", "OptionNone": "Egyik sem", - "OptionOnAppStartup": "Alkalmazás indításakor", "OptionOnInterval": "Időközönként", "OptionPlainStorageFolders": "Az összes mappa megjelenítése egyszerű tároló mappaként", "OptionPlainVideoItems": "Az összes videó megjelenítése egyszerű videófelvételként", @@ -1145,7 +1031,7 @@ "OptionRequirePerfectSubtitleMatch": "Csak olyan feliratokat töltsön le, amelyek tökéletesen megfelelnek a videó fájljaimnak", "OptionRequirePerfectSubtitleMatchHelp": "A tökéletes egyezés megköveteli a feliratok szűrését, hogy csak azokat tartalmazzák amelyeket teszteltek és hitelesítettek a pontos videofájljával. Az opció kikapcsolása növeli a felirat találat valószínűségét, de növeli a hibás vagy helytelen felirat szövegének esélyeit is.", "OptionSaveMetadataAsHidden": "Mentse a metaadatokat és a képeket rejtett fájlként", - "OptionSaveMetadataAsHiddenHelp": "Ennek megváltoztatása az új metaadatokra vonatkozik, amelyeket ment. A már meglévő metaadatfájlok frissítése a Jellyfin Server következő mentésekor történik.", + "OptionSaveMetadataAsHiddenHelp": "Ennek a beállításnak a módosítása az ezután történő metaadatok mentését érinti. A meglévő metaadatok a szerver általi következő mentéskor lesznek frissítve.", "OptionTvdbRating": "TVDB értékelés", "OptionWakeFromSleep": "Ébredjen alvásból", "OptionWeekdays": "Hétköznapok", @@ -1154,7 +1040,7 @@ "PasswordMatchError": "A jelszónak és a jelszó megerősítésének meg kell egyeznie.", "PasswordResetComplete": "A jelszó visszaállítva.", "PasswordResetConfirmation": "Biztosan vissza szeretnéd állítani a jelszót?", - "PasswordResetHeader": "Jelszó visszaállítása", + "HeaderResetPassword": "Jelszó visszaállítása", "PasswordSaved": "Jelszó mentve.", "PerfectMatch": "Tökéletes párosítás", "PictureInPicture": "Kép a képen", @@ -1167,7 +1053,7 @@ "PleaseConfirmPluginInstallation": "Kérlek kattints az OK gombra, hogy megerősítsd, hogy elolvastad a fentieket és folytatni kívánod a bővítmény telepítését.", "PleaseEnterNameOrId": "Kérlek adj meg egy nevet vagy egy külső ID-t.", "PleaseSelectTwoItems": "Kérlek válassz legalább két elemet.", - "PluginInstalledMessage": "A bővítmény sikeresen telepítve lett. A módosítások életbelépéséhez újra kell indítani a Jellyfin Szerver programot.", + "MessagePluginInstalled": "A bővítmény sikeresen telepítve lett. A módosítások életbelépéséhez újra kell indítani a Jellyfint.", "PreferEmbeddedTitlesOverFileNames": "A fájlnevek helyett előnyben részesíti a beépített címeket", "PreferEmbeddedTitlesOverFileNamesHelp": "Ez határozza meg az alapértelmezett megjelenítési címet, ha nem áll rendelkezésre internetes metaadat vagy helyi metaadat.", "Premiere": "Premier", @@ -1182,7 +1068,7 @@ "RecentlyWatched": "Nemrég nézett", "RecordSeries": "Sorozatok rögzítése", "RecordingCancelled": "Felvétel törölve.", - "RecordingPathChangeMessage": "A felvételi mappa módosítása nem fogja áthelyezni a meglévő felvételeket a régi helyről az újra. Szükség esetén manuálisan kell mozgatni őket.", + "MessageChangeRecordingPath": "A felvételi mappa módosítása nem fogja áthelyezni a meglévő felvételeket a régi helyről az újra. Szükség esetén manuálisan kell mozgatni őket.", "RecordingScheduled": "A rögzítés ütemezett.", "Recordings": "Felvételek", "RefreshQueued": "Frissítés sorba állítva.", @@ -1190,7 +1076,6 @@ "RemoveFromPlaylist": "Lejátszási listáról eltávolítani", "RepeatEpisodes": "Epizódok ismétlése", "ResumeAt": "Folytatás: {0}", - "RunAtStartup": "Futtassa indításkor", "SaveSubtitlesIntoMediaFolders": "Mentse a feliratokat a média mappákba", "SaveSubtitlesIntoMediaFoldersHelp": "A feliratok tárolása a videofájlok mellett lehetővé teszi, hogy könnyebben kezelhetők legyenek.", "Schedule": "Ütemezés", @@ -1201,7 +1086,7 @@ "SeriesCancelled": "Sorozat törölve.", "SeriesRecordingScheduled": "A sorozatfelvétel ütemezett.", "SeriesSettings": "Sorozat beállítások", - "ServerRestartNeededAfterPluginInstall": "A bővítmény telepítése után újra kell indítani a Jellyfin Szerver-t.", + "ServerRestartNeededAfterPluginInstall": "A bővítmény telepítése után újra kell indítani a Jellyfint.", "SettingsWarning": "Ezen értékek módosítása instabilitást vagy csatlakozási hibákat okozhat. Ha bármilyen probléma merül fel javasoljuk, hogy állítsd vissza őket az alapértelmezettre.", "ShowIndicatorsFor": "Indikátor megjelenítése a következőhöz:", "ShowYear": "Év megjelenítése", @@ -1221,9 +1106,7 @@ "SystemDlnaProfilesHelp": "A rendszerprofilok csak olvashatóak. A rendszerprofil módosításai egy új egyéni profilba kerülnek.", "TV": "TV", "TabDirectPlay": "Közvetlen lejátszás", - "TabLiveTV": "Élő TV", "TabResponses": "Válaszok", - "TabResumeSettings": "Folytatás", "TabStreaming": "Streaming", "TagsValue": "Címkék: {0}", "ThemeSongs": "Téma dalok", @@ -1252,7 +1135,6 @@ "ValueTimeLimitMultiHour": "időlimit: {0} óra", "ValueTimeLimitSingleHour": "Időlimit: 1 óra", "Vertical": "Függőleges", - "VideoRange": "Videó tartomány", "ViewAlbum": "Album megtekintése", "Whitelist": "Fehérlista", "WizardCompleted": "Ez most minden amire szükség volt. A Jellyfin megkezdte a médiakönyvtáraddal kapcsolatos információk gyűjtését. Nézz meg néhány alkalmazásunkat, majd kattints a Befejezés gombra a Vezérlőpult megtekintéséhez.", @@ -1266,11 +1148,10 @@ "LabelMaxResumePercentageHelp": "A címeket teljesen lejátszottnak tekintjük, ha ezen idő után fejezed be.", "LabelMaxStreamingBitrateHelp": "Adj meg egy maximum bitrátát a streameléshez.", "LabelMinResumePercentageHelp": "A címeket nem lejátszottnak tekintjük, ha ez alatt az idő alatt fejezed be.", - "LabelMusicStreamingTranscodingBitrateHelp": "Határozz meg egy streamelési max bitrátát a zenékhez.", + "LabelMusicStreamingTranscodingBitrateHelp": "Határozz meg egy streamelési maximális bitrátát a zenékhez.", "DashboardVersionNumber": "Verzió: {0}", "DashboardServerName": "Szerver: {0}", "LabelWeb": "Web:", - "MediaInfoSoftware": "Szoftver", "MediaInfoStreamTypeAudio": "Audió", "MediaInfoStreamTypeSubtitle": "Felirat", "MediaInfoStreamTypeVideo": "Videó", @@ -1278,7 +1159,6 @@ "LabelUserLoginAttemptsBeforeLockout": "Sikertelen bejelentkezési kísérletek a felhasználó zárolása előtt:", "DashboardOperatingSystem": "Operációs rendszer: {0}", "DashboardArchitecture": "Platform: {0}", - "LaunchWebAppOnStartup": "Indítsa el a webes felületet a szerver indításakor", "MessageNoCollectionsAvailable": "A gyűjtemények lehetővé teszik Filmek, Sorozatok és Albumok egyéni csoportosítását. A gyűjtemények létrehozásához kattints a + gombra.", "MessageNoServersAvailable": "Az automatikus kiszolgálókeresés nem talált szervert.", "OptionLoginAttemptsBeforeLockout": "Meghatározza, hogy hány érvénytelen bejelentkezési kísérlet történhet zárolás előtt.", @@ -1298,8 +1178,7 @@ "EnableStreamLoopingHelp": "Kapcsold be, ha az élő stream csak néhány másodpercnyi adatot tartalmaz és folyamatosan újra kell kérni. Ennek szükségtelen bekapcsolása problémát okozhat.", "Guide": "Műsorújság", "H264CrfHelp": "A Constant Rate Factor (CRF) az alapértelmezett minőségi beállítás az x264 enkóderhez. Az értékek 0 és 51 között állíthatók, ahol az alacsonyabb érték jobb minőséget eredményez (nagyobb fájl méret mellett). Az ajánlott érték 18 és 28 között van. Az x264 alapértelmezett beállítása 23, ez lehet kiindulási alap.", - "HeaderAddScheduledTaskTrigger": "Vezérlő Hozzáadása", - "HeaderApiKeysHelp": "A külső alkalmazásoknak egy API kulcsra van szükésge, hogy kommunikáljanak a Jellyfin szerverrel. A kulcsokat egy Jellyfin fiókkal történő belépéssel lehet megkapni, vagy kézileg felvenni egy alkalmazáshoz tartozó kulcsot.", + "HeaderApiKeysHelp": "A külső alkalmazásoknak egy API kulcsra van szükésge, hogy kommunikáljanak a Szerverrel. A kulcsokat egy normális fiókkal történő belépéssel lehet megkapni, vagy kézileg felvenni egy alkalmazáshoz tartozó kulcsot.", "HeaderBranding": "Személyes arculat", "HeaderContinueListening": "Folyamatban lévő zenék", "HeaderDeleteTaskTrigger": "Feladatvezérlő törlése", @@ -1310,9 +1189,8 @@ "HeaderFavoriteSongs": "Kedvenc dalok", "HeaderFavoriteVideos": "Kedvenc Videók", "HeaderGuideProviders": "TV műsorújság Szolgáltatók", - "HeaderHome": "Kezdőlap", "HeaderUpcomingOnTV": "Következő TV műsorok", - "ImportFavoriteChannelsHelp": "Ha engedélyezve van, csak a tuner eszközön kedvencként megjelölt csatornák kerülnek importálásra.", + "ImportFavoriteChannelsHelp": "Csak a tuner eszközön kedvencként megjelölt csatornák kerülnek importálásra.", "LabelAlbumArtHelp": "A használandó PN érték az albumborítók esetében, mely a upnp:albumArtURI dlna:profileID tulajdonságában szerepel. Néhány eszköz meghatározott értéket vár el, függetlenül a kép méretétől.", "LabelAlbumArtMaxHeight": "Albumborító maximális magasság:", "LabelAlbumArtMaxHeightHelp": "Albumborító maximális magasság mely upnp:albumArtURI kiajánlásra kerül.", @@ -1329,7 +1207,7 @@ "LabelEmbedAlbumArtDidl": "Albumborító beágyazása a Didl-be", "LabelEmbedAlbumArtDidlHelp": "Néhány eszköz ezt a megoldást részesíti előnyben az albumborítók esetében. Mások esetlegesen lejátszási hibát jeleznek, ha ez az opció engedélyezve van.", "LabelEnableBlastAliveMessages": "Blast alive üzenetek", - "LabelHttpsPortHelp": "A TCP port száma, melyen a Jellyfin HTTPS szervere figyel.", + "LabelHttpsPortHelp": "A TCP port száma, melyen a HTTPS szerver figyel.", "LabelIconMaxHeight": "Ikon maximális magasság:", "LabelIconMaxHeightHelp": "Ikon maximális magasság, mely az upnp:icon keresztül kiajánlásra kerül.", "LabelIconMaxWidth": "Ikon maximális szélesség:", @@ -1338,7 +1216,7 @@ "LabelKeepUpTo": "Őrizd meg:", "LabelKodiMetadataUser": "Mentsd el a következő felhasználó megtekintési adatát az NFO-ba:", "LabelKodiMetadataUserHelp": "A kiválasztott felhasználó megtekintési adata elmentésre kerül az NFO fájlokba, melyet azután más alkalmazások használhatnak.", - "LabelLocalHttpServerPortNumberHelp": "A TCP port száma, melyen a Jellyfin HTTP szerver figyel.", + "LabelLocalHttpServerPortNumberHelp": "A TCP port száma, melyen a HTTP szerver figyel.", "UserAgentHelp": "Adj meg egy egyedi HTTP user-agent fejlécet.", "XmlDocumentAttributeListHelp": "Ezek a tulajdonságok minden XML válaszüzenet gyökér elemére alkalmazásra kerülnek.", "Thumb": "Miniatűr", @@ -1374,7 +1252,6 @@ "HeaderFavoritePeople": "Kedvenc emberek", "HeaderApp": "Alkalmazás", "GroupVersions": "Verziók csoportosítása", - "CopyStreamURLError": "Hiba történt az URL másolása közben.", "OptionSubstring": "Szövegrészlet", "ButtonSplit": "Szétvág", "Absolute": "Abszolút", @@ -1382,7 +1259,6 @@ "SubtitleOffset": "Felirat eltolása", "SeriesDisplayOrderHelp": "Rakd sorba az epizódokat az adásba kerülésük dátuma, a DVD sorszám, vagy az abszolút számozás szerint.", "SelectAdminUsername": "Kérjük válassz felhasználónevet az adminisztrátor fiók számára.", - "QueueAllFromHere": "Az összes sorba állítása innen", "OptionThumbCard": "Miniatűr kártya", "OptionThumb": "Miniatűr", "OptionSpecialEpisode": "Különkiadások", @@ -1408,7 +1284,6 @@ "MetadataSettingChangeHelp": "A metaadat beállítások módosítása az ezután újonnan hozzáadott médiát fogja befolyásolni. A már meglévő tartalom frissítéséhez nyisd meg a részletek képernyőt, és kattints a frissítésre, vagy végezz tömeges frissítést a Metaadat Managerben.", "MessageConfirmDeleteGuideProvider": "Biztosan törölni szeretnéd ezt a műsorújság szolgáltatót?", "MessageConfirmAppExit": "Ki szeretnél lépni?", - "LaunchWebAppOnStartupHelp": "A web kliens indítása az alapértelmezett böngészőben a szerver indítása után. A kliens nem fog elindulni a szerver újraindítása után.", "LabelVideoResolution": "Videó felbontás:", "LabelVideoCodec": "Videó kodek:", "LabelVideoBitrate": "Videó bitráta:", @@ -1426,16 +1301,16 @@ "LabelXDlnaDoc": "X-DLNA doc:", "LabelXDlnaCap": "X-DLNA cap:", "MapChannels": "Csatornák feltérképezése", - "PasswordResetProviderHelp": "Válassz egy jelszó-visszaállítási szolgáltatót, amelyet akkor kell használni, amikor a felhasználó jelszó-visszaállítást kér", + "PasswordResetProviderHelp": "Válassz egy jelszó-visszaállítási szolgáltatót, amelyet akkor kell használni, amikor a felhasználó jelszó-visszaállítást kér.", "OptionResElement": "res elem", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Erre olyan készülékek esetében van szükség, amelyek időigénye nem nagyon jó.", - "OptionPlainVideoItemsHelp": "Ha engedélyezve van, akkor az összes videót a DIDL-ben \"object.item.videoItem\" -ként ábrázolja, nem pedig egy specifikusabb típusként, például \"object.item.videoItem.movie\" .", - "OptionPlainStorageFoldersHelp": "Ha engedélyezve van, akkor az összes mappa a DIDL-ben \"object.container.storageFolder\" lesz, nem pedig egy specifikusabb típusként, például \"object.container.person.musicArtist\".", + "OptionPlainVideoItemsHelp": "Az összes videót a DIDL-ben \"object.item.videoItem\" -ként ábrázolja, nem pedig egy specifikusabb típusként, például \"object.item.videoItem.movie\" .", + "OptionPlainStorageFoldersHelp": "Az összes mappa a DIDL-ben \"object.container.storageFolder\" lesz, nem pedig egy specifikusabb típusként, például \"object.container.person.musicArtist\".", "OptionHlsSegmentedSubtitles": "HLS szegmentált feliratok", "OptionEquals": "Egyenlő", "OptionForceRemoteSourceTranscoding": "A távoli médiaforrások (például az élő TV) átkódolásának kényszerítése", "NoCreatedLibraries": "Úgy tűnik még nem hoztál létre egy könyvtárat sem. {0}Szeretnél létrehozni egyet most?{1}", - "MessageDirectoryPickerBSDInstruction": "A BSD esetében valószínűleg konfigurálni kell a FreeNAS Jailben lévő tárolót, hogy a Jellyfin hozzáférhest kapjon.", + "MessageDirectoryPickerBSDInstruction": "A BSD esetében valószínűleg konfigurálni kell a FreeNAS Jailben lévő tárolót, hogy a Jellyfin hozzáférhessen a médiádhoz.", "LabelXDlnaDocHelp": "Meghatározza az X_DLNADOC elem tartalmát az urn: schemas-dlna-org: device-1-0 névtérben.", "LabelXDlnaCapHelp": "Meghatározza az X_DLNACAP elem tartalmát az urn: schemas-dlna-org: eszköz-1-0 névtérben.", "LabelVaapiDeviceHelp": "Ez a render csomópont, amelyet a hardveres gyorsításhoz használunk.", @@ -1468,12 +1343,11 @@ "LastSeen": "Utoljára elérhető {0}", "PersonRole": "mint {0}", "ListPaging": "{0}-{1} / {2}", - "WriteAccessRequired": "A Jellyfin Szerver írási jogosultságot igényel ehhez a könyvtárhoz. Kérjük, ellenőrizd, hogy van-e jogod írni ide, majd próbáld újra.", + "WriteAccessRequired": "A Jellyfin írási jogosultságot igényel ehhez a könyvtárhoz. Kérjük, ellenőrizd, hogy van-e jogod írni ide, majd próbáld újra.", "PathNotFound": "Az elérési út nem található. Kérjük, ellenőrizd, hogy az elérési út megfelelő-e, majd próbáld újra.", "Track": "Szám", "Season": "Évad", "Person": "Személy", - "OtherArtist": "Más előadók", "Movie": "Film", "Episode": "Epizód", "ClientSettings": "Kliens beállítások", @@ -1488,25 +1362,20 @@ "UnsupportedPlayback": "Jellyfin nem tud DRM-titkosított tartalmak dekriptálására, ettől függetlenül a lejátszással mindig megpróbálkozik. Néhány fájl emiatt teljesen fekete képernyőt ad, amely vagy a titkosítás miatt van, vagy nem olyan nem támogatott tartalmak miatt, mint az interaktív címek.", "YadifBob": "YADIF Bob", "Yadif": "YADIF", - "ReleaseGroup": "Kiadócsoport", - "MessageUnauthorizedUser": "Jelenleg nincs jogosultságod a szerverhez való hozzáféréshez. Kérjük, lépj kapcsolatba az adminisztrátorral további információkért!", "ButtonTogglePlaylist": "Lejátszási listák", - "ButtonToggleContextMenu": "Továbbiak", "Filter": "Szűrés", "New": "Új", "HeaderFavoritePlaylists": "Kedvenc lejátszási listák", "ApiKeysCaption": "A jelenleg engedélyezett API kulcsok listája", - "LabelNightly": "Éjszakai", "LabelStable": "Stabil", "LabelChromecastVersion": "Chromecast verzió", - "LabelEnableHttpsHelp": "Engedélyezi a kiszolgálónak a kommunikációt HTTPS protokollon keresztül. Érvényes tanúsítványt is be kell állítani az érvénybe léptetéshez.", + "LabelEnableHttpsHelp": "Figyelés a megadott HTTPS porton. Érvényes tanúsítványt is be kell állítani az érvénybe léptetéshez.", "LabelRequireHttpsHelp": "Bekapcsolást követően minden egyes HTTP-kérést átirányít HTTPS protokollra. A már meglévő HTTPS kéréseket nem módosítja.", "LabelRequireHttps": "HTTPS megkövetelése", "LabelEnableHttps": "HTTPS engedélyezése", "HeaderServerAddressSettings": "Kiszolgáló Címének Beállításai", "HeaderRemoteAccessSettings": "Távoli Hozzáférés Beállításai", "HeaderHttpsSettings": "HTTPS Beállítások", - "TabDVR": "DVR", "HeaderDVR": "DVR", "SaveChanges": "Változtatások mentése", "MessageSyncPlayGroupWait": "{0} pufferel…", @@ -1541,8 +1410,8 @@ "LabelSyncPlayTimeOffset": "Időeltolás a szerverhez képest:", "EnableDetailsBannerHelp": "Megjelenít egy banner képet a részletes információoldal tetején.", "EnableDetailsBanner": "Banner a részletes oldalon", - "EnableBlurhashHelp": "A még betöltés alatt álló képek helyén egy elmosódott helyettesítő képet jelenít meg", - "EnableBlurhash": "Elmosódott helyettesítőképek engedélyezése", + "EnableBlurHashHelp": "A még betöltés alatt álló képek helyén egy elmosódott helyettesítő képet jelenít meg.", + "EnableBlurHash": "Elmosódott helyettesítőképek engedélyezése", "ShowMore": "Továbbiak megtekintése", "ShowLess": "Kevesebb mutatása", "ButtonCast": "Vetítés", @@ -1564,5 +1433,14 @@ "ClearQueue": "Sor ürítése", "StopPlayback": "Lejátszás leállítása", "ViewAlbumArtist": "Album előadójának megtekintése", - "ButtonPlayer": "Lejátszó" + "ButtonPlayer": "Lejátszó", + "PreviousTrack": "Ugrás az előzőhöz", + "NextTrack": "Ugrás a következőre", + "LabelUnstable": "Instabil", + "SubtitleVerticalPositionHelp": "Annak a sornak a száma, ahol a szöveg megjelenik. Pozitív számok fentről lefele számolnak, negatív számok pedig lentről felfelé.", + "Preview": "Előnézet", + "LabelSubtitleVerticalPosition": "Függőleges pozíció:", + "MessageGetInstalledPluginsError": "Hiba történt a jelenleg telepített bővítmények lekérdezése során.", + "MessagePluginInstallError": "Hiba történt a bővítmény telepítése során.", + "PlaybackRate": "Lejátszási sebesség" } diff --git a/src/strings/id.json b/src/strings/id.json index 9d347b7dcc..a4e0031094 100644 --- a/src/strings/id.json +++ b/src/strings/id.json @@ -2,20 +2,15 @@ "ButtonQuickStartGuide": "Panduan cepat", "ButtonSignOut": "Sign out", "FolderTypeTvShows": "TV", - "HeaderAddUser": "Tambah User", "HeaderEasyPinCode": "Kode Pin Mudah", - "HeaderSeries": "Series", "HeaderSetupLibrary": "Atur pustaka media Anda", "LabelContentType": "Tipe konten:", "LabelCountry": "Negara:", "LabelFinish": "Selesai", "LabelLanguage": "Bahasa:", - "LabelNext": "Berikutnya", - "LabelPrevious": "Sebelumnya", "LabelSaveLocalMetadata": "Simpan artwork dan metadata ke dalam folder media", "LabelSaveLocalMetadataHelp": "Menyimpan artwork dan metadata langsung ke folder media akan meletakkan mereka di tempat yang mudah diedit.", "LabelTimeLimitHours": "Batas waktu (jam):", - "LabelYourFirstName": "Nama depan anda:", "LabelYoureDone": "Kamu sudah selesai!", "MessageNothingHere": "Tidak ada disini.", "MessagePleaseEnsureInternetMetadata": "Pastikan unduh metadata dari internet diaktifkan.", @@ -25,29 +20,26 @@ "OptionEnableAccessToAllLibraries": "Aktifkan akses ke semua pustaka", "ParentalRating": "Parental Rating", "TabAccess": "Akses", - "TabPlaylist": "Daftar Putar", "TabProfile": "Profil", "TellUsAboutYourself": "Beritahu kami tentang anda", "ThisWizardWillGuideYou": "Panduan ini akan memandu Anda melalui proses setup. Untuk memulai, silahkan pilih bahasa yang Anda gunakan.", "UserProfilesIntro": "Jellyfin mendukung profil pengguna, memungkinkan setiap pengguna memiliki tampilan mereka sendiri, kondisi pemutaran dan pengawasan orang tua.", "WelcomeToProject": "Selamat datang di Jellyfin!", - "WizardCompleted": "Itu semua yang kami butuhkan saat ini. Jellyfin sudah memulai mengkoleksi informasi pustaka media. Lihatlah beberapa aplikasi kami, kemudian klik Selesai untuk menuju ke Dashboard Server", + "WizardCompleted": "Hanya itu yang kami butuhkan untuk saat ini. Jellyfin mulai mengumpulkan informasi tentang perpustakaan media Anda. Lihat beberapa aplikasi kami, lalu klik Selesai untuk melihat Dasbor.", "Collections": "Koleksi", "Folders": "Folder", - "HeaderNextUp": "Selanjutnya", "Albums": "Album", "Books": "Buku", "Favorites": "Favorit", - "Genres": "Genre", + "Genres": "Aliran", "HeaderFavoriteSongs": "Lagu Favorit", "HeaderFavoriteAlbums": "Album Favorit", "HeaderFavoriteArtists": "Artis Favorit", "HeaderFavoriteEpisodes": "Episode Favorit", "HeaderFavoriteShows": "Tayangan Favorit", "HeaderAlbumArtists": "Album Artis", - "HeaderContinueWatching": "Masih Melihat", + "HeaderContinueWatching": "Lanjutkan Menonton", "Artists": "Artis", - "HeaderLiveTV": "TV Live", "AllowMediaConversion": "Izinkan konversi media", "AllEpisodes": "Semua episode", "AllChannels": "Semua saluran", @@ -56,13 +48,12 @@ "Actor": "Aktor", "Delete": "Hapus", "DefaultMetadataLangaugeDescription": "Berikut ini adalah standar Anda dan dapat dikustomisasi pada tiap pustakanya.", - "DefaultErrorMessage": "Terdapat galat dalam memproses permintaan. Silakan coba kembali nanti.", + "ErrorDefault": "Terdapat galat dalam memproses permintaan. Silakan coba kembali nanti.", "Default": "Standar", "DeathDateValue": "Meninggal: {0}", "DatePlayed": "Tanggal dimainkan", "DateAdded": "Tanggal ditambahkan", "CriticRating": "Kritik peringkat", - "CopyStreamURLError": "Terdapat galat dalam penyalinan pranala.", "CopyStreamURLSuccess": "Pranala berhasil disalin.", "CopyStreamURL": "Salin Pranala Stream", "Continuing": "Melanjutkan", @@ -73,7 +64,7 @@ "ConfirmDeleteItems": "Penghapusan item-item ini akan menghapus baik pada sistem berkas maupun pustaka media Anda. Apakah Anda yakin untuk melanjutkan?", "ConfirmDeleteItem": "Penghapusan item ini akan menghapus baik pada sistem berkas maupun pustaka media Anda. Apakah Anda yakin untuk melanjutkan?", "ConfirmDeleteImage": "Hapus gambar?", - "ConfigureDateAdded": "Atur cara penentuan penambahan tanggal dalam dasbor Peladen Jellyfin lewat pengaturan Pustaka", + "ConfigureDateAdded": "Konfigurasikan bagaimana tanggal ditambahkan ditentukan di dasbor di bawah pengaturan pustaka", "Composer": "Komposer", "CommunityRating": "Peringkat komunitas", "ChannelNumber": "Nomor saluran", @@ -82,79 +73,54 @@ "Categories": "Kategori", "CancelRecording": "Batalkan perekaman", "ButtonWebsite": "Situs web", - "ButtonViewWebsite": "Tampilkan situs web", - "ButtonUp": "Atas", "ButtonTrailer": "Cuplikan", "ButtonSubmit": "Kirim", "ButtonStop": "Berhenti", "ButtonStart": "Mulai", - "ButtonSort": "Urutkan", "ButtonSignIn": "Masuk", "ButtonShutdown": "Matikan", - "ButtonShuffle": "Acak", "ButtonSettings": "Pengaturan", "ButtonSend": "Kirim", "ButtonSelectView": "Pilih tampilan", - "ButtonSelectServer": "Pilih Peladen", + "ButtonSelectServer": "Pilih Server", "ButtonSelectDirectory": "Pilih Direktori", - "ButtonSearch": "Cari", "ButtonScanAllLibraries": "Pindai Semua Pustaka", - "ButtonSave": "Simpan", "ButtonResume": "Lanjutkan", "ButtonResetPassword": "Atur ulang Kata sandi", "ButtonResetEasyPassword": "Atur ulang kode pin mudah", - "ButtonRepeat": "Ulangi", "ButtonRename": "Ubah nama", "ButtonRemove": "Hapus", "ButtonRefreshGuideData": "Muat ulang Data Panduan", - "ButtonRefresh": "Muat ulang", "ButtonProfile": "Profil", - "ButtonPlay": "Mainkan", "ButtonPause": "Jeda", "ButtonParentalControl": "Kendali orang tua", "ButtonOpen": "Buka", "ButtonOk": "Baik", - "ButtonOff": "Matikan", - "ButtonNew": "Baru", "ButtonNetwork": "Jaringan", "ButtonMore": "Lebih banyak", "ButtonLibraryAccess": "Akses pustaka", - "ButtonLearnMore": "Pelajari lebih lanjut", "ButtonInfo": "Info", - "ButtonHome": "Beranda", - "ButtonHelp": "Bantuan", "ButtonGuide": "Panduan", "ButtonGotIt": "Paham", "ButtonFullscreen": "Layar penuh", "ButtonForgotPassword": "Lupa Kata Sandi", - "ButtonFilter": "Penyaring", "ButtonEditOtherUserPreferences": "Ubah profil, gambar, dan preferensi pribadi pengguna ini.", - "ButtonEditImages": "Ubah gambar", - "ButtonEdit": "Ubah", - "ButtonDownload": "Unduh", - "ButtonDown": "Bawah", - "ButtonDeleteImage": "Hapus Gambar", - "ButtonDelete": "Hapus", - "ButtonConnect": "Sambung", - "ButtonChangeServer": "Ubah Peladen", + "ButtonChangeServer": "Ubah Server", "ButtonCancel": "Batalkan", "ButtonBack": "Kembali", "ButtonAudioTracks": "Trek Audio", - "ButtonArrowUp": "Atas", "ButtonArrowRight": "Kanan", "ButtonArrowLeft": "Kiri", - "ButtonArrowDown": "Turun", "ButtonAddUser": "Tambah Pengguna", - "ButtonAddServer": "Tambah Peladen", + "ButtonAddServer": "Tambah Server", "ButtonAddScheduledTaskTrigger": "Tambah Pemicu", "ButtonAddMediaLibrary": "Tambah Pustaka Media", "ButtonAddImage": "Tamba gambar", - "ButtonAdd": "Tambah", - "BrowsePluginCatalogMessage": "Jelajahi katalog plugin kamu untuk melihat plugin yang tersedia.", + "MessageBrowsePluginCatalog": "Jelajahi katalog plugin kamu untuk melihat plugin yang tersedia.", "Browse": "Jelajah", "BoxRear": "Kotak (belakang)", "Box": "Kotak", - "BookLibraryHelp": "Buku audio dan teks didukung. Perhatikan {0}panduan penamaan buku{1}.", + "BookLibraryHelp": "Audio dan buku teks didukung. Tinjau {0} panduan penamaan buku {1}.", "Blacklist": "Daftar hitam", "BirthPlaceValue": "Tempat lahir: {0}", "BirthLocation": "Tempat lahir", @@ -162,28 +128,26 @@ "Banner": "Spanduk", "Backdrops": "Latar belakang", "Backdrop": "Latar belakang", - "AutoBasedOnLanguageSetting": "Auto (berdasarkan pengaturan bahasa)", "Auto": "Auto", - "AuthProviderHelp": "Pilih Penyedia Autentikasi yang akan digunakan untuk mengautentikasi kata sandi pengguna ini.", + "AuthProviderHelp": "Pilih penyedia otentikasi yang akan digunakan untuk mengautentikasi kata sandi pengguna ini.", "Audio": "Audio", - "AttributeNew": "Baru", "AspectRatio": "Rasio perbandingan", "Ascending": "Urutan naik", "AsManyAsPossible": "Sebanyak mungkin", "Art": "Seni", - "AroundTime": "Sekitar {0}", + "AroundTime": "Sekitar", "Anytime": "Kapanpun", "AnyLanguage": "Bahasa apapun", "AlwaysPlaySubtitlesHelp": "Talop yang cocok dengan preferensi bahasa akan dimuat tanpa memperhatikan bahasa suaranya.", - "AlwaysPlaySubtitles": "Selalu putar talop", + "AlwaysPlaySubtitles": "Selalu Mainkan", "AllowedRemoteAddressesHelp": "Daftar yang dipisahkan dengan koma dari alamat IP atau catatan netmask untuk jaringan yang akan diperbolehkan untuk tersambuh dari jarak jauh. Jika dibiarkan kosong, seluruh alamat jarak jauh akan diperbolehkan.", "AllowRemoteAccessHelp": "Jika centang dihapus, semua koneksi jarak jauh akan diblokir.", - "AllowRemoteAccess": "Izinkan koneksi jarak jauh ke Peladen Jellyfin ini.", + "AllowRemoteAccess": "Izinkan koneksi jarak jauh ke server ini.", "AllowOnTheFlySubtitleExtraction": "Izinkan ekstraksi talop dengan cepat", "AllowMediaConversionHelp": "Izinkan atau tolak akses ke fitur konversi media.", "AllLibraries": "Semua pustaka", "AllLanguages": "Semua bahasa", - "AllComplexFormats": "Semua format kompleks (ASS, SSA, VOBSUB, PGS, SUB/IDK, dll.)", + "AllComplexFormats": "Semua Format Kompleks (ASS, SSA, VOBSUB, PGS, SUB, IDX,…)", "Channels": "Saluran", "Aired": "Disiarkan", "AirDate": "Tanggal siaran", @@ -191,7 +155,6 @@ "AddToPlaylist": "Tambah ke dalam daftar putar", "AddToPlayQueue": "Tambah ke dalam antrean putar", "AddToCollection": "Tambah ke dalam koleksi", - "AddItemToCollectionHelp": "Tambahkan item ke dalam koleksi melalui pencarian dan gunakan klik kanan atau ketuk menu untuk menambahkannya ke dalam koleksi.", "AccessRestrictedTryAgainLater": "Akses sedang dibatasi. Mohon tunggu beberapa saat lagi", "Absolute": "Absolut", "Songs": "Lagu", @@ -204,6 +167,230 @@ "Alerts": "Peringatan", "AddedOnValue": "Ditambahkan {0}", "AllowFfmpegThrottling": "Transcode Tercekik", - "AllowOnTheFlySubtitleExtractionHelp": "Subtitle yang melekat di video dapat dikeluarkan dan dikirimkan kepada klien dalam bentuk text biasa dengan tujuan untuk menghalau terjadinya transcoding pada video. Pada beberapa system ini membutuhkan waktu yang lama dan dapat menyebabkan video playback menjadi terhenti dikarenakan proses ekstraksi. Non-aktifkan fitur ini untuk membiarkan subtitle langsung dilekatkan kepada video dengan cara transcoding ketika klien tidak mendukung fitur ini.", - "ButtonSyncPlay": "SyncPlay" + "AllowOnTheFlySubtitleExtractionHelp": "Subtitel yang disematkan dapat diekstrak dari video dan dikirim ke klien dalam teks biasa, untuk membantu mencegah transcoding video. Pada beberapa sistem, ini dapat memakan waktu lama dan menyebabkan pemutaran video terhenti selama proses ekstraksi. Nonaktifkan ini untuk menyematkan subtitle yang disematkan dengan transcoding video ketika mereka tidak didukung secara native oleh perangkat klien.", + "ButtonSyncPlay": "SyncPlay", + "EnablePhotosHelp": "Gambar akan terdeteksi dan ditampilkan bersama file media lainnya.", + "EnablePhotos": "Tampilkan foto", + "EnableNextVideoInfoOverlayHelp": "Di akhir video, tampilkan info tentang video berikutnya yang akan muncul di daftar putar saat ini.", + "EnableNextVideoInfoOverlay": "Tampilkan info video berikutnya selama pemutaran", + "EnableHardwareEncoding": "Aktifkan pengkodean perangkat keras", + "EnableExternalVideoPlayersHelp": "Menu pemutar eksternal akan ditampilkan saat memulai pemutaran video.", + "EnableExternalVideoPlayers": "Pemutar video eksternal", + "EnableDisplayMirroring": "Tampilan mirroring", + "EnableDecodingColorDepth10Vp9": "Aktifkan 10-Bit decoding hardware untuk VP9", + "EnableDecodingColorDepth10Hevc": "Aktifkan 10-Bit decoding hardware untuk HEVC", + "EnableColorCodedBackgrounds": "Latar belakang berkode warna", + "EnableCinemaMode": "Mode bioskop", + "EnableBackdropsHelp": "Menampilkan latar belakang di latar belakang beberapa halaman saat menjelajahi pustaka.", + "EditSubtitles": "Edit subtitle", + "EditMetadata": "Edit metadata", + "EditImages": "Edit Gambar", + "Edit": "Edit", + "EasyPasswordHelp": "Kode pin mudah Anda digunakan untuk akses offline di klien yang didukung dan juga dapat digunakan untuk masuk ke jaringan dengan mudah.", + "DropShadow": "Drop Shadow", + "DrmChannelsNotImported": "Saluran dengan DRM tidak akan diimpor.", + "DownloadsValue": "{0} unduhan", + "Download": "Unduh", + "Down": "Turun", + "DoNotRecord": "Jangan merekam", + "DisplayModeHelp": "Pilih gaya tata letak yang Anda inginkan untuk antarmuka.", + "DisplayMissingEpisodesWithinSeasonsHelp": "Ini juga harus diaktifkan untuk pustaka TV di konfigurasi server.", + "DisplayMissingEpisodesWithinSeasons": "Tampilkan episode yang hilang dalam season", + "DisplayInOtherHomeScreenSections": "Tayangkan di bagian layar beranda seperti media terbaru dan lanjutkan menonton", + "Display": "Tampilan", + "DisplayInMyMedia": "Tampilan di layar beranda", + "Dislike": "Benci", + "Disconnect": "Memutuskan", + "Disc": "CD", + "Disabled": "Matikan", + "DirectPlaying": "Bermain langsung", + "DirectStreaming": "Streaming langsung", + "DirectStreamHelp2": "Streaming langsung menggunakan daya pemrosesan yang sangat sedikit dengan penurunan kualitas video yang minimal.", + "DirectStreamHelp1": "Media kompatibel dengan perangkat terkait resolusi dan jenis media (H.264, AC3, dll), tetapi dalam wadah file yang tidak kompatibel (mkv, avi, wmv, dll). Video akan dikemas ulang dengan cepat sebelum dikirim ke perangkat.", + "DeviceAccessHelp": "Ini hanya berlaku untuk perangkat yang dapat diidentifikasi secara unik dan tidak akan mencegah akses browser. Memfilter akses perangkat pengguna akan mencegah mereka menggunakan perangkat baru hingga disetujui di sini.", + "DetectingDevices": "Mendeteksi perangkat", + "Desktop": "Desktop", + "Descending": "Menurun", + "DeleteUserConfirmation": "Apakah Anda yakin ingin menghapus pengguna ini?", + "DeleteUser": "Hapus pengguna", + "DeleteMedia": "Hapus media", + "DeleteImageConfirmation": "Anda yakin ingin menghapus gambar ini?", + "DeleteImage": "Hapus Gambar", + "DeleteDeviceConfirmation": "Anda yakin ingin menghapus perangkat ini? Ini akan muncul kembali saat pengguna login lagi.", + "DeinterlaceMethodHelp": "Pilih metode deinterlacing yang akan digunakan saat melakukan transcoding konten interlace.", + "DefaultSubtitlesHelp": "Subtitel dimuat berdasarkan bendera default dan paksa dalam metadata yang disematkan. Preferensi bahasa dipertimbangkan ketika beberapa opsi tersedia.", + "CustomDlnaProfilesHelp": "Buat profil khusus untuk menargetkan perangkat baru atau mengganti profil sistem.", + "ColorTransfer": "Transfer warna", + "ColorSpace": "Ruang warna", + "ColorPrimaries": "Warna primer", + "ClientSettings": "Pengaturan Klien", + "CinemaModeConfigurationHelp": "Mode bioskop menghadirkan pengalaman teater langsung ke ruang tamu Anda dengan kemampuan untuk memutar trailer dan pengantar khusus sebelum fitur utama.", + "ChangingMetadataImageSettingsNewContent": "Perubahan pada metadata atau setelan pengunduhan karya seni hanya akan berlaku untuk konten baru yang ditambahkan ke perpustakaan Anda. Untuk menerapkan perubahan pada judul yang ada, Anda perlu menyegarkan metadatanya secara manual.", + "CancelSeries": "Batalkan serial", + "ButtonUninstall": "Copot pemasangan", + "ButtonTogglePlaylist": "Daftar Putar", + "ButtonSubtitles": "Subtitle", + "ButtonSplit": "Membagi", + "ButtonRestart": "Muat ulang", + "ButtonPreviousTrack": "Lagu sebelumnya", + "ButtonNextTrack": "Lagu berikutnya", + "ButtonManualLogin": "Login Manual", + "BurnSubtitlesHelp": "Menentukan apakah server harus membakar subtitle saat melakukan transcoding video. Menghindari ini akan sangat meningkatkan kinerja. Pilih Otomatis untuk membakar format berbasis gambar (VOBSUB, PGS, SUB, IDX,…) dan subtitle ASS atau SSA tertentu.", + "BoxSet": "Set Kotak", + "AskAdminToCreateLibrary": "Minta administrator untuk membuat pustaka.", + "Artist": "Artis", + "AllowFfmpegThrottlingHelp": "Saat transcode atau remux cukup jauh dari posisi pemutaran saat ini, jeda prosesnya sehingga akan mengkonsumsi lebih sedikit sumber daya. Ini paling berguna saat menonton tanpa sering mencari. Matikan ini jika Anda mengalami masalah pemutaran.", + "AllowHWTranscodingHelp": "Izinkan tuner untuk mentranskode aliran dengan cepat. Ini dapat membantu mengurangi transcoding yang dibutuhkan oleh server.", + "AlbumArtist": "Album Artis", + "Album": "Album", + "ButtonRevoke": "Mencabut", + "TabServer": "Server", + "ServerUpdateNeeded": "Server ini perlu diperbarui. Untuk mengunduh versi terbaru, kunjungi {0}", + "ServerRestartNeededAfterPluginInstall": "Jellyfin perlu direstart setelah menginstal plugin.", + "ServerNameIsShuttingDown": "Server di {0} sedang dimatikan.", + "ServerNameIsRestarting": "Server di {0} sedang memulai ulang.", + "MessagePluginInstalled": "Plugin berhasil diinstal. Server perlu dimulai ulang agar perubahan diterapkan.", + "PleaseRestartServerName": "Harap mulai ulang Jellyfin di {0}.", + "PlaybackErrorNoCompatibleStream": "Klien ini tidak kompatibel dengan media dan server tidak mengirimkan format media yang kompatibel.", + "OptionSaveMetadataAsHiddenHelp": "Mengubah ini akan diterapkan ke metadata baru yang disimpan di masa mendatang. File metadata yang ada akan diperbarui pada saat disimpan oleh server.", + "OptionReportByteRangeSeekingWhenTranscoding": "Laporkan bahwa server mendukung pencarian byte saat melakukan transcoding", + "OptionDisableUserHelp": "Server tidak akan mengizinkan koneksi apa pun dari pengguna ini. Koneksi yang ada akan dihentikan secara tiba-tiba.", + "OptionAllowUserToManageServer": "Izinkan pengguna ini untuk mengelola server", + "MessageUnableToConnectToServer": "Kami tidak dapat terhubung ke server yang dipilih sekarang. Harap pastikan itu berjalan dan coba lagi.", + "MessagePluginInstallDisclaimer": "Plugin yang dibuat oleh anggota komunitas adalah cara terbaik untuk meningkatkan pengalaman Anda dengan fitur dan manfaat tambahan. Sebelum menginstal, perhatikan efeknya pada server Anda, seperti pemindaian perpustakaan yang lebih lama, pemrosesan latar belakang tambahan, dan penurunan stabilitas sistem.", + "MessagePluginConfigurationRequiresLocalAccess": "Untuk mengkonfigurasi plugin ini, harap masuk ke server lokal Anda secara langsung.", + "MessagePlayAccessRestricted": "Pemutaran konten ini saat ini dibatasi. Silakan hubungi administrator server Anda untuk informasi lebih lanjut.", + "MessageNoServersAvailable": "Tidak ada server yang ditemukan menggunakan penemuan server otomatis.", + "LabelRepositoryNameHelp": "Nama khusus untuk membedakan repositori ini dari yang lain yang ditambahkan ke server Anda.", + "MessageForgotPasswordFileCreated": "File berikut telah dibuat di server Anda dan berisi petunjuk tentang cara melanjutkan :", + "MessageConfirmShutdown": "Apakah Anda yakin ingin mematikan server?", + "MessageConfirmRevokeApiKey": "Apakah Anda yakin ingin mencabut kunci API ini? Koneksi aplikasi ke server ini akan tiba-tiba dihentikan.", + "LanNetworksHelp": "Daftar alamat IP atau entri IP / netmask yang dipisahkan koma untuk jaringan yang akan dipertimbangkan di jaringan lokal saat memberlakukan pembatasan bandwidth. Jika disetel, semua alamat IP lainnya akan dianggap berada di jaringan eksternal dan tunduk pada pembatasan bandwidth eksternal. Jika dibiarkan kosong, hanya subnet server yang dianggap berada di jaringan lokal.", + "DashboardServerName": "Server : {0}", + "LabelUserRemoteClientBitrateLimitHelp": "Ganti nilai global default yang ditetapkan di pengaturan pemutaran server.", + "LabelTranscodingTempPathHelp": "Tentukan jalur kustom untuk file transcode yang disajikan ke klien. Biarkan kosong untuk menggunakan default server.", + "LabelSyncPlayTimeOffset": "Pengimbangan waktu dengan server :", + "LabelServerName": "Nama Server :", + "LabelServerHostHelp": "192.168.1.100:8096 atau https://myserver.com", + "LabelServerHost": "Host :", + "LabelRequireHttpsHelp": "Jika dicentang, server akan secara otomatis mengalihkan semua permintaan melalui HTTP ke HTTPS. Ini tidak berpengaruh jika server tidak mendengarkan di HTTPS.", + "LabelRemoteClientBitrateLimitHelp": "Batas kecepatan bit per-aliran opsional untuk semua perangkat di luar jaringan. Ini berguna untuk mencegah perangkat meminta bitrate yang lebih tinggi daripada yang dapat ditangani koneksi internet Anda. Hal ini dapat mengakibatkan peningkatan beban CPU pada server Anda untuk mentranskode video dengan cepat ke bitrate yang lebih rendah.", + "LabelRecordingPathHelp": "Tentukan lokasi default untuk menyimpan rekaman. Jika dibiarkan kosong, folder data program server akan digunakan.", + "LabelMoviePrefixHelp": "Jika prefiks diterapkan pada judul film, masukkan di sini agar server dapat menanganinya dengan benar.", + "LabelLocalHttpServerPortNumberHelp": "Nomor port TCP untuk server HTTP.", + "LabelLocalHttpServerPortNumber": "Nomor port HTTP lokal :", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Mengaktifkan substitusi jalur dari jalur gambar menggunakan pengaturan substitusi jalur server.", + "LabelHttpsPortHelp": "Nomor port TCP untuk server HTTPS.", + "LabelServerNameHelp": "Nama ini akan digunakan untuk mengidentifikasi server dan akan menggunakan nama host server secara default.", + "LabelBaseUrlHelp": "Tambahkan subdirektori khusus ke URL server. Misalnya: http://example.com/<baseurl> ", + "LabelEnableDlnaServerHelp": "Mengizinkan perangkat UPnP di jaringan Anda untuk menelusuri dan memutar konten.", + "LabelEnableDlnaServer": "Aktifkan server DLNA", + "LabelEnableBlastAliveMessagesHelp": "Aktifkan ini jika server tidak terdeteksi dengan andal oleh perangkat UPnP lain di jaringan Anda.", + "LabelEnableAutomaticPortMapHelp": "Secara otomatis meneruskan port publik di router Anda ke port lokal di server Anda melalui UPnP. Ini mungkin tidak berfungsi dengan beberapa model router atau konfigurasi jaringan. Perubahan tidak akan berlaku sampai server dimulai ulang.", + "LabelCachePathHelp": "Tentukan lokasi khusus untuk file cache server seperti gambar. Biarkan kosong untuk menggunakan default server.", + "LabelBindToLocalNetworkAddressHelp": "Ganti alamat IP lokal untuk server HTTP. Jika dibiarkan kosong, server akan mengikat ke semua alamat yang tersedia. Mengubah nilai ini membutuhkan restart.", + "LabelAbortedByServerShutdown": "(Dibatalkan oleh penghentian server)", + "HeaderServerSettings": "Pengaturan Server", + "HeaderServerAddressSettings": "Pengaturan Alamat Server", + "HeaderSelectServerCachePathHelp": "Jelajahi atau masukkan jalur yang akan digunakan untuk file cache server. Folder harus dapat akses.", + "HeaderSelectServerCachePath": "Pilih lokasi Cache Server", + "HeaderSelectServer": "Pilih Server", + "HeaderProfileServerSettingsHelp": "Nilai-nilai ini mengontrol bagaimana server akan menampilkan dirinya kepada klien.", + "HeaderConnectToServer": "Sambungkan ke server", + "HeaderApiKeysHelp": "Aplikasi eksternal diharuskan memiliki kunci API untuk berkomunikasi dengan server. Kunci dikeluarkan dengan masuk dengan akun pengguna biasa atau secara manual memberi aplikasi kunci.", + "ErrorDeletingItem": "Terjadi kesalahan saat menghapus item dari server. Harap periksa apakah Jellyfin memiliki akses tulis ke folder media dan coba lagi.", + "LabelHttpsPort": "Nomor port HTTPS lokal :", + "LabelHomeScreenSectionValue": "Bagian layar beranda {0} :", + "LabelHomeNetworkQuality": "Kualitas jaringan rumah :", + "LabelHardwareAccelerationTypeHelp": "Akselerasi perangkat keras membutuhkan konfigurasi tambahan.", + "LabelHardwareAccelerationType": "Akselerasi perangkat keras :", + "LabelEncoderPreset": "Preset pengkodean H264 dan H265 :", + "LabelH264Crf": "H264 pengkodean CRF :", + "LabelGroupMoviesIntoCollectionsHelp": "Saat menampilkan daftar film, film dalam sebuah koleksi akan ditampilkan sebagai satu item yang dikelompokkan.", + "LabelGroupMoviesIntoCollections": "Kelompokkan film ke dalam koleksi", + "LabelFriendlyName": "Nama ramah :", + "LabelFormat": "Format :", + "LabelForgotPasswordUsernameHelp": "Masukkan nama pengguna Anda, jika Anda mengingatnya.", + "LabelFont": "Font :", + "LabelFolder": "Folder :", + "LabelFileOrUrl": "File atau URL :", + "LabelFailed": "Gagal", + "HeaderChannelAccess": "Akses Saluran", + "HeaderCastAndCrew": "Pemeran & Kru", + "HeaderCancelSeries": "Batalkan Serial", + "HeaderCancelRecording": "Batalkan Perekaman", + "HeaderBranding": "Branding", + "HeaderBlockItemsWithNoRating": "Blokir item dengan informasi peringkat yang tidak ada atau tidak dikenal :", + "HeaderAudioSettings": "Pengaturan Audio", + "HeaderAudioBooks": "Buku Audio", + "HeaderAppearsOn": "Muncul Di", + "HeaderApp": "App", + "ApiKeysCaption": "Daftar API keys yang saat ini diaktifkan", + "HeaderApiKeys": "API Keys", + "HeaderApiKey": "API Key", + "HeaderAllowMediaDeletionFrom": "Izinkan Penghapusan Media Dari", + "HeaderAlert": "Peringatan", + "HeaderAdmin": "Admin", + "HeaderAdditionalParts": "Bagian Tambahan", + "HeaderAddUpdateImage": "Tambahkan / Perbarui Gambar", + "HeaderAddToPlaylist": "Tambahkan ke Daftar Putar", + "HeaderAddToCollection": "Masukkan ke dalam koleksi", + "HeaderActivity": "Aktivitas", + "HeaderActiveRecordings": "Rekaman Aktif", + "HeaderActiveDevices": "Perangkat Aktif", + "HeaderAccessScheduleHelp": "Buat jadwal akses untuk membatasi akses ke jam-jam tertentu.", + "HeaderAccessSchedule": "Jadwal Akses", + "HardwareAccelerationWarning": "Mengaktifkan akselerasi perangkat keras dapat menyebabkan ketidakstabilan di beberapa lingkungan. Pastikan sistem operasi dan driver video Anda sudah diperbarui sepenuhnya. Jika Anda mengalami kesulitan memutar video setelah mengaktifkan ini, Anda harus mengubah pengaturan kembali ke Tidak Ada.", + "HDPrograms": "Program HD", + "EncoderPresetHelp": "Pilih nilai yang lebih cepat untuk meningkatkan kinerja, atau nilai yang lebih lambat untuk meningkatkan kualitas.", + "H264CrfHelp": "The Constant Rate Factor (CRF) adalah pengaturan kualitas default untuk pembuat enkode x264. Anda dapat mengatur nilai antara 0 dan 51, di mana nilai yang lebih rendah akan menghasilkan kualitas yang lebih baik (dengan mengorbankan ukuran file yang lebih tinggi). Nilai waras antara 18 dan 28. Default untuk x264 adalah 23, jadi Anda dapat menggunakan ini sebagai titik awal.", + "GuideProviderSelectListings": "Pilih Daftar", + "GuideProviderLogin": "Login", + "Guide": "Panduan", + "GuestStar": "Bintang tamu", + "GroupVersions": "Versi grup", + "GroupBySeries": "Kelompokkan menurut seri", + "Genre": "Aliran", + "General": "Umum", + "Fullscreen": "Layar penuh", + "Friday": "Jumat", + "FormatValue": "Format: {0}", + "FolderTypeUnset": "Konten Campuran", + "FolderTypeMusicVideos": "Video musik", + "FolderTypeMusic": "Musik", + "FolderTypeMovies": "Film", + "FolderTypeBooks": "Buku", + "Filters": "Filter", + "FileReadError": "Terjadi kesalahan saat membaca file.", + "FileReadCancelled": "Pembacaan file telah dibatalkan.", + "FileNotFound": "File tidak ditemukan.", + "File": "File", + "FetchingData": "Mengambil data tambahan", + "Features": "Fitur", + "Favorite": "Favorit", + "FastForward": "Maju cepat", + "FFmpegSavePathNotFound": "Kami tidak dapat menemukan FFmpeg menggunakan jalur yang Anda masukkan. FFprobe juga diperlukan dan harus ada di folder yang sama. Komponen ini biasanya digabungkan dalam unduhan yang sama. Harap periksa jalurnya dan coba lagi.", + "Extras": "Ekstra", + "ExtractChapterImagesHelp": "Mengekstrak gambar bab akan memungkinkan klien untuk menampilkan menu pemilihan adegan grafis. Prosesnya bisa lambat, membutuhkan banyak sumber daya, dan mungkin memerlukan beberapa gigabyte ruang. Ini berjalan saat video ditemukan, dan juga sebagai tugas yang dijadwalkan setiap malam. Jadwal dapat dikonfigurasi di area tugas terjadwal. Tidak disarankan untuk menjalankan tugas ini selama jam penggunaan puncak.", + "ExtraLarge": "Ekstra besar", + "ExitFullscreen": "Keluar dari layar penuh", + "EveryNDays": "Setiap {0} hari", + "ErrorSavingTvProvider": "Terjadi kesalahan saat menyimpan penyedia TV. Harap pastikan itu dapat diakses dan coba lagi.", + "ErrorPleaseSelectLineup": "Pilih barisan dan coba lagi. Jika tidak ada daftar yang tersedia, periksa apakah nama pengguna, kata sandi, dan kode pos Anda sudah benar.", + "ErrorStartHourGreaterThanEnd": "Waktu akhir harus lebih lama dari waktu mulai.", + "ErrorGettingTvLineups": "Terjadi kesalahan saat mengunduh daftar TV. Harap pastikan informasi Anda benar dan coba lagi.", + "ErrorAddingXmlTvFile": "Ada kesalahan saat mengakses file XMLTV. Harap pastikan file tersebut ada dan coba lagi.", + "ErrorAddingTunerDevice": "Terjadi kesalahan saat menambahkan perangkat tuner. Harap pastikan itu dapat diakses dan coba lagi.", + "ErrorAddingMediaPathToVirtualFolder": "Terjadi kesalahan saat menambahkan jalur media. Harap pastikan jalurnya valid dan Jellyfin memiliki akses ke lokasi itu.", + "ErrorAddingListingsToSchedulesDirect": "Terjadi kesalahan saat menambahkan daftar ke akun Jadwal Langsung Anda. Jadwal Langsung hanya mengizinkan jumlah daftar terbatas per akun. Anda mungkin perlu masuk ke situs web Jadwal Langsung dan menghapus daftar orang lain dari akun Anda sebelum melanjutkan.", + "Episodes": "Episodes", + "Episode": "Episode", + "EndsAtValue": "Berakhir pada {0}", + "Ended": "Berakhir", + "EnableDetailsBannerHelp": "Tampilkan gambar spanduk di bagian atas halaman detail item.", + "EnableDetailsBanner": "Detail Spanduk", + "EnableThemeVideosHelp": "Putar video tema di latar belakang saat menjelajahi pustaka.", + "EnableThemeSongsHelp": "Putar lagu tema di latar belakang saat menjelajahi pustaka.", + "EnableStreamLoopingHelp": "Aktifkan ini jika live streaming hanya berisi beberapa detik data dan perlu terus diminta. Mengaktifkan ini saat tidak diperlukan dapat menyebabkan masalah.", + "EnableStreamLooping": "Putar otomatis live streaming" } diff --git a/src/strings/is-is.json b/src/strings/is-is.json index fac582bad4..4b48774a2b 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -2,7 +2,6 @@ "All": "Allt", "Browse": "Vafra", "ButtonCancel": "Hætta við", - "ButtonNew": "Nýtt", "ButtonOk": "Í lagi", "ButtonSignOut": "Útskráning", "DeleteMedia": "Eyða margmiðlunarefni", @@ -11,7 +10,6 @@ "FolderTypeMusic": "Tónlist", "FolderTypeMusicVideos": "Tónlistarmyndbönd", "FolderTypeTvShows": "Sjónvarpsþættir", - "HeaderAddUser": "Bæta við notenda", "HeaderDeviceAccess": "Aðgangur tækja", "HeaderEasyPinCode": "Auðvelt Pin númer", "HeaderPaths": "Slóðir", @@ -20,28 +18,21 @@ "LabelCountry": "Land:", "LabelFinish": "Ljúka", "LabelLanguage": "Tungumál:", - "LabelNext": "Næsta", - "LabelPrevious": "Fyrra", "LabelTimeLimitHours": "Tímamörk (í klukkustundum):", - "LabelYourFirstName": "Fyrra nafn:", "MoreUsersCanBeAddedLater": "Þú getur bætt við fleiri notendum síðar undir stjórnborðinu.", "NextUp": "Næst á dagskrá", "OptionEnableAccessFromAllDevices": "Virkja aðgang frá öllum tækjum", "ShowAdvancedSettings": "Birta ítarlegar stillingar", "TabAccess": "Aðgangur", "TabNotifications": "Tilkynningar", - "TabPassword": "Lykilorð", - "TabPlaylist": "Afspilunar listi", "WelcomeToProject": "Velkomin/n í Jellyfin!", "Anytime": "Hvenær sem er", "Genres": "Tegundir", "ButtonAddImage": "Bæta við ljósmynd", "ButtonAddServer": "Bæta við þjón", "ButtonAddUser": "Bæta við notenda", - "ButtonArrowDown": "Niður", "ButtonArrowLeft": "Vinstri", "ButtonArrowRight": "Hægri", - "ButtonArrowUp": "Upp", "OptionBlockBooks": "Bækur", "OptionContinuing": "Heldur áfram", "OptionBlockTvShows": "Sjónvarpsþættir", @@ -52,8 +43,7 @@ "Actor": "Leikari", "Add": "Bæta við", "AddToCollection": "Bæta í safn", - "AutoBasedOnLanguageSetting": "Sjálfkrafa (byggt á tungumálastillingum)", - "BrowsePluginCatalogMessage": "Skoða viðbætur sem eru í boði í viðbóta safninu okkar.", + "MessageBrowsePluginCatalog": "Skoða viðbætur sem eru í boði í viðbóta safninu okkar.", "BurnSubtitlesHelp": "Ákveður hvort þjónninn eigi að brenna textann inn í myndaskránna þegar verið er að umbreyta skrársniðinu. Með því að forðast að brenna inn textann er hægt að minnka álag á þjóninn (tölvuna). Veljið sjálfkrafa til þess að brenna texta byggðan á myndum (VOBSUB, PGS, SUB/IDX, ofl) og ákveðna ASS/SSA texta.", "OptionSaveMetadataAsHidden": "Geyma gagnagögn (metadata) og myndir sem leynilegar skrár", "PasswordMatchError": "Lykilorð og ítrekun lykilorðs þarf að passa.", @@ -69,18 +59,15 @@ "HeaderFavoriteSongs": "Uppáhalds Lög", "Play": "Spila", "Folders": "Möppur", - "OptionSunday": "Sunnudagur", "OptionSubstring": "Undirstrengur", "OptionSpecialEpisode": "Sérstakt", "OptionTvdbRating": "TVDB einkunn", "OptionWakeFromSleep": "Vekja frá svefni", - "OptionWednesday": "Miðvikudagur", "PackageInstallCancelled": "{0} hætt við uppsetningu.", "AddToPlayQueue": "Bæta í spilunarlista", "AddedOnValue": "Bætti við {0}", "AirDate": "Frumsýningardagur", "Aired": "Frumsýnt", - "AddItemToCollectionHelp": "Þú getur bætt við efni í söfn með því að leita og svo hægri smella eða ýta á valmyndina.", "AddToPlaylist": "Bæta á spilunarlista", "AdditionalNotificationServices": "Skoða viðbætur til þess að bæta við fleiri tilkynningarþjónustum.", "Alerts": "Viðvaranir", @@ -102,7 +89,6 @@ "AsManyAsPossible": "Eins margir og mögulegt er", "Ascending": "Í vaxandi röð", "AspectRatio": "Skjáhlutfall", - "AttributeNew": "Nýtt", "Audio": "Hjóð", "Auto": "Sjálfkrafa", "Banner": "Borði", @@ -112,7 +98,6 @@ "Blacklist": "Bannlisti", "Box": "Kassi", "BoxRear": "Box (að aftan)", - "ButtonAdd": "Bæta við", "ButtonAddMediaLibrary": "Bæta við myndasafni", "ButtonAddScheduledTaskTrigger": "Bæta við orsakavald (trigger)", "Books": "Bækur", @@ -121,8 +106,6 @@ "PerfectMatch": "Passar fullkomlega", "Channels": "Stöðvar", "Collections": "Söfn", - "OptionSaturday": "Laugardagur", - "OptionThursday": "Fimmtudagur", "OptionUnairedEpisode": "Ófrumsýndir þættir", "OptionUnplayed": "Óspilað", "OptionWeekdays": "Vikudagar", @@ -132,8 +115,6 @@ "OptionBluray": "Blu-ray", "Yesterday": "Í gær", "Absolute": "Heildartala", - "HeaderLiveTV": "Sjónvarp í beinni útsendingu", - "HeaderNextUp": "Næst á dagskrá", "OptionCommunityRating": "Einkunn almennings", "OptionCriticRating": "Einkunn gagnrýnenda", "OptionCustomUsers": "Sérsniðið", @@ -145,7 +126,7 @@ "Overview": "Yfirlit", "PackageInstallCompleted": "{0} lokið við uppsetningu.", "PasswordResetComplete": "Lykilorðið hefur verið endurstillt.", - "PasswordResetHeader": "Endurstilla lykilorð", + "HeaderResetPassword": "Endurstilla lykilorð", "PasswordResetProviderHelp": "Veldu þjónustu til þess að endurstilla lykilorð þegar notandi biður um það", "PictureInPicture": "Brot úr ramma", "PinCodeResetComplete": "Pinnið þitt hefur verið endursett.", @@ -159,26 +140,18 @@ "Played": "Spilað", "Photos": "Myndir", "Movies": "Kvikmyndir", - "ButtonPlay": "Spila", "HeaderRestart": "Endurræsa", "HeaderProfileInformation": "Upplýsingar um prófíl", "HeaderProfile": "Prófíll", - "HeaderPeople": "Fólk", "HeaderPassword": "Lykilorð", "HeaderLatestMovies": "Kvikmyndir, nýlega bætt við", "HeaderLatestEpisodes": "Þættir, nýlega bætt við", - "HeaderHome": "Heim", "HeaderFavoriteVideos": "Uppáhalds Myndbönd", "HeaderFavoriteMovies": "Uppáhalds Kvikmyndir", - "HeaderEpisodes": "Þættir", "HeaderError": "Villa", "HeaderDownloadSync": "Sækja og Samstilla", "HeaderDeleteDevice": "Eyða Tæki", - "HeaderCastCrew": "Leikarar og Áhöfn", "HeaderCastAndCrew": "Leikarar og Áhöfn", - "HeaderBooks": "Bækur", - "HeaderAutomaticUpdates": "Sjálfvirkar Uppfærslur", - "HeaderAlbums": "Plötur", "HeaderAdmin": "Stjórnandi", "GuideProviderLogin": "Innskrá", "General": "Almennt", @@ -214,20 +187,13 @@ "Categories": "Flokkar", "CancelRecording": "Hætta við upptöku", "ButtonWebsite": "Vefsiða", - "ButtonViewWebsite": "Skoða vefsíðu", - "ButtonUp": "Upp", "ButtonUninstall": "Fjarlægja", "ButtonTrailer": "Sýnishorn", - "ButtonSubtitles": "Texti", - "ButtonSort": "Flokka", "ButtonSignIn": "Innskráning", - "ButtonShuffle": "Stokka", "ButtonSettings": "Stillingar", "ButtonSend": "Senda", "ButtonSelectServer": "Velja netþjón", "ButtonSelectDirectory": "Velja möppu", - "ButtonSearch": "Leita", - "ButtonSave": "Vista", "ButtonRestart": "Endurræsa", "ButtonResetPassword": "Endurstilla lykilorð", "ButtonOpen": "Opna", @@ -242,33 +208,19 @@ "ButtonRename": "Endurnefna", "Sync": "Samstilla", "ButtonRevoke": "Afturkalla", - "ButtonRepeat": "Endurtaka", "Monday": "Mánudagur", - "ButtonRefresh": "Endurhlaða", "ButtonParentalControl": "Foreldraeftirlit", - "ButtonOff": "Af", "ButtonNextTrack": "Næsta lag", "ButtonNetwork": "Net", "ButtonMore": "Meira", "ButtonManualLogin": "Handvirkt Auðkenni", "ButtonLibraryAccess": "Aðgangur að safni", - "ButtonLearnMore": "Læra meira", "ButtonInfo": "Upplýsingar", - "ButtonHome": "Heim", - "ButtonHelp": "Hjálp", "ButtonGuide": "Sjónvarpsvísir", "ButtonGotIt": "Skilið", "ButtonFullscreen": "Fylla upp í skjá", "ButtonForgotPassword": "Gleymt Lykilorð", - "ButtonFilter": "Sía", "ButtonEditOtherUserPreferences": "Breyta stillingum notanda, mynd og persónulegum stillingum.", - "ButtonEditImages": "Breyta myndum", - "ButtonEdit": "Breyta", - "ButtonDownload": "Sækja", - "ButtonDown": "Niður", - "ButtonDeleteImage": "Eyða Mynd", - "ButtonDelete": "Eyða", - "ButtonConnect": "Tengjast", "ButtonChangeServer": "Skipta um þjón", "ButtonBack": "Til baka", "ButtonAudioTracks": "Hljóðspor", @@ -312,24 +264,18 @@ "HeaderAddToPlaylist": "Bæta við á Spilunarlista", "HeaderAlert": "Viðvörun", "HeaderAppearsOn": "Birtist á", - "HeaderChannels": "Rásir", "HeaderDetectMyDevices": "Finna tækin mín", "HeaderFavoritePeople": "Uppáhalds Fólk", "HeaderFavoritePlaylists": "Uppáhalds spilunarlistar", - "HeaderFilters": "Síur", - "HeaderForgotPassword": "Gleymt lykilorð", "HeaderForKids": "Fyrir Krakka", "HeaderFrequentlyPlayed": "Oft Spilað", - "HeaderGenres": "Flokkar", "HeaderLatestMusic": "Tónlist, nýlega bætt við", "HeaderMetadataSettings": "Stillingar lýsigagna", "HeaderMedia": "Margmiðlunarsafn", - "HeaderLiveTv": "Sjónvarp í beinni útsendingu", "HeaderLoginFailure": "Innskráning Mistókst", "HeaderMyDevice": "Tækið mitt", "HeaderMusicVideos": "Tónlistarmyndbönd", "HeaderMusicQuality": "Tónlistargæði", - "HeaderMovies": "Kvikmyndir", "HeaderNewDevices": "Ný tæki", "HeaderPasswordReset": "Endurstilla Lykilorð", "HeaderPhotoAlbums": "Myndaalbúm", @@ -337,8 +283,6 @@ "EveryXHours": "Hverjum {0} klukkustundum", "EveryHour": "Hverja klukkustund", "Episode": "Þáttur", - "EnableThemeVideos": "Þema myndbönd", - "EnableThemeSongs": "Þema lög", "EnablePhotos": "Birta myndir", "EnableHardwareEncoding": "Virkja vélbúnaðarkóðun", "LabelScreensaver": "Skjáhvíla:", @@ -380,12 +324,11 @@ "DirectStreamHelp2": "Beint streymi á skrá notar mjög litið vinnsluafl án þess að tapa myndgæðum.", "Descending": "Niður", "DeleteImageConfirmation": "Ertu viss um að þú viljir eyða þessari mynd?", - "DefaultErrorMessage": "Villa varð við vinnslu beiðninnar. Reyndu aftur síðar.", + "ErrorDefault": "Villa varð við vinnslu beiðninnar. Reyndu aftur síðar.", "DeathDateValue": "Dó: {0}", "DatePlayed": "Dagsetning spilað", "DateAdded": "Dagsetning bætt við", "CriticRating": "Einkunn gagnrýnanda", - "CopyStreamURLError": "Villa varð við afritun vefslóðar.", "CopyStreamURLSuccess": "Afrit af vefslóð tókst.", "CopyStreamURL": "Afrita vefslóð streymis", "Continuing": "Áframhaldandi", @@ -395,7 +338,6 @@ "Composer": "Tónskáld", "ClientSettings": "Stillingar biðlara", "ButtonTogglePlaylist": "Spilunarlisti", - "ButtonToggleContextMenu": "Meira", "ButtonSplit": "Skipta", "ButtonStop": "Stöðva", "ButtonResetEasyPassword": "Endurstilla Easy PIN númer", @@ -419,7 +361,6 @@ "SaveChanges": "Vista breytingar", "Save": "Vista", "Saturday": "Laugardagur", - "RunAtStartup": "Keyra við ræsingu", "Rewind": "Spóla til baka", "AlbumArtist": "Höfundur plötu", "OptionHasTrailer": "Sýnishorn", @@ -433,7 +374,7 @@ "ValueOneEpisode": "1 þáttur", "Up": "Upp", "Unplayed": "Óspilað", - "UninstallPluginHeader": "Fjarlægja Viðbót", + "HeaderUninstallPlugin": "Fjarlægja Viðbót", "Tuesday": "Þriðjudagur", "Transcoding": "Umkóðun", "Trailers": "Sýnishorn", @@ -442,21 +383,13 @@ "ThemeVideos": "Þemu myndbönd", "ThemeSongs": "Þemu lög", "TellUsAboutYourself": "Segðu okkur frá sjálfum þér", - "TabUsers": "Notendur", "TabUpcoming": "Væntanlegt", - "TabTranscoding": "Umkóðun", - "TabTrailers": "Sýnishorn", - "TabSuggestions": "Tillögur", - "TabSongs": "Lög", - "TabResumeSettings": "Halda áfram", "TabProfile": "Prófíll", "TabPlugins": "Viðbætur", "TabOther": "Annað", "TabNetworks": "Netkerfi", "TabMyPlugins": "Mínar viðbætur", - "TabMusicVideos": "Tónlistarmyndbönd", "TabMusic": "Tónlist", - "TabMovies": "Kvikmyndir", "PleaseRestartServerName": "Vinsamlegast endurræstu Jellyfin netþjóninn - {0}.", "Previous": "Fyrri", "Premiere": "Frumsýning", @@ -488,10 +421,8 @@ "LabelBitrate": "Bitahraði:", "LabelBirthYear": "Fæðingarár:", "LabelBirthDate": "Fæðingardagur:", - "LabelAudio": "Hljóð", "LabelArtists": "Listamenn:", "LabelAppNameExample": "Dæmi: Sickbeard, Sonarr", - "LabelAll": "Allt", "LabelAccessDay": "Vikudagur:", "Kids": "Krakkar", "Hide": "Fela", @@ -502,10 +433,6 @@ "HeaderVideoQuality": "Myndgæði", "HeaderUsers": "Notendur", "HeaderUser": "Notandi", - "TabMetadata": "Lýsigögn", - "TabGenres": "Flokkar", - "TabFavorites": "Eftirlæti", - "TabEpisodes": "Þættir", "TabDirectPlay": "Bein Spilun", "TabAdvanced": "Ítarlegt", "Sunday": "Sunnudagur", @@ -533,13 +460,11 @@ "LabelDroppedFrames": "Felldir rammar:", "LabelDiscNumber": "Númer disks:", "LabelDeviceDescription": "Lýsing tækis", - "LabelDashboardTheme": "Þema mælaborðs:", "LabelCustomCss": "Sérsniðin CSS:", "LabelCriticRating": "Einkunn gagnrýnanda:", "LabelCorruptedFrames": "Skemmdir rammar:", "LabelCancelled": "Hætt við", "LabelAppName": "Heiti forrits", - "LabelAllowServerAutoRestart": "Leyfa netþjóni að endurræsa sig sjálfkrafa til þess að uppfæra sig", "LabelAllowHWTranscoding": "Leyfa vélbúnaðarumkóðun", "Label3DFormat": "3D snið:", "HeaderIdentification": "Auðkenning", diff --git a/src/strings/it.json b/src/strings/it.json index be5af2f812..f89c8b3a65 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -3,7 +3,6 @@ "AccessRestrictedTryAgainLater": "L'accesso è attualmente limitato. Si prega di riprovare più tardi.", "Actor": "Attore", "Add": "Aggiungi", - "AddItemToCollectionHelp": "Aggiungi elementi alle collezioni ricercandoli e utilizzando il pulsante destro del mouse o tocca i menu per aggiungerli a una raccolta.", "AddToCollection": "Aggiunto alla collezione", "AddToPlayQueue": "Aggiungi alla coda di riproduzione", "AddToPlaylist": "Aggiungi alla playlist", @@ -21,7 +20,7 @@ "AllowHWTranscodingHelp": "Abilita il sintonizzatore per codificare i flussi al volo. Ciò potrebbe contribuire a ridurre la transcodifica richiesta dal server.", "AllowOnTheFlySubtitleExtraction": "Consenti l'estrazione sottotitoli al volo", "AllowOnTheFlySubtitleExtractionHelp": "I sottotitoli incorporati possono essere estratti dai video e consegnati ai client in testo semplice per evitare la transcodifica dei video. In alcuni sistemi questo può richiedere molto tempo e causare un rallentamento della riproduzione video durante il processo di estrazione. Disattivare questa opzione per avere i sottotitoli incorporati con la transcodifica video quando non sono supportati nativamente dal dispositivo client.", - "AllowRemoteAccess": "Abilita connessioni remote a questo Server Jellyfin.", + "AllowRemoteAccess": "Abilita connessioni remote a questo server.", "AllowRemoteAccessHelp": "Se deselezionato, tutte le connessioni remote saranno bloccate.", "AllowedRemoteAddressesHelp": "Elenco separato da virgola di indirizzi IP o voci IP / maschera di rete per reti che potranno connettersi da remoto. Se lasciato vuoto, saranno consentiti tutti gli indirizzi remoti.", "AlwaysPlaySubtitles": "Riproduci sempre", @@ -33,8 +32,6 @@ "AsManyAsPossible": "Tutto il possibile", "Ascending": "Crescente", "AspectRatio": "Rapporto d'Aspetto", - "AttributeNew": "Nuovo", - "AutoBasedOnLanguageSetting": "Auto (basato sull'impostazione della lingua)", "Backdrop": "Sfondo", "Backdrops": "Sfondi", "BirthDateValue": "Nato il: {0}", @@ -44,78 +41,54 @@ "Books": "Libri", "BoxRear": "Box (retro)", "Browse": "Esplora", - "BrowsePluginCatalogMessage": "Sfoglia il catalogo dei Plugins.", + "MessageBrowsePluginCatalog": "Sfoglia il catalogo dei Plugins.", "BurnSubtitlesHelp": "Determina se il server deve imprimere i sottotitoli quando i video vengono convertiti. Evitare ciò migliorerà di molto le prestazioni. Selezionare Auto per imprimere formati basati sull'immagine (VOBSUB, PGS, SUB, IDX, ...) e alcuni sottotitoli ASS o SSA.", - "ButtonAdd": "Aggiungi", "ButtonAddMediaLibrary": "Aggiungi raccolta multimediale", "ButtonAddScheduledTaskTrigger": "Aggiungi operazione", "ButtonAddServer": "Aggiungi server", "ButtonAddUser": "Aggiungi Utente", - "ButtonArrowDown": "Giù", "ButtonArrowLeft": "Sinistra", "ButtonArrowRight": "Destra", - "ButtonArrowUp": "Su", "ButtonAudioTracks": "Tracce Audio", "ButtonBack": "Indietro", "ButtonCancel": "Annulla", "ButtonChangeServer": "Cambia Server", - "ButtonConnect": "Connetti", - "ButtonDelete": "Elimina", - "ButtonDeleteImage": "Elimina immagine", - "ButtonDown": "Giu", - "ButtonEdit": "Modifica", - "ButtonEditImages": "Modifica Immagini", "ButtonEditOtherUserPreferences": "Modifica questo utente di profilo, l'immagine e le preferenze personali.", - "ButtonFilter": "Filtro", "ButtonForgotPassword": "Password Dimenticata", "ButtonFullscreen": "Schermo Intero", "ButtonGotIt": "Ho capito", "ButtonGuide": "Guida", - "ButtonHelp": "Aiuto", - "ButtonLearnMore": "saperne di più", "ButtonLibraryAccess": "Accesso biblioteca", "ButtonManualLogin": "Accesso Manuale", "ButtonMore": "Altro", "ButtonNetwork": "Rete", - "ButtonNew": "Nuovo", "ButtonNextTrack": "Traccia Successiva", - "ButtonOff": "Spento", "ButtonOpen": "Apri", "ButtonParentalControl": "Controllo parentale", "ButtonPause": "Pausa", - "ButtonPlay": "Riproduci", "ButtonPreviousTrack": "Traccia Precedente", "ButtonProfile": "Profilo", "ButtonQuickStartGuide": "Guida rapida", - "ButtonRefresh": "Aggiorna", "ButtonRefreshGuideData": "Aggiorna la guida", "ButtonRemove": "Rimuovi", "ButtonRename": "Rinomina", - "ButtonRepeat": "Ripeti", "ButtonResetEasyPassword": "Resetta codice PIN", "ButtonResetPassword": "Reset Password", "ButtonRestart": "Riavvia", "ButtonResume": "Riprendi", "ButtonRevoke": "Revocare", - "ButtonSave": "Salva", "ButtonScanAllLibraries": "Scansiona Tutte le Librerie", - "ButtonSearch": "Cerca", "ButtonSelectDirectory": "Seleziona cartella", "ButtonSelectServer": "Scegli Server", "ButtonSelectView": "Seleziona vista", "ButtonSend": "Invia", "ButtonSettings": "Impostazioni", - "ButtonShuffle": "Casuale", "ButtonShutdown": "Arresta Server", "ButtonSignIn": "Accedi", "ButtonSignOut": "Esci", - "ButtonSort": "Ordina", "ButtonStart": "Avvio", "ButtonSubmit": "Invia", - "ButtonSubtitles": "Sottotitoli", "ButtonUninstall": "Disinstalla", - "ButtonUp": "Su", - "ButtonViewWebsite": "Visualizza sito web", "ButtonWebsite": "Web", "CancelRecording": "Annulla la registrazione", "CancelSeries": "Annulla Serie TV", @@ -130,7 +103,7 @@ "ColorTransfer": "Trasferimento Colore", "CommunityRating": "Voto del pubblico", "Composer": "Compositore", - "ConfigureDateAdded": "Scegli come determinare la data di aggiunta dal pannello di controllo del Server Jellyfin, nelle impostazioni della Libreria", + "ConfigureDateAdded": "Scegli come determinare la data di aggiunta dal pannello di controllo nelle impostazioni della libreria", "ConfirmDeleteImage": "Elimina immagine?", "ConfirmDeleteItem": "L'eliminazione di questo elemento lo cancellerà sia dal disco che dalla libreria multimediale. Sei sicuro di voler continuare?", "ConfirmDeleteItems": "L'eliminazione di questi elementi li cancellerà sia dal disco che dalla tua libreria multimediale. Sei sicuro di voler continuare?", @@ -145,7 +118,7 @@ "DatePlayed": "Visto il", "DeathDateValue": "Morto: {0}", "Default": "Predefinito", - "DefaultErrorMessage": "Si è verificato un errore durante l'elaborazione della richiesta. Si prega di riprovare più tardi.", + "ErrorDefault": "Si è verificato un errore durante l'elaborazione della richiesta. Si prega di riprovare più tardi.", "DefaultMetadataLangaugeDescription": "Queste sono le tue impostazioni predefinite e possono essere personalizzate per ogni libreria.", "DefaultSubtitlesHelp": "I sottotitoli vengono letti in base agli attributi predefiniti e forzati dai metadati integrati. Le preferenze di lingua sono prese in considerazione quando sono disponibili più opzioni.", "Delete": "Elimina", @@ -161,8 +134,8 @@ "DetectingDevices": "Rilevamento dispositivi", "DeviceAccessHelp": "Si applica solo ai dispositivi che possono essere identificati univocamente e non impedirà l'accesso dal browser. Filtrare l'accesso ai dispositivi dell'utente impedirà di usare nuovi dispositivi fino a quando non saranno stati approvati qui.", "DirectPlaying": "Riproduzione Diretta", - "DirectStreamHelp1": "Il file multimediale è compatibile con il dispositivo per quanto riguarda la risoluzione e il tipo di supporto (H. 264, AC3, ecc), ma è in un contenitore file incompatibile (mkv, avi, wmv, ecc). Il video sarà ri-confezionato al volo prima di streammarlo sul dispositivo.", - "DirectStreamHelp2": "Lo Streaming in Diretta di un file utilizza poco il processore senza alcuna perdita di qualità video.", + "DirectStreamHelp1": "Il file multimediale è compatibile con il dispositivo per quanto riguarda la risoluzione e il tipo di supporto (H. 264, AC3, ecc), ma è in un contenitore file incompatibile (mkv, avi, wmv, ecc). Il video sarà quindi reimpacchettato al volo prima dell'invio al dispositivo.", + "DirectStreamHelp2": "Lo streaming in diretta utilizza poco processore e con poca perdita di qualità video.", "DirectStreaming": "Streaming Diretto", "Director": "Regista", "Directors": "Registi", @@ -186,7 +159,6 @@ "EditImages": "Modifica immagini", "EditMetadata": "Modifica metadati", "EditSubtitles": "Modifica i sottotitoli", - "EnableBackdrops": "Abilita gli Sfondi", "EnableBackdropsHelp": "Gli sfondi verranno mostrati sullo sfondo di alcune pagine mentre visualizzi la libreria.", "EnableCinemaMode": "Modalità cinema", "EnableColorCodedBackgrounds": "Sfondi a colori", @@ -200,20 +172,18 @@ "EnablePhotosHelp": "Le immagini saranno rilevate e visualizzate accanto ad altri file multimediali.", "EnableStreamLooping": "Auto-loop streaming in diretta", "EnableStreamLoopingHelp": "Abilita questo se gli streaming in diretta contengono solo pochi secondi di dati e devono essere costantemente richiesti. L'abilitazione di questa funzione quando non è servita può causare problemi.", - "EnableThemeSongs": "Canzoni a tema", "EnableThemeSongsHelp": "Le canzoni a tema saranno riprodotte mentre visualizzi la tua libreria.", - "EnableThemeVideos": "Video a tema", "EnableThemeVideosHelp": "Riproduzione dei video a tema sullo sfondo mentre visualizzi la tua libreria.", "Ended": "Finito", "EndsAtValue": "Finirà alle {0}", "Episodes": "Episodi", "ErrorAddingListingsToSchedulesDirect": "C'è stato un errore nell'aggiunta della tua lista all'account Schedules Direct.\nSchedules Direct permette solo un numero limitato di selezioni per account. Potresti aver bisogno di accedere al sito Schedules Direct e rimuoverne alcune prima di procedere.", - "ErrorAddingMediaPathToVirtualFolder": "C'è stato un errore durante l'aggiunta del percorso. Per favore controlla che il percorso sia valido, e che Jellyfin Server abbia l'accesso alla posizione indicata.", + "ErrorAddingMediaPathToVirtualFolder": "C'è stato un errore durante l'aggiunta del percorso. Per favore controlla che il percorso sia valido, e che Jellyfin abbia l'accesso alla posizione indicata.", "ErrorAddingTunerDevice": "Si è verificato un errore durante l'aggiunta del sintonizzatore. Si prega di assicurarsi che sia accessibile e riprovare.", "ErrorAddingXmlTvFile": "Si è verificato un errore durante l'accesso al file XMLTV. Si prega di assicurarsi che il file esista e riprovare.", - "ErrorDeletingItem": "Si è verificato un errore durante l'eliminazione dell'elemento da Jellyfin Server. Verifica che Jellyfin Server abbia accesso in scrittura sulla cartella multimediale e riprova.", + "ErrorDeletingItem": "Si è verificato un errore durante l'eliminazione dell'elemento dal server. Verifica che Jellyfin abbia accesso in scrittura sulla cartella multimediale e riprova.", "ErrorGettingTvLineups": "Si è verificato un errore durante il download delle formazioni TV. Assicurarsi che le vostre informazioni siano corrette e riprovare.", - "ErrorMessageStartHourGreaterThanEnd": "Il tempo della fine deve essere maggiore del tempo di avvio.", + "ErrorStartHourGreaterThanEnd": "Il tempo della fine deve essere maggiore del tempo di avvio.", "ErrorPleaseSelectLineup": "Si prega di selezionare una scaletta e riprovare. Se non ci sono formazioni disponibili, si prega allora di verificare che il vostro nome utente, password, e il codice postale siano corretti.", "ErrorSavingTvProvider": "Si è verificato un errore durante il salvataggio del fornitore di TV. Si prega di assicurarsi che sia accessibile e riprovare.", "EveryNDays": "Ogni {0} giorni", @@ -256,30 +226,24 @@ "HeaderActiveDevices": "Dispositivi Connessi", "HeaderActiveRecordings": "Registrazioni Attive", "HeaderActivity": "Attività", - "HeaderAddScheduledTaskTrigger": "Aggiungi operazione", "HeaderAddToCollection": "Aggiungi ad una Collezione", "HeaderAddToPlaylist": "Aggiungi alla Playlist", "HeaderAddUpdateImage": "Aggiungi/aggiorna Immagine", - "HeaderAddUser": "Aggiungi utente", "HeaderAdditionalParts": "Parti addizionali", "HeaderAdmin": "Admin", "HeaderAlbumArtists": "Artisti degli Album", - "HeaderAlbums": "Album", "HeaderAlert": "Avviso", "HeaderAllowMediaDeletionFrom": "Abilita Eliminazione Media Da", "HeaderApiKey": "Chiave API", "HeaderApiKeys": "Chiavi API", - "HeaderApiKeysHelp": "Le Applicazioni esterne devono avere una chiave API per comunicare con il Server Jellyfin. Le chiavi sono emesse accedendo con un account Jellyfin, o fornendo manualmente una chiave all'applicazione.", + "HeaderApiKeysHelp": "Le Applicazioni esterne devono avere una chiave API per comunicare con il server. Le chiavi sono emesse accedendo con un qualsiasi account, o fornendo manualmente una chiave all'applicazione.", "HeaderAudioBooks": "Audiolibri", "HeaderAudioSettings": "Impostazioni audio", - "HeaderAutomaticUpdates": "Aggiornamenti Automatici", "HeaderBlockItemsWithNoRating": "Blocca elementi sconosciuti o senza informazioni:", - "HeaderBooks": "Libri", "HeaderBranding": "Personalizza", "HeaderCancelRecording": "Annulla la Registrazione", "HeaderCancelSeries": "Annulla Serie TV", "HeaderChannelAccess": "Accesso canali", - "HeaderChannels": "Canali", "HeaderChapterImages": "Immagini Capitolo", "HeaderCodecProfile": "Profilo Codec", "HeaderCodecProfileHelp": "I Profili Codec indicano i limiti di un dispositivo durante la riproduzione di codec specifici. Se una limitazione corrisponde i media saranno sottoposti a transcodifica, anche se il codec è configurato per la riproduzione diretta.", @@ -307,23 +271,17 @@ "HeaderDevices": "Dispositivi", "HeaderDirectPlayProfile": "Profilo Direct Play", "HeaderDirectPlayProfileHelp": "Aggiungere \"profili riproduzione diretta\" per indicare i formati che il dispositivo è in grado di gestire in modo nativo.", - "HeaderDisplay": "Schermo", "HeaderDownloadSync": "Scarica & Sincronizza", "HeaderEasyPinCode": "Codice pin semplificato", "HeaderEditImages": "Modifica Immagini", "HeaderEnabledFields": "Campi Abilitati", "HeaderEnabledFieldsHelp": "Deseleziona un campo per bloccarlo ed impedire che venga modificato.", - "HeaderEpisodes": "Episodi", "HeaderError": "Errore", "HeaderExternalIds": "ID esterni:", "HeaderFeatureAccess": "Accesso alle funzionalità", - "HeaderFeatures": "Caratteristiche", "HeaderFetchImages": "Identifica Immagini:", - "HeaderFilters": "Filtri", "HeaderForKids": "Per Bambini", - "HeaderForgotPassword": "Password dimenticata", "HeaderFrequentlyPlayed": "Visti di frequente", - "HeaderGenres": "Generi", "HeaderGuideProviders": "Provider Guida", "HeaderHttpHeaders": "Header HTTP", "HeaderIdentification": "Identificazione", @@ -332,7 +290,6 @@ "HeaderImageSettings": "Impostazioni Immagini", "HeaderInstall": "Installa", "HeaderInstantMix": "Mix Istantaneo", - "HeaderItems": "Elementi", "HeaderKeepRecording": "Mantieni la registrazione", "HeaderKeepSeries": "Mantieni Serie TV", "HeaderKodiMetadataHelp": "Jellyfin include il supporto nativo per i file metadati NFO. Per attivare o disattivare i metadati NFO, utilizzare la scheda Metadati per configurare le opzioni per i tipi di supporto.", @@ -346,15 +303,11 @@ "HeaderLibraryFolders": "Cartelle Libreria", "HeaderLibraryOrder": "Ordine Libreria", "HeaderLibrarySettings": "Impostazioni della Libreria", - "HeaderLiveTV": "Diretta TV", - "HeaderLiveTv": "Diretta TV", "HeaderLiveTvTunerSetup": "Configura Ricevitore TV", "HeaderLoginFailure": "Errore di accesso", "HeaderMediaFolders": "Cartelle dei media", - "HeaderMediaInfo": "Informazioni Media", "HeaderMetadataSettings": "Impostazioni Metadati", "HeaderMoreLikeThis": "Simili a questo", - "HeaderMovies": "Film", "HeaderMusicQuality": "Qualità Musica", "HeaderMusicVideos": "Video Musicali", "HeaderMyDevice": "Il Mio Dispositivo", @@ -363,14 +316,12 @@ "HeaderNewApiKey": "Nuova Chiave API", "HeaderNewDevices": "Nuovi Dispositivi", "HeaderNextEpisodePlayingInValue": "Il prossimo Episodio verrà riprodotto in {0}", - "HeaderNextUp": "Prossimo", "HeaderNextVideoPlayingInValue": "Il prossimo Video verrà riprodotto in {0}", "HeaderOnNow": "In onda ora", "HeaderOtherItems": "Altri elmenti", "HeaderParentalRatings": "Valutazioni genitori", "HeaderPasswordReset": "Reset della Password", "HeaderPaths": "Percorsi", - "HeaderPeople": "Persone", "HeaderPhotoAlbums": "Album foto", "HeaderPinCodeReset": "Resetta il codice PIN", "HeaderPlayAll": "Riproduci Tutti", @@ -382,7 +333,7 @@ "HeaderPreferredMetadataLanguage": "Lingua Preferita per i Metadati", "HeaderProfile": "Profilo", "HeaderProfileInformation": "Informazioni sul profilo", - "HeaderProfileServerSettingsHelp": "Questi valori controllano come il Server Jellyfin si presenterà ad un dispositivo.", + "HeaderProfileServerSettingsHelp": "Questi valori controllano come il server si presenterà ai client.", "HeaderRecentlyPlayed": "Visti di recente", "HeaderRecordingOptions": "Opzioni di Registrazione", "HeaderRecordingPostProcessing": "Post-processing Registrazione", @@ -395,26 +346,23 @@ "HeaderRevisionHistory": "Cronologia delle revisioni", "HeaderRunningTasks": "Operazioni in corso", "HeaderScenes": "Scene", - "HeaderSchedule": "Programmazione", "HeaderSeasons": "Stagioni", "HeaderSecondsValue": "{0} Secondi", "HeaderSelectCertificatePath": "Seleziona il percorso del Certificato", "HeaderSelectMetadataPath": "Selezionare Percorso Metadati", - "HeaderSelectMetadataPathHelp": "Sfoglia o inserire il percorso in cui vuoi archiviare i metadati. La cartella deve essere scrivibile.", + "HeaderSelectMetadataPathHelp": "Sfoglia o inserisci il percorso da usare per archiviare i metadati. La cartella deve essere scrivibile.", "HeaderSelectPath": "Seleziona Percorso", "HeaderSelectServer": "Scegli Server", "HeaderSelectServerCachePath": "Seleziona percorso Cache Server", "HeaderSelectServerCachePathHelp": "Sfoglia o immetti il percorso da utilizzare per i file di cache server. La cartella deve essere scrivibile.", "HeaderSelectTranscodingPath": "Selezionare Percorso Temporaneo Transcodifica", - "HeaderSelectTranscodingPathHelp": "Sfoglia o immettere il percorso da utilizzare per la transcodifica dei file temporanei. La cartella deve essere scrivibile.", + "HeaderSelectTranscodingPathHelp": "Sfoglia o inserisci il percorso da utilizzare per la transcodifica dei file. La cartella deve essere scrivibile.", "HeaderSendMessage": "Invia un messaggio", - "HeaderSeries": "Serie", "HeaderSeriesOptions": "Impostazioni Serie TV", "HeaderSeriesStatus": "Stato Serie TV", "HeaderServerSettings": "Impostazioni server", "HeaderSettings": "Impostazioni", "HeaderSetupLibrary": "Imposta le tue librerie multimediali", - "HeaderShutdown": "Spegni", "HeaderSortBy": "Ordina per", "HeaderSortOrder": "Ordinamento", "HeaderSpecialEpisodeInfo": "Informazioni Episodio Speciale", @@ -428,7 +376,6 @@ "HeaderSubtitleProfiles": "Profili sottotitoli", "HeaderSubtitleProfilesHelp": "Profili sottotitoli descrivono i formati di sottotitoli supportati dal dispositivo.", "HeaderSystemDlnaProfiles": "Profili di sistema", - "HeaderTags": "Tag", "HeaderTaskTriggers": "Operazioni Pianificate", "HeaderThisUserIsCurrentlyDisabled": "Questo utente è al momento disabilitato", "HeaderTracks": "Traccia", @@ -449,7 +396,6 @@ "HeaderXmlDocumentAttributes": "Attributi Documento Xml", "HeaderXmlSettings": "Impostazioni Xml", "HeaderYears": "Anni", - "HeadersFolders": "Cartella", "Help": "Aiuto", "Hide": "Nascondi", "HideWatchedContentFromLatestMedia": "Nascondi i contenuti già visti dagli Ultimi Media", @@ -457,8 +403,8 @@ "HttpsRequiresCert": "Per abilitare le connessioni sicure, dovrai fornire un certificato SSL affidabile, come Let's Encrypt. Per favore o fornisci un certificato, o disabilita le connessioni sicure.", "Identify": "Identifica", "Images": "Immagini", - "ImportFavoriteChannelsHelp": "Se abilitata, solo i canali che sono contrassegnati come preferiti sul dispositivo di sintonizzazione verranno importati.", - "ImportMissingEpisodesHelp": "Se abilitato, le informazioni relative agli episodi mancanti saranno importate nel database di Jellyfin e mostrate all'interno di Serie e Stagioni. Questo può causare scansioni della libreria più lente.", + "ImportFavoriteChannelsHelp": "Solo i canali che sono contrassegnati come preferiti sul dispositivo di sintonizzazione verranno importati.", + "ImportMissingEpisodesHelp": "Le informazioni relative agli episodi mancanti saranno importate nel database e mostrate all'interno di Serie e Stagioni. Questo può causare scansioni della libreria più lente.", "InstallingPackage": "Installazione di {0} (versione {1})", "InstantMix": "Mix istantaneo", "ItemCount": "{0} elementi", @@ -481,23 +427,20 @@ "LabelAlbumArtMaxWidthHelp": "Risoluzione massima copertina album inviata tramite upnp:albumArtURI.", "LabelAlbumArtPN": "Copertine Album PN:", "LabelAlbumArtists": "Artisti album:", - "LabelAll": "Tutti", "LabelAllowHWTranscoding": "Consenti transcodifica hardware", - "LabelAllowServerAutoRestart": "Consenti al server di Riavviarsi automaticamente per applicare gli aggiornamenti", - "LabelAllowServerAutoRestartHelp": "Il server si Riavvierà solamente quando nessun utente è connesso.", "LabelAllowedRemoteAddresses": "Filtro indirizzo IP Remoto:", "LabelAllowedRemoteAddressesMode": "Modalità filtro indirizzo IP remoto:", "LabelAppName": "Nome app", "LabelAppNameExample": "Esempio: Sickbeart, Sonarr", "LabelArtists": "Artisti:", - "LabelArtistsHelp": "Separa valori multipli usando ;", + "LabelArtistsHelp": "Separa più artisti usando il simbolo ;", "LabelAudioLanguagePreference": "Lingua audio preferita:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Aggiorna automaticamente i metadati da Internet:", "LabelBindToLocalNetworkAddress": "Assegna ad indirizzo di rete locale:", - "LabelBindToLocalNetworkAddressHelp": "Opzionale. Sovrascrivere l'indirizzo IP locale per associare il server http a. Se lasciato vuoto, il server verrà associato a tutti gli indirizzi disponibili. Modificare questo valore richiede di riavviare Jellyfin Server.", + "LabelBindToLocalNetworkAddressHelp": "Sovrascrive l'indirizzo IP locale del server HTTP. Se lasciato vuoto, il server verrà associato a tutti gli indirizzi disponibili. Modificare questo valore richiede il riavvio.", "LabelBirthDate": "Data di nascita:", "LabelBirthYear": "Anno di nascita:", - "LabelBlastMessageInterval": "Intervallo messaggi di presenza (secondi)", + "LabelBlastMessageInterval": "Intervallo messaggi di presenza", "LabelBlastMessageIntervalHelp": "Determina la durata in secondi fra i messaggi \"blast alive\".", "LabelBlockContentWithTags": "Blocco degli elementi con le etichette:", "LabelBurnSubtitles": "Applica sottotitoli:", @@ -516,14 +459,12 @@ "LabelCustomCertificatePath": "Percorso personalizzato certificato SSL:", "LabelCustomCertificatePathHelp": "Percorso del file PKCS #12 contenente il certificato e la chiave private per abilitare il supporto TLS in un dominio personalizzato.", "LabelCustomCss": "CSS Personalizzato:", - "LabelCustomCssHelp": "Applica il tuo stile personale all'interfaccia web.", - "LabelCustomDeviceDisplayName": "Nome da visualizzare:", + "LabelCustomCssHelp": "Applica il tuo stile personalizzato all'interfaccia web.", "LabelCustomDeviceDisplayNameHelp": "Fornire un nome di visualizzazione personalizzato o lasciare vuoto per utilizzare il nome riportato dal dispositivo.", "LabelCustomRating": "Voto personalizzato:", - "LabelDashboardTheme": "Tema dashboard del server:", "LabelDateAdded": "Aggiunto il:", "LabelDateAddedBehavior": "Data di comportamento per i nuovi contenuti:", - "LabelDateAddedBehaviorHelp": "Se un valore di metadati è presente sarà sempre utilizzato prima una di queste opzioni.", + "LabelDateAddedBehaviorHelp": "Se un valore di metadati è presente sarà sempre utilizzato prima di una di queste opzioni.", "LabelDateTimeLocale": "Data locale:", "LabelDay": "Giorno:", "LabelDeathDate": "Anno di morte:", @@ -535,7 +476,6 @@ "LabelDiscNumber": "Numero disco:", "LabelDisplayLanguage": "Lingua di visualizzazione:", "LabelDisplayLanguageHelp": "La traduzione di Jellyfin è un progetto attivo.", - "LabelDisplayMissingEpisodesWithinSeasons": "Visualizza gli episodi mancanti nelle stagioni", "LabelDisplayMode": "Modalità di visualizzazione:", "LabelDisplayName": "Nome visualizzato:", "LabelDisplayOrder": "Ordine di visualizzazione:", @@ -552,8 +492,8 @@ "LabelEnableAutomaticPortMapHelp": "Automaticamente inoltra le porte pubbliche del router sul quelle locali del server tramite UPnP. Potrebbe non funzionare con alcuni modelli di router. I cambiamenti non saranno applicati fino ad il riavvio del server.", "LabelEnableBlastAliveMessages": "Invia segnale di presenza", "LabelEnableBlastAliveMessagesHelp": "Attivare questa opzione se il server non viene rilevato in modo affidabile da altri dispositivi UPnP in rete.", - "LabelEnableDlnaClientDiscoveryInterval": "Intervallo di ricerca dispositivi (secondi)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina la durata in secondi tra le ricerche SSDP effettuate da Jellyfin.", + "LabelEnableDlnaClientDiscoveryInterval": "Intervallo di ricerca dei client", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina la durata in secondi tra le ricerche SSDP.", "LabelEnableDlnaDebugLogging": "Abilita il debug del DLNA", "LabelEnableDlnaDebugLoggingHelp": "Crea file di grandi dimensioni e dovrà essere usato solo quando necessario per risolvere problemi.", "LabelEnableDlnaPlayTo": "Abilita DLNA su", @@ -562,7 +502,7 @@ "LabelEnableDlnaServerHelp": "Consente ai dispositivi UPnP nella tua rete di sfogliare i contenuti e riprodurli.", "LabelEnableHardwareDecodingFor": "Abilita la decodifica hardware per:", "LabelEnableRealtimeMonitor": "Abilita monitoraggio in tempo reale", - "LabelEnableRealtimeMonitorHelp": "Le modifiche saranno applicate immediatamente, sui file system supportati.", + "LabelEnableRealtimeMonitorHelp": "Le modifiche saranno applicate immediatamente sui file system supportati.", "LabelEnableSingleImageInDidlLimit": "Limitato a singola immagine incorporata", "LabelEnableSingleImageInDidlLimitHelp": "Alcuni dispositivi non renderanno correttamente se più immagini sono incorporati all'interno didl.", "LabelEndDate": "Data di fine:", @@ -577,7 +517,7 @@ "LabelForgotPasswordUsernameHelp": "Inserisci il tuo nome utente, se te lo ricordi.", "LabelFormat": "Formato:", "LabelFriendlyName": "Nome Condiviso:", - "LabelServerNameHelp": "Questo nome è usato per identificare il server e avrà come default il nome del pc.", + "LabelServerNameHelp": "Questo nome è usato per identificare il server e avrà come default l'hostname del server.", "LabelGroupMoviesIntoCollections": "Raggruppa i film nelle collezioni", "LabelGroupMoviesIntoCollectionsHelp": "Quando si visualizzano le liste di film, quelli appartenenti ad una collezione saranno visualizzati come un elemento raggruppato.", "LabelH264Crf": "CRF di codifica H264:", @@ -587,7 +527,7 @@ "LabelHomeNetworkQuality": "Qualità della rete domestica:", "LabelHomeScreenSectionValue": "Pagina iniziale Sezione {0}:", "LabelHttpsPort": "Porta HTTPS locale:", - "LabelHttpsPortHelp": "Numero di porta TCP da associare al server HTTPS di Jellyfin.", + "LabelHttpsPortHelp": "Porta TCP da associare al server HTTPS.", "LabelIconMaxHeight": "Altezza icona massima:", "LabelIconMaxHeightHelp": "Risoluzione massima delle icone inviate tramite upnp:icon.", "LabelIconMaxWidth": "Larghezza massima icona:", @@ -615,7 +555,7 @@ "LabelLanguage": "Lingua:", "LabelLineup": "Allineare:", "LabelLocalHttpServerPortNumber": "Porta HTTP locale:", - "LabelLocalHttpServerPortNumberHelp": "Numero di porta TCP da associare al server HTTP di Jellyfin.", + "LabelLocalHttpServerPortNumberHelp": "Porta TCP da associare al server HTTP.", "LabelLockItemToPreventChanges": "Blocca questo elemento per impedire modifiche future", "LabelLoginDisclaimer": "Avviso Login:", "LabelLoginDisclaimerHelp": "Un messaggio che verrà visualizzato nella parte inferiore della pagina di accesso.", @@ -655,7 +595,7 @@ "LabelMovieCategories": "Categorie film:", "LabelMoviePrefix": "Prefisso film:", "LabelMoviePrefixHelp": "Se un prefisso viene applicato ai titoli di film, inseriscilo qui in modo che il server possa gestirlo correttamente.", - "LabelMovieRecordingPath": "Percorso di registrazione film (opzionale):", + "LabelMovieRecordingPath": "Percorso di registrazione film:", "LabelMusicStreamingTranscodingBitrate": "Musica trascodifica bitrate:", "LabelMusicStreamingTranscodingBitrateHelp": "Specifica il massimo bitrate per lo streaming musicale.", "LabelName": "Nome:", @@ -663,13 +603,12 @@ "LabelNewPassword": "Nuova password:", "LabelNewPasswordConfirm": "Conferma nuova password:", "LabelNewsCategories": "Categorie notizie:", - "LabelNext": "Prossimo", "LabelNotificationEnabled": "Abilita questa notifica", "LabelNumber": "Numero:", "LabelNumberOfGuideDays": "Numero di giorni per i quali scaricare i dati della guida:", "LabelNumberOfGuideDaysHelp": "Scaricando più giorni si avrà la possibilità di pianificare in anticipo più programmi e vedere più liste, ma il tempo di download si allungherà. 'Auto': MB sceglierà automaticamente in base al numero di canali.", - "LabelOptionalNetworkPath": "Cartella condivisa (Opzionale):", - "LabelOptionalNetworkPathHelp": "Se questa cartella è condivisa sulla rete, fornendo il percorso di condivisione di rete si può consentire alle applicazioni Jellyfin su altri dispositivi di accedere direttamente ai file multimediali. Ad esempio {0} oppure {1}.", + "LabelOptionalNetworkPath": "Cartella di rete condivisa:", + "LabelOptionalNetworkPathHelp": "Se questa cartella è condivisa sulla rete, fornendo il percorso di condivisione di rete si può consentire ai client su altri dispositivi di accedere direttamente ai file multimediali. Ad esempio {0} oppure {1}.", "LabelOriginalAspectRatio": "Aspetto originale:", "LabelOriginalTitle": "Titolo originale:", "LabelOverview": "Trama:", @@ -686,9 +625,7 @@ "LabelPostProcessorArguments": "Argomenti linea di comando del Post-processor:", "LabelPostProcessorArgumentsHelp": "Usa {path} come percorso al file di registrazione.", "LabelPreferredDisplayLanguage": "Lingua preferita visualizzata:", - "LabelPreferredDisplayLanguageHelp": "La traduzione di Jellyfin è un progetto attivo.", "LabelPreferredSubtitleLanguage": "Lingua dei sottotitoli preferita:", - "LabelPrevious": "Precedente", "LabelProfileAudioCodecs": "Codec Audio:", "LabelProfileCodecs": "Codec:", "LabelProfileCodecsHelp": "Separati da virgola. Questo può essere lasciato vuoto da applicare a tutti i codec.", @@ -702,7 +639,6 @@ "LabelPublicHttpPortHelp": "Numero di porta pubblica che dovrebbe essere mappato sulla porta HTTP locale.", "LabelPublicHttpsPort": "Numero porta HTTPS pubblica:", "LabelPublicHttpsPortHelp": "Numero della porta pubblica che dovrebbe essere mappato sulla porta HTTPS locale.", - "LabelReadHowYouCanContribute": "Scopri come puoi contribuire.", "LabelReasonForTranscoding": "Motivo per la transcodifica:", "LabelRecord": "Registra:", "LabelRecordingPath": "Percorso di registrazione predefinito:", @@ -711,7 +647,7 @@ "LabelReleaseDate": "Data di uscita:", "LabelRemoteClientBitrateLimit": "Bitrate limite per lo streaming via internet (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Un limite bitrate per-stream opzionale per tutti i dispositivi di rete. Ciò è utile per impedire ai dispositivi di richiedere un bitrate superiore a quello in grado di gestire la connessione a Internet. Questo può provocare un aumento del carico della CPU sul server per transcodificare i video in volo ad un bitrate inferiore.", - "LabelRuntimeMinutes": "Durata (minuti):", + "LabelRuntimeMinutes": "Durata:", "LabelSaveLocalMetadata": "Salva immagini nelle cartelle multimediali", "LabelSaveLocalMetadataHelp": "Il salvataggio di immagini direttamente nelle cartelle multimediali consentirà di tenerle in un posto dove possono essere facilmente modificati.", "LabelScheduledTaskLastRan": "Ultima esecuzione {0}, taking {1}.", @@ -723,7 +659,7 @@ "LabelSelectVersionToInstall": "Selezionare la versione da installare:", "LabelSendNotificationToUsers": "Invia notifiche a:", "LabelSerialNumber": "Numero di serie", - "LabelSeriesRecordingPath": "Percorso di registrazione serie TV (opzionale):", + "LabelSeriesRecordingPath": "Percorso di registrazione Serie TV:", "LabelSimultaneousConnectionLimit": "Limite stream simultanei:", "LabelSkipBackLength": "Durata salta indietro:", "LabelSkipForwardLength": "Durata salta avanti:", @@ -735,7 +671,6 @@ "LabelSortBy": "Ordina per:", "LabelSortOrder": "Ordinato per:", "LabelSortTitle": "Titolo per ordinamento:", - "LabelSoundEffects": "Effetti sonori:", "LabelSource": "Origine:", "LabelSpecialSeasonsDisplayName": "Nome della stagione speciale:", "LabelSportsCategories": "Categorie sport:", @@ -746,7 +681,6 @@ "LabelSubtitleDownloaders": "Downloader sottotitoli:", "LabelSubtitleFormatHelp": "Esempio: srt", "LabelSubtitlePlaybackMode": "Modalità Sottotitolo:", - "LabelSubtitles": "Sottotitoli", "LabelSupportedMediaTypes": "Tipi di media supportati:", "LabelTVHomeScreen": "Schermata iniziale della modalità TV:", "LabelTagline": "Slogan:", @@ -758,12 +692,9 @@ "LabelTimeLimitHours": "Tempo limite (ore):", "LabelTitle": "Titolo:", "LabelTrackNumber": "Numero traccia:", - "LabelTranscodingAudioCodec": "Codec Audio:", - "LabelTranscodingContainer": "contenitore:", "LabelTranscodingTempPathHelp": "Specifica un percorso personalizzato per la transcodifica dei files utilizzati dai client. Lasciare vuoto per utilizzare l'impostazione predefinita dal server.", "LabelTranscodingThreadCount": "Transcodifica numero di thread:", "LabelTranscodingThreadCountHelp": "Selezionare il numero massimo di thread da utilizzare durante la transcodifica. Ridurre il numero di thread si abbasserà l'utilizzo della CPU, ma può non convertire abbastanza veloce per un'esperienza di riproduzione fluida.", - "LabelTranscodingVideoCodec": "Codec Video:", "LabelTriggerType": "Tipo Evento:", "LabelTunerIpAddress": "Tuner Indirizzo IP:", "LabelTunerType": "Tipo sintonizzatore:", @@ -784,11 +715,10 @@ "LabelXDlnaCapHelp": "Determina il contenuto dell'elemento X_DLNACAP in urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDocHelp": "Determina il contenuto dell'elemento X_DLNACAP nella urn: schemas-DLNA-org: dispositivo 1-0 namespace.", "LabelYear": "Anno:", - "LabelYourFirstName": "Il tuo nome:", "LabelYoureDone": "Hai Finito!", "LabelZipCode": "Cap:", "LabelffmpegPath": "Percorso FFmpeg:", - "LabelffmpegPathHelp": "Il percorso all'applicazione ffmpeg, o alla cartella che la contiene.", + "LabelffmpegPathHelp": "Il percorso dell'applicazione ffmpeg o della cartella che la contiene.", "LanNetworksHelp": "Elenco separato da virgola di indirizzi IP o voci IP / maschera di rete per reti che saranno considerate sulla rete locale quando si applicano restrizioni di larghezza di banda. Se impostato, tutti gli altri indirizzi IP verranno considerati nella rete esterna e saranno soggetti alle limitazioni della larghezza di banda esterna. Se lasciato vuoto, solo la sottorete del server viene considerata nella rete locale.", "Large": "Grande", "LatestFromLibrary": "Ultimi {0}", @@ -834,20 +764,19 @@ "MessageConfirmProfileDeletion": "Sei sicuro di voler cancellare questo profilo?", "MessageConfirmRecordingCancellation": "Cancellare la registrazione?", "MessageConfirmRemoveMediaLocation": "Sei sicuro di voler rimuovere questa posizione?", - "MessageConfirmRestart": "Sei sicuro di voler riavviare il Server Jellyfin?", - "MessageConfirmRevokeApiKey": "Sei sicuro di voler revocare questa chiave api? La connessione dell'applicazione al Server Jellyfin terminerà immediatamente.", + "MessageConfirmRestart": "Sei sicuro di voler riavviare Jellyfin?", + "MessageConfirmRevokeApiKey": "Sei sicuro di voler revocare questa chiave API? La connessione dell'applicazione al Server terminerà immediatamente.", "MessageConfirmShutdown": "Sei sicuro di voler spegnere il server?", "MessageContactAdminToResetPassword": "Si prega di contattare l'amministratore di sistema per reimpostare la password.", "MessageCreateAccountAt": "Crea un account a {0}", "MessageDeleteTaskTrigger": "Sei sicuro di voler cancellare questo evento?", - "MessageDirectoryPickerBSDInstruction": "Per BSD, potrebbe essere necessario per configurare le unità all'interno della vostra prigione FreeNAS al fine di permettere ricamato accedervi.", + "MessageDirectoryPickerBSDInstruction": "Per BSD, potrebbe essere necessario configurare le unità all'interno della vostra FreeNAS Jail per permettere A Jellyfin di accedervi.", "MessageDirectoryPickerLinuxInstruction": "Per Linux su Arch Linux, CentOS, Debian, Fedora, openSUSE o Ubuntu, è necessario concedere all'utente del servizio almeno l'accesso alle posizioni di archiviazione.", "MessageDownloadQueued": "Scaricamento programmato.", "MessageEnablingOptionLongerScans": "L'abilitazione di questa opzione può rallentare significativamente le scansioni della libreria.", "MessageFileReadError": "Si è verificato un errore durante la lettura del file. Si prega di riprovare.", "MessageForgotPasswordFileCreated": "Il seguente file è stato creato sul server e contiene le istruzioni su come procedere:", "MessageForgotPasswordInNetworkRequired": "Riprova all'interno della rete domestica per avviare il processo di reimpostazione della password.", - "MessageInstallPluginFromApp": "Questo plugin deve essere installato dall'app in cui vuoi farlo funzionare.", "MessageInvalidForgotPasswordPin": "É stato inserito un codice pin invalido o scaduto . Riprova.", "MessageInvalidUser": "Utente o password errato. Riprova.", "MessageItemSaved": "Elemento salvato.", @@ -863,15 +792,14 @@ "MessagePleaseEnsureInternetMetadata": "Assicurarsi che il download dei metadati Internet sia abilitato.", "MessagePleaseWait": "Per favore attendi. La procedura potrebbe impiegare qualche minuto.", "MessagePluginConfigurationRequiresLocalAccess": "Per configurare questo plugin si prega di accedere al proprio server locale direttamente.", - "MessagePluginInstallDisclaimer": "I plugin creati dai membri della comunità Jellyfin sono un ottimo modo per migliorare l'esperienza di Jellyfin con funzionalità e vantaggi aggiuntivi. Prima di installare, si prega di notare gli effetti che possono avere sul tuo server Jellyfin, come le scansioni più lunghe della libreria, l'elaborazione di sfondo aggiuntiva e la stabilità del sistema diminuita.", + "MessagePluginInstallDisclaimer": "I plugin creati dai membri della comunità sono un ottimo modo per migliorare l'esperienza con funzionalità e vantaggi aggiuntivi. Prima di installarli, si prega di notare gli effetti che possono avere sul tuo Server, come le scansioni più lunghe della libreria, l'elaborazione di sfondo aggiuntiva e la stabilità del sistema diminuita.", "MessageReenableUser": "Guarda in basso per ri-abilitare", - "MessageSettingsSaved": "Settaggi salvati.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "I seguenti percorsi ai file multimediali saranno rimossi dalla tua libreria:", "MessageUnableToConnectToServer": "Non siamo in grado di connettersi al server selezionato al momento. Per favore assicurati che sia in esecuzione e riprova.", "MessageUnsetContentHelp": "Il contenuto verrà visualizzato come pianura cartelle. Per ottenere i migliori risultati utilizzare il gestore di metadati per impostare i tipi di contenuto di sottocartelle.", "MessageYouHaveVersionInstalled": "Attualmente hai la versione {0} installato.", "MetadataManager": "Gestisci Metadati", - "MetadataSettingChangeHelp": "Modificare le impostazioni dei metadati influenzerà il nuovo contenuto aggiunto in avanti. Per aggiornare i contenuti esistenti, aprire la schermata dei dettagli e fare click sul pulsante di aggiornamento oppure eseguire aggiornamenti di massa utilizzando il gestore di metadati.", + "MetadataSettingChangeHelp": "Modificare le impostazioni dei metadati influenzerà i futuri contenuti. Per aggiornare i contenuti esistenti, aprire la schermata dei dettagli e fare click sul pulsante di aggiornamento oppure eseguire aggiornamenti di massa utilizzando il gestore di metadati.", "MinutesAfter": "minuti dopo", "MinutesBefore": "minuti prima", "Monday": "Lunedì", @@ -893,15 +821,14 @@ "News": "Notizie", "Next": "Prossimo", "NoNewDevicesFound": "Non sono stati trovati nuovi dispositivi. Per aggiungere un nuovo sintonizzatore, chiudere questa finestra di dialogo e immettere manualmente le informazioni sul dispositivo.", - "NoNextUpItemsMessage": "Trovato niente. Inizia a guardare i tuoi programmi!", - "NoPluginConfigurationMessage": "Questo Plugin non ha impostazioni da configurare.", + "MessageNoNextUpItems": "Trovato niente. Inizia a guardare i tuoi programmi!", + "MessageNoPluginConfiguration": "Questo Plugin non ha impostazioni da configurare.", "NoSubtitleSearchResultsFound": "Nessun risultato.", - "NoSubtitles": "Nessuno", "NoSubtitlesHelp": "I sottotitoli non verranno caricati per impostazione predefinita.Possono essere ancora caricati manualmente durante la riproduzione.", "None": "Nessuno", "Normal": "Normale", "NumLocationsValue": "{0} cartelle", - "Off": "Spento", + "Off": "No", "OneChannel": "Un canale", "OnlyForcedSubtitles": "Solo forzati", "OnlyForcedSubtitlesHelp": "Solo i sottotitoli contrassegnati come forzati saranno caricati.", @@ -916,7 +843,7 @@ "OptionAllowLinkSharingHelp": "Solo le pagine web contenente informazioni sui media sono condivise. I file media non vengono mai condivisi pubblicamente. Le condivisioni scadono dopo {0} giorni.", "OptionAllowManageLiveTv": "Consenti la gestione delle registrazioni TV", "OptionAllowMediaPlayback": "Consenti la riproduzione dei media", - "OptionAllowMediaPlaybackTranscodingHelp": "Limitare l'accesso alla transcodifica può causare errori di riproduzione nelle applicazioni Jellyfin a causa di formati multimediali non supportati.", + "OptionAllowMediaPlaybackTranscodingHelp": "Limitare l'accesso alla transcodifica può causare errori di riproduzione a causa di formati multimediali non supportati.", "OptionAllowRemoteControlOthers": "Consenti il controllo remoto di altri utenti", "OptionAllowRemoteSharedDevices": "Consenti il controllo remoto dei dispositivi condivisi", "OptionAllowRemoteSharedDevicesHelp": "I dispositivi DLNA sono considerati condivisi fino a quando un utente non inizia a controllarli.", @@ -928,7 +855,7 @@ "OptionAscending": "Crescente", "OptionAuto": "Automatico", "OptionAutomaticallyGroupSeries": "Fondi automaticamente le serie sparse su più cartelle", - "OptionAutomaticallyGroupSeriesHelp": "Se abilitato, le serie distribuite in più cartelle di questa libreria saranno automaticamente combinate in un'unica serie.", + "OptionAutomaticallyGroupSeriesHelp": "Le Serie TV distribuite su più cartelle di questa libreria saranno automaticamente combinate in un'unica Serie TV.", "OptionBlockBooks": "Libri", "OptionBlockChannelContent": "Contenuto di Canali Internet", "OptionBlockLiveTvChannels": "Canali TV in onda", @@ -947,14 +874,14 @@ "OptionDatePlayed": "Visto il", "OptionDescending": "Decrescente", "OptionDisableUser": "Disabilita questo utente", - "OptionDisableUserHelp": "Se disabilitato, il server non sarà disponibile per questo utente. Le connessioni esistenti verranno terminate.", + "OptionDisableUserHelp": "Il server non sarà disponibile per questo utente. Le connessioni esistenti verranno terminate.", "OptionDislikes": "Non mi piace", "OptionDisplayFolderView": "Visualizza cartelle come normali cartelle dei media", "OptionDisplayFolderViewHelp": "Visualizza le cartelle accanto alle librerie multimediali. Questo può essere utile se si desidera avere una vista di cartelle semplici.", "OptionDownloadBackImage": "Indietro", "OptionDownloadDiscImage": "Disco", "OptionDownloadImagesInAdvance": "Scarica preventivamente le immagini", - "OptionDownloadImagesInAdvanceHelp": "Di default, la maggior parte delle immagini vengono scaricate solo quando richieste da un'applicazione Jellyfin. Abilita questa opzione per scaricare tutte le immagini in anticipo, quando nuovi file multimediali vengono importati. Ciò può causare scansioni delle librerie molto più lunghe.", + "OptionDownloadImagesInAdvanceHelp": "Di default, la maggior parte delle immagini vengono scaricate solo quando richieste dai client. Abilita questa opzione per scaricare tutte le immagini in anticipo, quando nuovi file multimediali vengono importati. Ciò può causare scansioni delle librerie molto più lunghe.", "OptionDownloadMenuImage": "Menù", "OptionDownloadPrimaryImage": "Locandina", "OptionDownloadThumbImage": "Foto", @@ -974,7 +901,6 @@ "OptionExternallyDownloaded": "Download Esterno", "OptionExtractChapterImage": "Abilita estrazione dell'immagine dei capitoli", "OptionFavorite": "Preferiti", - "OptionFriday": "Venerdì", "OptionHasSpecialFeatures": "Contenuti speciali", "OptionHasSubtitles": "Sottotitoli", "OptionHasThemeSong": "Sigla", @@ -984,21 +910,19 @@ "OptionHlsSegmentedSubtitles": "HLS sottotitoli segmentati", "OptionHomeVideos": "Foto", "OptionIgnoreTranscodeByteRangeRequests": "Ignorare le richieste di intervallo di byte di trascodifica", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Se abilitata, queste richieste saranno onorate, ma ignorano l'intervallo di byte.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Queste richieste saranno onorate, ma ignoreranno l'intervallo di byte.", "OptionImdbRating": "Voto IMDB", "OptionLikes": "Mi piace", "OptionMissingEpisode": "Episodi mancanti", - "OptionMonday": "Lunedì", "OptionNameSort": "Nome", "OptionNew": "Nuovo…", "OptionNone": "Nessuno", - "OptionOnAppStartup": "All'avvio", "OptionOnInterval": "Su intervallo", "OptionParentalRating": "Classificazione per genitori", "OptionPlainStorageFolders": "Visualizzare tutte le cartelle come normali cartelle di archiviazione", - "OptionPlainStorageFoldersHelp": "Se abilitato, tutte le cartelle sono rappresentate in DIDL come \"object.container.storageFolder\" invece che di tipo più specifico, come \"object.container.person.musicArtist\".", + "OptionPlainStorageFoldersHelp": "Tutte le cartelle sono rappresentate in DIDL come \"object.container.storageFolder\" invece che di tipo più specifico, come \"object.container.person.musicArtist\".", "OptionPlainVideoItems": "Mostra tutti i video come normali file video", - "OptionPlainVideoItemsHelp": "Se attivato, tutti i video sono rappresentati in DIDL come \"object.item.videoItem\" invece che di tipo più specifico, come \"object.item.videoItem.movie\".", + "OptionPlainVideoItemsHelp": "Tutti i video sono rappresentati in DIDL come \"object.item.videoItem\" invece che di tipo più specifico, come \"object.item.videoItem.movie\".", "OptionPlayCount": "Riproduzioni", "OptionPlayed": "Visto", "OptionPremiereDate": "Data della prima", @@ -1011,20 +935,15 @@ "OptionResElement": "res element", "OptionResumable": "Interrotto", "OptionRuntime": "Durata", - "OptionSaturday": "Sabato", "OptionSaveMetadataAsHidden": "Salvare i metadati e le immagini come file nascosti", - "OptionSaveMetadataAsHiddenHelp": "La modifica di questo si applicherà ai nuovi metadati che verranno salvati in avanti. I file di metadati esistenti verranno aggiornati la prossima volta che vengono salvati da Jellyfin Server.", + "OptionSaveMetadataAsHiddenHelp": "La modifica di questo si applicherà ai nuovi metadati che verranno salvati in avanti. I file di metadati esistenti verranno aggiornati la prossima volta che verranno salvati dal server.", "OptionSpecialEpisode": "Speciali", "OptionSubstring": "Sottostringa", - "OptionSunday": "Domenica", - "OptionThursday": "Giovedì", "OptionTrackName": "Titolo Traccia", - "OptionTuesday": "Martedì", "OptionTvdbRating": "Voto TVDB", "OptionUnairedEpisode": "Episodi mai andati in onda", "OptionUnplayed": "Non visto", "OptionWakeFromSleep": "Risveglio", - "OptionWednesday": "Mercoledì", "OptionWeekdays": "Feriali", "OptionWeekends": "Il Weekend", "OptionWeekly": "Settimanale", @@ -1037,7 +956,7 @@ "PasswordMatchError": "Le password non coincidono.", "PasswordResetComplete": "Reset della password eseguito.", "PasswordResetConfirmation": "Sicuro di voler eseguire il reset della password?", - "PasswordResetHeader": "Reset Password", + "HeaderResetPassword": "Reset Password", "PasswordSaved": "Password salvata.", "People": "Attori", "PerfectMatch": "Corrispondenza perfetta", @@ -1056,9 +975,9 @@ "PleaseAddAtLeastOneFolder": "Per favore aggiungi almeno una cartella alla raccolta cliccando sul pulsante Aggiungi.", "PleaseConfirmPluginInstallation": "Per favore premi OK per confermare che hai letto quanto precede e che vuoi procedere all'installazione del plug-in.", "PleaseEnterNameOrId": "Per favore inserisci un nome o un ID esterno.", - "PleaseRestartServerName": "Per favore riavvia Jellyfin Server - {0}.", + "PleaseRestartServerName": "Per favore riavvia Jellyfin su {0}.", "PleaseSelectTwoItems": "Seleziona almeno due elementi.", - "PluginInstalledMessage": "Il plugin è stato installato correttamente. Il server Jellyfin dovrà essere riavviato affinché le modifiche abbiano effetto.", + "MessagePluginInstalled": "Il plugin è stato installato correttamente. Il server dovrà essere riavviato affinché le modifiche abbiano effetto.", "PreferEmbeddedTitlesOverFileNames": "Preferisci titoli integrati ai nomi dei file", "PreferEmbeddedTitlesOverFileNamesHelp": "Determina il titolo predefinito usato quando non sono disponibili metadati locali o da Internet.", "Premiere": "Prima visione", @@ -1069,7 +988,6 @@ "ProductionLocations": "Sedi di produzione", "Programs": "Programmi", "Quality": "Qualità", - "QueueAllFromHere": "In coda tutto da qui in poi", "Raised": "Rilievo", "Rate": "Vota", "RecentlyWatched": "Visti di recente", @@ -1080,11 +998,11 @@ "Record": "Registra", "RecordSeries": "Registra serie TV", "RecordingCancelled": "Registrazione annullata.", - "RecordingPathChangeMessage": "La modifica della cartella di registrazione non migrerà le registrazioni esistenti dalla vecchia posizione al nuovo. Sarà necessario spostarli manualmente, se lo si desidera.", + "MessageChangeRecordingPath": "La modifica della cartella di registrazione non migrerà le registrazioni esistenti dalla vecchia posizione al nuovo. Sarà necessario spostarli manualmente, se lo si desidera.", "RecordingScheduled": "Registrazione pianificata.", "Recordings": "Registrazioni", "Refresh": "Aggiorna", - "RefreshDialogHelp": "I Metadati sono aggiornati in base alle impostazioni ed ai servizi Internet abilitati nel Pannello di Controllo del Server Jellyfin.", + "RefreshDialogHelp": "I Metadati sono aggiornati in base alle impostazioni ed ai servizi Internet abilitati nel Pannello di Controllo.", "RefreshMetadata": "Aggiorna metadati", "RefreshQueued": "Aggiornamento programmato.", "ReleaseDate": "Data di uscita", @@ -1100,7 +1018,6 @@ "ReplaceExistingImages": "Sovrascrivi immagini esistenti", "ResumeAt": "Riprendi da {0}", "Rewind": "Riavvolgi", - "RunAtStartup": "Esegui all'avvio", "Runtime": "Durata", "Saturday": "Sabato", "Save": "Salva", @@ -1123,10 +1040,10 @@ "SeriesRecordingScheduled": "Registrazione serie TV pianificata.", "SeriesSettings": "Impostazioni Serie TV", "SeriesYearToPresent": "{0} - Oggi", - "ServerNameIsRestarting": "Jellyfin Server - {0} si sta riavviando.", - "ServerNameIsShuttingDown": "Jellyfin Server - {0} si sta arrestando.", - "ServerRestartNeededAfterPluginInstall": "Il server Jellyfin dovrà essere riavviato dopo l'installazione di un plugin.", - "ServerUpdateNeeded": "Questo server Jellyfin deve essere aggiornato. Per scaricare l'ultima versione vai su {0}", + "ServerNameIsRestarting": "Il Server su {0} si sta riavviando.", + "ServerNameIsShuttingDown": "Il Server su {0} si sta arrestando.", + "ServerRestartNeededAfterPluginInstall": "Jellyfin dovrà essere riavviato dopo l'installazione di un plugin.", + "ServerUpdateNeeded": "Questo server deve essere aggiornato. Per scaricare l'ultima versione vai su {0}", "Settings": "Impostazioni", "SettingsSaved": "Settaggi salvati.", "SettingsWarning": "La modifica di questi valori può causare problemi di instabilità o di connettività. Se si verificano problemi, si consiglia di modificarli all'impostazione predefinita.", @@ -1160,51 +1077,25 @@ "SystemDlnaProfilesHelp": "I profili di sistema sono in sola lettura. Le modifiche ad un profilo di sistema verranno salvate in un nuovo profilo personalizzato.", "TabAccess": "Accesso", "TabAdvanced": "Avanzato", - "TabAlbumArtists": "Artisti degli Album", - "TabAlbums": "Album", - "TabArtists": "Artisti", "TabCatalog": "Catalogo", - "TabChannels": "Canali", "TabCodecs": "Codec", - "TabCollections": "Collezioni", "TabContainers": "Contenitori", "TabDashboard": "Pannello Controllo", - "TabDevices": "Dispositivi", "TabDirectPlay": "Riproduzione Diretta", - "TabDisplay": "Schermo", - "TabEpisodes": "Episodi", - "TabFavorites": "Preferiti", - "TabGenres": "Generi", - "TabGuide": "Guida", "TabLatest": "Novità", - "TabLiveTV": "Tv in Diretta", - "TabMetadata": "Metadati", - "TabMovies": "Film", "TabMusic": "Musica", - "TabMusicVideos": "Video Musicali", "TabMyPlugins": "I miei Plug-in", "TabNetworks": "Reti", "TabNfoSettings": "Impostazioni NFO", "TabNotifications": "Notifiche", "TabOther": "Altro", "TabParentalControl": "Controllo Genitore", - "TabPlayback": "Riproduzione", - "TabPlaylists": "Playlist", "TabProfile": "Profilo", "TabProfiles": "Profili", - "TabRecordings": "Registrazioni", "TabResponses": "Risposte", - "TabResumeSettings": "Riprendi", "TabScheduledTasks": "Operazioni Pianificate", - "TabSeries": "Serie TV", "TabSettings": "Impostazioni", - "TabShows": "Spettacoli", - "TabSongs": "Brani", - "TabSuggestions": "Suggerimenti", - "TabTrailers": "Trailer", - "TabTranscoding": "Trascodifica", "TabUpcoming": "In Arrivo", - "TabUsers": "Utenti", "Tags": "Tag", "TellUsAboutYourself": "Parlaci di te", "ThemeSongs": "Temi canzoni", @@ -1223,7 +1114,7 @@ "TvLibraryHelp": "Rivedere la {0} guida di denominazione TV{1}.", "Uniform": "Uniforme", "UninstallPluginConfirmation": "Sei sicuro di voler Disinstallare {0}?", - "UninstallPluginHeader": "Disinstalla Plugin", + "HeaderUninstallPlugin": "Disinstalla Plugin", "Unmute": "Togli muto", "Unplayed": "Non visto", "Unrated": "Non votato", @@ -1252,7 +1143,6 @@ "ValueTimeLimitSingleHour": "Tempo limite: 1 ora", "ValueVideoCodec": "Codec Video: {0}", "Vertical": "Verticale", - "VideoRange": "Range del Video", "ViewAlbum": "Visualizza album", "ViewPlaybackInfo": "Vedi info sulla riproduzione", "Watched": "Visto", @@ -1278,8 +1168,6 @@ "Banner": "Banner", "Blacklist": "Blacklist", "Box": "Scatola", - "ButtonDownload": "Download", - "ButtonHome": "Home", "ButtonInfo": "Info", "ButtonOk": "Ok", "ButtonStop": "Stop", @@ -1292,10 +1180,9 @@ "HeaderApp": "Applicazione", "HeaderAppearsOn": "Appare In", "HeaderCastAndCrew": "Cast", - "HeaderCastCrew": "Cast", "HeaderMedia": "Media", "HeaderPassword": "Password", - "AuthProviderHelp": "Selezionare un Provider di Autenticazione da utilizzare per autenticare la password dell'utente.", + "AuthProviderHelp": "Selezionare un provider di autenticazione da utilizzare per autenticare la password dell'utente.", "HeaderFavoriteMovies": "Film Preferiti", "HeaderFavoriteShows": "Serie TV Preferite", "HeaderFavoriteEpisodes": "Episodi Preferiti", @@ -1307,15 +1194,12 @@ "HeaderImageOptions": "Opzioni Immagine", "Home": "Home", "LabelAlbum": "Album:", - "LabelAudio": "Audio", "LabelCache": "Cache:", "ButtonAddImage": "Aggiungi Immagine", "CopyStreamURL": "Copia Indirizzo dello Stream", "CopyStreamURLSuccess": "Indirizzo copiato con successo.", "FetchingData": "Recupero di dati aggiuntivi", "LabelServerHost": "Host:", - "OptionAutomatic": "Automatico", - "HeaderHome": "Home", "LabelServerHostHelp": "192.168.1.100:8096 o https://myserver.com", "HeaderFavoriteBooks": "Libri Preferiti", "HeaderTypeImageFetchers": "{0} Sorgenti Immagini", @@ -1345,7 +1229,7 @@ "OptionProtocolHls": "Streaming in Diretta HTTP", "OptionDownloadArtImage": "Art", "OptionMax": "Massimo", - "PasswordResetProviderHelp": "Scegli un Provider Reset Password da utilizzare quando questo utente ne richiede il reset", + "PasswordResetProviderHelp": "Scegli un provider di reset password da utilizzare quando questo utente ne richiederà il reset.", "PlaybackData": "Dati di Riproduzione", "TagsValue": "Tag: {0}", "Whitelist": "Lista bianca", @@ -1382,7 +1266,6 @@ "LabelPlaylist": "Playlist:", "LabelPlayMethod": "Metodo di riproduzione:", "LabelPleaseRestart": "Le modifiche avranno effetto dopo aver manualmente ricaricato il client web.", - "LabelSkin": "Skin:", "LabelTranscodes": "Trascodifiche:", "LabelTranscodingFramerate": "Framerate di trascodifica:", "LabelTranscodingProgress": "Progresso di trascodifica:", @@ -1391,12 +1274,8 @@ "LabelVideo": "Video", "DashboardArchitecture": "Architettura: {0}", "LabelWeb": "Web:", - "LaunchWebAppOnStartup": "Lancia l'interfaccia web quando viene avviato il server", - "LaunchWebAppOnStartupHelp": "Apri il client web nel tuo web browser quando il server si avvia inizialmente. Ciò non accadrà quando si usa la funzione riavvio server.", "LeaveBlankToNotSetAPassword": "Puoi lasciare questo campo vuoto per non impostare alcuna password.", - "LinksValue": "Link: {0}", "MediaInfoTimestamp": "Orario", - "MediaInfoSoftware": "Software", "Mobile": "Mobile", "MoreMediaInfo": "Informazioni sui Media", "MusicAlbum": "Album Musicale", @@ -1428,11 +1307,8 @@ "Studios": "Studios", "SubtitleOffset": "Sfasamento Sottotitolo", "TV": "TV", - "TabInfo": "Informazioni", "TabLogs": "Log", "TabNetworking": "Rete", - "TabPassword": "Password", - "TabPlaylist": "Playlist", "TabPlugins": "Plugin", "TabServer": "Server", "TabStreaming": "Streaming", @@ -1444,7 +1320,6 @@ "OptionRandom": "Casuale", "MessageConfirmAppExit": "Vuoi uscire?", "HeaderNavigation": "Navigazione", - "CopyStreamURLError": "Si è verificato un errore nel copiare l'indirizzo.", "PlaybackErrorNoCompatibleStream": "Il client è incompatibile con il media e il server non sta inviando un formato compatibile.", "OptionForceRemoteSourceTranscoding": "Forza la transcodifica da fonti di media remoti (come LiveTV)", "NoCreatedLibraries": "Sembra che tu non abbia ancora creato delle librerie. {0}Vuoi crearne una adesso?{1}", @@ -1474,24 +1349,20 @@ "LastSeen": "Visto l'ultima volta {0}", "PersonRole": "nel ruolo di {0}", "ListPaging": "{0}-{1} di {2}", - "WriteAccessRequired": "Jellyfin Server richiede il permesso di scrittura su questa cartella. Verificare l'autorizzazione e riprovare.", + "WriteAccessRequired": "Jellyfin richiede il permesso di scrittura su questa cartella. Verificare l'autorizzazione e riprovare.", "PathNotFound": "Percorso non trovato. Assicurarsi che sia valido e riprovare.", "YadifBob": "YADIF Bob", "Yadif": "YADIF", "Track": "Traccia", "Season": "Stagione", - "OtherArtist": "Altri Artisti", "Movie": "Film", "LabelLibraryPageSizeHelp": "Numero di elementi presenti nella paginazione della libreria. Il valore 0 disabilita la paginazione.", "LabelLibraryPageSize": "Elementi nella paginazione della libreria:", "Episode": "Episodio", "BoxSet": "Cofanetto", "AlbumArtist": "Artisti dell'Album", - "ReleaseGroup": "Release Group", "UnsupportedPlayback": "Jellyfin non è in grado di decriptare i contenuti protetti da DRM ma tutti i contenuti verranno tentati a prescindere, compresi quelli protetti. Alcuni file potrebbero apparire completamente neri a causa della crittografia o di altre funzionalità non supportate, come i titoli interattivi.", - "MessageUnauthorizedUser": "Non sei autorizzato ad accedere in questo momento al server. Contatta l'amministratore per ulteriori dettagli.", "ButtonTogglePlaylist": "Playlist", - "ButtonToggleContextMenu": "Altro", "HeaderFavoritePlaylists": "Playlist Favorite", "Filter": "Filtro", "New": "Nuovo", @@ -1500,15 +1371,13 @@ "LabelChromecastVersion": "Versione Chromecast", "LabelRequireHttpsHelp": "Se selezionata, il server reindirizzerà tutte le richieste HTTP a HTTPS. Vale solo se il sever è configurato per l'ascolto in HTTPS.", "LabelRequireHttps": "Richiede HTTPS", - "LabelEnableHttpsHelp": "Abilita il server all'ascolto sulla porta HTTPS configurata. Il certificato deve essere configurato e valido per l'abilitazione.", + "LabelEnableHttpsHelp": "Ascolta sulla porta HTTPS configurata. Deve essere fornito un certificato valido per l'abilitazione.", "LabelEnableHttps": "Abilita HTTPS", "HeaderServerAddressSettings": "Configurazione Indirizzo Server", "HeaderRemoteAccessSettings": "Configurazione Access Remoto", "HeaderHttpsSettings": "Configurazione HTTPS", - "TabDVR": "DVR", "SaveChanges": "Salva modifiche", "HeaderDVR": "DVR", - "LabelNightly": "Nightly", "SyncPlayAccessHelp": "Selezionare il livello d'accesso di questo utente a SyncPlay che permetterà di riprodurre contemporaneamente su diversi dispositivi.", "MessageSyncPlayErrorMedia": "Impossibile abilitare SyncPlay! Errore media.", "MessageSyncPlayErrorMissingSession": "Impossibile abilitare SyncPlay! Sessione mancante.", @@ -1541,8 +1410,8 @@ "HeaderSyncPlaySelectGroup": "Unisciti a un gruppo", "EnableDetailsBannerHelp": "Mostra il banner nella parte superiore della pagina di dettaglio dell'elemento.", "EnableDetailsBanner": "Banner Dettagli", - "EnableBlurhashHelp": "Le immagini ancora da caricare saranno mostrate inizialmente sfocate", - "EnableBlurhash": "Abilita i segnaposto sfocati per le immagini", + "EnableBlurHashHelp": "Le immagini ancora da caricare saranno mostrate inizialmente sfocate.", + "EnableBlurHash": "Abilita i segnaposto sfocati per le immagini", "ShowMore": "Mostra di più", "ShowLess": "Mostra meno", "ButtonCast": "Cast", @@ -1565,5 +1434,13 @@ "Writers": "Scrittori", "ClearQueue": "Svuota la coda", "StopPlayback": "Interrompi riproduzione", - "LabelUnstable": "Unstable" + "LabelUnstable": "Unstable", + "NextTrack": "Prossima traccia", + "Preview": "Anteprima", + "LabelSubtitleVerticalPosition": "Posizione verticale:", + "PreviousTrack": "Traccia precedente", + "MessageGetInstalledPluginsError": "Errore durante la generazione della lista dei plugin installati.", + "MessagePluginInstallError": "Errore durante l'installazione del plugin.", + "SubtitleVerticalPositionHelp": "Numero di riga in cui viene visualizzato il testo. I numeri positivi indicano dall'alto verso il basso. I numeri negativi indicano dal basso verso l'alto.", + "PlaybackRate": "Velocità di riproduzione" } diff --git a/src/strings/ja.json b/src/strings/ja.json index 691df651c0..9652e85a18 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -23,7 +23,7 @@ "AllowMediaConversionHelp": "メディア変換機能へのアクセスを許可もしくは、拒否します。", "AllowOnTheFlySubtitleExtraction": "字幕の抽出の許可/拒否", "AllowOnTheFlySubtitleExtractionHelp": "埋め込まれた字幕は、ビデオのトランスコードを防ぐために、ビデオから抽出してプレーンテキストでクライアントに配信できます。 システムによっては、これに時間がかかり、抽出中にビデオの再生が止まることがあります。 これを無効にし、埋め込み字幕がクライアントデバイスでネイティブにサポートされていない場合、ビデオのトランスコードが強制されます。", - "AllowRemoteAccess": "Jellyfin Serverへのリモート接続の許可。", + "AllowRemoteAccess": "サーバへのリモート接続の許可。", "AllowRemoteAccessHelp": "チェックが入っていない場合すべてのリモート接続をブロックします。", "AllowedRemoteAddressesHelp": "リモート接続を許可するネットワークのIPアドレスまたはIPアドレス/マスク長 空白のままにすると、すべてのリモートアドレスが許可されます。", "AlwaysPlaySubtitles": "常に有効", @@ -39,7 +39,6 @@ "Audio": "オーディオ", "AuthProviderHelp": "ユーザーのパスワードを認証するために使用する認証プロバイダを選択してください。", "Auto": "自動", - "AutoBasedOnLanguageSetting": "自動選択(設定されている言語を優先)", "Backdrop": "背景", "Backdrops": "背景", "Banner": "バナー", @@ -52,38 +51,24 @@ "Box": "ボックス", "BoxRear": "ボックス(後)", "Browse": "ブラウズ", - "BrowsePluginCatalogMessage": "利用可能なプラグインを表示するには、プラグインカタログを参照してください。", + "MessageBrowsePluginCatalog": "利用可能なプラグインを表示するには、プラグインカタログを参照してください。", "BurnSubtitlesHelp": "ビデオのトランスコード時にサーバーが字幕を焼付けるかどうかを決定します。 この字幕焼付けを避けると、サーバーのパフォーマンスが非常に向上します。 画像ベースの形式 (VOBSUB, PGS, SUB, IDX など) と特定の ASS または SSA 字幕でだけ焼付けを行うには、自動を選んでください。", - "ButtonAdd": "追加", "ButtonAddMediaLibrary": "メディアライブラリを追加", "ButtonAddScheduledTaskTrigger": "トリガーを追加", "ButtonAddServer": "サーバーを追加", "ButtonAddUser": "ユーザーを追加", - "ButtonArrowDown": "下", "ButtonArrowLeft": "左", "ButtonArrowRight": "右", - "ButtonArrowUp": "上", "ButtonAudioTracks": "オーディオトラック", "ButtonBack": "戻る", "ButtonCancel": "キャンセル", "ButtonChangeServer": "サーバーを変更", - "ButtonConnect": "接続", - "ButtonDelete": "削除", - "ButtonDeleteImage": "イメージを削除", - "ButtonDown": "下", - "ButtonDownload": "ダウンロード", - "ButtonEdit": "編集", - "ButtonEditImages": "イメージを編集", "ButtonEditOtherUserPreferences": "ユーザーのアバターイメージやプロフィールなどの個人設定を編集。", - "ButtonFilter": "フィルタ", "ButtonForgotPassword": "パスワードを忘れた", "ButtonFullscreen": "フルスクリーン", "ButtonGotIt": "了解", "ButtonGuide": "ガイド", - "ButtonHelp": "ヘルプ", - "ButtonHome": "ホーム", "ButtonInfo": "情報", - "ButtonLearnMore": "もっと詳しく", "ButtonLibraryAccess": "ライブラリへアクセス", "ButtonManualLogin": "マニュアルログイン", "ButtonMore": "もっと", @@ -93,41 +78,31 @@ "ButtonOpen": "開く", "ButtonParentalControl": "ペアレンタルコントロール", "ButtonPause": "一時停止", - "ButtonPlay": "再生", "ButtonPreviousTrack": "前のトラック", "ButtonProfile": "プロフィール", "ButtonQuickStartGuide": "クイックスタートガイド", - "ButtonRefresh": "更新", "ButtonRefreshGuideData": "ガイドデータの更新", "ButtonRemove": "削除", "ButtonRename": "名前の変更", - "ButtonRepeat": "リピート", "ButtonResetEasyPassword": "easy pin code をリセット", "ButtonResetPassword": "パスワードをリセット", "ButtonRestart": "再起動", "ButtonResume": "レジューム", "ButtonRevoke": "取り消す", - "ButtonSave": "保存", "ButtonScanAllLibraries": "すべてのライブラリをスキャン", - "ButtonSearch": "検索", "ButtonSelectDirectory": "ディレクトリの選択", "ButtonSelectServer": "サーバーの選択", "ButtonSelectView": "ビューを選択", "ButtonSend": "送る", "ButtonSettings": "設定", - "ButtonShuffle": "シャッフル", "ButtonShutdown": "シャットダウン", "ButtonSignIn": "サインイン", "ButtonSignOut": "サインアウト", - "ButtonSort": "ソート", "ButtonStart": "スタート", "ButtonStop": "ストップ", "ButtonSubmit": "提出", - "ButtonSubtitles": "字幕", "ButtonTrailer": "予告", "ButtonUninstall": "アンインストール", - "ButtonUp": "上", - "ButtonViewWebsite": "ウェブサイトで見る", "ButtonWebsite": "ウェブサイト", "CancelRecording": "レコーディングをキャンセル", "CancelSeries": "中止したシリーズ", @@ -143,7 +118,7 @@ "ColorSpace": "カラースペース", "CommunityRating": "コミュニティ評価", "Composer": "作曲者", - "ConfigureDateAdded": "日時を設定します", + "ConfigureDateAdded": "追加日時の設定はダッシュボードからライブラリー設定で変えられます", "ConfirmDeleteImage": "イメージを削除しますか?", "ConfirmDeleteItem": "このアイテムを削除すると、ファイルシステムとメディアライブラリの両方から削除されます。 続行しますか?", "ConfirmDeleteItems": "これらの項目を削除すると、ファイルシステムとメディアライブラリの両方からそれらが削除されます。 続行しますか?", @@ -157,7 +132,7 @@ "DateAdded": "追加日時", "DatePlayed": "再生日時", "Default": "デフォルト", - "DefaultErrorMessage": "要求の処理中にエラーが発生しました。 後でもう一度やり直してください。", + "ErrorDefault": "要求の処理中にエラーが発生しました。 後でもう一度やり直してください。", "DefaultMetadataLangaugeDescription": "これらはデフォルトであり、ライブラリごとにカスタマイズすることができます。", "DefaultSubtitlesHelp": "字幕は、埋め込みメタデータのデフォルトフラグと強制フラグに基づいてロードされます。 複数のオプションが利用可能な場合は、言語設定が考慮されます。", "Delete": "削除", @@ -172,8 +147,8 @@ "DetectingDevices": "検出デバイス", "DeviceAccessHelp": "これは、識別できるデバイスにのみ適用され、ブラウザへのアクセスを妨げることはありません。 ユーザーのデバイスアクセスをフィルタリングすると、ここで承認されるまで新しいデバイスを使用できなくなります。", "DirectPlaying": "ダイレクト再生", - "DirectStreamHelp1": "メディアの種類 (H.264, AC3, etc.)がお使いのデバイスに対応している場合Jellyfinサーバーからメディアファイルの直接再生が可能です。互換性のないファイルコンテナ(.mkv, .avi, .wmv, etc.)はリパックを行い再生されます。", - "DirectStreamHelp2": "ファイルのダイレクトストリーミングは、ビデオ品質を損なうことなく、Jellyfin Serverにもほとんど負荷がありません。", + "DirectStreamHelp1": "メディアは、解像度と種類 (H.264, AC3など)がお使いのデバイスに対応していますが、ファイルコンテナ(.mkv, .avi, .wmvなど)が対応していません。ビデオはデバイスに送信される前に、再パッケージされます。", + "DirectStreamHelp2": "ダイレクトストリーミングは、ビデオ品質を損なうことなく、Jellyfin Serverにもほとんど負荷がありません。", "DirectStreaming": "ダイレクトストリーミング", "Director": "ディレクター", "Directors": "ディレクターズ", @@ -198,7 +173,6 @@ "EditImages": "イメージを編集", "EditMetadata": "メタデータを編集", "EditSubtitles": "字幕を編集", - "EnableBackdrops": "背景", "EnableBackdropsHelp": "ライブラリを閲覧している間、背景がいくつかのページの背景に表示されます。", "EnableCinemaMode": "シネマモード", "EnableColorCodedBackgrounds": "カラーコードによる背景", @@ -212,9 +186,7 @@ "EnablePhotosHelp": "写真が検出され、他のメディアファイルと一緒に表示されます。", "EnableStreamLooping": "ライブストリームの自動ループ", "EnableStreamLoopingHelp": "ライブストリームに数秒のデータしか含まれず、継続的に要求する必要がある場合は、これを有効にします。不要なときにこれを有効にすると、問題が発生する可能性があります。", - "EnableThemeSongs": "テーマ曲", "EnableThemeSongsHelp": "ライブラリを閲覧している間バックグラウンドでテーマ曲を再生する。", - "EnableThemeVideos": "テーマ動画", "EnableThemeVideosHelp": "ライブラリを閲覧中にバックグラウンドでテーマ動画を再生します。", "Ended": "終了", "EndsAtValue": "{0}に終了", @@ -223,20 +195,16 @@ "HeaderMoreLikeThis": "これに似たもの", "InstantMix": "インスタントミックス", "MoreFromValue": "もっと詳しく {0}", - "AddItemToCollectionHelp": "アイテムをコレクションに追加するには右クリックメニューかタップメニューから追加してください。", - "AttributeNew": "新規", - "ButtonNew": "新規", - "ButtonOff": "オフ", "ColorTransfer": "Color transfer", "DeathDateValue": "死亡日:{0}", "Depressed": "陰鬱", "ErrorAddingListingsToSchedulesDirect": "Schedules Directのアカウントにラインナップを追加中にエラーが発生しました。 スケジュールダイレクトでは、アカウントごとに限られた数のラインナップしか許可されません。続けるには、Schedules Direct にログインしてアカウントから他のリストを削除する必要があります。", - "ErrorAddingMediaPathToVirtualFolder": "メディアパスの追加中にエラーが発生しました。 パスが有効で、Jellyfin サーバープロセスがその場所にアクセスできることを確認してください。", + "ErrorAddingMediaPathToVirtualFolder": "メディアパスの追加中にエラーが発生しました。 パスが有効で、Jellyfin がその場所にアクセスできることを確認してください。", "ErrorAddingTunerDevice": "チューナーデバイスの追加中にエラーが発生しました。 アクセス可能であることを確認して、もう一度やり直してください。", "ErrorAddingXmlTvFile": "XMLTV ファイルへのアクセス中にエラーが発生しました。 ファイルが存在することを確認して、やり直してください。", - "ErrorDeletingItem": "Jellyfin サーバーからアイテムを削除中にエラーが発生しました。 Jellyfin サーバーがメディアフォルダーへの書き込みアクセス権を持っていることを確認して、もう一度やり直してください。", + "ErrorDeletingItem": "サーバーからアイテムを削除中にエラーが発生しました。 Jellyfinがメディアフォルダーへの書き込みアクセス権を持っていることを確認して、もう一度やり直してください。", "ErrorGettingTvLineups": "TV ラインナップ のダウンロード中にエラーが発生しました。 あなたの情報が正しいことを確認してもう一度やり直してください。", - "ErrorMessageStartHourGreaterThanEnd": "終了時間は開始時間より長くなければなりません。", + "ErrorStartHourGreaterThanEnd": "終了時間は開始時間より長くなければなりません。", "ErrorPleaseSelectLineup": "ラインナップを選択してもう一度やり直してください。 ラインナップが利用できない場合は、あなたのユーザー名、パスワード、および郵便番号が正しいことを確認してください。", "ErrorSavingTvProvider": "TV プロバイダの保存中にエラーが発生しました。 アクセス可能であることを確認して、もう一度やり直してください。", "EveryNDays": "{0}日ごと", @@ -282,34 +250,27 @@ "HeaderActiveDevices": "アクティブデバイス", "HeaderActiveRecordings": "アクティブな録画", "HeaderActivity": "アクティビティ", - "HeaderAddScheduledTaskTrigger": "トリガーを追加", "HeaderAddToCollection": "コレクションに追加", "HeaderAddToPlaylist": "プレイリストに追加", "HeaderAddUpdateImage": "イメージの追加/更新", - "HeaderAddUser": "ユーザーの追加", "HeaderAdditionalParts": "追加のパーツ", "HeaderAdmin": "管理者", "HeaderAlbumArtists": "アルバムアーティスト", - "HeaderAlbums": "アルバム", "HeaderAlert": "アラート", "HeaderAllowMediaDeletionFrom": "メディアの削除を許可", "HeaderApiKey": "API キー", "HeaderApiKeys": "API キー", - "HeaderApiKeysHelp": "Jellyfin サーバーと通信するには、外部アプリケーション用ににAPIキーが必要です。 キーはJellyfinアカウントでログインするか、手動でアプリケーションにキーを付与することによって発行されます。", + "HeaderApiKeysHelp": "外部アプリケーションが Jellyfin サーバーと通信するには、API キーが必要です。キーは 通常のユーザーアカウントでログインするか、手動でアプリケーションにキーを付与することで発行します。", "HeaderApp": "アプリ", "HeaderAppearsOn": "表示", "HeaderAudioBooks": "オーディオブック", "HeaderAudioSettings": "音声設定", - "HeaderAutomaticUpdates": "自動更新", "HeaderBlockItemsWithNoRating": "評価情報がない、または認識できないアイテムをブロックします。", - "HeaderBooks": "ブック", "HeaderBranding": "ブランディング", "HeaderCancelRecording": "録画の停止", "HeaderCancelSeries": "シリーズをキャンセル", "HeaderCastAndCrew": "キャスト&クルー", - "HeaderCastCrew": "キャスト&クルー", "HeaderChannelAccess": "チャンネルアクセス", - "HeaderChannels": "チャンネル", "HeaderChapterImages": "チャプターイメージ", "HeaderCodecProfile": "コーデックプロファイル", "HeaderCodecProfileHelp": "コーデックプロファイルは、特定のコーデックを再生するときのデバイスの制限を示します。 制限が適用される場合、コーデックが直接再生用に設定されていても、メディアはトランスコードされます。", @@ -337,13 +298,11 @@ "HeaderDevices": "デバイス", "HeaderDirectPlayProfile": "ダイレクトプレイ プロファイル", "HeaderDirectPlayProfileHelp": "ダイレクトプレイプロファイルを追加して、デバイスがどのフォーマットをネイティブに処理できるかを示します。", - "HeaderDisplay": "ディスプレイ", "HeaderDownloadSync": "ダウンロード&同期", "HeaderEasyPinCode": "簡単なPINコード", "HeaderEditImages": "イメージの編集", "HeaderEnabledFields": "有効なフィールド", "HeaderEnabledFieldsHelp": "フィールドをオフにしてロックし、データが変更されないようにします。", - "HeaderEpisodes": "エピソード", "HeaderError": "エラー", "HeaderExternalIds": "外部ID:", "HeaderFavoriteMovies": "お気に入りのムービー", @@ -354,16 +313,11 @@ "HeaderFavoriteSongs": "お気に入りの曲", "HeaderFavoriteVideos": "お気に入りのビデオ", "HeaderFeatureAccess": "機能へのアクセス", - "HeaderFeatures": "機能", "HeaderFetchImages": "画像を取得する:", "HeaderFetcherSettings": "フェッチャー設定", - "HeaderFilters": "フィルタ", "HeaderForKids": "子供向け", - "HeaderForgotPassword": "パスワードを忘れました", "HeaderFrequentlyPlayed": "よく再生する", - "HeaderGenres": "ジャンル", "HeaderGuideProviders": "TV番組情報のプロバイダ", - "HeaderHome": "ホーム", "HeaderHttpHeaders": "HTTPヘッダー", "HeaderIdentification": "識別", "HeaderIdentificationCriteriaHelp": "少なくとも1つの識別基準を入力してください。", @@ -372,10 +326,9 @@ "HeaderImageOptions": "イメージオプション", "HeaderImageSettings": "イメージ設定", "HeaderInstall": "インストール", - "HeaderItems": "アイテム", "HeaderKeepRecording": "録画を続ける", "HeaderKeepSeries": "シリーズを続ける", - "HeaderKodiMetadataHelp": "NFOメタデータを有効または無効にするには、Jellyfinライブラリ設定でライブラリを編集し、メタデータ保存機能セクションを見つけます。", + "HeaderKodiMetadataHelp": "NFOメタデータを有効または無効にするには、ライブラリを編集し「メタデータサーバー」の項目にて変更できます。", "HeaderLatestEpisodes": "最新のエピソード", "HeaderLatestMedia": "最新のメディア", "HeaderLatestMovies": "最新のムービー", @@ -386,15 +339,11 @@ "HeaderLibraryFolders": "ライブラリフォルダ", "HeaderLibraryOrder": "ライブラリの順番", "HeaderLibrarySettings": "ライブラリ設定", - "HeaderLiveTV": "ライブTV", - "HeaderLiveTv": "ライブTV", "HeaderLiveTvTunerSetup": "ライブTV チューナーのセットアップ", "HeaderLoginFailure": "ログイン失敗", "HeaderMedia": "メディア", "HeaderMediaFolders": "メディアフォルダ", - "HeaderMediaInfo": "メディア情報", "HeaderMetadataSettings": "メタデータ設定", - "HeaderMovies": "ムービー", "HeaderMusicQuality": "ミュージックの品質", "HeaderMusicVideos": "ミュージックビデオ", "HeaderMyDevice": "マイデバイス", @@ -403,7 +352,6 @@ "HeaderNewApiKey": "新規のAPIキー", "HeaderNewDevices": "新規のデバイス", "HeaderNextEpisodePlayingInValue": "次のエピソードの再生まで {0}", - "HeaderNextUp": "次", "HeaderNextVideoPlayingInValue": "次のビデオの再生まで{0}", "HeaderOnNow": "今", "HeaderOtherItems": "その他のアイテム", @@ -411,7 +359,6 @@ "HeaderPassword": "パスワード", "HeaderPasswordReset": "パスワードリセット", "HeaderPaths": "パス", - "HeaderPeople": "人", "HeaderPhotoAlbums": "フォトアルバム", "HeaderPinCodeReset": "PINコードのリセット", "HeaderPlayAll": "すべて再生", @@ -423,7 +370,7 @@ "HeaderPreferredMetadataLanguage": "優先するメタデータ言語", "HeaderProfile": "プロファイル", "HeaderProfileInformation": "プロファイル情報", - "HeaderProfileServerSettingsHelp": "これらの値はJellyfinサーバーがそれ自体をデバイスに提示する方法を制御します。", + "HeaderProfileServerSettingsHelp": "これらの設定はサーバーがクライアントに提示する方法を示しています。", "HeaderRecentlyPlayed": "最近再生した", "HeaderRecordingOptions": "録画設定", "HeaderRecordingPostProcessing": "録画後の処理", @@ -436,26 +383,23 @@ "HeaderRevisionHistory": "更新履歴", "HeaderRunningTasks": "実行中のタスク", "HeaderScenes": "シーン", - "HeaderSchedule": "スケジュール", "HeaderSeasons": "シーズン", "HeaderSecondsValue": "{0} 秒", "HeaderSelectCertificatePath": "証明書のパスを選択", "HeaderSelectMetadataPath": "メタデータのパスを選択", - "HeaderSelectMetadataPathHelp": "メタデータを保存するパスを参照または入力します。 フォルダは書き込み可能でなければなりません。", + "HeaderSelectMetadataPathHelp": "メタデータの保存先を参照またはパスを入力してください。 フォルダは書き込み可能でなければなりません。", "HeaderSelectPath": "パスの選択", "HeaderSelectServer": "サーバーの選択", "HeaderSelectServerCachePath": "サーバーキャッシュのパスを選択", "HeaderSelectServerCachePathHelp": "サーバーキャッシュファイルに使用するパスを参照または入力します。 フォルダは書き込み可能でなければなりません。", "HeaderSelectTranscodingPath": "トランスコーディング用の一時パスの選択", - "HeaderSelectTranscodingPathHelp": "一時ファイルのトランスコードに使用するパスを参照または入力します。 フォルダは書き込み可能でなければなりません。", + "HeaderSelectTranscodingPathHelp": "トランスコードファイルの保存先を参照またはパスを入力してください。 フォルダは書き込み可能でなければなりません。", "HeaderSendMessage": "メッセージの送信", - "HeaderSeries": "シリーズ", "HeaderSeriesOptions": "シリーズオプション", "HeaderSeriesStatus": "シリーズの状態", "HeaderServerSettings": "サーバー設定", "HeaderSettings": "設定", "HeaderSetupLibrary": "メディアライブラリを設定する", - "HeaderShutdown": "シャットダウン", "HeaderSortBy": "ソート", "HeaderSortOrder": "ソート順", "HeaderSpecialEpisodeInfo": "スペシャルエピソード情報", @@ -469,7 +413,6 @@ "HeaderSubtitleProfiles": "字幕のプロファイル", "HeaderSubtitleProfilesHelp": "字幕プロファイルは、デバイスでサポートされている字幕フォーマットを表します。", "HeaderSystemDlnaProfiles": "システムプロファイル", - "HeaderTags": "タグ", "HeaderTaskTriggers": "タスクトリガー", "HeaderThisUserIsCurrentlyDisabled": "このユーザーは現在無効になっています", "HeaderTracks": "トラック", @@ -489,7 +432,6 @@ "HeaderVideos": "ビデオ", "HeaderXmlSettings": "XML設定", "HeaderYears": "年", - "HeadersFolders": "フォルダ", "Help": "ヘルプ", "Hide": "隠す", "Movies": "ムービー", @@ -502,8 +444,6 @@ "ButtonAddImage": "イメージの追加", "List": "リスト", "MediaInfoTimestamp": "タイムスタンプ", - "NoSubtitles": "無し", - "TabCollections": "コレクション", "Thursday": "木曜日", "TitleHardwareAcceleration": "ハードウェアアクセラレーション", "Tuesday": "火曜日", @@ -539,7 +479,7 @@ "LabelEncoderPreset": "H264エンコーディングプリセット:", "LabelHardwareAccelerationType": "ハードウェアアクセラレーション:", "LabelH264Crf": "H264エンコーディングCRF:", - "LabelHttpsPortHelp": "JellyfinのHTTPSサーバーがバインドするTCPポート番号。", + "LabelHttpsPortHelp": "HTTPS サーバーのTCPポート番号。", "LabelKodiMetadataDateFormat": "リリース日時フォーマット:", "LabelLogs": "ログ:", "LabelMessageText": "メッセージテキスト:", @@ -549,13 +489,10 @@ "LabelModelUrl": "モデルURL", "LabelNewPassword": "新しいパスワード:", "LabelNewPasswordConfirm": "新しいパスワードを確認:", - "LabelNext": "次へ", "LabelNotificationEnabled": "この通知を有効化", - "LabelOptionalNetworkPath": "(任意) 共有ネットワークフォルダー:", + "LabelOptionalNetworkPath": "共有ネットワークフォルダー:", "LabelOriginalAspectRatio": "元のアスペクト比:", - "LabelPrevious": "前へ", "LabelServerName": "サーバー名:", - "LabelSubtitles": "字幕", "LabelSupportedMediaTypes": "サポートされているメディアタイプ:", "LabelTVHomeScreen": "TVモードホームスクリーン:", "LabelTextColor": "文字色:", @@ -568,11 +505,9 @@ "MessageItemSaved": "アイテムを保存しました。", "MessageItemsAdded": "アイテムを追加しました。", "MessagePleaseWait": "お待ち下さい。この処理には数分かかります。", - "MessageSettingsSaved": "設定を保存しました。", "MessageReenableUser": "最有効するためには以下を参照してください", "Name": "名前", "NewCollection": "新しいコレクション", - "OptionAutomatic": "自動", "OptionAscending": "昇順", "OptionAuto": "自動", "OptionBlockBooks": "ブック", @@ -590,11 +525,10 @@ "OptionUnplayed": "未再生", "OptionUnairedEpisode": "未放送のエピソード", "OptionWakeFromSleep": "スリープから起動", - "OptionWednesday": "水曜日", "OptionWeekdays": "平日", "ParentalRating": "個人評価", "PasswordResetConfirmation": "本当にパスワードを再設定しますか?", - "PasswordResetHeader": "パスワード再設定", + "HeaderResetPassword": "パスワード再設定", "PasswordSaved": "パスワードが保存されました。", "People": "ピープル", "PerfectMatch": "完全に一致", @@ -608,12 +542,7 @@ "Sunday": "日曜日", "CopyStreamURLSuccess": "URLのコピーが成功しました。", "TabDirectPlay": "直接再生", - "TabDisplay": "表示", - "TabEpisodes": "エピソード", - "TabFavorites": "お気に入り", - "TabGenres": "ジャンル", "LabelDefaultUser": "デフォルトユーザー:", - "TabSeries": "シリーズ", "Trailers": "トレーラー", "LabelRecord": "レコード:", "MediaInfoAnamorphic": "アナモフィック", @@ -631,9 +560,8 @@ "FetchingData": "追加のデータを取得中", "HeaderFavoriteBooks": "お気に入りのブック", "OneChannel": "1チャンネル", - "TabDevices": "デバイス", "ValueContainer": "コンテナ: {0}", - "ImportFavoriteChannelsHelp": "有効にすると、チューナーのデバイスのお気に入りのチャンネルのみインポートされます。", + "ImportFavoriteChannelsHelp": "チューナーでのお気に入りのチャンネルのみインポートされます。", "MusicAlbum": "ミュージックアルバム", "OptionDownloadLogoImage": "ロゴ", "OptionEnableAccessToAllChannels": "すべてのチャンネルへのアクセスを有効化", @@ -644,8 +572,6 @@ "SeriesSettings": "シリーズ設計", "SeriesYearToPresent": "{0} - 現在", "SubtitleOffset": "字幕オフセット", - "TabPassword": "パスワード", - "TabPlayback": "プレイバック", "ThemeSongs": "テーマ曲", "ThemeVideos": "テーマビデオ", "ValueMusicVideoCount": "{0} ミュージックビデオ", @@ -657,9 +583,8 @@ "LabelCriticRating": "評論家の評価:", "LabelCurrentPassword": "現在のパスワード:", "LabelCustomCss": "カスタムCSS:", - "LabelCustomCssHelp": "ウェブインターフェースにカスタムスタイリングを適応する。", - "LabelCustomDeviceDisplayName": "表示名:", - "LabelEnableDlnaClientDiscoveryInterval": "クライアント探索間隔 (秒)", + "LabelCustomCssHelp": "ウェブインターフェースにカスタムスタイルを適応する。", + "LabelEnableDlnaClientDiscoveryInterval": "クライアント探索間隔", "LabelParentalRating": "個人評価:", "LabelPassword": "パスワード:", "LabelPasswordConfirm": "パスワード (確認):", @@ -682,7 +607,7 @@ "LabelBirthDate": "誕生日:", "LabelBitrate": "ビットレート:", "LabelBirthYear": "生年:", - "LabelBlastMessageInterval": "アライブメッセージ間隔 (秒)", + "LabelBlastMessageInterval": "アライブメッセージ間隔", "LabelCache": "キャッシュ:", "LabelDisplayMode": "表示モード:", "LabelDisplayOrder": "表示順:", @@ -690,7 +615,7 @@ "LabelKidsCategories": "子供のカテゴリ:", "LabelLanNetworks": "LANネットワーク:", "LabelLanguage": "言語:", - "LabelLocalHttpServerPortNumberHelp": "JellyfinのHTTPサーバーがバインドするTCPポート番号。", + "LabelLocalHttpServerPortNumberHelp": "HTTPサーバーのTCPポート番号。", "LabelLoginDisclaimer": "ログイン免責事項:", "LabelSendNotificationToUsers": "通知を送る:", "LabelVideoCodec": "映像コーデック:", @@ -703,12 +628,8 @@ "MessageImageFileTypeAllowed": "JPEGとPNGファイルのみサポートしています。", "NoSubtitleSearchResultsFound": "何も見つかりません。", "OptionRandom": "ランダム", - "OptionSaturday": "土曜日", "OptionSubstring": "字幕", - "OptionSunday": "日曜日", - "OptionThursday": "木曜日", "OptionTrackName": "トラック名", - "OptionTuesday": "火曜日", "OptionTvdbRating": "TVDB評価", "OptionWeekends": "休日", "Overview": "概要", @@ -758,35 +679,25 @@ "TV": "TV", "TabAccess": "アクセス", "TabAdvanced": "高度", - "TabAlbumArtists": "アルバムアーティスト", - "TabAlbums": "アルバム", "TabCatalog": "カタログ", - "TabChannels": "チャンネル", "TabCodecs": "コーデック", "TabContainers": "コンテナ", "Rewind": "巻き戻す", - "RunAtStartup": "スタートアップに起動", "Runtime": "実行時間", "Saturday": "土曜日", "SaveSubtitlesIntoMediaFolders": "字幕をメディアフォルダーに保存", "ScanForNewAndUpdatedFiles": "新しいファイルとアップデートされたファイルをスキャン", "TabDashboard": "ダッシュボード", - "TabGuide": "ガイド", - "TabInfo": "情報", "TabLatest": "最新", - "TabLiveTV": "ライブTV", "TabLogs": "ログ", - "TabMetadata": "メタデータ", - "TabMovies": "ムービー", "TabMusic": "ミュージック", - "TabMusicVideos": "ミュージックビデオ", "TheseSettingsAffectSubtitlesOnThisDevice": "これらの設定はこのデバイスの字幕に影響します", "ShowTitle": "タイトルを表示", "TitleHostingSettings": "ホスト設定", "TitlePlayback": "プレイバック", "TrackCount": "{0} トラック", "Transcoding": "トランスコーディング", - "UninstallPluginHeader": "プラグインをアンインストール", + "HeaderUninstallPlugin": "プラグインをアンインストール", "Unmute": "ミュート解除", "Unrated": "未評価", "Up": "上へ", @@ -803,7 +714,6 @@ "ValueTimeLimitMultiHour": "タイムリミット: {0} 時間", "ValueVideoCodec": "映像コーデック: {0}", "Vertical": "垂直", - "VideoRange": "映像範囲", "ViewAlbum": "アルバムを見る", "ViewPlaybackInfo": "プレイバック情報を見る", "Watched": "視聴済み", @@ -845,16 +755,12 @@ "LabelMusicStreamingTranscodingBitrate": "ミュージックトランスコーディングビットレート:", "LabelName": "名前:", "LabelProtocolInfo": "プロトコル情報:", - "LabelAll": "すべて", "LabelAlbumArtPN": "アルバムアートPN:", "LabelAlbumArtists": "アルバムアーティスト:", "LabelAllowHWTranscoding": "ハードウェアトランスコーディングを許可", - "LabelAllowServerAutoRestart": "アップデートを適応するためにサーバーの再起動を許可", - "LabelAllowServerAutoRestartHelp": "サーバーはユーザーがログインしていないときのみ再起動します。", "LabelAllowedRemoteAddresses": "リモートIPアドレスフィルター:", "LabelAppNameExample": "例: スケートボード、ソナー", "LabelArtists": "アーティスト:", - "LabelAudio": "音声", "LabelAudioBitDepth": "音声ビット深度:", "LabelAudioBitrate": "音声ビットレート:", "LabelAudioChannels": "音声チャンネル:", @@ -870,7 +776,6 @@ "LabelCommunityRating": "コミュニティ評価:", "LabelContentType": "コンテンツタイプ:", "LabelCountry": "国:", - "LabelDashboardTheme": "サーバーダッシュボードテーマ:", "LabelPublicHttpsPortHelp": "公開ポート番号はローカルHTTPSポートにマッピングしてください。", "LabelAlbumArtMaxWidth": "アルバムアート最大高さ:", "LabelAlbumArtMaxHeight": "アルバムアート最大高さ:", @@ -907,7 +812,7 @@ "LabelMonitorUsers": "アクティビティをモニター:", "LabelMovieCategories": "ムービーカテゴリ:", "LabelMoviePrefix": "ムービー接頭辞:", - "LabelMovieRecordingPath": "ムービー録画パス (任意):", + "LabelMovieRecordingPath": "ムービー録画パス:", "LabelOriginalTitle": "原題:", "LabelOverview": "概要:", "LabelParentNumber": "親番号:", @@ -919,20 +824,17 @@ "LabelPublicHttpPort": "公開HTTPポート番号:", "LabelPublicHttpPortHelp": "公開ポート番号はローカルHTTPポートにマッピングしてください。", "LabelPublicHttpsPort": "公開HTTPSポート番号:", - "LabelReadHowYouCanContribute": "コントリビュートする方法を知る。", "LabelReleaseDate": "公開日:", "LabelRemoteClientBitrateLimit": "インターネットストリーミングビットレートリミット (Mbps):", - "LabelRuntimeMinutes": "実行時間 (分):", + "LabelRuntimeMinutes": "実行時間:", "LabelScreensaver": "スクリーンセーバー:", "LabelSeasonNumber": "シーズン数:", "LabelSelectUsers": "ユーザーを選択:", "LabelSelectVersionToInstall": "インストールするバージョンを選択:", "LabelSerialNumber": "シリアルナンバー", "LabelServerHost": "ホスト:", - "LabelSkin": "スキン:", "Premiere": "初日", "LabelSaveLocalMetadata": "アートワークをメディアフォルダーに保存", - "LabelSoundEffects": "音響効果:", "LabelSource": "ソース:", "LabelSportsCategories": "スポーツカテゴリ:", "LabelStatus": "ステータス:", @@ -943,11 +845,9 @@ "LabelTheme": "テーマ:", "LabelTitle": "題:", "LabelTrackNumber": "トラック数:", - "LabelTranscodingAudioCodec": "音声コーデック:", "LabelTranscodes": "トランスコード:", "LabelTranscodingFramerate": "トランスコーディングフレームレート:", "LabelTranscodingProgress": "トランスコーディング進行度:", - "LabelTranscodingVideoCodec": "映像コーデック:", "LabelType": "タイプ:", "LabelTypeText": "文字:", "LabelUser": "ユーザー:", @@ -960,13 +860,11 @@ "DashboardArchitecture": "アーキテクチャ: {0}", "LabelVideo": "映像", "LabelVideoBitrate": "映像ビットレート:", - "LabelYourFirstName": "名前:", "Share": "共有", "LabelSize": "大きさ:", "LatestFromLibrary": "最新 {0}", "LearnHowYouCanContribute": "コントリビュートする方法を知る。", "LabelTagline": "キャッチフレーズ:", - "LinksValue": "リンク: {0}", "Live": "ライブ", "LiveBroadcasts": "ライブブロードキャスト", "LiveTV": "ライブTV", @@ -983,7 +881,6 @@ "MediaInfoResolution": "解像度", "MediaInfoSampleRate": "サンプルレート", "MediaInfoSize": "大きさ", - "MediaInfoSoftware": "ソフトウェア", "MediaInfoStreamTypeAudio": "音声", "MediaInfoStreamTypeData": "データ", "MediaInfoStreamTypeEmbeddedImage": "埋め込み画像", @@ -1047,7 +944,6 @@ "OptionEnableExternalContentInSuggestions": "おすすめの欄に外部のコンテンツを使う", "OptionEnableM2tsMode": "M2TSモードを有効化", "OptionFavorite": "お気に入り", - "OptionFriday": "金曜日", "OptionHasSpecialFeatures": "特別な機能", "OptionHasSubtitles": "字幕", "OptionHasThemeSong": "テーマ曲", @@ -1056,7 +952,6 @@ "OptionHideUser": "ログインスクリーンからこのユーザーを隠す", "OptionHomeVideos": "フォト", "OptionIsHD": "HD", - "OptionMonday": "月曜日", "OptionProtocolHls": "HTTPライブストリーミング", "MediaInfoDefault": "デフォルト", "OptionSpecialEpisode": "スペシャル", @@ -1070,22 +965,14 @@ "TabNotifications": "通知", "TabOther": "その他", "TabParentalControl": "ペアレンタルコントロール", - "TabPlaylist": "プレイリスト", - "TabPlaylists": "プレイリスト", "TabPlugins": "プラグイン", "TabProfile": "プロフィール", "TabProfiles": "プロフィール", "TabResponses": "レスポンス", "TabServer": "サーバー", "TabSettings": "設定", - "TabShows": "表示", - "TabSongs": "曲", "TabStreaming": "ストリーミング", - "TabSuggestions": "おすすめ", - "TabTrailers": "トレーラー", - "TabTranscoding": "トランスコーディング", "MessageContactAdminToResetPassword": "パスワードをリセットするためにシステムの管理者に連絡してください。", - "TabUsers": "ユーザー", "TagsValue": "タグ: {0}", "MessageInvalidUser": "ユーザー名かパスワードが無効です。再試行してください。", "MessageYouHaveVersionInstalled": "バージョン {0} がインストールされています。", @@ -1101,25 +988,21 @@ "SearchForSubtitles": "字幕を検索", "ServerNameIsShuttingDown": "Jellyfinサーバー - {0} は停止中です。", "SettingsSaved": "設定を保存しました。", - "TabArtists": "アーティスト", "ValueSeconds": "{0} 秒", "ValueTimeLimitSingleHour": "タイムリミット: 1 時間", "Wednesday": "水曜日", "LabelPreferredDisplayLanguage": "優先する表示言語:", - "ImportMissingEpisodesHelp": "有効にすると、所有してないエピソードの情報がJellyfinデータベースにインポートされ、シーズンとシリーズに表示されます。これは、ライブラリスキャンに莫大な時間が掛かる可能性があります。", + "ImportMissingEpisodesHelp": "所有してないエピソードの情報がデータベースにインポートされ、シーズンとシリーズ内に表示されます。ライブラリの読み込み時間が非常に長くなる可能性があります。", "LabelBindToLocalNetworkAddress": "ローカルネットワークアドレスにバインド:", "LabelDownMixAudioScale": "ダウンミキシング時の音声ブースト:", "HeaderNavigation": "ナビゲーション", - "CopyStreamURLError": "URLのコピー中にエラーが発生しました。", "ButtonSplit": "分ける", "LabelEnableDlnaServer": "DLNAサーバーの有効化", "LabelEnableDlnaDebugLogging": "DLNAデバッグログの有効化", "LabelDroppedFrames": "ドロップフレーム:", - "LabelDisplayMissingEpisodesWithinSeasons": "シーズン中の見つからなかったエピソードを表示", "LabelCustomDeviceDisplayNameHelp": "任意の表示名を提供するか、空白のままにしてデバイスネームで報告する。", - "LabelArtistsHelp": "分けますと使用;", + "LabelArtistsHelp": "複数のアーティストは「;」で分ける。", "Identify": "識別する", - "TabRecordings": "録画", "Recordings": "録画", "RecordingScheduled": "録画をスケジュールしました。", "RecordingCancelled": "録画をキャンセルしました。", @@ -1132,7 +1015,7 @@ "LabelEveryXMinutes": "毎:", "LabelEnableSingleImageInDidlLimit": "単一の埋め込み画像に制限", "LabelEnableBlastAliveMessages": "アライブメッセージを配信する", - "LabelDateAddedBehaviorHelp": "メタデータある場合、これらのオプションの前にメタデータ使います。", + "LabelDateAddedBehaviorHelp": "メタデータがある場合、これらのオプションの前に優先します。", "AskAdminToCreateLibrary": "管理者にライブラリを作成する依頼をしてください。", "AllowFfmpegThrottling": "トランスコードをスロットルする", "Episode": "エピソード", @@ -1143,7 +1026,6 @@ "ButtonSyncPlay": "SyncPlay", "DeinterlaceMethodHelp": "インターレースコンテンツをトランスコードする際に使用するデインターレース方式を選びます。", "ButtonTogglePlaylist": "プレイリスト", - "ButtonToggleContextMenu": "さらに表示", "BoxSet": "ボックスセット", "AllowFfmpegThrottlingHelp": "トランスコードや remux が現在の再生位置から十分に先に進んだ場合、処理を一時停止してリソースの消費を抑えます。これは、あまり早送り・早戻しをしないで視聴する場合に便利です。再生に問題が発生した場合は、この機能をオフにしてください。", "LabelDisplaySpecialsWithinSeasons": "放送されたシーズン内のスペシャルを表示", @@ -1153,7 +1035,7 @@ "LabelCustomCertificatePathHelp": "カスタムドメインでTLSサポートを有効にするための証明書と秘密鍵を含むPKCS #12ファイルのパス。", "LabelCachePathHelp": "画像などのサーバーキャッシュファイルの場所を指定します。空欄にしておくと、サーバーのデフォルトを使います。", "LabelBlastMessageIntervalHelp": "ブラスト アライブ メッセージ間の時間を秒単位で指定します。", - "LabelBindToLocalNetworkAddressHelp": "追加の設定。http サーバをバインドするローカル IP アドレスを上書きします。空のままにしておくと、サーバは利用可能なすべてのアドレスにバインドします。この値を変更するには、Jellyfin Server を再起動する必要があります。", + "LabelBindToLocalNetworkAddressHelp": "HTTP サーバー用のローカル IP アドレスを上書きします。空のままにしておくと、サーバーは利用可能なすべてのアドレスにバインドします。この値の変更を反映するには再起動が必要です。", "LabelAlbumArtMaxWidthHelp": "upnp:albumArtURI で公開するアルバムアートの最大解像度。", "LabelAlbumArtMaxHeightHelp": "upnp:albumArtURI で公開するアルバムアートの最大解像度。", "LabelAlbumArtHelp": "upnp:albumArtURI の dlna:profileID 属性で、アルバムアートに使われるPN。デバイスによっては、画像のサイズと無関係に特定の値を要求するものもあります。", @@ -1174,18 +1056,18 @@ "LabelEmbedAlbumArtDidlHelp": "一部のデバイスでは、アルバムアートを取得するためにこの方法が好まれています。その他のデバイスでは、このオプションを有効にしても再生できない場合があります。", "LabelDownMixAudioScaleHelp": "ダウンミックス時にオーディオの音量を増幅します。値が 1 の場合、元の音量を維持します。", "LabelEnableHttps": "HTTPS を有効にする", - "LabelEnableDlnaPlayToHelp": "ネットワーク内のデバイスを検出し、それらをリモートコントロールできるようにします。", + "LabelEnableDlnaPlayToHelp": "ネットワーク内のデバイスを検出し、それらをリモートで操作できるようにします。", "LabelEnableDlnaPlayTo": "DLNA 再生を有効にする", "LabelEnableDlnaDebugLoggingHelp": "巨大なログファイルを作成します。トラブルシューティングでの必要な際にだけ使用してください。", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Jellyfin が実行する SSDP 検索の間隔を決めます(秒単位)。", - "LabelGroupMoviesIntoCollectionsHelp": "ムービーリストを表示する際、コレクションに属するムービーを1つのグループとして表示します。", - "LabelServerNameHelp": "この名前はサーバーを識別するために使用します。デフォルトではサーバーのコンピュータ名です。", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "SSDP 検索の間隔を決めます(秒単位)。", + "LabelGroupMoviesIntoCollectionsHelp": "ムービー リストを表示する際、コレクションに属するムービーは1つのグループとして表示します。", + "LabelServerNameHelp": "この名前はサーバーを識別するために使用します。デフォルトではサーバーのホスト名です。", "LabelExtractChaptersDuringLibraryScanHelp": "ライブラリー スキャン中に動画を取り込んだときに、チャプター画像を生成します。もしくは、スケジュールタスクの中でチャプター画像を抽出することで、通常のライブラリー スキャンをより速く完了させることができます。", "LabelExtractChaptersDuringLibraryScan": "ライブラリーをスキャンしながら、チャプター画像を生成する", - "LabelBaseUrlHelp": "サーバーの URL にカスタム サブディレクトリを加えます。例 : http://example.com/<baseurl>", + "LabelBaseUrlHelp": "サーバーの URL に、カスタム サブディレクトリを加えます。例 : http://example.com/<baseurl>", "LabelEnableSingleImageInDidlLimitHelp": "Didl 内に複数の画像が埋め込まれている場合、一部のデバイスでは正しくレンダリングされません。", - "LabelEnableRealtimeMonitorHelp": "ファイルへの変更は、サポートされているファイルシステム上ですぐに処理されます。", - "LabelEnableHttpsHelp": "構成された HTTPS ポートからサーバーがリッスンするのを有効にします。この機能を有効にするには、適切な証明書を設定する必要があります。", + "LabelEnableRealtimeMonitorHelp": "サポートしているファイルシステムでは、ファイルの変更をすぐに処理します。", + "LabelEnableHttpsHelp": "設定した HTTPS ポートをリッスンします。この機能を有効にするには、適切な証明書の設定が必要です。", "LabelImageFetchersHelp": "画像検索サイトの優先度を設定します。", "LabelPostProcessorArgumentsHelp": "{path}を録画ファイルのパスとして使用します。", "LabelPostProcessorArguments": "後処理のコマンドライン引数:", @@ -1196,11 +1078,10 @@ "LabelPlayDefaultAudioTrack": "言語に関係なくデフォルトの音声トラックを再生", "LabelPersonRoleHelp": "例: アイスクリームトラックドライバー", "LabelPasswordResetProvider": "パスワードリセットの提供:", - "LabelOptionalNetworkPathHelp": "ネットワーク内の共有フォルダの場合,ネットワーク共有のパスが他デバイスのJellyfinアプリからメディアファイルに直接アクセスできるようになります。例えば {0} や {1}です。", + "LabelOptionalNetworkPathHelp": "ネットワーク内の共有フォルダの場合,ネットワーク共有のパスが他デバイスのクライアントからメディアファイルに直接アクセスできるようになります。例えば {0} や {1}です。", "LabelNumberOfGuideDaysHelp": "多くの日数分のガイドデータをダウンロードするとより先のスケジュールとリストを見ることができるようになりますが,ダウンロードに時間がかかるようになります。自動に設定するとチャンネル数を基に選択されます。", "LabelNumberOfGuideDays": "ガイドデータをダウンロードする日数:", "LabelNewsCategories": "ニュースのカテゴリ:", - "LabelNightly": "最新・不安定版", "LabelStable": "安定版", "LabelChromecastVersion": "Chromecastバージョン", "LabelMusicStreamingTranscodingBitrateHelp": "音楽ストリーミングの最大ビットレートを指定します。", @@ -1211,7 +1092,7 @@ "LabelMinResumeDurationHelp": "動画で再生している場所を記録してレジュームできるようにする,最短の時間です。", "LabelMinResumeDuration": "レジューム再生する最小時間:", "LabelMinBackdropDownloadWidth": "ダウンロードする背景の最小幅:", - "LabelMetadataSaversHelp": "メタデータを保存するファイルのフォーマットを選択します。", + "LabelMetadataSaversHelp": "メタデータを保存する際に使うファイルのフォーマットを選択します。", "LabelMetadataReadersHelp": "ローカルメタデータ取得先の優先度を並び替えます。最初に見つかったファイルが読み込まれます。", "LabelMetadataDownloadersHelp": "優先度順にオンラインメタデータ取得先を並び替えます。低い優先度のメタデータ取得先は,欠落した情報を補うためのみに使われるようになります。", "LabelMetadataPathHelp": "ダウンロードされたアートワークとメタデータの保存先を自分で指定します。", @@ -1232,5 +1113,69 @@ "LabelKodiMetadataDateFormatHelp": "NFOファイル内の全データが,このフォーマットによって解析されます。", "LabelKeepUpTo": "最新:", "LabelInNetworkSignInWithEasyPasswordHelp": "ローカルネットワーク内では簡単なPINコードを利用してサインインするようにします。ローカル以外からのアクセスのときのみ通常のパスワードが必要になります。PINコードを空欄にした場合,ローカルネットワーク内からのアクセスではパスワードが不要になります。", - "LabelInNetworkSignInWithEasyPassword": "簡単なPINコードを利用してネットワーク内からサインインする機能の有効化" + "LabelInNetworkSignInWithEasyPassword": "簡単なPINコードを利用してネットワーク内からサインインする機能の有効化", + "LabelIconMaxWidthHelp": "upnp:icon として表示されるアイコンの最大解像度(幅)。", + "LabelIconMaxHeightHelp": "upnp:icon として表示されるアイコンの最大解像度(高さ)。", + "ManageRecording": "録画管理", + "LeaveBlankToNotSetAPassword": "このフィールドを空欄にすることでパスワード不要にできます。", + "Large": "ラージ", + "LabelffmpegPathHelp": "ffmpegアプリケーションファイルかffmpegを含有するフォルダのパス。", + "LabelZipCode": "郵便番号:", + "LabelYoureDone": "全て完了です!", + "LabelXDlnaDoc": "X-DLNA doc:", + "LabelXDlnaCap": "X-DLNA cap:", + "LabelVideoResolution": "動画解像度:", + "LabelValue": "値:", + "LabelVaapiDevice": "VA APIデバイス:", + "LabelUserRemoteClientBitrateLimitHelp": "サーバープレイバック設定のデフォルトグローバル値をオーバーライド。", + "LabelUserLoginAttemptsBeforeLockout": "ユーザーがロックされる前にログイン試行が失敗:", + "LabelUserLibraryHelp": "デバイスに表示されるユーザーライブラリを選択してください。空欄の場合デフォルト設定が引き継がれます。", + "LabelUseNotificationServices": "以下のサービスを使用:", + "LabelTypeMetadataDownloaders": "{0} メタデータダウンローダー:", + "LabelTunerType": "チューナータイプ:", + "LabelTunerIpAddress": "チューナーIPアドレス:", + "LabelTriggerType": "トリガータイプ:", + "LabelTextBackgroundColor": "テキスト背景色:", + "LabelSyncPlayAccess": "SyncPlayアクセス", + "LabelSyncPlayAccessNone": "このユーザーには無効", + "LabelSyncPlayAccessJoinGroups": "ユーザーによるグループの参加を許可", + "LabelSyncPlayAccessCreateAndJoinGroups": "ユーザーによるグループの作成/参加を許可", + "LabelSyncPlayLeaveGroupDescription": "SyncPlay無効", + "LabelSyncPlayLeaveGroup": "グループを離れる", + "LabelSyncPlayNewGroupDescription": "新しいグループ作成", + "LabelSyncPlayNewGroup": "新しいグループ", + "LabelSyncPlaySyncMethod": "同期方法:", + "LabelSyncPlayPlaybackDiff": "プレイバック時間差分:", + "MillisecondsUnit": "ミリ秒", + "LabelSyncPlayTimeOffset": "タイムオフセット:", + "LabelSubtitleFormatHelp": "例: srt", + "LabelSubtitleDownloaders": "字幕ダウンローダー:", + "LabelStreamType": "ストリームタイプ:", + "LabelStopWhenPossible": "可能次第停止:", + "LabelStartWhenPossible": "可能次第開始:", + "LabelSpecialSeasonsDisplayName": "スペシャルシーズン表示名:", + "LabelSortBy": "ソート順:", + "LabelSonyAggregationFlags": "SONYアグリゲーションフラグ:", + "LabelSkipIfGraphicalSubsPresent": "もし動画に埋め込み字幕がある時スキップ", + "LabelSkipIfAudioTrackPresent": "デフォルト音声トラックとダウンロード言語が同じ時スキップ", + "LabelSkipForwardLength": "スキップ(進み)時間:", + "LabelSkipBackLength": "スキップ(戻り)時間:", + "LabelSimultaneousConnectionLimit": "同時ストリーム制限:", + "LabelSeriesRecordingPath": "シリーズ録画パス:", + "EnableFasterAnimationsHelp": "高速アニメーションとページ遷移を使う", + "EnableFasterAnimations": "高速アニメーション", + "LabelScheduledTaskLastRan": "最終実行は{0}、実行時間は{1}。", + "LabelRequireHttpsHelp": "チェック時、全てのHTTPリクエストをHTTPSに自動リダイレクトします。サーバーがHTTPS対応していない時は何もしません。", + "LabelRequireHttps": "HTTPS必須", + "LabelRefreshMode": "リフレッシュモード:", + "LabelRecordingPath": "デフォルト録画パス:", + "LabelReasonForTranscoding": "トランスコード理由:", + "LabelProtocolInfoHelp": "この値はデバイスからのGetProtocolInfoリクエスト応答に使われます。", + "LabelProfileContainersHelp": "カンマ区切り。空欄にすることで全てのコンテナに適用されます。", + "LabelProfileContainer": "コンテナ:", + "LabelProfileCodecsHelp": "カンマ区切り。空欄にすることで全てのコーデックに適用されます。", + "LabelPlayerDimensions": "プレーヤーサイズ:", + "LabelUnstable": "不安定", + "LabelMaxParentalRating": "最大許容ペアレントレイティング:", + "LabelKodiMetadataEnablePathSubstitutionHelp": "サーバーのパス補完を使った画像パスの補完を有効にする。" } diff --git a/src/strings/kk.json b/src/strings/kk.json index 1396bcff34..90176b0335 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -3,7 +3,6 @@ "AccessRestrictedTryAgainLater": "Aǵymda qatynaý shektelgen. Áreketti keıin qaıtalańyz.", "Actor": "Aktór", "Add": "Ústeý", - "AddItemToCollectionHelp": "Tarmaqtardy izdep jáne tintýirdiń oń jaq túımeshign basyp jıyntyqtarǵa tarmaqtardy ústeńiz nemese jıyntyqqa ústeý úshin mázirlerdi túrtińiz.", "AddToCollection": "Jıyntyqqa ústeý", "AddToPlayQueue": "Oınatý kezegine ústeý", "AddToPlaylist": "Oınatý tizimine ústeý", @@ -37,10 +36,8 @@ "AsManyAsPossible": "Múmkindiginshe kóp", "Ascending": "Artýy boıynsha", "AspectRatio": "Pishimdik araqatynasy", - "AttributeNew": "Jańa", "Audio": "Dybys", "Auto": "Avtomatty", - "AutoBasedOnLanguageSetting": "Avtomatty (til teńshelimi negizinde)", "Backdrop": "Artqy sýret", "Backdrops": "Artqy sýretter", "Banner": "Baner", @@ -53,84 +50,58 @@ "Box": "Qorap", "BoxRear": "Qorap arty", "Browse": "Sharlaý", - "BrowsePluginCatalogMessage": "Qoljetimdi plagındermen tanysý úshin plagın tizimdemesin sholyńyz.", + "MessageBrowsePluginCatalog": "Qoljetimdi plagındermen tanysý úshin plagın tizimdemesin sholyńyz.", "BurnSubtitlesHelp": "Beıneni qaıta kodtaǵan kezde server sýbtıtrlerdi jazyýyn anyqtaıdy. Onan qashqaqtaý serverdiń ónimdiligin biraz jaqsartady. Sýretke negizdelgen pishimderdi (VOBSUB, PGS, SUB, IDX, j.t.b.) jáne keıbir ASS nemese SSA sýbtıtrlerin jazý úshin Avtomattyny tańdańyz.", - "ButtonAdd": "Ústeý", "ButtonAddMediaLibrary": "Tasyǵyshhana ústeý", "ButtonAddScheduledTaskTrigger": "Trıger ústeý", "ButtonAddServer": "Server ústeý", "ButtonAddUser": "Paıdalanýshy ústeý", - "ButtonArrowDown": "Tómenge", "ButtonArrowLeft": "Sol jaqqa", "ButtonArrowRight": "Oń jaqqa", - "ButtonArrowUp": "Joǵaryǵa", "ButtonAudioTracks": "Dybys jolshyqtaryna", "ButtonBack": "Artqa", "ButtonCancel": "Boldyrmaý", "ButtonChangeServer": "Serverdi aýystyrý", - "ButtonConnect": "Qosylý", - "ButtonDelete": "Joıý", - "ButtonDeleteImage": "Sýretti joıý", - "ButtonDown": "Tómenge", - "ButtonDownload": "Júktep alý", - "ButtonEdit": "Óńdeý", - "ButtonEditImages": "Sýretterdi óńdeý", "ButtonEditOtherUserPreferences": "Osy paıdalanýshynyń profaılyn, sýretin jáne ózindik teńshelimderin óńdeý.", - "ButtonFilter": "Súzý", "ButtonForgotPassword": "Paróldi eske salý", "ButtonFullscreen": "Tolyq ekran", "ButtonGotIt": "Túsinikti", "ButtonGuide": "Telegıd", - "ButtonHelp": "Anyqtama", - "ButtonHome": "Basqyǵa", "ButtonInfo": "Aqparatqa", - "ButtonLearnMore": "Kóbirek bilý", "ButtonLibraryAccess": "Tasyǵyshhanǵa qatynaý", "ButtonManualLogin": "Qolmen kirý", "ButtonMore": "Kóbirek", "ButtonNetwork": "Jeli", - "ButtonNew": "Jasaý", "ButtonNextTrack": "Kelesi jolshyqqa", - "ButtonOff": "Óshir", "ButtonOk": "Jaraıdy", "ButtonOpen": "Ashý", "ButtonParentalControl": "Mazmundy basqarý", "ButtonPause": "Úzý", - "ButtonPlay": "Oınatý", "ButtonPreviousTrack": "Aldyńǵy jolshyqqa", "ButtonProfile": "Profaıl", "ButtonQuickStartGuide": "Tez bastaý nusqaýlyǵy", - "ButtonRefresh": "Jańǵyrtý", "ButtonRefreshGuideData": "Telegıd derekterin jańǵyrtý", "ButtonRemove": "Alastaý", "ButtonRename": "Qaıta ataý", - "ButtonRepeat": "Qaıtalaý", "ButtonResetEasyPassword": "Ońaıtylǵan PIN-kodty ysyrý", "ButtonResetPassword": "Paróldi ysyrý", "ButtonRestart": "Qaıta iske qosý", "ButtonResume": "Jalǵastyrý", "ButtonRevoke": "Bas tartý", - "ButtonSave": "Saqtaý", "ButtonScanAllLibraries": "Barlyq tasyǵyshhanalardy skanerleý", - "ButtonSearch": "Izdeý", "ButtonSelectDirectory": "Qatalogty tańdaý", "ButtonSelectServer": "Serverdi tańdaý", "ButtonSelectView": "Kórinisti tańdaý", "ButtonSend": "Jiberý", "ButtonSettings": "Parametrlerge", - "ButtonShuffle": "Aralastyrý", "ButtonShutdown": "Jumysty aıaqtaý", "ButtonSignIn": "Kirý", "ButtonSignOut": "Shyǵý", - "ButtonSort": "Suryptaý", "ButtonStart": "Bastaý", "ButtonStop": "Toqtatý", "ButtonSubmit": "Jiberý", - "ButtonSubtitles": "Sýbtıtrlerge", "ButtonTrailer": "Treıler", "ButtonUninstall": "Ornatymdy joıý", - "ButtonUp": "Joǵaryǵa", - "ButtonViewWebsite": "Ýeb-saıtyn qaraý", "ButtonWebsite": "Ýeb-saıty", "CancelRecording": "Jazýdy boldyrmaý", "CancelSeries": "Telehıkaıany boldyrmaý", @@ -161,7 +132,7 @@ "DatePlayed": "Oınatylǵan kúni", "DeathDateValue": "Ólgeni: {0}", "Default": "Ádepki", - "DefaultErrorMessage": "Saýal óńdelý kezinde qate oryn aldy. Áreketti keıin qaıtalańyz.", + "ErrorDefault": "Saýal óńdelý kezinde qate oryn aldy. Áreketti keıin qaıtalańyz.", "DefaultMetadataLangaugeDescription": "Bular sizdiń ádepki maǵynalaryńyz jáne ár tasyǵyshhana negizinde teńsheýge bolady.", "DefaultSubtitlesHelp": "Sýbtıtrler engizilgen metaderekterdegi ádepki jáne májbúrli jalaýshalary negizinde júktelip alynady. Birneshe opsıa qoljetimdi bolǵanda til teńshelimi qarastyrylady.", "Delete": "Joıý", @@ -203,7 +174,6 @@ "EditImages": "Sýretterdi óńdeý", "EditMetadata": "Metaderekterdi óńdeý", "EditSubtitles": "Sýbtıtrlerdi óńdeý", - "EnableBackdrops": "Artqy sýretter", "EnableBackdropsHelp": "Artqy sýretter tasyǵyshhanany sholý kezinde keıbir betterde óńde beınelenedi.", "EnableCinemaMode": "Kınoteatr rejimi", "EnableColorCodedBackgrounds": "Túspen belgilengen óńder", @@ -217,9 +187,7 @@ "EnablePhotosHelp": "Sýretter basqa tasyǵysh faıldarymen qatar anyqtalady jáne beınelenedi.", "EnableStreamLooping": "Taratýlardy avtomatty tuıyqtaý", "EnableStreamLoopingHelp": "Eger taratý derekterinde tek qana azyn-aýlaq sekýnd bar bolsa jáne ony úzdiksiz suratyp alý qajet bolsa, ony qosyńyz. Bul qajet bolmaǵan jaǵdaıda qosylsa, qıyndyqtar týdyrýy múmkin.", - "EnableThemeSongs": "Taqyryptyq áýender", "EnableThemeSongsHelp": "Taqyryptyq áýender tasyǵyshhanany sholý kezinde óńde oınatylady.", - "EnableThemeVideos": "Taqyryptyq beıneler", "EnableThemeVideosHelp": "Taqyryptyq beıneler tasyǵyshhanany sholý kezinde óńde oınatylady.", "Ended": "Aıaqtaldy", "EndsAtValue": "Sońy: {0}", @@ -230,7 +198,7 @@ "ErrorAddingXmlTvFile": "XMLTV-faılyna qatynaý kezinde qate oryn aldy. Faıl bar bolýyna kóz jetkizińiz de áreketti qaıtalańyz.", "ErrorDeletingItem": "Jellyfin Server elementin joıý kezinde qate oryn aldy. Jellyfin Server tasyǵysh qaltasyna jazýǵa ruqsaty bar ekenin tekserip, qaıtalap kórińiz.", "ErrorGettingTvLineups": "TD kezekterin júktep alý kezinde qate oryn aldy. Málimetterińiz durys ekenine kóz jetkizińiz de áreketti qaıtalańyz.", - "ErrorMessageStartHourGreaterThanEnd": "Aıaqtalý ýaqyty bastaý ýaqytynan keıinrek bolýy qajet etedi.", + "ErrorStartHourGreaterThanEnd": "Aıaqtalý ýaqyty bastaý ýaqytynan keıinrek bolýy qajet etedi.", "ErrorPleaseSelectLineup": "Tizbekti tańdańyz jáne áreketti qaıtalańyz. Eger eshqandaı tizbek qoljetimdi bolmasa, onda paıdalanýshy atyńyzdy, parólińizdi jáne poshta kodyn durys ekenin tekserińiz.", "ErrorSavingTvProvider": "TD jetkizýshisin saqtaý kezinde qate oryn aldy. Bul qatynaýly ekenine kóz jetkizińiz de áreketti qaıtalańyz.", "EveryNDays": "{0} kún saıyn", @@ -276,15 +244,12 @@ "HeaderActiveDevices": "Belsendi qurylǵylar", "HeaderActiveRecordings": "Belsendi jazbalar", "HeaderActivity": "Áreketter", - "HeaderAddScheduledTaskTrigger": "Trıger ústeý", "HeaderAddToCollection": "Jıyntyqqa ústeý", "HeaderAddToPlaylist": "Oınatý tizimine ústeý", "HeaderAddUpdateImage": "Sýret ústeý/jańartý", - "HeaderAddUser": "Paıdalanýshy ústeý", "HeaderAdditionalParts": "Jalǵasatyn bólimder", "HeaderAdmin": "Basqarý", "HeaderAlbumArtists": "Álbom oryndaýshylary", - "HeaderAlbums": "Álbomdar", "HeaderAlert": "Eskertý", "HeaderAllowMediaDeletionFrom": "Osydan tasyǵyshderekterdi joıýǵa ruqsat etý", "HeaderApiKey": "API-kilt", @@ -294,16 +259,12 @@ "HeaderAppearsOn": "Kórýge bolady", "HeaderAudioBooks": "Dybystyq kitaptar", "HeaderAudioSettings": "Dybys parametrleri", - "HeaderAutomaticUpdates": "Avtomatty jańartýlar", "HeaderBlockItemsWithNoRating": "Jastas sanaty týraly aqparaty joq nemese ol tanylmaǵan mazmundy qursaýlaý:", - "HeaderBooks": "Kitaptar", "HeaderBranding": "Bezendirý", "HeaderCancelRecording": "Jazýdy boldyrmaý", "HeaderCancelSeries": "Telehıkaıany boldyrmaý", "HeaderCastAndCrew": "Róldegiler men qyzmetkerler", - "HeaderCastCrew": "Róldegiler men qyzmetkerler", "HeaderChannelAccess": "Arnaǵa qatynaý", - "HeaderChannels": "Arnalar", "HeaderChapterImages": "Sahna sýretteri", "HeaderCodecProfile": "Kodek profaıly", "HeaderCodecProfileHelp": "Kodek profaıldary naqty kodekter arqyly oınatqanda qurylǵynyń shekteýlerin kórsetedi. Eger shekteý qoldanylsa, sonda kodek tikeleı oınatý úshin teńshelse de tasyǵyshderekter qaıta kodtalynady.", @@ -331,24 +292,18 @@ "HeaderDevices": "Qurylǵylar", "HeaderDirectPlayProfile": "Tikeleı oınatý profaıly", "HeaderDirectPlayProfileHelp": "Qurylǵynyń qandaı pishimderdi ádepki óńdetetin múmkindigin kórsetý ushin tikeleı oınatý profaıldar ústeý.", - "HeaderDisplay": "Beıneleý", "HeaderDownloadSync": "Júkteý men úndestirý", "HeaderEasyPinCode": "Ońaıtylǵan PIN-kod", "HeaderEditImages": "Sýretterdi óńdeý", "HeaderEnabledFields": "Qosylǵan órister", "HeaderEnabledFieldsHelp": "Qursaýlaý úshin jáne derekter ózgertýine tyıym salý úshin, óristen qusbelgini alyńyz.", - "HeaderEpisodes": "TD-bólimder", "HeaderError": "Qate", "HeaderExternalIds": "Syrtqy sáıkestendirgishter:", "HeaderFeatureAccess": "Erekshelikterge qatynaý", - "HeaderFeatures": "Erekshelikter", "HeaderFetchImages": "Sýretterdi irikteý:", "HeaderFetcherSettings": "Irikteýshi parametrleri", - "HeaderFilters": "Súzgiler", "HeaderForKids": "Balalyq", - "HeaderForgotPassword": "Paróldi umytyńyz ba", "HeaderFrequentlyPlayed": "Jıi oınatylǵandar", - "HeaderGenres": "Janrlar", "HeaderGuideProviders": "Telegıd derekterin jetkizýshileri", "HeaderHttpHeaders": "HTTP ústińgi derektemeleri", "HeaderIdentification": "Anyqtaý", @@ -359,7 +314,6 @@ "HeaderImageSettings": "Sýret parametrleri", "HeaderInstall": "Ornatý", "HeaderInstantMix": "Lezdik qospa", - "HeaderItems": "Tarmaqtar", "HeaderKeepRecording": "Jazýdy saqtap qalý", "HeaderKeepSeries": "Telehıkaıany saqtap qalý", "HeaderKodiMetadataHelp": "NFO metaderekterin qosý nemese óshirý úshin, Jellyfin tasyǵyshhanalar ornatý bóliminde tasyǵyshhana ny óńdeńiz jáne metaderekter saqtaýysh bólimin tabyńyz.", @@ -373,16 +327,12 @@ "HeaderLibraryFolders": "Tasyǵyshhanalyq qaltalar", "HeaderLibraryOrder": "Tasyǵyshhana reti", "HeaderLibrarySettings": "Tasyǵyshhana parametrleri", - "HeaderLiveTV": "Efır", - "HeaderLiveTv": "Efırlik TD", "HeaderLiveTvTunerSetup": "Efırlik TD túnerdi ornatý", "HeaderLoginFailure": "Kirý sátsizdigi", "HeaderMedia": "Tasyǵyshderekter", "HeaderMediaFolders": "Tasyǵysh qaltalary", - "HeaderMediaInfo": "Tasyǵyshderekter týraly", "HeaderMetadataSettings": "Metaderekter parametrleri", "HeaderMoreLikeThis": "Osy sıaqty kóbirek", - "HeaderMovies": "Fılmder", "HeaderMusicQuality": "Mýzyka sapasy", "HeaderMusicVideos": "Mýzykalyq beıneler", "HeaderMyDevice": "Meniń qurylǵym", @@ -391,7 +341,6 @@ "HeaderNewApiKey": "Jańa API-kilt", "HeaderNewDevices": "Jańa qurylǵylar", "HeaderNextEpisodePlayingInValue": "Kelesi bólim {0} ishinde oınatylady", - "HeaderNextUp": "Kezekti", "HeaderNextVideoPlayingInValue": "Kelesi beıne {0} ishinde oınatylady", "HeaderOnNow": "Efırde", "HeaderOtherItems": "Basqa tarmaqtar", @@ -399,7 +348,6 @@ "HeaderPassword": "Paról", "HeaderPasswordReset": "Paróldi ysyrý", "HeaderPaths": "Joldar", - "HeaderPeople": "Adamdar", "HeaderPhotoAlbums": "Fotoálbomdar", "HeaderPinCodeReset": "PIN-kodty ysyrý", "HeaderPlayAll": "Bárin oınatý", @@ -424,7 +372,6 @@ "HeaderRevisionHistory": "Ózgerister tarıhy", "HeaderRunningTasks": "Oryndalyp jatqan tapsyrmalar", "HeaderScenes": "Sahnalar", - "HeaderSchedule": "Is kestesi", "HeaderSeasons": "Maýsymdar", "HeaderSecondsValue": "{0} sekónd", "HeaderSelectCertificatePath": "Kýálik jolyn tańdaý", @@ -437,13 +384,11 @@ "HeaderSelectTranscodingPath": "Qaıta kodtaýdyń ýaqytsha faıldaryeyń jolyn tańdaý", "HeaderSelectTranscodingPathHelp": "Qaıta kodtaýdyń ýaqytsha faıldaryn paıdalaný úshin joldy sholyńyz nemese engizińiz. Osy qalta jazý úshin qol jetimdi bolýy qajet.", "HeaderSendMessage": "Habar jiberý", - "HeaderSeries": "Telehıkaıalar", "HeaderSeriesOptions": "Telehıkaıa opsıalary", "HeaderSeriesStatus": "Telehıkaıa kúıi", "HeaderServerSettings": "Server parametrleri", "HeaderSettings": "Parametrler", "HeaderSetupLibrary": "Tasyǵyshhanalardy ornatý jáne teńsheý", - "HeaderShutdown": "Jumysty aıaqtaý", "HeaderSortBy": "Suryptaý tásili", "HeaderSortOrder": "Suryptaý reti", "HeaderSpecialEpisodeInfo": "Arnaıy bólim týraly", @@ -457,7 +402,6 @@ "HeaderSubtitleProfiles": "Sýbtıtrler profaıldary", "HeaderSubtitleProfilesHelp": "Sýbtıtrler profaıly osy qurylǵyda qoldaýy bar sýbtıtrler pishimderin sıpattaıdy.", "HeaderSystemDlnaProfiles": "Júıelik profaıldar", - "HeaderTags": "Tegter", "HeaderTaskTriggers": "Tapsyrma trıggerleri", "HeaderThisUserIsCurrentlyDisabled": "Osy paıdalanýshy aǵymda ajyratylǵan", "HeaderTracks": "Jolshyqtar", @@ -479,7 +423,6 @@ "HeaderXmlDocumentAttributes": "XML-qujat tólsıpattary", "HeaderXmlSettings": "XML parametrleri", "HeaderYears": "Jyldar", - "HeadersFolders": "Qaltalar", "Help": "Internettegi anyqtamaǵa", "Hide": "Jasyrý", "HideWatchedContentFromLatestMedia": "Eń keıingi tasyǵyshderekterden qaralǵan mazmundy jasyrý", @@ -513,17 +456,13 @@ "LabelAlbumArtMaxWidthHelp": "upnp:albumArtURI arqyly kórsetetin álbom sýretiniń eń joǵary ajyratylymdyǵy.", "LabelAlbumArtPN": "Álbom sýreti PN:", "LabelAlbumArtists": "Álbom oryndaýshylary:", - "LabelAll": "Barlyq", "LabelAllowHWTranscoding": "Apparattyq qaıta kodtaýǵa ruqsat etý", - "LabelAllowServerAutoRestart": "Jańartýlardy qoldaný úshin serverge qaıta iske qosylýdy ruqsat etý", - "LabelAllowServerAutoRestartHelp": "Tek qana eshqandaı paıdalýnshylar belsendi emes áreketsiz mezgilderde server qaıta iske qosylady.", "LabelAllowedRemoteAddresses": "Qashyqtaǵy IP-mekenjaı súzgisi:", "LabelAllowedRemoteAddressesMode": "Qashyqtaǵy IP-mekenjaı súzgisiniń rejimi:", "LabelAppName": "Qoldanba aty", "LabelAppNameExample": "Mysaly: Sickbeard, Sonarr", "LabelArtists": "Oryndaýshylar:", "LabelArtistsHelp": "Birneshýin mynaýmen bólińiz ;", - "LabelAudio": "Dybys", "LabelAudioLanguagePreference": "Dybys tiliniń teńshelimi:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Metaderekterdi Internetten avtomatty jańartý:", "LabelBindToLocalNetworkAddress": "Jergilikti jeli mekenjaıyna baılastyrý:", @@ -551,10 +490,8 @@ "LabelCustomCertificatePathHelp": "Teńsheletin domende TLS qoldaýyn qosý úshin sertıfıkaty jáne jeke kilti bar PKCS #12 faılyna jol.", "LabelCustomCss": "Teńsheýli CSS:", "LabelCustomCssHelp": "Ózińizdiń teńsheýli mánerleýdi ýeb-tildesýde qoldanyńyz.", - "LabelCustomDeviceDisplayName": "Beınelený aty:", "LabelCustomDeviceDisplayNameHelp": "Beınelenetin teńshelgen atyn usynyńyz nemese qurylǵy arqyly baıandalǵan atyn paıdalaný úshin bos qaldyryńyz.", "LabelCustomRating": "Teńshelgen sanat:", - "LabelDashboardTheme": "Server taqtasynyń taqyryby:", "LabelDateAdded": "Ústelgen kúni:", "LabelDateAddedBehavior": "Jańa mazmun úshin qosylǵan kúni tártibi:", "LabelDateAddedBehaviorHelp": "Eger metaderekterde máni bolsa, bul qaısybir osy opsıalarydyń aldynda árqashanda paıdalanylady.", @@ -569,7 +506,6 @@ "LabelDiscNumber": "Dıski nómiri:", "LabelDisplayLanguage": "Beıneleý tili:", "LabelDisplayLanguageHelp": "Jellyfin tárjimeleýi aǵymdaǵy joba bolyp tabylady.", - "LabelDisplayMissingEpisodesWithinSeasons": "Joq bólimderdi maýsym ishinde beıneleý", "LabelDisplayMode": "Beıneleý rejimi:", "LabelDisplayName": "Beınelený aty:", "LabelDisplayOrder": "Beıneleý reti:", @@ -700,7 +636,6 @@ "LabelNewPassword": "Jańa paról:", "LabelNewPasswordConfirm": "Jańa paróldi rastaý:", "LabelNewsCategories": "Jańalyq sanattary:", - "LabelNext": "Kelesi", "LabelNotificationEnabled": "Bul habarlandyrmany qosý", "LabelNumber": "Nómiri:", "LabelNumberOfGuideDays": "Júktep alý úshin Telegıd derekterindegi kún sany:", @@ -725,9 +660,7 @@ "LabelPostProcessorArguments": "Post-prosesor pármen jolynyń argýmentteri:", "LabelPostProcessorArgumentsHelp": "Jazylatyn faıl joly esebinde {path} paıdalanyńyz.", "LabelPreferredDisplayLanguage": "Beıneleý tiliniń teńshelimi:", - "LabelPreferredDisplayLanguageHelp": "Jellyfin tárjimeleýi aǵymdaǵy joba bolyp tabylady.", "LabelPreferredSubtitleLanguage": "Sýbtıtr tiliniń teńshelimi:", - "LabelPrevious": "Aldyńǵy", "LabelProfileAudioCodecs": "Dybystyq kodekter:", "LabelProfileCodecs": "Kodekter:", "LabelProfileCodecsHelp": "Útir arqyly bólip alynǵan. Barlyq kodekterge qoldaný úshin bul bos qaldyrylý múmkin.", @@ -741,7 +674,6 @@ "LabelPublicHttpPortHelp": "Jergilikti HTTP-portyna salystyrylýy tıis jarıa port nómiri.", "LabelPublicHttpsPort": "Jarıa HTTPS-port nómiri:", "LabelPublicHttpsPortHelp": "Jergilikti HTTPS-portyna salystyrylýy tıis jarıa port nómiri.", - "LabelReadHowYouCanContribute": "Qalaı úles qosý týraly bilý.", "LabelReasonForTranscoding": "Qaıta kodtaý sebebi:", "LabelRecord": "Jazý:", "LabelRecordingPath": "Jazbalardyń ádepki joly:", @@ -766,7 +698,6 @@ "LabelServerHost": "Host:", "LabelServerHostHelp": "192.168.1.100:8096 nemese https://myserver.com", "LabelSimultaneousConnectionLimit": "Bir mezgildegi aǵyndardyń shegi:", - "LabelSkin": "Muqaba:", "LabelSkipBackLength": "Artqa ótkizip jiberý uzaqtyǵy:", "LabelSkipForwardLength": "Alǵa ótkizip jiberý uzaqtyǵy:", "LabelSkipIfAudioTrackPresent": "Eger ádepki dybys jolshyǵy júktep alynatyn tilge sáıkes kelse ótkizip jiberý", @@ -778,7 +709,6 @@ "LabelSortBy": "Suryptaý tásili:", "LabelSortOrder": "Suryptaý reti:", "LabelSortTitle": "Ataý boıynsha suryptaý:", - "LabelSoundEffects": "Dybystyq áserleri:", "LabelSource": "Qaınar kózi:", "LabelSpecialSeasonsDisplayName": "Arnaıy maýsymdyń beıneleý aty:", "LabelSportsCategories": "Sporttyq sanattary:", @@ -789,7 +719,6 @@ "LabelSubtitleDownloaders": "Sýbtıtrler júkteýshileri:", "LabelSubtitleFormatHelp": "Mysal: srt", "LabelSubtitlePlaybackMode": "Sýbtıtr rejimi:", - "LabelSubtitles": "Sýbtıtrler", "LabelSupportedMediaTypes": "Qoldaýdaǵy tasyǵyshderekter túrleri:", "LabelTVHomeScreen": "TD rejimindegi basqy ekran:", "LabelTag": "Teg:", @@ -802,12 +731,9 @@ "LabelTimeLimitHours": "Ýaqyt shegi (saǵat):", "LabelTitle": "Ataýy:", "LabelTrackNumber": "Jolshyq nómiri:", - "LabelTranscodingAudioCodec": "Dybystyq kodek:", - "LabelTranscodingContainer": "Konteıner:", "LabelTranscodingTempPathHelp": "Klıentterge qyzmet etetin qaıta kodtaý faıldar úshin teńshelgen jolyn kórsetińiz. Server ádepkisin paıdalaný úshin bos qaldyryńyz.", "LabelTranscodingThreadCount": "Qaıta qodtaý tizbekterdiń sany:", "LabelTranscodingThreadCountHelp": "Qaıta kodtaý kezinde paıdalanatyn eń kóp tizbek sanyn tańdańyz. Tizbek sanyn azaıtý OP paıdalanýyn tómendetedi, biraq jatyq oınatý áseri úshin tez túrlendirýge jetkilikti bolmaýy múmkin.", - "LabelTranscodingVideoCodec": "Beınelik kodek:", "LabelTriggerType": "Trıgger túri:", "LabelTunerIpAddress": "Túnerdiń IP-mekenjaıy:", "LabelTunerType": "Túner túri:", @@ -832,7 +758,6 @@ "LabelXDlnaDoc": "X-DLNA tásimi:", "LabelXDlnaDocHelp": "urn:schemas-dlna-org:device-1-0 ataýlar keńistigindegi X_DLNADOC elementi mazmunyn anyqtaıdy.", "LabelYear": "Jyl:", - "LabelYourFirstName": "Atyńyz:", "LabelYoureDone": "Siz daıynsyz!", "LabelZipCode": "Poshta kody:", "LabelffmpegPath": "FFmpeg joly:", @@ -843,7 +768,6 @@ "LearnHowYouCanContribute": "Qalaı úles qosýynyńyz múmkin týraly úırenińiz.", "LibraryAccessHelp": "Bul paıdalanýshymen ortaqtasý úshin tasyǵyshhanalardy bólekteńiz. Metaderek retteýshini paıdalanyp ákimshiler barlyq qaltalardy óńdeýi múmkin.", "Like": "Unaıdy", - "LinksValue": "Siltemeler: {0}", "List": "Tizim", "Live": "Tikeleı", "LiveBroadcasts": "Tikeleı taratymdar", @@ -902,7 +826,6 @@ "MessageFileReadError": "Faıl oqý kezinde qate oryn aldy. Áreketti keıin qaıtalańyz.", "MessageForgotPasswordFileCreated": "Kelesi faıl serverińizde jasaldy jáne qalaı kirisý týraly nusqaýlar ishinde bar:", "MessageForgotPasswordInNetworkRequired": "Paróldi ysyrý prosesi úshin áreketti úılik jelińizdiń ishinde qaıtalańyz.", - "MessageInstallPluginFromApp": "Bul plagın qandaı qoldanbaǵa taǵaıyndalsa, sonyń ishinen ornatylýy tıisti.", "MessageInvalidForgotPasswordPin": "Jaramsyz nemese merzimi aıaqtalǵan PIN-kod engizildi. Áreketti qaıtalańyz.", "MessageInvalidUser": "Jaramsyz paıdalanýshy aty nemese paról. Áreketti qaıtalańyz.", "MessageItemSaved": "Tarmaq saqtaldy.", @@ -920,7 +843,6 @@ "MessagePluginConfigurationRequiresLocalAccess": "Osy plagındi teńsheý úshin jergilikti serverińizge tikeleı kirińiz.", "MessagePluginInstallDisclaimer": "Jellyfin qaýymdastyǵy múshelerimen qurylǵan plagınder Jellyfin tájirıbeńizdi qosymsha múmkindiktermen jáne jeńildiktermen jaqsartý úshin jaqsy tásili bolyp tabylady. Ornatpas buryn, olar Jellyfin serverińizge tasyǵyshhanany uzaq skanerleý, qosymsha óńdik óńdetý jáne júıeniń turaqtylyǵyn tómendetý sıaqty áserler etýge múmkin bolýyna habardar bolyńyz.", "MessageReenableUser": "Qaıta qosý úshin tómende qarańyz", - "MessageSettingsSaved": "Parametrler saqtaldy.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Tasyǵyshhanańyzdan kelesi tasyǵysh ornalasýlary alastalady:", "MessageUnableToConnectToServer": "Tańdalǵan serverge qosylýymyz dál qazir múmkin emes. Bul iske qosylǵanyna kóz jetkizińiz jáne áreketti keıin qaıtalańyz.", "MessageUnsetContentHelp": "Mazmun kádimgi qaltalar retinde beınelenedi. Eń jaqsy nátıjeler alý úshin, ishki qaltalardyń mazmún túrlerin ornatyp Metaderek retteýshini paıdalanyńyz.", @@ -952,10 +874,9 @@ "NextUp": "Kezekti", "No": "Joq", "NoNewDevicesFound": "Jańa qurylǵylar tabylmady. Jańa túner ústeý úshin, osy tilqatysý terezesin jaýyp, qurylǵy aqparatyn qolmen engizińiz.", - "NoNextUpItemsMessage": "Eshteńe tabylmady. Kórsetimderińizdi qaraı bastańyz!", - "NoPluginConfigurationMessage": "Osy plagınde teńsheletin parametrler joq.", + "MessageNoNextUpItems": "Eshteńe tabylmady. Kórsetimderińizdi qaraı bastańyz!", + "MessageNoPluginConfiguration": "Osy plagınde teńsheletin parametrler joq.", "NoSubtitleSearchResultsFound": "Eshqandaı nátıjeler tabylmady.", - "NoSubtitles": "Eshqandaı", "NoSubtitlesHelp": "Ádepkide sýbtıtrler júktelmeıdi. Olardy oınatý kezinde áli de qolmen qosýǵa bolady.", "None": "Eshqandaı", "Normal": "Kádimgi", @@ -987,7 +908,6 @@ "OptionArtist": "Oryndaýshy", "OptionAscending": "Artýy boıynsha", "OptionAuto": "Avtomatty", - "OptionAutomatic": "Avtomatty", "OptionAutomaticallyGroupSeries": "Birneshe qaltalar arasynda taralǵan telehıkaıany avtomatty bir telehıkaıaǵa biriktirý", "OptionAutomaticallyGroupSeriesHelp": "Qosylǵanda, osy tasyǵyshhana ishindegi birneshe qaltalar arasynda taralǵan telehıkaıasy avtomatty bir telehıkaıaǵa biriktiriletin bolady.", "OptionBlockBooks": "Kitaptar", @@ -1041,7 +961,6 @@ "OptionExternallyDownloaded": "Syrttan júktelgen", "OptionExtractChapterImage": "Sahna sýretin bólip alýdy qosý", "OptionFavorite": "Tańdaýlylar", - "OptionFriday": "juma", "OptionHasSpecialFeatures": "Arnaıy múmkindikter", "OptionHasSubtitles": "Sýbtıtrler", "OptionHasThemeSong": "Taqyryptyq áýen", @@ -1057,11 +976,9 @@ "OptionLikes": "Unatýlar", "OptionMax": "Eń joǵary", "OptionMissingEpisode": "Joq bólimder", - "OptionMonday": "dúısenbi", "OptionNameSort": "Aty", "OptionNew": "Jańa…", "OptionNone": "Eshqandaı", - "OptionOnAppStartup": "Qoldanba iske qosylǵanda", "OptionOnInterval": "Aralyqta", "OptionParentalRating": "Jastas sanat", "OptionPlainStorageFolders": "Barlyq qaltalardy kádimgi saqtama qaltalary retinde beıneleý", @@ -1085,20 +1002,15 @@ "OptionRequirePerfectSubtitleMatchHelp": "Keremet sáıkestik talap etilgende tek qana naqty beıne faılyńyzben synaqtaýdan jáne tekserýden ótken sýbtıtrler súziledi. Belgini alastaý sýbtıtrlerdi júkteý yqtımaldyǵyn arttyrady, biraq qate ýaqyty bar nemese burys bolý sýbtıtrler mátininiń múmkindikterin ósiredi.", "OptionResumable": "Jalǵastyralatyn", "OptionRuntime": "Uzaqtyǵy", - "OptionSaturday": "senbi", "OptionSaveMetadataAsHidden": "Metaderekter men sýretterdi jasyryn faıldar retinde saqtaý", "OptionSaveMetadataAsHiddenHelp": "Osy ózgertý bolashaqta saqtalatyn jańa metaderekter úshin qoldanylady. Bar metaderek faıldar olar Jellyfin serveri arqyly saqtalǵanda kelesi joly jańartylady.", "OptionSpecialEpisode": "Arnaıy bólimder", "OptionSubstring": "Ishki jol", - "OptionSunday": "jeksenbi", - "OptionThursday": "beısenbi", "OptionTrackName": "Jolshyq aty", - "OptionTuesday": "seısenbi", "OptionTvdbRating": "TVDB baǵalaýy", "OptionUnairedEpisode": "Kórsetilmegen bólimder", "OptionUnplayed": "Oınatylmaǵan", "OptionWakeFromSleep": "Uıqydan oıatýda", - "OptionWednesday": "sársenbi", "OptionWeekdays": "Jumys kúnderi", "OptionWeekends": "Demalys kúnderi", "OptionWeekly": "Apta saıyn", @@ -1111,7 +1023,7 @@ "PasswordMatchError": "Paróli men Paróldi rastaý óristeri sáıkes bolý kerek.", "PasswordResetComplete": "Paról ysyryldy.", "PasswordResetConfirmation": "Shynymen paróldi ysyrý qajet pe?", - "PasswordResetHeader": "Paróldi ysyrý", + "HeaderResetPassword": "Paróldi ysyrý", "PasswordSaved": "Paról saqtaldy.", "People": "Adamdar", "PerfectMatch": "Úzdik teń", @@ -1133,7 +1045,7 @@ "PleaseEnterNameOrId": "Atyn nemese syrtqy ID engizińiz.", "PleaseRestartServerName": "Jellyfin Server úshin qaıta iske qosyńyz - {0}.", "PleaseSelectTwoItems": "Eń keminde eki tarmaqty tańdańyz.", - "PluginInstalledMessage": "Plagın sátti ornatyldy. Ózgertýler kúshine enýi úshin Jellyfin Server qaıta iske qosylý qajet.", + "MessagePluginInstalled": "Plagın sátti ornatyldy. Ózgertýler kúshine enýi úshin Jellyfin Server qaıta iske qosylý qajet.", "PreferEmbeddedTitlesOverFileNames": "Faıl ataýlary ornyna endirilgen ataýlardy qalaý", "PreferEmbeddedTitlesOverFileNamesHelp": "Internettegi metaderekter nemese jergilikti metaderekter qol jetimdi bolmaǵanda bul ádepki beıneletin ataýdy anyqtaıdy.", "Premiere": "Tusaýkeseri", @@ -1144,7 +1056,6 @@ "ProductionLocations": "Óndirý oryndary", "Programs": "Kórsetimder", "Quality": "Sapasy", - "QueueAllFromHere": "Bul aradan bárin kezekke", "Raised": "Dónesti", "Rate": "Baǵalaý", "RecentlyWatched": "Jýyqta qaralǵan", @@ -1155,7 +1066,7 @@ "Record": "Jazý", "RecordSeries": "Telehıkaıany jazý", "RecordingCancelled": "Jazba boldyrylmady.", - "RecordingPathChangeMessage": "Jazý qaltasyn ózgertkende, bar jazbalar eski ornynan jańasyna tasymaldanbaıdy. Talap etseńiz, olardy qolmen jyljytýyńyzǵa qajet bolady.", + "MessageChangeRecordingPath": "Jazý qaltasyn ózgertkende, bar jazbalar eski ornynan jańasyna tasymaldanbaıdy. Talap etseńiz, olardy qolmen jyljytýyńyzǵa qajet bolady.", "RecordingScheduled": "Jazý josparlaǵan.", "Recordings": "Jazbalar", "Refresh": "Jańǵyrtý", @@ -1175,7 +1086,6 @@ "ReplaceExistingImages": "Bar sýretterdi aýystyrý", "ResumeAt": "{0} bastap jalǵastyrý", "Rewind": "Shegindirý", - "RunAtStartup": "Iske qosylýdan bastap oryndaý", "Runtime": "Uzaqtyǵy", "Saturday": "senbi", "Save": "Saqtaý", @@ -1239,58 +1149,29 @@ "TV": "TD", "TabAccess": "Qatynaý", "TabAdvanced": "Keńeıtilgen", - "TabAlbumArtists": "Álbom oryndaýshylary", - "TabAlbums": "Álbomdar", - "TabArtists": "Oryndaýshylar", "TabCatalog": "Tizimdeme", - "TabChannels": "Arnalar", "TabCodecs": "Kodekter", - "TabCollections": "Jıyntyqtar", "TabContainers": "Konteınerler", "TabDashboard": "Taqta", - "TabDevices": "Qurylǵylar", "TabDirectPlay": "Tikeleı oınatý", - "TabDisplay": "Beıneleý", - "TabEpisodes": "TD-bólimder", - "TabFavorites": "Tańdaýlylar", - "TabGenres": "Janrlar", - "TabGuide": "Telegıd", - "TabInfo": "Profaıl týraly", "TabLatest": "Eń keıingi", - "TabLiveTV": "Efırlik TD", "TabLogs": "Jurnaldar", - "TabMetadata": "Metaderekter", - "TabMovies": "Fılmder", "TabMusic": "Mýzyka", - "TabMusicVideos": "Mýzykalyq beıneler", "TabMyPlugins": "Meniń plagınderim", "TabNetworks": "Jeliler", "TabNfoSettings": "NFO parametrleri", "TabNotifications": "Habarlandyrýlar", "TabOther": "Basqalar", "TabParentalControl": "Mazmundy basqarý", - "TabPassword": "Paról", - "TabPlayback": "Oınatý", - "TabPlaylist": "Oınatý tizimi", - "TabPlaylists": "Oınatý tizimderi", "TabPlugins": "Plagınder", "TabProfile": "Profaıl", "TabProfiles": "Profaıldar", - "TabRecordings": "Jazbalar", "TabResponses": "Ún qatýlar", - "TabResumeSettings": "Jalǵastyrý", "TabScheduledTasks": "Josparlaýshy", - "TabSeries": "Telehıkaıalar", "TabServer": "Server", "TabSettings": "Parametrler", - "TabShows": "Kórsetimder", - "TabSongs": "Áýender", "TabStreaming": "Tasymaldaný", - "TabSuggestions": "Usynystar", - "TabTrailers": "Treılerler", - "TabTranscoding": "Qaıta kodtaý", "TabUpcoming": "Kútilgen", - "TabUsers": "Paıdalanýshylar", "Tags": "Tegter", "TagsValue": "Tegter: {0}", "TellUsAboutYourself": "Ózińiz týraly aıtyńyz", @@ -1310,7 +1191,7 @@ "TvLibraryHelp": "{0}TD-kórsetimdi ataý nusqaýlyǵyn{1} qarap shyǵý.", "Uniform": "Biryńǵaı", "UninstallPluginConfirmation": "Shynymen {0} ornatýyn boldyrmaý qajet pe?", - "UninstallPluginHeader": "Plagın ornatýyn boldyrmaý", + "HeaderUninstallPlugin": "Plagın ornatýyn boldyrmaý", "Unmute": "Dybysty qosý", "Unplayed": "Oınatylmaǵan", "Unrated": "Baǵalanbaǵan", @@ -1342,7 +1223,6 @@ "ValueTimeLimitSingleHour": "Ýaqyt shegi: 1 saǵat", "ValueVideoCodec": "Beıne kodegi: {0}", "Vertical": "Tiginen", - "VideoRange": "Beıne aýqymy", "ViewAlbum": "Álbomdy qaraý", "ViewPlaybackInfo": "Oınatý týraly aqparat", "Watched": "Qaralǵan", @@ -1373,7 +1253,6 @@ "HeaderFavoriteArtists": "Tańdaýly oryndaýshylar", "HeaderFavoriteSongs": "Tańdaýly áýender", "HeaderFavoriteVideos": "Tandaýly beıneler", - "HeaderHome": "Basqy", "LabelAuthProvider": "Túpnusqalyq rastamasyn jetkizýshi:", "LabelPasswordResetProvider": "Paróldi ysyrý jetkizýshisi:", "LabelServerName": "Server aty:", @@ -1385,9 +1264,6 @@ "DashboardOperatingSystem": "Operasıalyq júıe: {0}", "DashboardArchitecture": "Arhıtektýrasy: {0}", "LabelWeb": "Ýeb:", - "LaunchWebAppOnStartup": "Serverdi iske qosqan kezde ýeb-ınterfeısti iske qosý", - "LaunchWebAppOnStartupHelp": "Server bastapqyda iske qosylǵan kezde, ýeb-klıent ádepki sholǵyshta ashylady. Bul serverdi qaıta iske qosý fýnksıasyn qoldanǵanda oryn almaıdy.", - "MediaInfoSoftware": "Baǵdarlamalyq jasaqtama", "MediaInfoStreamTypeAudio": "Dybys", "MediaInfoStreamTypeData": "Derekter", "MediaInfoStreamTypeEmbeddedImage": "Endirilgen sýret", @@ -1450,7 +1326,6 @@ "LabelDroppedFrames": "Ótkizilgen kadrlar:", "LabelCorruptedFrames": "Búlingen kadrlar:", "HeaderNavigation": "Sharlaý", - "CopyStreamURLError": "URL kóshirgende qate oryn aldy.", "ButtonSplit": "Bólý", "AskAdminToCreateLibrary": "Tasýǵyshanany jasaý úshin ákimshiden suraý.", "AllowFfmpegThrottling": "Qaıta kodtaýdy retteý", @@ -1473,15 +1348,12 @@ "Yadif": "YADIF", "Track": "Jolshyq", "Season": "Maýsym", - "ReleaseGroup": "Shyǵarýshy top", "Person": "Tulǵa", - "OtherArtist": "Basqa oryndaýshy", "Movie": "Fılm", "LabelLibraryPageSize": "Tasyǵyshhana betiniń ólshemi:", "Episode": "Bólim", "ClientSettings": "Týtynýshy parametrleri", "ButtonTogglePlaylist": "Oýnatý tizimi", - "ButtonToggleContextMenu": "Kúbirek", "BoxSet": "Jıyntyq", "Artist": "Ornatýshy", "AlbumArtist": "Álbom ornatýshysy", @@ -1497,7 +1369,6 @@ "MillisecondsUnit": "ms", "LabelSyncPlayTimeOffset": "Server ýaqtynan aýytqýy:", "LabelRequireHttps": "HTTPS qajet etedi", - "LabelNightly": "Túngi", "LabelStable": "Turaqty", "LabelChromecastVersion": "Chromecast nusqasy", "LabelEnableHttps": "HTTPS qosý", diff --git a/src/strings/ko.json b/src/strings/ko.json index e587031bb5..cdb2711a48 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -8,60 +8,41 @@ "AllChannels": "모든 채널", "AllEpisodes": "모든 에피소드", "AllLanguages": "모든 언어", - "AttributeNew": "새로운", "Audio": "오디오", "Backdrops": "배경", "BirthDateValue": "출생: {0}", "BirthPlaceValue": "출생지: {0}", - "BrowsePluginCatalogMessage": "사용 가능한 플러그인을 보려면 플러그인 카탈로그를 참고하십시오.", - "ButtonAdd": "추가", + "MessageBrowsePluginCatalog": "사용 가능한 플러그인을 보려면 플러그인 카탈로그를 참고하십시오.", "ButtonAddScheduledTaskTrigger": "트리거 추가", "ButtonAddServer": "서버 추가", "ButtonAddUser": "사용자 추가", - "ButtonArrowDown": "아래", "ButtonArrowLeft": "왼쪽", "ButtonArrowRight": "오른쪽", - "ButtonArrowUp": "위", "ButtonBack": "뒤로", "ButtonCancel": "취소", "ButtonChangeServer": "서버 변경", - "ButtonConnect": "접속", - "ButtonDelete": "삭제", - "ButtonDeleteImage": "이미지 삭제", - "ButtonDownload": "다운로드", - "ButtonEdit": "편집", "ButtonEditOtherUserPreferences": "이 사용자의 프로필, 이미지, 개인 설정을 수정합니다.", - "ButtonFilter": "필터", "ButtonForgotPassword": "비밀번호 분실", "ButtonGotIt": "알겠습니다", "ButtonGuide": "가이드", - "ButtonHelp": "도움말", - "ButtonHome": "홈", "ButtonInfo": "정보", - "ButtonLearnMore": "더 알아보기", "ButtonManualLogin": "수동 로그인", "ButtonMore": "더 보기", "ButtonNetwork": "네트워크", - "ButtonNew": "새로운", "ButtonNextTrack": "다음 트랙", "ButtonOk": "OK", "ButtonOpen": "열기", "ButtonPause": "일시 중지", - "ButtonPlay": "재생", "ButtonPreviousTrack": "이전 트랙", "ButtonProfile": "프로필", "ButtonQuickStartGuide": "빠른 시작 가이드", - "ButtonRefresh": "새로 고침", "ButtonRefreshGuideData": "가이드 데이터 새로 고침", "ButtonRemove": "제거", "ButtonRename": "이름 변경", - "ButtonRepeat": "반복", "ButtonResetEasyPassword": "간편 PIN 코드 재설정", "ButtonResetPassword": "비밀번호 재설정", "ButtonRestart": "다시 시작", "ButtonResume": "이어서 재생", - "ButtonSave": "저장", - "ButtonSearch": "검색", "ButtonSelectDirectory": "디렉터리 선택", "ButtonSelectServer": "서버 선택", "ButtonSelectView": "보기 선택", @@ -70,13 +51,10 @@ "ButtonShutdown": "종료", "ButtonSignIn": "로그인", "ButtonSignOut": "로그아웃", - "ButtonSort": "정렬", "ButtonStart": "시작", "ButtonStop": "중지", "ButtonSubmit": "제출", - "ButtonSubtitles": "자막", "ButtonUninstall": "제거", - "ButtonViewWebsite": "웹사이트 보기", "ButtonWebsite": "웹사이트", "ChannelAccessHelp": "이 사용자와 공유할 채널을 선택합니다. 관리자는 메타데이터 매니저를 사용하여 모든 채널을 수정할 수 있습니다.", "CinemaModeConfigurationHelp": "시네마 모드는 본 영화 전에 예고편과 소개 영상 등을 재생하여 사용자의 거실에서 극장의 경험을 제공합니다.", @@ -86,7 +64,7 @@ "Connect": "접속", "CustomDlnaProfilesHelp": "새 장치를 대상으로 하거나 시스템 프로필을 재정의 할 사용자 지정 프로필을 만듭니다.", "DeathDateValue": "사망: {0}", - "DefaultErrorMessage": "요청을 처리하는 중에 오류가 발생했습니다. 나중에 다시 시도하십시오.", + "ErrorDefault": "요청을 처리하는 중에 오류가 발생했습니다. 나중에 다시 시도하십시오.", "DefaultMetadataLangaugeDescription": "이는 기본값이며 라이브러리별로 사용자 정의될 수 있습니다.", "Delete": "제거", "DeleteImage": "이미지 제거", @@ -122,25 +100,18 @@ "HeaderActiveDevices": "활성화된 기기", "HeaderActiveRecordings": "활성화된 녹화", "HeaderActivity": "활성화", - "HeaderAddScheduledTaskTrigger": "트리거 추가", "HeaderAddToCollection": "컬렉션에 추가", "HeaderAddToPlaylist": "재생목록에 추가", "HeaderAddUpdateImage": "이미지 추가/업데이트", - "HeaderAddUser": "사용자 추가", "HeaderAdditionalParts": "추가 장면", "HeaderAdmin": "관리자", - "HeaderAlbums": "앨범", "HeaderAlert": "알림", "HeaderApiKey": "API 키", "HeaderApiKeys": "API 키", "HeaderApp": "앱", "HeaderAudioSettings": "오디오 설정", - "HeaderAutomaticUpdates": "자동 업데이트", - "HeaderBooks": "도서", "HeaderBranding": "브랜딩", - "HeaderCastCrew": "배역 및 제작진", "HeaderChannelAccess": "채널 접속", - "HeaderChannels": "채널", "HeaderCodecProfile": "코덱 프로필", "HeaderConfirmProfileDeletion": "프로필 삭제 확인", "HeaderConnectToServer": "서버 접속", @@ -158,18 +129,13 @@ "HeaderEasyPinCode": "간편 PIN 코드", "HeaderError": "오류", "HeaderFeatureAccess": "기능 접근", - "HeaderFeatures": "특징", "HeaderFetchImages": "이미지 가져오기:", - "HeaderFilters": "필터", - "HeaderForgotPassword": "비밀번호 분실", "HeaderFrequentlyPlayed": "자주 재생함", - "HeaderGenres": "장르", "HeaderGuideProviders": "가이드 제공자", "HeaderIdentification": "식별자", "HeaderImageSettings": "이미지 설정", "HeaderInstall": "설치", "HeaderInstantMix": "인스턴스 믹스", - "HeaderItems": "항목", "HeaderLatestEpisodes": "최근 에피소드", "HeaderLatestMedia": "최근 미디어", "HeaderLatestMusic": "최근 음악", @@ -178,19 +144,14 @@ "HeaderLibraryAccess": "라이브러리 접근", "HeaderLibraryFolders": "라이브러리 폴더", "HeaderLibrarySettings": "라이브러리 설정", - "HeaderLiveTV": "실시간 TV", - "HeaderLiveTv": "실시간 TV", "HeaderLoginFailure": "로그인 실패", "HeaderMedia": "미디어", "HeaderMediaFolders": "미디어 폴더", - "HeaderMediaInfo": "미디어 정보", "HeaderMetadataSettings": "메타데이터 설정", - "HeaderMovies": "영화", "HeaderMusicVideos": "뮤직비디오", "HeaderMyMedia": "내 미디어", "HeaderMyMediaSmall": "내 미디어 (작음)", "HeaderNewApiKey": "새 API 키", - "HeaderNextUp": "다음으로", "HeaderParentalRatings": "자녀 보호 등급", "HeaderPassword": "비밀번호", "HeaderPasswordReset": "비밀번호 재설정", @@ -213,7 +174,6 @@ "HeaderRevisionHistory": "리비전 이력", "HeaderRunningTasks": "실행중인 작업", "HeaderScenes": "장면", - "HeaderSchedule": "일정", "HeaderSeasons": "시즌", "HeaderSelectMetadataPath": "메타데이터 경로 선택", "HeaderSelectMetadataPathHelp": "메타데이터를 보관할 경로를 탐색 또는 입력하세요. 쓰기 가능한 폴더여야 합니다.", @@ -224,18 +184,15 @@ "HeaderSelectTranscodingPath": "트랜스코딩 임시 경로 선택", "HeaderSelectTranscodingPathHelp": "트랜스코딩 임시 파일에 사용할 경로를 탐색 또는 입력하세요. 쓰기 가능한 폴더여야 합니다.", "HeaderSendMessage": "메시지 전송", - "HeaderSeries": "시리즈", "HeaderServerSettings": "서버 설정", "HeaderSettings": "설정", "HeaderSetupLibrary": "미디어 라이브러리 설정", - "HeaderShutdown": "종료", "HeaderSpecialEpisodeInfo": "스페셜 에피소드 정보", "HeaderSpecialFeatures": "특별 배역", "HeaderStatus": "상태", "HeaderSubtitleProfile": "자막 프로필", "HeaderSubtitleProfilesHelp": "자막 프로필은 장치에서 지원하는 자막 형식을 나타냅니다.", "HeaderSystemDlnaProfiles": "시스템 프로필", - "HeaderTags": "태그", "HeaderTaskTriggers": "작업 트리거", "HeaderThisUserIsCurrentlyDisabled": "이 사용자는 현재 비활성화되었습니다", "HeaderTracks": "트랙", @@ -250,7 +207,6 @@ "HeaderXmlDocumentAttributes": "XML 문서 속성", "HeaderXmlSettings": "XML 설정", "HeaderYears": "연도", - "HeadersFolders": "폴더", "Help": "도움말", "Images": "이미지", "ImportFavoriteChannelsHelp": "활성화 시, 튜너 장치에서 즐겨찾기로 표시된 채널만 불러옵니다.", @@ -273,9 +229,6 @@ "LabelAlbumArtMaxWidthHelp": "upnp:albumArtURI를 통해 노출된 앨범 아트의 최대 해상도.", "LabelAlbumArtPN": "앨범 아트 PN:", "LabelAlbumArtists": "앨범 아티스트:", - "LabelAll": "모두", - "LabelAllowServerAutoRestart": "서버가 자동으로 업데이트를 적용하도록 재시작 허용", - "LabelAllowServerAutoRestartHelp": "서버를 활성화된 사용자가 없는 유휴 기간에 다시 시작합니다.", "LabelAppName": "앱 이름", "LabelArtists": "아티스트:", "LabelArtistsHelp": "; 를 사용하여 여러 개 분리", @@ -297,7 +250,6 @@ "LabelCustomCertificatePathHelp": "커스텀 도메인에서 TLS를 지원할 수 있도록 인증서 및 개인키가 포함 된 PKCS #12 파일의 경로입니다.", "LabelCustomCss": "사용자 지정 CSS:", "LabelCustomCssHelp": "사용자 정의 스타일링을 웹 인터페이스에 적용합니다.", - "LabelCustomDeviceDisplayName": "표시 이름:", "LabelCustomRating": "사용자 평점:", "LabelDateAdded": "추가한 날짜:", "LabelDateAddedBehavior": "새 콘텐츠에 대한 날짜 추가 동작:", @@ -308,7 +260,6 @@ "LabelDefaultUserHelp": "연결된 장치에 어떤 사용자 라이브러리를 표시할 지 결정합니다. 이 설정은 각 장치의 사용중인 프로필을 대체합니다.", "LabelDeviceDescription": "장치 설명", "LabelDidlMode": "DIDL 모드:", - "LabelDisplayMissingEpisodesWithinSeasons": "각 시즌의 누락된 에피소드 표시", "LabelDisplayName": "표시 이름:", "LabelDisplayOrder": "표시 순서:", "LabelDisplaySpecialsWithinSeasons": "방송한 시즌 내에서 스페셜을 표시합니다", @@ -395,7 +346,6 @@ "LabelNewName": "새 이름:", "LabelNewPassword": "새 비밀번호:", "LabelNewPasswordConfirm": "새 비밀번호 확인:", - "LabelNext": "다음", "LabelNotificationEnabled": "이 알림 활성화", "LabelNumber": "번호:", "LabelNumberOfGuideDays": "다운로드할 가이드 데이터 일 수:", @@ -411,8 +361,6 @@ "LabelPlayDefaultAudioTrack": "언어에 상관없이 기본 오디오 트랙 재생", "LabelPlaylist": "재생목록:", "LabelPreferredDisplayLanguage": "선호하는 화면 언어:", - "LabelPreferredDisplayLanguageHelp": "Jellyfin 번역은 진행중인 프로젝트입니다.", - "LabelPrevious": "이전", "LabelProfileAudioCodecs": "오디오 코덱:", "LabelProfileCodecs": "코덱:", "LabelProfileCodecsHelp": "쉼표로 구분합니다. 모든 코덱에 적용할 수 있도록 빈 칸을 남겨둘 수 있습니다.", @@ -425,7 +373,6 @@ "LabelPublicHttpPortHelp": "로컬 HTTP 포트는 공용 포트 번호에 매핑되어야합니다.", "LabelPublicHttpsPort": "공용 HTTPS 포트 번호:", "LabelPublicHttpsPortHelp": "로컬 HTTPS 포트는 공용 포트 번호에 매핑 되어야합니다.", - "LabelReadHowYouCanContribute": "여러분이 기여할 수 있는 방법을 알려드립니다.", "LabelRecordingPath": "기본 재코딩 위치 :", "LabelRecordingPathHelp": "녹화를 저장할 기본 위치를 지정합니다. 비어 있는 경우 서버의 프로그램 데이터 폴더가 사용됩니다.", "LabelReleaseDate": "개봉일:", @@ -452,10 +399,7 @@ "LabelTime": "시각:", "LabelTimeLimitHours": "시간 제한 (시간):", "LabelTrackNumber": "트랙 번호:", - "LabelTranscodingAudioCodec": "오디오 코덱:", - "LabelTranscodingContainer": "컨테이너:", "LabelTranscodingTempPathHelp": "클라이언트로 제공될 트랜스코딩 파일이 위치한 사용자 경로를 설정합니다. 서버 기본값을 사용하려면 공백으로 두십시오.", - "LabelTranscodingVideoCodec": "비디오 코덱:", "LabelTriggerType": "트리거 종류:", "LabelTunerIpAddress": "튜너 IP 주소:", "LabelTunerType": "튜너 종류:", @@ -466,7 +410,6 @@ "LabelUserLibraryHelp": "장치에 어떤 사용자 라이브러리를 보여줄 지 선택합니다. 기본 설정을 사용하려면 비워두십시오.", "LabelUsername": "사용자명:", "LabelVersionInstalled": "{0} 설치됨", - "LabelYourFirstName": "이름:", "LabelYoureDone": "완료!", "LabelZipCode": "우편 번호:", "LibraryAccessHelp": "이 사용자와 공유할 라이브러리를 선택합니다. 관리자는 메타데이터 관리자를 사용하여 모든 폴더를 수정할 수 있습니다.", @@ -516,7 +459,6 @@ "MessageNothingHere": "아무것도 없습니다.", "MessagePasswordResetForUsers": "다음 사용자는 비밀번호를 재설정했습니다. 재설정을 수행하는데 사용된 핀 코드로 로그인 할 수 있습니다.", "MessagePleaseEnsureInternetMetadata": "인터넷 메타데이터 다운로드가 켜져 있는지 확인하세요.", - "MessageSettingsSaved": "설정이 저장되었습니다.", "MessageUnableToConnectToServer": "선택한 서버에 연결할 수 없습니다. 서버가 실행 중인지 확인후 다시 시도하세요.", "MessageUnsetContentHelp": "콘텐트가 일반 폴더로 표시됩니다. 최상의 결과를 위해 메타데이터 관리자를 사용하여 하위 폴더의 콘텐트 종류를 설정하세요.", "MinutesAfter": "몇 분 후에", @@ -525,7 +467,7 @@ "MoreUsersCanBeAddedLater": "나중에 대시보드에서 사용자를 더 추가할 수 있습니다.", "Mute": "음소거", "NewCollection": "새 컬렉션", - "NoNextUpItemsMessage": "아무도 찾지 못했어요. 여러분의 쇼를 보기 시작하세요!", + "MessageNoNextUpItems": "아무도 찾지 못했어요. 여러분의 쇼를 보기 시작하세요!", "OptionAdminUsers": "관리자", "OptionAlbum": "앨범", "OptionAlbumArtist": "앨범 아티스트", @@ -545,7 +487,6 @@ "OptionArtist": "아티스트", "OptionAscending": "오름차순", "OptionAuto": "자동", - "OptionAutomatic": "자동", "OptionBlockBooks": "도서", "OptionBlockChannelContent": "인터넷 채널 콘텐츠", "OptionBlockLiveTvChannels": "실시간 TV 방송 채널", @@ -588,7 +529,6 @@ "OptionEveryday": "매일", "OptionExternallyDownloaded": "외부 다운로드", "OptionFavorite": "즐겨찾기", - "OptionFriday": "금요일", "OptionHasSpecialFeatures": "특별한 기능", "OptionHasSubtitles": "자막", "OptionHasThemeSong": "테마송", @@ -603,10 +543,8 @@ "OptionLikes": "좋아함", "OptionMax": "최대", "OptionMissingEpisode": "누락된 에피소드", - "OptionMonday": "월요일", "OptionNameSort": "제목", "OptionNone": "없음", - "OptionOnAppStartup": "애플리케이션 시작할 때", "OptionOnInterval": "기간", "OptionParentalRating": "등급", "OptionPlainStorageFolders": "모든 폴더를 일반 저장소 폴더로 표시", @@ -625,18 +563,13 @@ "OptionResElement": "res 요소", "OptionResumable": "이어보기", "OptionRuntime": "상영 시간", - "OptionSaturday": "토요일", "OptionSaveMetadataAsHidden": "메타데이터와 이미지를 숨김 파일로 저장", "OptionSpecialEpisode": "스페셜", - "OptionSunday": "일요일", - "OptionThursday": "목요일", "OptionTrackName": "트랙 이름", - "OptionTuesday": "화요일", "OptionTvdbRating": "TVDb 평점", "OptionUnairedEpisode": "방송하지 않은 에피소드", "OptionUnplayed": "재생되지 않음", "OptionWakeFromSleep": "슬립모드에서 깨우기", - "OptionWednesday": "수요일", "OptionWeekdays": "주중", "OptionWeekends": "주말", "OptionWeekly": "주", @@ -648,7 +581,7 @@ "PasswordMatchError": "비밀번호와 비밀번호 확인이 일치해야 합니다.", "PasswordResetComplete": "비밀번호가 재설정되었습니다.", "PasswordResetConfirmation": "비밀번호를 재설정하겠습니까?", - "PasswordResetHeader": "비밀번호 재설정", + "HeaderResetPassword": "비밀번호 재설정", "PasswordSaved": "비밀번호가 저장되었습니다.", "PictureInPicture": "Picture in picture", "PinCodeResetComplete": "PIN 코드가 초기화되었습니다.", @@ -659,7 +592,6 @@ "PleaseSelectTwoItems": "최소 두 개의 항목을 선택하세요.", "Premiere": "프리미어", "Producer": "프로듀서", - "QueueAllFromHere": "여기부터 모두 대기열에 추가", "RecommendationBecauseYouLike": "{0} 을(를) 좋아하기 때문에", "RecommendationBecauseYouWatched": "{0} 을(를) 시청했기 때문에", "RecommendationDirectedBy": "{0} 감독", @@ -691,56 +623,28 @@ "SystemDlnaProfilesHelp": "시스템 프로필은 읽기 전용입니다. 시스템 프로필에 대한 변경 사항은 새로운 사용자 정의 프로필에 저장됩니다.", "TabAccess": "접속", "TabAdvanced": "고급", - "TabAlbumArtists": "앨범 아티스트", - "TabAlbums": "앨범", - "TabArtists": "아티스트", "TabCatalog": "카탈로그", - "TabChannels": "채널", "TabCodecs": "코덱", - "TabCollections": "컬렉션", "TabContainers": "컨테이너", "TabDashboard": "대시보드", - "TabDevices": "장치", "TabDirectPlay": "다이렉트 재생", - "TabDisplay": "화면", - "TabEpisodes": "에피소드", - "TabFavorites": "즐겨찾기", - "TabGenres": "장르", - "TabGuide": "가이드", - "TabInfo": "정보", "TabLatest": "최근", - "TabLiveTV": "실시간 TV", "TabLogs": "로그", - "TabMetadata": "메타데이터", - "TabMovies": "영화", "TabMusic": "음악", - "TabMusicVideos": "뮤직비디오", "TabMyPlugins": "내 플러그인", "TabNetworks": "네트워크", "TabNotifications": "알림", "TabOther": "기타", "TabParentalControl": "자녀 보호", - "TabPassword": "비밀번호", - "TabPlayback": "재생", - "TabPlaylist": "재생목록", - "TabPlaylists": "재생목록", "TabPlugins": "플러그인", "TabProfile": "프로필", "TabProfiles": "프로필", - "TabRecordings": "녹화", "TabResponses": "반응", "TabScheduledTasks": "예약 작업", - "TabSeries": "시리즈", "TabServer": "서버", "TabSettings": "설정", - "TabShows": "쇼", - "TabSongs": "노래", "TabStreaming": "스트리밍", - "TabSuggestions": "추천", - "TabTrailers": "예고편", - "TabTranscoding": "트랜스코딩", "TabUpcoming": "방송 예정", - "TabUsers": "사용자", "Tags": "태그", "TellUsAboutYourself": "자신에 대해 알려주세요", "ThisWizardWillGuideYou": "이 마법사는 설정 과정을 안내합니다. 시작하려면 선호하는 언어를 선택하세요.", @@ -749,7 +653,7 @@ "TrackCount": "{0} 트랙", "Tuesday": "화요일", "UninstallPluginConfirmation": "{0} 을(를) 설치 제거하겠습니까?", - "UninstallPluginHeader": "플러그인 제거", + "HeaderUninstallPlugin": "플러그인 제거", "Unmute": "음소거 취소", "UserProfilesIntro": "Jellyfin은 세분화된 디스플레이 설정, 재생 상태, 자녀 보호 기능을 갖춘 사용자 프로필을 지원합니다.", "ValueAlbumCount": "{0} 앨범", @@ -800,7 +704,6 @@ "Shows": "쇼", "Songs": "노래", "Sync": "동기화", - "AddItemToCollectionHelp": "항목을 컬렉션에 추가하려면 검색한 뒤 우클릭이나 탭 매뉴를 이용하십시오.", "AddToCollection": "컬렉션에 추가", "AddToPlayQueue": "재생 대기열에 추가", "AddedOnValue": "{0} 추가됨", @@ -812,8 +715,8 @@ "AllowMediaConversion": "미디어 변환 허용", "AllowOnTheFlySubtitleExtraction": "실시간 자막 추출 허용", "AllowOnTheFlySubtitleExtractionHelp": "비디오 트랜스코딩을 방지하기 위해 내장된 자막을 비디오에서 추출하여 텍스트로 클라이언트에 전송할 수 있습니다. 다만, 일부 시스템에서 추출 과정은 긴 시간이 걸리고 비디오 재생을 멈출 수 있습니다. 클라이언트에서 트랜스코딩을 사용할 수 없는 경우 이 기능을 비활성화하여 트랜스코딩 시 자막을 영상에 삽입하십시오.", - "AllowRemoteAccess": "이 Jellyfin 서버에 원격 접속을 허용합니다.", - "AllowRemoteAccessHelp": "체크 해제 시 모든 외부 접속은 차단됩니다.", + "AllowRemoteAccess": "이 서버에 원격 접속을 허용합니다.", + "AllowRemoteAccessHelp": "비 활성화할 시, 모든 외부 접속은 차단됩니다.", "AllowedRemoteAddressesHelp": "외부 접속을 허용할 IP 혹은 IP 넷마스크를 반점(,)으로 구분하여 입력하십시오. 공란일시, 모든 외부 접속이 허용됩니다.", "AlwaysPlaySubtitles": "항상 표시", "AlwaysPlaySubtitlesHelp": "오디오 언어를 불문하고 언어 설정에 적합한 자막을 불러옵니다.", @@ -825,15 +728,12 @@ "AspectRatio": "종횡비", "AuthProviderHelp": "이 사용자의 비밀번호를 인증할 때 사용할 인증 서비스 제공자를 선택하십시오.", "Auto": "자동", - "AutoBasedOnLanguageSetting": "자동 (언어 설정을 따름)", "Backdrop": "배경", "Banner": "배너", "BookLibraryHelp": "오디오 혹은 텍스트 도서가 지원됩니다. {0}도서 작명 가이드{1}를 참고하십시오.", "Box": "박스", "Browse": "탐색", - "ButtonEditImages": "이미지 편집", "ButtonFullscreen": "전체 화면", - "HeaderEpisodes": "에피소드", "HeaderExternalIds": "외부 ID:", "HeaderFavoriteMovies": "즐겨찾는 영화", "HeaderFavoriteVideos": "즐겨찾는 동영상", @@ -843,12 +743,8 @@ "ChannelNumber": "채널 번호", "Categories": "카테고리", "CancelRecording": "녹화 취소", - "ButtonUp": "위", "ButtonTrailer": "트레일러", - "ButtonShuffle": "셔플", "ButtonScanAllLibraries": "모든 라이브러리 스캔", - "ButtonOff": "끄기", - "ButtonDown": "아래", "ButtonAudioTracks": "오디오 트랙", "ButtonAddMediaLibrary": "미디어 라이브러리 추가", "ButtonAddImage": "이미지 추가", @@ -863,7 +759,6 @@ "Filters": "필터", "EveryNDays": "매 {0}일", "EnableThemeVideosHelp": "라이브러리를 탐색하는 동안 테마 비디오를 재생합니다.", - "EnableThemeVideos": "테마 비디오", "EnableThemeSongsHelp": "라이브러리를 탐색하는 동안 테마 곡을 재생합니다.", "EnableStreamLooping": "라이브 스트림 자동 반복", "EnableNextVideoInfoOverlayHelp": "비디오가 끝나면 현재 재생목록의 다음 비디오에 대한 정보를 표시합니다.", @@ -896,7 +791,6 @@ "Yes": "예", "Whitelist": "화이트리스트", "ViewPlaybackInfo": "재생 정보 보기", - "VideoRange": "비디오 길이", "ValueSeconds": "{0}초", "Upload": "업로드", "Unrated": "평점을 매기지 않음", @@ -909,7 +803,6 @@ "ThemeVideos": "테마 비디오", "ThemeSongs": "테마 곡", "TagsValue": "태그: {0}", - "TabResumeSettings": "재개", "TabNfoSettings": "NFO 설정", "TabNetworking": "네트워킹", "TV": "TV", @@ -953,7 +846,7 @@ "Programs": "프로그램", "Previous": "이전", "PreferEmbeddedTitlesOverFileNames": "파일 이름보다 내장된 제목 선호", - "PluginInstalledMessage": "플러그인이 성공적으로 설치되었습니다. 변경사항을 적용하려면 Jellyfin 서버를 재시작하십시오.", + "MessagePluginInstalled": "플러그인이 성공적으로 설치되었습니다. 변경사항을 적용하려면 Jellyfin 서버를 재시작하십시오.", "PleaseRestartServerName": "Jellyfin 서버를 재시작하십시오 - {0}.", "PleaseEnterNameOrId": "이름 또는 외부 ID를 입력하십시오.", "PlayNextEpisodeAutomatically": "자동으로 다음 에피소드 재생", @@ -978,7 +871,6 @@ "NumLocationsValue": "{0} 폴더", "Normal": "보통", "None": "None", - "NoSubtitles": "자막 없음", "No": "아니오", "Next": "다음", "NextUp": "다음", @@ -1004,7 +896,6 @@ "MediaInfoStreamTypeEmbeddedImage": "내장된 이미지", "MediaInfoStreamTypeData": "데이터", "MediaInfoStreamTypeAudio": "오디오", - "MediaInfoSoftware": "소프트웨어", "MediaInfoTimestamp": "타임스탬프", "MediaInfoSize": "크기", "MediaInfoLevel": "수준", @@ -1039,7 +930,6 @@ "LabelTheme": "테마:", "LabelTextSize": "글자 크기:", "LabelTextColor": "글자 색:", - "LabelSubtitles": "자막", "LabelSubtitleFormatHelp": "예시: srt", "LabelSubtitleDownloaders": "자막 다운로더:", "LabelStopping": "중지", @@ -1070,7 +960,6 @@ "LabelDynamicExternalId": "{0} ID:", "LabelDisplayLanguageHelp": "Jellyfin 번역은 진행 중인 프로젝트입니다.", "LabelDisplayLanguage": "표시 언어:", - "LabelDashboardTheme": "서버 대시보드 테마:", "LabelChannels": "채널:", "LabelCancelled": "취소됨", "LabelBitrate": "비트레이트:", @@ -1078,7 +967,6 @@ "LabelAudioCodec": "오디오 코덱:", "LabelAudioChannels": "오디오 채널:", "LabelAudioBitrate": "오디오 비트레이트:", - "LabelAudio": "오디오", "Items": "항목", "Kids": "어린이", "Home": "홈", @@ -1095,7 +983,6 @@ "HeaderMusicQuality": "음악 퀄리티", "HeaderImageOptions": "이미지 옵션", "HeaderHttpHeaders": "HTTP 헤더", - "HeaderHome": "홈", "HeaderFavoriteBooks": "즐겨찾는 도서", "HeaderEditImages": "이미지 수정", "HeaderDownloadSync": "다운로드 & 동기화", @@ -1104,7 +991,6 @@ "MessageDownloadQueued": "다운로드 대기 중.", "MessageDirectoryPickerLinuxInstruction": "Linux on Arch Linux, CentOS, Debian, Fedora, OpenSUSE, Ubuntu의 경우 서비스 사용자에게 최소한 저장 위치에 대한 읽기 권한을 부여해야 합니다.", "MessageDirectoryPickerBSDInstruction": "BSD의 경우, Jellyfin이 FreeNAS Jail에 액세스할 수 있도록 하려면 FreeNAS Jail 내에 스토리지를 구성해야 할 수도 있습니다.", - "LinksValue": "링크: {0}", "LatestFromLibrary": "최근 {0}", "LabelYear": "년도:", "LabelVaapiDeviceHelp": "하드웨어 가속에 쓰이는 렌더 노드입니다.", @@ -1113,7 +999,6 @@ "LabelTranscodingThreadCountHelp": "트랜스코딩에 사용할 스레드의 최대 갯수를 선택하십시오. 스레드의 갯수를 줄이면 CPU사용량이 줄어들지만, 부드러운 재생에 필요한 만큼 빠르게 변환되지 않을 수 있습니다.", "LabelTranscodingThreadCount": "트랜스코딩 스레드 수:", "LabelTextBackgroundColor": "글자 배경 색깔:", - "LabelSoundEffects": "음향 효과:", "LabelSortTitle": "제목 정렬:", "LabelSortOrder": "정렬 순서:", "LabelSortBy": "정렬 기준:", @@ -1128,7 +1013,6 @@ "HeaderSortOrder": "정렬 순서", "HeaderSortBy": "정렬 기준", "HeaderRecordingPostProcessing": "녹화 후처리 작업", - "HeaderPeople": "사람들", "HeaderOtherItems": "다른 항목", "HeaderLibraryOrder": "라이브러리 순서", "HeaderDefaultRecordingSettings": "기본 녹화 설정", @@ -1143,7 +1027,7 @@ "FileReadCancelled": "파일 읽기 작업이 취소되었습니다.", "FetchingData": "추가 데이터를 가져오는 중", "ExtraLarge": "매우 큼", - "ErrorMessageStartHourGreaterThanEnd": "종료 시간은 시작 시간보다 커야 합니다.", + "ErrorStartHourGreaterThanEnd": "종료 시간은 시작 시간보다 커야 합니다.", "Display": "디스플레이", "DirectStreamHelp1": "이 미디어는 해상도 및 미디어 유형(H.264, AC3 등)과 관련하여 장치와 호환되지만, 파일 컨테이너(mkv, avi, wmv 등)와는 호환되지 않습니다. 비디오는 장치로 스트리밍 되기 전에 즉각 재포장됩니다.", "Descending": "내림차순", @@ -1167,7 +1051,6 @@ "LiveBroadcasts": "실시간 방송", "LabelTypeMetadataDownloaders": "{0} 메타데이터 다운로더:", "LabelType": "유형:", - "LabelSkin": "스킨:", "LabelPleaseRestart": "변경사항은 웹 클라이언트를 다시 불러오면 적용됩니다.", "LabelPlayMethod": "재생 방식:", "LabelPersonRoleHelp": "예시: Ice cream truch driver", @@ -1199,7 +1082,6 @@ "HeaderKodiMetadataHelp": "NFO 메타데이터를 활성화/비활성화하려면, Jellyfin 라이브러리 설정에서 라이브러리를 편집하고 메타데이터 보호기 섹션을 찾으십시오.", "HeaderKeepRecording": "녹화 유지", "HeaderForKids": "아이들용", - "HeaderDisplay": "디스플레이", "HeaderDetectMyDevices": "내 장치 탐색", "HeaderDeleteItems": "항목 제거", "HeaderConfirmRevokeApiKey": "API 키 해지", @@ -1211,7 +1093,6 @@ "File": "파일", "Favorite": "즐겨찾기", "Episodes": "에피소드", - "EnableThemeSongs": "테마 곡", "EnablePhotos": "사진 표시", "EnableHardwareEncoding": "하드웨어 인코딩 활성화", "AllowHWTranscodingHelp": "튜너가 방송 스트림을 트랜스코드하도록 허용합니다. 이는 서버가 요구하는 트랜스코딩을 줄이는 데 도움이 될 수 있습니다.", @@ -1241,7 +1122,6 @@ "ConfirmDeleteItems": "이 항목들을 삭제하면 파일 시스템과 라이브러리 모두에서 삭제됩니다. 계속하겠습니까?", "DeleteDeviceConfirmation": "정말로 이 장치를 제거하시겠습니까? 사용자가 로그인하면 다시 나타날것입니다.", "DisplayMissingEpisodesWithinSeasons": "시즌 내 누락된 에피소드 표시", - "EnableBackdrops": "배경", "EnableBackdropsHelp": "라이브러리를 탐색하는 동안 일부 페이지의 배경을 표시합니다.", "ErrorAddingXmlTvFile": "XMLTV 파일에 액세스하는 동안 오류가 발생했습니다. 파일이 존재하는지 확인 후 다시 시도하십시오.", "ErrorDeletingItem": "Jellyfin 서버에서 항목을 제거하는 중에 오류가 발생했습니다. Jellyfin 서버가 미디어 폴더에 대해 쓰기 권한이 있는지 확인한 후 다시 시도하십시오.", @@ -1254,11 +1134,10 @@ "H264CrfHelp": "CRF(고정 레이트 팩터)는 x264 인코더의 기본 품질 설정입니다. 0에서 51 사이의 값을 설정할 수 있습니다. 값이 작을수록 품질이 향상됩니다(파일 크기가 커지면서). Sane 값은 18과 28 사이입니다. x264의 기본값은 23이므로 시작점으로 사용할 수 있습니다.", "LabelSeasonNumber": "시즌 번호:", "LabelPlayer": "재생기:", - "LaunchWebAppOnStartup": "서버를 시작할 때 웹 인터페이스 실행", "MediaInfoBitDepth": "비트뎁스", "LabelPostProcessor": "후처리 애플리케이션:", "RefreshQueued": "새로 고침 대기 중", - "NoPluginConfigurationMessage": "이 플러그인은 설정할 것이 없습니다.", + "MessageNoPluginConfiguration": "이 플러그인은 설정할 것이 없습니다.", "OptionExtractChapterImage": "챕터 이미지 추출 활성화", "Up": "위", "EasyPasswordHelp": "쉬운 핀 코드는 지원되는 기기에서 오프라인 접근을 할 때나 내부 내트워크 로그인에서 사용됩니다.", @@ -1282,7 +1161,6 @@ "Features": "기능", "ErrorPleaseSelectLineup": "라인업을 선택하고 다시 시도하십시오. 이용 가능한 라인업이 없으면 계정, 비밀번호, 우편번호가 정확한지 확인하십시오.", "ErrorAddingListingsToSchedulesDirect": "Schedules Direct 계정에 라인업을 추가하는 중에 오류가 발생했습니다. Schedules Direct는 계정 당 제한된 수의 라인업만이 허용됩니다. 계속하려면 Schedules Direct 웹사이트에 로그인하여 다른 항목을 삭제해야 할 수 있습니다.", - "CopyStreamURLError": "URL을 복사하는 중에 오류가 발생했습니다.", "ColorTransfer": "컬러 변환", "AskAdminToCreateLibrary": "라이브러리를 생성하려면 관리자에게 문의하십시오.", "LabelCorruptedFrames": "손상된 프레임:", @@ -1306,7 +1184,6 @@ "AllowFfmpegThrottlingHelp": "트랜스코딩이나 리먹스 작업이 현재 재생 중인 위치를 넘어 충분히 진행되면 리소스를 절약하기 위해 작업을 중지합니다. 이는 재생 구간을 자주 변경하지 않을 경우에 가장 적합합니다. 재생 시 문제가 발생하면 이 항목을 비활성화하십시오.", "AllowFfmpegThrottling": "트랜스코딩 시 스로틀링", "MessageLeaveEmptyToInherit": "상위 항목의 설정이나 전역 설정값을 그대로 적용하기 위해서는 공백으로 두십시오.", - "MessageInstallPluginFromApp": "이 플러그인은 사용할 앱 내부에서 설치해야 합니다.", "MessageImageTypeNotSelected": "드롭다운 메뉴에서 이미지 유형을 선택하십시오.", "MessageCreateAccountAt": "{0}에서 계정 만들기", "MessageConfirmRevokeApiKey": "정말 api 키를 무효화하시겠습니까? Jellyfin 서버와의 연결이 예고 없이 중단될 수 있습니다.", @@ -1315,7 +1192,6 @@ "MediaInfoRefFrames": "참조 프레임", "MediaInfoPixelFormat": "픽셀 형식", "MapChannels": "채널 매핑", - "LaunchWebAppOnStartupHelp": "서버가 처음 시작되면 웹 브라우저에서 웹 클라이언트를 실행하십시오. 서버 재시작의 경우에는 적용되지 않습니다.", "Large": "크게", "LanNetworksHelp": "대역폭을 강제로 제한할 때 로컬 네트워크로 간주되는 쉼표로 구분된 IP 주소 및 IP/서브넷 마스크 목록입니다. 지정될 경우 모든 다른 IP 주소는 외부 네트워크로 간주되며 외부 대역폭 제한이 적용됩니다. 공백일 경우 서버의 서브넷만이 로컬 네트워크로 간주됩니다.", "LabelffmpegPathHelp": "ffmpeg 실행 파일 혹은 ffmpeg를 포함하는 폴더 경로입니다.", @@ -1416,13 +1292,10 @@ "NoSubtitlesHelp": "자막을 자동으로 불러오지 않습니다. 재생 중에 수동으로 켤 수 있습니다.", "MusicLibraryHelp": "{0}음악 이름 지정 규칙{1}을 확인하십시오.", "MovieLibraryHelp": "{0}영화 이름 지정 규칙{1}을 확인하십시오.", - "MessageUnauthorizedUser": "현재 서버에 접속할 권한이 없습니다. 자세한 정보는 서버 관리자에게 문의하십시오.", "HeaderFavoritePlaylists": "즐겨찾는 플레이리스트", "ButtonTogglePlaylist": "플레이리스트", - "ButtonToggleContextMenu": "더보기", "Rate": "평", "PerfectMatch": "정확히 일치", - "OtherArtist": "다른 아티스트", "ButtonSyncPlay": "SyncPlay", "HeaderDVR": "DVR", "EnableDecodingColorDepth10Vp9": "10비트 VP9하드웨어 디코딩 사용합니다", diff --git a/src/strings/lt-lt.json b/src/strings/lt-lt.json index c0b254251a..2d890a4fca 100644 --- a/src/strings/lt-lt.json +++ b/src/strings/lt-lt.json @@ -9,48 +9,31 @@ "Anytime": "Bet kada", "AroundTime": "Maždaug {0}", "AsManyAsPossible": "Kiek įmanoma", - "AttributeNew": "Naujas", "Backdrops": "Fonai", "BirthLocation": "Gimimo vieta", - "ButtonAdd": "Pridėti", "ButtonAddScheduledTaskTrigger": "Pridėti jungiklį", "ButtonAddUser": "Pridėt vartotoją", - "ButtonArrowDown": "Žemyn", "ButtonArrowLeft": "Kairėn", "ButtonArrowRight": "Dešinėn", - "ButtonArrowUp": "Aukštyn", "ButtonBack": "Atgal", "ButtonCancel": "Atšaukti", - "ButtonDelete": "Ištrinti", - "ButtonDeleteImage": "Trinti paveikslus", - "ButtonEdit": "Redaguoti", - "ButtonFilter": "Filtras", "ButtonGotIt": "Supratau", - "ButtonHelp": "Pagalba", - "ButtonHome": "Pradinis", "ButtonManualLogin": "Rankinis prisijungimas", - "ButtonNew": "Naujas", "ButtonNextTrack": "Kitas takelis", "ButtonOk": "OK", "ButtonPause": "Pauzė", - "ButtonPlay": "Leisti", "ButtonPreviousTrack": "Ankstesnis takelis", "ButtonQuickStartGuide": "Greitos pradžios gidas", - "ButtonRefresh": "Atnaujinti", "ButtonRefreshGuideData": "Atnaujinti gido duomenis", "ButtonRemove": "Pašalinti", "ButtonResetPassword": "Atstatyti slaptažodį", "ButtonRestart": "Iš naujo", - "ButtonSave": "Saugoti", - "ButtonSearch": "Paieška", "ButtonSelectDirectory": "Rinktis direktoriją", "ButtonSettings": "Nustatymai", "ButtonSignIn": "Prisijungti", "ButtonSignOut": "Atsijungti", - "ButtonSort": "Rūšiuoti", "ButtonStop": "Stabdyti", "ButtonSubmit": "Pateikti", - "ButtonSubtitles": "Subtitrai", "CancelRecording": "Atšaukti įrašymą", "CancelSeries": "Atšaukti laidą", "Categories": "Kategorijos", @@ -65,7 +48,7 @@ "ConfirmDeletion": "Patvirtinti trynimą", "Continuing": "Tęsiamas", "CustomDlnaProfilesHelp": "Sukurti kitą profilį naujam įrenginiui ar pakeisti sistemos profilį.", - "DefaultErrorMessage": "Įvyko klaida vykdant užklausą. Pabandykite vėliau.", + "ErrorDefault": "Įvyko klaida vykdant užklausą. Pabandykite vėliau.", "Delete": "Ištrinti", "DeleteMedia": "Trinti mediją", "DeviceAccessHelp": "Tai taikoma tik įrenginiams, kurie gali būti identifikuojami, ir neuždraus prieigos per naršyklę. Vartotojo įrenginio prieigos filtravimas neleis jiems naudotis naujais įrenginiais kol jie nepatvirtinti čia.", @@ -94,16 +77,11 @@ "HDPrograms": "HD laidos", "HeaderActiveDevices": "Aktyvūs įrenginiai", "HeaderActiveRecordings": "Aktyvūs įrašai", - "HeaderAddScheduledTaskTrigger": "Pridėti jungiklį", "HeaderAddToCollection": "Pridėti į kolekciją", "HeaderAddToPlaylist": "Pridėti į grojaraštį", - "HeaderAddUser": "Pridėti vartotoją", "HeaderAdditionalParts": "Papildomos dalys", - "HeaderAutomaticUpdates": "Automatiniai atnaujinimai", "HeaderCancelRecording": "Atšaukti įrašymą", "HeaderCancelSeries": "Atšaukti laidą", - "HeaderCastCrew": "Kūrėjai", - "HeaderChannels": "Kanalai", "HeaderContinueWatching": "Žiūrėti toliau", "HeaderCustomDlnaProfiles": "Kiti profiliai", "HeaderDeleteItem": "Ištrinti elementą", @@ -115,7 +93,6 @@ "HeaderEnabledFieldsHelp": "Nuimkite varnelę nuo lauko kad jį užrakinti ir neleisti keisti jo duomenų.", "HeaderFeatureAccess": "Prieiga prie funkcijų", "HeaderFetchImages": "Gauti vaizdus:", - "HeaderFilters": "Filtrai", "HeaderFrequentlyPlayed": "Dažnai leista", "HeaderIdentificationCriteriaHelp": "Įveskite bent vieną identifikavimo kriterijų.", "HeaderIdentifyItemHelp": "Įveskite vieną ar daugiau paieškos kriterijų. Pašalinkite kriterijų jei norite gauti daugiau paieškos rezultatų.", @@ -129,7 +106,6 @@ "HeaderMetadataSettings": "Metaduomenų nustatymai", "HeaderMoreLikeThis": "Daugiau panašių", "HeaderMusicVideos": "Muzikiniai klipai", - "HeaderNextUp": "Toliau eilėje", "HeaderPaths": "Keliai", "HeaderPleaseSignIn": "Prašau prisijungti", "HeaderPreferredMetadataLanguage": "Pageidaujama metaduomenų kalba", @@ -161,8 +137,6 @@ "LabelAirsBeforeSeason": "Rodoma prieš sezoną:", "LabelAlbum": "Albumas:", "LabelAlbumArtists": "Albumo atlikėjai:", - "LabelAllowServerAutoRestart": "Leisti serveriui automatiškai persikrauti pritaikant atnaujinimus", - "LabelAllowServerAutoRestartHelp": "Serveris persikraus tik neveikimo metu, kai nebus aktyvus nei vienas vartotojas.", "LabelArtists": "Atlikėjai:", "LabelArtistsHelp": "Atskirti kelis naudojant ;", "LabelAudioLanguagePreference": "Garso kalbos pageidavimas:", @@ -184,7 +158,6 @@ "LabelDay": "Diena:", "LabelDeathDate": "Mirties data:", "LabelDeviceDescription": "Įrenginio aprašymas", - "LabelDisplayMissingEpisodesWithinSeasons": "Rodyti sezonuose trūkstamas serijas", "LabelDisplayOrder": "Rodymo tvarka:", "LabelDynamicExternalId": "{0} ID:", "LabelEnableAutomaticPortMap": "Įjungti automatinį portų nukreipimą", @@ -238,7 +211,6 @@ "LabelName": "Pavadinimas:", "LabelNewPassword": "Naujas slaptažodis:", "LabelNewPasswordConfirm": "Naujas slaptažodis (pakartokite):", - "LabelNext": "Kitas", "LabelNumber": "Numeris:", "LabelNumberOfGuideDays": "Kiek dienų gido duomenų atsisiųsti:", "LabelNumberOfGuideDaysHelp": "Atsiuntus daugiau gido duomenų dienų bus galima toliau numatyti tvarkaraštį, tačiau tai užtruks ilgiau. Auto parinks dienų skaičių pagal kanalų kiekį.", @@ -253,15 +225,12 @@ "LabelPlaceOfBirth": "Gimimo vieta:", "LabelPlaylist": "Grojaraštis:", "LabelPreferredDisplayLanguage": "Pageidautina rodymo kalba:", - "LabelPreferredDisplayLanguageHelp": "Jellyfin vertimas yra besitęsiantis projektas.", - "LabelPrevious": "Ankstesnis", "LabelProfileCodecsHelp": "Atskirta kableliais. Palikus tuščią bus pritaikyta visiems kodekams.", "LabelProfileContainersHelp": "Atskirta kableliais. Palikus tuščią bus pritaikyta visiems konteineriams.", "LabelPublicHttpPort": "Numeris viešo HTTP porto:", "LabelPublicHttpPortHelp": "Numeris viešo porto, kurį reiktų susieti su vietiniu HTTP portu.", "LabelPublicHttpsPort": "Numeris viešo HTTPS porto:", "LabelPublicHttpsPortHelp": "Viešas porto numeris, kurį reiktų susieti su vietiniu HTTPS portu.", - "LabelReadHowYouCanContribute": "Sužinokite, kaip galite prisidėti.", "LabelRecord": "Rašyti:", "LabelRecordingPath": "Įprasta įrašų vieta:", "LabelRecordingPathHelp": "Nurodykite įprastą vietą, kur saugoti įrašus. Palikus tuščia bus saugoma į serverio programos duomenų direktoriją.", @@ -289,7 +258,6 @@ "LabelUseNotificationServices": "Naudoti šias paslaugas:", "LabelUser": "Vartotojas:", "LabelYear": "Metai:", - "LabelYourFirstName": "Jūsų vardas:", "LabelYoureDone": "Baigta!", "LatestFromLibrary": "Vėliausi {0}", "LibraryAccessHelp": "Pasirinkite medijos aplankus, kuriuos norite dalintis su šiuo vartotoju. Administratoriai galės redaguoti visus aplankus per metaduomenų valdymą.", @@ -322,7 +290,7 @@ "NewEpisodes": "Naujoms serijoms", "NewEpisodesOnly": "Tik naujas serijas", "News": "Naujienos", - "NoNextUpItemsMessage": "Nieko neradau. Pradėkite žiūrėti laidas!", + "MessageNoNextUpItems": "Nieko neradau. Pradėkite žiūrėti laidas!", "NoSubtitleSearchResultsFound": "Nieko neradau.", "OptionAdminUsers": "Administratoriai", "OptionAlbum": "Albumas", @@ -365,7 +333,6 @@ "OptionEnableAccessToAllLibraries": "Leisti prieigą prie visų bibliotekos", "OptionEnded": "Pasibaigė", "OptionFavorite": "Mėgstami", - "OptionFriday": "Penktadienis", "OptionHasSpecialFeatures": "Ypatingos serijos", "OptionHasSubtitles": "Subtitrai", "OptionHasThemeSong": "Teminė daina", @@ -379,10 +346,8 @@ "OptionIsSD": "SH", "OptionLikes": "Patinka", "OptionMissingEpisode": "Trūkstamos serijos", - "OptionMonday": "Pirmadienis", "OptionNameSort": "Vardas", "OptionNew": "Naujas...", - "OptionOnAppStartup": "Paleidus programą", "OptionOnInterval": "Pasikartojantis", "OptionParentalRating": "Tėvų reitingas", "OptionPlayCount": "Rodymų kiekis", @@ -391,17 +356,12 @@ "OptionReleaseDate": "Išleidimo data", "OptionResumable": "Pratęsiamas", "OptionRuntime": "Trukmė", - "OptionSaturday": "Šeštadienis", "OptionSpecialEpisode": "Ypatingos", - "OptionSunday": "Sekmadienis", - "OptionThursday": "Ketvirtadienis", "OptionTrackName": "Dainos pavadinimas", - "OptionTuesday": "Antradienis", "OptionTvdbRating": "Tvdb vertinimas", "OptionUnairedEpisode": "Nerodytos serijos", "OptionUnplayed": "Nerodyta", "OptionWakeFromSleep": "Žadinti iš miego", - "OptionWednesday": "Trečiadienis", "OptionWeekly": "Savaitinis", "OriginalAirDateValue": "Pirmo eterio data: {0}", "Overview": "Apžvalga", @@ -421,7 +381,6 @@ "Premieres": "Premieras", "Producer": "Prodiuseris", "ProductionLocations": "Filmavimo vietos", - "QueueAllFromHere": "Į eilę viską nuo čia", "RecentlyWatched": "Nesenai žiūrėta", "Record": "Įrašyti", "RecordSeries": "Įrašyti laidą", @@ -469,38 +428,17 @@ "SystemDlnaProfilesHelp": "Sistemos profiliai yra tik skaitomi. Pakeitimai sistemos profiliui bus išsaugoti į naują kitą profilį.", "TabAccess": "Prieiga", "TabAdvanced": "Sudėtingiau", - "TabAlbumArtists": "Albumo atlikėjai", - "TabAlbums": "Albumai", - "TabArtists": "Atlikėjai", "TabCatalog": "Katalogas", - "TabChannels": "Kanalai", - "TabCollections": "Kolekcijos", - "TabEpisodes": "Serijos", - "TabFavorites": "Mėgstamiausi", - "TabGenres": "Žanrai", - "TabGuide": "Gidas", "TabLatest": "Vėliausi", - "TabMetadata": "Metaduomenys", - "TabMovies": "Filmai", "TabMusic": "Muzika", - "TabMusicVideos": "Muzikos klipai", "TabMyPlugins": "Mano priedai", "TabNetworks": "Tinklai", "TabNotifications": "Pranešimai", "TabOther": "Kita", - "TabPassword": "Slaptažodis", - "TabPlaylist": "Grojaraštis", "TabProfile": "Profilis", "TabProfiles": "Profiliai", - "TabRecordings": "Įrašai", - "TabSeries": "Laidos", "TabServer": "Serveris", "TabSettings": "Nustatymai", - "TabShows": "Laidos", - "TabSongs": "Dainos", - "TabSuggestions": "Pasiūlymai", - "TabTrailers": "Anonsai", - "TabTranscoding": "Transkodavimas", "TabUpcoming": "Būsimi", "Tags": "Žymės", "TellUsAboutYourself": "Papasakokite apie save", @@ -553,24 +491,17 @@ "ButtonAddServer": "Pridėti Serverį", "ButtonAudioTracks": "Garso takeliai", "ButtonChangeServer": "Keisti serverį", - "ButtonConnect": "Prisijungti", - "ButtonDown": "Žemyn", - "ButtonDownload": "Atsisiųsti", - "ButtonEditImages": "Redaguoti vaizdus", "ButtonForgotPassword": "Pamiršau slaptažodį", "ButtonFullscreen": "Per visą ekraną", "ButtonGuide": "Gidas", "ButtonInfo": "Info", - "ButtonLearnMore": "Sužinoti daugiau", "ButtonLibraryAccess": "Mediatekos prieiga", "ButtonMore": "Daugiau", "ButtonNetwork": "Tinklas", - "ButtonOff": "Išjungti", "ButtonOpen": "Atidaryti", "ButtonParentalControl": "Tėvų kontrolė", "ButtonProfile": "Profilis", "ButtonRename": "Pervadinti", - "ButtonRepeat": "Kartoti", "ButtonResume": "Tęsti", "ButtonRevoke": "Panaikinti", "ButtonScanAllLibraries": "Nuskaityti Visas Bibliotekas", @@ -580,8 +511,6 @@ "ButtonShutdown": "Išjungti", "ButtonStart": "Pradėti", "ButtonUninstall": "Pašalinti", - "ButtonUp": "Aukštyn", - "ButtonViewWebsite": "Žiūrėti svetainę", "ButtonWebsite": "Svetainė", "ChangingMetadataImageSettingsNewContent": "Metaduomenų ar iliustracijų pakeitimai bus pritaikyti tik naujai pridėtam turiniui. Norint pritaikyti pakeitimus esančiam turiniui reikės atnaujinti metaduomenis rankiniu būdu.", "Channels": "Kanalai", @@ -613,11 +542,9 @@ "AllLibraries": "Visos bibliotekos", "AllowMediaConversionHelp": "Leisti arba uždrausti medijos konvertavimą.", "AlwaysPlaySubtitles": "Visada rodyti subtitrus", - "AutoBasedOnLanguageSetting": "Auto (pagal kalbos parinktį)", "BookLibraryHelp": "Garso ir tekstinės knygos yra palaikomos. Peržiūrėkite {0} knygų vardinimo gidą {1}.", "ButtonEditOtherUserPreferences": "Keisti šio vartotojo profilį, paveikslą ir asmeninius nustatymus.", "ButtonResetEasyPassword": "Atstatyti pin kodą", - "ButtonShuffle": "Sumaišyti", "ColorPrimaries": "Pirminės spalvos", "ConfirmEndPlayerSession": "Ar norite išjungti Jellyfin ant {0}?", "Descending": "Mažėjančia tvarka", @@ -638,30 +565,25 @@ "EnableNextVideoInfoOverlayHelp": "Vaizdo įrašo pabaigoje rodyti informacija apie sekantį vaizdo įrašą, esantį grojaraštyje.", "EnablePhotos": "Rodyti nuotraukas", "EnablePhotosHelp": "Nuotraukos bus rodomos šalia kitų medijos failų.", - "EnableThemeSongs": "Teminės dainos", "AspectRatio": "Vaizdo Santykis", "Ascending": "Didėjančia tvarka", "AllComplexFormats": "Visi Sudėtingi Formatai (ASS, SSA, VOBSUB, PGS, SUB/IDX, t.t.)", "AllowHWTranscodingHelp": "Leisti imtuvui perkoduoti srautus grojant. Tai gali sumažinti perkodavimus reikalingus serveriui.", "AuthProviderHelp": "Pasirinkite autentifikavimo paslaugos teikėją šio vartotojo slaptažodžio autentifikavimui.", - "AddItemToCollectionHelp": "Pridėkite įrašus į kolekciją. Suraskite įrašą, bei naudokite jo meniu, kad pridėti į kolekciją.", "AllowedRemoteAddressesHelp": "IP adresų atskirtų kableliais sąrašas ar IP/netmask įrašai tinklams, kurie turės teisę prisijungti nuotoliniu būdu. Visi adresai bus leidžiami, jei įrašas tuščias.", "HeaderMyMedia": "Mediateka", "HeaderMyDevice": "Mano įrenginys", - "HeaderMovies": "Filmai", "HeaderMyMediaSmall": "Mediateka", "HeaderNewDevices": "Naujas įrenginys", "AddToPlayQueue": "Pridėti prie grojaraščio", "AllowRemoteAccessHelp": "Jei nepažymėta, visi nuotoliniai prisijungimai bus blokuojami.", "Banner": "Juosta", "HeaderDeleteDevice": "Ištrinti prietaisą", - "BrowsePluginCatalogMessage": "Peržiūrėti įskiepių katalogą.", - "EnableBackdrops": "Fonai", + "MessageBrowsePluginCatalog": "Peržiūrėti įskiepių katalogą.", "EnableCinemaMode": "Kino režimas", "EnableDisplayMirroring": "Ekrano dubliavimas", "CopyStreamURL": "Kopijuoti srauto nuorodą", "HeaderConfirmPluginInstallation": "Patvirtinti įskiepio diegimą", - "HeaderEpisodes": "Serijos", "HeaderError": "Klaida", "OptionBlockMovies": "Filmai", "Songs": "Kūriniai", @@ -704,7 +626,6 @@ "HeaderDeveloperInfo": "Kūrėjo informacija", "HeaderDevices": "Įrenginiai", "HeaderDirectPlayProfile": "Tiesioginio leidimo profilis", - "HeaderLiveTV": "TV gyvai", "ButtonTrailer": "Anonsas", "Depressed": "Spaudžiamas", "DirectPlaying": "Tiesioginis leidimas", @@ -719,30 +640,23 @@ "EnableExternalVideoPlayersHelp": "Paleidus vaizdo įrašą, bus rodomas išorinio grotuvo meniu.", "EnableHardwareEncoding": "Įjungti aparatinės įrangos kodavimą", "EnableThemeSongsHelp": "Naršant bibliotekoje paleisti teminius takelius fone.", - "EnableThemeVideos": "Teminiai vaizdo įrašai", "EnableThemeVideosHelp": "Naršant bibliotekoje paleisti teminius vaizdo įrašus fone.", "Episodes": "Serijos", - "HeaderBooks": "Knygos", "HeaderBranding": "Įforminimas", "HeaderCodecProfile": "Kodeko profilis", "HeaderFavoritePeople": "Mėgstami žmonės", "HeaderForKids": "Vaikams", - "HeaderForgotPassword": "Pamiršau slaptažodį", - "HeaderGenres": "Žanrai", "HeaderGuideProviders": "TV gido informacijos teikėjai", - "HeaderHome": "Pradinis", "HeaderIdentification": "Identifikacija", "HeaderIdentificationHeader": "Identifikavimo antraštė", "HeaderHttpHeaders": "HTTP-antraštės", "OptionAuto": "Auto", - "OptionAutomatic": "Auto", "OptionAutomaticallyGroupSeriesHelp": "Jei įjungta - serijos skirtinguose bibliotekos aplankaluose bus apjungtos į vieną serialą.", "OptionBanner": "Juosta", "Playlists": "Grojaraštis", "HeaderDateIssued": "Išdavimo data", "HeaderDefaultRecordingSettings": "Numatytieji įrašymo nustatymai", "HeaderDetectMyDevices": "Rasti mano prietaisus", - "HeaderDisplay": "Ekranas", "HeaderFavoriteBooks": "Mėgstamiausios knygos", "HeaderFavoriteMovies": "Mėgstamiausi filmai", "HeaderFavoriteShows": "Mėgstamiausi serialai", @@ -751,12 +665,10 @@ "HeaderFavoriteSongs": "Mėgstamos dainos", "HeaderImageOptions": "Vaizdo parinktys", "HeaderInstall": "Diegti", - "HeaderItems": "Elementai", "HeaderApiKeysHelp": "Išorinėms programoms reikalingas API raktas norint prisijungti prie Jellyfin serverio. Raktai išduodami prisijungus prie Jellyfin paskyros, arba raktas į programą suteikimas rankiniu būdu.", "HeaderSelectTranscodingPath": "Išrinkite kelią į aplanką laikiniems perkodavimo failams", "HeaderSelectTranscodingPathHelp": "Suraskite arba įrašykite kelią serverio į aplanką laikinų perkodavimo failų saugojimui. Aplankalas turi būti su rašymo teise.", "HeaderSendMessage": "Siųsti žinutę", - "HeaderSeries": "Serialai", "HeaderSeriesStatus": "Serialo būsena", "HeaderServerSettings": "Serverio nustatymai", "HeaderSubtitleProfile": "Subtitrų profilis", @@ -780,19 +692,15 @@ "LabelAllowedRemoteAddressesMode": "Nuotolinio IP adresų filtro režimas:", "HeaderLoginFailure": "Prisijungimo klaida", "Hide": "Paslėpti", - "LabelAll": "Visi", - "LabelAudio": "Garsas", "LabelCancelled": "Atšaukta", "LabelCertificatePassword": "Sertifikato slaptažodis:", "LabelCertificatePasswordHelp": "Jei sertifikatui reikalingas slaptažodis, jį įveskite čia.", "LabelCustomCertificatePath": "Pasirinktinis SSL sertifikatas kelias:", - "LabelCustomDeviceDisplayName": "Rodomas vardas:", "LabelDisplayLanguage": "Kalba:", "LabelDisplayName": "Rodomas vardas:", "EnableBackdropsHelp": "Rodyti fono dekoracijas naršant bibliotekoje.", "FolderTypeUnset": "Įvairus turinys", "HeaderAddUpdateImage": "Pridėti/Įkelti atvaizdą", - "HeaderTags": "Žymės", "LabelAlbumArtPN": "Albumo iliustracijos PN:", "HeaderSettings": "Nustatymai", "LabelMatchType": "Atitikties tipas:", @@ -804,7 +712,6 @@ "Genre": "Žanras", "ErrorPleaseSelectLineup": "Pasirinkite TV programą ir bandykite dar kartą. Jei TV programos nerodoma, patikrinkite ar teisingas jūsų vartotojo vardas, slaptažodis ir pašto kodas.", "HeaderRevisionHistory": "Versijų istorija", - "HeaderShutdown": "Išjungti", "HeaderSortBy": "Rūšiuoti pagal", "HeaderTranscodingProfileHelp": "Pridėti perkodavimo profilius, kad nurodyti, kokius formatus reikia naudoti, kai reikia perkoduoti.", "HeaderTunerDevices": "Tiunerio prietaisai", @@ -817,7 +724,6 @@ "HeaderVideoQuality": "Vaizdo įrašo kokybė", "HeaderVideoType": "Video įrašo tipas", "HeaderVideoTypes": "Video tipai", - "LabelDashboardTheme": "Serverio puslapio tema:", "LabelDownloadLanguages": "Kalbos parsiuntimui:", "LabelDropShadow": "Mesti šešėlį:", "LabelEasyPinCode": "Greitas PID kodas:", @@ -831,15 +737,13 @@ "HeaderAccessSchedule": "Prieigos tvarkaraštis", "HeaderAccessScheduleHelp": "Sukurkite prieigos tvarkaraštį, kad apribotumėte prieigą tam tikromis valandomis.", "HeaderContainerProfile": "Konteinerio profilis", - "ErrorMessageStartHourGreaterThanEnd": "Pabaigos laikas turi būti didesnis nei pradžios laikas.", - "HeaderFeatures": "Medžiagos", + "ErrorStartHourGreaterThanEnd": "Pabaigos laikas turi būti didesnis nei pradžios laikas.", "ErrorSavingTvProvider": "Išsaugant TV teikėją įvyko klaida. Įsitikinkite, kad jis prieinamas, ir bandykite dar kartą.", "HeaderKodiMetadataHelp": "Norėdami įjungti arba išjungti NFO metaduomenis, redaguokite biblioteką Jellyfin bibliotekos nustatymuose, metaduomenų išsaugojimo skyriuje.", "EveryNDays": "Kas {0} dienas", "HeaderLatestMovies": "Naujausi filmai", "HeaderLatestMusic": "Naujausia muzika", "HeaderLibraryFolders": "Mediatekos aplankai", - "HeaderMediaInfo": "Apie medija", "HeaderNextEpisodePlayingInValue": "Kita serija rodoma už {0}", "HeaderNextVideoPlayingInValue": "Kitas vaizdo įrašas rodomas už {0}", "HeaderPassword": "Slaptažodis", @@ -901,7 +805,6 @@ "LabelPreferredSubtitleLanguage": "Pageidautina titrų kalba:", "HeaderChannelAccess": "Prieiga prie kanalų", "LabelProfileAudioCodecs": "Garso takelio kodekas:", - "HeaderLiveTv": "TV gyvai", "HeaderLiveTvTunerSetup": "Imtuvo nustatymai", "FetchingData": "Gaunami papildomi duomenys", "FileReadError": "Nuskaitant failą įvyko klaida.", @@ -925,7 +828,6 @@ "GuideProviderLogin": "Prisijungti", "HardwareAccelerationWarning": "Įjungus aparatinės įrangos spartinimą, kai kuriose diegimo aplinkose gali atsirasti nestabilumas. Įsitikinkite, kad jūsų operacinė sistema ir vaizdo tvarkyklės yra visiškai atnaujintos. Jei įjungus šį vaizdo įrašą kyla problemų, turite pakeisti nustatymą į \"Joks\".", "HeaderAdmin": "Administratorius", - "HeaderAlbums": "Albumai", "HeaderAlert": "Perspėjimas", "HeaderAllowMediaDeletionFrom": "Leisti pašalinti medijos failą iš", "HeaderApiKey": "API raktas", @@ -946,7 +848,6 @@ "HeaderVideos": "Video įrašai", "HeaderXmlSettings": "XML nustatymai", "HeaderYears": "Metai", - "HeadersFolders": "Aplankai", "Home": "Pradinis", "Items": "Elementai", "LabelAbortedByServerShutdown": "(Nutraukta išjungus serverį)", @@ -982,7 +883,6 @@ "HeaderOnNow": "Gyvai dabar", "HeaderOtherItems": "Kiti elementai", "HeaderParentalRatings": "Amžiaus kategorijos", - "HeaderPeople": "Žmonės", "HeaderPhotoAlbums": "Nuotraukų albumai", "HeaderPinCodeReset": "Nustatyti PIN kodą iš naujo", "HeaderPlayAll": "Leisti visus", @@ -992,7 +892,6 @@ "HeaderProfile": "Profilis", "HeaderProfileInformation": "Apie profilį", "HeaderResponseProfileHelp": "Atsakymo profiliai suteikia galimybę pritaikyti prie prietaiso siunčiamą informaciją, kai grojama tam tikros rūšies medijos.", - "HeaderSchedule": "Tvarkaraštis", "HeaderSeasons": "Sezonai", "HeaderSecondsValue": "{0} s", "HeaderSelectMetadataPath": "Metaduomenų kelio išrinkimas", @@ -1004,10 +903,8 @@ "HeaderFavoritePlaylists": "Mėgstami Grojaraščiai", "ApiKeysCaption": "Įjungtų API raktų sąrašas", "Episode": "Episodas", - "CopyStreamURLError": "Klaida kopijuojant URL.", "ClientSettings": "Kliento Nustatymai", "ButtonTogglePlaylist": "Grojaraštis", - "ButtonToggleContextMenu": "Daugiau", "ButtonSplit": "Skirstyti", "AskAdminToCreateLibrary": "Prašyti administratoriaus, kad sukurtų mediateka.", "Album": "Albumas", diff --git a/src/strings/lv.json b/src/strings/lv.json index fd2d2d821e..de3b8475d3 100644 --- a/src/strings/lv.json +++ b/src/strings/lv.json @@ -19,7 +19,6 @@ "MessageYouHaveVersionInstalled": "Jums pašlaik ir uzstādīta versija {0}.", "MessageUnableToConnectToServer": "Mēs pašlaik nevaram sazināties ar izvēlēto serveri. Pārliecinies ka tas strādā, un mēģini vēlreiz.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Sekojošie multvides ceļi tiks noņemti no tavas bibliotēkas:", - "MessageSettingsSaved": "Iestatījumi saglabāti.", "MessagePleaseWait": "Lūdzu uzgaidi. Tas var aizņemt pāris minūtes.", "MessageNothingHere": "Šeit nekā nav.", "MessageNoPluginsInstalled": "Tev nav uzstādīti paplašinājumi.", @@ -42,7 +41,6 @@ "MediaInfoStreamTypeSubtitle": "Subtitri", "MediaInfoStreamTypeData": "Dati", "MediaInfoStreamTypeAudio": "Audio", - "MediaInfoSoftware": "Programmatūras", "MediaInfoSize": "Lielums", "MediaInfoResolution": "Izšķirtspēja", "MediaInfoProfile": "Profils", @@ -71,10 +69,7 @@ "LabelTunerIpAddress": "Tūnera IP Addrese:", "LabelTunerType": "Tūnera tips:", "LabelType": "Tips:", - "LabelTranscodingVideoCodec": "Video kodeks:", "LabelTranscodePath": "Trans-kodēšanas ceļš:", - "LabelTranscodingContainer": "Konteineris:", - "LabelTranscodingAudioCodec": "Audio kodeks:", "LabelTrackNumber": "Celiņa numurs:", "LabelTimeLimitHours": "Laika limits (stundas):", "LabelTime": "Laiks:", @@ -85,7 +80,6 @@ "LabelTag": "Tags:", "LabelTVHomeScreen": "TV režīma mājas ekrāns:", "LabelSupportedMediaTypes": "Atbalstītie Multivides Veidi:", - "LabelSubtitles": "Subtitri", "LabelSubtitlePlaybackMode": "Subtitru veids:", "LabelSubtitleFormatHelp": "Piemērs: srt", "LabelSubtitleDownloaders": "Subtitru lejupielādētāji:", @@ -97,7 +91,6 @@ "LabelSportsCategories": "Sporta kategorijas:", "LabelSpecialSeasonsDisplayName": "Speciālās sezonas displeja nosaukums:", "LabelSource": "Avots:", - "LabelSoundEffects": "Skaņas efekti:", "LabelSortTitle": "Kārtošanas nosaukums:", "LabelSortOrder": "Kārtošanas secība:", "LabelSortBy": "Kārtot pēc:", @@ -145,7 +138,6 @@ "LabelOriginalTitle": "Oriģinālais nosaukums:", "LabelNumber": "Numurs:", "LabelNotificationEnabled": "Iespējot šo paziņojumu", - "LabelNext": "Nākamais", "LabelNewsCategories": "Ziņu kategorijas:", "LabelNewPasswordConfirm": "Jaunās paroles apstiprinājums:", "LabelNewPassword": "Jaunā parole:", @@ -205,7 +197,6 @@ "LabelDefaultUser": "Noklusējuma lietotājs:", "LabelDay": "Diena:", "LabelDateAdded": "Pievienošanas datums:", - "LabelCustomDeviceDisplayName": "Displeja nosaukums:", "LabelCurrentPassword": "Pašreizējā parole:", "LabelCriticRating": "Kritiķu reitings:", "LabelCountry": "Valsts:", @@ -221,12 +212,10 @@ "LabelBirthYear": "Dzimšanas gads:", "LabelBirthDate": "Dzimšanas datums:", "LabelAudioLanguagePreference": "Ieteicamā audio valoda:", - "LabelAudio": "Audio", "LabelArtistsHelp": "Atdali vairākus izmantojot ;", "LabelArtists": "Izpildītājs:", "LabelAppNameExample": "Piemēram: Sickbeard, Sonarr", "LabelAppName": "Lietotnes nosaukums", - "LabelAll": "Viss", "LabelAlbumArtists": "Albuma izpildītāji:", "LabelAlbum": "Albums:", "LabelAirTime": "Tiešraides laiks:", @@ -251,19 +240,16 @@ "HeaderSpecialEpisodeInfo": "Speciālās Epizodes Info", "HeaderSortOrder": "Kārtošanas Secība", "HeaderSortBy": "Kārtot Pēc", - "HeaderShutdown": "Izslēgt", "HeaderSetupLibrary": "Uzstādīt multvides bibliotēkas", "HeaderSettings": "Iestatījumi", "HeaderServerSettings": "Servera Iestatījumi", "HeaderSeriesStatus": "Sēriju Status", "HeaderSeriesOptions": "Sēriju Opcijas", - "HeaderSeries": "Sērijas", "HeaderSendMessage": "Sūtīt Ziņojumu", "HeaderSelectServerCachePath": "Izvēlies Servera Keša Ceļu", "HeaderSelectServer": "Izvēlies Serveri", "HeaderSecondsValue": "{0} Sekundes", "HeaderSeasons": "Sezonas", - "HeaderSchedule": "Grafiks", "HeaderRevisionHistory": "Revīziju Vēsture", "HeaderRestart": "Restartēt", "HeaderRemoveMediaLocation": "Noņemt Multvides Atrašanās Vietu", @@ -278,12 +264,10 @@ "HeaderPlayAll": "Atskaņot Visu", "HeaderPinCodeReset": "Atiestatīt Pin Kodu", "HeaderPhotoAlbums": "Foto Albūmi", - "HeaderPeople": "Cilvēki", "HeaderPaths": "Ceļi", "HeaderPasswordReset": "Paroles Nomaiņa", "HeaderPassword": "Parole", "HeaderNextVideoPlayingInValue": "Nākamais Video tiks atskaņots pēc {0}", - "HeaderNextUp": "Nākamais", "HeaderNextEpisodePlayingInValue": "Nākamā Epizode tiks atskaņota pēc: {0}", "HeaderNewDevices": "Jaunas Ierīces", "HeaderNewApiKey": "Jauna API Atslēga", @@ -293,15 +277,11 @@ "HeaderMyDevice": "Mana Ierīce", "HeaderMusicVideos": "Mūzikas Video", "HeaderMusicQuality": "Audio Kvalitāte", - "HeaderMovies": "Filmas", "HeaderMoreLikeThis": "Vairāk Kā Šis", "HeaderMetadataSettings": "Metadatu Iestatījumi", - "HeaderMediaInfo": "Multvides informācija", "HeaderMediaFolders": "Multvides Mapes", "HeaderMedia": "Multvide", "HeaderLiveTvTunerSetup": "Tiešraides TV Tūnera Uzstādīšana", - "HeaderLiveTv": "Tiešraides TV", - "HeaderLiveTV": "Tiešraides TV", "HeaderLibrarySettings": "Bibliotēku Iestatījumi", "HeaderLibraryOrder": "Bibliotēku Kārtojums", "HeaderLibraryFolders": "Bibliotēku Mapes", @@ -313,7 +293,6 @@ "HeaderLatestMedia": "Jaunākā Multvide", "HeaderLatestEpisodes": "Jaunākās Epizodes", "HeaderKeepRecording": "Turpināt Ierakstu", - "HeaderItems": "Vienumi", "HeaderInstall": "Uzstādīt", "HeaderImageSettings": "Attēlu Iestatījumi", "HeaderImageOptions": "Attēlu Opcijas", @@ -321,13 +300,9 @@ "HeaderIdentificationCriteriaHelp": "Ievadi vismaz vienu identifikācijas kritēriju.", "HeaderIdentification": "Identifikācija", "HeaderHttpHeaders": "HTTP Headeri", - "HeaderHome": "Mājas", "HeaderGuideProviders": "TV Gida Datu Nodrošinātāji", - "HeaderGenres": "Žanri", "HeaderFrequentlyPlayed": "Bieži Atskaņots", - "HeaderForgotPassword": "Aizmirst PAroli", "HeaderForKids": "Priekš Bērniem", - "HeaderFilters": "Filtri", "HeaderFavoriteVideos": "Video Favorīti", "MediaInfoPath": "Ceļš", "MediaInfoLevel": "Līmenis", @@ -349,25 +324,20 @@ "LiveBroadcasts": "Tiešraides:", "Live": "Tiešraide", "List": "Saraksts", - "LinksValue": "Linki: {0}", "Like": "Patīk", "LeaveBlankToNotSetAPassword": "Tu vari atstāt šo lauku tukšu, lai neiestatītu paroli.", - "LaunchWebAppOnStartup": "Palaist web interfeisu kad serveris tiek startēts", "LatestFromLibrary": "Jaunākais {0}", "Large": "Liels", "LabelffmpegPath": "FFmped ceļš:", "LabelZipCode": "Zip Kods:", "LabelYoureDone": "Esi pabeidzis!", - "LabelYourFirstName": "Tavs vārds:", "HeaderFavoritePeople": "Cilvēku Favorīti", "HeaderFavoriteMovies": "Filmu Favorīti", "HeaderFavoriteBooks": "Grāmatu Favorīti", "HeaderExternalIds": "Ārējie ID:", "HeaderError": "Kļūda", - "HeaderEpisodes": "Epizodes", "HeaderEditImages": "Rediģēt Attēlus", "HeaderDownloadSync": "Lejupielādēt & Sinhronizēt", - "HeaderDisplay": "Displejs", "HeaderDevices": "Ierīces", "HeaderDeviceAccess": "Ierīču Piekļuve", "HeaderDeveloperInfo": "Izstrādātāju Info", @@ -383,12 +353,9 @@ "HeaderConfirmPluginInstallation": "Apstiprināt Palašinājumu Uzstādījumu", "HeaderConfigureRemoteAccess": "Konfigurēt Attālināto Piekļuvi", "HeaderCodecProfile": "Kodeksu Profils", - "HeaderChannels": "Kanāli", "HeaderChannelAccess": "Kanālu Piekļuve", "HeaderCancelSeries": "Atcelt Sēriju", "HeaderCancelRecording": "Atcelt Ierakstus", - "HeaderBooks": "Grāmatas", - "HeaderAutomaticUpdates": "Automātiskie Atjauninājumi", "HeaderAudioSettings": "Audio Iestatījumi", "HeaderAudioBooks": "Audio Grāmatas", "HeaderApp": "Lietotne", @@ -396,10 +363,8 @@ "HeaderApiKey": "API Atslēga", "HeaderAllowMediaDeletionFrom": "Atļaut Multvides Dzēšanu no", "HeaderAlert": "Paziņojums", - "HeaderAlbums": "Albumi", "HeaderAlbumArtists": "Albumu Izpildītāji", "HeaderAdmin": "Admin", - "HeaderAddUser": "Pievienot Lietotāju", "HeaderAddToPlaylist": "Pievienot Atskaņošanas Sarakstam", "HeaderAddToCollection": "Pievienot kolekcijai", "HeaderActivity": "Aktivitāte", @@ -435,8 +400,6 @@ "EndsAtValue": "Beigsies {0}", "EnableThemeVideosHelp": "Atskaņot tēmas video fonā bibliotēkas pārlūkošanas laikā.", "EnableThemeSongsHelp": "Atskaņot tēmas mūziku fonā bibliotēkas pārlūkošanas laikā.", - "EnableThemeVideos": "Tēmas video", - "EnableThemeSongs": "Tēmas mūzika", "EnablePhotos": "Rādīt attēlus", "EnableNextVideoInfoOverlayHelp": "Video beigās rādīt informāciju par nākamo video atskaņošanas sarakstā.", "EnableNextVideoInfoOverlay": "Rādīt nākamā video informāciju atskaņošanas laikā", @@ -444,7 +407,6 @@ "EnableExternalVideoPlayers": "Ārējie video atskaņotāji", "EnableDisplayMirroring": "Displeju spoguļošana", "EnableCinemaMode": "Teātra režīms", - "EnableBackdrops": "Foni", "EditSubtitles": "Rediģēt subtitrus", "EditMetadata": "Rediģēt metadatus", "EditImages": "Rediģēt attēlus", @@ -473,7 +435,6 @@ "DatePlayed": "Atskaņošanas datums", "DateAdded": "Pievienošanas datums", "CriticRating": "Kritiķu reitings", - "CopyStreamURLError": "Kļūda kopējot URL.", "CopyStreamURLSuccess": "URL veiksmīgi nokopēts.", "CopyStreamURL": "Kopēt Straumes URL", "Continuing": "Turpina", @@ -490,63 +451,43 @@ "CancelSeries": "Atcelt sēriju", "CancelRecording": "Atcelt ierakstu", "ButtonWebsite": "Web vietne", - "ButtonViewWebsite": "Skatīt web vietni", "ButtonUninstall": "Atinstalēt", "ButtonTrailer": "Treileri", - "ButtonSubtitles": "Subtitri", "ButtonSplit": "Sadalīt", "ButtonStop": "Apturēt", "ButtonStart": "Sākt", "ButtonSignOut": "Iziet", "ButtonSignIn": "Ieiet", "ButtonShutdown": "Izslēgt", - "ButtonShuffle": "Jaukt", "ButtonSettings": "Iestatījumi", "ButtonSend": "Nosūtīt", "ButtonSelectView": "Izvēlies Skatu", "ButtonSelectServer": "Izvēlies Serveri", "ButtonSelectDirectory": "Izvēlies Mapi", - "ButtonSearch": "Meklēt", "ButtonScanAllLibraries": "Skanēt Visas Bibliotēkas", - "ButtonSave": "Saglabāt", "ButtonRevoke": "Atsaukt", "ButtonResume": "Turpināt", "ButtonRestart": "Restartēt", "ButtonResetPassword": "Nomainīt Paroli", "ButtonResetEasyPassword": "Nomainīt vieglo pin kodu", - "ButtonRepeat": "Atkārtot", "ButtonRename": "Pārsaukt", "ButtonRemove": "Noņemt", "ButtonRefreshGuideData": "Atjaunot Gida Datus", - "ButtonRefresh": "Atjaunot", "ButtonProfile": "Profils", "ButtonPreviousTrack": "Iepriekšējais celiņš", - "ButtonPlay": "Atskaņot", "ButtonPause": "Pauzēt", "ButtonParentalControl": "Vecāku Pārvaldība", "ButtonOpen": "Atvērt", "ButtonOk": "Labi", - "ButtonOff": "Izslēgt", "ButtonNextTrack": "Nākamais Celiņš", - "ButtonNew": "Jauns", "ButtonNetwork": "Tīkls", "ButtonMore": "Vairāk", "ButtonLibraryAccess": "Bibliotēku piekļuve", - "ButtonLearnMore": "Uzzināt vairāk", "ButtonInfo": "Info", - "ButtonHome": "Mājas", - "ButtonHelp": "Palīdzība", "ButtonGuide": "Gids", "ButtonGotIt": "Sapratu", "ButtonFullscreen": "Pilnekrāna", "ButtonForgotPassword": "Aizmirsu Paroli", - "ButtonFilter": "Filtrs", - "ButtonEditImages": "Rediģēt attēlus", - "ButtonEdit": "Rediģēt", - "ButtonDownload": "Lejupielāde", - "ButtonDeleteImage": "Izdzēst Attēlu", - "ButtonDelete": "Izdzēst", - "ButtonConnect": "Pieslēgties", "ButtonChangeServer": "Nomainīt Serveri", "ButtonCancel": "Atcelt", "ButtonBack": "Atpakaļ", @@ -555,14 +496,12 @@ "ButtonAddServer": "Pievienot Serveri", "ButtonAddMediaLibrary": "Pievienot Multimēdiju Bibliotēku", "ButtonAddImage": "Pievienot attēlu", - "ButtonAdd": "Pievienot", - "BrowsePluginCatalogMessage": "Pārlūko mūsu paplašinājumu katalogu, lai redzētu pieejamos paplašinājumus.", + "MessageBrowsePluginCatalog": "Pārlūko mūsu paplašinājumu katalogu, lai redzētu pieejamos paplašinājumus.", "Browse": "Pārlūkot", "BoxRear": "Kaste (aizmugure)", "Box": "Kaste", "Books": "Grāmatas", "Help": "Palīdzība", - "HeadersFolders": "Mapes", "HeaderYears": "Gadi", "HeaderXmlSettings": "Xml Iestatījumi", "HeaderXmlDocumentAttribute": "Xml Dokumenta Atribūts", @@ -582,7 +521,6 @@ "HeaderTranscodingProfile": "Transkodēšanas Profils", "HeaderTracks": "Celiņi", "HeaderThisUserIsCurrentlyDisabled": "Šis lietotājs pašlaik ir atspējots", - "HeaderTags": "Tagi", "HeaderSystemDlnaProfiles": "Sistēmas Profili", "HeaderSubtitleProfiles": "Subtitru Profili", "HeaderSubtitleProfile": "Subtitru Profils", @@ -594,10 +532,8 @@ "Banner": "Karogattēls", "Backdrops": "Foni", "Backdrop": "Fons", - "AutoBasedOnLanguageSetting": "Auto (atkarībā no valodas iestatījumiem)", "Auto": "Auto", "Audio": "Audio", - "AttributeNew": "Jauns", "AsManyAsPossible": "Cik vien iespējams", "Artists": "Izpildītāji", "Art": "Māksla", @@ -641,7 +577,6 @@ "NumLocationsValue": "{0} mapes", "Normal": "Normāls", "None": "Nakā", - "NoSubtitles": "Nav subtitru", "NoSubtitleSearchResultsFound": "Nav atrasti rezultāti.", "No": "Nr", "Next": "Nākamais", @@ -664,7 +599,6 @@ "Watched": "Skatīts", "ViewPlaybackInfo": "Skatīt atskaņošanas info", "ViewAlbum": "Skatīt albumu", - "VideoRange": "Video platums", "Vertical": "Vertikāls", "ValueVideoCodec": "Video Kodeks: {0}", "ValueTimeLimitSingleHour": "Laika limits: 1 stunda", @@ -692,7 +626,7 @@ "Unrated": "Nevērtēts", "Unplayed": "Neatskaņots", "Unmute": "Ieslēgt skaņu", - "UninstallPluginHeader": "Noņemt Paplašinājumu", + "HeaderUninstallPlugin": "Noņemt Paplašinājumu", "UninstallPluginConfirmation": "Vai tu tiešām vēlies noņemt {0}?", "Tuesday": "Otrdiena", "Transcoding": "Trans-kodēšana", @@ -707,26 +641,13 @@ "TellUsAboutYourself": "Pastāsti mums par sevi", "TagsValue": "Tagi: {0}", "Tags": "Tagi", - "TabUsers": "Lietotāji", - "TabTranscoding": "Trans-kodēšana", - "TabTrailers": "Treileri", - "TabSuggestions": "Ieteikumi", "TabStreaming": "Straumēšana", - "TabSongs": "Dziesmas", - "TabShows": "Raidījumi", "TabSettings": "Iestatījumi", "TabServer": "Serveris", - "TabSeries": "Sērijas", - "TabResumeSettings": "Turpināt", "TabResponses": "Atbildes", - "TabRecordings": "Ieraksti", "TabProfiles": "Profili", "TabProfile": "Profils", "TabPlugins": "Paplašinājumi", - "TabPlaylists": "Atskaņošanas Saraksti", - "TabPlaylist": "Atskaņošanas Saraksts", - "TabPlayback": "Atskaņošana", - "TabPassword": "Parole", "TabParentalControl": "Vecāku Pārvaldība", "TabOther": "Cits", "TabNotifications": "Paziņojumi", @@ -734,28 +655,13 @@ "TabNetworking": "Tīklošana", "TabNetworks": "Tīkli", "TabMyPlugins": "Mani Paplašinājumi", - "TabMusicVideos": "Mūzikas Video", "TabMusic": "Mūzika", - "TabMovies": "Filmas", - "TabMetadata": "Metadati", "TabLogs": "Logs", - "TabLiveTV": "Tiešraides TV", "TabLatest": "Jaunākais", - "TabInfo": "Info", - "TabGuide": "Gids", - "TabGenres": "Žanri", - "TabFavorites": "Favorīti", - "TabEpisodes": "Epizodes", - "TabDisplay": "Displejs", "TabDirectPlay": "Tiešā Atskaņošana", - "TabDevices": "Ierīces", "TabContainers": "Konteineri", - "TabCollections": "Kolekcijas", "TabCodecs": "Kodeksi", - "TabChannels": "Kanāli", "TabCatalog": "Katalogs", - "TabArtists": "Izpildītāji", - "TabAlbums": "Albumi", "ValueSpecialEpisodeName": "Speciālais - {0}", "Sync": "Sinhronizācija", "Songs": "Dziesmas", @@ -802,14 +708,12 @@ "OptionOnInterval": "Pēc intervāla", "OptionNone": "Neviens", "OptionNew": "Jauns...", - "OptionMonday": "Pirmdien", "OptionList": "Saraksts", "OptionLikes": "Patīk", "OptionIsSD": "SD", "OptionIsHD": "HD", "OptionHasTrailer": "Treileris", "OptionHasSubtitles": "Subtitri", - "OptionFriday": "Piektdien", "OptionFavorite": "Favorīti", "OptionEveryday": "Katru dienu", "OptionEnded": "Beidzies", @@ -827,10 +731,9 @@ "OptionBlockMusic": "Mūzika", "OptionBlockMovies": "Filmas", "OptionBlockBooks": "Grāmatas", - "OptionAutomatic": "Auto", "OptionAuto": "Auto", "OptionArtist": "Izpildītājs", - "NoPluginConfigurationMessage": "Šim paplašinājumam nav konfigurējamu iestatījumu.", + "MessageNoPluginConfiguration": "Šim paplašinājumam nav konfigurējamu iestatījumu.", "NoCreatedLibraries": "Izskatās ka tu vēl neesi izveidojis nevienu bibliotēku. {0}Vai tu vēlies izveidot vienu tagad?{1}", "NextUp": "Nākamais", "Mute": "Apklusināt", @@ -839,14 +742,11 @@ "Menu": "Izvēlne", "LabelTriggerType": "Trigera Veids:", "LabelSkipIfGraphicalSubsPresent": "Izlaist ja video jau satur iegultus subtitrus", - "LabelSkin": "Izskats:", "LabelSimultaneousConnectionLimit": "Vienlaicīgo straumju limits:", "LabelServerHostHelp": "192.168.1.100:8096 vai https://myserver.com", "LabelServerHost": "Resursdators:", "LabelReleaseDate": "Izlaiduma datums:", - "LabelPrevious": "Iepriekšējais", "LabelPreferredSubtitleLanguage": "Ieteicamā subtitru valoda:", - "LabelPreferredDisplayLanguageHelp": "Jellyfin tulkošana ir notiekošs projekts.", "LabelPlayerDimensions": "Atskaņotāja dimensijas:", "LabelParentalRating": "Vecāku reitings:", "LabelMonitorUsers": "Uzraudzīt aktivitāti no:", @@ -881,7 +781,7 @@ "LabelCustomCertificatePathHelp": "Ceļš uz PKCS #12 datni, kas satur sertifikātu un privāto atslēgu lai iespējotu TLS atbalstu uz sava domēna.", "FolderTypeUnset": "Jaukts Saturs", "ErrorSavingTvProvider": "Kļūda saglabājot TV sniedzēju. Pārliecinies ka tas ir pieejams un mēģini vēlreiz.", - "ErrorMessageStartHourGreaterThanEnd": "Beigu laikam jābūt vēlākam par sākuma laiku.", + "ErrorStartHourGreaterThanEnd": "Beigu laikam jābūt vēlākam par sākuma laiku.", "ErrorAddingXmlTvFile": "Kļūda atverot XMLTV datni. Lūdzu pārliecinies ka datne eksistē un mēģini vēlreiz.", "LabelCustomCssHelp": "Izmanto pats savu pielāgoto silu web interfeisam.", "LabelCustomCss": "Pielāgots CSS:", @@ -897,8 +797,6 @@ "LabelAudioCodec": "Audio kodeks:", "LabelAudioChannels": "Audio kanāli:", "LabelAudioBitrate": "Audio bitu-ātrums:", - "LabelAllowServerAutoRestartHelp": "Serveris restartēties tikai brīžos, kad neviens lietotājs nav aktīvs.", - "LabelAllowServerAutoRestart": "Atļaut serverim automātiski restartēties, lai uzstādītu atjauninājumus", "LabelAllowHWTranscoding": "Atļaut aparatūras trans-kodēšanu", "LabelAlbumArtMaxWidthHelp": "Maksimālā albumu vāku izšķirtspēja caur upnp:albumArtURI.", "LabelAlbumArtMaxWidth": "Albumu vāku maksimālais platums:", @@ -933,7 +831,6 @@ "HeaderKodiMetadataHelp": "Lai iespējotu vai atspējotu NFO metadatus, rediģē bibliotēku Jellyfin bibliotēku iestatījumu metadata glabātāju sadaļā.", "HeaderIdentifyItemHelp": "Ievadi vienu vai vairākus meklēšanas kritērijus. Noņem kritērijus lai palielinātu meklēšanas rezultātus.", "HeaderFetchImages": "Ielādēt Attēlus:", - "HeaderFeatures": "Funkcijas", "HeaderFeatureAccess": "Funkciju Piekļuve", "HeaderEnabledFieldsHelp": "Atķeksē lauku lai to slēgtu un aizliegt tā satura mainīšanu.", "HeaderEnabledFields": "Iespējotie Lauki", @@ -948,13 +845,11 @@ "HeaderCustomDlnaProfiles": "Pielāgoti Profili", "HeaderConfirmProfileDeletion": "Apstiprināt Profila Dzēšanu", "HeaderChapterImages": "Nodaļu Attēli", - "HeaderCastCrew": "Lomas & Apkalpe", "HeaderCastAndCrew": "Lomas un Apkalpe", "HeaderAppearsOn": "Redzams", "FFmpegSavePathNotFound": "Mēs nespējām atrast FFmpeg norādītajā ceļā. FFprobe arī ir vajadzīgs, un tam ir jāatrodas tajā pašā mapē. Šīs komponentes parasti tiek apvienotas vienā un tajā pašā lejupielādē. Lūdzu pārbaudiet ceļu un mēģiniet vēlreiz.", "HeaderAdditionalParts": "Papildus Ceļi", "HeaderAddUpdateImage": "Pievienot/Atjaunot Attēlu", - "HeaderAddScheduledTaskTrigger": "Pievienot Trigeri", "GuideProviderLogin": "Ieiet", "Ended": "Beidzies", "EnableStreamLoopingHelp": "Iespējo šo, ja tiešsaistes straume satur tikai pāris sekunžu datus, un ir nepārtraukti jāatjauno. Iespējojot bez vajadzības var radīties problēmas.", @@ -975,7 +870,7 @@ "DeleteMedia": "Dzēst mediju", "DeleteImageConfirmation": "Vai tu tiešām vēlies izdzēst šo attēlu?", "DeleteDeviceConfirmation": "Vai tu tiešām vēlies noņemt šo ierīci? Tā parādīsies atkārtoti nākamo reizi, kad lietotājs ieiet ar to.", - "DefaultErrorMessage": "Apstrādājot pieprasījumu notika kļūda. Pēc brītiņa lūdzu mēģini vēlreiz.", + "ErrorDefault": "Apstrādājot pieprasījumu notika kļūda. Pēc brītiņa lūdzu mēģini vēlreiz.", "DeathDateValue": "Miris: {0}", "ConfirmEndPlayerSession": "Vai jūs gribat izslēgt Jellyfin uz {0}?", "ConfirmDeleteItems": "Dzēšot šos vienumus, tie tiks izdzēsti gan no jūsu failu sistēmas, gan mediju bibliotēkas. Vai tiešām turpināt?", @@ -988,15 +883,11 @@ "ChannelAccessHelp": "Izvēlies kanālus, ko koplietot ar šo lietotāju. Administratori spēs rediģēt visus kanālus izmantojot metadatu pārvaldnieku.", "ChangingMetadataImageSettingsNewContent": "Izmaiņas metadatu vai mākslas lejupielādes iestatījumos tiks izmantotas tikai jauniem bibliotēkas vienumiem. Lai pielietotu šīs izmaiņas jau esošiem vienumiem, tev vajadzēs atjaunot šo vienumu metadatus manuāli.", "ButtonSubmit": "Iesniegt", - "ButtonSort": "Kārtot", "ButtonQuickStartGuide": "Pamata Lietošanas Instrukcija", "ButtonManualLogin": "Manuālā Ieiešana", "ButtonEditOtherUserPreferences": "Rediģē šī lietotāja profilu, attēlu un personas iestatījumus.", - "ButtonDown": "Lejup", - "ButtonArrowUp": "Augšup", "ButtonArrowRight": "Labi", "ButtonArrowLeft": "Kreisi", - "ButtonArrowDown": "Lejup", "ButtonAddScheduledTaskTrigger": "Pievienot Trigeru", "BookLibraryHelp": "Audio un teksta grāmatas tiek atbalstītas. Pārskati {0} grāmatu nosaukumu instrukciju {1}.", "Blacklist": "Melnais saraksts", @@ -1025,7 +916,6 @@ "ErrorGettingTvLineups": "Notika kļūda lejupielādējot TV sarakstus. Lūdzu pārliecinies, ka tava informācija ir pareiza un mēģini vēlreiz.", "DisplayMissingEpisodesWithinSeasonsHelp": "Tam arī jābūt iespējotam priekš TV bibliotēkām servera konfigurācijā.", "DefaultMetadataLangaugeDescription": "Šie ir jūsu noklusējumi, kas var tikt rediģēti atkarībā no bibliotēkas.", - "AddItemToCollectionHelp": "Pievieno vienumus kolekcijām tos meklējot un izmantojot to labā taustiņa vai spiediena izvēlnes lai pievienotu tos.", "LabelPleaseRestart": "Izmaiņas tiks pielietotas pēc manuālas web klienta pārlādes.", "LabelPersonRole": "Loma:", "LabelMusicStreamingTranscodingBitrateHelp": "Iestati maksimālo mūzikas straumēšanas bitu ātrumu.", @@ -1068,7 +958,6 @@ "LabelTranscodes": "Transkodi:", "LabelTitle": "Tituls:", "LabelSaveLocalMetadata": "Saglabāt māksu media mapēs", - "LabelReadHowYouCanContribute": "Uzzini, kā tu vari dot ieguldījumu.", "LabelNumberOfGuideDays": "Dienu daudzumus, kuram lejupielādēt gidu:", "LabelLockItemToPreventChanges": "Aizslēgt šo objektu lai aizliegtu izmaiņas", "LabelLocalHttpServerPortNumber": "Vietējais HTTP porta numurs:", @@ -1097,9 +986,7 @@ "LabelDroppedFrames": "Nomestie kadri:", "LabelDownMixAudioScaleHelp": "Pastiprināt audio lejupmiksēšanas laikā. Vērtība viens paturēs oriģinālo skaļumu.", "LabelDownMixAudioScale": "Audio pastiprinājums lejupmiksējot:", - "LabelDisplayMissingEpisodesWithinSeasons": "Rādīt trūkstošās epizodes sezonās", "LabelDateAddedBehaviorHelp": "Ja atrodas metadatu vērtība, tā vienmēr tiks izmantota pirms jebkuras no šīm opcijām.", - "LabelDashboardTheme": "Servera vadības paneļa tēma:", "LabelCustomDeviceDisplayNameHelp": "Ievadi pielāgotu displeja vārdu vai atstāj tukšu lai izmantotu ierīces noteikto.", "LabelCachePathHelp": "Nosaki pielāgotu atrašanās vietu priekš keša datnēm kā attēliem. Atstāj tukšu lai izmantotu servera noklusējumu.", "LabelAllowedRemoteAddressesMode": "Attālās IP adreses filtra režīms:", @@ -1124,7 +1011,6 @@ "ColorTransfer": "Krāsu pārsūtīšana", "ClientSettings": "Klientu Iestatījumi", "ButtonTogglePlaylist": "Atskaņošanas Saraksts", - "ButtonToggleContextMenu": "Vairāk", "BurnSubtitlesHelp": "Nosaka, vai serverim ir jāiededzina subtitri video trans-kodēšanas laikā. To nedarot tiks stipri palielināta veiktspēja. Izvēlies Auto lai iededzinātu uz attēliem bāzētus formātus (VOBSUB, PGS, SUB, IDX, …) un noteiktus ASS vai SSA subtitrus.", "Artist": "Izpildītājs", "AllowOnTheFlySubtitleExtractionHelp": "Iegultie subtitri var tikt izvilkto no video un nogādāti klientiem kā parasts teksts, lai nevajadzētu veikt lieku video trans kodēšanu. Uz dažām sistēmām tas var aizņemt ilgu laiku un likt video atskaņošanai uzkārties izvilkšanas procesa laikā. Atspējo šo lai iegultos subtitrus iededzinātu video trans kodēšanas veidā, kad tos noklusēti neatbalsta klienta ierīce.", @@ -1137,7 +1023,7 @@ "PlaybackData": "Atskaņošanas Dati", "Person": "Persona", "PerfectMatch": "Ideāla saderība", - "PasswordResetHeader": "Atiestatīt Paroli", + "HeaderResetPassword": "Atiestatīt Paroli", "PasswordResetConfirmation": "Vai tu tiešām gribi atiestatīt paroli?", "PasswordResetComplete": "Parole ir atiestatīta.", "PasswordMatchError": "Parolei un paroles pārbaudei ir jāsakrīt.", @@ -1146,21 +1032,15 @@ "PackageInstallCompleted": "{0} (versija {1}) instalācija pabeigta.", "PackageInstallCancelled": "{0} (versija {1}) instalācija atcelta.", "Overview": "Pārskats", - "OtherArtist": "Cits izpildītājs", "OriginalAirDateValue": "Oriģinālais tiešraides datums: {0}", "OptionWeekly": "Iknedēļu", "OptionWeekends": "Nedēļas nogalēs", "OptionWeekdays": "Darba dienās", - "OptionWednesday": "Trešdiena", "OptionWakeFromSleep": "Modināt no miega", "OptionUnplayed": "Neatskaņots", - "OptionTuesday": "Otrdiena", "OptionTrackName": "Celiņa Nosaukums", "OptionThumb": "Sīktēls", - "OptionThursday": "Ceturtdiena", - "OptionSunday": "Svētdiena", "OptionSaveMetadataAsHidden": "Saglabāt metadatus un attēlus kā paslēptas datnes", - "OptionSaturday": "Sestdiena", "OptionRequirePerfectSubtitleMatch": "Lejupielādēt tikai subtitrus, kas perfekti sakrīt ar manām video datnēm", "OptionRegex": "Regex", "OptionProtocolHls": "HTTP Tiešraides Straumes", @@ -1168,7 +1048,6 @@ "OptionPremiereDate": "Pirmizrādes Datums", "OptionPoster": "Plakāts", "OptionPlayCount": "Atskaņošanas Skaits", - "OptionOnAppStartup": "Lietotnes sāknēšanā", "OptionNameSort": "Nosaukums", "OptionMissingEpisode": "Trūkstošās Epizodes", "OptionMax": "Maksimums", @@ -1224,8 +1103,6 @@ "MoreUsersCanBeAddedLater": "Papildus lietotāji var tikt pievienoti vēlāk no vadības paneļa.", "MessagePluginConfigurationRequiresLocalAccess": "Lai konfigurētu šo paplašinājumu lūdzu tieši ieej savā lokālajā serverī.", "MessagePleaseEnsureInternetMetadata": "Lūdzu pārliecinies vai metadatu lejupielāde no interneta ir iespējota.", - "MessageUnauthorizedUser": "Jūs neesat autorizēti lai piekļūtu serverim šajā brīdī. Lūdzu sazinieties ar savu servera administratoru priekš papildus informācijas.", - "MessageInstallPluginFromApp": "Šis paplašinājums ir jāuzstāda no lietotnes, kurā jūs to vēlaties izmantot.", "LabelEmbedAlbumArtDidl": "Ievietot albumu vākus iekš Didl", "LabelSelectFolderGroups": "Automātiski grupēt saturu no sekojošām datnēm skatos kā Filmas, Mūzika un TV:", "AllowFfmpegThrottlingHelp": "Kad trans-kodējums vai remux tiek pietiekami tālu priekšā pašreizējai atskaņošanas vietai, process tiks pauzēts lai patērētu mazāk resursu. Tas ir noderīgākais skatoties bez biežas pārlēkšanas. Atspējo šo ja saskaries ar atskaņošanas problēmām.", diff --git a/src/strings/mr.json b/src/strings/mr.json index 37cbc403de..88a0a9cfe5 100644 --- a/src/strings/mr.json +++ b/src/strings/mr.json @@ -1,34 +1,21 @@ { "ButtonOpen": "उघडा", "ButtonOk": "ऑन", - "ButtonOff": "ऑफ", "ButtonNextTrack": "पुढचा ट्रॅक", - "ButtonNew": "नवीन", "ButtonNetwork": "नेटवर्क", "ButtonMore": "अजून", - "ButtonLearnMore": "अधिक माहिती", "ButtonInfo": "माहिती", - "ButtonHelp": "मदत", "ButtonGuide": "गाईड", "ButtonGotIt": "समजले", "ButtonForgotPassword": "पासवर्ड विसरलो", - "ButtonEditImages": "चित्र संपादित करा", - "ButtonEdit": "संपादित करा", - "ButtonDownload": "डाउनलोड करा", - "ButtonDown": "खाली", - "ButtonDeleteImage": "चित्र काढून टाका", - "ButtonDelete": "काढून टाका", "ButtonChangeServer": "सर्व्हर बदला", "ButtonCancel": "रद्द करा", "ButtonBack": "मागे", "ButtonAudioTracks": "ऑडिओ ट्रॅक", - "ButtonArrowUp": "वर", "ButtonArrowRight": "उजवीकडे", "ButtonArrowLeft": "डावीकडे", - "ButtonArrowDown": "खाली", "ButtonAddUser": "प्रयोक्ता जोडा", "ButtonAddServer": "सर्व्हर जोडा", - "ButtonAdd": "जोडा", "Books": "पुस्तकं", "Blacklist": "ब्लॅकलिस्ट", "BirthPlaceValue": "जन्म ठिकाण: {0}", @@ -38,7 +25,6 @@ "Backdrop": "पार्श्वभूमी", "Auto": "आपोआप", "Audio": "ऑडिओ", - "AttributeNew": "नवीन", "AspectRatio": "अ‍ॅस्पेक्ट रेशो", "AsManyAsPossible": "जमतील तितके", "Artists": "संगीतकार", @@ -57,7 +43,6 @@ "AddedOnValue": "{0} जोडले", "Add": "जोडा", "Actor": "अभिनेता", - "EnableBackdrops": "पार्श्वभूमी", "EditSubtitles": "सबटायटल संपादित करा", "EditMetadata": "मेटाडेटा संपादित करा", "EditImages": "चित्र संपादित करा", @@ -80,10 +65,7 @@ "Categories": "वर्ग", "CancelRecording": "रेकॉर्डिंग रद्द करा", "ButtonWebsite": "संकेतस्थळ", - "ButtonViewWebsite": "संकेतस्थळ पाहा", - "ButtonUp": "वर", "ButtonTrailer": "ट्रेलर", - "ButtonSubtitles": "सबटायटल", "ButtonStop": "थांबा", "ButtonStart": "सुरू करा", "ButtonSettings": "सेटिंग्झ", @@ -91,12 +73,10 @@ "ButtonSelectView": "दृष्य निवडा", "ButtonSelectServer": "सर्व्हर निवडा", "ButtonSelectDirectory": "डिरेक्टरी निवडा", - "ButtonSearch": "शोधा", "ButtonScanAllLibraries": "सर्व संग्रहालय स्कॅन करा", "ButtonRename": "नाव बदला", "ButtonRemove": "काढून टाका", "ButtonPreviousTrack": "मागचा ट्रॅक", - "ButtonPlay": "प्ले", "ButtonPause": "पॉझ", "ButtonSyncPlay": "SyncPlay", "Collections": "संग्रह" diff --git a/src/strings/ms.json b/src/strings/ms.json index d5f9259c21..e9d03a73f0 100644 --- a/src/strings/ms.json +++ b/src/strings/ms.json @@ -2,10 +2,7 @@ "ButtonSignOut": "Sign out", "Delete": "Padam", "FolderTypeTvShows": "TV", - "HeaderSeries": "Series", "LabelFinish": "Habis", - "LabelNext": "Seterusnya", - "LabelPrevious": "Sebelumnya", "LabelYoureDone": "Kamu Selesai!", "ParentalRating": "Parental Rating", "SettingsSaved": "Seting Disimpan", @@ -13,7 +10,6 @@ "AccessRestrictedTryAgainLater": "Akses dihalang pada masa ini. Sila cuba sebentar lagi.", "Actor": "Pelakon", "Add": "Tambah", - "AddItemToCollectionHelp": "Tambah item ke koleksi melalui carian dan menggunakan menu klik kanan atau ketik menu tersebut untuk menambahkan ke koleksi.", "AddToCollection": "Tambah ke dalam koleksi", "AddToPlayQueue": "Tambah ke giliran main", "AddToPlaylist": "Tambah pada senarai main", @@ -46,10 +42,8 @@ "AsManyAsPossible": "Sebanyak mungkin", "Ascending": "Susunan menaik", "AspectRatio": "Nisbah aspek", - "AttributeNew": "Terbaru", "Audio": "Audio", "Auto": "Auto", - "AutoBasedOnLanguageSetting": "Auto (berdasar tetapan bahasa)", "Backdrop": "Latar belakang", "Backdrops": "Latar belakang", "BirthDateValue": "Lahir: {0}", @@ -59,40 +53,26 @@ "Books": "Buku-buku", "Box": "Kotak", "Browse": "Semak imbas", - "ButtonAdd": "Tambah", "ButtonAddMediaLibrary": "Tambah Pustaka Media", "ButtonAddServer": "Tambah pelayan", "ButtonAddUser": "Tambah pengguna", - "ButtonArrowDown": "Turun", "ButtonArrowLeft": "Kiri", "ButtonArrowRight": "Kanan", - "ButtonArrowUp": "Atas", "ButtonAudioTracks": "Trek Audio", "ButtonBack": "Kembali", "ButtonCancel": "Batalkan", "ButtonChangeServer": "Tukar pelayan", - "ButtonConnect": "Sambung", "ButtonLibraryAccess": "Akses pustaka", - "ButtonLearnMore": "Ketahui lebih lanjut", "ButtonInfo": "Info", - "ButtonHome": "Mula", - "ButtonHelp": "Pertolongan", "ButtonGuide": "Panduan", "ButtonGotIt": "Terima", "ButtonFullscreen": "Paparan skrin penuh", "ButtonForgotPassword": "Lupa Kata Laluan", - "ButtonFilter": "Tapisan", "ButtonEditOtherUserPreferences": "Edit profil, gambar dan keutamaan peribadi pengguna ini", - "ButtonEditImages": "Edit gambar-gambar", - "ButtonEdit": "Edit", - "ButtonDownload": "Muat turun", - "ButtonDown": "Bawah", - "ButtonDeleteImage": "Buang gambar", - "ButtonDelete": "Buang", "ButtonAddScheduledTaskTrigger": "Tambah Pencetus", "ButtonAddImage": "Tambah gambar", "BurnSubtitlesHelp": "Menentukan sama ada pelayan perlu membakar subtitle ke skrin apabila menukar video bergantung kepada format sarikata. Menghindari pembakaran sari kata ke skrin akan meningkatkan prestasi pelayan. Pilih Auto untuk membakar format berasaskan imej (VOBSUB, PGS, SUB / IDX, dll) dan subtitle ASS / SSA tertentu.", - "BrowsePluginCatalogMessage": "Semak imbas katalog plugin kami untuk melihat plugin yang tersedia.", + "MessageBrowsePluginCatalog": "Semak imbas katalog plugin kami untuk melihat plugin yang tersedia.", "BoxRear": "Kotak (belakang)", "BookLibraryHelp": "Buku audio dan teks disokong. Semak {0}panduan penamaan buku{1}.", "Banner": "Sepanduk", @@ -105,8 +85,6 @@ "Channels": "Saluran", "ButtonSyncPlay": "SyncPlay", "Movies": "Filem", - "HeaderNextUp": "Seterusnya", - "HeaderLiveTV": "TV Siaran Langsung", "HeaderFavoriteSongs": "Lagu-lagu Kegemaran", "HeaderFavoriteShows": "Rancangan-rancangan Kegemaran", "HeaderFavoriteEpisodes": "Episod-episod Kegemaran", diff --git a/src/strings/nb.json b/src/strings/nb.json index bba97f9da2..591af23502 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -2,7 +2,6 @@ "Absolute": "Absolutt", "Actor": "Skuespiller", "Add": "Legg til", - "AddItemToCollectionHelp": "Legg til elementer i samlinger ved å søke etter dem og bruke deres høyreklikk eller peke-menyer for å legge dem til en samling.", "AddToCollection": "Legg til i samling", "AddToPlayQueue": "Legg til i avspillingskø", "AddToPlaylist": "Legg til i spilleliste", @@ -18,14 +17,13 @@ "AllowHWTranscodingHelp": "Tillat at tuneren omkoder strømmer fortløpende. Dette kan bidra til å redusere mendgen omkoding som må utføres av serveren.", "AllowMediaConversion": "Tillat konvertering av media", "AllowMediaConversionHelp": "Tillatt eller forby tilgang til å konvertere media.", - "AllowRemoteAccess": "Tillat eksterne tilkoblinger til denne Jellyfin-serveren.", + "AllowRemoteAccess": "Tillat eksterne tilkoblinger til denne serveren.", "AllowRemoteAccessHelp": "Alle tilkoblinger via nettverk vil blokkeres dersom du ikke aktiverer denne innstillingen.", "Anytime": "Når som helst", "AroundTime": "Rundt", "Artists": "Artister", "AsManyAsPossible": "Så mange som mulig", "AspectRatio": "Størrelsesforhold", - "AttributeNew": "Ny", "Audio": "Lyd", "Auto": "Automatisk", "BirthDateValue": "Født: {0}", @@ -33,61 +31,41 @@ "BirthPlaceValue": "Fødested: {0}", "BookLibraryHelp": "Lyd- og tekstbøker støttes. Se igjennom {0} navneguiden for bøker {1}.", "Books": "Bøker", - "BrowsePluginCatalogMessage": "Bla i tilleggskatalogen vår for å se tilgjengelige applikasjonstillegg.", - "ButtonAdd": "Legg til", + "MessageBrowsePluginCatalog": "Bla i tilleggskatalogen vår for å se tilgjengelige applikasjonstillegg.", "ButtonAddMediaLibrary": "Legg til bibliotek", "ButtonAddScheduledTaskTrigger": "Legg til utløser", "ButtonAddServer": "Legg til server", "ButtonAddUser": "Ny bruker", - "ButtonArrowDown": "Ned", "ButtonArrowLeft": "Venstre", "ButtonArrowRight": "Høyre", - "ButtonArrowUp": "Opp", "ButtonAudioTracks": "Lydspor", "ButtonBack": "Tilbake", "ButtonCancel": "Avbryt", "ButtonChangeServer": "Endre server", - "ButtonConnect": "Koble til", - "ButtonDelete": "Slett", - "ButtonDeleteImage": "Slett bilde", - "ButtonDown": "Ned", - "ButtonDownload": "Last ned", - "ButtonEdit": "Rediger", - "ButtonEditImages": "Endre bilder", "ButtonEditOtherUserPreferences": "Endre denne brukerens profilbilde og personlige innstillinger.", "ButtonForgotPassword": "Glemt passord", "ButtonFullscreen": "Fullskjerm", "ButtonGotIt": "Skjønner", - "ButtonHelp": "Hjelp", - "ButtonHome": "Hjem", - "ButtonLearnMore": "Lær mer", "ButtonLibraryAccess": "Bibliotektilgang", "ButtonManualLogin": "Manuell Login", "ButtonMore": "Mer", "ButtonNetwork": "Nettverk", - "ButtonNew": "Ny", "ButtonNextTrack": "Neste Spor", - "ButtonOff": "Av", "ButtonOk": "OK", "ButtonOpen": "Åpne", "ButtonParentalControl": "Foreldrekontroll", - "ButtonPlay": "Spill", "ButtonPreviousTrack": "Forrige spor", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Hurtigveiledning", - "ButtonRefresh": "Oppdater", "ButtonRefreshGuideData": "Oppdater TV-guidedata", "ButtonRemove": "Fjern", "ButtonRename": "Endre navn", - "ButtonRepeat": "Gjenta", "ButtonResetEasyPassword": "Tilbakestill PIN-kode", "ButtonResetPassword": "Tilbakestill passord", "ButtonRestart": "Omstart", "ButtonResume": "Fortsett", "ButtonRevoke": "Kall tilbake", - "ButtonSave": "Lagre", "ButtonScanAllLibraries": "Skann alle biblioteker", - "ButtonSearch": "Søk", "ButtonSelectDirectory": "Velg katalog", "ButtonSelectServer": "Velg server", "ButtonSelectView": "Velg visning", @@ -95,13 +73,9 @@ "ButtonShutdown": "Slå av", "ButtonSignIn": "Logg inn", "ButtonSignOut": "Logg ut", - "ButtonSort": "Sortér", "ButtonStop": "Stopp", "ButtonSubmit": "Send", - "ButtonSubtitles": "Undertekster", "ButtonUninstall": "Avinstaller", - "ButtonUp": "Opp", - "ButtonViewWebsite": "Vis nettsted", "ButtonWebsite": "Nettsted", "CancelRecording": "Avbryt opptak", "CancelSeries": "Avbryt serie", @@ -115,7 +89,7 @@ "ColorSpace": "Fargeutvalg", "ColorTransfer": "Overføring av farger", "Composer": "Komponist", - "ConfigureDateAdded": "Konfigurer hvordan \"Dato lagt til\" bestemmes på Jellyfin-serveren sitt dashbord under instillinger for Bibliotek", + "ConfigureDateAdded": "Konfigurer hvordan \"Dato lagt til\" bestemmes på dashbordet under innstillingene for bibliotek", "ConfirmDeleteImage": "Slett bilde?", "ConfirmDeleteItem": "Sletting av elementet vil slette det fra både filsystemet og biblioteket. Er du sikker på at du vil fortsette?", "ConfirmDeleteItems": "Sletting av disse elementene vil slette dem fra både filsystemet og mediebiblioteket. Er du sikker på at du vil fortsette?", @@ -126,7 +100,7 @@ "Continuing": "Fortsetter", "CustomDlnaProfilesHelp": "Lag en tilpasset profil til en ny enhet eller for å overstyre en system-profil.", "DeathDateValue": "Døde: {0}", - "DefaultErrorMessage": "Det oppstod en feil under behandling av forespørselen. Vennligst prøv igjen senere.", + "ErrorDefault": "Det oppstod en feil under behandling av forespørselen. Vennligst prøv igjen senere.", "DefaultMetadataLangaugeDescription": "Dette er standardverdiene dine, de kan også tilpasses per biblioteksbasis.", "Delete": "Slett", "DeleteDeviceConfirmation": "Er du sikker på at du ønsker å slette denne enheten? Den vil gjenoppstå neste gang en bruker logger inn med den.", @@ -160,11 +134,11 @@ "EndsAtValue": "Slutter klokken {0}", "Episodes": "Episoder", "ErrorAddingListingsToSchedulesDirect": "Det oppstod en feil når du la oppstillingen til Schedules Direct-kontoen din. Schedules Direct tillater kun et begrenset antall oppstillinger per konto. Det kan hende du må logge inn på Schedules Direct-nettstedet og fjerne andre lister fra kontoen din før du fortsetter.", - "ErrorAddingMediaPathToVirtualFolder": "Det oppstod en feil med å legge inn filbane til media. Vennligst sørg for at filbanen er gyldig og at Jellyfin-serverprosessen har tilgang til filbanen.", + "ErrorAddingMediaPathToVirtualFolder": "Det oppstod en feil med å legge inn filbane til media. Vennligst sørg for at filbanen er gyldig og at Jellyfin har tilgang til filbanen.", "ErrorAddingTunerDevice": "Det oppstod en feil når tuneren skulle legges til. Vennligst sørg for at den er tilgjengelig og prøv på nytt.", "ErrorAddingXmlTvFile": "Det oppstod en feil under lesing av XMLTV-filen. Vennligst sørg for at filen finnes og prøv igjen.", "ErrorGettingTvLineups": "Det oppstod en feil under nedlastning av TV-oversikten. Vennligst sørg for at informasjonen er korrekt og prøv igjen.", - "ErrorMessageStartHourGreaterThanEnd": "Sluttid må være senere enn starttid.", + "ErrorStartHourGreaterThanEnd": "Sluttid må være senere enn starttid.", "ErrorPleaseSelectLineup": "Velg et programoppsett og prøv igjen. Hvis ingen oppsett er tilgjengelig, sjekk at brukernavn, passord og postnummer er riktig.", "ErrorSavingTvProvider": "Det oppstod en feil ved lagring av TV-leverandør. Vennligst forsikre deg om at den er tilgjengelig, og prøv på nytt.", "EveryNDays": "Hver {0}. dag", @@ -197,29 +171,22 @@ "HeaderActiveDevices": "Aktive enheter", "HeaderActiveRecordings": "Aktive opptak", "HeaderActivity": "Aktivitet", - "HeaderAddScheduledTaskTrigger": "Legg til utløser", "HeaderAddToCollection": "Legg til i samling", "HeaderAddToPlaylist": "Legg til i Spilleliste", "HeaderAddUpdateImage": "Legg Til/Oppdater Bilde", - "HeaderAddUser": "Legg til bruker", "HeaderAdditionalParts": "Tilleggsdeler", - "HeaderAlbums": "Albumer", "HeaderAlert": "Varsling", "HeaderAllowMediaDeletionFrom": "Tillat sletting av media fra", "HeaderApiKey": "API-nøkkel", "HeaderApiKeys": "API-nøkler", - "HeaderApiKeysHelp": "Eksterne programmer trenger en API-nøkkel for å kunne kommunisere med Jellyfin-serveren. Nøklene utstedes ved å logge på med en Jellyfin-konto, eller ved å manuelt gi programmet en nøkkel.", + "HeaderApiKeysHelp": "Eksterne programmer trenger en API-nøkkel for å kunne kommunisere med serveren. Nøklene utstedes ved å logge på med en vanlig brukerkonto eller gjennom å manuelt gi programmet en nøkkel.", "HeaderAudioBooks": "Lydbøker", "HeaderAudioSettings": "Lydinnstillinger", - "HeaderAutomaticUpdates": "Automatiske oppdateringer", - "HeaderBooks": "Bøker", "HeaderBranding": "Merking", "HeaderCancelRecording": "Avbryt opptak", "HeaderCancelSeries": "Avbryt serie", "HeaderCastAndCrew": "Skuespillere & mannskap", - "HeaderCastCrew": "Mannskap", "HeaderChannelAccess": "Kanal-tilgang", - "HeaderChannels": "Kanaler", "HeaderCodecProfile": "Kodekprofil", "HeaderCodecProfileHelp": "Kodekprofiler indikerer begrensningene til en enhet ved avspilling av bestemte kodeker. Hvis en begrensning gjelder, vil media bli omkodet, selv om kodeken er konfigurert for direkteavspilling.", "HeaderConfirmPluginInstallation": "Bekreft installasjon av tillegg", @@ -245,22 +212,16 @@ "HeaderDevices": "Enheter", "HeaderDirectPlayProfile": "Direkteavspillingsprofil", "HeaderDirectPlayProfileHelp": "Legg direkteavspillingsprofiler for å indikere hvilke formater enheten støtter direkte avspilling av.", - "HeaderDisplay": "Vis", "HeaderDownloadSync": "Last ned og synkroniser", "HeaderEasyPinCode": "Enkel PIN-kode", "HeaderEditImages": "Endre bilder", "HeaderEnabledFields": "Aktiverte felt", "HeaderEnabledFieldsHelp": "Fjern markeringen av et felt for å låse det og hindre dataene fra å endres.", - "HeaderEpisodes": "Episoder", "HeaderError": "Feil", "HeaderFeatureAccess": "Funksjonstilgang", - "HeaderFeatures": "Funksjoner", "HeaderFetchImages": "Hent bilder:", - "HeaderFilters": "Filtre", "HeaderForKids": "For barn", - "HeaderForgotPassword": "Glemt passord", "HeaderFrequentlyPlayed": "Ofte avspilt", - "HeaderGenres": "Sjanger", "HeaderGuideProviders": "Leverandører av TV-guide", "HeaderHttpHeaders": "HTTP-hoder", "HeaderIdentification": "Identifisering", @@ -271,7 +232,6 @@ "HeaderImageSettings": "Bildeinnstillinger", "HeaderInstall": "Installer", "HeaderInstantMix": "Miks", - "HeaderItems": "Elementer", "HeaderKeepRecording": "Behold opptak", "HeaderKeepSeries": "Behold serie", "HeaderLatestEpisodes": "Nyeste episoder", @@ -287,24 +247,20 @@ "HeaderLiveTvTunerSetup": "Tunerinnstillinger for direkte-TV", "HeaderLoginFailure": "Påloggingsfeil", "HeaderMediaFolders": "Mediemapper", - "HeaderMediaInfo": "Mediainformasjon", "HeaderMetadataSettings": "Metadatainnstilinger", "HeaderMoreLikeThis": "Flere som dette", - "HeaderMovies": "Filmer", "HeaderMusicVideos": "Musikkvideoer", "HeaderMyDevice": "Min enhet", "HeaderMyMedia": "Min media", "HeaderMyMediaSmall": "Min media (liten)", "HeaderNewApiKey": "Ny API-nøkkel", "HeaderNewDevices": "Nye enheter", - "HeaderNextUp": "Neste", "HeaderOnNow": "Spiller nå", "HeaderOtherItems": "Andre elementer", "HeaderParentalRatings": "Foreldresensur", "HeaderPassword": "Passord", "HeaderPasswordReset": "Tilbakestill passord", "HeaderPaths": "Filbaner", - "HeaderPeople": "Personer", "HeaderPinCodeReset": "Tilbakestill PIN-kode", "HeaderPlayAll": "Spill alle", "HeaderPlayOn": "Forsett avspilling", @@ -315,7 +271,7 @@ "HeaderPreferredMetadataLanguage": "Foretrukket språk for metadata", "HeaderProfile": "Profil", "HeaderProfileInformation": "Profilinformasjon", - "HeaderProfileServerSettingsHelp": "Disse verdiene styrer hvordan Jellyfin-serveren presenterer seg selv for enheten.", + "HeaderProfileServerSettingsHelp": "Disse verdiene styrer hvordan serveren presenterer seg selv for klienter.", "HeaderRecentlyPlayed": "Nylig avspilt", "HeaderRecordingOptions": "Opptaksvalg", "HeaderRecordingPostProcessing": "Etterbehandling av opptak", @@ -328,7 +284,6 @@ "HeaderRevisionHistory": "Revisjonshistorikk", "HeaderRunningTasks": "Kjørende oppgaver", "HeaderScenes": "Kapitler", - "HeaderSchedule": "Timeplan", "HeaderSeasons": "Sesonger", "HeaderSelectCertificatePath": "Velg sertifikatplassering", "HeaderSelectMetadataPath": "Velg metadataplassering", @@ -338,14 +293,12 @@ "HeaderSelectServerCachePath": "Velg filbane for mellomlagring", "HeaderSelectServerCachePathHelp": "Bla eller skriv inn filbanen som skal brukes for mellomlagring av serverdata. Mappen må være skrivbar.", "HeaderSelectTranscodingPath": "Velg filbane for midlertidig lagring av omkodede filer", - "HeaderSelectTranscodingPathHelp": "Bla eller skriv inn filbanen som skal brukes for midlertidig lagring av omkodede filer. Mappen må være skrivbar.", + "HeaderSelectTranscodingPathHelp": "Bla eller skriv inn filbanen som skal brukes for omkodede filer. Mappen må være skrivbar.", "HeaderSendMessage": "Send melding", - "HeaderSeries": "Serier", "HeaderSeriesOptions": "Serievalg", "HeaderServerSettings": "Serverinnstillinger", "HeaderSettings": "Innstillinger", "HeaderSetupLibrary": "Konfigurer dine mediebibliotek", - "HeaderShutdown": "Skru av", "HeaderSortBy": "Sorter etter", "HeaderSortOrder": "Sorteringsrekkefølge", "HeaderSpecialEpisodeInfo": "Spesialepisodeinfo", @@ -354,7 +307,6 @@ "HeaderSubtitleProfiles": "Undertekstprofiler", "HeaderSubtitleProfilesHelp": "Undertekstprofiler beskriver tekstingsformater som støttes av enheten.", "HeaderSystemDlnaProfiles": "Systemprofiler", - "HeaderTags": "Tagger", "HeaderTaskTriggers": "Oppgaveutløsere", "HeaderThisUserIsCurrentlyDisabled": "Denne brukeren er deaktivert", "HeaderTracks": "Spor", @@ -374,13 +326,12 @@ "HeaderXmlDocumentAttributes": "XML-dokumentattributter", "HeaderXmlSettings": "XML-innstillinger", "HeaderYears": "År", - "HeadersFolders": "Mapper", "Help": "Hjelp", "HideWatchedContentFromLatestMedia": "Skjul sett innhold fra nyeste media", "Identify": "Identifiser", "Images": "Bilder", - "ImportFavoriteChannelsHelp": "Hvis aktivert, vil kun kanaler som er markert som favoritt på tuneren bli importert.", - "ImportMissingEpisodesHelp": "Hvis aktivert, vil informasjon om manglende episoder importeres til Jellyfin-databasen og de vil vises under sesonger og serier. Dette kan føre til at skanning av biblioteket tar betydelig lengre tid.", + "ImportFavoriteChannelsHelp": "Kun kanaler som er markert som favoritt på tuneren bli importert.", + "ImportMissingEpisodesHelp": "Informasjon om manglende episoder vil bli importet til databasen og bli vist under sesonger og serier. Dette kan føre til at skanning av biblioteket tar betydelig lengre tid.", "InstallingPackage": "Installerer {0} (versjon {1})", "InstantMix": "Direktemiks", "ItemCount": "{0} elementer", @@ -400,21 +351,18 @@ "LabelAlbumArtMaxWidth": "Maks bredde for albumomslag:", "LabelAlbumArtMaxWidthHelp": "Maksoppløsning av albumomslag er eksponert via upnp:albumArtURI.", "LabelAlbumArtists": "Albumartister:", - "LabelAll": "Alle", "LabelAllowHWTranscoding": "Tillat maskinvare-omkoding", - "LabelAllowServerAutoRestart": "Tillat at serveren restartes automatisk for å installere oppdateringer", - "LabelAllowServerAutoRestartHelp": "Serveren vil kun restartes i inaktive perioder når ingen brukere er aktive.", "LabelAppName": "Applikasjonsnavn", "LabelAppNameExample": "Eksempel: Sickbeard, Sonarr", "LabelArtists": "Artister:", - "LabelArtistsHelp": "Separer med semikolon ;", + "LabelArtistsHelp": "Separer flere artister med et semikolon.", "LabelAudioLanguagePreference": "Foretrukket språk på lydspor:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Oppdater metadata automatisk fra Internett:", "LabelBindToLocalNetworkAddress": "Bind til lokal nettverksadresse:", - "LabelBindToLocalNetworkAddressHelp": "Valgfritt. Overstyrer den lokale IP-adressen som HTTP-serveren bindes til. Hvis tomt, vil serveren binde seg til alle tilgjengelige adresser. Endringer av denne verdien krever omstart av Jellyfin-serveren.", + "LabelBindToLocalNetworkAddressHelp": "Overstyr den lokale IP-adressen til HTTP-serveren. Hvis tomt, vil serveren binde seg til alle tilgjengelige adresser. Endringer av denne verdien krever en omstart.", "LabelBirthDate": "Fødselsdato:", "LabelBirthYear": "Fødselsår:", - "LabelBlastMessageInterval": "Intervall mellom keepalive-meldinger (sekunder)", + "LabelBlastMessageInterval": "Intervall mellom keepalive-meldinger", "LabelBlastMessageIntervalHelp": "Bestemmer intervallet i sekunder mellom keepalive-meldinger.", "LabelCachePath": "Filbane for mellomlagring:", "LabelCachePathHelp": "Angi en egendefinert plassering for mellomlagrede filer, som f.eks. bilder. La feltet stå tomt for å bruke standardverdi.", @@ -430,8 +378,7 @@ "LabelCurrentPassword": "Nåværende passord:", "LabelCustomCertificatePath": "Egendefinert filbane for SSL-sertifikat:", "LabelCustomCss": "Tilpasset CSS:", - "LabelCustomCssHelp": "Bruk tilpasset CSS-kode for å endre stil på web-grensesnittet.", - "LabelCustomDeviceDisplayName": "Visningsnavn:", + "LabelCustomCssHelp": "Bruk tilpassede stiler på web-grensesnittet.", "LabelCustomDeviceDisplayNameHelp": "Oppgi et egendefinert visningsnavn eller la det være tomt for å bruke navnet som enheten rapporterer.", "LabelCustomRating": "Egen aldersgrense:", "LabelDateAdded": "Dato lagt til:", @@ -444,7 +391,6 @@ "LabelDeviceDescription": "Enhetsbeskrivelse", "LabelDidlMode": "DIDL-modus:", "LabelDisplayLanguageHelp": "Oversettelse av Jellyfin er et pågående prosjekt.", - "LabelDisplayMissingEpisodesWithinSeasons": "Vis episoder som mangler fra sesongen", "LabelDisplayMode": "Visningsmodus:", "LabelDisplayName": "Visningsnavn:", "LabelDisplayOrder": "Visningsrekkefølge:", @@ -459,8 +405,8 @@ "LabelEnableAutomaticPortMapHelp": "Automatisk koble eksterne porter på ruteren til lokale porter på serveren din via UPnP. Dette fungerer ikke med alle rutere eller nettverkskonfigurasjoner. Endringer trer ikke kraft før serveren startes på nytt.", "LabelEnableBlastAliveMessages": "Kringkast keepalive-meldinger", "LabelEnableBlastAliveMessagesHelp": "Aktiver hvis serveren ikke blir konsekvent oppdaget av andre UPnP-enheter på nettverket ditt.", - "LabelEnableDlnaClientDiscoveryInterval": "Oppdateringsintervall for klient (i sekunder)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Bestemmer intervallet i sekunder mellom SSDP-søk utført av Jellyfin.", + "LabelEnableDlnaClientDiscoveryInterval": "Oppdateringsintervall for klient", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Bestemmer intervallet i sekunder mellom SSDP-søk.", "LabelEnableDlnaDebugLogging": "Aktiver DLNA debug-logging", "LabelEnableDlnaDebugLoggingHelp": "Dette vil lage store loggfiler og burde kun benyttes for feilsøking.", "LabelEnableDlnaPlayTo": "Aktiver DLNA Play To", @@ -482,16 +428,16 @@ "LabelFinish": "Fullfør", "LabelForgotPasswordUsernameHelp": "Skriv inn brukernavnet ditt, dersom du husker det.", "LabelFriendlyName": "Egendefinert navn:", - "LabelServerNameHelp": "Dette navnet vil bli brukt for å identifisere denne serveren. Standardverdien er serverens maskinnavn.", + "LabelServerNameHelp": "Dette navnet vil bli brukt for å identifisere denne serveren. Standardverdien er serverens tjenernavn.", "LabelGroupMoviesIntoCollections": "Gruppér filmer i samlinger", - "LabelGroupMoviesIntoCollectionsHelp": "Ved visning av filmlister vil filmer som tilhører en samling bli vist som ett gruppeelement.", + "LabelGroupMoviesIntoCollectionsHelp": "Ved visning av filmlister, vil filmer i en samling bli vist som ett gruppert element.", "LabelH264Crf": "CRF-verdi for H264-koding:", "LabelEncoderPreset": "Forhåndsinnstilling for H264-koding:", "LabelHardwareAccelerationType": "Maskinvareakselerasjon:", "LabelHardwareAccelerationTypeHelp": "Maskinvareakselerasjon krever ytterligere konfigurasjon.", "LabelHomeScreenSectionValue": "Hjemskjermseksjon {0}:", "LabelHttpsPort": "Lokal HTTPS-port:", - "LabelHttpsPortHelp": "TCP-portnummeret som Jellyfin sin HTTPS-server skal benytte.", + "LabelHttpsPortHelp": "TCP-portnummeret for HTTPS-serveren.", "LabelIconMaxHeight": "Makshøyde for ikon:", "LabelIconMaxHeightHelp": "Maks oppløsning for ikoner eksponert via upnp:icon.", "LabelIconMaxWidth": "Maksbredde for ikon:", @@ -515,7 +461,7 @@ "LabelLanguage": "Språk:", "LabelLineup": "Oppstilling:", "LabelLocalHttpServerPortNumber": "Lokal HTTP-port:", - "LabelLocalHttpServerPortNumberHelp": "TCP-portnummeret som Jellyfin sin HTTP-server skal benytte.", + "LabelLocalHttpServerPortNumberHelp": "TCP-portnummeret for HTTP-serveren.", "LabelLockItemToPreventChanges": "Lås dette elementet for å hindre fremtidige endringer", "LabelLoginDisclaimer": "Ansvarsfraskrivelse ved innlogging:", "LabelLoginDisclaimerHelp": "En melding som vises på bunnen av innloggingssiden.", @@ -536,7 +482,7 @@ "LabelMetadataPathHelp": "Spesifiser en egen plassering for nedlastede omslagsbilder og metadata.", "LabelMetadataReaders": "Metadatalesere:", "LabelMetadataReadersHelp": "Ranger dine foretrukne lokale kilder for metadata i prioritert rekkefølge. Den første filen som blir funnet vil leses inn.", - "LabelMetadataSaversHelp": "Velg filformatene metadataen din skal lagres til.", + "LabelMetadataSaversHelp": "Velg filformatene som skal brukes ved lagring av metadata.", "LabelMethod": "Metode:", "LabelMinBackdropDownloadWidth": "Minimum bredde for nedlastede bakgrunner:", "LabelMinResumeDuration": "Minimum fortsettelsesvarighet:", @@ -551,7 +497,7 @@ "LabelMovieCategories": "Filmkategorier:", "LabelMoviePrefix": "Filmprefiks:", "LabelMoviePrefixHelp": "Hvis et prefiks benyttes i filmtitler, skriv det inn her slik at serveren kan håndtere det på riktig måte.", - "LabelMovieRecordingPath": "Filbane for filmopptak (valgfritt):", + "LabelMovieRecordingPath": "Filbane for filmopptak:", "LabelMusicStreamingTranscodingBitrate": "Bithastighet for omkoding av musikk:", "LabelMusicStreamingTranscodingBitrateHelp": "Spesifiser høyeste tillatte bithastighet ved musikkstrømming.", "LabelName": "Navn:", @@ -559,13 +505,12 @@ "LabelNewPassword": "Nytt passord:", "LabelNewPasswordConfirm": "Bekreft nytt passord:", "LabelNewsCategories": "Nyhetskategorier:", - "LabelNext": "Neste", "LabelNotificationEnabled": "Aktiver denne varslingen", "LabelNumber": "Nummer:", "LabelNumberOfGuideDays": "Antall dager med TV-guidedata som skal lastes ned:", "LabelNumberOfGuideDaysHelp": "Nedlasting av TV-guide for flere dager gir muligheten for å planlegge lenger i forveien og for å se flere listinger, men vil også føre til at nedlastningen tar lenger tid. Auto vil velge basert på antall kanaler.", - "LabelOptionalNetworkPath": "(Valgfritt) Delt nettverksmappe:", - "LabelOptionalNetworkPathHelp": "Hvis denne mappen er delt på nettverket, vil Jellyfin-apper på andre enheter kunne få tilgang til mediefilene direkte dersom du spesifiserer nettverksbanen her. For eksempel, {0} eller {1}.", + "LabelOptionalNetworkPath": "Delt nettverksmappe:", + "LabelOptionalNetworkPathHelp": "Hvis denne mappen er delt på nettverket, vil klienter på andre enheter kunne få tilgang til mediefilene direkte dersom du spesifiserer nettverksbanen her. For eksempel, {0} eller {1}.", "LabelOriginalAspectRatio": "Originalt sideforhold:", "LabelOriginalTitle": "Original tittel:", "LabelOverview": "Oversikt:", @@ -583,8 +528,6 @@ "LabelPostProcessorArguments": "Kommandolinjeargumenter for etterbehandling:", "LabelPostProcessorArgumentsHelp": "Bruk {path} som filbanen til opptaksfilen.", "LabelPreferredDisplayLanguage": "Foretrukket visningsspråk:", - "LabelPreferredDisplayLanguageHelp": "Oversettelse av Jellyfin er et pågående prosjekt.", - "LabelPrevious": "Forrige", "LabelProfileAudioCodecs": "Lydkodeker:", "LabelProfileCodecs": "Kodeker:", "LabelProfileCodecsHelp": "Separert med komma. Dette feltet kan forbli tomt for å gjelde alle kodeker.", @@ -598,14 +541,13 @@ "LabelPublicHttpPortHelp": "Den eksterne porten som kobles til den lokale HTTP-porten.", "LabelPublicHttpsPort": "Ekstern HTTPS-port:", "LabelPublicHttpsPortHelp": "Den eksterne porten som kobles til den lokale HTTPS-porten.", - "LabelReadHowYouCanContribute": "Lær hvordan du kan bidra.", "LabelRecord": "Opptak:", "LabelRecordingPath": "Standard plassering for opptak:", "LabelRecordingPathHelp": "Angi et egendefinert sted å lagre opptak. Dersom du lar feltet stå tomt vil serverens datamappe bli brukt.", "LabelRefreshMode": "Oppdateringsmodus:", "LabelReleaseDate": "Utgivelsesdato:", "LabelRemoteClientBitrateLimit": "Maksimal bithastighet for strømming til Internett (Mbps):", - "LabelRuntimeMinutes": "Spilletid (minutter):", + "LabelRuntimeMinutes": "Spilletid:", "LabelSaveLocalMetadata": "Lagre omslagsbilder og metadata i medie-mappene", "LabelSaveLocalMetadataHelp": "Lagring av omslagsbilder og metadata direkte i mediemapper vil legge dem på et sted hvor de lett kan endres på.", "LabelScheduledTaskLastRan": "Sist kjørt {0}, tok {1}.", @@ -616,7 +558,7 @@ "LabelSelectVersionToInstall": "Velg versjon å installere:", "LabelSendNotificationToUsers": "Send varslingen til:", "LabelSerialNumber": "Serienummer", - "LabelSeriesRecordingPath": "Plassering for serieopptak (valgfritt):", + "LabelSeriesRecordingPath": "Plassering for serieopptak:", "LabelServerHost": "Vertsnavn:", "LabelServerHostHelp": "192.168.1.100:8096 eller https://dinserver.no", "LabelSkipIfAudioTrackPresent": "Hopp over dersom standard lydspor matcher nedlastingsspråket", @@ -640,12 +582,9 @@ "LabelTimeLimitHours": "Tidsbegrensning (timer):", "LabelTitle": "Tittel:", "LabelTrackNumber": "Spornummer:", - "LabelTranscodingAudioCodec": "Lydkodek:", - "LabelTranscodingContainer": "Kontainer:", "LabelTranscodingTempPathHelp": "Spesifiser en egen filbane for omkodede filer som skal sendes til klienter. La feltet stå tomt for å bruke serverens standardinnstilling.", "LabelTranscodingThreadCount": "Antall tråder for omkoding:", "LabelTranscodingThreadCountHelp": "Velg maksimalt antall tråder som kan brukes under omkoding. Færre tråder vil føre til lavere CPU-bruk, men kan føre til at mediet ikke konverteres fort nok til at avspillingen kan foregå uten avbrudd.", - "LabelTranscodingVideoCodec": "Videokodek:", "LabelTunerIpAddress": "IP-adresse til tuner:", "LabelTunerType": "Tunertype:", "LabelTypeMetadataDownloaders": "{0} - Kilder for metadata:", @@ -662,11 +601,10 @@ "LabelVersionInstalled": "{0} installert", "LabelXDlnaCapHelp": "Bestemmer innholdet i X_DLNACAP-elementet i urn:schemas-dlna-org:device-1-0-domenet.", "LabelXDlnaDocHelp": "Bestemmer innholdet i X_DLNADOC-elementet i urn:schemas-dlna-org:device-1-0-domenet.", - "LabelYourFirstName": "Fornavnet ditt:", "LabelYoureDone": "Du er ferdig!", "LabelZipCode": "Postnummer:", "LabelffmpegPath": "Filbane til FFmpeg:", - "LabelffmpegPathHelp": "Filbanen til applikasjonsfilen for FFmpeg, eller mappen som inneholder FFmpeg.", + "LabelffmpegPathHelp": "Filbanen til applikasjonsfilen for FFmpeg eller mappen som inneholder FFmpeg.", "LatestFromLibrary": "Siste {0}", "LibraryAccessHelp": "Velg bibliotekene som skal deles med denne brukren. Administratorer vil ha mulighet til å gjøre endringer i alle mapper ved å bruke metadatabehandleren.", "Like": "Liker", @@ -704,20 +642,19 @@ "MessageConfirmProfileDeletion": "Er du sikker på at du vil slette denne profilen?", "MessageConfirmRecordingCancellation": "Avbryt opptak?", "MessageConfirmRemoveMediaLocation": "Er du sikker på at du vil slette denne plasseringen?", - "MessageConfirmRestart": "Er du sikker på at du vil starte Jellyfin-serveren på nytt?", - "MessageConfirmRevokeApiKey": "Er du sikker på at du vil tilbakekalle denne API-nøkkelen? Applikasjonens tilkobling til Jellyfin-serveren vil bli avbrutt umiddelbart.", + "MessageConfirmRestart": "Er du sikker på at du vil starte Jellyfin på nytt?", + "MessageConfirmRevokeApiKey": "Er du sikker på at du vil tilbakekalle denne API-nøkkelen? Applikasjonens tilkobling til denne serveren vil bli avbrutt umiddelbart.", "MessageConfirmShutdown": "Er du sikker på at du vil avslutte serveren?", "MessageContactAdminToResetPassword": "Vennligst kontakt systemadministratoren for hjelp til å tilbakestille passordet ditt.", "MessageCreateAccountAt": "Opprett en konto hos {0}", "MessageDeleteTaskTrigger": "Er du sikker på at du vil slette denne oppgaveutløseren?", - "MessageDirectoryPickerBSDInstruction": "På BSD-systemer må du kanskje endre lagringsinnstillinger i FreeNAS Jail slik at Jellyfin har tilgang dit.", + "MessageDirectoryPickerBSDInstruction": "På BSD-systemer må du kanskje endre lagringsinnstillinger i FreeNAS Jail slik at Jellyfin har tilgang til mediene dine.", "MessageDirectoryPickerLinuxInstruction": "På Linux-systemer med Arch Linux, CentOS, Debian, Fedora, openSUSE eller Ubuntu må du minimum gi tjenestebrukeren lesetilgang til lagringsplassene dine.", "MessageDownloadQueued": "Nedlasting lagt i kø.", "MessageEnablingOptionLongerScans": "Aktivering av dette alternativet kan føre til at skanning av biblioteket tar betydelig lenger tid.", "MessageFileReadError": "En feil oppstod når filen skulle leses. Vennligst prøv igjen.", "MessageForgotPasswordFileCreated": "Følgende fil er opprettet på serveren og inneholder instruksjoner om hvordan du kan fortsette:", "MessageForgotPasswordInNetworkRequired": "Vennligst prøv igjen fra hjemmenettverket ditt for å starte prosessen med å gjenopprette passordet ditt.", - "MessageInstallPluginFromApp": "Dette programtillegget må installeres direkte i appen du har tenkt å bruke den i.", "MessageInvalidForgotPasswordPin": "Ugyldig eller utgått PIN kode angitt. Vennligst prøv igjen.", "MessageInvalidUser": "Ugyldig brukernavn eller passord. Vennligst prøv igjen.", "MessageItemSaved": "Element lagret.", @@ -733,15 +670,14 @@ "MessagePleaseEnsureInternetMetadata": "Vennligst sørg for at nedlasting av metadata fra internett er slått på.", "MessagePleaseWait": "Vennligst vent. Dette kan ta noe tid.", "MessagePluginConfigurationRequiresLocalAccess": "Logg inn direkte på din lokale server for å konfigurere dette programtillegget.", - "MessagePluginInstallDisclaimer": "Programtillegg utviklet av Jellyfin-samfunnet er en god måte å forbedre opplevelsen din av Jellyfin gjennom ekstra funksjoner og fordeler. Før installasjon bør du være klar over virkningen de kan ha på Jellyfin-serveren, som lengre skanning av bibliotek, ekstra bakgrunnsbehandling og redusert systemstabilitet.", + "MessagePluginInstallDisclaimer": "Programtillegg utviklet av brukersamfunnet er en god måte å forbedre opplevelsen din gjennom ekstra funksjoner og fordeler. Før installasjon bør du være klar over virkningen de kan ha på serveren din, som lengre skanning av bibliotek, ekstra bakgrunnsbehandling og redusert systemstabilitet.", "MessageReenableUser": "Se under for å reaktivere", - "MessageSettingsSaved": "Innstillinger lagret.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Følgende medieplassering vil bli fjernet fra biblioteket ditt:", "MessageUnableToConnectToServer": "Vi klarte ikke å koble til den valgte serveren akkurat nå. Vennligst sørg for at den kjører og prøv på nytt.", "MessageUnsetContentHelp": "Innhold vises som enkle mapper. For beste resultat, bruk metadatabehandleren for å sette innholdstypen for undermapper.", "MessageYouHaveVersionInstalled": "Du har for øyeblikket versjon {0} installert.", "MetadataManager": "Metadatabehandler", - "MetadataSettingChangeHelp": "Endring av metadatainnstillinger vil gjelde nytt innhold som legges til fra nå av. For å oppdatere eksisterende innhold, åpne detaljer-menyen og klikk på oppdateringsknappen, eller kjør masseoppdatering ved hjelp av metadatabehandleren.", + "MetadataSettingChangeHelp": "Endring av metadatainnstillinger vil gjelde nytt innhold lagt til fra nå av. For å oppdatere eksisterende innhold, åpne detaljer-menyen og klikk på oppdateringsknappen, eller kjør masseoppdatering ved hjelp av metadatabehandleren.", "MinutesAfter": "minutter etter", "MinutesBefore": "minutter før", "Monday": "Mandag", @@ -763,7 +699,7 @@ "NextUp": "Neste", "No": "Nei", "NoNewDevicesFound": "Ingen nye enheter funnet. For å legge til en ny tuner, lukk denne dialogboksen og skriv inn enhetens informasjon manuelt.", - "NoNextUpItemsMessage": "Ingen funnet. Begynn å se det du har!", + "MessageNoNextUpItems": "Ingen funnet. Begynn å se det du har!", "NoSubtitleSearchResultsFound": "Ingen resultater funnet.", "None": "Ingen", "NumLocationsValue": "{0} mapper", @@ -785,7 +721,7 @@ "OptionAllowVideoPlaybackTranscoding": "Tillat filmavspilling som krever omkoding", "OptionAscending": "Økende", "OptionAutomaticallyGroupSeries": "Slå sammen serier som er spredt over flere mapper automatisk", - "OptionAutomaticallyGroupSeriesHelp": "Hvis aktivert, vil serier som er spredt over flere mapper innenfor dette biblioteket bli slått sammen automatisk til en enkelt serie.", + "OptionAutomaticallyGroupSeriesHelp": "Serier som er spredt over flere mapper innenfor dette biblioteket bli slått sammen automatisk til en enkelt serie.", "OptionBlockBooks": "Bøker", "OptionBlockChannelContent": "Innhold fra Internettkanal", "OptionBlockLiveTvChannels": "Direkte-TV-kanaler", @@ -804,7 +740,7 @@ "OptionDatePlayed": "Dato avspilt", "OptionDescending": "Fallende", "OptionDisableUser": "Deaktiver denne brukeren", - "OptionDisableUserHelp": "Hvis deaktivert vil ikke serveren godta noen tilkoblinger fra denne brukeren. Eksisterende tilkoblinger vil avsluttes umiddelbart.", + "OptionDisableUserHelp": "Serveren vil ikke godta noen tilkoblinger fra denne brukeren. Eksisterende tilkoblinger vil avsluttes umiddelbart.", "OptionDislikes": "Misliker", "OptionDisplayFolderView": "Vis en mappevisning for å vise enkle mediemapper", "OptionDisplayFolderViewHelp": "Vis mapper ved siden av andre mediebibliotek. Dette kan være nyttig hvis du vil ha en enkel mappevisning.", @@ -831,7 +767,6 @@ "OptionExternallyDownloaded": "Ekstern nedlasting", "OptionExtractChapterImage": "Aktiver uthenting av kapittelbilder", "OptionFavorite": "Favoritter", - "OptionFriday": "Fredag", "OptionHasSpecialFeatures": "Spesialfunksjoner", "OptionHasSubtitles": "Undertekster", "OptionHasThemeSong": "Temasang", @@ -840,22 +775,20 @@ "OptionHideUserFromLoginHelp": "Praktisk for private eller skjulte administratorer. Brukeren vil måtte logge inn manuelt ved å skrive inn brukernavn og passord.", "OptionHlsSegmentedSubtitles": "HLS-segmenterte undertekster", "OptionIgnoreTranscodeByteRangeRequests": "Ignorer byte range-forespørsler ved omkoding", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Hvis aktivert vil disse forespørslene bli besvart, men byte-range-hodet vil ignoreres.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Disse forespørslene bli besvart, men byte-range-hodet vil ignoreres.", "OptionImdbRating": "IMDb-vurdering", "OptionLikes": "Liker", "OptionMax": "Maks", "OptionMissingEpisode": "Manglende episoder", - "OptionMonday": "Mandag", "OptionNameSort": "Navn", "OptionNew": "Ny…", "OptionNone": "Ingen", - "OptionOnAppStartup": "Ved applikasjonsoppstart", "OptionOnInterval": "Per intervall", "OptionParentalRating": "Aldersgrense", "OptionPlainStorageFolders": "Vis alle mapper som enkle lagringsmapper", - "OptionPlainStorageFoldersHelp": "Hvis aktivert, vil alle mapper bli representert i DIDL som \"object.container.storageFolder\" istedet for en mer spesifikk type, som \"object.container.person.musicArtist\".", + "OptionPlainStorageFoldersHelp": "Alle mapper representeres i DIDL som \"object.container.storageFolder\" istedet for en mer spesifikk type, som \"object.container.person.musicArtist\".", "OptionPlainVideoItems": "Vis alle videoer som enkle videoelementer", - "OptionPlainVideoItemsHelp": "Hvis aktivert, blir alle videoer representert i DIDL som \"object.item.videoItem\" i stedet for en mer bestemt type, for eksempel \"object.item.videoItem.movie\".", + "OptionPlainVideoItemsHelp": "Alle videoer representerer i DIDL som \"object.item.videoItem\" i stedet for en mer bestemt type, for eksempel \"object.item.videoItem.movie\".", "OptionPlayCount": "Antall avspillinger", "OptionPlayed": "Avspilt", "OptionPremiereDate": "Premieredato", @@ -869,20 +802,15 @@ "OptionRequirePerfectSubtitleMatchHelp": "Å kreve en perfekt match vil filtrere bort undertekster slik at kun de som har blitt testet og verifisert mot nøyaktig samme video-fil gjenstår. Dersom du deaktiverer innstillingen øker sannsynligheten for at undertekster lastes ned, men sjansen øker også for at feilsynkronisert eller feilaktig undertekst lastes ned.", "OptionResumable": "Kan gjenopptas", "OptionRuntime": "Spilletid", - "OptionSaturday": "Lørdag", "OptionSaveMetadataAsHidden": "Lagre metadata og bilder som skjulte filer", - "OptionSaveMetadataAsHiddenHelp": "Endring av denne innstillingen vil gjelde ny metadata som lagres fra nå av. Eksisterende metadata vil bli oppdatert neste gang de lagres av Jellyfin-serveren.", + "OptionSaveMetadataAsHiddenHelp": "Endring av denne innstillingen vil gjelde ny metadata som lagres fra nå av. Eksisterende metadata vil bli oppdatert neste gang de lagres av serveren.", "OptionSpecialEpisode": "Spesialepisoder", "OptionSubstring": "Deltekst", - "OptionSunday": "Søndag", - "OptionThursday": "Torsdag", "OptionTrackName": "Låtnavn", - "OptionTuesday": "Tirsdag", "OptionTvdbRating": "TVDB-vurdering", "OptionUnairedEpisode": "Kommende episoder", "OptionUnplayed": "Ikke sett", "OptionWakeFromSleep": "Våkne fra dvale", - "OptionWednesday": "Onsdag", "OptionWeekdays": "Ukedager", "OptionWeekends": "Helger", "OptionWeekly": "Ukentlig", @@ -895,7 +823,7 @@ "PasswordMatchError": "Passord og passordbekreftelsen må matche.", "PasswordResetComplete": "Passordet har blitt tilbakestilt.", "PasswordResetConfirmation": "Er du sikker på at du vil tilbakestille passordet?", - "PasswordResetHeader": "Tilbakestill passord", + "HeaderResetPassword": "Tilbakestill passord", "PasswordSaved": "Passord lagret.", "People": "Mennesker", "PictureInPicture": "Bilde i bilde", @@ -911,9 +839,9 @@ "PleaseAddAtLeastOneFolder": "Vennligst legg til minst en mappe til dette biblioteket ved å trykke på Legg til-knappen.", "PleaseConfirmPluginInstallation": "Klikk på OK for å bekrefte at du har lest ovenfor og ønsker å fortsette med installasjon av programtillegget.", "PleaseEnterNameOrId": "Vennligst skriv et navn eller en ekstern ID.", - "PleaseRestartServerName": "Vennligst start Jellyfin-serveren på nytt - {0}.", + "PleaseRestartServerName": "Vennligst start Jellyfin på nytt på {0}.", "PleaseSelectTwoItems": "Vennligst velg minst to elementer.", - "PluginInstalledMessage": "Programtillegget ble installert. Jellyfin-serveren må startes på nytt for at endringene skal tre i kraft.", + "MessagePluginInstalled": "Programtillegget ble installert. Serveren må startes på nytt for at endringene skal tre i kraft.", "PreferEmbeddedTitlesOverFileNames": "Foretrekk integrerte titler fremfor filnavn", "PreferEmbeddedTitlesOverFileNamesHelp": "Dette avgjør standard visningstittel når det ikke er noen metadata eller lokale metadata tilgjengelige.", "Premieres": "Premierer", @@ -921,7 +849,6 @@ "ProductionLocations": "Produksjonslokasjoner", "Programs": "Programmer", "Quality": "Kvalitet", - "QueueAllFromHere": "Sett alt herfra i kø", "Rate": "Vurdér", "RecentlyWatched": "Nylig sett", "RecommendationBecauseYouLike": "Fordi du liker {0}", @@ -931,11 +858,11 @@ "Record": "Ta opp", "RecordSeries": "Ta opp serien", "RecordingCancelled": "Opptak er avbrutt.", - "RecordingPathChangeMessage": "Endring av mappen for opptak vil ikke flytte eksisterende opptak fra den gamle plasseringen til den nye. Du må flytte dem manuelt hvis ønskelig.", + "MessageChangeRecordingPath": "Endring av mappen for opptak vil ikke flytte eksisterende opptak fra den gamle plasseringen til den nye. Du må flytte dem manuelt hvis ønskelig.", "RecordingScheduled": "Opptak planlagt.", "Recordings": "Opptak", "Refresh": "Oppdater", - "RefreshDialogHelp": "Metadata blir oppdatert basert på innstillinger og internett-tjenester som er aktivert i dashbordet for Jellyfin-serveren.", + "RefreshDialogHelp": "Metadata blir oppdatert basert på innstillinger og internett-tjenester som er aktivert i dashbordet.", "RefreshMetadata": "Oppdater metadata", "RefreshQueued": "Oppdatering satt i kø.", "ReleaseDate": "Utgivelsesdato", @@ -969,10 +896,10 @@ "SeriesDisplayOrderHelp": "Sorter episoder etter sendt dato, DVD-rekkefølge eller absolutt nummerering.", "SeriesRecordingScheduled": "Serieopptak planlagt.", "SeriesSettings": "Serieinnstillinger", - "ServerNameIsRestarting": "Jellyfin-server - {0} starter om.", - "ServerNameIsShuttingDown": "Jellyfin-server - {0} avsluttes.", - "ServerRestartNeededAfterPluginInstall": "Jellyfin-serveren trenger en omstart etter installasjon av et programtillegg.", - "ServerUpdateNeeded": "Denne Jellyfin-serveren må oppdateres. For å laste ned siste versjon, vennligst besøk {0}", + "ServerNameIsRestarting": "Serveren på {0} starter om.", + "ServerNameIsShuttingDown": "Serveren på {0} avsluttes.", + "ServerRestartNeededAfterPluginInstall": "Jellyfin trenger en omstart etter installasjon av et programtillegg.", + "ServerUpdateNeeded": "Denne serveren må oppdateres. For å laste ned siste versjon, vennligst besøk {0}", "Settings": "Innstillinger", "SettingsSaved": "Innstillinger lagret.", "SettingsWarning": "Endring av disse verdiene kan føre til ustabilitet eller tilkoblingsfeil. Hvis du opplever problemer anbefaler vi at du endrer dem tilbake til standardverdiene.", @@ -994,51 +921,27 @@ "SystemDlnaProfilesHelp": "Systemprofiler er skrivebeskyttet. Endinger på en systemprofil vil bli lagret til en ny tilpasset profil.", "TabAccess": "Tilgang", "TabAdvanced": "Avansert", - "TabAlbumArtists": "Albumartister", - "TabAlbums": "Album", - "TabArtists": "Artister", "TabCatalog": "Katalog", - "TabChannels": "Kanaler", "TabCodecs": "Kodeker", - "TabCollections": "Samlinger", "TabContainers": "Kontainere", "TabDashboard": "Dashbord", - "TabDevices": "Enheter", "TabDirectPlay": "Direkteavspilling", - "TabDisplay": "Skjerm", - "TabEpisodes": "Episoder", - "TabFavorites": "Favoritter", - "TabGenres": "Sjangre", "TabLatest": "Siste", "TabLogs": "Logger", - "TabMovies": "Filmer", "TabMusic": "Musikk", - "TabMusicVideos": "Musikkvideoer", "TabMyPlugins": "Mine programtillegg", "TabNetworks": "Nettverk", "TabNfoSettings": "NFO-innstillinger", "TabNotifications": "Varslinger", "TabOther": "Annet", "TabParentalControl": "Foreldrekontroll", - "TabPassword": "Passord", - "TabPlayback": "Avspilling", - "TabPlaylist": "Spilleliste", - "TabPlaylists": "Spillelister", "TabPlugins": "Programtillegg", "TabProfile": "Profil", "TabProfiles": "Profiler", - "TabRecordings": "Opptak", "TabResponses": "Svar", - "TabResumeSettings": "Fortsettelse", "TabScheduledTasks": "Planlagte oppgaver", - "TabSeries": "Serier", "TabSettings": "Innstillinger", - "TabShows": "Programmer", - "TabSongs": "Sanger", - "TabSuggestions": "Forslag", - "TabTrailers": "Trailere", "TabUpcoming": "Kommende", - "TabUsers": "Brukere", "Tags": "Tagger", "TellUsAboutYourself": "Fortell oss litt om deg selv", "ThisWizardWillGuideYou": "Denne veiviseren vil hjelpe deg gjennom installasjonsprosessen. Velg ønsket språk for å komme i gang.", @@ -1050,7 +953,7 @@ "Tuesday": "Tirsdag", "TvLibraryHelp": "Gå igjennom {0}veiledning for navngivelse av TV-programmer{1}.", "UninstallPluginConfirmation": "Er du sikker på at du ønsker å avinstallere {0}?", - "UninstallPluginHeader": "Avinstaller programtillegg", + "HeaderUninstallPlugin": "Avinstaller programtillegg", "Unrated": "Ikke vurdert", "Up": "Opp", "UserProfilesIntro": "Jellyfin har støtte for brukerprofiler med finjusterbare innstillinger, avspillingsstatus og foreldrekontroll.", @@ -1074,7 +977,6 @@ "ValueTimeLimitMultiHour": "Tidsgrense: {0} timer", "ValueTimeLimitSingleHour": "Tidsgrense: 1 time", "ValueVideoCodec": "Videokodek: {0}", - "VideoRange": "Videoområde", "ViewAlbum": "Vis album", "ViewPlaybackInfo": "Vis avspillingsinformasjon", "Watched": "Sett", @@ -1101,12 +1003,10 @@ "Channels": "Kanaler", "ButtonTrailer": "Trailer", "ButtonStart": "Start", - "ButtonShuffle": "Tilfeldig rekkefølge", "ButtonSend": "Send", "ButtonPause": "Pause", "ButtonInfo": "Informasjon", "ButtonGuide": "Guide", - "ButtonFilter": "Filter", "AirDate": "Sendedato", "Browse": "Bla", "BoxRear": "Eske (bakside)", @@ -1115,7 +1015,6 @@ "Banner": "Banner", "Backdrops": "Bakgrunner", "Backdrop": "Bakgrunn", - "AutoBasedOnLanguageSetting": "Automatisk (basert på språkinstillingene)", "Ascending": "Stigende", "Art": "Omslagsbilde", "AnyLanguage": "Hvilket som helst språk", @@ -1131,7 +1030,7 @@ "General": "Generelt", "ChangingMetadataImageSettingsNewContent": "Endringer gjort i innstillinger for metadata eller omslagsbilder vil kun gjelde nytt innhold i biblioteket ditt. For å endre eksisterende innhold, må du oppdatere dets metadata manuelt.", "DefaultSubtitlesHelp": "Undertekster lastes inn basert på flaggene \"standard\" og \"tvungen\" i videoens integrerte metadata. Språkpreferanser tas høyde for dersom flere valg er tilgjengelig.", - "DirectStreamHelp2": "Direktestrømming av en fil bruker veldig lite ressurser uten tap av videokvalitet.", + "DirectStreamHelp2": "Direktestrømming bruker veldig lite ressurser med minimalt tap av videokvalitet.", "DisplayInMyMedia": "Vis på hjem-skjermen", "DisplayInOtherHomeScreenSections": "Vis i seksjoner på hjem-skjermen, som f.eks. siste spilte media og fortsett å se", "EnableThemeSongsHelp": "Spill av temamusikk i bakgrunnen mens du blar i biblioteket.", @@ -1182,7 +1081,6 @@ "HeaderFetcherSettings": "Henteinnstillinger", "TabServer": "Server", "TabStreaming": "Strømming", - "TabTranscoding": "Omkoding", "TagsValue": "Tagger: {0}", "ThemeSongs": "Temamusikk", "ThemeVideos": "Temavideoer", @@ -1190,15 +1088,11 @@ "LabelDateTimeLocale": "Datoformat:", "LabelType": "Type:", "Large": "Stor", - "MediaInfoSoftware": "Programvare", "DirectStreamHelp1": "Mediet støttes av enheten med tanke på oppløsning og medietype (H.264, AC3, osv), men den støtter ikke filkontaineren (mkv, avi, wmv, osv). Videoen vil ompakkes fortløpende før den sendes til enheten.", - "EnableBackdrops": "Bakgrunner", - "EnableThemeVideos": "Temavideoer", "MusicVideo": "Musikkvideo", "Mute": "Demp lyd", "CopyStreamURL": "Kopier strøm-URL", "DirectStreaming": "Direktestrømming", - "EnableThemeSongs": "Temamusikk", "HeaderMusicQuality": "Musikkvalitet", "Home": "Hjem", "LabelAlbum": "Album:", @@ -1207,8 +1101,7 @@ "LabelLanNetworks": "Lokale nettverk:", "MediaInfoCodecTag": "Kodektagg", "Metadata": "Metadata", - "NoPluginConfigurationMessage": "Dette programtillegget har ingen innstillinger å konfigurere.", - "TabGuide": "Guide", + "MessageNoPluginConfiguration": "Dette programtillegget har ingen innstillinger å konfigurere.", "Unmute": "Skru på lyd", "OptionIsHD": "HD", "ButtonAddImage": "Legg til bilde", @@ -1217,7 +1110,7 @@ "EnableNextVideoInfoOverlayHelp": "Vis informasjon om den neste videoen i spillelisten ved slutten av en video.", "ExtractChapterImagesHelp": "Uthenting av kapittelbilder vil gjøre det mulig for klienter å vise bilder i menyer for å velge kapitel. Denne prosessen kan være treg, ressurskrevende, og kan kreve flere gigabyte med lagringsplass. Prosessen kjører når videoer oppdages, samt som en daglig planlagt hendelse. Tidsplanen kan endres i innstillinger for planlagte hendelser. Det anbefales ikke at denne prosessen kjøres når det er mange aktive brukere innlogget.", "Extras": "Ekstramateriale", - "HeaderKodiMetadataHelp": "For å aktivere eller deaktivere NFO-metadata, gå til bibliotekoppsettet i Jellyfin og finn valgene for lagring av metadata.", + "HeaderKodiMetadataHelp": "For å aktivere eller deaktivere NFO-metadata, endre biblioteket og finn valgene for lagring av metadata.", "OptionArtist": "Artist", "HeaderPhotoAlbums": "Fotoalbum", "HeaderSecondsValue": "{0} sekunder", @@ -1225,9 +1118,7 @@ "LabelAllowedRemoteAddressesMode": "Modus for filter for eksterne IP-adresser:", "LabelDiscNumber": "Platenummer:", "LabelDisplayLanguage": "Visningsspråk:", - "LinksValue": "Linker: {0}", "OptionAuto": "Automatisk", - "OptionAutomatic": "Automatisk", "OptionHomeVideos": "Fotografier", "Photos": "Bilder", "Thumb": "Miniatyrbilde", @@ -1242,7 +1133,6 @@ "LabelAudioCodec": "Lydkodek:", "LabelAudioSampleRate": "Samplingsfrekvens for lyd:", "OptionRegex": "Regulært uttrykk", - "HeaderLiveTV": "Direkte-TV", "HeaderMedia": "Media", "LabelDropImageHere": "Dra og slipp bildet her, eller klikk for å bla igjennom.", "LabelMetadataSavers": "Lagring av metadata:", @@ -1250,11 +1140,9 @@ "LabelSkipForwardLength": "Lengde for fremoverhopp:", "LabelTriggerType": "Utløsertype:", "LanNetworksHelp": "Kommaseparert liste over IP-adresser eller IP/nettverksmaske for nettverk som skal regnes som lokalt nettverk når båndbreddebegrensninger skal håndheves. Hvis satt, vil alle andre IP-adresser bli regnet for å være på eksternt nettverk og vil dermed være underlagt båndbreddebegrensningene for eksterne nettverk. Hvis tomt, vil kun serverens subnettverk bli regnet for å være på det lokale nettverket.", - "LaunchWebAppOnStartup": "Start web-grensesnittet når serveren starter", - "LaunchWebAppOnStartupHelp": "Åpne web-klienten i din standard nettleser når serveren starter opp. Dette vil ikke skje ved omstart av serveren.", "LearnHowYouCanContribute": "Finn ut hvordan du kan bidra.", "SeriesYearToPresent": "{0} - Nå", - "LabelBaseUrlHelp": "Legger til en egendefinert undermappe til serverens nettadresse. For eksempel: http://example.com/<baseurl>", + "LabelBaseUrlHelp": "Legg til en egendefinert undermappe til serverens nettadresse. For eksempel: http://example.com/<baseurl>", "LabelFont": "Skrifttype:", "LabelMatchType": "Matchtype:", "OptionPosterCard": "Plakatkort", @@ -1270,7 +1158,7 @@ "EnableExternalVideoPlayers": "Eksterne videospillere", "EnableExternalVideoPlayersHelp": "En liste over eksterne spillere vil vises når du starter videoavspilling.", "EnableNextVideoInfoOverlay": "Vis informasjon om neste video under avspilling", - "ErrorDeletingItem": "Det oppstod en feil under sletting av elementet fra Jellyfin-serveren. Vennligst sørg for at Jellyfin-serveren har skrivetilgang til mappen og prøv igjen.", + "ErrorDeletingItem": "Det oppstod en feil under sletting av elementet fra serveren. Vennligst sørg for at Jellyfin har skrivetilgang til mappen og prøv igjen.", "ExtraLarge": "Ekstra stor", "FetchingData": "Henter ytterligere data", "Folders": "Mapper", @@ -1291,8 +1179,6 @@ "HeaderFavoriteAlbums": "Favorittalbum", "HeaderFavoriteArtists": "Favorittartister", "HeaderFavoriteSongs": "Favorittsanger", - "HeaderHome": "Hjem", - "HeaderLiveTv": "Direkte-TV", "HeaderNextEpisodePlayingInValue": "Neste episode starter om {0}", "HeaderNextVideoPlayingInValue": "Neste video starter om {0}", "HeaderSeriesStatus": "Seriestatus", @@ -1306,13 +1192,11 @@ "Horizontal": "Horisontal", "HttpsRequiresCert": "For å bruke sikker tilkobling må du legge inn et klarert SSL-sertifikat, for eksempel fra Let's Encrypt. Du må enten legge inn et sertifikat, eller deaktivere sikker tilkobling.", "LabelAlbumArtPN": "Albumomslag PN:", - "LabelAudio": "Lyd", "LabelAuthProvider": "Autentiserings-metode:", "LabelBitrate": "Bithastighet:", "LabelBurnSubtitles": "Brenn inn undertekst:", "LabelCache": "Mellomlagring:", "LabelCustomCertificatePathHelp": "Filbanen til en PKCS#12-fil med et sertifikat og privatnøkkel for å aktivere TLS-støtte på et eget domene.", - "LabelDashboardTheme": "Tema for serveroversikt:", "LabelDefaultScreen": "Standardskjerm:", "LabelDropShadow": "Underskygge:", "LabelDynamicExternalId": "{0} ID:", @@ -1330,12 +1214,9 @@ "LabelServerName": "Servernavn:", "LabelSimultaneousConnectionLimit": "Begrensing på samtidige strømmer:", "LabelSize": "Størrelse:", - "LabelSkin": "Utseende:", - "LabelSoundEffects": "Lydeffekter:", "LabelSpecialSeasonsDisplayName": "Visningsnavn for spesialsesong:", "LabelStatus": "Status:", "LabelSubtitleDownloaders": "Kilder for undertekst:", - "LabelSubtitles": "Undertekster", "LabelTVHomeScreen": "Hjemskjerm for TV-modus:", "LabelTag": "Tagg:", "LabelTextBackgroundColor": "Tekstbagrunnsfarge:", @@ -1371,16 +1252,15 @@ "MusicAlbum": "Musikkalbum", "MusicArtist": "Musikkartist", "Next": "Neste", - "NoSubtitles": "Ingen", "NoSubtitlesHelp": "Undertekster vil ikke lastes inn som standard. De kan fortsatt aktiveres manuelt under avspilling.", "Normal": "Normal", "OnlyForcedSubtitles": "Kun tvungen", "OnlyForcedSubtitlesHelp": "Bare last inn undertekster merket som tvungen.", "OnlyImageFormats": "Bare bildeformater (VOBSUB, PGS, SUB)", - "OptionAllowMediaPlaybackTranscodingHelp": "Begrensning av tilgang til omkoding kan føre til avspillingsfeil i Jellyfin-apper grunnet at medieformater ikke støtes.", + "OptionAllowMediaPlaybackTranscodingHelp": "Begrensning av tilgang til omkoding kan føre til avspillingsfeil hos klienter grunnet at medieformater ikke støttes.", "OptionAllowSyncTranscoding": "Tillat nedlastning og synkronisering av media som krever omkoding", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", - "OptionDownloadImagesInAdvanceHelp": "Som standard vil de fleste bilder kun lastes ned når de blir forespurt av en Jellyfin-app. Aktiver denne innstillingen for å laste ned alle bilder på forhånd når ny media oppdages. Dette kan føre til at skanning av biblioteket tar betydelig lenger tid.", + "OptionDownloadImagesInAdvanceHelp": "Som standard vil de fleste bilder kun lastes ned når de blir forespurt av en klient. Aktiver denne innstillingen for å laste ned alle bilder på forhånd når ny media oppdages. Dette kan føre til at skanning av biblioteket tar betydelig lenger tid.", "OptionDownloadLogoImage": "Logo", "OptionDownloadThumbImage": "Miniatyrbilde", "OptionHasTrailer": "Trailer", @@ -1391,14 +1271,13 @@ "OptionProfileVideo": "Video", "OptionProtocolHls": "HTTP-direktestrømming", "OptionProtocolHttp": "HTTP", - "PasswordResetProviderHelp": "Velg hvilken metode for tilbakestilling av passord som skal benyttes når denne brukeren ber om å tilbakestille passordet", + "PasswordResetProviderHelp": "Velg hvilken metode for tilbakestilling av passord som skal benyttes når denne brukeren ber om å tilbakestille passordet.", "PerfectMatch": "Perfekt match", "PlaybackData": "Avspillingsdata", "PlayCount": "Antall avspillinger", "Playlists": "Spillelister", "Previous": "Forrige", "Primary": "Primær", - "RunAtStartup": "Kjør ved oppstart", "SaveSubtitlesIntoMediaFolders": "Lagre undertekster i mediemapper", "SaveSubtitlesIntoMediaFoldersHelp": "Lagring av undertekster ved siden av videofilene vil gjøre det lettere å behandle dem.", "Screenshot": "Skjermbilde", @@ -1417,9 +1296,6 @@ "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Disse innstillingene gjelder også alle Chromecast-avspillinger startet av denne enheten.", "SubtitleOffset": "Forskyvet underteksting", "TV": "TV", - "TabInfo": "Informasjon", - "TabLiveTV": "Direkte-TV", - "TabMetadata": "Metadata", "TabNetworking": "Nettverk", "Trailers": "Trailere", "Transcoding": "Omkoding", @@ -1444,7 +1320,6 @@ "SelectAdminUsername": "Vennligst velg et brukernavn for administrator-kontoen.", "HeaderNavigation": "Navigering", "MessageConfirmAppExit": "Vil du avslutte?", - "CopyStreamURLError": "Det var en feil under kopiering av URL'en.", "LabelVideoResolution": "Oppløsning på video:", "LabelPlayerDimensions": "Dimensjoner på avspiller:", "LabelCorruptedFrames": "Korrupte bilder:", @@ -1468,9 +1343,8 @@ "HeaderFavoritePlaylists": "Favorittspillelister", "DeinterlaceMethodHelp": "Velg deinterlacing metoden som skal bli brukt når man transkoder interlaced innhold.", "ButtonTogglePlaylist": "Spilleliste", - "ButtonToggleContextMenu": "Mer", - "EnableBlurhashHelp": "Bilder som fortsatt lastes inn vil vises med en tåkete plassholder", - "EnableBlurhash": "Aktiver tåkete plassholdere for bilder", + "EnableBlurHashHelp": "Bilder som fortsatt lastes inn vil vises med en tåkete plassholder", + "EnableBlurHash": "Aktiver tåkete plassholdere for bilder", "UnsupportedPlayback": "Jellyfin kan ikke dekryptere innhold beskyttet med DRM, men alt innhold vil bli forsøkt uansett, inkludert beskyttede titler. Noen filer kan fremstå helt svarte grunnet kryptering eller andre ikke støttede funksjoner, som interaktive titler.", "OnApplicationStartup": "Ved oppstart av applikasjonen", "EveryXHours": "Hver {0}. time", @@ -1482,12 +1356,11 @@ "LastSeen": "Sist sett {0}", "PersonRole": "som {0}", "ListPaging": "{0}-{1} av {2}", - "WriteAccessRequired": "Jellyfin Server krever skrivetilgang til denne mappen. Vennligst påse at skrivetilgang er gitt og prøv igjen.", + "WriteAccessRequired": "Jellyfin krever skrivetilgang til denne mappen. Vennligst påse at skrivetilgang er gitt og prøv igjen.", "PathNotFound": "Banen ble ikke funnet. Påse at banen er gyldig og prøv igjen.", "YadifBob": "YADIF Bob", "Yadif": "YADIF", "Track": "Spor", - "TabDVR": "Opptak", "SyncPlayAccessHelp": "Velg tilgangsnivået denne brukeren skal ha til SyncPlay-funksjonen. SyncPlay muliggjør synkronisert avspilling med andre enheter.", "Filter": "Filter", "New": "Ny", @@ -1495,11 +1368,9 @@ "ShowLess": "Vis mindre", "Season": "Sesong", "SaveChanges": "Lagre endringer", - "ReleaseGroup": "Utgivelsesgruppe", "PreferEmbeddedEpisodeInfosOverFileNames": "Foretrekk innebygd episodeinformasjon framfor filnavn", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Dette bruker episodeinformasjonen fra innebygd metadata hvis tilgjengelig.", "Person": "Person", - "OtherArtist": "Annen artist", "Movie": "Film", "MessageSyncPlayErrorMedia": "Kunne ikke aktivere SyncPlay! Mediefeil.", "MessageSyncPlayErrorMissingSession": "Kunne ikke aktivere SyncPlay! Mangler sesjon.", @@ -1511,12 +1382,11 @@ "MessageSyncPlayGroupDoesNotExist": "Kunne ikke bli med i gruppen fordi den ikke finnes.", "MessageSyncPlayPlaybackPermissionRequired": "Tillatelse for avspilling kreves.", "MessageSyncPlayNoGroupsAvailable": "Ingen grupper tilgjengelige. Begynn å spill noe først.", - "MessageSyncPlayGroupWait": "{0} bufrer...", + "MessageSyncPlayGroupWait": "{0} bufrer…", "MessageSyncPlayUserLeft": "{0} har forlatt gruppen.", "MessageSyncPlayUserJoined": "{0} har blitt med i gruppen.", "MessageSyncPlayDisabled": "SyncPlay deaktivert.", "MessageSyncPlayEnabled": "SyncPlay aktivert.", - "MessageUnauthorizedUser": "Du har ikke autorisert tilgang til serveren akkurat nå. Vennligst kontakt serveradministratoren din for mer informasjon.", "LabelSyncPlayAccess": "SyncPlay-tilgang", "LabelSyncPlayAccessNone": "Deaktivert for denne brukeren", "LabelSyncPlayAccessJoinGroups": "Tillat brukeren å bli med i grupper", @@ -1531,10 +1401,9 @@ "LabelSyncPlayTimeOffset": "Tidsforskyvning mot serveren:", "LabelRequireHttpsHelp": "Hvis valgt, vil serveren automatisk omdirigere alle HTTP-forespørsler til HTTPS. Dette har ingen effekt dersom serveren ikke lytter etter HTTPS.", "LabelRequireHttps": "Krev HTTPS", - "LabelNightly": "Nattlig", "LabelStable": "Stabil", "LabelChromecastVersion": "Chromecast-versjon", - "LabelEnableHttpsHelp": "Aktiverer at serveren skal lytte på den valgte HTTPS-porten. Et gyldig sertifikat må også være konfigurert for at dette skal tre i kraft.", + "LabelEnableHttpsHelp": "Lytt på den valgte HTTPS-porten. Et gyldig sertifikat må også være angitt for at dette skal tre i kraft.", "LabelEnableHttps": "Aktiver HTTPS", "HeaderSyncPlayEnabled": "SyncPlay aktivert", "HeaderSyncPlaySelectGroup": "Bli med i en gruppe", @@ -1564,5 +1433,13 @@ "LabelRepositoryNameHelp": "Et egendefinert navn for å skille denne kilden fra andre som er lagt til på serveren din.", "ClearQueue": "Tøm køen", "ViewAlbumArtist": "Vis albumartist", - "StopPlayback": "Stopp avspilling" + "StopPlayback": "Stopp avspilling", + "NextTrack": "Hopp til neste", + "LabelUnstable": "Ustabil", + "Preview": "Forhåndsvis", + "SubtitleVerticalPositionHelp": "Linjenummer hvor teksten dukker opp. Positive tall indikerer ovenfra og ned. Negative tall indikerer nedenfra og opp.", + "LabelSubtitleVerticalPosition": "Vertikal posisjon:", + "PreviousTrack": "Hopp til forrige", + "MessageGetInstalledPluginsError": "En feil oppstod under henting av listen over installerte tillegg.", + "MessagePluginInstallError": "En feil oppstod under installasjon av tillegget." } diff --git a/src/strings/nl.json b/src/strings/nl.json index e97578db4b..6258f7c216 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -3,7 +3,6 @@ "AccessRestrictedTryAgainLater": "Toegang is momenteel beperkt, probeer later opnieuw.", "Actor": "Acteur", "Add": "Toevoegen", - "AddItemToCollectionHelp": "Voeg items aan uw collecties toe door te zoeken en gebruik rechts klikken met de muis of tik op menu's om ze toe te voegen aan een verzameling.", "AddToCollection": "Toevoegen aan Collectie", "AddToPlayQueue": "Toevoegen aan wachtrij", "AddToPlaylist": "Toevoegen aan afspeellijst", @@ -23,7 +22,7 @@ "AllowMediaConversionHelp": "Toegang verlenen of weigeren tot de mediaconversie functie.", "AllowOnTheFlySubtitleExtraction": "Directe ondertitel extractie toestaan", "AllowOnTheFlySubtitleExtractionHelp": "Ingebakken ondertitels kunnen uit de video's gehaald worden en als tekst bezorgd worden aan de clients om transcodering te helpen voorkomen. Op sommige systemen kan dit een lange tijd duren en dit er voor zorgen dat het afspelen van video stopt tijdens de extractie. Schakel dit uit om ingebakken ondertiteling in de video te laten branden met transcodering als deze niet standaard ondersteund worden door het afspeelapparaat.", - "AllowRemoteAccess": "Externe verbindingen met deze Jellyfin Server toestaan.", + "AllowRemoteAccess": "Externe verbindingen met deze server toestaan.", "AllowRemoteAccessHelp": "Indien niet aangevinkt worden alle externe verbindingen geblokkeerd.", "AllowedRemoteAddressesHelp": "Komma-gescheiden lijst van IP-adressen of IP/netmask adressen voor netwerken die op afstand verbinding mogen maken. Indien blanco, worden alle externe adressen toegestaan.", "AlwaysPlaySubtitles": "Altijd afspelen", @@ -35,10 +34,8 @@ "AsManyAsPossible": "Zo veel als mogelijk", "Ascending": "Oplopend", "AspectRatio": "Beeldverhouding", - "AttributeNew": "Nieuw", "Audio": "Geluid", "Auto": "Automatisch", - "AutoBasedOnLanguageSetting": "Automatisch (gebaseerd op taal instelling)", "Backdrop": "Achtergrond", "Backdrops": "Achtergronden", "BirthDateValue": "Geboren: {0}", @@ -48,77 +45,52 @@ "Books": "Boeken", "BoxRear": "Hoes (achterkant)", "Browse": "Bladeren", - "BrowsePluginCatalogMessage": "Bekijk de Plugin catalogus voor beschikbare Plug-ins.", + "MessageBrowsePluginCatalog": "Bekijk de Plugin catalogus voor beschikbare Plug-ins.", "BurnSubtitlesHelp": "Bepaalt of de server ondertitels moet branden bij het transcoderen van video's. Als u dit vermijd, worden de prestaties aanzienlijk verbeterd. Selecteer Auto om op afbeeldingen gebaseerde formaten (VOBSUB, PGS, SUB/IDX etc.) en bepaalde ASS/SSA ondertitels te branden.", - "ButtonAdd": "Toevoegen", "ButtonAddMediaLibrary": "Voeg Media Bibliotheek toe", "ButtonAddScheduledTaskTrigger": "Trigger Toevoegen", "ButtonAddServer": "Voeg server toe", "ButtonAddUser": "Gebruiker toevoegen", - "ButtonArrowDown": "Omlaag", "ButtonArrowLeft": "Links", "ButtonArrowRight": "Rechts", - "ButtonArrowUp": "Omhoog", "ButtonAudioTracks": "Audio track", "ButtonBack": "Terug", "ButtonCancel": "Annuleren", "ButtonChangeServer": "Wijzig server", - "ButtonConnect": "Verbind", - "ButtonDelete": "Verwijderen", - "ButtonDeleteImage": "Verwijder afbeelding", - "ButtonDown": "Omlaag", - "ButtonDownload": "Downloaden", - "ButtonEdit": "Bewerken", - "ButtonEditImages": "Bewerk afbeeldingen", "ButtonEditOtherUserPreferences": "Wijzig het profiel, afbeelding en persoonlijke voorkeuren van deze gebruiker.", "ButtonForgotPassword": "Wachtwoord Vergeten", "ButtonFullscreen": "Volledig scherm", "ButtonGotIt": "Begrepen", "ButtonGuide": "Gids", - "ButtonHelp": "Hulp", - "ButtonHome": "Start", - "ButtonLearnMore": "Meer informatie", "ButtonLibraryAccess": "Bibliotheek toegang", "ButtonManualLogin": "Handmatige Aanmelding", "ButtonMore": "Meer", "ButtonNetwork": "Netwerk", - "ButtonNew": "Nieuw", "ButtonNextTrack": "Volgende track", - "ButtonOff": "Uit", "ButtonOpen": "Openen", "ButtonParentalControl": "Ouderlijk toezicht", "ButtonPause": "Pauze", - "ButtonPlay": "Afspelen", "ButtonPreviousTrack": "Vorige track", "ButtonProfile": "Profiel", "ButtonQuickStartGuide": "Snelstart gids", - "ButtonRefresh": "Vernieuwen", "ButtonRefreshGuideData": "Gidsgegevens Vernieuwen", "ButtonRemove": "Verwijderen", "ButtonRename": "Naam wijzigen", - "ButtonRepeat": "Herhaling", "ButtonResetEasyPassword": "Reset eenvoudige pincode", "ButtonResetPassword": "Wachtwoord resetten", "ButtonRestart": "Herstart", "ButtonResume": "Hervatten", "ButtonRevoke": "Herroepen", - "ButtonSave": "Opslaan", "ButtonScanAllLibraries": "Scan alle bibliotheken", - "ButtonSearch": "Zoeken", "ButtonSelectDirectory": "Selecteer map", "ButtonSelectServer": "Server Selecteren", "ButtonSelectView": "Selecteer weergave", "ButtonSend": "Stuur", "ButtonSettings": "Instellingen", - "ButtonShuffle": "Willekeurig", "ButtonShutdown": "Afsluiten", "ButtonSignIn": "Aanmelden", "ButtonSignOut": "Afmelden", - "ButtonSort": "Sorteren", "ButtonSubmit": "Uitvoeren", - "ButtonSubtitles": "Ondertiteling", - "ButtonUp": "Omhoog", - "ButtonViewWebsite": "Bekijk website", "CancelRecording": "Opname annuleren", "CancelSeries": "Annuleer series", "Categories": "Categorieën", @@ -149,7 +121,7 @@ "DatePlayed": "Datum afgespeeld", "DeathDateValue": "Overleden: {0}", "Default": "Standaard", - "DefaultErrorMessage": "Er is een fout opgetreden. Probeer later opnieuw.", + "ErrorDefault": "Er is een fout opgetreden. Probeer later opnieuw.", "DefaultMetadataLangaugeDescription": "Dit zijn uw standaardinstellingen en kunnen per bibliotheek worden aangepast.", "DefaultSubtitlesHelp": "Ondertitels worden geladen op basis van de standaard en geforceerd markeringen in de ingesloten metadata. Indien meerdere opties aanwezig zijn zal rekening worden gehouden met de taalvoorkeuren.", "Delete": "Verwijderen", @@ -164,8 +136,8 @@ "DetectingDevices": "Apparaten detecteren", "DeviceAccessHelp": "Dit geldt alleen voor apparaten die uniek geïdentificeerd kunnen worden en voorkomen niet toegang via een webbrowser. Filteren van apparaat toegang voor gebruikers voorkomt dat zij nieuwe apparaten gebruiken totdat deze hier zijn goedgekeurd.", "DirectPlaying": "Direct afspelen", - "DirectStreamHelp1": "De resolutie en codec (bijv. H.264, AC3, etc.) wordt ondersteund door het apparaat, maar het medium is in een niet-ondersteunde bestandscontainer (bijv. mkv, avi, wmv). De video zal tijdens het afspelen opnieuw verpakt worden naar een andere bestandscontainer.", - "DirectStreamHelp2": "Direct streamen van een bestand gebruikt weinig processor kracht zonder verlies van beeldkwaliteit.", + "DirectStreamHelp1": "De resolutie en codec (H.264, AC3, etc.) wordt ondersteund door het apparaat, maar het medium is in een niet-ondersteunde bestandscontainer (mkv, avi, wmv, etc.). De video zal tijdens het afspelen opnieuw verpakt worden naar een andere bestandscontainer.", + "DirectStreamHelp2": "Direct streamen van een bestand gebruikt weinig processorkracht zonder verlies van beeldkwaliteit.", "DirectStreaming": "Direct streamen", "Director": "Regiseur", "Directors": "Regisseurs", @@ -189,7 +161,6 @@ "EditImages": "Bewerk afbeeldingen", "EditMetadata": "Metadata wijzigen", "EditSubtitles": "Bewerk ondertiteling", - "EnableBackdrops": "Achtergronden", "EnableBackdropsHelp": "Laat achtergrondafbeeldingen zien tijdens het bladeren door de bibliotheek.", "EnableCinemaMode": "Cinema modus", "EnableColorCodedBackgrounds": "Kleurgecodeerde achtergronden", @@ -203,20 +174,18 @@ "EnablePhotosHelp": "Afbeeldingen worden herkend en weergegeven naast andere mediabestanden.", "EnableStreamLooping": "Livestreams automatisch herhalen", "EnableStreamLoopingHelp": "Schakel dit in als de livestreams slechts enkele seconden aan gegevens bevatten en continu moeten worden aangevraagd. Schakel dit niet in indien het niet nodig is.", - "EnableThemeSongs": "Titelmuziek", "EnableThemeSongsHelp": "Speel titelmuziek af tijdens het bladeren door de bibliotheek.", - "EnableThemeVideos": "Titelfilms", "EnableThemeVideosHelp": "Speel titelfilms af op de achtergrond tijdens het bladeren door de bibliotheek.", "Ended": "Gestopt", "EndsAtValue": "Eindigt om {0}", "Episodes": "Afleveringen", "ErrorAddingListingsToSchedulesDirect": "Er ging iets mis bij het toevoegen van de lineup aan uw Schedules Direct account. Schedules Direct staat maar een beperkt aantal lineups per account toe. Het kan nodig zijn dat u zich aan moet melden op de Schedules Direct website en andere lineups moet verwijderen voordat u verder kunt.", - "ErrorAddingMediaPathToVirtualFolder": "Er ging iets mis bij het toevoegen van het media pad. Controleer of het pad klopt en of het Jellyfin server process toegang heeft tot het pad.", + "ErrorAddingMediaPathToVirtualFolder": "Er ging iets mis bij het toevoegen van het media pad. Controleer of het pad klopt en of Jellyfin toegang heeft tot de locatie.", "ErrorAddingTunerDevice": "Er was een fout bij het toevoegen van de tuner. Controleer of deze toegankelijk is en probeer het opnieuw.", "ErrorAddingXmlTvFile": "Er is een fout opgetreden met de toegang tot XMLTV bestand. Zorg ervoor dat het bestand bestaat en probeer het opnieuw.", - "ErrorDeletingItem": "Er was een probleem bij het verwijderen van het item in Jellyfin Server. Controleer dat Jellyfin Server schrijfrechten op de map heeft en probeer het opnieuw.", + "ErrorDeletingItem": "Er was een probleem bij het verwijderen van het item in de server. Controleer of Jellyfin schrijfrechten op de map heeft en probeer het opnieuw.", "ErrorGettingTvLineups": "Er was een fout bij het downloaden van de TV lineup. Controleer of uw gegevens correct zijn en probeer het opnieuw.", - "ErrorMessageStartHourGreaterThanEnd": "Eind tijd moet na de start tijd liggen.", + "ErrorStartHourGreaterThanEnd": "Eind tijd moet na de start tijd liggen.", "ErrorPleaseSelectLineup": "Selecteer een lineup en probeer het opnieuw. Als er geen lineups beschibaar zijn, controleer dan of uw gebruikersnaam, wachtwoord en postcode correct zijn.", "ErrorSavingTvProvider": "Er was een fout bij het opslaan van de TV aanbieder. Controleer of deze toegankelijk is en probeer het opnieuw.", "EveryNDays": "Elke {0} dagen", @@ -259,11 +228,9 @@ "HeaderActiveDevices": "Actieve apparaten", "HeaderActiveRecordings": "Actieve Opnames", "HeaderActivity": "Activiteit", - "HeaderAddScheduledTaskTrigger": "Trigger Toevoegen", "HeaderAddToCollection": "Toevoegen aan Collectie", "HeaderAddToPlaylist": "Toevoegen aan Afspeellijst", "HeaderAddUpdateImage": "Afbeelding Toevoegen/Bijwerken", - "HeaderAddUser": "Gebruiker Toevoegen", "HeaderAdditionalParts": "Extra onderdelen", "HeaderAdmin": "Beheerder", "HeaderAlbumArtists": "Albumartiesten", @@ -271,19 +238,16 @@ "HeaderAllowMediaDeletionFrom": "Wissen van media toestaan van", "HeaderApiKey": "API Sleutel", "HeaderApiKeys": "API Sleutels", - "HeaderApiKeysHelp": "Externe applicaties zijn verplicht om een API sleutel te hebben om te communiceren met Jellyfin Server. Sleutels worden uitgegeven door in te loggen met een Jellyfin account, of door het handmatig verlenen van een sleutel voor de toepassing.", + "HeaderApiKeysHelp": "Externe applicaties zijn verplicht om een API sleutel te hebben om te communiceren met de server. Sleutels kunnen verkregen worden door in te loggen met een Jellyfin account, of door er een handmatig te verlenen.", "HeaderApp": "Applicatie", "HeaderAppearsOn": "Verschijnt op", "HeaderAudioBooks": "Luisterboeken", "HeaderAudioSettings": "Audio Instellingen", - "HeaderAutomaticUpdates": "Automatische updates", "HeaderBlockItemsWithNoRating": "Blokkeer items met geen of niet herkende beoordelingsinformatie:", - "HeaderBooks": "Boeken", "HeaderBranding": "Huisstijl", "HeaderCancelRecording": "Opname Annuleren", "HeaderCancelSeries": "Annuleren Series", "HeaderChannelAccess": "Kanaal toegang", - "HeaderChannels": "Kanalen", "HeaderChapterImages": "Hoofdstukafbeeldingen", "HeaderCodecProfile": "Codec Profiel", "HeaderCodecProfileHelp": "Codec profielen geven de beperkingen van een apparaat bij het afspelen van bepaalde codecs. Als een beperking geldt dan zal de media getranscodeerd worden, zelfs indien de codec is geconfigureerd voor direct afspelen.", @@ -311,21 +275,17 @@ "HeaderDevices": "Apparaten", "HeaderDirectPlayProfile": "Direct Afspelen Profiel", "HeaderDirectPlayProfileHelp": "Voeg direct afspelen profielen toe om aan te geven welke formaten het apparaat standaard aankan.", - "HeaderDisplay": "Weergave", "HeaderDownloadSync": "Download & Synchronisatie", "HeaderEasyPinCode": "Eenvoudige Pincode", "HeaderEditImages": "Afbeeldingen bewerken", "HeaderEnabledFields": "Schakel velden in", "HeaderEnabledFieldsHelp": "Verwijder een vinkje om het veld te vergrendelen en voorkom dat gegevens gewijzigd kunnen worden.", - "HeaderEpisodes": "Afleveringen", "HeaderError": "Fout", "HeaderExternalIds": "Externe ID's:", "HeaderFeatureAccess": "Functie toegang", - "HeaderFeatures": "Toevoegingen", "HeaderFetchImages": "Afbeeldingen ophalen:", "HeaderFetcherSettings": "Fetcher-instellingen", "HeaderForKids": "Voor Kinderen", - "HeaderForgotPassword": "Wachtwoord vergeten", "HeaderFrequentlyPlayed": "Vaak afgespeeld", "HeaderGuideProviders": "TV Gids data aanbieders", "HeaderIdentification": "Identificatie", @@ -337,7 +297,7 @@ "HeaderInstall": "Installeer", "HeaderKeepRecording": "Bewaar opname", "HeaderKeepSeries": "Series behouden", - "HeaderKodiMetadataHelp": "Om NFO-metadata in of uit te schakelen, gaat u naar de Jellyfin bibliotheekinstellingen en vervolgens naar de metadata-downloaders sectie.", + "HeaderKodiMetadataHelp": "Om NFO-metadata in of uit te schakelen, bewerk een bibliotheek en zoek in de metadata-downloaders sectie.", "HeaderLatestEpisodes": "Nieuwste Afleveringen", "HeaderLatestMedia": "Nieuwste Media", "HeaderLatestMovies": "Nieuwste Films", @@ -351,10 +311,8 @@ "HeaderLiveTvTunerSetup": "Live TV Tuner Instellingen", "HeaderLoginFailure": "Aanmeld fout", "HeaderMediaFolders": "Media Mappen", - "HeaderMediaInfo": "Media informatie", "HeaderMetadataSettings": "Metagegevens instellingen", "HeaderMoreLikeThis": "Meer als dit", - "HeaderMovies": "Films", "HeaderMusicQuality": "Muziek Kwaliteit", "HeaderMusicVideos": "Music Video's", "HeaderMyDevice": "Mijn Apparaat", @@ -363,7 +321,6 @@ "HeaderNewApiKey": "Nieuwe API sleutel", "HeaderNewDevices": "Nieuwe Apparaten", "HeaderNextEpisodePlayingInValue": "Volgende Aflevering over {0}", - "HeaderNextUp": "Volgende", "HeaderNextVideoPlayingInValue": "Volgende Afgespeeld over {0}", "HeaderOnNow": "Aan het spelen", "HeaderOtherItems": "Overige Items", @@ -371,7 +328,6 @@ "HeaderPassword": "Wachtwoord", "HeaderPasswordReset": "Wachtwoord resetten", "HeaderPaths": "Paden", - "HeaderPeople": "Personen", "HeaderPhotoAlbums": "Foto-albums", "HeaderPinCodeReset": "Reset Pincode", "HeaderPlayAll": "Alles afspelen", @@ -383,7 +339,7 @@ "HeaderPreferredMetadataLanguage": "Gewenste metadata taal", "HeaderProfile": "Profiel", "HeaderProfileInformation": "Profiel Informatie", - "HeaderProfileServerSettingsHelp": "Deze waarden bepalen hoe Jellyfin Server zich zal presenteren aan het apparaat.", + "HeaderProfileServerSettingsHelp": "Deze waarden bepalen hoe de server zich zal presenteren aan het apparaat.", "HeaderRecentlyPlayed": "Recent afgespeeld", "HeaderRecordingOptions": "Opname instellingen", "HeaderRecordingPostProcessing": "Opname nabewerking", @@ -396,26 +352,23 @@ "HeaderRevisionHistory": "Versie geschiedenis", "HeaderRunningTasks": "Actieve taken", "HeaderScenes": "Hoofdstukken", - "HeaderSchedule": "Schema", "HeaderSeasons": "Seizoenen", "HeaderSecondsValue": "{0} Seconden", "HeaderSelectCertificatePath": "Selecteer Certificaat Pad", "HeaderSelectMetadataPath": "Selecteer Metadata Pad", - "HeaderSelectMetadataPathHelp": "Blader of voer het pad in dat u wilt gebruiken om metadata in op te slaan. De map moet beschrijfbaar zijn.", + "HeaderSelectMetadataPathHelp": "Blader of voer het pad in dat u wilt gebruiken om metadata in op te slaan. De map moet schrijfbaar zijn.", "HeaderSelectPath": "Selecteer Pad", "HeaderSelectServer": "Selecteer server", "HeaderSelectServerCachePath": "Selecteer Server Cache Pad", "HeaderSelectServerCachePathHelp": "Bladeren of voer het pad in om te gebruiken voor server cache-bestanden. De map moet beschrijfbaar zijn.", "HeaderSelectTranscodingPath": "Selecteer Tijdelijke Transcodeer Pad", - "HeaderSelectTranscodingPathHelp": "Bladeren of voer het pad in om te gebruiken voor het transcoderen van tijdelijke bestanden. De map moet beschrijfbaar zijn.", + "HeaderSelectTranscodingPathHelp": "Blader of voer het pad in om te gebruiken voor het transcoderen van tijdelijke bestanden. De map moet schrijfbaar zijn.", "HeaderSendMessage": "Stuur bericht", - "HeaderSeries": "Series", "HeaderSeriesOptions": "Series Opties", "HeaderSeriesStatus": "Seriestatus", "HeaderServerSettings": "Server Instellingen", "HeaderSettings": "Instellingen", "HeaderSetupLibrary": "Stel uw mediabibliotheken in", - "HeaderShutdown": "Afsluiten", "HeaderSortBy": "Sorteren op", "HeaderSortOrder": "Sorteer volgorde", "HeaderSpecialEpisodeInfo": "Speciale afleveringsinformatie", @@ -428,7 +381,6 @@ "HeaderSubtitleProfiles": "Ondertitelingsprofielen", "HeaderSubtitleProfilesHelp": "Ondertitelingsprofielen beschrijven de ondertitelings formaten ondersteund door het apparaat.", "HeaderSystemDlnaProfiles": "Systeem Profielen", - "HeaderTags": "Labels", "HeaderTaskTriggers": "Taak Triggers", "HeaderThisUserIsCurrentlyDisabled": "Deze gebruiker is momenteel uitgesloten", "HeaderTranscodingProfile": "Direct Afspelen Profiel", @@ -448,7 +400,6 @@ "HeaderXmlDocumentAttributes": "Xml Document Attributen", "HeaderXmlSettings": "Xml Instellingen", "HeaderYears": "Jaren", - "HeadersFolders": "Mappen", "Help": "Hulp", "Hide": "Verbergen", "HideWatchedContentFromLatestMedia": "Verberg gekeken inhoud uit nieuwste media", @@ -457,8 +408,8 @@ "HttpsRequiresCert": "Om beveiligde verbindingen in te schakelen, is een vertrouwd SSL-certificaat vereist (zoals Let's Encrypt). Geef een certificaat op of schakel beveiligde verbindingen uit.", "Identify": "Identificeer", "Images": "Afbeeldingen", - "ImportFavoriteChannelsHelp": "Bij inschakelen zullen alleen kanalen geïmporteerd worden die op de tuner als favoriet aangemerkt zijn.", - "ImportMissingEpisodesHelp": "Indien ingeschakeld, wordt informatie over ontbrekende afleveringen in uw Jellyfin de database geïmporteerd en weergegeven in de seizoenen en series. Dit kan aanzienlijk langere bibliotheekscans veroorzaken.", + "ImportFavoriteChannelsHelp": "Alleen kanalen die als favoriet aangemerkt zijn op de tuner zullen geïmporteerd worden.", + "ImportMissingEpisodesHelp": "Informatie over ontbrekende afleveringen zal in uw database worden geïmporteerd en weergegeven in seizoenen en series. Dit kan aanzienlijk langere bibliotheekscans veroorzaken.", "InstallingPackage": "Installeren van {0} (versie {1})", "Kids": "Kinderen", "Label3DFormat": "3D formaat:", @@ -478,23 +429,20 @@ "LabelAlbumArtMaxWidthHelp": "Max. resolutie van albumhoezen weergegeven via upnp:albumArtURI.", "LabelAlbumArtPN": "Albumhoes PN:", "LabelAlbumArtists": "Album artiesten:", - "LabelAll": "Alles", "LabelAllowHWTranscoding": "Hardware transcoding toestaan", - "LabelAllowServerAutoRestart": "Automatisch herstarten van de server toestaan om updates toe te passen", - "LabelAllowServerAutoRestartHelp": "De server zal alleen opnieuw opstarten tijdens inactieve perioden, wanneer er geen gebruikers actief zijn.", "LabelAllowedRemoteAddresses": "Externe IP-adressen filter:", "LabelAllowedRemoteAddressesMode": "Externe IP-adressen filter modus:", "LabelAppName": "Applicatie Naam", "LabelAppNameExample": "Voorbeeld: Sickbeard, Sonarr", "LabelArtists": "Artiest:", - "LabelArtistsHelp": "Scheidt meerdere met een ;", + "LabelArtistsHelp": "Scheidt artiesten met een ;", "LabelAudioLanguagePreference": "Voorkeurs audiotaal:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Vernieuw metagegevens automatisch van het internet:", "LabelBindToLocalNetworkAddress": "Binden aan het lokale netwerk adres:", - "LabelBindToLocalNetworkAddressHelp": "Optioneel. Overrule het lokale IP-adres om aan de http-server te binden. Indien leeg gelaten, zal de server binden aan alle beschikbare adressen. Het veranderen van deze waarde vereist herstarten van Jellyfin Server.", + "LabelBindToLocalNetworkAddressHelp": "Overschrijf het lokale IP-adres voor de HTTP server. Indien leeg gelaten, zal de server binden aan alle beschikbare adressen. Het veranderen van deze waarde vereist een herstart.", "LabelBirthDate": "Geboortedatum:", "LabelBirthYear": "Geboorte jaar:", - "LabelBlastMessageInterval": "Alive bericht interval (seconden)", + "LabelBlastMessageInterval": "Alive bericht interval", "LabelBlastMessageIntervalHelp": "Bepaalt de duur in seconden tussen Blast Alive berichten.", "LabelBlockContentWithTags": "Blokkeer items met volgende tags:", "LabelBurnSubtitles": "Ondertitels inbranden:", @@ -514,13 +462,11 @@ "LabelCustomCertificatePathHelp": "Pad naar een PKCS #12 bestand met een certificaat en privé-sleutel om TLS ondersteuning op een aangepast domein in te schakelen.", "LabelCustomCss": "Aangepaste CSS:", "LabelCustomCssHelp": "Uw eigen aangepaste stijl voor de web-interface toepassen.", - "LabelCustomDeviceDisplayName": "Weergave naam:", "LabelCustomDeviceDisplayNameHelp": "Geef een eigen weergave naam op of laat deze leeg om de naam te gebruiken die het apparaat opgeeft.", "LabelCustomRating": "Aangepaste classificatie:", - "LabelDashboardTheme": "Server dashboard thema:", "LabelDateAdded": "Datum toegevoegd:", "LabelDateAddedBehavior": "Datum toegevoegd gedrag voor nieuwe content:", - "LabelDateAddedBehaviorHelp": "Als metadata gegevens aanwezig zijn hebben deze voorrang op deze opties.", + "LabelDateAddedBehaviorHelp": "Als metadata gegevens aanwezig is krijgt deze voorrang op deze opties.", "LabelDateTimeLocale": "Datum en tijd regio:", "LabelDay": "Dag:", "LabelDeathDate": "Overlijdens datum:", @@ -531,7 +477,6 @@ "LabelDiscNumber": "Disk nummer:", "LabelDisplayLanguage": "Schermtaal:", "LabelDisplayLanguageHelp": "Vertaling van Jellyfin is een voortdurend project.", - "LabelDisplayMissingEpisodesWithinSeasons": "Toon ontbrekende afleveringen binnen een seizoen", "LabelDisplayMode": "Weergave mode:", "LabelDisplayName": "Weergave naam:", "LabelDisplayOrder": "Weergave volgorde:", @@ -548,12 +493,12 @@ "LabelEnableAutomaticPortMapHelp": "Publieke poort automatisch doorsturen naar een lokale poort via UPnP. Dit werkt niet op alle routers en netwerk configuraties. De wijzigingen worden pas actief na een herstart van de server.", "LabelEnableBlastAliveMessages": "Alive berichten zenden", "LabelEnableBlastAliveMessagesHelp": "Zet dit aan als de server niet betrouwbaar door andere UPnP-apparaten op uw netwerk wordt gedetecteerd.", - "LabelEnableDlnaClientDiscoveryInterval": "Interval voor het zoeken naar clients (seconden)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Bepaalt de duur in seconden tussen SSDP zoekopdrachten uitgevoerd door Jellyfin.", + "LabelEnableDlnaClientDiscoveryInterval": "Interval voor het zoeken naar clients", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Bepaalt de duur in seconden tussen SSDP zoekopdrachten.", "LabelEnableDlnaDebugLogging": "DLNA foutopsporings logboek inschakelen", "LabelEnableDlnaDebugLoggingHelp": "Genereer grote logboekbestanden en is alleen bedoeld voor het troubleshooting doeleinden.", "LabelEnableDlnaPlayTo": "DLNA \"Play To\" inschakelen", - "LabelEnableDlnaPlayToHelp": "Apparaten detecteren binnen uw netwerk en maak het mogelijk om ze op afstand te controleren.", + "LabelEnableDlnaPlayToHelp": "Apparaten detecteren binnen uw netwerk en maak het mogelijk om ze op afstand te gebruiken.", "LabelEnableDlnaServer": "DLNA server inschakelen", "LabelEnableDlnaServerHelp": "Sta UPnP apparaten op uw netwerk toe om door inhoud te bladeren en deze af te spelen.", "LabelEnableHardwareDecodingFor": "Activeer hardwaredecodering voor:", @@ -576,14 +521,14 @@ "LabelFriendlyName": "Gebruiksvriendelijke naam:", "LabelServerNameHelp": "Deze naam wordt gebruikt om de server te identificeren, standaard is deze de server zijn computer naam.", "LabelGroupMoviesIntoCollections": "Groepeer films in collecties", - "LabelGroupMoviesIntoCollectionsHelp": "Bij de weergave van film lijsten, zullen films die tot een collectie behoren worden weergegeven als een gegroepeerd object.", + "LabelGroupMoviesIntoCollectionsHelp": "Bij de weergave van film lijsten, zullen films in een collectie worden weergegeven als een gegroepeerd object.", "LabelEncoderPreset": "H264 codering preset:", "LabelHardwareAccelerationType": "Hardware acceleratie:", "LabelHardwareAccelerationTypeHelp": "Hardwarematige versnelling vereist extra configuratie.", "LabelHomeNetworkQuality": "Thuisnetwerk kwaliteit:", "LabelHomeScreenSectionValue": "Beginscherm sectie {0}:", "LabelHttpsPort": "Lokale HTTPS poort nummer:", - "LabelHttpsPortHelp": "Het TCP poort nummer waar Jellyfin's HTTPS server aan moet verbinden.", + "LabelHttpsPortHelp": "Het TCP poort nummer voor de HTTPS server.", "LabelIconMaxHeight": "Pictogram maximum hoogte:", "LabelIconMaxHeightHelp": "Maximum resolutie van pictogrammen weergegeven via upnp:icon.", "LabelIconMaxWidth": "Pictogram maximum breedte:", @@ -610,7 +555,7 @@ "LabelLanNetworks": "LAN-netwerken:", "LabelLanguage": "Taal:", "LabelLocalHttpServerPortNumber": "Lokale HTTP poort nummer:", - "LabelLocalHttpServerPortNumberHelp": "Het TCP poort nummer waar Jellyfin's HTTP server aan moet verbinden.", + "LabelLocalHttpServerPortNumberHelp": "Het TCP poort nummer voor de HTTP server.", "LabelLockItemToPreventChanges": "Vergrendel dit item om toekomstige wijzigingen te voorkomen", "LabelLoginDisclaimer": "Aanmeld vrijwaring:", "LabelLoginDisclaimerHelp": "Een bericht dat weergeven zal worden onderaan op de login pagina.", @@ -650,7 +595,7 @@ "LabelMovieCategories": "Film categoriën:", "LabelMoviePrefix": "Film voorvoegsel:", "LabelMoviePrefixHelp": "Als een voorvoegsel wordt toegepast op filmtitels, typ deze dan eventueel hier zodat de server het goed kan verwerken.", - "LabelMovieRecordingPath": "Filmopname pad (optioneel):", + "LabelMovieRecordingPath": "Filmopname pad:", "LabelMusicStreamingTranscodingBitrate": "Muziek transcodering bitrate:", "LabelMusicStreamingTranscodingBitrateHelp": "Geef een maximum bitrate op voor het streamen van muziek.", "LabelName": "Naam:", @@ -658,13 +603,12 @@ "LabelNewPassword": "Nieuw wachtwoord:", "LabelNewPasswordConfirm": "Bevestig nieuw wachtwoord:", "LabelNewsCategories": "Nieuws categorieën:", - "LabelNext": "Volgende", "LabelNotificationEnabled": "Deze melding inschakelen", "LabelNumber": "Nummer:", "LabelNumberOfGuideDays": "Aantal dagen van de gids om te downloaden:", "LabelNumberOfGuideDaysHelp": "Het downloaden van meer dagen van de gids gegevens biedt de mogelijkheid verder vooruit te plannen en een beter overzicht geven, maar het zal ook langer duren om te downloaden. Auto kiest op basis van het aantal kanalen.", - "LabelOptionalNetworkPath": "(Optioneel) Gedeelde netwerkmap:", - "LabelOptionalNetworkPathHelp": "Als deze map wordt gedeeld op uw netwerk, kunnen middels het netwerkpad Jellyfin apps op andere apparaten rechtstreeks toegang tot mediabestanden krijgen. Bijvoorbeeld {0} or {1}.", + "LabelOptionalNetworkPath": "Gedeelde netwerkmap:", + "LabelOptionalNetworkPathHelp": "Als deze map wordt gedeeld op uw netwerk, kunnen middels het netwerkpad clients op andere apparaten rechtstreeks toegang tot mediabestanden krijgen. Bijvoorbeeld {0} of {1}.", "LabelOriginalAspectRatio": "Originele aspect ratio:", "LabelOriginalTitle": "Orginele titel:", "LabelOverview": "Overzicht:", @@ -683,9 +627,7 @@ "LabelPostProcessorArguments": "Nabewerkings command lijn argumenten:", "LabelPostProcessorArgumentsHelp": "Gebruik {path} als het pad naar het opnamebestand.", "LabelPreferredDisplayLanguage": "Voorkeur weergavetaal:", - "LabelPreferredDisplayLanguageHelp": "Vertaling van Jellyfin is een voortdurend project.", "LabelPreferredSubtitleLanguage": "Voorkeurstaal ondertiteling:", - "LabelPrevious": "Vorige", "LabelProfileAudioCodecs": "Geluidscodecs:", "LabelProfileCodecsHelp": "Gescheiden door een komma. Dit kan leeg worden gelaten om te laten gelden voor alle codecs.", "LabelProfileContainersHelp": "Gescheiden door een komma. Dit kan leeg worden gelaten om te laten gelden voor alle containers.", @@ -695,7 +637,6 @@ "LabelPublicHttpPortHelp": "Het publieke poortnummer dat moet worden toegewezen aan de lokale HTTP poort.", "LabelPublicHttpsPort": "Publieke HTTPS poort nummer:", "LabelPublicHttpsPortHelp": "Het publieke poortnummer dat moet worden toegewezen aan de lokale HTTPS poort.", - "LabelReadHowYouCanContribute": "Lees meer over hoe u kunt bijdragen.", "LabelReasonForTranscoding": "Reden voor transcoderen:", "LabelRecord": "Opnemen:", "LabelRecordingPath": "Standaard opname pad:", @@ -704,7 +645,7 @@ "LabelReleaseDate": "Uitgave datum:", "LabelRemoteClientBitrateLimit": "Internet streaming bitrate limiet (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Een optionele bitrate per stream limiet voor alle apparaten buiten het netwerk. Dit is handig om te voorkomen dat apparaten een hogere bitrate vragen dan je internetverbinding aan kan. Dit kan een verhoogde belasting van de CPU in je server veroorzaken om videos direct te transcoderen naar een lagere bitrate.", - "LabelRuntimeMinutes": "Speelduur (minuten):", + "LabelRuntimeMinutes": "Speelduur:", "LabelSaveLocalMetadata": "Afbeeldingen opslaan in mediamappen", "LabelSaveLocalMetadataHelp": "Door afbeeldingen op te slaan in de mediamappen kunnen ze makkelijker worden aangepast.", "LabelScheduledTaskLastRan": "Laatste keer {0}, duur {1}.", @@ -716,7 +657,7 @@ "LabelSelectVersionToInstall": "Selecteer de versie om te installeren:", "LabelSendNotificationToUsers": "Stuur de melding naar:", "LabelSerialNumber": "Serienummer", - "LabelSeriesRecordingPath": "Serieopname pad (optioneel):", + "LabelSeriesRecordingPath": "Serieopname pad:", "LabelServerHost": "Server:", "LabelServerHostHelp": "192.168.1.100:8096 of https://mijnserver.nl", "LabelSimultaneousConnectionLimit": "Gelijktijdige stream limiet:", @@ -731,7 +672,6 @@ "LabelSortBy": "Sorteren op:", "LabelSortOrder": "Sorteer volgorde:", "LabelSortTitle": "Sorteer titel:", - "LabelSoundEffects": "Geluidseffecten:", "LabelSource": "Bron:", "LabelSpecialSeasonsDisplayName": "De weergavenaam van een speciaal seizoen:", "LabelSportsCategories": "Sport categorieën:", @@ -741,7 +681,6 @@ "LabelSubtitleDownloaders": "Ondertiteling downloaders:", "LabelSubtitleFormatHelp": "Voorbeeld: srt", "LabelSubtitlePlaybackMode": "Ondertitel modus:", - "LabelSubtitles": "Ondertiteling", "LabelSupportedMediaTypes": "Ondersteunde Media Types:", "LabelTVHomeScreen": "TV mode begin scherm:", "LabelTextBackgroundColor": "Tekst achtergrond kleur:", @@ -752,7 +691,6 @@ "LabelTimeLimitHours": "Tijdslimiet (uren):", "LabelTitle": "Titel:", "LabelTrackNumber": "Tracknummer:", - "LabelTranscodingAudioCodec": "Geluidscodec:", "LabelTranscodingTempPathHelp": "Specificeer een eigen pad voor de transcode bestanden die geleverd worden aan gebruikers. Laat leeg om de server standaard te gebruiken.", "LabelTranscodingThreadCount": "Aantal transcodeer draden:", "LabelTranscodingThreadCountHelp": "Selecteer het maximale aantal draden die gebruikt mogen worden om te kunnen transcoderen. Bij een lager aantal zal het processorgebruik lager zijn, maar kan de afspeelkwaliteit minder zijn voor een vloeiende ervaring.", @@ -774,7 +712,6 @@ "LabelXDlnaCapHelp": "Bepaalt de inhoud van het X_DLNACAP element in de urn: schemas-dlna-org:device-1-0 namespace.", "LabelXDlnaDocHelp": "Bepaalt de inhoud van het X_DLNADOC element in de urn:schemas-dlna-org:device-1-0 namespace.", "LabelYear": "Jaar:", - "LabelYourFirstName": "Uw voornaam:", "LabelYoureDone": "Gereed!", "LabelZipCode": "Postcode:", "LabelffmpegPath": "FFmpeg pad:", @@ -819,20 +756,19 @@ "MessageConfirmProfileDeletion": "Weet u zeker dat u dit profiel wilt verwijderen?", "MessageConfirmRecordingCancellation": "Opname annuleren?", "MessageConfirmRemoveMediaLocation": "Weet u zeker dat u deze locatie wilt verwijderen?", - "MessageConfirmRestart": "Weet u zeker dat u Jellyfin Server wilt herstarten?", - "MessageConfirmRevokeApiKey": "Weet u zeker dat u deze api sleutel in wilt trekken? De verbinding met Jellyfin Server zal direct verbroken worden.", + "MessageConfirmRestart": "Weet u zeker dat u Jellyfin wilt herstarten?", + "MessageConfirmRevokeApiKey": "Weet u zeker dat u deze API sleutel in wilt trekken? De verbinding van de applicatie met deze server zal plotseling verbroken worden.", "MessageConfirmShutdown": "Weet u zeker dat u de server wilt afsluiten?", "MessageContactAdminToResetPassword": "Neem contact op met de server beheerder om uw wachtwoord te resetten.", "MessageCreateAccountAt": "Maak een account bij {0}", "MessageDeleteTaskTrigger": "Weet u zeker dat u deze signaal taak wilt verwijderen?", - "MessageDirectoryPickerBSDInstruction": "Voor BSD kan het noodzakelijk zijn opslag op uw FreeNAS Jail te configureren voordat Jellyfin het kan benaderen.", + "MessageDirectoryPickerBSDInstruction": "Voor BSD moet u mogelijk de opslag in uw FreeNAS Jail configureren, zodat Jellyfin toegang heeft tot uw media.", "MessageDirectoryPickerLinuxInstruction": "Voor Linux op Arch Linux, CentOS, Debian, Fedora, openSUSE, of Ubuntu, moet u de service-gebruiker ten minste leestoegang tot uw opslaglocaties verlenen.", "MessageDownloadQueued": "Download in de wachtrij geplaatst.", "MessageEnablingOptionLongerScans": "Het inschakelen van deze optie kan leiden tot langere doorlooptijd van bibliotheek scans.", "MessageFileReadError": "Er is een fout opgetreden bij het lezen van het bestand. Probeer het opnieuw.", "MessageForgotPasswordFileCreated": "Het volgende bestand is gecreëerd op uw server en bevat instructies om verder te gaan:", "MessageForgotPasswordInNetworkRequired": "Probeer de wachtwoord herstel procedure opnieuw vanuit uw thuisnetwerk.", - "MessageInstallPluginFromApp": "Deze plugin moet geïnstalleerd worden vanuit de app waarin u het wilt gebruiken.", "MessageInvalidForgotPasswordPin": "Er is een ongeldige of verlopen pincode ingegeven. Probeer opnieuw.", "MessageInvalidUser": "Incorrecte gebruikersnaam of wachtwoord. Probeer opnieuw.", "MessageItemSaved": "Item opgeslagen.", @@ -848,14 +784,13 @@ "MessagePleaseEnsureInternetMetadata": "Zorg ervoor dat het downloaden van internet-metadata is ingeschakeld.", "MessagePleaseWait": "Even geduld. Dit kan even duren.", "MessagePluginConfigurationRequiresLocalAccess": "Om deze plugin te configuren moet u zich aanmelden direct op de lokale server.", - "MessagePluginInstallDisclaimer": "Plugins ontwikkeld door leden van de Jellyfin gemeenschap zijn een geweldige manier om uw Jellyfin ervaring met extra functies en voordelen te verbeteren. Alvorens te installeren, dient u zich bewust te zijn van de gevolgen die zij kunnen hebben op uw Jellyfin Server, zoals langere bibliotheek scans, extra achtergrondinformatie verwerking, en een verminderde stabiliteit van het systeem.", + "MessagePluginInstallDisclaimer": "Plugins ontwikkeld door leden van de gemeenschap zijn een geweldige manier om uw ervaring met extra functies en voordelen te verbeteren. Wees voor het installeren bewust van de effecten die zij op uw server kunnen hebben, zoals langere bibliotheek scans, extra achtergrondinformatie verwerking, en een verminderde stabiliteit van het systeem.", "MessageReenableUser": "Zie hieronder hoe opnieuw in te schakelen", - "MessageSettingsSaved": "Instellingen opgeslagen.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "De volgende media locaties worden verwijderd uit de bibliotheek:", "MessageUnableToConnectToServer": "Het is momenteel niet mogelijk met de geselecteerde server te verbinden. Controleer dat deze draait en probeer het opnieuw.", "MessageUnsetContentHelp": "Inhoud zal als gewone folders worden getoond. Gebruik voor het beste resultaat de Metadata Manager om de inhoud types voor subfolders in te stellen.", "MessageYouHaveVersionInstalled": "Op dit moment is versie {0} geïnstalleerd.", - "MetadataSettingChangeHelp": "Veranderen van metadata instellingen zal nieuwe content die wordt toegevoegd beïnvloeden. Om de bestaande inhoud te vernieuwen, opent u het detail scherm en klik op de knop Vernieuwen, of doe een bulk vernieuwing met behulp van de metadata manager.", + "MetadataSettingChangeHelp": "Het veranderen van metadata instellingen zal nieuwe toegevoegd content beïnvloeden. Om de bestaande content te vernieuwen, opent u het detail scherm en klik op de vernieuw knop, of voer een bulk vernieuwing uit met behulp van de metadata manager.", "MinutesAfter": "minuten na", "MinutesBefore": "minuten voor", "Mobile": "Mobiel", @@ -880,10 +815,9 @@ "NextUp": "Hierna", "No": "Nee", "NoNewDevicesFound": "Er zijn geen nieuwe apparaten gevonden. Sluit dit melding en voer handmatig de apparaat gegevens in om een nieuwe tuner toe te voegen.", - "NoNextUpItemsMessage": "Niets gevonden. Start met kijken!", - "NoPluginConfigurationMessage": "Deze plugin heeft geen instellingen te configureren.", + "MessageNoNextUpItems": "Niets gevonden. Start met kijken!", + "MessageNoPluginConfiguration": "Deze plugin heeft geen instellingen te configureren.", "NoSubtitleSearchResultsFound": "Geen resultaten gevonden.", - "NoSubtitles": "Geen ondertiteling", "NoSubtitlesHelp": "Ondertitels worden niet standaard weergegeven. Deze kunnen tijdens het afspelen handmatig worden ingeschakeld.", "None": "Geen", "Normal": "Normaal", @@ -902,7 +836,7 @@ "OptionAllowLinkSharingHelp": "Alleen webpagina's met media-informatie worden gedeeld. Media-bestanden worden nooit publiekelijk gedeeld. Gedeelde items zijn beperkt in tijd en verlopen na {0} dagen.", "OptionAllowManageLiveTv": "Live TV opname beheer toestaan", "OptionAllowMediaPlayback": "Media afspelen toestaan", - "OptionAllowMediaPlaybackTranscodingHelp": "Toegang tot transcodering beperken kan afspeelfouten in Jellyfin apps door niet ondersteunde madiaformaten veroorzaken.", + "OptionAllowMediaPlaybackTranscodingHelp": "Het beperken van toegang tot transcodering kan afspeelfouten in clients veroorzaken door niet ondersteunde madiaformaten.", "OptionAllowRemoteControlOthers": "Op afstand besturen van andere gebruikers toestaan", "OptionAllowRemoteSharedDevices": "Op afstand besturen van gedeelde apparaten toestaan", "OptionAllowRemoteSharedDevicesHelp": "DLNA apparaten worden als gedeeld apparaat gezien totdat een gebruiker deze gaat gebruiken.", @@ -912,9 +846,8 @@ "OptionAllowVideoPlaybackTranscoding": "Afspelen van video die transcoderen vereisen toestaan", "OptionArtist": "Artiest", "OptionAscending": "Oplopend", - "OptionAutomatic": "Automatisch", "OptionAutomaticallyGroupSeries": "Automatisch samenvoegen serie die zijn verspreid over meerdere mappen", - "OptionAutomaticallyGroupSeriesHelp": "Indien ingeschakeld, zal serie die zijn verspreid over meerdere mappen binnen deze bibliotheek automatisch samengevoegd tot één serie.", + "OptionAutomaticallyGroupSeriesHelp": "Serie die verspreid zijn over meerdere mappen binnen deze bibliotheek worden automatisch samengevoegd tot één serie.", "OptionBlockBooks": "Boeken", "OptionBlockChannelContent": "Internet kanaal Inhoud", "OptionBlockLiveTvChannels": "Live TV Kanalen", @@ -933,14 +866,14 @@ "OptionDatePlayed": "Datum afgespeeld", "OptionDescending": "Aflopend", "OptionDisableUser": "Deze gebruiker uitschakelen", - "OptionDisableUserHelp": "Indien uitgeschakeld zal de server geen verbindingen van deze gebruiker toestaan. Bestaande verbindingen zullen abrupt worden beëindigd.", + "OptionDisableUserHelp": "De server staat geen verbindingen van deze gebruiker toe. Bestaande verbindingen zullen abrupt worden beëindigd.", "OptionDislikes": "Niet leuk", "OptionDisplayFolderView": "Toon een mappenweergave als u gewoon Mediamappen wilt weergeven", "OptionDisplayFolderViewHelp": "Geef folders weer naast uw andere media bibliotheken. Dit kan handig zijn als u een oppervlakkig folder aanzicht wilt hebben.", "OptionDownloadBackImage": "Terug", "OptionDownloadDiscImage": "Schijf", "OptionDownloadImagesInAdvance": "Download afbeeldingen van tevoren", - "OptionDownloadImagesInAdvanceHelp": "Standaard worden de meeste afbeeldingen gedownload wanneer ze opgevraagd worden door een Jellyfin app. Activeer deze optie om alle afbeeldingen op voorhand te downloaden bij het importeren van nieuwe media. Dit kan aanzienlijk langere bibliotheekscans veroorzaken.", + "OptionDownloadImagesInAdvanceHelp": "Standaard worden de meeste afbeeldingen alleen gedownload wanneer ze opgevraagd worden door een client. Activeer deze optie om alle afbeeldingen van tevoren te downloaden bij het importeren van nieuwe media. Dit kan aanzienlijk langere bibliotheekscans veroorzaken.", "OptionDownloadPrimaryImage": "Primair", "OptionDownloadThumbImage": "Miniatuur", "OptionEmbedSubtitles": "Insluiten in container", @@ -959,7 +892,6 @@ "OptionExternallyDownloaded": "Externe download", "OptionExtractChapterImage": "Inschakelen uitpakken van hoofdstuk afbeeldingen", "OptionFavorite": "Favorieten", - "OptionFriday": "Vrijdag", "OptionHasSpecialFeatures": "Extra's", "OptionHasSubtitles": "Ondertiteling", "OptionHasThemeSong": "Thema Lied", @@ -973,11 +905,9 @@ "OptionImdbRating": "IMDb Waardering", "OptionLikes": "Leuk", "OptionMissingEpisode": "Ontbrekende Afleveringen", - "OptionMonday": "Maandag", "OptionNameSort": "Naam", "OptionNew": "Nieuw…", "OptionNone": "Geen", - "OptionOnAppStartup": "Op applicatie start", "OptionOnInterval": "Op interval", "OptionParentalRating": "Kijkwijzer classificatie", "OptionPlainStorageFolders": "Alle mappen weergeven als gewone opslagmappen", @@ -997,19 +927,14 @@ "OptionRequirePerfectSubtitleMatchHelp": "Een perfecte match vereisen zal de ondertitels filteren om alleen ondertitels te downloaden die getest en geverifieerd zijn met je exacte videobestand. Dit uitvinken zal de kans om ondertitels te vinden vergroten, maar ook de kans op een niet gesynchroniseerd of foute ondertitel vergroten.", "OptionResumable": "Hervatbaar", "OptionRuntime": "Speelduur", - "OptionSaturday": "Zaterdag", "OptionSaveMetadataAsHidden": "Metagegevens en afbeeldingen opslaan als verborgen bestanden", "OptionSaveMetadataAsHiddenHelp": "Het veranderen van dit zal gelden voor nieuwe metadata die wordt opgeslagen. Bestaande metadata bestanden zullen de volgende keer dat ze worden opgeslagen door Jellyfin Server worden bijgewerkt.", "OptionSubstring": "Subtekenreeks", - "OptionSunday": "Zondag", - "OptionThursday": "Donderdag", "OptionTrackName": "Naam van Nummer", - "OptionTuesday": "Dinsdag", "OptionTvdbRating": "TVDB Waardering", "OptionUnairedEpisode": "Toekomstige Afleveringen", "OptionUnplayed": "Niet afgespeeld", "OptionWakeFromSleep": "Uit slaapstand halen", - "OptionWednesday": "Woensdag", "OptionWeekdays": "Week dagen", "OptionWeekends": "Weekend", "OptionWeekly": "Wekelijks", @@ -1022,7 +947,7 @@ "PasswordMatchError": "Wachtwoord en wachtwoord bevestiging moeten hetzelfde zijn.", "PasswordResetComplete": "Het wachtwoord is opnieuw ingesteld.", "PasswordResetConfirmation": "Weet u zeker dat u het wachtwoord opnieuw in wilt stellen?", - "PasswordResetHeader": "Reset Wachtwoord", + "HeaderResetPassword": "Reset Wachtwoord", "PasswordSaved": "Wachtwoord opgeslagen.", "People": "Personen", "PerfectMatch": "Perfecte match", @@ -1044,7 +969,7 @@ "PleaseEnterNameOrId": "Voer een naam of een externe ID in.", "PleaseRestartServerName": "Herstart Jellyfin Server - {0} aub.", "PleaseSelectTwoItems": "Selecteer ten minste twee items.", - "PluginInstalledMessage": "Het installeren van de plugin is gelukt. Jellyfin Server zal heropgestart moeten worden om de wijzigingen door te voeren.", + "MessagePluginInstalled": "Het installeren van de plugin is gelukt. Jellyfin Server zal heropgestart moeten worden om de wijzigingen door te voeren.", "PreferEmbeddedTitlesOverFileNames": "Prefereer ingesloten titels boven bestandsnamen", "PreferEmbeddedTitlesOverFileNamesHelp": "Dit bepaalt de standaard weergavetitel wanneer er geen internet metagegevens of lokale metadata beschikbaar is.", "Premieres": "Premières", @@ -1054,7 +979,6 @@ "ProductionLocations": "Productie Locaties", "Programs": "Programma's", "Quality": "Kwaliteit", - "QueueAllFromHere": "Plaats in de wachtrij vanaf hier", "Raised": "Verhoogd", "Rate": "Waardeer", "RecentlyWatched": "Onlangs bekeken", @@ -1065,7 +989,7 @@ "Record": "Opnemen", "RecordSeries": "Series Opnemen", "RecordingCancelled": "Opname geannuleerd.", - "RecordingPathChangeMessage": "Bij het wijzigen van uw opnamemap zullen bestaande opnamen niet migreren van de oude locatie naar de nieuwe. U moet deze desgewenst handmatig verplaatsen.", + "MessageChangeRecordingPath": "Bij het wijzigen van uw opnamemap zullen bestaande opnamen niet migreren van de oude locatie naar de nieuwe. U moet deze desgewenst handmatig verplaatsen.", "RecordingScheduled": "Opname schema.", "Recordings": "Opnames", "Refresh": "Vernieuwen", @@ -1085,7 +1009,6 @@ "ReplaceExistingImages": "Bestaande afbeeldingen vervangen", "ResumeAt": "Hervatten vanaf {0}", "Rewind": "Terugspoelen", - "RunAtStartup": "Uitvoeren bij opstarten", "Runtime": "Speelduur", "Saturday": "Zaterdag", "Save": "Opslaan", @@ -1146,47 +1069,23 @@ "SystemDlnaProfilesHelp": "Systeem profielen zijn alleen-lezen. Om een systeem profiel te overschrijven, maakt u een aangepast profiel gericht op hetzelfde apparaat.", "TabAccess": "Toegang", "TabAdvanced": "Geavanceerd", - "TabAlbumArtists": "Albumartiesten", - "TabArtists": "Artiesten", "TabCatalog": "Catalogus", - "TabChannels": "Kanalen", - "TabCollections": "Collecties", - "TabDevices": "Apparaten", "TabDirectPlay": "Direct Afspelen", - "TabDisplay": "Weergave", - "TabEpisodes": "Afleveringen", - "TabFavorites": "Favorieten", - "TabGuide": "Gids", "TabLatest": "Nieuw", "TabLogs": "Logboeken", - "TabMetadata": "Metagegevens", - "TabMovies": "Films", "TabMusic": "Muziek", - "TabMusicVideos": "Muziek Videos", "TabMyPlugins": "Mijn Plugins", "TabNetworks": "TV-Studio's", "TabNfoSettings": "NFO Instellingen", "TabNotifications": "Meldingen", "TabOther": "Overig", "TabParentalControl": "Ouderlijk toezicht", - "TabPassword": "Wachtwoord", - "TabPlayback": "Afspelen", - "TabPlaylist": "Afspeellijst", - "TabPlaylists": "Afspeellijst", "TabProfile": "Profiel", "TabProfiles": "Profielen", - "TabRecordings": "Opnamen", "TabResponses": "Reacties", - "TabResumeSettings": "Hervatten", "TabScheduledTasks": "Geplande taken", - "TabSeries": "Serie", "TabSettings": "Instellingen", - "TabShows": "Series", - "TabSongs": "Titels", - "TabSuggestions": "Suggesties", - "TabTranscoding": "Transcoderen", "TabUpcoming": "Binnenkort op TV", - "TabUsers": "Gebruikers", "Tags": "Labels", "TagsValue": "Labels: {0}", "TellUsAboutYourself": "Vertel ons over uzelf", @@ -1204,7 +1103,7 @@ "Tuesday": "Dinsdag", "TvLibraryHelp": "Bekijk de {0}TV naamgeving gids {1}.", "UninstallPluginConfirmation": "Weet u zeker dat u {0} wilt deïnstalleren?", - "UninstallPluginHeader": "Plug-in deïnstalleren", + "HeaderUninstallPlugin": "Plug-in deïnstalleren", "Unmute": "Dempen opheffen", "Unplayed": "Niet afgespeeld", "Unrated": "Geen rating", @@ -1228,7 +1127,6 @@ "ValueTimeLimitMultiHour": "Tijdslimiet: {0} uren", "ValueTimeLimitSingleHour": "Tijdslimiet: 1 uur", "Vertical": "Verticaal", - "VideoRange": "Videobereik", "ViewAlbum": "Bekijk album", "ViewPlaybackInfo": "Bekijk afspelen info", "Watched": "Bekeken", @@ -1248,7 +1146,6 @@ "Banner": "Banner", "Blacklist": "Zwarte lijst", "Box": "Hoes", - "ButtonFilter": "Filter", "ButtonInfo": "Info", "ButtonOk": "Ok", "ButtonStart": "Start", @@ -1261,16 +1158,11 @@ "Filters": "Filters", "Genre": "Genre", "Genres": "Genres", - "HeaderAlbums": "Albums", "HeaderCastAndCrew": "Acteurs en medewerkers", - "HeaderCastCrew": "Acteurs & medewerkers", "Art": "Afbeeldingen", - "HeaderLiveTV": "Live TV", - "HeaderFilters": "Filters", - "HeaderGenres": "Genres", "HeaderHttpHeaders": "HTTP Headers", "HeaderStatus": "Status", - "AuthProviderHelp": "Selecteer een Authenticatie Provider om het wachtwoord van deze gebruiker te verifiëren.", + "AuthProviderHelp": "Selecteer een authenticatie provider om het wachtwoord van deze gebruiker te verifiëren.", "HeaderFavoriteMovies": "Favoriete Films", "HeaderFavoriteShows": "Favoriete shows", "HeaderFavoriteEpisodes": "Favoriete afleveringen", @@ -1279,8 +1171,6 @@ "HeaderFavoriteSongs": "Favoriete nummers", "HeaderFavoriteVideos": "Favoriete Films", "HeaderInstantMix": "Directe Mix", - "HeaderItems": "Items", - "HeaderLiveTv": "Live TV", "HeaderMedia": "Media", "HeaderTracks": "Nummers", "HeaderTuners": "Stemmers", @@ -1288,7 +1178,6 @@ "ItemCount": "{0} items", "Items": "Items", "LabelAlbum": "Album:", - "LabelAudio": "Audio", "LabelAuthProvider": "Authenticatie Aanbieder:", "LabelCache": "Cache:", "LabelDidlMode": "DIDL mode:", @@ -1302,12 +1191,10 @@ "LabelProfileVideoCodecs": "Video codecs:", "LabelProtocolInfo": "Protocol info:", "LabelServerName": "Server naam:", - "LabelSkin": "Uiterlijk:", "ButtonAddImage": "Voeg afbeelding toe", "LabelSize": "Grootte:", "CopyStreamURLSuccess": "URL succesvol gekopieerd.", "CopyStreamURL": "Kopieer Stream URL", - "TabLiveTV": "Live TV", "ValueAlbumCount": "{0} albums", "FetchingData": "Meer data op aan het halen", "HeaderFavoriteBooks": "Favoriete Boeken", @@ -1317,7 +1204,6 @@ "LabelBaseUrl": "Basis URL:", "LabelTranscodingProgress": "Transcoderen voortgang:", "LabelTriggerType": "Signaal Type:", - "LaunchWebAppOnStartup": "Lanceer de web interface wanneer de server start", "MediaInfoBitrate": "Bitrate", "MediaInfoInterlaced": "Interlaced", "ValueSeriesCount": "{0} series", @@ -1341,7 +1227,6 @@ "OptionDvd": "DVD", "OptionResElement": "res element", "TV": "TV", - "HeaderHome": "Thuis", "MediaInfoStreamTypeEmbeddedImage": "Ingeladen Afbeelding", "LabelTypeMetadataDownloaders": "{0} metadata downloaders:", "OptionLoginAttemptsBeforeLockout": "Bepaald hoeveel foutieve login pogingen plaats kunnen vinden voor dat de gebruiker buitengesloten wordt.", @@ -1357,7 +1242,6 @@ "ValueDiscNumber": "Schijf {0}", "ValueMinutes": "{0} min", "OptionProtocolHttp": "HTTP", - "LabelTranscodingVideoCodec": "Video codec:", "MusicLibraryHelp": "Bekijk de {0}muziek benaming gids{1}.", "OptionList": "lijst", "LabelAudioBitDepth": "Audio bit diepte:", @@ -1367,9 +1251,6 @@ "PasswordResetProviderHelp": "Kies een wachtwoord reset provider om te gebruiken wanneer deze gebruiker een wachtwoord reset aanvraagt", "Screenshots": "Schermafdruk", "Series": "Series", - "TabAlbums": "Albums", - "TabGenres": "Genres", - "TabInfo": "Info", "Trailers": "Trailers", "Uniform": "Uniform", "ValueCodec": "Codec: {0}", @@ -1394,12 +1275,10 @@ "LabelPleaseRestart": "De wijzigingen zullen worden toegepast na het handmatig herladen van de web cliënt.", "LabelStatus": "Status:", "LabelTagline": "Label tekst:", - "LabelTranscodingContainer": "Container:", "LabelTranscodePath": "Transcodeer pad:", "LabelTranscodes": "Transcoderen:", "DashboardOperatingSystem": "Besturingssysteem: {0}", "LabelWeb": "Web:", - "LaunchWebAppOnStartupHelp": "Open de web cliënt in uw standaard browser wanneer de server voor de eerste keer start. Dit zal niet voorkomen tijdens gebruik van de server herstart functie.", "LeaveBlankToNotSetAPassword": "U kunt dit veld leeg laten om geen wachtwoord in te stellen.", "DashboardServerName": "Server: {0}", "LabelVideoBitrate": "Video bitrate:", @@ -1412,13 +1291,11 @@ "MediaInfoStreamTypeData": "Data", "MediaInfoStreamTypeSubtitle": "Ondertiteling", "MediaInfoStreamTypeVideo": "Video", - "LinksValue": "Links: {0}", "Logo": "Logo", "MediaInfoCodecTag": "Codec tag", "MediaInfoContainer": "Container", "MediaInfoFramerate": "Beeldverversing", "MediaInfoRefFrames": "Ref beeld", - "MediaInfoSoftware": "Software", "MessageImageFileTypeAllowed": "Alleen JPEG en PNG bestanden worden ondersteund.", "MessageImageTypeNotSelected": "Selecteer een afbeelding type van het menu alstublieft .", "MessageNoCollectionsAvailable": "Collecties staan u toe om te genieten van gepersonaliseerde groeperingen van Films, Series en Albums te maken. Klik op de + knop om te beginnen met het maken van collecties.", @@ -1437,13 +1314,11 @@ "OptionRegex": "Regex", "TabServer": "Server", "TabStreaming": "Streamen", - "TabTrailers": "Trailers", "OptionAuto": "Auto", "OptionProfileVideo": "Video", "AlbumArtist": "Album Artiest", "Album": "Album", "DeinterlaceMethodHelp": "Selecteer de deinterlacingmethode die u wilt gebruiken bij het transcoderen van geïnterlinieerde inhoud.", - "CopyStreamURLError": "Er trad een fout op tijdens het kopieren van de URL.", "ClientSettings": "Client instellingen", "ButtonSplit": "Splitsen", "BoxSet": "Box Set", @@ -1460,16 +1335,13 @@ "HeaderNavigation": "Navigeren", "Episode": "Aflevering", "Season": "Seizoen", - "ReleaseGroup": "Uitgave groep", "PreferEmbeddedEpisodeInfosOverFileNames": "Verkies ingeladen afleveringsinformatie boven bestandsnaam", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Dit gebruikt de afleveringsinformatie van de ingeladen metadata als deze aanwezig is.", - "PlaybackErrorNoCompatibleStream": "Deze machine is niet leesbaar met de media en de server verstuurd geen leesbare media formaten.", + "PlaybackErrorNoCompatibleStream": "Dit apparaat ondersteund de afgespeelde media niet en de server verstuurd geen ondersteund formaat.", "Person": "Persoon", - "OtherArtist": "Andere Artiesten", "OptionForceRemoteSourceTranscoding": "Forceer het transcoderen van op afstand bediende media bronnen (zoals LiveTV)", "NoCreatedLibraries": "Het lijkt erop dat er geen bibliotheek is gecreëerd. {0}Wilt u er nu een aanmaken?{1}", "Movie": "Film", - "MessageUnauthorizedUser": "U bent niet gemachtigd om toegang tot de server te krijgen op dit moment. Neem contact op met de server beheerder voor meer informatie.", "MessageConfirmAppExit": "Wilt u afsluiten?", "LabelVideoResolution": "Video resolutie:", "LabelStreamType": "Stream type:", @@ -1492,12 +1364,10 @@ "SelectAdminUsername": "Selecteer een gebruikersnaam voor het beheerder account.", "HeaderFavoritePlaylists": "Favoriete afspeellijsten", "ButtonTogglePlaylist": "Afspeellijst", - "ButtonToggleContextMenu": "Meer", "LabelRequireHttpsHelp": "Indien aangevinkt, zal de server alle verzoeken via HTTP automatisch omleiden naar HTTPS. Dit heeft geen effect als de server niet luistert op HTTPS.", "EnableDetailsBanner": "Details Banner", "MessageSyncPlayNoGroupsAvailable": "Geen groepen beschikbaar. Begin eerst iets te spelen.", "EnableDetailsBannerHelp": "Toon een bannerafbeelding bovenaan de pagina met itemdetails.", - "TabDVR": "DVR", "SyncPlayAccessHelp": "Selecteer het toegangsniveau dat deze gebruiker heeft tot de SyncPlay-functie. SyncPlay maakt het mogelijk om het afspelen met andere gebruikers te synchroniseren.", "Filter": "Filter", "New": "Nieuw", @@ -1529,10 +1399,9 @@ "MillisecondsUnit": "ms", "LabelSyncPlayTimeOffset": "Tijd offset met de server:", "LabelRequireHttps": "HTTPS verplichten", - "LabelNightly": "Nightly", "LabelStable": "Stabiel", "LabelChromecastVersion": "Chromecast versie", - "LabelEnableHttpsHelp": "Hiermee kan de server luisteren op de geconfigureerde HTTPS-poort. Om dit te laten werken moet ook een geldig certificaat worden geconfigureerd.", + "LabelEnableHttpsHelp": "Luisteren op de geconfigureerde HTTPS-poort. Om dit te laten werken moet ook een geldig certificaat worden ingesteld.", "LabelEnableHttps": "HTTPS inschakelen", "HeaderSyncPlayEnabled": "SyncPlay ingeschakeld", "HeaderSyncPlaySelectGroup": "Word lid van een groep", @@ -1552,8 +1421,8 @@ "ClearQueue": "Leeg wachtrij", "StopPlayback": "Stop afspelen", "ButtonPlayer": "Speler", - "EnableBlurhashHelp": "Afbeeldingen die nog laden worden getoond als een wazige placeholder", - "EnableBlurhash": "Schakel wazige placeholders voor plaatjes in", + "EnableBlurHashHelp": "Afbeeldingen die nog laden worden getoond als een wazige placeholder", + "EnableBlurHash": "Schakel wazige placeholders voor plaatjes in", "Writers": "Schrijvers", "ViewAlbumArtist": "Bekijk album artiest", "MessageAddRepository": "Om een repository toe te voegen klik je op de knop naast de kop, en vul je benodigde informatie in.", @@ -1562,5 +1431,11 @@ "LabelRepositoryUrlHelp": "De locatie van het repository manifest dat je wilt gebruiken.", "LabelRepositoryUrl": "Repository URL", "HeaderNewRepository": "Nieuwe repository", - "MessageNoRepositories": "Geen repositories." + "MessageNoRepositories": "Geen repositories.", + "LabelSubtitleVerticalPosition": "Verticale positie:", + "TabRepositories": "Repositories", + "MessageGetInstalledPluginsError": "Er is een fout opgetreden bij het ophalen van de lijst met geïnstalleerde plugins.", + "MessagePluginInstallError": "Er is een fout opgetreden tijdens het installeren van de plugin.", + "LabelUnstable": "Niet stabiel", + "NextTrack": "Ga naar volgende" } diff --git a/src/strings/pl.json b/src/strings/pl.json index a141b975cb..7337edae72 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -3,7 +3,6 @@ "AccessRestrictedTryAgainLater": "Dostęp jest aktualnie ograniczony. Spróbuj ponownie później.", "Actor": "Aktor", "Add": "Dodaj", - "AddItemToCollectionHelp": "Dodaj obiekty do kolekcji wyszukując je i użyj prawy przycisk myszy lub dotknij menu, aby dodać je do kolekcji.", "AddToCollection": "Dodaj do kolekcji", "AddToPlayQueue": "Dodaj do kolejki odtwarzania", "AddToPlaylist": "Dodaj do listy", @@ -24,7 +23,7 @@ "AllowMediaConversionHelp": "Umożliwia dawanie lub odbieranie dostępu do funkcji konwersji mediów.", "AllowOnTheFlySubtitleExtraction": "Zezwalaj na wydobywanie napisów w locie", "AllowOnTheFlySubtitleExtractionHelp": "Napisy wbudowane mogą zostać wydobyte z plików wideo i dostarczone do klienta w postaci zwykłego tekstu, zapobiegając transkodowaniu wideo. Na niektórych systemach może to zabierać dużo czasu i powodować wstrzymywanie odtwarzania wideo podczas procesu ekstrakcji. Dezaktywuj tę opcję, aby wbudowane napisy były wypalane w transkodowanym wideo, gdy nie są obsługiwane przez urządzenie klienta.", - "AllowRemoteAccess": "Zezwalaj na zdalne połączenia z tym serwerem Jellyfin.", + "AllowRemoteAccess": "Zezwalaj na zdalne połączenia z tym serwerem.", "AllowRemoteAccessHelp": "Jeśli nieaktywne, wszelkie zdalne połączenia będą blokowane.", "AllowedRemoteAddressesHelp": "Lista rozdzielona przecinkiem w postaci adresów IP lub adresów IP z maską sieciową dla całych podsieci. W przypadku pozostawienia pustego pola, dopuszczalne będą połączenia ze wszystkich zdalnych adresów.", "AlwaysPlaySubtitles": "Zawsze wyświetlaj napisy", @@ -37,10 +36,8 @@ "AsManyAsPossible": "Tak wiele jak to możliwe", "Ascending": "Rosnąco", "AspectRatio": "Proporcje obrazu", - "AttributeNew": "Nowy", "Audio": "Dźwięk", "Auto": "Automatycznie", - "AutoBasedOnLanguageSetting": "Automatyczna (w oparciu o ustawienia językowe)", "Backdrop": "Fototapeta", "Backdrops": "Fototapety", "Banner": "Baner", @@ -53,82 +50,56 @@ "Box": "Pudełko", "BoxRear": "Pudełko (tył)", "Browse": "Przeglądaj", - "BrowsePluginCatalogMessage": "Przejrzyj nasz katalog wtyczek żeby zobaczyć dostępne wtyczki.", + "MessageBrowsePluginCatalog": "Przejrzyj nasz katalog wtyczek żeby zobaczyć dostępne wtyczki.", "BurnSubtitlesHelp": "Określa czy serwer powinien wypalać napisy podczas konwersji wideo, w zależności od formatu napisów. Unikanie wypalania napisów znacząco poprawia wydajność serwera. Wybierz Automatycznie, w celu wypalania zarówno napisów w formatach graficznych (np. VOBSUB, PGS, SUB, IDX, ...), jak i pewnych napisów ASS lub SSA.", - "ButtonAdd": "Dodaj", "ButtonAddMediaLibrary": "Dodaj media do biblioteki", "ButtonAddScheduledTaskTrigger": "Dodaj wyzwalacz", "ButtonAddServer": "Dodaj Serwer", "ButtonAddUser": "Dodaj użytkownika", - "ButtonArrowDown": "Dół", "ButtonArrowLeft": "Lewa", "ButtonArrowRight": "Prawa", - "ButtonArrowUp": "Góra", "ButtonAudioTracks": "Ścieżki dźwiękowe", "ButtonBack": "Wstecz", "ButtonCancel": "Anuluj", "ButtonChangeServer": "Zmień Serwer", - "ButtonConnect": "Połacz", - "ButtonDelete": "Usuń", - "ButtonDeleteImage": "Usuń obraz", - "ButtonDown": "Dół", - "ButtonDownload": "Pobierz", - "ButtonEdit": "Edytuj", - "ButtonEditImages": "Edytuj obrazy", "ButtonEditOtherUserPreferences": "Edytuj profil, obrazy i ustawienia osobiste tego użytkownika.", - "ButtonFilter": "Filtr", "ButtonForgotPassword": "Zapomniałem hasła", "ButtonFullscreen": "Pełny ekran", "ButtonGotIt": "Rozumiem", "ButtonGuide": "Przewodnik", - "ButtonHelp": "Pomoc", - "ButtonHome": "Start", "ButtonInfo": "Informacje", - "ButtonLearnMore": "Dowiedz się więcej", "ButtonLibraryAccess": "Dostęp do biblioteki", "ButtonManualLogin": "Logowanie manualne", "ButtonMore": "Więcej", "ButtonNetwork": "Sieć", - "ButtonNew": "Nowe", - "ButtonNextTrack": "Następna utwór", - "ButtonOff": "Wyłącz", + "ButtonNextTrack": "Następny utwór", "ButtonOpen": "Otwórz", "ButtonParentalControl": "Kontrola rodzicielska", "ButtonPause": "Pauza", - "ButtonPlay": "Odtwarzaj", "ButtonPreviousTrack": "Poprzedni utwór", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Skrócona Instrukcja Obsługi", - "ButtonRefresh": "Odśwież", "ButtonRefreshGuideData": "Odśwież dane przewodnika", "ButtonRemove": "Usuń", "ButtonRename": "Zmień nazwę", - "ButtonRepeat": "Powtórz", "ButtonResetEasyPassword": "Wyczyść kod PIN", "ButtonResetPassword": "Wyczyść hasło", "ButtonRestart": "Uruchom ponownie", "ButtonResume": "Wznów", "ButtonRevoke": "Odwołaj", - "ButtonSave": "Zapisz", "ButtonScanAllLibraries": "Skanuj biblioteki", - "ButtonSearch": "Szukaj", "ButtonSelectDirectory": "Wybierz folder", "ButtonSelectServer": "Serwery", "ButtonSelectView": "Wybierz widok", "ButtonSend": "Wyślij", "ButtonSettings": "Ustawienia", - "ButtonShuffle": "Losowo", "ButtonShutdown": "Zamknij", "ButtonSignIn": "Zaloguj się", "ButtonSignOut": "Wyloguj", - "ButtonSort": "Sortuj", "ButtonStop": "Zatrzymaj", "ButtonSubmit": "Zatwierdź", - "ButtonSubtitles": "Napisy", "ButtonTrailer": "Zwiastun", "ButtonUninstall": "Odinstaluj", - "ButtonUp": "Góra", - "ButtonViewWebsite": "Odwiedź stronę", "ButtonWebsite": "Strona WWW", "CancelRecording": "Anuluj nagranie", "CancelSeries": "Anuluj nagrywanie serialu", @@ -145,7 +116,7 @@ "ColorTransfer": "Transfer kolorów", "CommunityRating": "Ocena społeczności", "Composer": "Kompozytor", - "ConfigureDateAdded": "Sposób ustalania daty dodania, można skonfigurować w ustawieniach biblioteki w kokpicie serwera Jellyfin", + "ConfigureDateAdded": "Skonfiguruj sposób określania dodanej daty na pulpicie nawigacyjnym w ustawieniach biblioteki", "ConfirmDeleteImage": "Usunąć obraz?", "ConfirmDeleteItem": "Usunięcie tej pozycji usunie ją zarówno z systemu plików jak i z biblioteki mediów. Czy chcesz kontynuować?", "ConfirmDeleteItems": "Usunięcie tej pozycji usunie ją zarówno z systemu plików jak i z biblioteki mediów. Czy chcesz kontynuować?", @@ -160,7 +131,7 @@ "DatePlayed": "Data odtwarzania", "DeathDateValue": "Zmarły: {0}", "Default": "Domyślny", - "DefaultErrorMessage": "Wystąpił błąd podczas przetwarzania żądania. Proszę spróbować ponownie później.", + "ErrorDefault": "Wystąpił błąd podczas przetwarzania żądania. Proszę spróbować ponownie później.", "DefaultMetadataLangaugeDescription": "To są twoje ustawienia domyślne. Możesz je zmienić dla każdej biblioteki osobno.", "DefaultSubtitlesHelp": "Napisy będą wczytywane w oparciu o znaczniki metadanych ścieżek dźwiękowych. Preferencje językowe brane są pod uwagę, gdy dostępnych jest wiele możliwości.", "Delete": "Usuń", @@ -202,7 +173,6 @@ "EditImages": "Edytuj obrazy", "EditMetadata": "Edytuj metadane", "EditSubtitles": "Edytuj napisy", - "EnableBackdrops": "Fototapety", "EnableBackdropsHelp": "Wyświetlaj fototapety, w tle niektórych stron, podczas przeglądania biblioteki.", "EnableCinemaMode": "Tryb kinowy", "EnableColorCodedBackgrounds": "Kolorowe tła bazujące na zawartości", @@ -216,20 +186,18 @@ "EnablePhotosHelp": "Obrazy będą wykrywane i wyświetlane obok innych plików multimedialnych.", "EnableStreamLooping": "Zapętlaj żądania transmisji", "EnableStreamLoopingHelp": "Aktywuj tę opcję w przypadku, gdy transmisje na żywo zawierają tylko kilka sekund danych i wymagają ciągłego ponawiania żądań transmisji. Aktywowanie tej funkcji w przypadku braku potrzeby może powodować problemy.", - "EnableThemeSongs": "Motywy muzyczne", "EnableThemeSongsHelp": "Odtwarzaj motywy muzyczne podczas przeglądania biblioteki.", - "EnableThemeVideos": "Motywy wideo", "EnableThemeVideosHelp": "Podczas przeglądania biblioteki odtwarzaj w tle motywy wideo.", "Ended": "Zakończony", "EndsAtValue": "Koniec o {0}", "Episodes": "Odcinki", "ErrorAddingListingsToSchedulesDirect": "Wystąpił błąd podczas dodawania składu do twojego konta Schedules Direct. Schedules Direct pozwala na limitowaną ilość składów na konto. Może być wymagane zalogowanie się na stronę Schedules Direct i usunięcie innych składów przed kontynuowaniem.", - "ErrorAddingMediaPathToVirtualFolder": "Wystąpił błąd podczas dodawania folderu mediów. Upewnij się, że folder jest prawidłowy a serwer Jellyfin ma dostęp do tej lokalizacji.", + "ErrorAddingMediaPathToVirtualFolder": "Wystąpił błąd podczas dodawania folderu mediów. Upewnij się, że folder jest prawidłowy a Jellyfin ma dostęp do tej lokalizacji.", "ErrorAddingTunerDevice": "Wystąpił błąd podczas dodawania tuner telewizyjnego. Upewnij się, że masz do niego dostęp i spróbuj ponownie.", "ErrorAddingXmlTvFile": "Podczas próby dostępu do pliku XMLTV wystąpił błąd. Upewnij się, że plik istnieje i spróbuj ponownie.", - "ErrorDeletingItem": "Podczas usuwania pozycji z serwera Jellyfin wystąpił błąd. Upewnij się, że serwer ma uprawnienia do zapisu w folderze mediów i spróbuj ponownie.", + "ErrorDeletingItem": "Podczas usuwania pozycji z serwera wystąpił błąd. Upewnij się, że serwer ma uprawnienia do zapisu w folderze mediów i spróbuj ponownie.", "ErrorGettingTvLineups": "Podczas pobierania programu telewizyjnego wystąpił błąd. Upewnij się, że informacje są poprawne i spróbuj ponownie.", - "ErrorMessageStartHourGreaterThanEnd": "Czas końcowy musi być większy niż czas początkowy.", + "ErrorStartHourGreaterThanEnd": "Czas końcowy musi być większy niż czas początkowy.", "ErrorPleaseSelectLineup": "Wybierz program i spróbuj ponownie, jeśli żadne programy nie są dostępne, sprawdź czy twój login, hasło i kod pocztowy jest poprawny.", "ErrorSavingTvProvider": "Wystąpił błąd podczas dodawania dostawcy telewizji. Upewnij się, że jest on dostępny i spróbuj ponownie.", "EveryNDays": "Co {0} dni", @@ -274,34 +242,27 @@ "HeaderActiveDevices": "Aktywne urządzenia", "HeaderActiveRecordings": "Nagrania aktywne", "HeaderActivity": "Aktywność", - "HeaderAddScheduledTaskTrigger": "Dodawanie wyzwalacza", "HeaderAddToCollection": "Dodaj do kolekcji", "HeaderAddToPlaylist": "Dodaj do listy", "HeaderAddUpdateImage": "Dodaj / Aktualizuj obraz", - "HeaderAddUser": "Dodaj użytkownika", "HeaderAdditionalParts": "Dodatkowe części", "HeaderAdmin": "Administracja", "HeaderAlbumArtists": "Wykonawcy albumów", - "HeaderAlbums": "Albumy", "HeaderAlert": "Alarm", "HeaderAllowMediaDeletionFrom": "Zezwalaj na usuwanie mediów z", "HeaderApiKey": "Klucz API", "HeaderApiKeys": "Klucze API", - "HeaderApiKeysHelp": "Aplikacje zewnętrzne muszą posiadać klucz API, aby móc komunikować się z serwerem Jellyfin. Klucze wydawane są po zalogowaniu się za pomocą konta Jellyfin lub ręcznie nadając aplikacji klucz.", + "HeaderApiKeysHelp": "Aplikacje zewnętrzne muszą posiadać klucz API, aby móc komunikować się z serwerem. Klucze wydawane są po zalogowaniu się za pomocą konta lub ręcznie nadając aplikacji klucz.", "HeaderApp": "Aplikacja", "HeaderAppearsOn": "Występuje", "HeaderAudioBooks": "Książka mówiona", "HeaderAudioSettings": "Ustawienia dźwięku", - "HeaderAutomaticUpdates": "Aktualizacje", "HeaderBlockItemsWithNoRating": "Blokuj pozycje z brakującą lub nierozpoznaną kategorią wiekową:", - "HeaderBooks": "Książki", "HeaderBranding": "Dostosowywanie", "HeaderCancelRecording": "Anuluj nagranie", "HeaderCancelSeries": "Anuluj nagrywanie serialu", "HeaderCastAndCrew": "Obsada i ekipa", - "HeaderCastCrew": "Obsada i ekipa", "HeaderChannelAccess": "Dostęp do Kanałów", - "HeaderChannels": "Kanały", "HeaderChapterImages": "Obrazy rozdziałów", "HeaderCodecProfile": "Profil Kodeków", "HeaderCodecProfileHelp": "Profil Kodeków określa ograniczenia urządzenia podczas odtwarzania konkretnych kodeków. Jeśli ograniczenie ma zastosowanie, media będą transkodowane, nawet jeżeli kodek jest skonfigurowany dla odtwarzania bezpośredniego.", @@ -329,24 +290,18 @@ "HeaderDevices": "Urządzenia", "HeaderDirectPlayProfile": "Profil Odtwarzania Bezpośredniego", "HeaderDirectPlayProfileHelp": "Dodaj profil odtwarzania bezpośredniego aby wskazać które formaty mogą być obsługiwane natywnie.", - "HeaderDisplay": "Wyświetlanie", "HeaderDownloadSync": "Synchronizacja", "HeaderEasyPinCode": "Kod PIN", "HeaderEditImages": "Edytuj obrazy", "HeaderEnabledFields": "Pola aktywne", "HeaderEnabledFieldsHelp": "Odznacz pole, aby je zablokować i zapobiec zmianom danych w przyszłości.", - "HeaderEpisodes": "Odcinki", "HeaderError": "Błąd", "HeaderExternalIds": "Identyfikatory zewnętrzne:", "HeaderFeatureAccess": "Dostęp do funkcji", - "HeaderFeatures": "Cechy", "HeaderFetchImages": "Pobieraj obrazy:", "HeaderFetcherSettings": "Ustawienia pobierania", - "HeaderFilters": "Filtry", "HeaderForKids": "Dla dzieci", - "HeaderForgotPassword": "Zapomniałem hasła", "HeaderFrequentlyPlayed": "Często odtwarzane", - "HeaderGenres": "Gatunki", "HeaderGuideProviders": "Dostawcy danych przewodnika telewizyjnego", "HeaderHttpHeaders": "Nagłówki HTTP", "HeaderIdentification": "Identyfikacja", @@ -357,7 +312,6 @@ "HeaderImageSettings": "Ustawienia obrazów", "HeaderInstall": "Instalacja", "HeaderInstantMix": "Szybki remiks", - "HeaderItems": "Pozycje", "HeaderKeepRecording": "Zachowaj nagranie", "HeaderKeepSeries": "Zachowaj nagranie serialu", "HeaderKodiMetadataHelp": "W celu aktywowania lub dezaktywowania metadanych NFO, należy zmodyfikować ustawienia biblioteki w sekcji menadżerów metadanych.", @@ -371,16 +325,12 @@ "HeaderLibraryFolders": "Foldery biblioteki", "HeaderLibraryOrder": "Kolejność biblioteki", "HeaderLibrarySettings": "Ustawienia biblioteki", - "HeaderLiveTV": "Telewizja", - "HeaderLiveTv": "Telewizja", "HeaderLiveTvTunerSetup": "Konfiguracja tunera telewizyjnego", "HeaderLoginFailure": "Niepowodzenie logowania", "HeaderMedia": "Multimedia", "HeaderMediaFolders": "Foldery mediów", - "HeaderMediaInfo": "O mediach", "HeaderMetadataSettings": "Ustawienia metadanych", "HeaderMoreLikeThis": "Więcej podobnych", - "HeaderMovies": "Filmy", "HeaderMusicQuality": "Jakość muzyki", "HeaderMusicVideos": "Teledyski", "HeaderMyDevice": "Moje urządzenie", @@ -389,7 +339,6 @@ "HeaderNewApiKey": "Nowy Klucz API", "HeaderNewDevices": "Nowe urządzenia", "HeaderNextEpisodePlayingInValue": "Następne odcinek za {0}", - "HeaderNextUp": "Do obejrzenia", "HeaderNextVideoPlayingInValue": "Następne wideo za {0}", "HeaderOnNow": "Teraz", "HeaderOtherItems": "Inne pozycje", @@ -397,7 +346,6 @@ "HeaderPassword": "Hasło", "HeaderPasswordReset": "Czyszczenie hasła", "HeaderPaths": "Foldery", - "HeaderPeople": "Osoby", "HeaderPhotoAlbums": "Albumy fotografii", "HeaderPinCodeReset": "Wyczyść kod PIN", "HeaderPlayAll": "Odtwarzaj wszystko", @@ -409,7 +357,7 @@ "HeaderPreferredMetadataLanguage": "Preferowany język metadanych", "HeaderProfile": "Profil", "HeaderProfileInformation": "Informacja o Profilu", - "HeaderProfileServerSettingsHelp": "Te wartości kontrolują jak serwer Jellyfin będzie przedstawiany dla urządzeń.", + "HeaderProfileServerSettingsHelp": "Te wartości kontrolują jak serwer będzie przedstawiany dla urządzeń.", "HeaderRecentlyPlayed": "Ostatnio odtwarzane", "HeaderRecordingOptions": "Opcje nagrywania", "HeaderRecordingPostProcessing": "Przetwarzanie finalne nagrań", @@ -422,7 +370,6 @@ "HeaderRevisionHistory": "Historia zmian", "HeaderRunningTasks": "Uruchomione zadania", "HeaderScenes": "Sceny", - "HeaderSchedule": "Harmonogram", "HeaderSeasons": "Sezony", "HeaderSecondsValue": "{0} sekund", "HeaderSelectCertificatePath": "Wybierz folder certyfikatu", @@ -435,13 +382,11 @@ "HeaderSelectTranscodingPath": "Wybierz folder tymczasowy transkodowania", "HeaderSelectTranscodingPathHelp": "Przeglądaj lub wprowadź folder plików tymczasowych transkodowania. Folder musi umożliwiać zapis plików.", "HeaderSendMessage": "Wyślij wiadomość", - "HeaderSeries": "Seriale", "HeaderSeriesOptions": "Opcje nagrywania serialu", "HeaderSeriesStatus": "Stan serialu", "HeaderServerSettings": "Ustawienia serwera", "HeaderSettings": "Ustawienia", "HeaderSetupLibrary": "Skonfiguruj swoje biblioteki mediów", - "HeaderShutdown": "Zamknij", "HeaderSortBy": "Sortuj według", "HeaderSortOrder": "Porządek sortowania", "HeaderSpecialEpisodeInfo": "Specjalne informacje o odcinku", @@ -455,7 +400,6 @@ "HeaderSubtitleProfiles": "Profile napisów", "HeaderSubtitleProfilesHelp": "Profile napisów określają formaty obsługiwane przez urządzenie.", "HeaderSystemDlnaProfiles": "Profile systemowe", - "HeaderTags": "Znaczniki", "HeaderTaskTriggers": "Wyzwalacze", "HeaderThisUserIsCurrentlyDisabled": "Ten użytkownik jest aktualnie zablokowany", "HeaderTracks": "Utwory", @@ -477,7 +421,6 @@ "HeaderXmlDocumentAttributes": "Atrybuty Dokumentu Xml", "HeaderXmlSettings": "Ustawienia Xml", "HeaderYears": "Lata", - "HeadersFolders": "Foldery", "Help": "Pomoc", "Hide": "Ukryj", "HideWatchedContentFromLatestMedia": "Ukrywaj obejrzaną zawartość na listach ostatnio dodanych", @@ -487,7 +430,7 @@ "Identify": "Identyfikuj", "Images": "Obrazy", "ImportFavoriteChannelsHelp": "Jeśli aktywne, tylko kanały oznaczone jako ulubione na tunerze, będą importowane.", - "ImportMissingEpisodesHelp": "W przypadku aktywacji tej opcji, informacje o brakujących odcinkach zostaną zaimportowane do bazy Jellyfin i będą wyświetlane na listach sezonów i seriali. Może to jednak znacznie wydłużyć czas skanowania biblioteki.", + "ImportMissingEpisodesHelp": "Informacje o brakujących odcinkach zostaną zaimportowane do bazy i będą wyświetlane na listach sezonów i seriali. Może to jednak znacznie wydłużyć czas skanowania biblioteki.", "InstallingPackage": "Instalowanie {0} (wersja {1})", "InstantMix": "Szybki remiks", "ItemCount": "{0} pozycje", @@ -511,24 +454,20 @@ "LabelAlbumArtMaxWidthHelp": "Maksymalna rozdzielczość okładki albumu wystawiana przez upnp:albumArtURI.", "LabelAlbumArtPN": "PN okładki albumu:", "LabelAlbumArtists": "Wykonawcy albumów:", - "LabelAll": "Wszystkie", "LabelAllowHWTranscoding": "Zezwalaj na sprzętowe transkodowanie", - "LabelAllowServerAutoRestart": "Zezwalaj na ponowne uruchomienie serwera, w celu instalacji aktualizacji", - "LabelAllowServerAutoRestartHelp": "Serwer będzie ponownie uruchamiany tylko w trakcie bezczynności, kiedy nie ma aktywnych użytkowników.", "LabelAllowedRemoteAddresses": "Filtr adresów IP:", "LabelAllowedRemoteAddressesMode": "Tryb filtra adresów IP:", "LabelAppName": "Nazwa Aplikacji", "LabelAppNameExample": "Przykład: Sickbeard, Sonarr", "LabelArtists": "Wykonawcy:", - "LabelArtistsHelp": "Oddzielaj używając ;", - "LabelAudio": "Dźwięk", + "LabelArtistsHelp": "Oddziel wielu artystów średnikiem \";\".", "LabelAudioLanguagePreference": "Preferowany język ścieżki dźwiękowej:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Odświeżaj automatycznie metadane z Internetu:", "LabelBindToLocalNetworkAddress": "Przypisz do lokalnego adresu sieciowego:", - "LabelBindToLocalNetworkAddressHelp": "Opcjonalne. Zastąpi to lokalny adres IP adresem serwera HTTP Jeśli pozostanie puste, serwer będzie wiązać się z wszystkimi dostępnymi adresami. Zmiana tej wartości wymaga ponownego uruchomienia serwera Jellyfin.", + "LabelBindToLocalNetworkAddressHelp": "Zastąp lokalny adres IP serwera HTTP. Jeśli pozostanie puste, serwer połączy się ze wszystkimi dostępnymi adresami. Zmiana tej wartości wymaga ponownego uruchomienia.", "LabelBirthDate": "Data urodzenia:", "LabelBirthYear": "Rok urodzenia:", - "LabelBlastMessageInterval": "Częstotliwość komunikatów o dostępności (sekundy)", + "LabelBlastMessageInterval": "Częstotliwość komunikatów o dostępności", "LabelBlastMessageIntervalHelp": "Określa częstotliwość, wyrażoną w sekundach, przesyłania komunikatów o dostępności serwera.", "LabelBlockContentWithTags": "Blokuj pozycje ze znacznikami:", "LabelBurnSubtitles": "Wypalaj napisy:", @@ -548,14 +487,12 @@ "LabelCustomCertificatePath": "Folder niestandardowego certyfikatu SSL:", "LabelCustomCertificatePathHelp": "Ścieżka do pliku PKCS #12, zawierającego certyfikat i klucz prywatny, niezbędny do aktywowana obsługi TLS dla własnej domeny.", "LabelCustomCss": "Niestandardowy CSS:", - "LabelCustomCssHelp": "Zastosuj własny niestandardowy arkusz stylów CSS dla interfejsu webowego.", - "LabelCustomDeviceDisplayName": "Nazwa wyświetlana:", + "LabelCustomCssHelp": "Zastosuj własne niestandardowe arkusze stylów dla interfejsu webowego.", "LabelCustomDeviceDisplayNameHelp": "Dostarcz własną nazwę wyświetlania lub zostaw puste i użyj nazwy dostarczonej przez urządzenie.", "LabelCustomRating": "Kategoria wiekowa własna:", - "LabelDashboardTheme": "Motyw kokpitu serwera:", "LabelDateAdded": "Data dodania:", "LabelDateAddedBehavior": "Data dodania dla nowej zawartości:", - "LabelDateAddedBehaviorHelp": "Jeśli istnieją metadane będą one użyte zawsze przed którąkolwiek z tych opcji.", + "LabelDateAddedBehaviorHelp": "Jeśli istnieją metadane, będą one zawsze użyte przed którąkolwiek z tych opcji.", "LabelDateTimeLocale": "Strefa czasowa:", "LabelDay": "Dzień:", "LabelDeathDate": "Data śmierci:", @@ -567,7 +504,6 @@ "LabelDiscNumber": "Numer dysku:", "LabelDisplayLanguage": "Język interfejsu:", "LabelDisplayLanguageHelp": "Tłumaczenie Jellyfin to projekt, który ciągle trwa.", - "LabelDisplayMissingEpisodesWithinSeasons": "Wyświetlaj w sezonach brakujące odcinki", "LabelDisplayMode": "Tryb wyświetlania:", "LabelDisplayName": "Nazwa wyświetlana:", "LabelDisplayOrder": "Kolejność wyświetlania:", @@ -584,8 +520,8 @@ "LabelEnableAutomaticPortMapHelp": "Umożliwia automatyczne przekierowanie publicznego portu na twoim ruterze do lokalnego portu na serwerze przy użyciu UPnP. Ta opcja może nie działać z niektórymi modelami ruterów lub w niektórych konfiguracjach sieci. Zmiany zaczną działać po ponownym uruchomieniu serwera.", "LabelEnableBlastAliveMessages": "Przesyłaj komunikaty o dostępności", "LabelEnableBlastAliveMessagesHelp": "Aktywuj tę funkcję, jeśli serwer nie jest odpowiednio wykrywany przez inne urządzenia UPnP w twojej sieci.", - "LabelEnableDlnaClientDiscoveryInterval": "Częstotliwość wykrywania klientów (sekundy)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Określa czas w sekundach, pomiędzy wyszukiwaniami SSDP, wykonywanymi przez Jellyfin.", + "LabelEnableDlnaClientDiscoveryInterval": "Częstotliwość wykrywania klientów", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Określa czas w sekundach, pomiędzy wyszukiwaniami SSDP.", "LabelEnableDlnaDebugLogging": "Rejestruj komunikaty diagnostyczne DLNA", "LabelEnableDlnaDebugLoggingHelp": "Tworzenie ogromnych plików dziennika diagnostycznego powinno być używane tylko w przypadku rozwiązywania problemów.", "LabelEnableDlnaPlayTo": "Aktywuj funkcję DLNA Play To", @@ -594,7 +530,7 @@ "LabelEnableDlnaServerHelp": "Umożliwia urządzeniom UPnP w sieci domowej, na przeglądanie i odtwarzanie zawartości.", "LabelEnableHardwareDecodingFor": "Aktywuj dekodowanie sprzętowe dla:", "LabelEnableRealtimeMonitor": "Monitoruj w czasie rzeczywistym", - "LabelEnableRealtimeMonitorHelp": "Na obsługiwanych systemach plików, zmiany zostaną przetworzone natychmiast.", + "LabelEnableRealtimeMonitorHelp": "Na obsługiwanych systemach plików zmiany zostaną przetworzone natychmiast.", "LabelEnableSingleImageInDidlLimit": "Ograniczaj do jednego wbudowanego obrazu", "LabelEnableSingleImageInDidlLimitHelp": "Niektóre urządzenie nie pokarzą prawidłowo wielu obrazów z Didl.", "LabelEndDate": "Data zakończenia:", @@ -609,9 +545,9 @@ "LabelFont": "Czcionka:", "LabelForgotPasswordUsernameHelp": "Podaj nazwę użytkownika, jeśli pamiętasz.", "LabelFriendlyName": "Przyjazna nazwa:", - "LabelServerNameHelp": "Ta nazwa będzie użyta do identyfikacji serwera, domyślnie użyta będzie nazwa komputera.", + "LabelServerNameHelp": "Ta nazwa będzie użyta do identyfikacji serwera, domyślnie użyta będzie nazwa serwera.", "LabelGroupMoviesIntoCollections": "Grupuj filmy w kolekcje", - "LabelGroupMoviesIntoCollectionsHelp": "Podczas wyświetlania listy filmów, filmy należące do kolekcji będą wyświetlone jako jedna zgrupowana pozycja.", + "LabelGroupMoviesIntoCollectionsHelp": "Podczas wyświetlania list filmów, filmy w kolekcji będą wyświetlane jako jedna zgrupowana pozycja.", "LabelH264Crf": "CRF kodowania H264:", "LabelEncoderPreset": "Szablon kodowania H264:", "LabelHardwareAccelerationType": "Akceleracja sprzętowa:", @@ -619,7 +555,7 @@ "LabelHomeNetworkQuality": "Jakość dla sieci lokalnej:", "LabelHomeScreenSectionValue": "Sekcja ekranu startowego {0}:", "LabelHttpsPort": "Lokalny numer portu HTTPS:", - "LabelHttpsPortHelp": "Numer portu TCP w trybie HTTPS, na którym serwer Jellyfin ma być dostępny.", + "LabelHttpsPortHelp": "Numer portu TCP dla serwera HTTPS.", "LabelIconMaxHeight": "Maksymalna wysokość ikon:", "LabelIconMaxHeightHelp": "Maksymalna rozdzielczość ikon wystawianych przez upnp:icon.", "LabelIconMaxWidth": "Maksymalna szerokość ikony:", @@ -647,7 +583,7 @@ "LabelLanguage": "Język:", "LabelLineup": "Kolejka:", "LabelLocalHttpServerPortNumber": "Lokalny numer portu HTTP:", - "LabelLocalHttpServerPortNumberHelp": "Numer portu TCP w trybie HTTP, na którym serwer Jellyfin ma być dostępny.", + "LabelLocalHttpServerPortNumberHelp": "Numer portu TCP dla serwera HTTP.", "LabelLockItemToPreventChanges": "Zablokuj tę pozycję, aby zapobiec przyszłym zmianom", "LabelLoginDisclaimer": "Zastrzeżenie odpowiedzialności:", "LabelLoginDisclaimerHelp": "Wiadomość będzie wyświetlona na dole strony logowania.", @@ -673,7 +609,7 @@ "LabelMetadataReaders": "Czytnik metadanych:", "LabelMetadataReadersHelp": "Określ swój priorytet dla źródeł metadanych. Pierwszy znaleziony plik będzie odczytany.", "LabelMetadataSavers": "Zapisywanie metadanych:", - "LabelMetadataSaversHelp": "Wybierz formaty plików używane do zapisywania metadanych.", + "LabelMetadataSaversHelp": "Wybierz formaty plików używane do zapisywania Twoich metadanych.", "LabelMethod": "Metoda:", "LabelMinBackdropDownloadWidth": "Minimalna szerokość pobieranych fototapet:", "LabelMinResumeDuration": "Minimalny czas wznowienia:", @@ -689,7 +625,7 @@ "LabelMovieCategories": "Kategorie filmowe:", "LabelMoviePrefix": "Prefiks filmu:", "LabelMoviePrefixHelp": "Jeśli stosujesz prefiksy dla tytułów filmów, wprowadź go tutaj, aby serwer mógł je obsługiwać prawidłowo.", - "LabelMovieRecordingPath": "Folder nagrywania filmów (opcjonalne):", + "LabelMovieRecordingPath": "Folder nagrywania filmów:", "LabelMusicStreamingTranscodingBitrate": "Przepływność transkodowania muzyki:", "LabelMusicStreamingTranscodingBitrateHelp": "Określa maksymalny bitrate podczas strumieniowania muzyki.", "LabelName": "Nazwa:", @@ -697,13 +633,12 @@ "LabelNewPassword": "Nowe hasło:", "LabelNewPasswordConfirm": "Potwierdź nowe hasło:", "LabelNewsCategories": "Kategorie informacyjne:", - "LabelNext": "Dalej", "LabelNotificationEnabled": "Aktywuj to powiadomienie", "LabelNumber": "Numer:", "LabelNumberOfGuideDays": "Liczba dni pobieranych danych przewodnika:", "LabelNumberOfGuideDaysHelp": "Pobieranie większej liczby dni danych przewodnika, pozwoli na zaplanowanie zadań na dłuższy okres i wyświetlanie większej listy, ale wydłuży także czas na jego pobranie. Automatycznie wybierze na podstawie liczby kanałów.", - "LabelOptionalNetworkPath": "(Opcjonalne) Udostępniony folder sieciowy:", - "LabelOptionalNetworkPathHelp": "Jeśli folder jest udostępniony w sieci domowej, podanie jego ścieżki, umożliwi bezpośrednie odtwarzanie na innych urządzeniach. Na przykład, {0} lub {1}.", + "LabelOptionalNetworkPath": "Udostępniony folder sieciowy:", + "LabelOptionalNetworkPathHelp": "Jeśli ten folder jest udostępniony w sieci, podanie ścieżki udziału sieciowego może umożliwić klientom na innych urządzeniach bezpośredni dostęp do plików multimedialnych. Na przykład {0} lub {1}.", "LabelOriginalAspectRatio": "Oryginalny format obrazu:", "LabelOriginalTitle": "Tytuł oryginalny:", "LabelOverview": "Opis:", @@ -722,9 +657,7 @@ "LabelPostProcessorArguments": "Argumenty linii poleceń dla aplikacji przetwarzania:", "LabelPostProcessorArgumentsHelp": "Skorzystaj z wypełniacza {path} jako folder pliku nagrania.", "LabelPreferredDisplayLanguage": "Preferowany język interfejsu:", - "LabelPreferredDisplayLanguageHelp": "Tłumaczenie Jellyfin to projekt w ciągłym rozwoju.", "LabelPreferredSubtitleLanguage": "Preferowany język napisów:", - "LabelPrevious": "Wstecz", "LabelProfileAudioCodecs": "Kodeki audio:", "LabelProfileCodecs": "Kodeki:", "LabelProfileCodecsHelp": "Oddzielone przecinkiem. Zostaw puste aby zastosować wszystkie kodeki.", @@ -738,7 +671,6 @@ "LabelPublicHttpPortHelp": "Publiczny numer portu na który ma być zmapowany lokalny port HTTP.", "LabelPublicHttpsPort": "Publiczny numer portu HTTPS:", "LabelPublicHttpsPortHelp": "Publiczny numer portu na który ma być zmapowany lokalny port HTTPS.", - "LabelReadHowYouCanContribute": "Dowiedz się jak możesz pomóc.", "LabelReasonForTranscoding": "Powód transkodowania:", "LabelRecord": "Nagraj:", "LabelRecordingPath": "Folder domyślny nagrań:", @@ -747,7 +679,7 @@ "LabelReleaseDate": "Data wydania:", "LabelRemoteClientBitrateLimit": "Limit przepływności transmisji (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Opcjonalny limit przepływności transmisji dla urządzeń poza siecią domową. Używaj tej opcji, w celu zapobiegania żądaniom o wyższe przepływności, niż Twojej połączenie internetowe może obsłużyć.", - "LabelRuntimeMinutes": "Czas (w minutach):", + "LabelRuntimeMinutes": "Czas trwania:", "LabelSaveLocalMetadata": "Zapisuj grafiki w folderach mediów", "LabelSaveLocalMetadataHelp": "Umożliwia zapisywanie grafik i bezpośrednio w folderach mediów, co umożliwia ich łatwą edycję.", "LabelScheduledTaskLastRan": "Ostatnio uruchomiono {0}, czas trwania {1}.", @@ -759,11 +691,10 @@ "LabelSelectVersionToInstall": "Wybierz wersję do instalacji:", "LabelSendNotificationToUsers": "Wyślij powiadomienie do:", "LabelSerialNumber": "Numer seryjny", - "LabelSeriesRecordingPath": "Folder nagrywania seriali (opcjonalne):", + "LabelSeriesRecordingPath": "Folder nagrywania seriali:", "LabelServerHost": "Serwer:", "LabelServerHostHelp": "192.168.1.100:8096 or https://myserver.com", "LabelSimultaneousConnectionLimit": "Limit jednoczesnych transmisji:", - "LabelSkin": "Skóra:", "LabelSkipBackLength": "Długość skoku wstecz:", "LabelSkipForwardLength": "Długość skoku wprzód:", "LabelSkipIfAudioTrackPresent": "Pomijaj, jeżeli domyślna ścieżka dźwiękowa jest w języku pobierania", @@ -775,7 +706,6 @@ "LabelSortBy": "Sortuj po:", "LabelSortOrder": "Porządek sortowania:", "LabelSortTitle": "Tytuł sortowania:", - "LabelSoundEffects": "Efekty dźwiękowe:", "LabelSource": "Źródło:", "LabelSpecialSeasonsDisplayName": "Nazwa sezonu odcinków specjalnych:", "LabelSportsCategories": "Kategorie wydarzeń sportowych:", @@ -786,7 +716,6 @@ "LabelSubtitleDownloaders": "Dostawcy napisów:", "LabelSubtitleFormatHelp": "Przykład: srt", "LabelSubtitlePlaybackMode": "Tryb napisów:", - "LabelSubtitles": "Napisy", "LabelSupportedMediaTypes": "Obsługiwane typy mediów:", "LabelTVHomeScreen": "Ekran startowy trybu telewizyjnego:", "LabelTag": "Znacznik:", @@ -799,12 +728,9 @@ "LabelTimeLimitHours": "Limit czasu (godziny):", "LabelTitle": "Tytuł:", "LabelTrackNumber": "Numer utworu:", - "LabelTranscodingAudioCodec": "Kodek audio:", - "LabelTranscodingContainer": "Kontener:", "LabelTranscodingTempPathHelp": "Podaj niestandardową ścieżkę dla plików transkodowanych udostępnianych klientom. Pozostaw puste, aby użyć domyślnych ustawień serwera.", "LabelTranscodingThreadCount": "Liczba wątków transkodowania:", "LabelTranscodingThreadCountHelp": "Wybierz maksymalną liczbę wątków dla transkodowania. Ograniczenie ich liczby, obniży poziom użycia procesora, ale może niekorzystnie wpłynąć na płynność odtwarzania.", - "LabelTranscodingVideoCodec": "Kodek wideo:", "LabelTriggerType": "Typ wyzwalacza:", "LabelTunerIpAddress": "Adres IP dekodera:", "LabelTunerType": "Typ tunera:", @@ -827,18 +753,16 @@ "LabelXDlnaCapHelp": "Określa zawartość elementu X_DLNACAP w przestrzeni nazw urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDocHelp": "Określa zawartość elementu X_DLNADOC w przestrzeni nazw urn:schemas-dlna-org:device-1-0.", "LabelYear": "Rok:", - "LabelYourFirstName": "Twoje imię:", "LabelYoureDone": "Zakończono!", "LabelZipCode": "Kod pocztowy:", "LabelffmpegPath": "Folder aplikacji FFmpeg:", - "LabelffmpegPathHelp": "Określa folder aplikacji FFmpeg lub folder zawierający FFmpeg.", + "LabelffmpegPathHelp": "Określa folder aplikacji ffmpeg lub folder zawierający ffmpeg.", "LanNetworksHelp": "Lista adresów IP lub adresów IP z maską podsieci dla całych sieci, rozdzielana przecinkami, które będą traktowane jako sieć lokalna w trakcie egzekwowania ograniczeń przepustowości. Jeśli zostanie wypełniona, wszystkie pozostałe adresy będą traktowane jako sieć zewnętrzna i będą podlegać ograniczeniom przepustowości. Jeśli zostanie pusta, tylko podsieć, w której znajduje się serwer, będzie traktowana jako sieć lokalna.", "Large": "Duży", "LatestFromLibrary": "{0} ostatnio dodane", "LearnHowYouCanContribute": "Dowiedz się jak możesz pomóc.", "LibraryAccessHelp": "Wybierz biblioteki udostępniane temu użytkownikowi. Administratorzy będą mogli edytować wszystkie foldery używając menedżera metadanych.", "Like": "Lubię", - "LinksValue": "Łącza: {0}", "List": "Lista", "Live": "Na żywo", "LiveBroadcasts": "Transmisje na żywo", @@ -882,20 +806,19 @@ "MessageConfirmProfileDeletion": "Czy na pewno chcesz usunąć ten profil?", "MessageConfirmRecordingCancellation": "Anulować nagranie?", "MessageConfirmRemoveMediaLocation": "Czy na pewno chcesz usunąć tę lokalizację?", - "MessageConfirmRestart": "Czy na pewno chcesz uruchomić serwer Jellyfin ponownie?", - "MessageConfirmRevokeApiKey": "Czy na pewno chcesz unieważnić klucz api? Połączenia aplikacji z serwerem Jellyfin zostaną natychmiastowo zakończone.", + "MessageConfirmRestart": "Czy na pewno chcesz uruchomić Jellyfin ponownie?", + "MessageConfirmRevokeApiKey": "Czy na pewno chcesz unieważnić klucz API? Połączenia aplikacji z serwerem zostaną natychmiastowo zakończone.", "MessageConfirmShutdown": "Czy na pewno chcesz zamknąć serwer?", "MessageContactAdminToResetPassword": "W celu wyczyszczenia hasła. skontaktuj się z administratorem systemu.", "MessageCreateAccountAt": "Utwórz konto na {0}", "MessageDeleteTaskTrigger": "Czy na pewno chcesz usunąć ten wyzwalacz zadania?", - "MessageDirectoryPickerBSDInstruction": "W wypadku BSD, należy skonfigurować oprogramowanie FreeNAS aby umożliwić serwerowi Jellyfin dostęp do danych.", + "MessageDirectoryPickerBSDInstruction": "W wypadku BSD, należy skonfigurować oprogramowanie FreeNAS aby umożliwić Jellyfin dostęp do danych.", "MessageDirectoryPickerLinuxInstruction": "Dla Linuxa dystrybucji Arch Linux, CentOS, Debian, Fedora, openSUSE albo Ubuntu, musisz uzyskać dla użytkownika Jellyfin uprawnienia przynajmniej do odczytu pamięci masowej.", "MessageDownloadQueued": "Dodano do kolejki pobierania.", "MessageEnablingOptionLongerScans": "Aktywowanie tej opcji może spowodować znaczne wydłużenie czasu skanowania biblioteki.", "MessageFileReadError": "Podczas wczytywania plików wystąpił błąd. Spróbuj ponownie później.", "MessageForgotPasswordFileCreated": "Plik zawierający instrukcje z dalszymi krokami został utworzony na serwerze:", "MessageForgotPasswordInNetworkRequired": "Spróbuj ponownie zainicjować czyszczenie hasła, tym razem używając swojej sieci domowej.", - "MessageInstallPluginFromApp": "Wtyczka musi być zainstalowana bezpośrednio z aplikacji, w której ma być używana.", "MessageInvalidForgotPasswordPin": "Nieprawidłowy lub wygasły PIN został wpisany. Proszę spróbować ponownie.", "MessageInvalidUser": "Nieprawidłowa nazwa użytkownika lub hasło. Spróbuj ponownie.", "MessageItemSaved": "Obiekt zapisany.", @@ -911,16 +834,15 @@ "MessagePleaseEnsureInternetMetadata": "Upewnij się, że pobieranie metadanych z internetu jest aktywne.", "MessagePleaseWait": "Proszę czekać. To może potrwać chwilę.", "MessagePluginConfigurationRequiresLocalAccess": "Aby skonfigurować ten plugin zaloguj się bezpośrednio do lokalnego serwera.", - "MessagePluginInstallDisclaimer": "Wtyczki tworzone przez członków społeczności Jellyfin są doskonałym sposobem, aby zwiększyć swoje przeżycia z dodatkowymi funkcjami i zaletami Jellyfin. Przed instalacją należy zdawać sobie sprawę jakie efekty mogą mieć na twój serwer Jellyfin, takie jak dłuższy skan biblioteki, dodatkowe przetwarzanie w tle, a także obniżenie stabilności systemu.", + "MessagePluginInstallDisclaimer": "Wtyczki stworzone przez członków społeczności to świetny sposób na ulepszenie Twojego doświadczenia dzięki dodatkowym funkcjom i korzyściom. Przed instalacją zwróć uwagę na skutki, jakie mogą mieć na serwerze, takie jak dłuższe skanowanie bibliotek, dodatkowe przetwarzanie w tle i zmniejszona stabilność systemu.", "MessageReenableUser": "Zobacz poniżej aby aktywować ponownie", - "MessageSettingsSaved": "Ustawienia zapisane.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Następujące lokalizacje mediów zostaną usunięte z twojej biblioteki:", "MessageUnableToConnectToServer": "Połączenie z wybranym serwerem jest teraz niemożliwe. Upewnij się, że jest uruchomiony i spróbuj ponownie.", "MessageUnsetContentHelp": "Zawartość będzie wyświetlana jako proste foldery. W celu uzyskania najlepszych wyników, użyj menadżera metadanych do ustawienia typu zawartości podfolderów.", "MessageYouHaveVersionInstalled": "Masz aktualnie zainstalowaną wersję {0}.", "Metadata": "Metadane", "MetadataManager": "Menedżer metadanych", - "MetadataSettingChangeHelp": "Zmiana ustawień metadanych wpłynie na nową treść, która będzie dodawana w przyszłości. W celu odświeżenia istniejącej zawartości, otwórz ekran szczegółów, a następnie naciśnij przycisk Odśwież lub wykonaj odświeżanie wsadowe, korzystając z menedżera metadanych.", + "MetadataSettingChangeHelp": "Zmiana ustawień metadanych wpłynie na nowe treści dodane w przyszłości. Aby odświeżyć istniejącą zawartość, otwórz ekran szczegółów i kliknij przycisk odświeżania lub przeprowadź zbiorcze odświeżanie za pomocą menedżera metadanych.", "MinutesAfter": "minut po", "MinutesBefore": "minut przed", "Mobile": "Telefon", @@ -945,10 +867,9 @@ "NextUp": "Do obejrzenia", "No": "Nie", "NoNewDevicesFound": "Nie znaleziono żadnych nowych urządzeń. Aby dodać tuner, zamknij ten dialog i wprowadź informacje o urządzeniu ręcznie.", - "NoNextUpItemsMessage": "Nie znaleziono niczego. Zacznij oglądać swoje seriale!", - "NoPluginConfigurationMessage": "Ta wtyczka nie ma żadnych ustawień.", + "MessageNoNextUpItems": "Nie znaleziono niczego. Zacznij oglądać swoje seriale!", + "MessageNoPluginConfiguration": "Ta wtyczka nie ma żadnych ustawień.", "NoSubtitleSearchResultsFound": "Brak wyników wyszukiwania.", - "NoSubtitles": "Brak", "NoSubtitlesHelp": "Domyślnie napisy nie będą wczytywane. Można je ciągle włączyć ręcznie podczas odtwarzania.", "None": "Brak", "Normal": "Normalny", @@ -968,7 +889,7 @@ "OptionAllowLinkSharingHelp": "Tylko strony zawierające informacje o mediach są udostępnione. Media nigdy nie są udostępniane publicznie. Udostępnienia są ograniczone czasowo i wygasną po {0} dniach.", "OptionAllowManageLiveTv": "Zezwalaj na zarządzanie nagrywaniem telewizji", "OptionAllowMediaPlayback": "Zezwalaj na odtwarzanie mediów", - "OptionAllowMediaPlaybackTranscodingHelp": "Ograniczenie dostępu do transkodowania może powodować awarie odtwarzania w aplikacji Jellyfin, z powodu nieobsługiwanych formatów mediów.", + "OptionAllowMediaPlaybackTranscodingHelp": "Ograniczenie dostępu do transkodowania może spowodować błędy odtwarzania na klientach z powodu nieobsługiwanych formatów multimediów.", "OptionAllowRemoteControlOthers": "Zezwalaj na zdalne sterowanie innymi użytkownikami", "OptionAllowRemoteSharedDevices": "Zezwalaj na zdalne sterowanie urządzeniami współdzielonymi", "OptionAllowRemoteSharedDevicesHelp": "Urządzenia DLNA są uważane za udostępnione, dopóki użytkownik nie zacznie ich kontrolować.", @@ -979,9 +900,8 @@ "OptionArtist": "Wykonawca", "OptionAscending": "Rosnąco", "OptionAuto": "Automatycznie", - "OptionAutomatic": "Automatycznie", "OptionAutomaticallyGroupSeries": "Scalaj seriale znajdujące się w wielu folderach", - "OptionAutomaticallyGroupSeriesHelp": "Umożliwia automatyczne scalanie seriali, rozproszonych w wielu folderach biblioteki, w pojedyncze seriale.", + "OptionAutomaticallyGroupSeriesHelp": "Serie rozmieszczone w wielu folderach w tej bibliotece zostaną automatycznie połączone w jedną serię.", "OptionBlockBooks": "Książki", "OptionBlockChannelContent": "Kanały internetowe", "OptionBlockLiveTvChannels": "Kanały telewizyjne", @@ -1001,7 +921,7 @@ "OptionDatePlayed": "Data odtwarzania", "OptionDescending": "Malejąco", "OptionDisableUser": "Deaktywuj tego użytkownika", - "OptionDisableUserHelp": "Jeśli aktywne, serwer nie pozwoli na żadne połączenia tego użytkownika. Aktywne połączenia zostaną natychmiastowo zerwane.", + "OptionDisableUserHelp": "Serwer nie zezwoli na żadne połączenia od tego użytkownika. Istniejące połączenia zostaną nagle przerwane.", "OptionDislikes": "Nie Lubie", "OptionDisplayFolderView": "Wyświetlaj widok folderów z listą foldery mediów", "OptionDisplayFolderViewHelp": "Wyświetl foldery obok innych bibliotek multimediów. Może to być przydatne, jeśli chcesz mieć prosty widok folderu.", @@ -1011,7 +931,7 @@ "OptionDownloadBoxImage": "Pudełko", "OptionDownloadDiscImage": "Dysk", "OptionDownloadImagesInAdvance": "Pobieraj obrazy z wyprzedzeniem", - "OptionDownloadImagesInAdvanceHelp": "Domyślnie, większość obrazów jest pobierana tylko kiedy jest wymagana przez aplikacje Jellyfin. Aktywuj tę opcję, aby pobierać wszystkie obrazy z wyprzedzeniem, podczas importowania multimediów. Może powodować znacząco dłuższe skanowanie biblioteki.", + "OptionDownloadImagesInAdvanceHelp": "Domyślnie większość obrazów jest pobierana tylko na żądanie klienta. Włącz tę opcję, aby pobierać wszystkie obrazy z wyprzedzeniem podczas importowania nowych multimediów. Może to spowodować znacznie dłuższe skanowanie biblioteki.", "OptionDownloadPrimaryImage": "Podstawowy", "OptionDownloadThumbImage": "Miniatura", "OptionDvd": "DVD", @@ -1031,7 +951,6 @@ "OptionExternallyDownloaded": "Pobieranie zewnętrzne", "OptionExtractChapterImage": "Wydobywaj obrazy rozdziałów", "OptionFavorite": "Ulubione", - "OptionFriday": "Piątek", "OptionHasSpecialFeatures": "Funkcje Specjalne", "OptionHasSubtitles": "Napisy", "OptionHasThemeSong": "Piosenka Przewodnia", @@ -1042,22 +961,20 @@ "OptionHlsSegmentedSubtitles": "Napisy dostosowane do HLS", "OptionHomeVideos": "Zdjęcia", "OptionIgnoreTranscodeByteRangeRequests": "Ignoruj żądanie zakresu byte transkodowania", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Jeżeli włączone, te żądania będą uznane ale będzie ignorowany nagłówek zakresu byte.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Te żądania będą uznane ale będzie ignorowany nagłówek zakresu byte.", "OptionImdbRating": "Ocena IMDb", "OptionLikes": "Lubie", "OptionMax": "Maksymalny", "OptionMissingEpisode": "Brakujące Odcinki", - "OptionMonday": "Poniedziałek", "OptionNameSort": "Nazwa", "OptionNew": "Nowa…", "OptionNone": "Brak", - "OptionOnAppStartup": "Podczas uruchomienia aplikacji", "OptionOnInterval": "Cyklicznie", "OptionParentalRating": "Kategoria wiekowa", "OptionPlainStorageFolders": "Wyświetlaj wszystkie foldery jako zwyczajne foldery", - "OptionPlainStorageFoldersHelp": "Jeżeli aktywne, wszystkie foldery są reprezentowane w DIDL jako \"object.container.storageFolder\" zamiast bardziej dokładnych typów takich jak \"object.container.person.musicArtist\".", + "OptionPlainStorageFoldersHelp": "Wszystkie foldery są reprezentowane w DIDL jako „object.container.storageFolder” zamiast bardziej konkretnego typu, takiego jak „object.container.person.musicArtist”.", "OptionPlainVideoItems": "Wyświetlaj wszystkie wideo jako zwyczajne pozycje", - "OptionPlainVideoItemsHelp": "Jeżeli aktywne, wszystkie wideo są reprezentowane w DIDL jako \"object.item.videoitem\" zamiast bardziej dokładnych typów takich jak \"object.item.videoitem.movie\".", + "OptionPlainVideoItemsHelp": "Wszystkie wideo są reprezentowane w DIDL jako \"object.item.videoitem\" zamiast bardziej dokładnych typów takich jak \"object.item.videoitem.movie\".", "OptionPlayCount": "Liczba odtworzeń", "OptionPlayed": "Obejrzany", "OptionPremiereDate": "Data premiery", @@ -1076,20 +993,15 @@ "OptionResElement": "Element res", "OptionResumable": "Do wznowienia", "OptionRuntime": "Długość filmu", - "OptionSaturday": "Sobota", "OptionSaveMetadataAsHidden": "Zapisuj metadane i obrazy jako pliki ukryte", - "OptionSaveMetadataAsHiddenHelp": "Zmiana ta będzie miała zastosowanie do nowych metadanych zapisanych w przyszłości. Istniejące pliki metadanych zostaną zaktualizowane przy następnym zapisie przez serwer Jellyfin.", + "OptionSaveMetadataAsHiddenHelp": "Zmiana ta będzie miała zastosowanie do nowych metadanych zapisanych w przyszłości. Istniejące pliki metadanych zostaną zaktualizowane przy następnym zapisie przez serwer.", "OptionSpecialEpisode": "Specjalne", "OptionSubstring": "Podwyrażenie", - "OptionSunday": "Niedziela", - "OptionThursday": "Czwartek", "OptionTrackName": "Nazwa utworu", - "OptionTuesday": "Wtorek", "OptionTvdbRating": "Ocena TVDB", "OptionUnairedEpisode": "Odcinki o planowanej emisji", "OptionUnplayed": "Nieobejrzany", "OptionWakeFromSleep": "Wybudź z uspienia", - "OptionWednesday": "Środa", "OptionWeekdays": "Dni Tygodnia", "OptionWeekends": "Weekendy", "OptionWeekly": "Cotygodniowo", @@ -1102,7 +1014,7 @@ "PasswordMatchError": "Hasło i potwierdzenie hasła muszą się zgadzać.", "PasswordResetComplete": "Hasło zostało zresetowane.", "PasswordResetConfirmation": "Czy na pewno chcesz wyczyścić hasło?", - "PasswordResetHeader": "Wyczyść hasło", + "HeaderResetPassword": "Wyczyść hasło", "PasswordSaved": "Hasło zapisane.", "People": "Osoby", "PerfectMatch": "Perfekcyjne dopasowanie", @@ -1122,9 +1034,9 @@ "PleaseAddAtLeastOneFolder": "Dodaj co najmniej jeden folder do tej biblioteki, klikając przycisk Dodaj.", "PleaseConfirmPluginInstallation": "Kliknij OK aby potwierdzić, iż zapoznałeś się z powyższym i chcesz zainstalować plugin.", "PleaseEnterNameOrId": "Proszę wprowadź nazwę lub zewnętrzne ID.", - "PleaseRestartServerName": "Uruchom ponownie serwer Jellyfin - {0}.", + "PleaseRestartServerName": "Uruchom ponownie Jellyfin na {0}.", "PleaseSelectTwoItems": "Proszę wybierz przynajmniej dwie pozycje.", - "PluginInstalledMessage": "Wtyczka została poprawnie zainstalowana. Serwer Jellyfin będzie wymagała ponownego uruchomienia w celu zastosowania zmian.", + "MessagePluginInstalled": "Wtyczka została poprawnie zainstalowana. Serwer będzie wymagała ponownego uruchomienia w celu zastosowania zmian.", "PreferEmbeddedTitlesOverFileNames": "Preferuj wbudowane tytuły zamiast nazw plików", "PreferEmbeddedTitlesOverFileNamesHelp": "Określa domyślnie wyświetlany tytuł, gdy brak dostępnych metadanych lokalnych i od dostawców internetowych.", "Premiere": "Premiera", @@ -1135,7 +1047,6 @@ "ProductionLocations": "Kraje", "Programs": "Programy", "Quality": "Jakość", - "QueueAllFromHere": "Kolejkuj wszystko z tej lokalizacji", "Raised": "Wypukły", "Rate": "Oceń", "RecentlyWatched": "Ostatnio obejrzane", @@ -1146,11 +1057,11 @@ "Record": "Nagrywaj", "RecordSeries": "Nagraj seryjnie", "RecordingCancelled": "Anulowano nagranie.", - "RecordingPathChangeMessage": "Zmiana folderu z nagraniami nie spowoduje przeniesienia już istniejących nagrań, ze starej lokalizacji do nowej. Jeśli jest to wymagane, należy to zrobić manualnie.", + "MessageChangeRecordingPath": "Zmiana folderu z nagraniami nie spowoduje przeniesienia już istniejących nagrań, ze starej lokalizacji do nowej. Jeśli jest to wymagane, należy to zrobić manualnie.", "RecordingScheduled": "Zaplanowano nagranie.", "Recordings": "Nagrania", "Refresh": "Odśwież", - "RefreshDialogHelp": "Metadane są odświeżane w oparciu o ustawienia i dostawców internetowych, aktywowanych w kokpicie serwera Jellyfin.", + "RefreshDialogHelp": "Metadane są odświeżane na podstawie ustawień i usług internetowych włączonych na pulpicie nawigacyjnym.", "RefreshMetadata": "Odśwież metadane", "RefreshQueued": "Odświeżanie dodane do kolejki zadań.", "ReleaseDate": "Data wydania", @@ -1166,7 +1077,6 @@ "ReplaceExistingImages": "Zastępuj istniejące obrazy", "ResumeAt": "Wznów odtwarzanie od {0}", "Rewind": "Do tyłu", - "RunAtStartup": "Uruchamiaj po starcie", "Runtime": "Czas trwania", "Saturday": "Sobota", "Save": "Zapisz", @@ -1189,10 +1099,10 @@ "SeriesRecordingScheduled": "Zaplanowano nagranie seryjne.", "SeriesSettings": "Ustawienia nagrywania serialu", "SeriesYearToPresent": "{0} - Teraz", - "ServerNameIsRestarting": "Jellyfin Server - {0} jest uruchamiany ponownie.", - "ServerNameIsShuttingDown": "Serwer Jellyfin - {0} jest zamykany.", - "ServerRestartNeededAfterPluginInstall": "Serwer Jellyfin będzie wymagał ponownego uruchomienia po zainstalowaniu wtyczki.", - "ServerUpdateNeeded": "Ten serwer Jellyfin wymaga aktualizacji. Aby pobrać najnowszą wersję, odwiedź stronę {0}", + "ServerNameIsRestarting": "Server za {0} zostanie uruchamiony ponownie.", + "ServerNameIsShuttingDown": "Serwer za {0} zostanie wyłączony.", + "ServerRestartNeededAfterPluginInstall": "Jellyfin będzie wymagał ponownego uruchomienia po zainstalowaniu wtyczki.", + "ServerUpdateNeeded": "Ten serwer wymaga aktualizacji. Aby pobrać najnowszą wersję, odwiedź stronę {0}", "Settings": "Ustawienia", "SettingsSaved": "Ustawienia zapisane.", "SettingsWarning": "Zmiana tych wartości może spowodować niestabilność lub awarię połączenia. Jeśli wystąpią jakiekolwiek problemy, zalecamy powrót do ustawień ich na domyślne.", @@ -1230,58 +1140,29 @@ "TV": "Telewizor", "TabAccess": "Dostęp", "TabAdvanced": "Zaawansowane", - "TabAlbumArtists": "Wykonawcy albumów", - "TabAlbums": "Albumy", - "TabArtists": "Wykonawcy", "TabCatalog": "Katalog", - "TabChannels": "Kanały", "TabCodecs": "Kodeki", - "TabCollections": "Kolekcje", "TabContainers": "Kontenery", "TabDashboard": "Kokpit", - "TabDevices": "Urządzenia", "TabDirectPlay": "Odtwarzanie Bezposrednie", - "TabDisplay": "Wyświetlanie", - "TabEpisodes": "Odcinki", - "TabFavorites": "Ulubione", - "TabGenres": "Gatunki", - "TabGuide": "Przewodnik", - "TabInfo": "Informacje", "TabLatest": "Ostatnio dodane", - "TabLiveTV": "Telewizja", "TabLogs": "Dziennik zdarzeń", - "TabMetadata": "Metadane", - "TabMovies": "Filmy", "TabMusic": "Muzyka", - "TabMusicVideos": "Teledyski", "TabMyPlugins": "Zainstalowane", "TabNetworks": "Sieci", "TabNfoSettings": "Ustawienia NFO", "TabNotifications": "Powiadomienia", "TabOther": "Inne", "TabParentalControl": "Kontrola rodzicielska", - "TabPassword": "Hasło", - "TabPlayback": "Odtwarzanie", - "TabPlaylist": "Lista odtwarzania", - "TabPlaylists": "Listy odtwarzania", "TabPlugins": "Wtyczki", "TabProfile": "Profil", "TabProfiles": "Profile", - "TabRecordings": "Nagrania", "TabResponses": "Odpowiedzi", - "TabResumeSettings": "Wznawianie", "TabScheduledTasks": "Harmonogram zadań", - "TabSeries": "Seriale", "TabServer": "Serwer", "TabSettings": "Ustawienia", - "TabShows": "Seriale", - "TabSongs": "Utwory", "TabStreaming": "Transmitowanie", - "TabSuggestions": "Polecane", - "TabTrailers": "Zwiastuny", - "TabTranscoding": "Transkodowanie", "TabUpcoming": "Wkrótce", - "TabUsers": "Użytkownicy", "Tags": "Znaczniki", "TagsValue": "Znaczniki: {0}", "TellUsAboutYourself": "Opowiedz nam o sobie", @@ -1301,7 +1182,7 @@ "TvLibraryHelp": "Zapoznaj się z instrukcją{1} nazewnictwa seriali {0}.", "Uniform": "Jednolity", "UninstallPluginConfirmation": "Czy na pewno chcesz usunąć {0}?", - "UninstallPluginHeader": "Usuń wtyczkę", + "HeaderUninstallPlugin": "Usuń wtyczkę", "Unmute": "Dezaktywuj wyciszenie", "Unplayed": "Nieodtwarzane", "Unrated": "Nieokreślone", @@ -1331,7 +1212,6 @@ "ValueTimeLimitSingleHour": "Limit czasu: 1 godzina", "ValueVideoCodec": "Kodek wideo: {0}", "Vertical": "Wertykalny", - "VideoRange": "Zakres wideo", "ViewAlbum": "Podgląd albumu", "ViewPlaybackInfo": "Wyświetlaj informacje o odtwarzaniu", "Watched": "Obejrzany", @@ -1358,12 +1238,11 @@ "HeaderFavoriteArtists": "Ulubieni wykonawcy", "HeaderFavoriteSongs": "Ulubione utwory", "HeaderFavoriteVideos": "Ulubione Filmy", - "HeaderHome": "Strona główna", "LabelAuthProvider": "Dostawca autentykacji:", "LabelDynamicExternalId": "{0} Id:", "LabelFormat": "Format:", "LabelServerName": "Nazwa serwera:", - "AuthProviderHelp": "Wybierz dostawcę uwierzytelniania który ma być użyty do uwierzytelnienia hasła tego użytkownika.", + "AuthProviderHelp": "Wybierz dostawcę uwierzytelniania, który ma być użyty do uwierzytelnienia hasła tego użytkownika.", "LabelPasswordResetProvider": "Dostawca resetowania hasła:", "LabelTranscodePath": "Ścieżka Transkodowania:", "LabelTranscodes": "Transkodery:", @@ -1375,11 +1254,8 @@ "LabelWeb": "Sieć:", "LabelXDlnaCap": "Limit X-DLNA:", "LabelXDlnaDoc": "Dokumentacja X-DLNA:", - "LaunchWebAppOnStartup": "Uruchom aplikację w przeglądarce internetowej, gdy uruchomi się serwer Jellyfin", - "LaunchWebAppOnStartupHelp": "Otwóż aplikację internetową w domyślnej przeglądarce, gdy uruchomi się serwer. Nie nastąpi to w przypadku korzystania z funkcji ponownego uruchomienia serwera.", "LeaveBlankToNotSetAPassword": "Pozostaw puste, aby nie ustawiać hasła.", "Logo": "Logo", - "MediaInfoSoftware": "Oprogramowanie", "MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeData": "Dane", "MediaInfoStreamTypeEmbeddedImage": "Osadzony Obraz", @@ -1408,7 +1284,7 @@ "OptionPosterCard": "Karta plakatu", "OptionThumb": "Podgląd", "OptionThumbCard": "Karta miniatury", - "PasswordResetProviderHelp": "Wybierz dostawcę resetowania hasła, który będzie używany, gdy ten użytkownik zażąda zresetowania hasła", + "PasswordResetProviderHelp": "Wybierz dostawcę resetowania hasła, który będzie używany, gdy ten użytkownik zażąda resetowania hasła.", "PlaybackData": "Dane Odtwarzania", "SubtitleOffset": "Przesunięcie Napisów", "TabNetworking": "Łączność Sieciowa", @@ -1447,7 +1323,6 @@ "LabelPlayerDimensions": "Rozmiar odtwarzacza:", "LabelDroppedFrames": "Upuszczone klatki:", "LabelCorruptedFrames": "Uszkodzone klatki:", - "CopyStreamURLError": "Wystąpił błąd podczas kopiowania adresu URL.", "AskAdminToCreateLibrary": "Poproś administratora o stworzenie biblioteki.", "AllowFfmpegThrottlingHelp": "Kiedy transkodowanie lub remuxowanie dotrze wystarczająco daleko od aktualnej pozycji odtwarzania, zatrzymaj proces aby zużywać mniej zasobów. Jest to najbardziej użyteczne podczas oglądania bez częstego przeskakiwania. Wyłącz jeśli zaobserwujesz problemy z odtwarzaniem.", "AllowFfmpegThrottling": "Ograniczaj transkodowanie", @@ -1460,9 +1335,7 @@ "AlbumArtist": "Album artysty", "Album": "Album", "Person": "Osoba", - "OtherArtist": "Inny artysta", "Movie": "Film", - "MessageUnauthorizedUser": "Nie masz dostępu do zasobów serwera. Skontaktuj się z administratorem sieci, aby uzyskać więcej informacji.", "LabelLibraryPageSizeHelp": "Ustaw liczbę pozycji pokazywanych na stronie biblioteki. Ustaw 0, aby wyłączyć podział na strony.", "LabelLibraryPageSize": "Rozmiar strony biblioteki:", "LabelDeinterlaceMethod": "Metoda usuwania przeplotu:", @@ -1471,14 +1344,13 @@ "DeinterlaceMethodHelp": "Wybierz metodę usuwania przeplotu używaną podczas transkodowania.", "ClientSettings": "Ustawienia klienta", "ButtonTogglePlaylist": "Playlista", - "ButtonToggleContextMenu": "Więcej", "ButtonSyncPlay": "SyncPlay", "ClearQueue": "Wyczyść kolejkę", "StopPlayback": "Zatrzymaj odtwarzanie", "ButtonPlayer": "Odtwarzacz", "ButtonCast": "Obsada", - "EnableBlurhashHelp": "Obrazy które wciąż się ładują zostaną zastąpione rozmazanym symbolem", - "EnableBlurhash": "Włącz rozmazane zamienniki dla obrazów", + "EnableBlurHashHelp": "Obrazy które wciąż się ładują zostaną zastąpione rozmazanym symbolem.", + "EnableBlurHash": "Włącz rozmazane zamienniki dla obrazów", "UnsupportedPlayback": "Jellyfin nie może odszyfrować zawartości zabezpieczonej przy pomocy DRM, ale spróbuje pomimo tego. Niektóre pliki mogą pojawiać się jako zupełnie czarne z powodu szyfrowania lub innych nie wspieranych funkcji jak np. interaktywne tytuły.", "OnApplicationStartup": "Przy starcie aplikacji", "EveryXHours": "Co {0} godzin", @@ -1490,14 +1362,13 @@ "LastSeen": "Ostatnio widziany {0}", "PersonRole": "jako {0}", "ListPaging": "{0}-{1} z {2}", - "WriteAccessRequired": "Serwer Jellyfin wymaga praw zapisu do tego katalogu. Upewnij się, że prawa zapisu zostały przyznane i spróbuj ponownie.", + "WriteAccessRequired": "Jellyfin wymaga praw zapisu do tego katalogu. Upewnij się, że prawa zapisu zostały przyznane i spróbuj ponownie.", "PathNotFound": "Ścieżka nie została znaleziona. Upewnij się, że ścieżka jest poprawna i spróbuj ponownie.", "YadifBob": "YADIF Bob", "Yadif": "YADIF", "Writers": "Scenariusz", "ViewAlbumArtist": "Zobacz wykonawcę albumu", "Track": "Utwór", - "TabDVR": "DVR", "TabRepositories": "Repozytoria", "SyncPlayAccessHelp": "Wybierz poziom dostępu do funkcji SyncPlay jaki posiada ten użytkownik. SyncPlay pozwala na synchronizację odtwarzania z innymi urządzeniami.", "Filter": "Filtruj", @@ -1506,7 +1377,6 @@ "ShowLess": "Pokaż mniej", "Season": "Sezon", "SaveChanges": "Zapisz zmiany", - "ReleaseGroup": "Zwolnij Grupę", "PreferEmbeddedEpisodeInfosOverFileNames": "Preferuj wbudowane informacje o odcinku przed nazwami plików", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Używa informacji o odcinku z dołączonych metadanych jeśli są dostępne.", "MessageSyncPlayErrorMedia": "Nie udało się uruchomić SyncPlay! Błąd mediów.", @@ -1548,10 +1418,9 @@ "EnableFasterAnimations": "Szybsze animacje", "LabelRequireHttpsHelp": "Jeśli zaznaczone, serwer automatycznie przekieruje wszystkie połączenia HTTP do HTTPS. Ta opcja nie zadziała jeśli serwer nie nasłuchuje na HTTPS.", "LabelRequireHttps": "Wymagaj HTTPS", - "LabelNightly": "Nocny", "LabelStable": "Stabilny", "LabelChromecastVersion": "Wersja Chromecast", - "LabelEnableHttpsHelp": "Pozwala serwerowi na nasłuchiwanie na skonfigurowanym porcie HTTPS. Prawidłowy certyfikat musi być skonfigurowany by ta opcja zadziałała.", + "LabelEnableHttpsHelp": "Nasłuchuj na skonfigurowanym porcie HTTPS. Aby to zadziałało, należy również przedstawić ważny certyfikat.", "LabelEnableHttps": "Włącz HTTPS", "HeaderSyncPlayEnabled": "SyncPlay włączony", "HeaderSyncPlaySelectGroup": "Dołącz do grupy", @@ -1564,5 +1433,14 @@ "EnableDetailsBanner": "Baner w szczegółach", "EnableDecodingColorDepth10Vp9": "Włącz 10-bitowe dekodowanie sprzętowe dla VP9", "EnableDecodingColorDepth10Hevc": "Włącz 10-bitowe dekodowanie sprzętowe dla HEVC", - "BoxSet": "Kolekcja" + "BoxSet": "Kolekcja", + "PreviousTrack": "Poprzedni", + "NextTrack": "Następny", + "LabelUnstable": "Niestabilny", + "Preview": "Zapowiedź", + "SubtitleVerticalPositionHelp": "Numer wiersza, w którym pojawia się tekst. Liczby dodatnie wskazują z góry na dół. Liczby ujemne wskazują od dołu do góry.", + "LabelSubtitleVerticalPosition": "Pozycja pionowa:", + "MessageGetInstalledPluginsError": "Wystąpił błąd podczas pobierania listy aktualnie zainstalowanych wtyczek.", + "MessagePluginInstallError": "Wystąpił błąd podczas instalacji wtyczki.", + "PlaybackRate": "Szybkość odtwarzania" } diff --git a/src/strings/pr.json b/src/strings/pr.json index ea27024045..4c99a4556c 100644 --- a/src/strings/pr.json +++ b/src/strings/pr.json @@ -10,16 +10,12 @@ "FolderTypeMusic": "Sea Shanties", "OptionBlockBooks": "Tall Tales", "HeaderFavoriteBooks": "Fav'rit Tales", - "HeaderBooks": "Tall Tales", "HeaderAudioBooks": "Spoken Tales", "FolderTypeBooks": "Tall Tales", "Books": "Tall Tales", "LabelHomeNetworkQuality": "Sail strength:", "Home": "Poop Deck", - "HeaderHome": "Poop Deck", "DisplayInOtherHomeScreenSections": "Show on Poop Deck such as latest booty and continue plundering", - "ButtonHome": "Poop deck", - "HeaderCastCrew": "Mateys", "Add": "Upend", "Actor": "Privateer", "AccessRestrictedTryAgainLater": "Ye arn't appearin' on the list o' the livin'!", diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index e2f61129f5..e6be09c100 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -3,7 +3,6 @@ "AccessRestrictedTryAgainLater": "O acesso está atualmente restrito. Por favor, tente novamente mais tarde.", "Actor": "Ator", "Add": "Adicionar", - "AddItemToCollectionHelp": "Adiciona itens às coletâneas buscando por eles, usando o botão direito do mouse ou clicando nos menus para os adicionar a uma coletânea.", "AddToCollection": "Adicionar à coletânea", "AddToPlayQueue": "Adicionar à fila de reprodução", "AddToPlaylist": "Adicionar à lista de reprodução", @@ -18,12 +17,12 @@ "AllEpisodes": "Todos os episódios", "AllLanguages": "Todos os idiomas", "AllLibraries": "Todas as bibliotecas", - "AllowHWTranscodingHelp": "Se ativado, permite ao sintonizador transcodificar streams em tempo real. Isto pode ajudar a reduzir a transcodificação requerida pelo Servidor.", + "AllowHWTranscodingHelp": "Permite ao sintonizador transcodificar streams em tempo real. Isto pode ajudar a reduzir a transcodificação requerida pelo servidor.", "AllowMediaConversion": "Permitir conversão de mídia", "AllowMediaConversionHelp": "Garante ou nega acesso à funcionalidade de conversão de mídia.", "AllowOnTheFlySubtitleExtraction": "Permitir a extração da legenda em tempo real", "AllowOnTheFlySubtitleExtractionHelp": "Legendas incorporadas podem ser extraídas dos vídeos e entregues aos clientes como texto simples para ajudar a evitar a transcodificação do vídeo. Em alguns sistemas isto pode levar bastante tempo e causar travamento na reprodução do vídeo durante o processo de extração. Desative isto para ter as legendas incorporadas com a transcodificação do vídeo quando não forem nativamente suportadas pelo dispositivo cliente.", - "AllowRemoteAccess": "Permitir conexões remotas a este Servidor Jellyfin.", + "AllowRemoteAccess": "Permitir conexões remotas a este servidor.", "AllowRemoteAccessHelp": "Se desmarcado, todas as conexões remotas serão bloqueadas.", "AllowedRemoteAddressesHelp": "Lista separada por vírgula de endereços IP ou entradas IP/netmask para redes que terão permissão para conectar-se remotamente. Se deixar em branco, todos os endereços remotos terão permissão.", "AlwaysPlaySubtitles": "Sempre reproduzir legendas", @@ -36,9 +35,7 @@ "AsManyAsPossible": "Quantos forem possíveis", "Ascending": "Crescente", "AspectRatio": "Proporção da tela", - "AttributeNew": "Novo", "Audio": "Áudio", - "AutoBasedOnLanguageSetting": "Automático (baseado na configuração do idioma)", "Backdrop": "Imagem de Fundo", "Backdrops": "Imagens de Fundo", "BirthDateValue": "Nascimento: {0}", @@ -49,81 +46,56 @@ "Box": "Caixa", "BoxRear": "Caixa (traseira)", "Browse": "Navegar", - "BrowsePluginCatalogMessage": "Navegue pelo nosso catálogo de plugins para ver os plugins disponíveis.", + "MessageBrowsePluginCatalog": "Navegue pelo nosso catálogo de plugins para ver os plugins disponíveis.", "BurnSubtitlesHelp": "Determina se o servidor deveria gravar as legendas no vídeo ao convertê-lo, dependendo do formato da legenda. Evitar a gravação da legenda irá melhorar a performance do servidor. Selecione Auto para gravar legendas baseados em imagem dos tipos (ex. VOBSUB, PGS, SUB/IDX, etc.) e algumas legendas ASS/SSA.", - "ButtonAdd": "Adicionar", "ButtonAddMediaLibrary": "Adicionar Biblioteca de Mídia", "ButtonAddScheduledTaskTrigger": "Adicionar Disparador", "ButtonAddServer": "Adicionar Servidor", "ButtonAddUser": "Adicionar Usuário", - "ButtonArrowDown": "Baixo", "ButtonArrowLeft": "Esquerda", "ButtonArrowRight": "Direita", - "ButtonArrowUp": "Cima", "ButtonAudioTracks": "Faixas de Áudio", "ButtonBack": "Voltar", "ButtonCancel": "Cancelar", "ButtonChangeServer": "Alterar Servidor", - "ButtonConnect": "Conectar", - "ButtonDelete": "Excluir", - "ButtonDeleteImage": "Excluir Imagem", - "ButtonDown": "Baixo", - "ButtonEdit": "Editar", - "ButtonEditImages": "Editar imagens", "ButtonEditOtherUserPreferences": "Editar este perfil de usuário, imagem e preferências pessoais.", - "ButtonFilter": "Filtrar", "ButtonForgotPassword": "Esqueci a Senha", "ButtonFullscreen": "Tela Cheia", "ButtonGotIt": "Feito", "ButtonGuide": "Guia", - "ButtonHelp": "Ajuda", - "ButtonHome": "Início", - "ButtonLearnMore": "Saiba mais", "ButtonLibraryAccess": "Acesso à biblioteca", "ButtonManualLogin": "Login Manual", "ButtonMore": "Mais", "ButtonNetwork": "Rede", - "ButtonNew": "Novo", "ButtonNextTrack": "Próxima faixa", - "ButtonOff": "Desligar", "ButtonOk": "OK", "ButtonOpen": "Abrir", "ButtonParentalControl": "Controle dos pais", "ButtonPause": "Pausar", - "ButtonPlay": "Reproduzir", "ButtonPreviousTrack": "Faixa anterior", "ButtonProfile": "Perfil", "ButtonQuickStartGuide": "Guia Rápido", - "ButtonRefresh": "Atualizar", "ButtonRefreshGuideData": "Atualizar Dados do Guia", "ButtonRemove": "Remover", "ButtonRename": "Renomear", - "ButtonRepeat": "Repetir", "ButtonResetEasyPassword": "Redefinir código pin fácil", "ButtonResetPassword": "Redefinir Senha", "ButtonRestart": "Reiniciar", "ButtonResume": "Retomar", "ButtonRevoke": "Revogar", - "ButtonSave": "Salvar", "ButtonScanAllLibraries": "Rastrear Todas as Bibliotecas", - "ButtonSearch": "Busca", "ButtonSelectDirectory": "Selecionar Diretório", "ButtonSelectServer": "Selecionar Servidor", "ButtonSelectView": "Selecionar visualização", "ButtonSend": "Enviar", "ButtonSettings": "Configurações", - "ButtonShuffle": "Aleatório", "ButtonShutdown": "Desligar", "ButtonSignIn": "Entrar", "ButtonSignOut": "Sair", - "ButtonSort": "Ordenar", "ButtonStart": "Iniciar", "ButtonStop": "Parar", "ButtonSubmit": "Enviar", - "ButtonSubtitles": "Legendas", "ButtonUninstall": "Desinstalar", - "ButtonUp": "Cima", - "ButtonViewWebsite": "Ver site", "CancelRecording": "Cancelar gravação", "CancelSeries": "Cancelar série", "Categories": "Categorias", @@ -138,7 +110,7 @@ "ColorTransfer": "Transferência de cor", "CommunityRating": "Avaliação da comunidade", "Composer": "Compositor", - "ConfigureDateAdded": "Configure como a data de adição é determinada no painel do Servidor Jellyfin nas configurações da Biblioteca", + "ConfigureDateAdded": "Configure como a data de adição é determinada no painel nas configurações da Biblioteca", "ConfirmDeleteImage": "Excluir imagem?", "ConfirmDeleteItem": "Ao excluir este item, você o excluirá do sistema de arquivos e também da biblioteca de mídias. Deseja realmente continuar?", "ConfirmDeleteItems": "Ao excluir estes itens, você os excluirá do sistema de arquivos e de sua biblioteca de mídias. Deseja realmente continuar?", @@ -153,7 +125,7 @@ "DatePlayed": "Data de reprodução", "DeathDateValue": "Morte: {0}", "Default": "Padrão", - "DefaultErrorMessage": "Ocorreu um erro ao processar o pedido. Por favor, tente novamente mais tarde.", + "ErrorDefault": "Ocorreu um erro ao processar o pedido. Por favor, tente novamente mais tarde.", "DefaultMetadataLangaugeDescription": "Estas são suas configurações padrão e podem ser personalizadas por biblioteca.", "DefaultSubtitlesHelp": "Legendas são carregadas com base nas configurações padrão e de legendas forçadas nos metadados incorporados. As preferências de idioma são consideradas quando existem múltiplas opções disponíveis.", "Delete": "Excluir", @@ -192,7 +164,6 @@ "EditImages": "Editar imagens", "EditMetadata": "Editar metadados", "EditSubtitles": "Editar legendas", - "EnableBackdrops": "Imagens de fundo", "EnableBackdropsHelp": "Exibe imagens de fundo de algumas páginas ao navegar pela biblioteca.", "EnableCinemaMode": "Modo cinema", "EnableColorCodedBackgrounds": "Cores de fundo por código", @@ -206,20 +177,18 @@ "EnablePhotosHelp": "Imagens serão detectadas e exibidas junto com outros arquivos de mídia.", "EnableStreamLooping": "Repetir automaticamente transmissões ao vivo", "EnableStreamLoopingHelp": "Ative se as transmissões ao vivo contem poucos segundos de dados e necessitam ser continuamente solicitadas. Ativar esta opção sem necessidade pode causar problemas.", - "EnableThemeSongs": "Músicas-tema", "EnableThemeSongsHelp": "Reproduz músicas-tema em segundo plano ao navegar pela biblioteca.", - "EnableThemeVideos": "Vídeos-tema", "EnableThemeVideosHelp": "Reproduz vídeos-tema em segundo plano ao navegar pela biblioteca.", "Ended": "Finalizada", "EndsAtValue": "Termina às {0}", "Episodes": "Episódios", "ErrorAddingListingsToSchedulesDirect": "Ocorreu um erro ao adicionar a programação à sua conta da Schedules Direct. A Schedules Direct permite apenas um número limitado de programações por conta. Talvez seja necessário que você entre no website da Schedules Direct e remova outras listas de sua conta antes de prosseguir.", - "ErrorAddingMediaPathToVirtualFolder": "Um erro ocorreu ao adicionar o local da mídia. Por favor, verifique se o local é válido e se o processo do Servidor Jellyfin tem acesso a este local.", + "ErrorAddingMediaPathToVirtualFolder": "Um erro ocorreu ao adicionar o local da mídia. Por favor, verifique se o local é válido e se o Jellyfin tem acesso a este local.", "ErrorAddingTunerDevice": "Ocorreu um erro ao adicionar o sintonizador. Por favor, verifique se está acessível e tente novamente.", "ErrorAddingXmlTvFile": "Ocorreu um erro ao acessar o arquivo XmlTV. Por favor, verifique se o arquivo existe e tente novamente.", - "ErrorDeletingItem": "Ocorreu um erro ao excluir o item do Servidor Jellyfin. Por favor, verifique se o Servidor Jellyfin possui acesso de gravação na pasta de mídia e tente novamente.", + "ErrorDeletingItem": "Ocorreu um erro ao excluir o item do Servidor. Por favor, verifique se o Jellyfin possui acesso de gravação na pasta de mídia e tente novamente.", "ErrorGettingTvLineups": "Ocorreu um erro ao fazer download da programação de TV. Por favor, certifique-se que sua informação esteja correta e tente novamente.", - "ErrorMessageStartHourGreaterThanEnd": "A hora final deve ser maior que a hora inicial.", + "ErrorStartHourGreaterThanEnd": "A hora final deve ser maior que a hora inicial.", "ErrorPleaseSelectLineup": "Por favor, selecione a programação e tente novamente. Se não houver programações disponíveis, verifique se o seu nome de usuário, senha e código postal estão corretos.", "ErrorSavingTvProvider": "Um erro ocorreu ao salvar o provedor de TV. Por favor, verifique se está acessível e tente novamente.", "EveryNDays": "A cada {0} dias", @@ -263,14 +232,11 @@ "HeaderActiveDevices": "Dispositivos Ativos", "HeaderActiveRecordings": "Gravações Ativas", "HeaderActivity": "Atividade", - "HeaderAddScheduledTaskTrigger": "Adicionar Disparador", "HeaderAddToCollection": "Adicionar à Coletânea", "HeaderAddToPlaylist": "Adicionar à Lista de Reprodução", "HeaderAddUpdateImage": "Adicionar/Atualizar Imagem", - "HeaderAddUser": "Adicionar Usuário", "HeaderAdditionalParts": "Partes Adicionais", "HeaderAlbumArtists": "Artistas do Álbum", - "HeaderAlbums": "Álbuns", "HeaderAlert": "Alerta", "HeaderAllowMediaDeletionFrom": "Permitir a Exclusão de Mídia de", "HeaderApiKey": "Chave da API", @@ -279,16 +245,12 @@ "HeaderAppearsOn": "Aparece em", "HeaderAudioBooks": "Livros de Áudio", "HeaderAudioSettings": "Configurações de Áudio", - "HeaderAutomaticUpdates": "Atualizações Automáticas", "HeaderBlockItemsWithNoRating": "Bloquear itens com avaliação desconhecida ou sem avaliação:", - "HeaderBooks": "Livros", "HeaderBranding": "Marca", "HeaderCancelRecording": "Cancelar Gravação", "HeaderCancelSeries": "Cancelar Série", "HeaderCastAndCrew": "Elenco e Equipe", - "HeaderCastCrew": "Elenco e Equipe", "HeaderChannelAccess": "Acesso ao Canal", - "HeaderChannels": "Canais", "HeaderChapterImages": "Imagens do Capítulo", "HeaderCodecProfile": "Perfil do Codec", "HeaderCodecProfileHelp": "Perfis do Codec indicam as limitações de um dispositivo ao reproduzir codecs específicos. Se uma limitação ocorre, a mídia será transcodificada, mesmo se o codec estiver configurado para reprodução direta.", @@ -316,24 +278,18 @@ "HeaderDevices": "Dispositivos", "HeaderDirectPlayProfile": "Perfil de Reprodução Direta", "HeaderDirectPlayProfileHelp": "Adiciona perfis de reprodução direta que indiquem quais formatos o dispositivo pode suportar nativamente.", - "HeaderDisplay": "Exibição", "HeaderDownloadSync": "Download e Sincronização", "HeaderEasyPinCode": "Código Pin Fácil", "HeaderEditImages": "Editar Imagens", "HeaderEnabledFields": "Campos Ativados", "HeaderEnabledFieldsHelp": "Desmarque um campo para bloqueá-lo e evitar que seus dados sejam alterados.", - "HeaderEpisodes": "Episódios", "HeaderError": "Erro", "HeaderExternalIds": "IDs Externos:", "HeaderFeatureAccess": "Acesso aos Recursos", - "HeaderFeatures": "Recursos", "HeaderFetchImages": "Buscar Imagens:", "HeaderFetcherSettings": "Configurações do Buscador", - "HeaderFilters": "Filtros", "HeaderForKids": "Para Crianças", - "HeaderForgotPassword": "Esqueci a Senha", "HeaderFrequentlyPlayed": "Reproduzidos Frequentemente", - "HeaderGenres": "Gêneros", "HeaderGuideProviders": "Provedores de Dados do Guia da TV", "HeaderHttpHeaders": "Cabeçalhos de Http", "HeaderIdentification": "Identificação", @@ -344,10 +300,9 @@ "HeaderImageSettings": "Configurações de Imagem", "HeaderInstall": "Instalar", "HeaderInstantMix": "Mix Instantâneo", - "HeaderItems": "Itens", "HeaderKeepRecording": "Continuar Gravando", "HeaderKeepSeries": "Manter Série", - "HeaderKodiMetadataHelp": "Para ativar ou desativar metadados NFO, edite uma biblioteca na configuração da Biblioteca do Jellyfin e localize a seção de gravadores de metadados.", + "HeaderKodiMetadataHelp": "Para ativar ou desativar metadados NFO, edite uma biblioteca na configuração de Biblioteca do Jellyfin e localize a seção de gravadores de metadados.", "HeaderLatestEpisodes": "Episódios Recentes", "HeaderLatestMedia": "Mídias Recentes", "HeaderLatestMovies": "Filmes Recentes", @@ -358,16 +313,12 @@ "HeaderLibraryFolders": "Pastas da Biblioteca", "HeaderLibraryOrder": "Ordem da Biblioteca", "HeaderLibrarySettings": "Configurações da Biblioteca", - "HeaderLiveTV": "TV ao Vivo", - "HeaderLiveTv": "TV ao Vivo", "HeaderLiveTvTunerSetup": "Configuração do Sintonizador da TV ao Vivo", "HeaderLoginFailure": "Falha no Login", "HeaderMedia": "Mídia", "HeaderMediaFolders": "Pastas de Mídia", - "HeaderMediaInfo": "Informações de Mídia", "HeaderMetadataSettings": "Configurações dos Metadados", "HeaderMoreLikeThis": "Mais Disso", - "HeaderMovies": "Filmes", "HeaderMusicQuality": "Qualidade da Música", "HeaderMusicVideos": "Videoclipes", "HeaderMyDevice": "Meu Dispositivo", @@ -376,7 +327,6 @@ "HeaderNewApiKey": "Nova Chave de API", "HeaderNewDevices": "Novos Dispositivos", "HeaderNextEpisodePlayingInValue": "Reproduzindo Próximo Episódio em {0}", - "HeaderNextUp": "A Seguir", "HeaderNextVideoPlayingInValue": "Reproduzindo Próximo Vídeo em {0}", "HeaderOnNow": "Em Exibição", "HeaderOtherItems": "Outros Itens", @@ -384,7 +334,6 @@ "HeaderPassword": "Senha", "HeaderPasswordReset": "Redefinição de Senha", "HeaderPaths": "Locais", - "HeaderPeople": "Pessoas", "HeaderPhotoAlbums": "Álbuns de Fotos", "HeaderPinCodeReset": "Redefinir Código Pin", "HeaderPlayAll": "Reproduzir Tudo", @@ -396,7 +345,7 @@ "HeaderPreferredMetadataLanguage": "Idioma Preferido dos Metadados", "HeaderProfile": "Perfil", "HeaderProfileInformation": "Informação do Perfil", - "HeaderProfileServerSettingsHelp": "Estes valores controlam como o Servidor Jellyfin se apresentará ao dispositivo.", + "HeaderProfileServerSettingsHelp": "Estes valores controlam como o servidor Jellyfin se apresentará ao dispositivo.", "HeaderRecentlyPlayed": "Reproduzido Recentemente", "HeaderRecordingOptions": "Opções de Gravação", "HeaderRecordingPostProcessing": "Processamento Pós-Gravação", @@ -409,7 +358,6 @@ "HeaderRevisionHistory": "Histórico de Versões", "HeaderRunningTasks": "Tarefas em Execução", "HeaderScenes": "Cenas", - "HeaderSchedule": "Programação", "HeaderSeasons": "Temporadas", "HeaderSecondsValue": "{0} Segundos", "HeaderSelectCertificatePath": "Selecionar Local do Certificado", @@ -422,13 +370,11 @@ "HeaderSelectTranscodingPath": "Selecionar Local Temporário da Transcodificação", "HeaderSelectTranscodingPathHelp": "Navegue ou digite o local para usar para arquivos temporários de transcodificação. A pasta deve ter permissão de gravação.", "HeaderSendMessage": "Enviar Mensagem", - "HeaderSeries": "Séries", "HeaderSeriesOptions": "Opções da Série", "HeaderSeriesStatus": "Status da Série", "HeaderServerSettings": "Configurações de Servidor", "HeaderSettings": "Configurações", "HeaderSetupLibrary": "Configurar suas bibliotecas de mídias", - "HeaderShutdown": "Desligar", "HeaderSortBy": "Ordenar Por", "HeaderSortOrder": "Ordem", "HeaderSpecialEpisodeInfo": "Informação do Episódio Especial", @@ -462,7 +408,6 @@ "HeaderXmlDocumentAttributes": "Atributos do Documento Xml", "HeaderXmlSettings": "Configurações Xml", "HeaderYears": "Anos", - "HeadersFolders": "Pastas", "Help": "Ajuda", "Hide": "Ocultar", "HideWatchedContentFromLatestMedia": "Ocultar conteúdo assistido das mídias recentes", @@ -494,21 +439,17 @@ "LabelAlbumArtMaxWidthHelp": "Resolução máxima da arte do álbum exposta via upnp:albumArtURI.", "LabelAlbumArtPN": "PN da arte do álbum:", "LabelAlbumArtists": "Artistas do álbum:", - "LabelAll": "Todos", "LabelAllowHWTranscoding": "Permitir a transcodificação de hardware", - "LabelAllowServerAutoRestart": "Permitir ao servidor reiniciar automaticamente para aplicar as atualizações", - "LabelAllowServerAutoRestartHelp": "O servidor só reiniciará durante os períodos ociosos quando nenhum usuário estiver ativo.", "LabelAllowedRemoteAddresses": "Filtro de endereço IP remoto:", "LabelAllowedRemoteAddressesMode": "Modo do filtro de endereço IP remoto:", "LabelAppName": "Nome do app", "LabelAppNameExample": "Exemplo: Sickbeard, Sonarr", "LabelArtists": "Artistas:", - "LabelArtistsHelp": "Separa vários usando ;", - "LabelAudio": "Áudio", + "LabelArtistsHelp": "Separe múltiplos artistas usando ponto e vírgula.", "LabelAudioLanguagePreference": "Idioma preferido de áudio:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Atualizar automaticamente os metadados da internet:", "LabelBindToLocalNetworkAddress": "Vincular a um endereço de rede local:", - "LabelBindToLocalNetworkAddressHelp": "Opcional. Sobrepor o endereço de IP local para vincular o servidor http. Se deixar em branco, o servidor será vinculado a todos os endereços disponíveis. Para alterar este valor é necessário reiniciar o Servidor Jellyfin.", + "LabelBindToLocalNetworkAddressHelp": "Opcional. Sobrepor o endereço de IP local para vincular o servidor http. Se deixar em branco, o servidor será vinculado a todos os endereços disponíveis. Para alterar este valor é necessário reiniciar.", "LabelBirthDate": "Data de nascimento:", "LabelBirthYear": "Ano de nascimento:", "LabelBlastMessageInterval": "Intervalo das mensagens ao vivo (segundos)", @@ -531,10 +472,8 @@ "LabelCustomCertificatePathHelp": "Local do arquivo PKCS #12 contendo certificado e chave privada para ativar o suporte TLS em um domínio personalizado.", "LabelCustomCss": "CSS personalizado:", "LabelCustomCssHelp": "Aplica o seu estilo personalizado para a interface web.", - "LabelCustomDeviceDisplayName": "Nome para exibição:", "LabelCustomDeviceDisplayNameHelp": "Fornece um nome para exibição ou deixe em branco para usar o nome informado pelo dispositivo.", "LabelCustomRating": "Avaliação personalizada:", - "LabelDashboardTheme": "Tema do painel do servidor:", "LabelDateAdded": "Data de adição:", "LabelDateAddedBehavior": "Comportamento da data de adição para novo conteúdo:", "LabelDateAddedBehaviorHelp": "Se um valor de metadados estiver presente, ele sempre será utilizado antes destas opções.", @@ -549,7 +488,6 @@ "LabelDiscNumber": "Número do disco:", "LabelDisplayLanguage": "Idioma de exibição:", "LabelDisplayLanguageHelp": "A tradução do Jellyfin é um projeto em andamento.", - "LabelDisplayMissingEpisodesWithinSeasons": "Exibir episódios em falta nas temporadas", "LabelDisplayMode": "Modo de exibição:", "LabelDisplayName": "Nome para exibição:", "LabelDisplayOrder": "Ordem de exibição:", @@ -568,7 +506,7 @@ "LabelEnableBlastAliveMessages": "Mensagens ao vivo", "LabelEnableBlastAliveMessagesHelp": "Ative esta função se o servidor não for detectado por outros dispositivos UPnP em sua rede.", "LabelEnableDlnaClientDiscoveryInterval": "Intervalo para descoberta do cliente (segundos)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina a duração em segundos entre buscas SSDP executadas pelo Jellyfin.", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determina a duração em segundos entre buscas SSDP.", "LabelEnableDlnaDebugLogging": "Ativar o log de depuração de DLNA", "LabelEnableDlnaDebugLoggingHelp": "Cria arquivos de log grandes e só deve ser usado para resolver um problema.", "LabelEnableDlnaPlayTo": "Ativar DLNA Play To", @@ -603,7 +541,7 @@ "LabelHomeNetworkQuality": "Qualidade da rede local:", "LabelHomeScreenSectionValue": "Seção {0} da tela inicial:", "LabelHttpsPort": "Número da porta local de HTTPS:", - "LabelHttpsPortHelp": "O número da porta TCP que o servidor https do Jellyfin deveria se conectar.", + "LabelHttpsPortHelp": "O número da porta TCP do servidor HTTPS.", "LabelIconMaxHeight": "Altura máxima do ícone:", "LabelIconMaxHeightHelp": "Resolução máxima do ícone que é exposto via upnp:icon.", "LabelIconMaxWidth": "Largura máxima do ícone:", @@ -631,7 +569,7 @@ "LabelLanguage": "Idioma:", "LabelLineup": "Programação:", "LabelLocalHttpServerPortNumber": "Número da porta local de HTTP:", - "LabelLocalHttpServerPortNumberHelp": "O número da porta TCP que o servidor HTTP do Jellyfin deveria se conectar.", + "LabelLocalHttpServerPortNumberHelp": "O número da porta TCP para o servidor HTTP.", "LabelLockItemToPreventChanges": "Bloquear este item para evitar alterações futuras", "LabelLoginDisclaimer": "Aviso legal no login:", "LabelLoginDisclaimerHelp": "Um aviso será exibido na parte inferior da página de login.", @@ -656,7 +594,7 @@ "LabelMetadataReaders": "Leitores de metadados:", "LabelMetadataReadersHelp": "Classifica por ordem de prioridade suas fontes de metadados locais preferidas. O primeiro arquivo encontrado será lido.", "LabelMetadataSavers": "Gravadores de metadados:", - "LabelMetadataSaversHelp": "Escolha os formatos de arquivos nos quais deseja gravar seus metadados.", + "LabelMetadataSaversHelp": "Escolha os formatos a serem usados ao salvar seus metadados.", "LabelMethod": "Método:", "LabelMinBackdropDownloadWidth": "Tamanho mínimo da imagem de fundo para download:", "LabelMinResumeDuration": "Duração mínima para retomar:", @@ -672,7 +610,7 @@ "LabelMovieCategories": "Categorias de filmes:", "LabelMoviePrefix": "Prefixo dos filmes:", "LabelMoviePrefixHelp": "Se os títulos dos filmes devem ter um prefixo, digite-o aqui para que o servidor possa usá-lo corretamente.", - "LabelMovieRecordingPath": "Local de gravação de filme (opcional):", + "LabelMovieRecordingPath": "Local de gravação de filme:", "LabelMusicStreamingTranscodingBitrate": "Bitrate da transcodificação de músicas:", "LabelMusicStreamingTranscodingBitrateHelp": "Define o bitrate máximo do streaming de músicas.", "LabelName": "Nome:", @@ -680,13 +618,12 @@ "LabelNewPassword": "Nova senha:", "LabelNewPasswordConfirm": "Confirmar nova senha:", "LabelNewsCategories": "Categorias de notícias:", - "LabelNext": "Próximo", "LabelNotificationEnabled": "Ativar esta notificação", "LabelNumber": "Número:", "LabelNumberOfGuideDays": "Número de dias de dados do guia para baixar:", "LabelNumberOfGuideDaysHelp": "Baixar mais dias do guia da TV permite agendar com maior antecedência e visualizar mais listas, mas também levará mais tempo para baixar. Se selecionar Automático, será escolhido o período baseado no número de canais.", - "LabelOptionalNetworkPath": "(Opcional) Pasta compartilhada em rede:", - "LabelOptionalNetworkPathHelp": "Se esta pasta estiver compartilhada em sua rede, informar o caminho do compartilhamento permitirá que os apps Jellyfin em outros dispositivos acessem arquivos de mídia diretamente. Por exemplo, {0} ou {1}.", + "LabelOptionalNetworkPath": "Pasta compartilhada em rede:", + "LabelOptionalNetworkPathHelp": "Se esta pasta estiver compartilhada em sua rede, informar o caminho do compartilhamento permitirá que os clientes em outros dispositivos acessem arquivos de mídia diretamente. Por exemplo, {0} ou {1}.", "LabelOriginalAspectRatio": "Proporção original da tela:", "LabelOriginalTitle": "Título original:", "LabelOverview": "Sinopse:", @@ -705,9 +642,7 @@ "LabelPostProcessorArguments": "Argumentos de linha de comando do pós-processador:", "LabelPostProcessorArgumentsHelp": "Usar {path} como o local do arquivo de gravação.", "LabelPreferredDisplayLanguage": "Idioma preferido de exibição:", - "LabelPreferredDisplayLanguageHelp": "A tradução do Jellyfin é um projeto em andamento.", "LabelPreferredSubtitleLanguage": "Idioma de legendas preferido:", - "LabelPrevious": "Anterior", "LabelProfileAudioCodecs": "Codecs de áudio:", "LabelProfileCodecsHelp": "Separados por vírgula. Deixe em branco para aplicar a todos os codecs.", "LabelProfileContainersHelp": "Separados por vírgula. Deixe em branco para aplicar a todos os formatos.", @@ -719,16 +654,15 @@ "LabelPublicHttpPortHelp": "O número da porta pública que deverá ser mapeada para a porta local de HTTP.", "LabelPublicHttpsPort": "Número da porta pública de HTTPS:", "LabelPublicHttpsPortHelp": "O número da porta pública que deverá ser mapeada para a porta local de HTTPS.", - "LabelReadHowYouCanContribute": "Aprenda como você pode contribuir.", "LabelReasonForTranscoding": "Motivo da transcodificação:", "LabelRecord": "Gravar:", "LabelRecordingPath": "Local de gravação padrão:", - "LabelRecordingPathHelp": "Define o local padrão para salvar as gravações. Se deixar não preenchido, a pasta de dados do programa do servidor será usada.", + "LabelRecordingPathHelp": "Define o local padrão para salvar as gravações. Se deixar em branco, a pasta de dados do programa do servidor será usada.", "LabelRefreshMode": "Modo de atualização:", "LabelReleaseDate": "Data do lançamento:", "LabelRemoteClientBitrateLimit": "Limite do bitrate para streaming da internet (Mbps):", "LabelRemoteClientBitrateLimitHelp": "Um limite opcional da taxa de bits por-stream para todos os dispositivos fora da rede. Esta opção é útil para evitar que os dispositivos demandem uma taxa de bits maior que a permitida pela sua conexão. Isto pode causar um aumento na carga da CPU de seu servidor para que possa transcodificar os vídeos em tempo real para uma taxa mais baixa.", - "LabelRuntimeMinutes": "Duração (minutos):", + "LabelRuntimeMinutes": "Duração:", "LabelSaveLocalMetadata": "Salvar as artes nas pastas de mídia", "LabelSaveLocalMetadataHelp": "Salvando as artes nas pastas de mídia, permitirá deixá-las em um local fácil para editá-las.", "LabelScheduledTaskLastRan": "Última execução {0}, demorando {1}.", @@ -740,12 +674,12 @@ "LabelSelectVersionToInstall": "Selecione a versão para instalar:", "LabelSendNotificationToUsers": "Enviar notificação para:", "LabelSerialNumber": "Número de série", - "LabelSeriesRecordingPath": "Local de gravação de séries (opcional):", + "LabelSeriesRecordingPath": "Local de gravação de séries:", "LabelServerHost": "Servidor:", "LabelServerHostHelp": "192.168.1.100:8096 ou https://meuservidor.com", "LabelSimultaneousConnectionLimit": "Limite de stream simultâneo:", - "LabelSkipBackLength": "Tamanho do intervalo para retroceder:", - "LabelSkipForwardLength": "Tamanho do intervalo para avançar:", + "LabelSkipBackLength": "Intervalo ao retroceder:", + "LabelSkipForwardLength": "Intervalo ao avançar:", "LabelSkipIfAudioTrackPresent": "Ignorar se a faixa de áudio padrão coincidir com o idioma baixado", "LabelSkipIfAudioTrackPresentHelp": "Desmarque esta opção para que todos os vídeos tenham legendas, independente do idioma do áudio.", "LabelSkipIfGraphicalSubsPresent": "Ignorar se o vídeo já possuir legendas incorporadas", @@ -755,7 +689,6 @@ "LabelSortBy": "Ordenar por:", "LabelSortOrder": "Ordem:", "LabelSortTitle": "Ordenar por título:", - "LabelSoundEffects": "Efeitos sonoros:", "LabelSource": "Fonte:", "LabelSpecialSeasonsDisplayName": "Nome de exibição da temporada especial:", "LabelSportsCategories": "Categorias de esportes:", @@ -765,9 +698,8 @@ "LabelSubtitleDownloaders": "Downloaders de legendas:", "LabelSubtitleFormatHelp": "Exemplo: srt", "LabelSubtitlePlaybackMode": "Modo de legenda:", - "LabelSubtitles": "Legendas", "LabelSupportedMediaTypes": "Tipos de Mídia Suportados:", - "LabelTVHomeScreen": "Tela inicial do modo TV:", + "LabelTVHomeScreen": "Tela de início do modo TV:", "LabelTagline": "Slogan:", "LabelTextBackgroundColor": "Cor de fundo do texto:", "LabelTextColor": "Cor do texto:", @@ -777,11 +709,9 @@ "LabelTimeLimitHours": "Limite de tempo (horas):", "LabelTitle": "Título:", "LabelTrackNumber": "Número da faixa:", - "LabelTranscodingAudioCodec": "Codec de áudio:", "LabelTranscodingTempPathHelp": "Define um local personalizado para os arquivos transcodificados enviados aos clientes. Deixe em branco para usar o local padrão do servidor.", "LabelTranscodingThreadCount": "Contagem de threads da transcodificação:", "LabelTranscodingThreadCountHelp": "Selecione o número máximo de threads a ser usado quando transcodificar. Reduzir o número de threads irá diminuir o uso da CPU, mas pode não converter rápido o suficiente para uma experiência de reprodução suave.", - "LabelTranscodingVideoCodec": "Codec de vídeo:", "LabelTriggerType": "Tipo de Disparador:", "LabelTunerIpAddress": "Endereço IP do Sintonizador:", "LabelTunerType": "Tipo de sintonizador:", @@ -804,11 +734,10 @@ "LabelXDlnaCapHelp": "Determina o conteúdo do elemento X_DLNACAP no namespace urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDocHelp": "Determina o conteúdo do elemento X_DLNADOC no namespace urn:schemas-dlna-org:device-1-0.", "LabelYear": "Ano:", - "LabelYourFirstName": "Seu primeiro nome:", "LabelYoureDone": "Pronto!", "LabelZipCode": "CEP:", "LabelffmpegPath": "Local do FFmpeg:", - "LabelffmpegPathHelp": "O local para o programa ffmpeg, ou pasta contendo ffmpeg.", + "LabelffmpegPathHelp": "O local para o arquivo de aplicação ffmpeg, ou pasta contendo ffmpeg.", "LanNetworksHelp": "Lista separada por vírgula de endereços IP ou entradas IP/máscara de rede para redes que serão consideradas como redes locais ao forçar restrições de banda. Se definida, todos os outros endereços IP serão considerados como estando em uma rede externa e estarão sujeitos a restrições de banda externa. Se deixada em branco, apenas a sub-rede do servidor é considerada como rede local.", "Large": "Grande", "LatestFromLibrary": "{0} recentes", @@ -855,20 +784,19 @@ "MessageConfirmProfileDeletion": "Deseja realmente excluir este perfil?", "MessageConfirmRecordingCancellation": "Cancelar gravação?", "MessageConfirmRemoveMediaLocation": "Deseja realmente remover este local?", - "MessageConfirmRestart": "Deseja realmente reiniciar o Servidor Jellyfin?", - "MessageConfirmRevokeApiKey": "Deseja realmente revogar esta chave de api? A conexão da aplicação com o Servidor Jellyfin será abruptamente encerrada.", + "MessageConfirmRestart": "Deseja realmente reiniciar o Jellyfin?", + "MessageConfirmRevokeApiKey": "Deseja realmente revogar esta chave de API? A conexão da aplicação com este servidor será abruptamente encerrada.", "MessageConfirmShutdown": "Deseja realmente desligar o servidor ?", "MessageContactAdminToResetPassword": "Por favor, contate o administrador do sistema para redefinir sua senha.", "MessageCreateAccountAt": "Criar uma conta em {0}", "MessageDeleteTaskTrigger": "Deseja realmente excluir este disparador de tarefa?", - "MessageDirectoryPickerBSDInstruction": "Para BSD, você precisará configurar o armazenamento dentro de seu Jail do FreeNAS para permitir que o Jellyfin tenha acesso a ele.", - "MessageDirectoryPickerLinuxInstruction": "Sistemas operacionais Arch Linux, CentOS, Debian, Fedora, openSUSE ou Ubuntu, devem permitir que a conta de serviço tenha ao menos acesso de leitura nos locais de armazenamento.", + "MessageDirectoryPickerBSDInstruction": "Para BSD, você precisará configurar o armazenamento dentro de seu Jail do FreeNAS para que o Jellyfin tenha acesso a sua midia.", + "MessageDirectoryPickerLinuxInstruction": "Para Linux no Arch Linux, CentOS, Debian, Fedora, openSUSE ou Ubuntu, você deve permitir que o usuário do serviço tenha ao menos acesso de leitura ao seu armazenamento.", "MessageDownloadQueued": "Download enfileirado.", "MessageEnablingOptionLongerScans": "Ativar esta opção pode resultar em rastreamentos de biblioteca significativamente mais demorados.", "MessageFileReadError": "Ocorreu um erro ao ler o arquivo. Por favor, tente novamente.", "MessageForgotPasswordFileCreated": "O seguinte arquivo foi criado no seu servidor e contém instruções de como proceder:", "MessageForgotPasswordInNetworkRequired": "Por favor, tente novamente dentro da rede local para iniciar o processo para redefinir a senha.", - "MessageInstallPluginFromApp": "Este plugin deve ser instalado de dentro do app em que deseja usá-lo.", "MessageInvalidForgotPasswordPin": "Foi digitado um código PIN inválido ou expirado. Por favor, tente novamente.", "MessageInvalidUser": "Usuário ou senha inválidos. Por favor, tente novamente.", "MessageItemSaved": "Item salvo.", @@ -884,16 +812,15 @@ "MessagePleaseEnsureInternetMetadata": "Por favor, verifique se o download de metadados da internet está ativado.", "MessagePleaseWait": "Por favor, aguarde. Isto pode demorar um pouco.", "MessagePluginConfigurationRequiresLocalAccess": "Para configurar este plugin, por favor entre em seu servidor local diretamente.", - "MessagePluginInstallDisclaimer": "Plugins feitos por membros da comunidade Jellyfin são uma grande forma de melhorar sua experiência Jellyfin com funcionalidades e benefícios adicionais. Antes de instalar, por favor certifique-se de conhecer os efeitos que podem causar no seu Servidor Jellyfin, tais como rastreamentos de biblioteca mais demorados, processamento adicional e diminuição na estabilidade do sistema.", + "MessagePluginInstallDisclaimer": "Plugins feitos por membros da comunidade são uma grande forma de melhorar sua experiência com funcionalidades e benefícios adicionais. Antes de instalar, por favor certifique-se de conhecer os efeitos que podem causar no seu servidor, tais como rastreamentos de biblioteca mais demorados, processamento adicional e diminuição na estabilidade do sistema.", "MessageReenableUser": "Veja abaixo para reativar", - "MessageSettingsSaved": "Configurações salvas.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "As seguintes localizações de mídia serão excluídas de sua biblioteca:", "MessageUnableToConnectToServer": "Não foi possível conectar ao servidor selecionado. Por favor, verifique se está sendo executado e tente novamente.", "MessageUnsetContentHelp": "O conteúdo será exibido como pastas simples. Para melhores resultados, use o gerenciador de metadados para definir os tipos de conteúdo das sub-pastas.", "MessageYouHaveVersionInstalled": "Você possui a versão {0} instalada.", "Metadata": "Metadados", "MetadataManager": "Gerenciador de Metadados", - "MetadataSettingChangeHelp": "Alterar as configurações dos metadados afetará o novo conteúdo que será adicionado. Para atualizar o conteúdo existente, abra a tela de detalhes e clique no botão de atualizar, ou atualize usando o gerenciador de metadados.", + "MetadataSettingChangeHelp": "Alterar as configurações dos metadados afetará o novo conteúdo que será adicionado. Para atualizar o conteúdo existente, abra a tela de detalhes e clique no botão de atualizar ou atualize usando o gerenciador de metadados.", "MinutesAfter": "minutos após", "MinutesBefore": "minutos antes", "Mobile": "Celular", @@ -918,10 +845,9 @@ "NextUp": "A Seguir", "No": "Não", "NoNewDevicesFound": "Nenhum novo dispositivo encontrado. Para adicionar um novo sintonizador, feche esta mensagem e digite as informações do dispositivo manualmente.", - "NoNextUpItemsMessage": "Nada encontrado. Comece a assistir suas séries!", - "NoPluginConfigurationMessage": "Este plugin não permite alterar configurações.", + "MessageNoNextUpItems": "Nada encontrado. Comece a assistir suas séries!", + "MessageNoPluginConfiguration": "Este plugin não permite alterar configurações.", "NoSubtitleSearchResultsFound": "Nenhum resultado encontrado.", - "NoSubtitles": "Não há legendas", "NoSubtitlesHelp": "Legendas não serão carregadas por padrão. Elas podem ser carregadas manualmente durante a reprodução.", "None": "Nenhum(a)", "NumLocationsValue": "{0} pastas", @@ -941,18 +867,18 @@ "OptionAllowLinkSharingHelp": "Apenas páginas web que contenham informações de mídia são compartilhadas. Arquivos de mídia nunca são compartilhados publicamente. Os compartilhamentos têm um limite de tempo e expiram depois de {0} dias.", "OptionAllowManageLiveTv": "Permitir gerenciamento de gravações da TV ao Vivo", "OptionAllowMediaPlayback": "Permitir reprodução de mídia", - "OptionAllowMediaPlaybackTranscodingHelp": "Restringir o acesso à transcodificação pode ocasionar falhas na reprodução nos apps do Jellyfin devido a formatos de mídias não suportados.", + "OptionAllowMediaPlaybackTranscodingHelp": "Restringir o acesso à transcodificação pode ocasionar falhas na reprodução nos clientes devido a formatos de mídias não suportados.", "OptionAllowRemoteControlOthers": "Permitir controle remoto de outros usuários", "OptionAllowRemoteSharedDevices": "Permitir controle remoto de dispositivos compartilhados", - "OptionAllowRemoteSharedDevicesHelp": "Dispositivos DLNA são autorizados até que um usuário altere as permissões.", + "OptionAllowRemoteSharedDevicesHelp": "Dispositivos DLNA são considerados compartilhados até que um usuário comece a controlá-los.", "OptionAllowSyncTranscoding": "Permitir download e sincronização de mídia que necessite de transcodificação", "OptionAllowUserToManageServer": "Permitir este usuário administrar o servidor", - "OptionAllowVideoPlaybackRemuxing": "Permitir reprodução de vídeos que requerem conversão sem recodificar", + "OptionAllowVideoPlaybackRemuxing": "Permitir reprodução de vídeos que requeiram conversão sem re-encodação", "OptionAllowVideoPlaybackTranscoding": "Permitir reprodução de vídeo que necessite de transcodificação", "OptionArtist": "Artista", "OptionAscending": "Crescente", "OptionAutomaticallyGroupSeries": "Mesclar automaticamente séries que estão em várias pastas", - "OptionAutomaticallyGroupSeriesHelp": "Se ativado, séries que estiverem em várias pastas dentro desta biblioteca serão automaticamente mescladas em uma única série.", + "OptionAutomaticallyGroupSeriesHelp": "Séries que estiverem em várias pastas dentro desta biblioteca serão automaticamente mescladas em uma única série.", "OptionBlockBooks": "Livros", "OptionBlockChannelContent": "Conteúdo do Canal de Internet", "OptionBlockLiveTvChannels": "Canais de TV ao Vivo", @@ -970,16 +896,16 @@ "OptionDatePlayed": "Data de Reprodução", "OptionDescending": "Decrescente", "OptionDisableUser": "Desativar este usuário", - "OptionDisableUserHelp": "Se desativado, o servidor não permitirá nenhuma conexão deste usuário. Conexões existentes serão encerradas imediatamente.", - "OptionDislikes": "Não gostei", - "OptionDisplayFolderView": "Exibe visualização em pastas para exibir pastas de mídias", - "OptionDisplayFolderViewHelp": "Exibição em pastas ao lado das biblioteca de mídia. Isto pode ser útil para visualizar por pastas.", + "OptionDisableUserHelp": "O servidor não permitirá nenhuma conexão deste usuário. Conexões existentes serão encerradas imediatamente.", + "OptionDislikes": "Não Curtidos", + "OptionDisplayFolderView": "Exibe uma visualização de pasta para exibir pastas de mídias", + "OptionDisplayFolderViewHelp": "Exibe pastas ao lado de suas outras biblioteca de mídia. Isto pode ser útil se quiser uma visualização por pasta.", "OptionDownloadArtImage": "Arte", "OptionDownloadBackImage": "Traseira", "OptionDownloadBoxImage": "Caixa", "OptionDownloadDiscImage": "Disco", "OptionDownloadImagesInAdvance": "Fazer download de imagens antecipadamente", - "OptionDownloadImagesInAdvanceHelp": "Por padrão, a maioria das imagens são baixadas somente quando um app Jellyfin solicita. Ativar esta opção, baixará todas as imagens antecipadamente, ao importar novas mídias. Isto pode ocasionar um tempo maior para escanear a biblioteca.", + "OptionDownloadImagesInAdvanceHelp": "Por padrão, a maioria das imagens são baixadas somente quando um cliente solicita. Ativar esta opção, baixará todas as imagens antecipadamente, ao importar novas mídias. Isto pode ocasionar um tempo maior para escanear a biblioteca.", "OptionDownloadPrimaryImage": "Principal", "OptionDownloadThumbImage": "Miniatura", "OptionDvd": "DVD", @@ -999,7 +925,6 @@ "OptionExternallyDownloaded": "Download externo", "OptionExtractChapterImage": "Ativar extração de imagens de capítulos", "OptionFavorite": "Favoritos", - "OptionFriday": "Sexta-feira", "OptionHasSpecialFeatures": "Recursos Especiais", "OptionHasSubtitles": "Legendas", "OptionHasThemeSong": "Música-Tema", @@ -1009,22 +934,20 @@ "OptionHlsSegmentedSubtitles": "Legendas segmentadas HLS", "OptionHomeVideos": "Fotos", "OptionIgnoreTranscodeByteRangeRequests": "Ignorar requisições de extensão do byte de transcodificação", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Se ativado, estas requisições serão honradas mas irão ignorar o cabeçalho da extensão do byte.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Estas requisições serão honradas mas irão ignorar o cabeçalho da extensão do byte.", "OptionImdbRating": "Avaliação IMDb", "OptionLikes": "Curtidas", "OptionMax": "Máx", "OptionMissingEpisode": "Episódios em Falta", - "OptionMonday": "Segunda-feira", "OptionNameSort": "Nome", "OptionNew": "Novo…", "OptionNone": "Nenhum", - "OptionOnAppStartup": "Ao iniciar a aplicação", "OptionOnInterval": "Em um intervalo", "OptionParentalRating": "Classificação Etária", "OptionPlainStorageFolders": "Exibir todas as pastas como pastas de armazenamento", - "OptionPlainStorageFoldersHelp": "Se ativado, todas as pastas são representadas no DIDL como \"object.container.storageFolder\" ao invés de um tipo mais específico como, por exemplo, \"object.container.person.musicArtist\".", + "OptionPlainStorageFoldersHelp": "Todas as pastas são representadas no DIDL como \"object.container.storageFolder\" ao invés de um tipo mais específico como, por exemplo, \"object.container.person.musicArtist\".", "OptionPlainVideoItems": "Exibir todos os vídeos como itens de vídeo", - "OptionPlainVideoItemsHelp": "Se ativado, todos os vídeos são representados no DIDL como \"object.item.videoItem\" ao invés de um tipo mais específico como, por exemplo, \"object.item.videoItem.movie\".", + "OptionPlainVideoItemsHelp": "Todos os vídeos são representados no DIDL como \"object.item.videoItem\" ao invés de um tipo mais específico como, por exemplo, \"object.item.videoItem.movie\".", "OptionPlayCount": "Contagem de Reproduções", "OptionPlayed": "Reproduzido", "OptionPremiereDate": "Data da Estréia", @@ -1040,19 +963,14 @@ "OptionResElement": "elemento res", "OptionResumable": "Retomável", "OptionRuntime": "Duração", - "OptionSaturday": "Sábado", "OptionSaveMetadataAsHidden": "Salvar metadados e imagens como arquivos ocultos", - "OptionSaveMetadataAsHiddenHelp": "Isto será aplicado sobre novos metadados salvos. Os arquivos de metadados existentes serão atualizados na próxima vez que forem salvos no Servidor Jellyfin.", + "OptionSaveMetadataAsHiddenHelp": "Isto será aplicado sobre novos metadados salvos. Os arquivos de metadados existentes serão atualizados na próxima vez que forem salvos no servidor.", "OptionSpecialEpisode": "Especiais", - "OptionSunday": "Domingo", - "OptionThursday": "Quinta-feira", "OptionTrackName": "Nome da Faixa", - "OptionTuesday": "Terça-feira", "OptionTvdbRating": "Avaliação TVDB", "OptionUnairedEpisode": "Episódios a Estrear", "OptionUnplayed": "Não reproduzido", "OptionWakeFromSleep": "Despertar da hibernação", - "OptionWednesday": "Quarta-feira", "OptionWeekdays": "Dias da semana", "OptionWeekends": "Fins de semana", "OptionWeekly": "Semanal", @@ -1065,7 +983,7 @@ "PasswordMatchError": "A senha e a confirmação da senha devem ser iguais.", "PasswordResetComplete": "A senha foi redefinida.", "PasswordResetConfirmation": "Deseja realmente redefinir a senha?", - "PasswordResetHeader": "Redefinir Senha", + "HeaderResetPassword": "Redefinir Senha", "PasswordSaved": "Senha salva.", "People": "Pessoas", "PerfectMatch": "Combinação perfeita", @@ -1084,9 +1002,9 @@ "PleaseAddAtLeastOneFolder": "Por favor, adicione ao menos uma pasta a esta biblioteca, clicando no botão Adicionar.", "PleaseConfirmPluginInstallation": "Por favor, clique em OK para confirmar que você leu e deseja prosseguir com a instalação do plugin.", "PleaseEnterNameOrId": "Por favor, digite um nome ou ID externa.", - "PleaseRestartServerName": "Por favor, reinicie o Servidor Jellyfin - {0}.", + "PleaseRestartServerName": "Por favor, reinicie o Jellyfin {0}.", "PleaseSelectTwoItems": "Por favor, selecione pelo menos dois itens.", - "PluginInstalledMessage": "O plugin foi instalado com sucesso. O Servidor Jellyfin precisa ser reiniciado para que as alterações sejam aplicadas.", + "MessagePluginInstalled": "O plugin foi instalado com sucesso. O servidor precisa ser reiniciado para que as alterações sejam aplicadas.", "PreferEmbeddedTitlesOverFileNames": "Preferir títulos incorporados ao invés de nomes de arquivos", "PreferEmbeddedTitlesOverFileNamesHelp": "Isto determina a exibição padrão do título quando não houverem metadados da internet ou locais disponíveis.", "Premieres": "Estreias", @@ -1096,7 +1014,6 @@ "ProductionLocations": "Locais de produção", "Programs": "Programas", "Quality": "Qualidade", - "QueueAllFromHere": "Enfileirar todas a partir daqui", "Raised": "Criado", "Rate": "Avaliação", "RecentlyWatched": "Assistido recentemente", @@ -1107,11 +1024,11 @@ "Record": "Gravar", "RecordSeries": "Gravar série", "RecordingCancelled": "Gravação cancelada.", - "RecordingPathChangeMessage": "Alterar a sua pasta de gravações não migrará as gravações existentes do local anterior para o novo. Se desejar, você necessitará movê-los manualmente.", + "MessageChangeRecordingPath": "Alterar a sua pasta de gravações não migrará as gravações existentes do local anterior para o novo. Se desejar, você necessitará movê-los manualmente.", "RecordingScheduled": "Gravação agendada.", "Recordings": "Gravações", "Refresh": "Atualizar", - "RefreshDialogHelp": "Os metadados são atualizados com base nas configurações e nos serviços de internet que estão ativados no painel do Servidor Jellyfin.", + "RefreshDialogHelp": "Os metadados são atualizados com base nas configurações e nos serviços de internet que estão ativados no painel.", "RefreshMetadata": "Atualizar metadados", "RefreshQueued": "Atualização enfileirada.", "ReleaseDate": "Data de lançamento", @@ -1127,7 +1044,6 @@ "ReplaceExistingImages": "Substituir imagens existentes", "ResumeAt": "Retomar de {0}", "Rewind": "Retroceder", - "RunAtStartup": "Executar ao iniciar", "Runtime": "Duração", "Saturday": "Sábado", "Save": "Salvar", @@ -1149,10 +1065,10 @@ "SeriesRecordingScheduled": "Gravação de série agendada.", "SeriesSettings": "Configurações de Séries", "SeriesYearToPresent": "{0} - Presente", - "ServerNameIsRestarting": "Servidor Jellyfin - {0} está reiniciando.", - "ServerNameIsShuttingDown": "Servidor Jellyfin - {0} está desligando.", - "ServerRestartNeededAfterPluginInstall": "O Servidor Jellyfin precisa ser reiniciado após a instalação de um plugin.", - "ServerUpdateNeeded": "Este Servidor Jellyfin precisa ser atualizado. Para fazer download da versão mais recente, por favor visite {0}", + "ServerNameIsRestarting": "O servidor em {0} está reiniciando.", + "ServerNameIsShuttingDown": "O servidor em {0} está desligando.", + "ServerRestartNeededAfterPluginInstall": "O Jellyfin precisa ser reiniciado após a instalação de um plugin.", + "ServerUpdateNeeded": "Este servidor precisa ser atualizado. Para fazer download da versão mais recente, por favor visite {0}", "Settings": "Configurações", "SettingsSaved": "Configurações salvas.", "SettingsWarning": "Alterar estes valores pode causar instabilidade ou falhas de conectividade. Se tiver algum problema, recomendamos retornar ao padrão.", @@ -1189,51 +1105,24 @@ "SystemDlnaProfilesHelp": "Os perfis do sistema estão apenas em modo leitura. As alterações feitas no perfil do sistema serão salvas em um novo perfil personalizado.", "TabAccess": "Acesso", "TabAdvanced": "Avançado", - "TabAlbumArtists": "Artistas do Álbum", - "TabAlbums": "Álbuns", - "TabArtists": "Artistas", "TabCatalog": "Catálogo", - "TabChannels": "Canais", - "TabCollections": "Coletâneas", "TabDashboard": "Painel", - "TabDevices": "Dispositivos", "TabDirectPlay": "Reprodução Direta", - "TabDisplay": "Exibição", - "TabEpisodes": "Episódios", - "TabFavorites": "Favoritos", - "TabGenres": "Gêneros", - "TabGuide": "Guia", "TabLatest": "Recentes", - "TabLiveTV": "TV ao Vivo", - "TabMetadata": "Metadados", - "TabMovies": "Filmes", "TabMusic": "Música", - "TabMusicVideos": "Videoclipes", "TabMyPlugins": "Meus Plugins", "TabNetworks": "Emissoras", "TabNfoSettings": "Configurações de NFO", "TabNotifications": "Notificações", "TabOther": "Outros", "TabParentalControl": "Controle dos Pais", - "TabPassword": "Senha", - "TabPlayback": "Reprodução", - "TabPlaylist": "Lista de Reprodução", - "TabPlaylists": "Listas de Reprodução", "TabProfile": "Perfil", "TabProfiles": "Perfis", - "TabRecordings": "Gravações", "TabResponses": "Respostas", - "TabResumeSettings": "Retomar", "TabScheduledTasks": "Tarefas Agendadas", - "TabSeries": "Séries", "TabServer": "Servidor", "TabSettings": "Configurações", - "TabShows": "Séries", - "TabSongs": "Músicas", - "TabSuggestions": "Sugestões", - "TabTranscoding": "Transcodificação", "TabUpcoming": "A Seguir", - "TabUsers": "Usuários", "TellUsAboutYourself": "Conte-nos sobre você", "ThemeSongs": "Músicas-tema", "ThemeVideos": "Vídeos-tema", @@ -1250,7 +1139,7 @@ "TvLibraryHelp": "Verifique o {0}guia de nomes de séries{1}.", "Uniform": "Uniforme", "UninstallPluginConfirmation": "Deseja realmente desinstalar {0}?", - "UninstallPluginHeader": "Desinstalar Plugin", + "HeaderUninstallPlugin": "Desinstalar Plugin", "Unmute": "Sair do Mudo", "Unplayed": "Não reproduzido", "Unrated": "Não avaliado", @@ -1278,7 +1167,6 @@ "ValueTimeLimitMultiHour": "Limite de tempo: {0} horas", "ValueTimeLimitSingleHour": "Limite de tempo: 1 hora", "ValueVideoCodec": "Codec de Vídeo: {0}", - "VideoRange": "Faixa de vídeo", "ViewAlbum": "Exibir álbum", "ViewPlaybackInfo": "Exibir informação de reprodução", "Watched": "Assistido", @@ -1298,7 +1186,6 @@ "Auto": "Automático", "Banner": "Cartaz", "Blacklist": "Lista negra", - "ButtonDownload": "Download", "ButtonInfo": "Informações", "ButtonTrailer": "Trailer", "ButtonWebsite": "Site", @@ -1311,17 +1198,14 @@ "HeaderAdmin": "Administrador", "HeaderApp": "Aplicativo", "HeaderStatus": "Status", - "HeaderTags": "Marcadores", "Horizontal": "Horizontal", "LabelAbortedByServerShutdown": "(Abortado devido ao desligamento do servidor)", "LabelCache": "Cache:", "LabelLogs": "Registros:", "LabelProfileCodecs": "Codecs:", - "LabelSkin": "Tema:", "LabelStatus": "Status:", "LabelTag": "Marcador:", "LeaveBlankToNotSetAPassword": "Caso não queira definir uma senha, deixe em branco.", - "LinksValue": "Links: {0}", "Logo": "Logo", "MediaInfoCodec": "Codec", "MediaInfoFramerate": "Taxa de quadros", @@ -1332,7 +1216,7 @@ "Normal": "Normal", "Option3D": "3D", "OptionAuto": "Automático", - "AuthProviderHelp": "Seleciona um provedor de autenticação que será usado para autenticar a senha do usuário.", + "AuthProviderHelp": "Selecione um provedor de autenticação que será usado para autenticar a senha do usuário.", "HeaderFavoriteMovies": "Filmes Favoritos", "HeaderFavoriteShows": "Séries favoritas", "HeaderFavoriteEpisodes": "Episódios favoritos", @@ -1340,12 +1224,11 @@ "HeaderFavoriteArtists": "Artistas favoritos", "HeaderFavoriteSongs": "Músicas favoritas", "HeaderFavoriteVideos": "Videos favoritos", - "HeaderHome": "Inicio", "LabelAuthProvider": "Provedor de autenticação:", "LabelServerName": "Nome do servidor:", - "LabelTranscodePath": "Pasta de transcodificação:", - "LabelTranscodes": "Transcodificação:", - "LabelUserLoginAttemptsBeforeLockout": "Tentativas de login com falha antes que o usuário seja bloqueado:", + "LabelTranscodePath": "Caminho para a transcodificação:", + "LabelTranscodes": "Transcodificações:", + "LabelUserLoginAttemptsBeforeLockout": "Número de tentativas de login antes de bloquear o usuário:", "DashboardVersionNumber": "Versão: {0}", "DashboardServerName": "Servidor: {0}", "DashboardOperatingSystem": "Sistema Operacional: {0}", @@ -1354,12 +1237,8 @@ "LabelWeb": "Web:", "OptionBluray": "Blu-ray", "LabelProfileContainer": "Formato:", - "LabelTranscodingContainer": "Formato:", "LabelXDlnaCap": "X-DLNA cap:", "LabelXDlnaDoc": "X-DLNA doc:", - "LaunchWebAppOnStartup": "Executar a interface web quando iniciar o servidor", - "LaunchWebAppOnStartupHelp": "Abre o cliente web no seu navegador padrão quando o servidor iniciar. Isso não ocorrerá ao usar a função de reiniciar o servidor.", - "MediaInfoSoftware": "Software", "MediaInfoStreamTypeAudio": "Áudio", "MediaInfoStreamTypeData": "Dados", "MediaInfoStreamTypeEmbeddedImage": "Imagem Incorporada", @@ -1370,7 +1249,6 @@ "MusicAlbum": "Álbum de Música", "MusicArtist": "Artista da Música", "MusicVideo": "Videoclipe", - "OptionAutomatic": "Automático", "OptionBanner": "Banner", "OptionBlockTrailers": "Trailers", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", @@ -1391,7 +1269,7 @@ "OptionSubstring": "Substring", "OptionThumb": "Miniatura", "OptionThumbCard": "Cartão de miniatura", - "PasswordResetProviderHelp": "Escolha um fornecedor de redefinição de senhas para ser usado quando este usuário solicitar a redefinição de senha", + "PasswordResetProviderHelp": "Escolha um provedor de reinício de senha a ser usado quando este usuário solicitar uma redefinição de senha.", "PictureInPicture": "Picture in picture", "PlaybackData": "Dados de Reprodução", "Premiere": "Estreia", @@ -1400,12 +1278,10 @@ "TV": "TV", "TabCodecs": "Codecs", "TabContainers": "Formatos", - "TabInfo": "Informações", "TabLogs": "Logs", "TabNetworking": "Rede", "TabPlugins": "Plugins", "TabStreaming": "Streaming", - "TabTrailers": "Trailers", "Tags": "Marcadores", "TagsValue": "Marcadores: {0}", "Trailers": "Trailers", @@ -1449,7 +1325,6 @@ "LabelPlayerDimensions": "Dimensões do player:", "LabelCorruptedFrames": "Quadros corrompidos:", "HeaderNavigation": "Navegação", - "CopyStreamURLError": "Houve um erro ao copiar a URL.", "ButtonSplit": "Dividir", "AskAdminToCreateLibrary": "Peça a um administrador para criar uma biblioteca.", "AllowFfmpegThrottling": "Transcodes do Acelerador", @@ -1469,15 +1344,13 @@ "LastSeen": "Visto pela última vez {0}", "PersonRole": "como {0}", "ListPaging": "{0}-{1} de {2}", - "WriteAccessRequired": "O servidor Jellyfin necessita de acesso de escrita para essa pasta. Garanta o acesso e tente novamente.", + "WriteAccessRequired": "O Jellyfin necessita de acesso de escrita para essa pasta. Garanta o acesso e tente novamente.", "PathNotFound": "O caminho não pôde ser encontrado. Por favor certifique-se da validade e tente novamente.", "YadifBob": "YADIF Bob", "Yadif": "YADIF", "Track": "Trilha", "Season": "Temporada", - "ReleaseGroup": "Grupo de Lançamento", "Person": "Pessoa", - "OtherArtist": "Outro Artista", "Movie": "Filme", "LabelLibraryPageSizeHelp": "Selecione a quantidade de itens a aparecer na página da biblioteca. Coloque 0 para desabilitar a paginação.", "LabelLibraryPageSize": "Tamanho da página da biblioteca:", @@ -1486,21 +1359,17 @@ "DeinterlaceMethodHelp": "Selecione o método de desentrelaçamento a ser usado ao transcodificar o conteúdo entrelaçado.", "BoxSet": "Coleção", "Artist": "Artista", - "AlbumArtist": "Artista do Album", - "Album": "Album", + "AlbumArtist": "Artista do Álbum", + "Album": "Álbum", "UnsupportedPlayback": "O Jellyfin não pode descriptografar conteúdo protegido por DRM, porém mesmo assim fará uma tentativa para todo tipo de conteúdo, incluindo títulos protegidos. A imagem de alguns arquivos pode aparecer completamente preta devido a criptografia ou outros recursos não suportados, como títulos interativos.", - "MessageUnauthorizedUser": "Você não está autorizado a acessar o servidor neste momento. Por favor, contate o administrador do servidor para mais informações.", "ButtonTogglePlaylist": "Playlist", - "ButtonToggleContextMenu": "Mais", "Filter": "Filtro", "New": "Novo", "HeaderFavoritePlaylists": "Playlists Favoritas", "ApiKeysCaption": "Lista de chaves API ativadas no momento", - "TabDVR": "DVR", "SaveChanges": "Salvar mudanças", "LabelRequireHttpsHelp": "Se selecionado, o servidor vai automaticamente redirecionar todas as solicitações HTTP para HTTPS. Isso não terá efeito se o servidor não estiver escutando HTTPS.", "LabelRequireHttps": "Necessita HTTPS", - "LabelNightly": "Nightly", "LabelStable": "Estável", "LabelChromecastVersion": "Versão do Chromecast", "LabelEnableHttpsHelp": "Permite que o servidor escute na porta HTTPS configurada. Um certificado válido também deve ser configurado para que isso entre em vigor.", @@ -1541,8 +1410,8 @@ "HeaderSyncPlaySelectGroup": "Entrar em um grupo", "EnableDetailsBanner": "Banner de detalhes", "EnableDetailsBannerHelp": "Exibe um banner na parte superior da página de detalhes do item.", - "EnableBlurhashHelp": "Imagens que ainda estão carregando vão mostrar em seu lugar representações", - "EnableBlurhash": "Habilitar efeito borrado para imagens previas", + "EnableBlurHashHelp": "Imagens que ainda estão carregando vão mostrar em seu lugar representações.", + "EnableBlurHash": "Habilitar efeito borrado para imagens previas", "ShowMore": "Mostrar mais", "ShowLess": "Mostrar menos", "ButtonSyncPlay": "SyncPlay", @@ -1567,5 +1436,11 @@ "ViewAlbumArtist": "Ver artista do álbum", "PreviousTrack": "Ir para o anterior", "NextTrack": "Ir para o próximo", - "LabelUnstable": "Instável" + "LabelUnstable": "Instável", + "Preview": "Pré-visualização", + "LabelSubtitleVerticalPosition": "Posição Vertical:", + "MessageGetInstalledPluginsError": "Um erro ocorreu durante a requisição da lista de plugins atualmente instalados.", + "MessagePluginInstallError": "Um erro ocorreu durante a instalação do plugin.", + "PlaybackRate": "Taxa de Reprodução", + "SubtitleVerticalPositionHelp": "Numero da linha onde o texto aparece. Números positivos indicam de cima para baixo. Números negativos indicam de baixo para cima." } diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index 4243a4869c..d421efa30d 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -4,72 +4,50 @@ "AddToPlaylist": "Adicionar à lista de reprodução", "AdditionalNotificationServices": "Explore o catálogo de extensões para instalar serviços adicionais de notificação.", "All": "Todos", - "AttributeNew": "Novo", "Audio": "Áudio", "Backdrops": "Imagens de Fundo", - "BrowsePluginCatalogMessage": "Procure extensões disponíveis no nosso catálogo.", - "ButtonAdd": "Adicionar", + "MessageBrowsePluginCatalog": "Procure extensões disponíveis no nosso catálogo.", "ButtonAddMediaLibrary": "Adicionar Biblioteca de Multimédia", "ButtonAddScheduledTaskTrigger": "Adicionar tarefa agendada", "ButtonAddServer": "Adicionar Servidor", "ButtonAddUser": "Adicionar Utilizador", - "ButtonArrowDown": "Baixo", "ButtonArrowLeft": "Esquerda", "ButtonArrowRight": "Direita", - "ButtonArrowUp": "Cima", "ButtonBack": "Voltar", "ButtonCancel": "Cancelar", "ButtonChangeServer": "Alterar Servidor", - "ButtonConnect": "Ligar", - "ButtonDelete": "Remover", - "ButtonDeleteImage": "Apagar imagem", - "ButtonEdit": "Editar", "ButtonEditOtherUserPreferences": "Editar este perfil de utilizador, imagem e preferências pessoais.", - "ButtonFilter": "Filtro", "ButtonForgotPassword": "Esqueci-me da palavra-passe", "ButtonFullscreen": "Ecrã inteiro", - "ButtonHelp": "Ajuda", - "ButtonHome": "Início", "ButtonInfo": "Informação", - "ButtonLearnMore": "Saiba mais", "ButtonManualLogin": "Início de Sessão Manual", "ButtonMore": "Mais", "ButtonNetwork": "Rede", - "ButtonNew": "Novo", "ButtonNextTrack": "Faixa seguinte", "ButtonOpen": "Abrir", "ButtonPause": "Pausar", - "ButtonPlay": "Reproduzir", "ButtonPreviousTrack": "Faixa anterior", "ButtonProfile": "Perfil", "ButtonQuickStartGuide": "Guia de Início Rápido", - "ButtonRefresh": "Atualizar", "ButtonRefreshGuideData": "Atualizar Programação de TV", "ButtonRemove": "Remover", - "ButtonRepeat": "Repetir", "ButtonResetEasyPassword": "Redefinir código PIN", "ButtonResetPassword": "Redefinir palavra-passe", "ButtonRestart": "Reiniciar", "ButtonResume": "Retomar", "ButtonRevoke": "Revogar", - "ButtonSave": "Guardar", "ButtonScanAllLibraries": "Analisar todas as Bibliotecas", - "ButtonSearch": "Procurar", "ButtonSelectDirectory": "Selecione a Pasta", "ButtonSelectView": "Selecionar visualização", "ButtonSend": "Enviar", "ButtonSettings": "Configurações", - "ButtonShuffle": "Aleatório", "ButtonShutdown": "Encerrar", "ButtonSignIn": "Iniciar Sessão", "ButtonSignOut": "Sair", - "ButtonSort": "Organizar", "ButtonStart": "Iniciar", "ButtonStop": "Parar", "ButtonSubmit": "Enviar", - "ButtonSubtitles": "Legendas", "ButtonUninstall": "Desinstalar", - "ButtonViewWebsite": "Ver website", "ChannelAccessHelp": "Selecione os canais para partilhar com este utilizador. Os administradores poderão editar todos os canais utilizando o gestor de metadados.", "CinemaModeConfigurationHelp": "O modo cinema traz a experiência do cinema para a sua sala, possibilitando reproduzir trailers e introduções personalizadas antes da longa-metragem.", "Composer": "Compositor", @@ -113,22 +91,17 @@ "HeaderActiveDevices": "Dispositivos Ativos", "HeaderActiveRecordings": "Gravações Ativas", "HeaderActivity": "Atividade", - "HeaderAddScheduledTaskTrigger": "Adicionar Tarefa Agendada", "HeaderAddToCollection": "Adicionar à Coleção", "HeaderAddUpdateImage": "Adicionar/Atualizar Imagem", - "HeaderAddUser": "Adicionar Utilizador", "HeaderAdditionalParts": "Partes Adicionais", "HeaderApiKey": "Chave da API", "HeaderApiKeys": "Chaves da API", "HeaderApiKeysHelp": "As aplicações externas necessitam de uma chave da API para comunicar com o Jellyfin Server. As chaves são emitidas ao entrar com uma conta Jellyfin ou concedendo manualmente a chave à aplicação.", "HeaderApp": "Aplicação", "HeaderAudioSettings": "Configurações de Áudio", - "HeaderAutomaticUpdates": "Atualizações automáticas", "HeaderBlockItemsWithNoRating": "Bloquear conteúdo sem informação de classificação etária ou com informação desconhecida:", "HeaderBranding": "Marca", - "HeaderCastCrew": "Elenco e Equipa", "HeaderChannelAccess": "Acesso ao Canal", - "HeaderChannels": "Canais", "HeaderCodecProfile": "Perfil do Codec", "HeaderCodecProfileHelp": "Perfis do Codec indicam as limitações de um dispositivo ao reproduzir codecs específicos. Se uma limitação ocorre, o ficheiro multimédia será transcodificado, mesmo se o codec estiver configurado para reprodução direta.", "HeaderConfirmProfileDeletion": "Confirmar Remoção do Perfil", @@ -147,18 +120,13 @@ "HeaderDevices": "Dispositivos", "HeaderDirectPlayProfile": "Perfil da Reprodução Direta", "HeaderDirectPlayProfileHelp": "Adicionar perfis de reprodução direta que indiquem que formatos o dispositivo pode suportar nativamente.", - "HeaderDisplay": "Visualização", "HeaderEasyPinCode": "Código PIN", "HeaderEnabledFields": "Campos Ativados", "HeaderEnabledFieldsHelp": "Desmarque um campo para bloqueá-lo e evitar que seus dados sejam alterados.", "HeaderError": "Erro", "HeaderFeatureAccess": "Acesso a Características", - "HeaderFeatures": "Recursos", "HeaderFetchImages": "Procurar Imagens:", - "HeaderFilters": "Filtros", - "HeaderForgotPassword": "Esqueci-me da palavra-passe", "HeaderFrequentlyPlayed": "Reproduzido Frequentemente", - "HeaderGenres": "Géneros", "HeaderGuideProviders": "Provedores de Programação de TV", "HeaderHttpHeaders": "Cabeçalhos HTTP", "HeaderIdentification": "Identificação", @@ -177,22 +145,17 @@ "HeaderLibraryAccess": "Acesso à Biblioteca", "HeaderLibraryFolders": "Pastas Multimédia", "HeaderLibrarySettings": "Configurações da Biblioteca", - "HeaderLiveTV": "TV em Direto", - "HeaderLiveTv": "TV em Direto", "HeaderLoginFailure": "Falha no Login", "HeaderMedia": "Multimédia", "HeaderMediaFolders": "Pastas Multimédia", - "HeaderMediaInfo": "Informações Multimédia", "HeaderMetadataSettings": "Configurações de Metadados", "HeaderMusicVideos": "Videoclips", "HeaderMyMedia": "O Meu Conteúdo", "HeaderNewApiKey": "Nova Chave da API", - "HeaderNextUp": "A Seguir", "HeaderParentalRatings": "Classificações Parentais", "HeaderPassword": "Palavra-passe", "HeaderPasswordReset": "Redefinição de Palavra-Passe", "HeaderPaths": "Localizações", - "HeaderPeople": "Pessoas", "HeaderPinCodeReset": "Redefinir Código PIN", "HeaderPlayAll": "Reproduzir Todos", "HeaderPlayback": "Reprodução de Multimédia", @@ -212,7 +175,6 @@ "HeaderRevisionHistory": "Histórico de Versões", "HeaderRunningTasks": "Tarefas em Execução", "HeaderScenes": "Cenas", - "HeaderSchedule": "Agendamentos", "HeaderSelectCertificatePath": "Selecione a Localização do Certificado", "HeaderSelectMetadataPath": "Selecione a Localização dos Metadados", "HeaderSelectMetadataPathHelp": "Procure ou introduza a localização da pasta para guardar os metadados. O Servidor Jellyfin deve ter acesso de escrita a essa pasta.", @@ -223,11 +185,9 @@ "HeaderSelectTranscodingPath": "Selecione o Local Temporário da Transcodificação", "HeaderSelectTranscodingPathHelp": "Procure ou introduza a localização da pasta para guardar os ficheiros temporários de transcodificação. O Servidor Jellyfin deve ter acesso de escrita a essa pasta.", "HeaderSendMessage": "Enviar mensagem", - "HeaderSeries": "Série", "HeaderServerSettings": "Configurações do Servidor", "HeaderSettings": "Configurações", "HeaderSetupLibrary": "Configurar Bibliotecas Multimédia", - "HeaderShutdown": "Encerrar", "HeaderSpecialEpisodeInfo": "Informação do Episódio Especial", "HeaderSpecialFeatures": "Extras", "HeaderStatus": "Estado", @@ -249,7 +209,6 @@ "HeaderXmlDocumentAttributes": "Atributos do Documento XML", "HeaderXmlSettings": "Configurações de XML", "HeaderYears": "Anos", - "HeadersFolders": "Pastas", "Help": "Ajuda", "Identify": "Identificar", "Images": "Imagens", @@ -273,9 +232,6 @@ "LabelAlbumArtMaxWidthHelp": "Resolução máxima da capa do álbum exposta via upnp:albumArtURI.", "LabelAlbumArtPN": "PN da capa do álbum:", "LabelAlbumArtists": "Artistas do Álbum:", - "LabelAll": "Todos", - "LabelAllowServerAutoRestart": "Permitir ao servidor reiniciar automaticamente para aplicar atualizações", - "LabelAllowServerAutoRestartHelp": "O servidor irá reiniciar apenas durante períodos em que não esteja a ser usado, quando nenhum utilizador estiver ativo.", "LabelAppName": "Nome da aplicação", "LabelAppNameExample": "Exemplo: Sickbeard, Sonarr", "LabelArtists": "Artistas:", @@ -297,7 +253,6 @@ "LabelCustomCertificatePathHelp": "Localização do ficheiro PKCS #12 que contém um certificado e um chave privada, que permite ativar o suporte a ligações TLS em domínios privados.", "LabelCustomCss": "CSS personalizado:", "LabelCustomCssHelp": "Aplica um ficheiro de estilos customizado à interface web.", - "LabelCustomDeviceDisplayName": "Nome a ser mostrado:", "LabelCustomDeviceDisplayNameHelp": "Forneça um nome a ser mostrado, ou deixe em branco para utilizar o nome reportado pelo dispositivo.", "LabelCustomRating": "Classificação personalizada:", "LabelDateAdded": "Adicionado a:", @@ -308,7 +263,6 @@ "LabelDefaultUserHelp": "Determina que biblioteca será apresentada aos dispositivos ligados. Pode ser redefinido para cada dispositivo utilizando perfis.", "LabelDeviceDescription": "Descrição do dispositivo", "LabelDidlMode": "Modo DIDL:", - "LabelDisplayMissingEpisodesWithinSeasons": "Mostrar episódios em falta numa série", "LabelDisplayName": "Nome para apresentação:", "LabelDisplayOrder": "Ordem de apresentação:", "LabelDisplaySpecialsWithinSeasons": "Mostrar epsódios especiais nas temporadas em que estrearam", @@ -409,7 +363,6 @@ "LabelName": "Nome:", "LabelNewPassword": "Nova palavra-passe:", "LabelNewPasswordConfirm": "Confirmar nova palavra-passe:", - "LabelNext": "Seguinte", "LabelNotificationEnabled": "Ativar esta notificação", "LabelNumberOfGuideDays": "Número de dias de programação de TV para transferir:", "LabelNumberOfGuideDaysHelp": "Transferir mais dias de programação de TV permite agendar com maior antecedência e ver mais listagens, no entanto, irá levar mais tempo a transferir. Se selecionar Automático, será escolhido o período baseado no número de canais.", @@ -424,8 +377,6 @@ "LabelPlaceOfBirth": "Local de nascimento:", "LabelPlayDefaultAudioTrack": "Reproduzir a faixa de áudio padrão independentemente do idioma", "LabelPreferredDisplayLanguage": "Idioma de visualização preferido:", - "LabelPreferredDisplayLanguageHelp": "A tradução do Jellyfin é um projeto contínuo.", - "LabelPrevious": "Anterior", "LabelProfileAudioCodecs": "Codecs do áudio:", "LabelProfileCodecsHelp": "Separados por vírgula. Pode ser deixado em branco para usar com todos os codecs.", "LabelProfileContainer": "Contentor:", @@ -438,7 +389,6 @@ "LabelPublicHttpPortHelp": "Número do porto público que deverá ser mapeado para o porto HTTP local.", "LabelPublicHttpsPort": "Número do porto público HTTPS:", "LabelPublicHttpsPortHelp": "Número do porto público que deverá ser mapeado para o porto HTTPS local.", - "LabelReadHowYouCanContribute": "Veja como pode contribuir.", "LabelRecordingPath": "Localização predefinida das gravações:", "LabelReleaseDate": "Data de lançamento:", "LabelRemoteClientBitrateLimit": "Taxa de bits máxima para transmissão para a Internet (Mbps):", @@ -470,12 +420,9 @@ "LabelTagline": "Slogan:", "LabelTime": "Tempo:", "LabelTimeLimitHours": "Limite de tempo (horas):", - "LabelTranscodingAudioCodec": "Codec de áudio:", - "LabelTranscodingContainer": "Contentor:", "LabelTranscodingTempPathHelp": "Indique uma localização personalizada para os ficheiros de transcodificação em utilização, ou deixe em branco para utilizar o caminho por defeito.", "LabelTranscodingThreadCount": "Número de threads de transcodificação:", "LabelTranscodingThreadCountHelp": "Indique o número máximo de threads a ser utilizado para transcodificação. Reduzir o número de threads diminuirá a utilização do CPU, mas pode não converter rápido o suficiente para uma experiência de reprodução suave.", - "LabelTranscodingVideoCodec": "Codec do vídeo:", "LabelTriggerType": "Tipo do Acionador:", "LabelTunerIpAddress": "Endereço IP do Sintonizador:", "LabelTunerType": "Tipo do sintonizador:", @@ -490,7 +437,6 @@ "LabelVersionInstalled": "{0} instalado", "LabelXDlnaCapHelp": "Determina o conteúdo do elemento X_DLNACAP no namespace urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDocHelp": "Determina o conteúdo do elemento X_DLNADOC no namespace urn:schemas-dlna-org:device-1-0.", - "LabelYourFirstName": "O seu primeiro nome:", "LabelYoureDone": "Concluiu!", "LabelZipCode": "CEP:", "LibraryAccessHelp": "Escolha as Bibliotecas a partilhar com este utilizador. Os Administradores poderão editar todas as pastas, usando o Gestor de Metadados.", @@ -527,7 +473,7 @@ "Mute": "Desativar Som", "NewCollection": "Nova Coleção", "NewCollectionNameExample": "Exemplo: Coleção Guerra das Estrelas", - "NoNextUpItemsMessage": "Nenhum encontrado. Comece a ver os seus programas!", + "MessageNoNextUpItems": "Nenhum encontrado. Comece a ver os seus programas!", "OptionAdminUsers": "Administradores", "OptionAlbum": "Álbum", "OptionAlbumArtist": "Artista do Álbum", @@ -546,7 +492,6 @@ "OptionAllowVideoPlaybackTranscoding": "Permitir reprodução de vídeo que necessite de transcodificação", "OptionArtist": "Artista", "OptionAscending": "Ascendente", - "OptionAutomatic": "Automático", "OptionBlockBooks": "Livros", "OptionBlockChannelContent": "Conteúdo do Canal de Internet", "OptionBlockLiveTvChannels": "Canais de TV em Direto", @@ -586,7 +531,6 @@ "OptionEveryday": "Todos os dias", "OptionExternallyDownloaded": "Download Externo", "OptionFavorite": "Favoritos", - "OptionFriday": "Sexta", "OptionHasSpecialFeatures": "Extras", "OptionHasSubtitles": "Legendas", "OptionHasThemeSong": "Música de Tema", @@ -600,11 +544,9 @@ "OptionLikes": "Gostos", "OptionMax": "Máx", "OptionMissingEpisode": "Episódios em Falta", - "OptionMonday": "Segunda", "OptionNameSort": "Nome", "OptionNew": "Nova…", "OptionNone": "Nenhum", - "OptionOnAppStartup": "Ao iniciar a aplicação", "OptionOnInterval": "Num intervalo", "OptionParentalRating": "Classificação Parental", "OptionPlainStorageFolders": "Mostrar todas as pastas como pastas de armazenamento simples", @@ -624,18 +566,13 @@ "OptionResElement": "elemento res", "OptionResumable": "Retomável", "OptionRuntime": "Duração", - "OptionSaturday": "Sábado", "OptionSaveMetadataAsHidden": "Guardar metadados e imagens como ficheiros ocultos", "OptionSpecialEpisode": "Especiais", - "OptionSunday": "Domingo", - "OptionThursday": "Quinta", "OptionTrackName": "Nome da pista", - "OptionTuesday": "Terça", "OptionTvdbRating": "Classificação no TVDB", "OptionUnairedEpisode": "Episódios por Estrear", "OptionUnplayed": "Por reproduzir", "OptionWakeFromSleep": "Retomar da suspensão", - "OptionWednesday": "Quarta", "OptionWeekdays": "Dias da semana", "OptionWeekends": "Fins-de-semana", "OptionWeekly": "Semanalmente", @@ -643,7 +580,7 @@ "PasswordMatchError": "A palavra-passe e a confirmação devem coincidir.", "PasswordResetComplete": "A palavra-passe foi redefinida.", "PasswordResetConfirmation": "Tem a certeza de que deseja redefinir a palavra-passe?", - "PasswordResetHeader": "Redefinir Palavra-Passe", + "HeaderResetPassword": "Redefinir Palavra-Passe", "PasswordSaved": "Palavra-passe guardada.", "PinCodeResetComplete": "O código PIN foi redefinido.", "PinCodeResetConfirmation": "Tem a certeza de que devia repôr o código PIN?", @@ -681,52 +618,26 @@ "SystemDlnaProfilesHelp": "Perfis de sistema são apenas de leitura. Mudanças a um perfil de sistema serão guardadas num novo perfil personalizado.", "TabAccess": "Acesso", "TabAdvanced": "Avançado", - "TabAlbumArtists": "Artistas do Álbum", - "TabAlbums": "Álbuns", - "TabArtists": "Artistas", "TabCatalog": "Catálogo", - "TabChannels": "Canais", - "TabCollections": "Coleções", "TabContainers": "Contentores", "TabDashboard": "Painel Principal", - "TabDevices": "Dispositivos", "TabDirectPlay": "Reprodução Direta", - "TabDisplay": "Visualização", - "TabEpisodes": "Episódios", - "TabFavorites": "Favoritos", - "TabGenres": "Géneros", - "TabGuide": "Programação", "TabLatest": "Mais recente", - "TabLiveTV": "TV em Direto", - "TabMetadata": "Metadados", - "TabMovies": "Filmes", "TabMusic": "Música", - "TabMusicVideos": "Videoclips", "TabMyPlugins": "As Minhas Extensões", "TabNetworks": "Redes", "TabNfoSettings": "Definições de Ficheiros NFO", "TabNotifications": "Notificações", "TabOther": "Outro", "TabParentalControl": "Controlo Parental", - "TabPassword": "Palavra-passe", - "TabPlayback": "Reprodução", - "TabPlaylist": "Lista de Reprodução", - "TabPlaylists": "Listas de Reprodução", "TabPlugins": "Extensões", "TabProfile": "Perfil", "TabProfiles": "Perfis", - "TabRecordings": "Gravações", "TabResponses": "Respostas", "TabScheduledTasks": "Tarefas Agendadas", - "TabSeries": "Séries", "TabServer": "Servidor", "TabSettings": "Configurações", - "TabShows": "Séries", - "TabSongs": "Músicas", - "TabSuggestions": "Sugestões", - "TabTranscoding": "Transcodificação", "TabUpcoming": "Próximos", - "TabUsers": "Utilizadores", "TellUsAboutYourself": "Fale-nos sobre si", "ThisWizardWillGuideYou": "Este assistente irá ajudá-lo durante o processo de configuração. Para começar, selecione o idioma.", "Thursday": "Quinta", @@ -734,7 +645,7 @@ "TrackCount": "{0} faixas", "Tuesday": "Terça", "UninstallPluginConfirmation": "Tem a certeza de que deseja desinstalar {0}?", - "UninstallPluginHeader": "Desinstalar Extensão", + "HeaderUninstallPlugin": "Desinstalar Extensão", "Unmute": "Ativar som", "UserProfilesIntro": "O Jellyfin suporta perfis de utilizadores, permitindo que cada utilizador tenha as suas configurações de visualização, estado da reprodução e controlos parentais.", "ValueAudioCodec": "Codec de Áudio: {0}", @@ -749,7 +660,6 @@ "Writer": "Autor", "XmlDocumentAttributeListHelp": "Estes atributos são aplicados ao elemento principal de cada resposta XML.", "AccessRestrictedTryAgainLater": "Acesso atualmente restrito. Por favor, tente mais tarde.", - "AddItemToCollectionHelp": "Adicione itens às coleções pesquisando-os e utilizando o respetivo menu de toque ou clique direito para os adicionar a uma coleção.", "AddToCollection": "Adicionar à coleção", "AddToPlayQueue": "Adicionar à fila de reprodução", "AddedOnValue": "Adicionado {0}", @@ -777,7 +687,6 @@ "AspectRatio": "Proporção", "AuthProviderHelp": "Selecione um mecanismo de autenticação a ser utilizado para validar as credenciais deste utilizador.", "Auto": "Automático", - "AutoBasedOnLanguageSetting": "Automático (baseado no idioma definido)", "BirthDateValue": "Nascimento: {0}", "BirthPlaceValue": "Local de nascimento: {0}", "Blacklist": "Lista Negra", @@ -822,8 +731,6 @@ "ButtonLibraryAccess": "Acesso à biblioteca", "ButtonGuide": "Programação", "ButtonGotIt": "Entendido", - "ButtonEditImages": "Editar imagens", - "ButtonDownload": "Transferir", "ButtonAudioTracks": "Faixas de Áudio", "Browse": "Procurar", "BoxRear": "Caixa (verso)", @@ -836,14 +743,11 @@ "Aired": "Estreou", "HeaderKeepRecording": "Manter Gravação", "HeaderKeepSeries": "Manter Série", - "HeaderItems": "Itens", "HeaderImageOptions": "Opções de Imagem", - "HeaderHome": "Início", "HeaderForKids": "Para Crianças", "HeaderFavoriteVideos": "Vídeos Favoritos", "HeaderFavoriteMovies": "Filmes Favoritos", "HeaderExternalIds": "IDs Externos:", - "HeaderEpisodes": "Episódios", "HeaderEditImages": "Editar Imagens", "HeaderDownloadSync": "Transferência & Sincronização", "HeaderDetectMyDevices": "Detetar os Meus Dispositivos", @@ -857,11 +761,9 @@ "HeaderChapterImages": "Imagens do Capítulo", "HeaderCancelSeries": "Cancelar Gravação de Série", "HeaderCancelRecording": "Cancelar Gravação", - "HeaderBooks": "Livros", "HeaderAudioBooks": "Livros de Áudio", "HeaderAllowMediaDeletionFrom": "Permitir remoção de multimédia a partir de", "HeaderAlert": "Alerta", - "HeaderAlbums": "Álbuns", "HeaderAddToPlaylist": "Adicionar à Lista de Reprodução", "HDPrograms": "Programas HD", "EncoderPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho, ou um valor mais lento para melhorar a qualidade.", @@ -881,7 +783,7 @@ "ExtraLarge": "Extra Grande", "EveryNDays": "A cada {0} dias", "ErrorSavingTvProvider": "Ocorreu um erro ao guardar o provedor do serviços de TV. Por favor, garanta que está acessível e tente de novo.", - "ErrorMessageStartHourGreaterThanEnd": "A hora de fim deve ser superior à hora de início.", + "ErrorStartHourGreaterThanEnd": "A hora de fim deve ser superior à hora de início.", "ErrorDeletingItem": "Ocorreu um erro ao apagar o item do Servidor Jellyfin. Por favor, verifique o acesso de escrita do Servidor Jellyfin à pasta e tente de novo.", "ErrorAddingTunerDevice": "Ocorreu um erro ao adicionar o dispositivo de sintonização. Por favor, garanta que está acessível e tente de novo.", "ErrorAddingXmlTvFile": "Ocorreu um erro ao aceder ao ficheiro XMLTV. Por favor, certifique-se que o ficheiro está acessível e tente de novo.", @@ -915,7 +817,7 @@ "DirectStreamHelp2": "Reprodução direta de um ficheiro requer pouco processamento e não implica perda de qualidade num vídeo.", "DefaultSubtitlesHelp": "As legendas são carregadas com base nas definições por defeito ou forçado nos metadados. As preferências de idioma são consideradas quando existem múltiplas opções disponíveis.", "DefaultMetadataLangaugeDescription": "Estes são os valores por defeito que podem ser customizados para cada uma das bibliotecas.", - "DefaultErrorMessage": "Ocorreu um erro a processar o pedido. Por favor, tente novamente mais tarde.", + "ErrorDefault": "Ocorreu um erro a processar o pedido. Por favor, tente novamente mais tarde.", "Default": "Por defeito", "DeathDateValue": "Faleceu: {0}", "DatePlayed": "Reproduzido a", @@ -941,7 +843,6 @@ "LabelDefaultScreen": "Ecrã por defeito:", "LabelDeathDate": "Data de falecimento:", "LabelDateTimeLocale": "Localização da data/hora:", - "LabelDashboardTheme": "Tema do Painel Principal:", "LabelCertificatePasswordHelp": "Se o certificado requer uma palavra-passe, escreva-a aqui.", "LabelCertificatePassword": "Palavra-passe do certificado:", "LabelBurnSubtitles": "Integrar legendas:", @@ -951,7 +852,6 @@ "LabelBindToLocalNetworkAddress": "Endereço local para colocar o servidor à escuta:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Atualizar metadados automaticamente a partir da Internet:", "LabelAuthProvider": "Provedor de autenticação:", - "LabelAudio": "Áudio", "LabelAllowedRemoteAddressesMode": "Tipo de filtro de IP remoto:", "LabelAllowedRemoteAddresses": "Filtro de IP remoto:", "LabelAllowHWTranscoding": "Permitir transcodificação por hardware", @@ -976,8 +876,6 @@ "LabelSelectFolderGroups": "Agrupar automaticamente o conteúdo das seguintes pastas em vistas como Filmes, Música e TV:", "HeaderUpcomingOnTV": "A Seguir", "HeaderLiveTvTunerSetup": "Configurar Sintonizador de TV", - "ButtonUp": "Para cima", - "ButtonDown": "Para baixo", "RecordSeries": "Gravar série", "LabelKeepUpTo": "Manter, no máximo:", "AroundTime": "Por volta das {0}", @@ -991,18 +889,16 @@ "SaveSubtitlesIntoMediaFoldersHelp": "Guardar ficheiros de legendas junto aos ficheiros vídeo facilita a gestão.", "SaveSubtitlesIntoMediaFolders": "Guardar legendas nas pastas multimédia", "Runtime": "Duração", - "RunAtStartup": "Executar no arranque", "ResumeAt": "Retomar a partir de {0}", "ReplaceAllMetadata": "Substituir todos os metadados", "RepeatOne": "Repetir este", "RepeatMode": "Modo de Repetição", "ServerRestartNeededAfterPluginInstall": "O Servidor Jellyfin necessitará de reiniciar depois de instalar uma extensão.", - "NoPluginConfigurationMessage": "Esta extensão não é configurável.", + "MessageNoPluginConfiguration": "Esta extensão não é configurável.", "MessagePluginInstallDisclaimer": "As extensões desenvolvidas pela comunidade Jellyfin são uma ótima forma de melhorar a experiência de utilização do Jellyfin, adicionando novas funcionalidades e benefícios. Antes de proceder à instalação, tenha em atenção que estas podem alterar determinados comportamentos no Servidor Jellyfin e provocar efeitos como tempos de atualização da Biblioteca mais longos, processamento adicional em segundo plano e estabilidade do sistema reduzida.", "MessagePluginConfigurationRequiresLocalAccess": "Para configurar esta extensão, inicie sessão localmente no servidor.", - "MessageInstallPluginFromApp": "Esta extensão deverá ser instalada a partir da aplicação onde tem intenção de a utilizar.", "HeaderPluginInstallation": "Instalação de Extensão", - "PluginInstalledMessage": "A extensão foi instalada com sucesso. O Servidor Jellyfin necessitará de reiniciar para aplicar as alterações.", + "MessagePluginInstalled": "A extensão foi instalada com sucesso. O Servidor Jellyfin necessitará de reiniciar para aplicar as alterações.", "PleaseRestartServerName": "Por favor, reinicie o Servidor Jellyfin - {0}.", "PleaseConfirmPluginInstallation": "Por favor clique em OK para confirmar que leu o conteúdo acima, e que deseja prosseguir com a instalação da extensão.", "PleaseAddAtLeastOneFolder": "Por favor, adicione pelo menos uma pasta a esta Biblioteca, utilizando para isso o botão Adicionar.", @@ -1069,9 +965,7 @@ "Sports": "Desporto", "News": "Notícias", "Programs": "Programas", - "HeaderMovies": "Filmes", "Directors": "Realização", - "ButtonOff": "Desligado", "ButtonAddImage": "Adicionar Imagem", "LabelOriginalTitle": "Título original:", "LabelPostProcessorArgumentsHelp": "Utilizar o caminho {path} como caminho para o ficheiro de gravação.", @@ -1079,8 +973,6 @@ "LabelBaseUrl": "URL Base:", "LabelNewName": "Novo nome:", "HeaderUploadImage": "Enviar Imagem", - "EnableThemeSongs": "Músicas do tema", - "EnableThemeVideos": "Vídeos do tema", "HeaderMoreLikeThis": "Mais Como Este", "HeaderRecordingPostProcessing": "Pós-Processamento de Gravações", "Descending": "Descendente", @@ -1161,7 +1053,6 @@ "MediaInfoStreamTypeEmbeddedImage": "Imagem Integrada", "MediaInfoStreamTypeData": "Dados", "MediaInfoStreamTypeAudio": "Áudio", - "MediaInfoSoftware": "Software", "MediaInfoTimestamp": "Data e Hora", "MediaInfoSampleRate": "Taxa de Amostragem", "MediaInfoResolution": "Resolução", @@ -1174,8 +1065,6 @@ "DetectingDevices": "A procurar dispositivos", "CopyStreamURL": "Copiar URL da transmissão", "Disc": "Disco", - "EnableBackdrops": "Imagens de Fundo", - "HeaderTags": "Etiquetas", "LabelLogs": "Registos:", "LabelSortTitle": "Título para ordenação:", "HeaderFavoritePeople": "Pessoas Favoritas", @@ -1187,12 +1076,10 @@ "LabelMetadataSaversHelp": "Escolha o formato em que deseja guardar metadados.", "LabelRefreshMode": "Modo de actualização:", "LabelRemoteClientBitrateLimitHelp": "Valor-limite de taxa de transmissão para todos os dispositivos fora da rede local. Este valor é opcional e aplica-se a cada transmissão individual. Ao definir este valor previne que dispositivos peçam uma taxa de transmissão acima da sua ligação à internet. Pedir uma taxa de transmissão acima do limite da ligação implica a necessidade de transcodificar o vídeo e num aumento da carga da CPU.", - "LabelSoundEffects": "Efeitos sonoros:", "Home": "Início", "GuideProviderLogin": "Iniciar Sessão", "HeaderSubtitleDownloads": "Transferir legendas", "LabelRecord": "Gravação:", - "LabelSkin": "Máscara:", "LabelMetadataDownloadersHelp": "Ative e ordene os seus provedores de metadados por ordem de preferência. Provedores com menos prioridade só serão usados para completar informação em falta.", "LabelMetadataReadersHelp": "Ordene as suas fontes de metadados por ordem de preferência. O primeiro ficheiro encontrado será utilizado.", "LabelMetadataReaders": "Provedores de metadados:", @@ -1207,7 +1094,7 @@ "StopRecording": "Parar gravação", "SeriesRecordingScheduled": "Gravação da série agendada.", "Recordings": "Gravações", - "RecordingPathChangeMessage": "Alterar a localização das gravações não irá migrar as gravações existentes da localização atual para a nova. Os ficheiros deverão ser movidos manualmente, se necessário.", + "MessageChangeRecordingPath": "Alterar a localização das gravações não irá migrar as gravações existentes da localização atual para a nova. Os ficheiros deverão ser movidos manualmente, se necessário.", "ManageRecording": "Gerir gravação", "OptionLoginAttemptsBeforeLockout": "Determina quantas falhas de início de sessão são admitidas antes de a conta ser bloqueada.", "OptionList": "Lista", @@ -1274,7 +1161,6 @@ "Metadata": "Metadados", "MessageYouHaveVersionInstalled": "Neste momento está instalada a versão {0}.", "MessageUnsetContentHelp": "O conteúdo será mostrado como pastas simples. Para melhores resultados, utilize o gestor de metadados para definir o tipo de conteúdo das sub-pastas.", - "MessageSettingsSaved": "Definições guardadas.", "MessagePleaseWait": "Por favor, aguarde. Esta operação poderá demorar alguns instantes.", "MessagePlayAccessRestricted": "A reprodução deste conteúdo encontra-se, de momento, restrita. Por favor, contacte o administrador do sistema para mais informação.", "MessageNoServersAvailable": "Não foram encontrados servidores através da pesquisa automática.", @@ -1311,15 +1197,12 @@ "LabelTextColor": "Côr do texto:", "LabelTextBackgroundColor": "Côr de fundo do texto:", "LabelTag": "Etiqueta:", - "LabelSubtitles": "Legendas", "LabelSportsCategories": "Categorias de Desporto:", "FetchingData": "A transferir informação adicional", "List": "lista", - "LaunchWebAppOnStartup": "Iniciar a interface web ao iniciar o servidor", "No": "Não", "OptionRegex": "Expressão Regular", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", - "NoSubtitles": "Sem legendas", "NoSubtitleSearchResultsFound": "Sem resultados.", "NoNewDevicesFound": "Não foi encontrado nenhum dispositivo novo. Para adicionar um novo sintonizador, feche este diálogo e introduza manualmente as informações do dispositivo.", "NextUp": "A Seguir", @@ -1337,7 +1220,6 @@ "MediaInfoAnamorphic": "Anamórfico", "LabelTranscodes": "Transcodificação:", "Whitelist": "Lista branca", - "VideoRange": "Alcance video", "ValueOneAlbum": "1 álbum", "ValueMusicVideoCount": "{0} videoclips", "ValueMovieCount": "{0} filmes", @@ -1358,10 +1240,7 @@ "ThemeSongs": "Músicas de tema", "TagsValue": "Etiquetas: {0}", "Tags": "Etiquetas", - "TabTrailers": "Trailers", - "TabResumeSettings": "Retomar", "TabLogs": "Logs", - "TabInfo": "Info", "TabCodecs": "Codecs", "Suggestions": "Sugestões", "SortName": "Ordenar nome", @@ -1387,7 +1266,6 @@ "RefreshMetadata": "Recarregar metadados", "RecentlyWatched": "Vistos recentemente", "Rate": "Avaliação", - "QueueAllFromHere": "Fila a partir daqui", "Quality": "Qualidade", "ProductionLocations": "Localizações de produção", "Primary": "Primário", @@ -1412,9 +1290,7 @@ "MediaInfoDefault": "Padrão", "MediaInfoBitDepth": "Bit profundidade", "Logo": "Logotipo", - "LinksValue": "Ligações: {0}", "Like": "Gosto", - "LaunchWebAppOnStartupHelp": "Abra o cliente web no ser browser padrão quando o servidor iniciar. Isto não acontecerá usando uma função de reiniciar de servidor.", "LabelXDlnaDoc": "X-DLNA doc:", "LabelXDlnaCap": "X-DLNA cap:", "LabelVaapiDeviceHelp": "Este é o nó de renderização usado para aceleração de hardware.", @@ -1429,7 +1305,6 @@ "HeaderNavigation": "Navegação", "EnableStreamLooping": "Auto-cíclico de streams ao vivo", "Down": "Baixo", - "CopyStreamURLError": "Ocorreu um erro a copiar o URL.", "ButtonSplit": "Dividir", "NoCreatedLibraries": "Parece que ainda não foi criada nenhuma biblioteca por enquanto. {0} Gostaria de criar uma biblioteca agora? {1}", "AskAdminToCreateLibrary": "Pergunte a um administrador para criar uma biblioteca.", @@ -1449,7 +1324,6 @@ "LabelRepositoryUrl": "URL do Repositório", "HeaderNewRepository": "Novo Repositório", "MessageNoRepositories": "Sem repositórios.", - "MessageUnauthorizedUser": "Não está autorizado a aceder ao servidor neste momento. Por favor contacte o administador deste servidor para informação mais detalhada.", "LabelSyncPlayAccess": "Acesso \"SyncPlay\"", "LabelSyncPlayAccessNone": "Desativar para este utilizador", "LabelSyncPlayAccessJoinGroups": "Permitir utilizador a aderir a grupos", @@ -1466,7 +1340,6 @@ "EnableFasterAnimations": "Animações Rápidas", "LabelRequireHttpsHelp": "Se selecionado, o servidor irá automaticamente redirecionar todos os pedidos em HTTP para HTTPS. Isto não surte efeito caso o servidor não esteja configurado em HTTPS.", "LabelRequireHttps": "Exigir HTTPS", - "LabelNightly": "\"Nightly\"", "LabelStable": "Estável", "LabelChromecastVersion": "Versão do \"Chromecast\"", "LabelLibraryPageSizeHelp": "Define a quantidade de items a apresentar na página de uma Biblioteca. Para desativar a existência de paginação, introduza o valor 0.", @@ -1490,7 +1363,6 @@ "DeinterlaceMethodHelp": "Selecionar um método de desentrelaçamento para converter conteúdo entrelaçado.", "ClientSettings": "Definições do Cliente", "ButtonTogglePlaylist": "Lista de Reprodução", - "ButtonToggleContextMenu": "Mais", "BoxSet": "Coleção", "Artist": "Artista", "AlbumArtist": "Artista do Álbum", diff --git a/src/strings/pt.json b/src/strings/pt.json index e6d21f584d..733044c2bf 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -24,7 +24,7 @@ "UserAgentHelp": "Forneça um user-agent HTTP personalizado.", "Unplayed": "Por reproduzir", "Unmute": "Activar som", - "UninstallPluginHeader": "Desinstalar Extensão", + "HeaderUninstallPlugin": "Desinstalar Extensão", "UninstallPluginConfirmation": "Tem a certeza que deseja desinstalar {0}?", "Uniform": "Uniforme", "Tuesday": "Terça", @@ -33,53 +33,27 @@ "Thursday": "Quinta", "ThisWizardWillGuideYou": "Este assistente ajudá-lo-á durante o processo de configuração. Para começar, selecione o idioma.", "TellUsAboutYourself": "Fale-nos sobre si", - "TabUsers": "Utilizadores", "TabUpcoming": "Próximos", - "TabTranscoding": "Transcodificação", - "TabSuggestions": "Sugestões", "TabStreaming": "Transmissão", - "TabSongs": "Músicas", - "TabShows": "Séries", "TabSettings": "Configurações", "TabServer": "Servidor", - "TabSeries": "Séries", "TabScheduledTasks": "Tarefas Agendadas", "TabResponses": "Respostas", - "TabRecordings": "Gravações", "TabProfiles": "Perfis", "TabProfile": "Perfil", "TabPlugins": "Extensões", - "TabPlaylists": "Listas de Reprodução", - "TabPlaylist": "Lista de Reprodução", - "TabPlayback": "Reprodução", - "TabPassword": "Palavra-passe", "TabParentalControl": "Controlo Parental", "TabOther": "Outro", "TabNotifications": "Notificações", "TabNfoSettings": "Definições de Ficheiros NFO", "TabNetworks": "Redes", "TabMyPlugins": "As Minhas Extensões", - "TabMusicVideos": "Videoclips", "TabMusic": "Música", - "TabMovies": "Filmes", - "TabMetadata": "Metadados", - "TabLiveTV": "TV em Directo", "TabLatest": "Mais recente", - "TabGuide": "Programação", - "TabGenres": "Géneros", - "TabFavorites": "Favoritos", - "TabEpisodes": "Episódios", - "TabDisplay": "Visualização", "TabDirectPlay": "Reprodução Directa", - "TabDevices": "Dispositivos", "TabDashboard": "Painel Principal", "TabContainers": "Contentores", - "TabCollections": "Colecções", - "TabChannels": "Canais", "TabCatalog": "Catálogo", - "TabArtists": "Artistas", - "TabAlbums": "Álbuns", - "TabAlbumArtists": "Artistas do Álbum", "TabAdvanced": "Avançado", "TabAccess": "Acesso", "TV": "TV", @@ -117,7 +91,6 @@ "Save": "Guardar", "Saturday": "Sábado", "Runtime": "Duração", - "RunAtStartup": "Executar no arranque", "Rewind": "Retroceder", "ResumeAt": "Retomar a partir de {0}", "ReplaceExistingImages": "Substituir imagens existentes", @@ -138,7 +111,7 @@ "Raised": "Alto relevo", "Programs": "Programas", "Producer": "Produtor", - "PluginInstalledMessage": "A extensão foi instalada com sucesso. O Servidor Jellyfin necessitará de reiniciar para aplicar as alterações.", + "MessagePluginInstalled": "A extensão foi instalada com sucesso. O Servidor Jellyfin necessitará de reiniciar para aplicar as alterações.", "PleaseSelectTwoItems": "Por favor seleccione pelo menos dois itens.", "PleaseRestartServerName": "Por favor, reinicie o Servidor Jellyfin - {0}.", "PleaseEnterNameOrId": "Por favor, digite um nome ou Id externo.", @@ -161,7 +134,7 @@ "People": "Pessoas", "PasswordSaved": "Palavra-passe guardada.", "PasswordResetProviderHelp": "Seleccione um provedor de reposição de palavra-passe a ser usado quando um utilizador requisitar uma reposição de palavra-passe", - "PasswordResetHeader": "Redefinir Palavra-Passe", + "HeaderResetPassword": "Redefinir Palavra-Passe", "PasswordResetConfirmation": "Tem a certeza que deseja redefinir a palavra-passe?", "PasswordResetComplete": "A palavra-passe foi redefinida.", "PasswordMatchError": "A palavra-passe e a confirmação devem coincidir.", @@ -174,19 +147,14 @@ "OptionWeekly": "Semanalmente", "OptionWeekends": "Fins-de-semana", "OptionWeekdays": "Dias da semana", - "OptionWednesday": "Quarta", "OptionWakeFromSleep": "Retomar da suspensão", "OptionUnplayed": "Por reproduzir", "OptionUnairedEpisode": "Episódios por Estrear", "OptionTvdbRating": "Classificação no TVDB", - "OptionTuesday": "Terça", "OptionTrackName": "Nome da pista", - "OptionThursday": "Quinta", - "OptionSunday": "Domingo", "OptionSubstring": "Subcadeia", "OptionSpecialEpisode": "Especiais", "OptionSaveMetadataAsHidden": "Guardar metadados e imagens como ficheiros ocultos", - "OptionSaturday": "Sábado", "OptionRuntime": "Duração", "OptionResumable": "Retomável", "OptionResElement": "elemento res", @@ -208,7 +176,6 @@ "OptionPlainStorageFolders": "Mostrar todas as pastas como simples pastas de armazenamento", "OptionParentalRating": "Classificação Parental", "OptionOnInterval": "Num intervalo", - "OptionOnAppStartup": "Ao iniciar a aplicação", "OptionNone": "Nenhum", "OptionNew": "Nova...", "OptionNameSort": "Nome", @@ -220,7 +187,6 @@ "LabelRecordingPathHelp": "Especifique a localização por omissão para guardar as gravações. Se for deixado em branco, a pasta base do servidor será utilizada.", "LabelRecordingPath": "Localização predefinida das gravações:", "LabelReasonForTranscoding": "Razão para transcodificação:", - "LabelReadHowYouCanContribute": "Veja como pode contribuir.", "LabelPublicHttpsPortHelp": "Número da porta pública que deverá ser transferida para a porta HTTPS local.", "LabelPublicHttpsPort": "Número da porta HTTPS pública:", "LabelPublicHttpPortHelp": "Número da porta pública que deverá ser transferida para a porta HTTP local.", @@ -234,9 +200,7 @@ "LabelProfileCodecsHelp": "Separados por vírgula. Pode ser deixado em branco para usar com todos os codecs.", "LabelProfileCodecs": "Codecs:", "LabelProfileAudioCodecs": "Codecs do áudio:", - "LabelPrevious": "Anterior", "LabelPreferredSubtitleLanguage": "Idioma de legendas preferido:", - "LabelPreferredDisplayLanguageHelp": "A tradução do Jellyfin é um projeto contínuo.", "LabelPreferredDisplayLanguage": "Idioma de visualização preferido:", "LabelPostProcessorArgumentsHelp": "Utilizar {path} como caminho para o ficheiro de gravação.", "LabelPostProcessorArguments": "Argumentos de linha de comandos para a aplicação de pós-processamento:", @@ -261,7 +225,6 @@ "LabelNumberOfGuideDays": "Número de dias de programação de TV para transferir:", "LabelNumber": "Número:", "LabelNotificationEnabled": "Activar esta notificação", - "LabelNext": "Seguinte", "LabelNewsCategories": "Categorias para notícias:", "LabelNewPasswordConfirm": "Confirmar nova palavra-passe:", "LabelNewPassword": "Nova palavra-passe:", @@ -389,7 +352,6 @@ "LabelDisplayOrder": "Ordem de apresentação:", "LabelDisplayName": "Nome para apresentação:", "LabelDisplayMode": "Modo de apresentação:", - "LabelDisplayMissingEpisodesWithinSeasons": "Mostrar episódios em falta dentro das temporadas", "LabelDisplayLanguageHelp": "A tradução do Jellyfin é um projeto em desenvolvimento contínuo.", "LabelDisplayLanguage": "Idioma:", "LabelDiscNumber": "Número do disco:", @@ -416,10 +378,8 @@ "LabelDateAddedBehaviorHelp": "Quando os metadados incluirem um valor, este será utilizado antes destas opções.", "LabelDateAddedBehavior": "Comportamento da data de adição para novo conteúdo:", "LabelDateAdded": "Adicionado a:", - "LabelDashboardTheme": "Tema do Painel Principal:", "LabelCustomRating": "Classificação personalizada:", "LabelCustomDeviceDisplayNameHelp": "Forneça um nome a ser mostrado, ou deixe em branco para utilizar o nome reportado pelo dispositivo.", - "LabelCustomDeviceDisplayName": "Nome a ser mostrado:", "LabelCustomCssHelp": "Aplicar um ficheiro de estilos personalizado à interface web.", "LabelCustomCss": "CSS personalizado:", "LabelCustomCertificatePathHelp": "Localização do ficheiro PKCS #12 que contém um certificado e um chave privada que permitem activar o suporte a ligações TLS em domínios privados.", @@ -447,17 +407,13 @@ "LabelAudioCodec": "Codec de áudio:", "LabelAudioChannels": "Canais de áudio:", "LabelAudioBitrate": "Taxa de bits de áudio:", - "LabelAudio": "Áudio", "LabelArtistsHelp": "Separe múltiplos com ;", "LabelArtists": "Artistas:", "LabelAppNameExample": "Exemplo: Sickbeard, NzbDrone", "LabelAppName": "Nome da aplicação", "LabelAllowedRemoteAddressesMode": "Tipo de filtro de IP remoto:", "LabelAllowedRemoteAddresses": "Filtro de IP remoto:", - "LabelAllowServerAutoRestartHelp": "O servidor reiniciará apenas durante períodos em que não esteja a ser usado, quando nenhum utilizador estiver activo.", - "LabelAllowServerAutoRestart": "Permitir ao servidor reiniciar automaticamente para instalar actualizações", "LabelAllowHWTranscoding": "Permitir transcodificação por hardware", - "LabelAll": "Todos", "LabelAlbumArtists": "Artistas do Álbum:", "LabelAlbumArtPN": "PN da capa do álbum:", "LabelAlbumArtMaxWidthHelp": "Resolução máxima da capa do álbum exposta via upnp:albumArtURI.", @@ -490,7 +446,6 @@ "HideWatchedContentFromLatestMedia": "Ocultar os títulos já vistos do conteúdo recente", "Hide": "Esconder", "Help": "Ajuda", - "HeadersFolders": "Pastas", "HeaderYears": "Anos", "HeaderXmlSettings": "Configurações de XML", "HeaderXmlDocumentAttribute": "Atributo do Documento XML", @@ -522,13 +477,11 @@ "HeaderSpecialEpisodeInfo": "Informação do Episódio Especial", "HeaderSortOrder": "Direcção de Ordenação", "HeaderSortBy": "Ordenar Por", - "HeaderShutdown": "Encerrar", "HeaderSetupLibrary": "Configurar Bibliotecas Multimédia", "HeaderSettings": "Configurações", "HeaderServerSettings": "Configurações do Servidor", "HeaderSeriesStatus": "Estado da Série", "HeaderSeriesOptions": "Opções da Série", - "HeaderSeries": "Série", "HeaderSendMessage": "Enviar mensagem", "HeaderSelectTranscodingPathHelp": "Procure ou introduza a localização da pasta para guardar os ficheiros temporários de transcodificação. O Servidor Jellyfin deve ter acesso de escrita a essa pasta.", "HeaderSelectTranscodingPath": "Seleccione o Local Temporário da Transcodificação", @@ -541,7 +494,6 @@ "HeaderSelectCertificatePath": "Seleccione a Localização do Certificado", "HeaderSecondsValue": "{0} Segundos", "HeaderSeasons": "Temporadas", - "HeaderSchedule": "Agendamentos", "HeaderScenes": "Cenas", "HeaderRunningTasks": "Tarefas em Execução", "HeaderRevisionHistory": "Histórico de Versões", @@ -566,7 +518,6 @@ "HeaderPlayAll": "Reproduzir Todos", "HeaderPinCodeReset": "Redefinir Código PIN", "HeaderPhotoAlbums": "Álbuns de Fotografias", - "HeaderPeople": "Pessoas", "HeaderPaths": "Localizações", "HeaderPasswordReset": "Redefinição de Palavra-Passe", "HeaderPassword": "Palavra-passe", @@ -574,7 +525,6 @@ "HeaderOtherItems": "Outros Itens", "HeaderOnNow": "No Ar", "HeaderNextVideoPlayingInValue": "Reprodução do próximo vídeo começa em {0}", - "HeaderNextUp": "A Seguir", "HeaderNextEpisodePlayingInValue": "Reprodução do próximo episódio começa em {0}", "HeaderNewDevices": "Novos Dispositivos", "HeaderNewApiKey": "Nova Chave da API", @@ -583,15 +533,11 @@ "HeaderMyDevice": "O Meu Dispositivo", "HeaderMusicVideos": "Videoclips", "HeaderMusicQuality": "Qualidade da Música", - "HeaderMovies": "Filmes", "HeaderMoreLikeThis": "Mais Como Este", "HeaderMetadataSettings": "Configurações de Metadados", - "HeaderMediaInfo": "Informações Multimédia", "HeaderMediaFolders": "Pastas Multimédia", "HeaderMedia": "Multimédia", "HeaderLiveTvTunerSetup": "Configurar Sintonizador de TV", - "HeaderLiveTv": "TV ao Vivo", - "HeaderLiveTV": "TV em Directo", "HeaderLibrarySettings": "Configurações da Biblioteca", "HeaderLibraryOrder": "Ordenação da Biblioteca", "HeaderLibraryFolders": "Pastas Multimédia", @@ -604,7 +550,6 @@ "HeaderLatestEpisodes": "Últimos Episódios", "HeaderKeepSeries": "Manter Série", "HeaderKeepRecording": "Manter Gravação", - "HeaderItems": "Itens", "HeaderInstantMix": "Mistura instantânea", "HeaderInstall": "Instalar", "HeaderImageSettings": "Configurações de Imagem", @@ -614,17 +559,12 @@ "HeaderIdentificationCriteriaHelp": "Introduza, pelo menos, um critério de identificação.", "HeaderIdentification": "Identificação", "HeaderHttpHeaders": "Cabeçalhos HTTP", - "HeaderHome": "Início", "HeaderGuideProviders": "Provedores de Programação de TV", - "HeaderGenres": "Géneros", "HeaderDeleteTaskTrigger": "Excluir Tarefa Agendada", "HeaderBranding": "Marca", "HeaderFrequentlyPlayed": "Reproduzido Frequentemente", - "HeaderForgotPassword": "Esqueci-me da palavra-passe", "HeaderForKids": "Para Crianças", - "HeaderFilters": "Filtros", "HeaderFetchImages": "Procurar Imagens:", - "HeaderFeatures": "Recursos", "OptionDownloadThumbImage": "Miniatura", "OptionDownloadPrimaryImage": "Principal", "OptionDownloadImagesInAdvanceHelp": "Por omissão, a maioria das imagens são transferidas apenas quando uma aplicação do Jellyfin as solicita. Active esta opção para descarregar todas as imagens antecipadamente, assim que novos ficheiros multimédia sejam importados. Isto pode aumentar significativamente a duração da análise da biblioteca.", @@ -651,7 +591,6 @@ "OptionBlockLiveTvChannels": "Canais de TV em Directo", "OptionBlockChannelContent": "Conteúdo do Canal de Internet", "OptionBlockBooks": "Livros", - "OptionAutomatic": "Automático", "OptionAscending": "Ascendente", "OptionArtist": "Artista", "OptionAllowVideoPlaybackTranscoding": "Permitir reprodução de vídeo que necessite de transcodificação", @@ -678,8 +617,8 @@ "OptionAlbum": "Álbum", "OptionAdminUsers": "Administradores", "OneChannel": "Um canal", - "NoPluginConfigurationMessage": "Esta extensão não é configurável.", - "NoNextUpItemsMessage": "Nenhum encontrado. Comece a ver os seus programas!", + "MessageNoPluginConfiguration": "Esta extensão não é configurável.", + "MessageNoNextUpItems": "Nenhum encontrado. Comece a ver os seus programas!", "News": "Notícias", "NewCollectionNameExample": "Exemplo: Colecção Guerra das Estrelas", "NewCollection": "Nova Colecção", @@ -706,7 +645,6 @@ "MessageItemSaved": "Item guardado.", "MessageInvalidUser": "Nome de utilizador ou palavra-passe inválidos. Por favor, tente novamente.", "MessageInvalidForgotPasswordPin": "Foi inserido um código PIN inválido ou expirado. Por favor, tente de novo.", - "MessageInstallPluginFromApp": "Esta extensão deverá ser instalada a partir da aplicação em que tem intenção de a utilizar.", "MessageImageTypeNotSelected": "Por favor, seleccione um tipo de imagem da lista.", "MessageImageFileTypeAllowed": "Apenas são suportados ficheiros JPEG ou PNG.", "MessageForgotPasswordInNetworkRequired": "Por favor, volte a tentar o processo de recuperação de palavra-passe quando se encontrar dentro da sua rede local.", @@ -735,7 +673,6 @@ "MediaInfoStreamTypeEmbeddedImage": "Imagem Integrada", "MediaInfoStreamTypeData": "Dados", "MediaInfoStreamTypeAudio": "Áudio", - "MediaInfoSoftware": "Software", "MediaInfoTimestamp": "Data e Hora", "MediaInfoSize": "Tamanho", "MediaInfoSampleRate": "Taxa de Amostragem", @@ -755,7 +692,6 @@ "LatestFromLibrary": "Mais Recentes em {0}", "LabelZipCode": "Código Postal:", "LabelYoureDone": "Concluiu!", - "LabelYourFirstName": "O seu primeiro nome:", "LabelXDlnaDocHelp": "Determina o conteúdo do elemento X_DLNADOC no namespace urn:schemas-dlna-org:device-1-0.", "LabelXDlnaCapHelp": "Determina o conteúdo do elemento X_DLNACAP no namespace urn:schemas-dlna-org:device-1-0.", "LabelVersionInstalled": "{0} instalado", @@ -771,12 +707,9 @@ "LabelTunerType": "Tipo do sintonizador:", "LabelTunerIpAddress": "Endereço IP do Sintonizador:", "LabelTriggerType": "Tipo do Accionador:", - "LabelTranscodingVideoCodec": "Codec do vídeo:", "LabelTranscodingThreadCountHelp": "Indique o número máximo de processors a utilizadar para transcodificação. Reduzir o número de processos diminuirá a utilização do CPU, mas pode não converter suficientemente rápido para uma experiência de reprodução suave.", "LabelTranscodingThreadCount": "Número de processos de transcodificação:", "LabelTranscodingTempPathHelp": "Indique uma localização personalizada para os ficheiros de transcodificação em utilização, ou deixe em branco para utilizar o caminho por omissão.", - "LabelTranscodingContainer": "Contentor:", - "LabelTranscodingAudioCodec": "Codec de áudio:", "LabelTimeLimitHours": "Limite de tempo (horas):", "LabelTime": "Tempo:", "LabelTextSize": "Tamanho do Texto:", @@ -822,13 +755,11 @@ "HeaderFavoriteBooks": "Livros Favoritos", "HeaderExternalIds": "IDs Externos:", "HeaderError": "Erro", - "HeaderEpisodes": "Episódios", "HeaderEnabledFieldsHelp": "Desmarque um campo para bloqueá-lo e evitar que os seus dados sejam alterados.", "HeaderEnabledFields": "Campos Activados", "HeaderEditImages": "Editar Imagens", "HeaderEasyPinCode": "Código PIN", "HeaderDownloadSync": "Transferência e Sincronização", - "HeaderDisplay": "Visualização", "HeaderDirectPlayProfileHelp": "Adicionar perfis de reprodução directa que indiquem que formatos o dispositivo pode suportar nativamente.", "HeaderDirectPlayProfile": "Perfil da Reprodução Directa", "HeaderDevices": "Dispositivos", @@ -855,7 +786,7 @@ "EveryNDays": "A cada {0} dias", "ErrorSavingTvProvider": "Ocorreu um erro ao guardar o provedor do serviços de TV. Por favor, garanta que está acessível e tente de novo.", "ErrorPleaseSelectLineup": "Por favor selecione a programação e tente novamente. Se não houver programações disponíveis, verifique se o seu nome de utilizador, senha e código postal estão correctos.", - "ErrorMessageStartHourGreaterThanEnd": "A hora de fim deve ser superior à hora de início.", + "ErrorStartHourGreaterThanEnd": "A hora de fim deve ser superior à hora de início.", "ErrorGettingTvLineups": "Ocorreu um erro ao transferir a programação de TV. Por favor, certifique-se que a sua informação está correcta e tente novamente.", "ErrorDeletingItem": "Ocorreu um erro ao apagar o item do Servidor Jellyfin. Por favor, verifique o acesso de escrita do Servidor Jellyfin à pasta e tente de novo.", "ErrorAddingXmlTvFile": "Ocorreu um erro ao aceder ao ficheiro XmlTV. Por favor, garanta que o ficheiro está acessível e tente de novo.", @@ -864,9 +795,7 @@ "Episodes": "Episódios", "EndsAtValue": "Termina às {0}", "EnableThemeVideosHelp": "Reproduzir vídeos do tema em plano de fundo durante a navegação pela Biblioteca.", - "EnableThemeVideos": "Vídeos do tema", "EnableThemeSongsHelp": "Reproduzir músicas do tema em plano de fundo durante a navegação pela Biblioteca.", - "EnableThemeSongs": "Músicas do tema", "EnableStreamLoopingHelp": "Active esta opção no caso de a transmissão em directo apenas conter alguns segundos de dados e necessitar de ser continuamente requisitada. Activar esta opção quando não é necessário pode causar problemas.", "EnablePhotosHelp": "Imagens serão detectadas e mostradas em conjunto com outros ficheiros multimédia.", "EnablePhotos": "Mostrar fotografias", @@ -879,7 +808,6 @@ "EnableColorCodedBackgrounds": "Código de cores para o fundo", "EnableCinemaMode": "Modo cinema", "EnableBackdropsHelp": "Mostrar imagens de fundo em algumas páginas durante a navegação pela Biblioteca.", - "EnableBackdrops": "Pano de fundo", "EditSubtitles": "Editar legendas", "EditMetadata": "Editar metadados", "EditImages": "Editar imagens", @@ -919,7 +847,7 @@ "DeleteDeviceConfirmation": "Tem a certeza que deseja remover este dispositivo? Reaparecerá na próxima vez que o utilizador inicie sessão a partir dele.", "Delete": "Remover", "DefaultSubtitlesHelp": "As legendas são carregadas com base nas definições por omissão ou forçado nos metadados. As preferências de idioma são consideradas quando existem múltiplas opções disponíveis.", - "DefaultErrorMessage": "Ocorreu um erro ao processar o pedido. Por favor, tente novamente mais tarde.", + "ErrorDefault": "Ocorreu um erro ao processar o pedido. Por favor, tente novamente mais tarde.", "Default": "Por omissão", "DeathDateValue": "Faleceu: {0}", "DatePlayed": "Reproduzido a", @@ -953,77 +881,53 @@ "CancelSeries": "Cancelar gravação de série", "CancelRecording": "Cancelar gravação", "ButtonWebsite": "Website", - "ButtonViewWebsite": "Ver website", - "ButtonUp": "Para cima", "ButtonUninstall": "Desinstalar", "ButtonTrailer": "Trailer", - "ButtonSubtitles": "Legendas", "ButtonSubmit": "Enviar", "ButtonStop": "Parar", "ButtonStart": "Iniciar", - "ButtonSort": "Organizar", "ButtonSignOut": "Sair", "ButtonSignIn": "Iniciar Sessão", "ButtonShutdown": "Encerrar", - "ButtonShuffle": "Aleatório", "ButtonSend": "Enviar", "ButtonSettings": "Configurações", "ButtonSelectView": "Seleccionar visualização", "ButtonSelectServer": "Seleccionar servidor", "ButtonSelectDirectory": "Seleccione a Pasta", - "ButtonSearch": "Procurar", "ButtonScanAllLibraries": "Analisar todas as Bibliotecas", - "ButtonSave": "Guardar", "ButtonRevoke": "Revogar", "ButtonResume": "Retomar", "ButtonRestart": "Reiniciar", "ButtonResetPassword": "Redefinir palavra-passe", "ButtonResetEasyPassword": "Redefinir código PIN", - "ButtonRepeat": "Repetir", "ButtonRename": "Alterar o nome", "ButtonRemove": "Remover", "ButtonRefreshGuideData": "Actualizar Programação de TV", - "ButtonRefresh": "Actualizar", "ButtonQuickStartGuide": "Guia de Início Rápido", "ButtonProfile": "Perfil", "ButtonPreviousTrack": "Faixa anterior", - "ButtonPlay": "Reproduzir", "ButtonPause": "Pausar", "ButtonParentalControl": "Controlo parental", "ButtonOpen": "Abrir", "ButtonOk": "OK", - "ButtonOff": "Desligado", "ButtonNextTrack": "Faixa seguinte", - "ButtonNew": "Novo", "ButtonNetwork": "Rede", "ButtonMore": "Mais", "ButtonManualLogin": "Início de Sessão Manual", "ButtonLibraryAccess": "Acesso à biblioteca", - "ButtonLearnMore": "Saiba mais", "ButtonInfo": "Informação", - "ButtonHome": "Início", - "ButtonHelp": "Ajuda", "ButtonFullscreen": "Ecrã inteiro", "ButtonForgotPassword": "Esqueci-me da palavra-passe", - "ButtonFilter": "Filtro", "ButtonEditOtherUserPreferences": "Editar este perfil de utilizador, imagem e preferências pessoais.", - "ButtonEditImages": "Editar imagens", - "ButtonEdit": "Editar", - "ButtonDownload": "Transferir", - "ButtonDown": "Para baixo", "Auto": "Automático", "AlwaysPlaySubtitles": "Mostrar sempre legendas", "AllowMediaConversionHelp": "Permitir ou negar acesso à funcionalidade de conversão multimédia.", "AllowMediaConversion": "Permitir conversão multimédia", "ButtonGuide": "Programação", "ButtonGotIt": "Entendido", - "ButtonDeleteImage": "Remover imagem", - "ButtonDelete": "Remover", - "ButtonConnect": "Ligar", "ButtonChangeServer": "Alterar Servidor", "ButtonCancel": "Cancelar", "ButtonBack": "Voltar", - "OptionMonday": "Segunda", "OptionMissingEpisode": "Episódios em Falta", "OptionMax": "Máximo", "OptionLikes": "Gostos", @@ -1036,7 +940,6 @@ "OptionHasThemeSong": "Música de Tema", "OptionHasSubtitles": "Legendas", "OptionHasSpecialFeatures": "Extras", - "OptionFriday": "Sexta", "OptionFavorite": "Favoritos", "OptionExternallyDownloaded": "Download Externo", "OptionEveryday": "Todos os dias", @@ -1057,18 +960,15 @@ "LabelBitrate": "Taxa de bits:", "LabelBirthYear": "Ano de nascimento:", "ButtonAudioTracks": "Faixas de Áudio", - "ButtonArrowUp": "Cima", "ButtonArrowRight": "Direita", "ButtonArrowLeft": "Esquerda", - "ButtonArrowDown": "Baixo", "ButtonAddUser": "Adicionar Utilizador", "ButtonAddServer": "Adicionar Servidor", "ButtonAddScheduledTaskTrigger": "Adicionar tarefa agendada", "ButtonAddMediaLibrary": "Adicionar Biblioteca de Multimédia", "ButtonAddImage": "Adicionar Imagem", - "ButtonAdd": "Adicionar", "BurnSubtitlesHelp": "Determina se o servidor deve integrar as legendas durante a conversão de vídeo, dependendo do formato da legenda. Evitar a integração de legendas melhora o desempenho do servidor. Selecione Automático para que legendas baseadas em imagem (VOBSUB, PGS, SUB/IDX) e certos formatos ASS/SSA sejam integrados.", - "BrowsePluginCatalogMessage": "Explore as extensões disponíveis no nosso catálogo.", + "MessageBrowsePluginCatalog": "Explore as extensões disponíveis no nosso catálogo.", "Browse": "Explorar", "BoxRear": "Caixa (verso)", "Box": "Caixa", @@ -1081,10 +981,8 @@ "Banner": "Insígnia", "Backdrops": "Imagens de Fundo", "Backdrop": "Imagem de Fundo", - "AutoBasedOnLanguageSetting": "Automático (baseado no idioma definido)", "AuthProviderHelp": "Seleccione um mecanismo de autenticação a ser utilizado para validar as credenciais deste utilizador.", "Audio": "Áudio", - "AttributeNew": "Novo", "AspectRatio": "Proporção da tela", "Ascending": "Crescente", "Art": "Capa", @@ -1114,7 +1012,6 @@ "AddToPlaylist": "Adicionar à lista de reprodução", "AddToPlayQueue": "Adicionar à fila de reprodução", "AddToCollection": "Adicionar à coleção", - "AddItemToCollectionHelp": "Adicione itens às coleções pesquisando-os e utilizando o respetivo menu de toque ou clique direito para os adicionar a uma coleção.", "Add": "Adicionar", "Actor": "Ator", "AccessRestrictedTryAgainLater": "O acesso está atualmente restrito. Por favor, tente mais tarde.", @@ -1140,14 +1037,10 @@ "HeaderCodecProfileHelp": "Os perfis do Codec indicam as limitações de um dispositivo ao reproduzir codecs específicos. Se uma limitação ocorrer, o ficheiro multimédia será transcodificado, mesmo se o codec estiver configurado para reprodução direta.", "HeaderCodecProfile": "Perfil do Codec", "HeaderChapterImages": "Imagens do Capítulo", - "HeaderChannels": "Canais", "HeaderChannelAccess": "Acesso ao Canal", - "HeaderCastCrew": "Elenco e Equipa", "HeaderCancelSeries": "Cancelar Gravação de Série", "HeaderCancelRecording": "Cancelar Gravação", - "HeaderBooks": "Livros", "HeaderBlockItemsWithNoRating": "Bloquear conteúdo sem informação de classificação etária ou com informação desconhecida:", - "HeaderAutomaticUpdates": "Acualizações automáticas", "HeaderAudioSettings": "Configurações de Áudio", "HeaderAudioBooks": "Livros de Áudio", "HeaderApp": "Aplicação", @@ -1156,14 +1049,11 @@ "HeaderApiKey": "Chave da API", "HeaderAllowMediaDeletionFrom": "Permitir remoção de multimédia a partir de", "HeaderAlert": "Alerta", - "HeaderAlbums": "Álbuns", "HeaderAlbumArtists": "Artistas do Álbum", "HeaderAdditionalParts": "Partes Adicionais", - "HeaderAddUser": "Adicionar Utilizador", "HeaderAddUpdateImage": "Adicionar/Actualizar Imagem", "HeaderAddToPlaylist": "Adicionar à Lista de Reprodução", "HeaderAddToCollection": "Adicionar à Colecção", - "HeaderAddScheduledTaskTrigger": "Adicionar Tarefa Agendada", "HeaderActivity": "Actividade", "HeaderActiveRecordings": "Gravações Activas", "HeaderActiveDevices": "Dispositivos Activos", @@ -1199,9 +1089,7 @@ "FetchingData": "Buscando Dados Adicionais", "EnableStreamLooping": "Habilitar loop do streaming", "Down": "Baixar", - "HeaderTags": "Tags", "HeaderNavigation": "Navegar", - "CopyStreamURLError": "Ocorreu um erro ao copiar o URL.", "ButtonSplit": "Dividir", "AskAdminToCreateLibrary": "Peça a um administrador para criar uma biblioteca.", "AllowFfmpegThrottling": "Transcodificação com falhas", @@ -1233,7 +1121,6 @@ "Normal": "Normal", "None": "Nenhum", "NoSubtitlesHelp": "As legendas não serão carregadas por padrão. Eles ainda podem ser ativados manualmente durante a reprodução.", - "NoSubtitles": "Sem legendas", "NoSubtitleSearchResultsFound": "Nenhum resultado encontrado.", "NoNewDevicesFound": "Não foram encontrados novos dispositivos. Para adicionar um novo sintonizador, feche esta caixa de diálogo e insira as informações do dispositivo manualmente.", "NoCreatedLibraries": "Parece que você ainda não criou nenhuma biblioteca. {0} Deseja criar um agora? {1}", @@ -1244,7 +1131,6 @@ "Metadata": "Metadados", "MessageYouHaveVersionInstalled": "Você possui a versão {0} atualmente instalada.", "MessageUnsetContentHelp": "O conteúdo será exibido como pastas simples. Para obter melhores resultados, use o gerenciador de metadados para definir os tipos de conteúdo das subpastas.", - "MessageSettingsSaved": "Configurações salvas.", "MessagePleaseWait": "Por favor, espere. Isso pode levar um minuto.", "MessagePlayAccessRestricted": "A reprodução deste conteúdo está atualmente restrita. Entre em contato com o administrador do servidor para obter mais informações.", "MessageNoServersAvailable": "Nenhum servidor foi encontrado usando a descoberta automática de servidores.", @@ -1265,12 +1151,9 @@ "ManageRecording": "Gerenciar gravações", "Logo": "Logo", "List": "Lista", - "LinksValue": "Links: {0}", "Like": "Gostei", "LeaveBlankToNotSetAPassword": "Você pode deixar esse campo em branco para definir nenhuma senha.", "LearnHowYouCanContribute": "Aprenda como você pode contribuir.", - "LaunchWebAppOnStartupHelp": "Abra o cliente da web no seu navegador da web padrão quando o servidor iniciar. Isso não ocorrerá ao usar a função de reinicialização do servidor.", - "LaunchWebAppOnStartup": "Inicie a interface da web ao iniciar o servidor", "Large": "Amplo", "LanNetworksHelp": "Lista separada por vírgula de endereços IP ou entradas de máscara de rede/IP para redes que serão consideradas na rede local ao impor restrições de largura de banda. Se definido, todos os outros endereços IP serão considerados na rede externa e estarão sujeitos às restrições de largura de banda externa. Se deixado em branco, apenas a sub-rede do servidor é considerada na rede local.", "LabelffmpegPathHelp": "O caminho para o arquivo do aplicativo ffmpeg ou pasta que contém o ffmpeg.", @@ -1298,15 +1181,12 @@ "LabelTextBackgroundColor": "Cor do plano de fundo do texto:", "LabelTag": "Tag:", "LabelTVHomeScreen": "Tela inicial do modo TV:", - "LabelSubtitles": "Legendas:", "LabelSubtitleDownloaders": "Downloaders de legendas:", "LabelStreamType": "Tipo de fluxo:", "LabelSpecialSeasonsDisplayName": "Nome de exibição da temporada especial:", - "LabelSoundEffects": "Efeitos sonoros:", "LabelSortTitle": "Classificar título:", "LabelSortOrder": "Ordem de classificação:", "LabelSortBy": "Ordenar por:", - "LabelSkin": "Pele:", "LabelRemoteClientBitrateLimitHelp": "Um limite opcional de taxa de bits por fluxo para todos os dispositivos fora da rede. Isso é útil para impedir que os dispositivos solicitem uma taxa de bits mais alta do que a sua conexão à Internet pode suportar. Isso pode resultar no aumento da carga da CPU no servidor para transcodificar vídeos em tempo real para uma taxa de bits mais baixa.", "LabelPlayerDimensions": "Dimensões do reprodutor:", "LabelParentNumber": "Número pai:", @@ -1384,7 +1264,6 @@ "OptionAutomaticallyGroupSeries": "Mesclar automaticamente séries que estão espalhadas por várias pastas", "OptionAllowSyncTranscoding": "Permitir download e sincronização de mídia que requeiram transcodificação", "OptionForceRemoteSourceTranscoding": "Forçar a transcodificação de fontes de mídia remota (como LiveTV)", - "MessageUnauthorizedUser": "Você não está autorizado a acessar o servidor no momento. Entre em contato com o administrador do servidor para obter mais informações.", "PreferEmbeddedTitlesOverFileNames": "Preferir títulos incorporados sobre nomes de arquivos", "OptionSaveMetadataAsHiddenHelp": "Alterar isso será aplicado aos novos metadados salvos daqui para frente. Os arquivos de metadados existentes serão atualizados na próxima vez em que forem salvos pelo Jellyfin Server.", "OptionRegex": "Regex", @@ -1395,12 +1274,10 @@ "PreferEmbeddedTitlesOverFileNamesHelp": "Isso determina o título quando nenhum metadado da Internet ou local está disponível.", "PlaybackErrorNoCompatibleStream": "Este cliente não é compatível com a mídia e o servidor não está enviando um formato de mídia compatível.", "Person": "Pessoa", - "OtherArtist": "Outro artista", "OptionThumbCard": "Cartão de polegar", "OptionPosterCard": "Cartão de pôster", "LabelRequireHttpsHelp": "Se marcado, o servidor redirecionará automaticamente todas as solicitações por HTTP para HTTPS. Isso não terá efeito se o servidor não estiver escutando HTTPS.", "LabelRequireHttps": "Requer HTTPS", - "LabelNightly": "À noite", "LabelChromecastVersion": "Versão do Chromecast", "LabelEnableHttpsHelp": "Permite que o servidor escute na postagem HTTPS configurada. Um certificado válido também deve ser configurado para que isso entre em vigor.", "LabelEnableHttps": "Ativar HTTPS", @@ -1410,6 +1287,5 @@ "HeaderDVR": "DVR", "ApiKeysCaption": "Lista das chaves de API ativadas no momento", "ButtonTogglePlaylist": "Lista de leitura", - "ButtonToggleContextMenu": "Mais", "ButtonSyncPlay": "SyncPlay" } diff --git a/src/strings/ro.json b/src/strings/ro.json index ccb91f0a50..58a9521c7d 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -1,27 +1,16 @@ { "All": "Toate", - "ButtonAdd": "Adaugă", "ButtonAddScheduledTaskTrigger": "Adaugă declanșator", "ButtonAddUser": "Adaugă Utilizator", "ButtonCancel": "Anulează", - "ButtonDelete": "Șterge", - "ButtonDeleteImage": "Șterge Imaginea", - "ButtonEdit": "Modifică", - "ButtonFilter": "Filtru", - "ButtonHelp": "Ajutor", "ButtonManualLogin": "Conectare manuală", - "ButtonNew": "Nou", - "ButtonPlay": "Redă", "ButtonQuickStartGuide": "Ghid rapid de Start", - "ButtonRefresh": "Reîmprospătează", "ButtonRefreshGuideData": "Reîmprospătează Ghidul", "ButtonRemove": "Elimină", "ButtonResetPassword": "Resetează parola", - "ButtonSave": "Salvează", "ButtonSelectDirectory": "Selectați Director", "ButtonSignIn": "Autentificare", "ButtonSignOut": "Delogare", - "ButtonSort": "Sortează", "ChannelAccessHelp": "Selectează canalele pe care vrei să le partajezi cu acest utilizator. Administratorii vor avea posibilitatea să modifice canalele folosind managerul de metadate.", "Continuing": "Continuă", "DefaultMetadataLangaugeDescription": "Acestea sunt setările implicite și pot fi personalizate pentru fiecare bibliotecă în parte.", @@ -36,37 +25,28 @@ "FolderTypeTvShows": "Seriale TV", "Friday": "Vineri", "HeaderActiveRecordings": "Înregistrări active", - "HeaderAddScheduledTaskTrigger": "Adaugă declanșator", - "HeaderAddUser": "Adaugă Utilizator", - "HeaderAutomaticUpdates": "Actualizare Automată", - "HeaderChannels": "Canale", "HeaderContinueWatching": "Vizionează în continuare", "HeaderDeviceAccess": "Accesul Dispozitivelor", "HeaderEasyPinCode": "Cod Pin Ușor", "HeaderFeatureAccess": "Acces Facilități", "HeaderFetchImages": "Preia imagini:", - "HeaderFilters": "Filtre", "HeaderFrequentlyPlayed": "Rulate Frecvent", "HeaderImageSettings": "Setari Imagini", "HeaderLatestEpisodes": "Cele Mai Noi Episoade", "HeaderLatestMovies": "Cele mai noi Filme", "HeaderLatestRecordings": "Cele mai recente înregistrări", - "HeaderNextUp": "Urmează", "HeaderPaths": "Căi", "HeaderPleaseSignIn": "Vă rugăm, autentificați-vă", "HeaderPreferredMetadataLanguage": "Limba preferata pentru metadata", "HeaderRecentlyPlayed": "Rulate Recent", "HeaderRemoteControl": "Control la distanță", - "HeaderSeries": "Seriale", "HeaderSetupLibrary": "Configurați-vă bibliotecile media", "HeaderTaskTriggers": "Declanșatori Sarcini", "HeaderUsers": "Utilizatori", "Help": "Ajutor", - "ImportMissingEpisodesHelp": "Dacă este activată, informația despre episoadele lipsă va fi importată in baza de date Jellyfin și va fi afișată în cadrul serialelor. Aceasta poate cauza un timp semnificativ mai îndelungat la scanarea bibliotecilor.", - "LabelAllowServerAutoRestart": "Permite serverului să se repornească automat pentru a aplica actualizările", - "LabelAllowServerAutoRestartHelp": "Serverul se va reporni doar în timp ce nu are nici o sarcină, când nu este nici un utilizator conectat.", + "ImportMissingEpisodesHelp": "Informația despre episoadele lipsă va fi importată în baza de date și va fi afișată în cadrul serialelor. Aceasta poate cauza un timp semnificativ mai îndelungat la scanarea bibliotecilor.", "LabelArtists": "Artisti:", - "LabelArtistsHelp": "Separare multiplă utilizând ;", + "LabelArtistsHelp": "Separară înșiruirea artiștilor utilizând ;", "LabelAudioLanguagePreference": "Preferințe de limbă pentru audio:", "LabelCachePath": "Cale pentru depozit:", "LabelCachePathHelp": "Specificați o locație specială pentru fișierele de tip depozit, precum imagini etc. Lasați gol pentru a folosi setarea implicită.", @@ -75,7 +55,6 @@ "LabelCurrentPassword": "Parola curentă:", "LabelCustomCertificatePath": "Calea către certificatul personalizat:", "LabelCustomCertificatePathHelp": "Furnizați propriul fișier care conține un certificat SSL in format .pfx.", - "LabelDisplayMissingEpisodesWithinSeasons": "Afișeaza episoadele lipsă din sezon", "LabelFinish": "Termină", "LabelLanguage": "Limba:", "LabelMaxBackdropsPerItem": "Numărul maxim de fundaluri pentru fiecare element:", @@ -85,27 +64,24 @@ "LabelMetadataPath": "Cale pentru metadata:", "LabelMetadataPathHelp": "Specificați o locație specială pentru a descărca postere și metadata.", "LabelMinBackdropDownloadWidth": "Lățimea maximă pentru fundalurile descărcate:", - "LabelMovieRecordingPath": "Calea pentru înregistrări filme (opțional):", + "LabelMovieRecordingPath": "Calea pentru înregistrări filme:", "LabelName": "Nume:", "LabelNewPassword": "Parola nouă:", "LabelNewPasswordConfirm": "Confirmă parola nouă:", - "LabelNext": "Următorul", "LabelNumberOfGuideDays": "Numărul de zile de ghid de descărcat:", "LabelNumberOfGuideDaysHelp": "Descărcând mai multe zile de ghid va permite să programați mai în avans și să vizualizați listările mai în viitor, dar descărcarea va dura mai mult. \"Automat\" va alege în funcție de numărul de canale.", "LabelPassword": "Parolă:", - "LabelPrevious": "Anteriorul", "LabelRecordingPath": "Calea implicită pentru înregistrări:", "LabelRecordingPathHelp": "Specificați locația implicită pentru a salva înregistrările. Dacă lasați necompletat, va fi utilizat directorul curent în care ruleză programul serverului.", "LabelSaveLocalMetadata": "Salvează posterele si metadata în dosarele ce conțin fișierele media", "LabelSaveLocalMetadataHelp": "Salvând posterele și metadata direct in dosarele media, acestea vor fi mai accesibile pentru a fi modificate.", "LabelSelectUsers": "Selectare utilizatori:", - "LabelSeriesRecordingPath": "Calea pentru înregistrări seriale (opțional):", + "LabelSeriesRecordingPath": "Calea pentru înregistrări de seriale:", "LabelStopWhenPossible": "Oprește când este posibil:", "LabelTimeLimitHours": "Limită de timp(ore):", "LabelTranscodingTempPathHelp": "Specificați o cale specială pentru fișierele transcodate trimise clienților. Lasați gol pentru a folosi pe cea implicită în directorul de lucru al serverului.", "LabelTriggerType": "Tip Declanșator:", "LabelUser": "Utilizator:", - "LabelYourFirstName": "Numele tău:", "LabelYoureDone": "Ești Gata!", "LibraryAccessHelp": "Selectează biblioteciile media partajate cu acest utilizator. Administratorii vor avea posibilitatea să modifice toate dosarele utilizând managerul de metadata.", "MaxParentalRatingHelp": "Conținutul cu o limită de vârstă mai mare va fi ascuns pentru acest utilizator.", @@ -117,7 +93,7 @@ "Monday": "Luni", "MoreUsersCanBeAddedLater": "Mai mulți utilizatori pot fi adăugați mai târziu din Tabloul de Bord.", "NewCollectionNameExample": "Exemplu: Star Wars Collection", - "NoNextUpItemsMessage": "Nu s-a gasit nimic. Începe să vizionezi seriale!", + "MessageNoNextUpItems": "Nu s-a gasit nimic. Începe să vizionezi seriale!", "OptionAllowBrowsingLiveTv": "Permite accessul la Live TV", "OptionAllowLinkSharing": "Permite partajarea pe rețelele de socializare", "OptionAllowLinkSharingHelp": "Doar paginile wev ce contin informații despre conținutul media va fi partajat. Fișierele media nu vor fi partajate niciodată pentru public. Partajările sunt limitate ca timp și vor expira după {0} zile.", @@ -128,7 +104,6 @@ "OptionAllowRemoteSharedDevicesHelp": "Dispozitivele DLNA sunt considerate partajate până ce un utilizator începe să le controleze.", "OptionAllowUserToManageServer": "Permite acestui utilizator să administreze serverul", "OptionAscending": "Ascendent", - "OptionAutomatic": "Auto", "OptionCommunityRating": "Rating Comunitate", "OptionContinuing": "Continuă", "OptionCriticRating": "Rating Critic", @@ -137,7 +112,7 @@ "OptionDatePlayed": "Dată Rulare", "OptionDescending": "Descrescător", "OptionDisableUser": "Dezactivați acest utilizator", - "OptionDisableUserHelp": "Dacă este dezactivat, serverul nu va permite nicio conexiune de la acest utilizator. Conexiunile existente vor fi terminate brusc.", + "OptionDisableUserHelp": "Serverul nu va permite nici o conexiune de la acest utilizator. Conexiunile existente vor fi terminate brusc.", "OptionDislikes": "Dislike-uri", "OptionDownloadArtImage": "Fundal", "OptionDownloadBackImage": "Înapoi", @@ -152,7 +127,6 @@ "OptionEnableAccessToAllLibraries": "Activează accesul la toate bibliotecile", "OptionEnded": "Anulat", "OptionFavorite": "Favorite", - "OptionFriday": "Vineri", "OptionHasSpecialFeatures": "Caracteristici Speciale", "OptionHasSubtitles": "Subtitrări", "OptionHasThemeSong": "Audio de Fundal", @@ -161,7 +135,6 @@ "OptionHideUserFromLoginHelp": "Folositor pentru conturi private sau de administrator ascunse. Utilizatorul va trebui să se conecteze manual prin introducerea numelui de utilizator și a parolei.", "OptionImdbRating": "Rating IMDb", "OptionLikes": "Like-uri", - "OptionMonday": "Luni", "OptionNameSort": "Nume", "OptionParentalRating": "Limită de vârstă", "OptionPlayCount": "Contorizare rulări", @@ -170,13 +143,8 @@ "OptionReleaseDate": "Dată Lansare", "OptionResumable": "Poate fi continuat", "OptionRuntime": "Timp Rulare", - "OptionSaturday": "Sâmbătă", - "OptionSunday": "Duminică", - "OptionThursday": "Joi", "OptionTrackName": "Nume melodie", - "OptionTuesday": "Marți", "OptionUnplayed": "Nerulat", - "OptionWednesday": "Miercuri", "ParentalRating": "Parental Rating", "Saturday": "Sâmbătă", "Save": "Salveaza", @@ -184,35 +152,15 @@ "Sunday": "Duminică", "TabAccess": "Acces", "TabAdvanced": "Avansat", - "TabAlbumArtists": "Albume Artiști", - "TabAlbums": "Albume", - "TabArtists": "Artiști", - "TabChannels": "Canale", - "TabCollections": "Colecții", - "TabEpisodes": "Episoade", - "TabFavorites": "Favorite", - "TabGenres": "Genuri", - "TabGuide": "Ghid", "TabLatest": "Cele mai recente", - "TabMovies": "Filme", "TabMusic": "Muzică", - "TabMusicVideos": "Videoclipuri muzicale", "TabMyPlugins": "Plugin-urile mele", "TabNetworks": "Rețele TV", "TabNotifications": "Notificări", "TabOther": "Altele", - "TabPassword": "Parolă", - "TabPlaylist": "Listă de redare", "TabProfile": "Profil", "TabProfiles": "Profile", - "TabRecordings": "Înregistrări", - "TabSeries": "Seriale", "TabSettings": "Setări", - "TabShows": "Seriale", - "TabSongs": "Melodii", - "TabSuggestions": "Recomandări", - "TabTrailers": "Trailere", - "TabTranscoding": "Conversie", "TabUpcoming": "Urmează să apară", "TellUsAboutYourself": "Spune-ne despre tine", "ThisWizardWillGuideYou": "Acest asistent vă va ghida prin procesul de configurare. Pentru a începe, vă rugăm să selectați limba preferată.", @@ -241,7 +189,6 @@ "AddedOnValue": "Adăugat la {0}", "AddToPlaylist": "Adaugă la playlist", "AddToPlayQueue": "Adaugă la coada de redare", - "AddItemToCollectionHelp": "Adaugă obiectele la colecții căutând-le și folosind meniul de click-dreapta sau apasare pentru a le adăuga la colecție.", "Add": "Adaugă", "Actor": "Artist", "AccessRestrictedTryAgainLater": "Accesul este restricționat. Te rugăm să încerci mai târziu.", @@ -249,7 +196,7 @@ "ButtonStop": "Stop", "ButtonSubmit": "Trimite", "Collections": "Colecții", - "AllowRemoteAccess": "Permite conexiuni externe către acest server Jellyfin.", + "AllowRemoteAccess": "Permiteți conexiuni externe către acest server.", "AllowRemoteAccessHelp": "Dacă este neselectat, toate conexiunile externe vor fi blocate.", "AlwaysPlaySubtitles": "Întotdeauna arată", "AnyLanguage": "Orice Limbă", @@ -262,7 +209,6 @@ "AspectRatio": "Raportul aspectului", "AuthProviderHelp": "Selectează un Furnizor de Autentificare de folosit pentru autentificarea parolei acestui utilizator.", "Auto": "Auto", - "AutoBasedOnLanguageSetting": "Auto (bazat pe setările limbii)", "Backdrop": "Fundal", "Backdrops": "Fundaluri", "Banner": "Bandieră", @@ -271,14 +217,12 @@ "Blacklist": "Lista neagră", "Books": "Cărți", "Box": "Cutie", - "AttributeNew": "Nou", "Audio": "Audio", "BoxRear": "Cutie (spate)", "Browse": "Răsfoire", - "BrowsePluginCatalogMessage": "Răsfoiți catalogul de pluginuri pentru a vedea ce este disponibil.", + "MessageBrowsePluginCatalog": "Răsfoiți catalogul de pluginuri pentru a vedea ce este disponibil.", "ButtonAddMediaLibrary": "Adaugă Librărie Media", "ButtonAddServer": "Adaugă Server", - "ButtonArrowDown": "Jos", "ButtonArrowLeft": "Stânga", "ButtonArrowRight": "Dreapta", "Disc": "Placă", @@ -292,10 +236,9 @@ "ButtonPreviousTrack": "Calea anterioară", "ButtonRevoke": "Revocă", "ButtonSettings": "Setări", - "ButtonViewWebsite": "Vezi website", "ChangingMetadataImageSettingsNewContent": "Modificări ale metadatelor sau ale setărilor de descărcare a operelor de artă se va aplica doar conținutului nou adăugat în librăriile tale. Pentru a aplica modificările titlurilor deja existente va trebui reîmprospătată manual metadata lor.", "CinemaModeConfigurationHelp": "Mod cinema aduce experiența cinematografică în sufrageria dumneavoastră prin abilitatea de a rula trailere sau introuri personalizate înaintea titlului principal.", - "ConfigureDateAdded": "Configurează cum este determinată data adaugării în tabloul de bord al serverului Jellyfin în setările librariei", + "ConfigureDateAdded": "Configurează cum este determinată data adaugării în tabloul de bord din setările librariei", "DefaultSubtitlesHelp": "Subtitrările sunt încărcate în funcție de opțiunile implicite și forțate din metadatele încorporate. Preferințele de limbă sunt luate în considerare atunci când sunt disponibile mai multe opțiuni.", "DirectStreamHelp1": "Media este compatibilă cu dispozitivul în ceea ce privește rezoluția și tipul de media(H.264, AC3, etc), dar se află într-un container de fișiere incompatibil (mkv, avi, wmv, etc). Videoclipul va fi re-ambalat în timp real înainte de a-l transmite către dispozitiv.", "CopyStreamURLSuccess": "URL copiat cu succes.", @@ -304,7 +247,7 @@ "Delete": "Șterge", "DeleteImage": "Șterge Imaginea", "DeleteUserConfirmation": "Sigur doriți să ștergeți acest utilizator?", - "Depressed": "Deprimat", + "Depressed": "Presat", "Descending": "Descendent", "DetectingDevices": "Detectez dispozitive", "DirectPlaying": "Redare directă", @@ -313,27 +256,19 @@ "Artists": "Artiști", "BookLibraryHelp": "Cărți audio și text sunt suportate. Verifică {0} ghidul numirii cărților{1}.", "ButtonAddImage": "Adaugă Imagine", - "ButtonArrowUp": "Sus", "ButtonAudioTracks": "Cale Audio", "ButtonBack": "Înapoi", "ButtonChangeServer": "Schimbă Server", - "ButtonConnect": "Conectare", - "ButtonDown": "Jos", - "ButtonDownload": "Descarcă", - "ButtonEditImages": "Modifică imaginile", "ButtonEditOtherUserPreferences": "Modifică profilul, imaginea și preferințele personale ale acestui utilizator.", "ButtonForgotPassword": "Parolă uitată", "ButtonFullscreen": "Umple ecranul", "ButtonGotIt": "Am înțeles", "ButtonGuide": "Ghid", - "ButtonHome": "Acasă", "ButtonInfo": "Info", - "ButtonLearnMore": "Mai multe", "ButtonLibraryAccess": "Acces Librarie", "ButtonMore": "Mai mult", "ButtonNetwork": "Rețea", "ButtonNextTrack": "Următoarea cale", - "ButtonOff": "Oprit", "ButtonOk": "Ok", "ButtonOpen": "Deschide", "ButtonParentalControl": "Control parental", @@ -345,25 +280,20 @@ "DatePlayed": "Data redării", "DeathDateValue": "Mort: {0}", "Default": "Implicit", - "DefaultErrorMessage": "A fost o eroare în procesarea cererii. Vă rugam încercați din nou mai târziu.", + "ErrorDefault": "A fost o eroare în procesarea cererii. Vă rugam încercați din nou mai târziu.", "DeleteImageConfirmation": "Sigur doriți să ștergeți această imagine?", "ButtonRename": "Redenumește", - "ButtonRepeat": "Repetă", "ButtonResetEasyPassword": "Resetează codul Easy PIN", "ButtonRestart": "Redemarează", "ButtonResume": "Continuă", "ButtonScanAllLibraries": "Scanează Toate Librariile", - "ButtonSearch": "Caută", "ButtonSelectServer": "Selectați Server", "ButtonSelectView": "Selectați perspectivă", "ButtonSend": "Trimite", - "ButtonShuffle": "Amestecă", "ButtonShutdown": "Oprește", "ButtonStart": "Start", - "ButtonSubtitles": "Subtitrări", "ButtonTrailer": "Trailer", "ButtonUninstall": "Dezinstalează", - "ButtonUp": "Sus", "ButtonWebsite": "Website", "CancelRecording": "Anulează înregistrarea", "CancelSeries": "Anulează serial", @@ -411,36 +341,29 @@ "HDPrograms": "Programe HD", "HeaderApiKeys": "Chei API", "HeaderApp": "Aplicație", - "HeaderCastCrew": "Distribuție și echipă", "HeaderConfirmPluginInstallation": "Confirmați instalarea plugin-ului", "HeaderDeleteItems": "Ștergeți Elemente", "HeaderDeleteProvider": "Ștergeți Furnizorul", "HeaderDeleteTaskTrigger": "Ștergeți Declanșarea Activității", "HeaderDetectMyDevices": "Detectează dispozitivele mele", "HeaderDeveloperInfo": "Informații pentru dezvoltatori", - "HeaderDisplay": "Afișare", "HeaderDownloadSync": "Descărcări și sincronizare", "HeaderEditImages": "Editează imagini", "HeaderEnabledFields": "Câmpuri activate", "HeaderEnabledFieldsHelp": "Debifează un câmp pentru a-l bloca și pentru a împiedica schimbarea datelor sale.", - "HeaderEpisodes": "Episoade", "HeaderError": "Eroare", "HeaderExternalIds": "ID-uri Externe:", "HeaderFavoriteBooks": "Cărți Favorite", "HeaderBranding": "Marca", - "HeaderApiKeysHelp": "Aplicațiile externe trebuie să aibă o cheie API pentru a comunica cu Jellyfin Server. Cheile sunt emise prin conectarea cu un cont Jellyfin sau prin acordarea manuală a unei chei aplicației.", + "HeaderApiKeysHelp": "Aplicațiile externe trebuie să aibă o cheie API pentru a comunica cu serverul. Cheile sunt emise prin conectarea cu un cont de utilizator sau prin acordarea manuală a unei chei aplicației.", "Sync": "Sincronizare", "ErrorAddingXmlTvFile": "A apărut o eroare la accesarea fișierului XMLTV. Vă rugăm să vă asigurați că fișierul există și încercați din nou.", "HeaderApiKey": "Cheie API", "HeaderFavoritePeople": "Persoane Favorite", "HeaderFavoriteVideos": "Video Favorite", - "HeaderFeatures": "Caracteristici", "HeaderFetcherSettings": "Setări Fetcher", "HeaderForKids": "Pentru Copii", - "HeaderForgotPassword": "Am uitat parola", - "HeaderGenres": "Genuri", "HeaderGuideProviders": "Furnizori de date ghid TV", - "HeaderHome": "Acasă", "HeaderHttpHeaders": "Anteturi HTTP", "HeaderIdentification": "Identificare", "HeaderIdentificationCriteriaHelp": "Introduceți cel puțin un criteriu de identificare.", @@ -456,10 +379,8 @@ "HeaderLoginFailure": "Autentificare eșuată", "HeaderMedia": "Media", "HeaderMediaFolders": "Dosare Media", - "HeaderMediaInfo": "Informații Media", "HeaderMetadataSettings": "Setări metadate", "HeaderMoreLikeThis": "Mai multe ca acesta", - "HeaderMovies": "Filme", "HeaderMusicQuality": "Calitatea muzicii", "HeaderConfirmRevokeApiKey": "Revocați cheia API", "HeaderMusicVideos": "Videoclipuri Muzicale", @@ -468,14 +389,13 @@ "HeaderMyMediaSmall": "Fișierele mele Media ( micșorat )", "HeaderNewApiKey": "Nouă cheie API", "HeaderNewDevices": "Dispozitive noi", - "HeaderKodiMetadataHelp": "Pentru a activa sau dezactiva metadatele NFO, editați o bibliotecă, în configurarea bibliotecii Jellyfin, și localizați secțiunea de salvare a metadatelor.", + "HeaderKodiMetadataHelp": "Pentru a activa sau dezactiva metadatele NFO, editați o bibliotecă, și localizați secțiunea de salvare a metadatelor.", "HeaderNextVideoPlayingInValue": "Următorul video se redă în {0}", "HeaderOnNow": "Pornit Acum", "HeaderOtherItems": "Alte Elemente", "HeaderParentalRatings": "Evaluări parentale", "HeaderPassword": "Parolă", "HeaderPasswordReset": "Resetare Parolă", - "HeaderPeople": "Persoane", "HeaderPhotoAlbums": "Albume Fotografii", "HeaderPinCodeReset": "Resetare cod PIN", "HeaderPlayAll": "Redare tot", @@ -484,7 +404,7 @@ "HeaderPlaybackError": "Eroare la redare", "HeaderPluginInstallation": "Instalare Plugin", "HeaderProfileInformation": "Informații Profil", - "HeaderProfileServerSettingsHelp": "Aceste valori controlează modul în care Jellyfin Server va fi reprezentat in dispozitiv.", + "HeaderProfileServerSettingsHelp": "Aceste valori controlează modul în care serverul va fi reprezentat in dispozitivele clientilor.", "HeaderRecordingOptions": "Opțiuni Înregistrare", "HeaderRecordingPostProcessing": "Post procesarea înregistrării", "HeaderRemoveMediaFolder": "Eliminați Dosarul Media", @@ -494,7 +414,6 @@ "HeaderRevisionHistory": "Istoricul reviziilor", "HeaderRunningTasks": "În desfășurare", "HeaderScenes": "Scene", - "HeaderSchedule": "Planificare", "HeaderSeasons": "Sezoane", "HeaderSecondsValue": "{0} Secunde", "HeaderSelectCertificatePath": "Selectați ruta certificatului", @@ -508,7 +427,7 @@ "GuestStar": "Vedeta invitata", "GuideProviderSelectListings": "Selectați Listări", "EncoderPresetHelp": "Alegeți o valoare mai rapidă pentru a îmbunătăți performanța sau o valoare mai lentă pentru a îmbunătăți calitatea.", - "HardwareAccelerationWarning": "Activarea accelerării hardware poate provoca instabilitate în anumite medii. Asigurați-vă că sistemul de operare și driverele video sunt complet actualizate. Dacă întâmpinați dificultăți pentru a reda video după activarea acestei opțiuni, va trebui să schimbați setarea la inapoi la Nimic.", + "HardwareAccelerationWarning": "Activarea accelerării hardware poate provoca instabilitate în anumite medii. Asigurați-vă că sistemul de operare și driverele video sunt actualizate. Dacă întâmpinați dificultăți pentru a reda video după activarea acestei opțiuni, va trebui să schimbați setarea înapoi la Fără.", "HeaderAccessSchedule": "Program de Acces", "HeaderAccessScheduleHelp": "Creați un program de acces pentru a limita accesul la anumite ore.", "HeaderActiveDevices": "Dispozitive active", @@ -517,13 +436,11 @@ "HeaderAddToPlaylist": "Adauga la lista de redare", "HeaderAddUpdateImage": "Adăugați/Actualizați Imaginea", "HeaderAdditionalParts": "Părți Adiționale", - "HeaderAlbums": "Albume", "HeaderAlert": "Alertă", "HeaderAllowMediaDeletionFrom": "Permite ștergerea media din", "HeaderAppearsOn": "Apare în", "HeaderAudioBooks": "Carți Audio", "HeaderAudioSettings": "Setari audio", - "HeaderBooks": "Cărți", "HeaderChannelAccess": "Accesare canal", "HeaderChapterImages": "Imagini Capitol", "HeaderCodecProfile": "Profilul Codec-ului", @@ -531,11 +448,9 @@ "HeaderDevices": "Dispozitive", "HeaderDirectPlayProfile": "Profil de redare directă", "HeaderDirectPlayProfileHelp": "Adăugați profiluri de redare directă pentru a indica ce formate se pot gestiona în mod nativ.", - "HeaderItems": "Elemente", "HeaderKeepSeries": "Păstrează seriile", "HeaderLatestMedia": "Cele mai recente media", "HeaderLibraryOrder": "Ordinea Bibliotecii", - "HeaderLiveTv": "TV în Direct", "HeaderContinueListening": "Continuați să ascultați", "Down": "In jos", "EveryNDays": "La fiecare {0} zile", @@ -553,7 +468,6 @@ "Folders": "Dosare", "HeaderAlbumArtists": "Album Artiști", "HeaderFavoriteSongs": "Melodii Favorite", - "HeaderLiveTV": "TV în Direct", "Movies": "Filme", "Playlists": "Liste redare", "Shows": "Spectacole", @@ -561,8 +475,8 @@ "ValueSpecialEpisodeName": "Special - {0}", "EnableStreamLoopingHelp": "Activați acestă opțiune dacă fluxurile live conțin doar câteva secunde de date și trebuie solicitate în mod continuu. Activarea acestei opțiuni atunci când nu este necesar poate provoca probleme.", "ErrorAddingListingsToSchedulesDirect": "A apărut o eroare la adăugarea liniei în contul dvs. Schedules Direct. Schedules Direct permite doar un număr limitat de linii pentru fiecare cont. Este posibil să fie nevoie să vă conectați la site-ul web Schedules Direct și să eliminați alte înregistrări din cont înainte de a continua.", - "ErrorAddingMediaPathToVirtualFolder": "A apărut o eroare la adăugarea căii de acces la fișierul media. Vă rugăm să vă asigurați că ruta este validă și procesul Jellyfin Server are acces la locația respectivă.", - "ErrorMessageStartHourGreaterThanEnd": "Timpul de oprire trebuie să fie mai mare decât cel de pornire.", + "ErrorAddingMediaPathToVirtualFolder": "A apărut o eroare la adăugarea căii de acces la fișierul media. Vă rugăm să vă asigurați că ruta este validă și că Jellyfin are acces la locația respectivă.", + "ErrorStartHourGreaterThanEnd": "Timpul de oprire trebuie să fie mai mare decât cel de pornire.", "ErrorPleaseSelectLineup": "Selectați o linie și încercați din nou. Dacă nu sunt disponibile linii, atunci vă rugăm să verificați dacă numele dvs. de utilizator, parola și codul poștal sunt corecte.", "ExitFullscreen": "Ieșiți din modul ecran complet", "H264CrfHelp": "Factorul de Rată Constantă (CRF) este setarea implicită a calității pentru codificatorul x264. Puteți seta valorile între 0 și 51, unde valorile mai mici ar avea ca rezultat o calitate mai bună (în detrimentul dimensiunilor mai mari de fișiere). Valorile recomandate sunt cuprinse între 18 și 28. Valoarea implicită pentru x264 este 23, deci puteți utiliza acest lucru ca punct de plecare.", @@ -591,7 +505,6 @@ "DropShadow": "Umbra", "EasyPasswordHelp": "Codul dvs. PIN simplu este utilizat pentru accesul offline la clienții suportați și poate fi folosit și pentru conectarea ușoară în rețea.", "EditSubtitles": "Editează subtitrări", - "EnableBackdrops": "Decoruri", "EnableBackdropsHelp": "Afișați decoruri în fundalul unor pagini în timp ce navigați în bibliotecă.", "EnableColorCodedBackgrounds": "Fundaluri codate color", "EnableDisplayMirroring": "Afișează in oglinda", @@ -601,12 +514,10 @@ "EnableNextVideoInfoOverlayHelp": "La sfârșitul unui video, afișați informații despre următorul video care urmează în lista de redare curentă.", "EnablePhotosHelp": "Imaginile vor fi detectate și afișate alături de alte fișiere media.", "EnableStreamLooping": "Fluxuri live cu buclă automată", - "EnableThemeSongs": "Melodii tematice", "EnableThemeSongsHelp": "Redați melodii tematice în fundal în timp ce navigați în bibliotecă.", - "EnableThemeVideos": "Videoclipuri tematice", "EnableThemeVideosHelp": "Redați videoclipuri tematice în fundal în timp ce navigați în bibliotecă.", "ErrorAddingTunerDevice": "A apărut o eroare la adăugarea tuner-ului. Vă rugăm să vă asigurați că este accesibil și încercați din nou.", - "ErrorDeletingItem": "A apărut o eroare la ștergerea elementului din Jellyfin Server. Vă rugăm să verificați dacă Jellyfin Server are acces de scriere la folderul media și încercați din nou.", + "ErrorDeletingItem": "A apărut o eroare la ștergerea elementului din server. Vă rugăm să verificați dacă Jellyfin are acces de scriere la folderul media și încercați din nou.", "ErrorGettingTvLineups": "A apărut o eroare la descărcarea liniilor TV. Vă rugăm să vă asigurați că informațiile dvs. sunt corecte și încercați din nou.", "ErrorSavingTvProvider": "A apărut o eroare la salvarea furnizorului de televiziune. Vă rugăm să vă asigurați că este accesibil și încercați din nou.", "ExtraLarge": "Foarte mare", @@ -623,13 +534,12 @@ "HeaderSelectServer": "Selectați Serverul", "HeaderSelectServerCachePath": "Selectați ruta pentru Server Cache", "HeaderSelectTranscodingPath": "Selectați ruta temporară pentru transcodare", - "HeaderSelectTranscodingPathHelp": "Căutați sau introduceți ruta dosarului de utilizat pentru transcodarea fișierelor temporare. Dosarul trebuie permisiuni de scriere.", + "HeaderSelectTranscodingPathHelp": "Căutați sau introduceți ruta dosarului de utilizat pentru transcodarea fișierelor. Dosarul trebuie permisiuni de scriere.", "HeaderSendMessage": "Trimite Mesaj", "HeaderSeriesOptions": "Opțiuni Seriale", "HeaderSeriesStatus": "Starea Serialelor", "HeaderServerSettings": "Setările Serverului", "HeaderSettings": "Setări", - "HeaderShutdown": "Opriți Alimentarea", "HeaderSortBy": "Sortează după", "HeaderSortOrder": "Ordinea de sortare", "LabelTranscodingThreadCount": "Numărul de threaduri ale transcodării:", @@ -637,8 +547,6 @@ "LabelTranscodingFramerate": "Rata de cadru a transcodării:", "LabelTranscodes": "Transcodează:", "LabelTranscodePath": "Cale transcodare:", - "LabelTranscodingContainer": "Container :", - "LabelTranscodingAudioCodec": "Codec audio:", "LabelTrackNumber": "Număr melodie:", "LabelTitle": "Titlu:", "LabelTime": "Ora:", @@ -650,7 +558,6 @@ "LabelTag": "Etichetă:", "LabelTVHomeScreen": "Ecran de pornire în modul TV:", "LabelSupportedMediaTypes": "Tipuri media suportate:", - "LabelSubtitles": "Subtitrări", "LabelSubtitlePlaybackMode": "Mod subtitrare:", "LabelSubtitleFormatHelp": "Exemplu: srt", "LabelSubtitleDownloaders": "Descărcare subtitrări:", @@ -660,7 +567,6 @@ "LabelSportsCategories": "Categorii sportive:", "LabelSpecialSeasonsDisplayName": "Denumirea afișării sezonului special:", "LabelSource": "Sursă:", - "LabelSoundEffects": "Efecte audio:", "LabelSortTitle": "Sortează titlu:", "LabelSortOrder": "Ordinea de sortare:", "LabelSortBy": "Sortează după:", @@ -672,7 +578,6 @@ "LabelSkipIfAudioTrackPresent": "Ignoră dacă pista audio implicită se potrivește cu limba de descărcare", "LabelSkipForwardLength": "Durata salt înainte:", "LabelSkipBackLength": "Durata salt înapoi:", - "LabelSkin": "Tema:", "LabelSize": "Mărime:", "LabelSimultaneousConnectionLimit": "Limita streamului simultan:", "LabelServerName": "Numele serverului:", @@ -686,14 +591,13 @@ "LabelSeasonNumber": "Numărul sezonului:", "LabelScreensaver": "Protector de ecran:", "LabelScheduledTaskLastRan": "Ultima redare{0}, cu durata {1}.", - "LabelRuntimeMinutes": "Timp de redare (minute):", + "LabelRuntimeMinutes": "Timp de redare:", "LabelRemoteClientBitrateLimitHelp": "O limită de biți per-stream opțională pentru toate dispozitivele din rețea. Acest lucru este util pentru a împiedica dispozitivele să solicite un bitrate mai mare decât poate gestiona conexiunea dvs. de internet. Acest lucru poate duce la creșterea încărcării procesorului pe serverul dvs. pentru a transcoda videoclipurile din zbor la un bitrate mai mic.", "LabelRemoteClientBitrateLimit": "Limită de biți pentru streaming pe Internet (Mbps):", "LabelReleaseDate": "Data lansării:", "LabelRefreshMode": "Mod reîmprospătare:", "LabelRecord": "Înregistrare:", "LabelReasonForTranscoding": "Motiv pentru transcodare:", - "LabelReadHowYouCanContribute": "Aflați cum puteți contribui.", "LabelPublicHttpsPortHelp": "Numărul de port public care ar trebui mapat în portul HTTPS local.", "LabelPublicHttpsPort": "Portul HTTPS public:", "LabelPublicHttpPortHelp": "Numărul de port public care ar trebui mapat în portul HTTP local.", @@ -708,7 +612,6 @@ "LabelProfileCodecs": "Codecuri:", "LabelProfileAudioCodecs": "Codecuri audio:", "LabelPreferredSubtitleLanguage": "Limba subtitrare preferată:", - "LabelPreferredDisplayLanguageHelp": "Traducerea Jellyfin este un proiect în derulare.", "LabelPreferredDisplayLanguage": "Limba de afișare preferată:", "LabelPostProcessorArgumentsHelp": "Utilizați {path} ca și cale către fișierul de înregistrare.", "LabelPostProcessorArguments": "Argumentele liniei de comandă post-procesare:", @@ -730,8 +633,8 @@ "LabelOverview": "Prezentare generală:", "LabelOriginalTitle": "Titlu original:", "LabelOriginalAspectRatio": "Raport aspect original:", - "LabelOptionalNetworkPathHelp": "Dacă acest folder este partajat în rețeaua dvs., furnizarea căii de partajare a rețelei poate permite aplicațiilor Jellyfin de pe alte dispozitive să acceseze fișiere media direct.", - "LabelOptionalNetworkPath": "(Optional) Dosar partajat în rețea:", + "LabelOptionalNetworkPathHelp": "Dacă acest folder este partajat în rețeaua dvs., furnizarea căii de partajare a rețelei poate permite aplicațiilor client de pe alte dispozitive să acceseze fișiere media direct. De exemplu, {0} sau {1}.", + "LabelOptionalNetworkPath": "Dosar partajat în rețea:", "LabelNumber": "Număr:", "LabelNotificationEnabled": "Activează această notificare", "LabelNewsCategories": "Categoriile știrilor:", @@ -752,7 +655,7 @@ "LabelMinResumeDurationHelp": "Cea mai scurtă lungime video în secunde, care va salva locația de redare și vă va permite să reluați.", "LabelMinResumeDuration": "Durata minimă a reluării:", "LabelMethod": "Metoda:", - "LabelMetadataSaversHelp": "Alegeți formatele de fișiere pentru a vă salva metadatele.", + "LabelMetadataSaversHelp": "Alegeți formatele de fișiere pentru salvarea metadatele.", "LabelMetadataSavers": "Salvări de metadate:", "LabelMetadataReadersHelp": "Clasificați sursele preferate de metadate locale în ordinea priorității. Primul fișier găsit va fi citit.", "LabelMetadataReaders": "Cititori de metadate:", @@ -772,7 +675,7 @@ "LabelLoginDisclaimerHelp": "Un mesaj care va fi afișat în partea de jos a paginii de conectare.", "LabelLoginDisclaimer": "Act de renunțare la autentificare:", "LabelLockItemToPreventChanges": "Blocați acest element pentru a preveni modificările viitoare", - "LabelLocalHttpServerPortNumberHelp": "Portul TCP pe care serverul HTTP Jellyfin ar trebui să îl utilizeze.", + "LabelLocalHttpServerPortNumberHelp": "Portul TCP pentru serverul HTTP.", "LabelLocalHttpServerPortNumber": "Portul local HTTP:", "LabelLineup": "Echipa:", "LabelLanNetworks": "Rețele LAN:", @@ -799,7 +702,7 @@ "LabelIconMaxWidth": "Lățimea maximă a pictogramei:", "LabelIconMaxHeightHelp": "Rezoluția maximă a pictogramelor expuse via upnp:icon.", "LabelIconMaxHeight": "Înălțimea maximă a pictogramei:", - "LabelHttpsPortHelp": "Portul TCP pe care serverul HTTPS Jellyfin ar trebui sa îl utilizeze.", + "LabelHttpsPortHelp": "Portul TCP pentru serverul HTTPS.", "LabelHttpsPort": "Portul local HTTPS:", "LabelHomeScreenSectionValue": "Secțiunea ecranului de pornire {0}:", "LabelHomeNetworkQuality": "Calitatea pe rețeaua de domiciliu:", @@ -827,7 +730,7 @@ "LabelEndDate": "Data de încheiere:", "LabelEnableSingleImageInDidlLimitHelp": "Unele dispozitive nu vor reda corect dacă mai multe imagini sunt încorporate în Didl.", "LabelEnableSingleImageInDidlLimit": "Limitați la o singură imagine încorporată", - "LabelEnableRealtimeMonitorHelp": "Modificările la fișiere vor fi procesate imediat, pe sistemele de fișiere acceptate.", + "LabelEnableRealtimeMonitorHelp": "Modificările la fișiere vor fi procesate imediat pe sistemele de fișiere acceptate.", "LabelEnableRealtimeMonitor": "Activați monitorizarea în timp real", "LabelEnableHardwareDecodingFor": "Activați decodarea hardware pentru:", "LabelEnableDlnaServerHelp": "Permite dispozitivelor UPnP din rețeaua dvs. să răsfoiască și să redea conținut.", @@ -836,11 +739,11 @@ "LabelEnableDlnaPlayTo": "Activează DLNA Play To", "LabelEnableDlnaDebugLoggingHelp": "Creați fișiere de jurnal mari și trebuie utilizate numai în funcție de necesități pentru rezolvarea problemelor.", "LabelEnableDlnaDebugLogging": "Activați jurnalul de depanare DLNA", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determină durata în secunde între căutările SSDP efectuate de Jellyfin.", - "LabelEnableDlnaClientDiscoveryInterval": "Interval de descoperire a clientului (secunde)", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determină durata în secunde între căutările SSDP.", + "LabelEnableDlnaClientDiscoveryInterval": "Interval de descoperire a clientului", "LabelEnableBlastAliveMessagesHelp": "Activați acest lucru dacă serverul nu este detectat în mod fiabil de alte dispozitive UPnP din rețeaua dvs.", "LabelEnableBlastAliveMessages": "Trimitere mesaje de disponibilitate", - "LabelEnableAutomaticPortMapHelp": "Încercați să mapați automat portul public către portul local prin UPnP. Este posibil să nu funcționeze cu unele modele de router. Modificările nu se vor aplica decât după repornirea serverului.", + "LabelEnableAutomaticPortMapHelp": "Încercați să mapați automat portul public către portul local prin UPnP. Este posibil să nu funcționeze cu unele modele de router. Schimbările nu vor fi aplicate decât după un restart al serverului.", "LabelEnableAutomaticPortMap": "Activați maparea automată a porturilor", "LabelEmbedAlbumArtDidlHelp": "Unele dispozitive preferă această metodă pentru obținerea artei albumelor. Alții pot să nu redea cu această opțiune activată.", "LabelEmbedAlbumArtDidl": "Încorporați arta albumului în Didl", @@ -869,10 +772,8 @@ "LabelDateAddedBehaviorHelp": "Dacă există o valoare de metadate, aceasta va fi întotdeauna folosită înainte de oricare dintre aceste opțiuni.", "LabelDateAddedBehavior": "Comportamentul datei adăugării pentru conținut nou:", "LabelDateAdded": "Data adăugării:", - "LabelDashboardTheme": "Tema tabloul de bord al serverului:", "LabelCustomRating": "Evaluare personalizată:", "LabelCustomDeviceDisplayNameHelp": "Furnizați un nume de afișare personalizat sau lăsați gol pentru a utiliza numele raportat de dispozitiv.", - "LabelCustomDeviceDisplayName": "Numele afisat:", "LabelCustomCssHelp": "Aplicați propriul stil personalizat pe interfața web.", "LabelCustomCss": "CSS personalizat:", "LabelCriticRating": "Evaluare critic:", @@ -886,11 +787,11 @@ "LabelBurnSubtitles": "Imprimă subtitrările:", "LabelBlockContentWithTags": "Blochează articolele cu etichetele:", "LabelBlastMessageIntervalHelp": "Determină durata în secunde între transmiterea mesajele de viață.", - "LabelBlastMessageInterval": "Interval transmitere mesaj viu (secunde)", + "LabelBlastMessageInterval": "Interval transmitere mesaj viu", "LabelBitrate": "Rată de biți:", "LabelBirthYear": "Anul nașterii:", "LabelBirthDate": "Data nașterii:", - "LabelBindToLocalNetworkAddressHelp": "Opțional. Rescrie adresa IP locală pentru a o utiliza serverul http. Dacă este lăsat gol, serverul se va lega la toate adresele disponibile. Modificarea acestei valori necesită repornirea Jellyfin Server.", + "LabelBindToLocalNetworkAddressHelp": "Rescrie adresa IP locală a serverului http. Dacă este lăsat gol, serverul se va lega la toate adresele disponibile. Modificarea acestei valori necesită un restart.", "LabelBindToLocalNetworkAddress": "Utilizează adresa de rețea locală:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Actualizați automat metadatele de pe internet:", "LabelAuthProvider": "Furnizor de autentificare:", @@ -899,13 +800,11 @@ "LabelAudioChannels": "Canale audio:", "LabelAudioBitrate": "Rata de biți audio:", "LabelAudioBitDepth": "Adâncimea bitului audio:", - "LabelAudio": "Audio", "LabelAppNameExample": "Exemplu: Sickbeard, Sonarr", "LabelAppName": "Nume app", "LabelAllowedRemoteAddressesMode": "Modul de filtrare a adresei IP de la distanță:", "LabelAllowedRemoteAddresses": "Filtrul de adrese IP de la distanță:", "LabelAllowHWTranscoding": "Permite transcodare hardware", - "LabelAll": "Tot", "LabelAlbumArtists": "Artiști album:", "LabelAlbumArtPN": "Artă album PN:", "LabelAlbumArtMaxWidthHelp": "Rezoluție maximă a artei albumului expusă via upnp:albumArtURI.", @@ -929,7 +828,7 @@ "ItemCount": "{0} articole", "InstantMix": "Mix instant", "InstallingPackage": "Instalare {0} (versiune {1})", - "ImportFavoriteChannelsHelp": "Dacă este activat, vor fi importate numai canalele marcate ca preferate pe dispozitivul tuner.", + "ImportFavoriteChannelsHelp": "Vor fi importate numai canalele marcate ca preferate pe dispozitivul tuner.", "Images": "Imagini", "Identify": "Identifică", "HttpsRequiresCert": "Pentru a activa conexiunile securizate, va trebui să furnizați un certificat SSL de încredere, cum ar fi Let's Encrypt. Vă rugăm să furnizați un certificat sau să dezactivați conexiunile securizate.", @@ -937,7 +836,6 @@ "Home": "Acasă", "HideWatchedContentFromLatestMedia": "Ascunde conținutul vizionat din cele mai recente media", "Hide": "Ascunde", - "HeadersFolders": "Dosare", "HeaderYears": "Ani", "HeaderXmlSettings": "XML setări", "HeaderXmlDocumentAttributes": "XML Document Atribute", @@ -957,7 +855,6 @@ "HeaderTranscodingProfile": "Profilul transcodării", "HeaderTracks": "Piese", "HeaderThisUserIsCurrentlyDisabled": "Acest utilizator este momentan dezactivat", - "HeaderTags": "Etichete", "HeaderSystemDlnaProfiles": "Profile de sistem", "HeaderSubtitleProfilesHelp": "Profilele subtitrării descriu formatul subtitrării compatibil cu dispozitivul.", "HeaderSubtitleProfiles": "Profilele subtitrării", @@ -981,14 +878,14 @@ "OptionBlockChannelContent": "Conținut canal Internet", "OptionBlockBooks": "Cărți", "OptionBanner": "Steag", - "OptionAutomaticallyGroupSeriesHelp": "Dacă este activat, seriile distribuite pe mai multe foldere din această bibliotecă vor fi comasate automat într-o singură serie.", + "OptionAutomaticallyGroupSeriesHelp": "Seriile distribuite pe mai multe foldere din această bibliotecă vor fi comasate automat într-o singură serie.", "OptionAutomaticallyGroupSeries": "Fuzionează automat seriile care sunt răspândite pe mai multe foldere", "OptionAuto": "Auto", "OptionArtist": "Artist", "OptionAllowVideoPlaybackTranscoding": "Permiteți redarea video care necesită transcodare", "OptionAllowVideoPlaybackRemuxing": "Permiteți redarea video care necesită conversie fără re-codificare", "OptionAllowSyncTranscoding": "Permiteți descărcarea și sincronizarea media care necesită transcodare", - "OptionAllowMediaPlaybackTranscodingHelp": "Restrângerea accesului la transcodare poate provoca defecțiuni de redare în aplicațiile Jellyfin din cauza formatelor media neacceptate.", + "OptionAllowMediaPlaybackTranscodingHelp": "Restrângerea accesului la transcodare poate provoca defecțiuni de redare în aplicațiile client din cauza formatelor media neacceptate.", "OptionAllowContentDownloading": "Permiteți descărcarea și sincronizarea media", "OptionAllowAudioPlaybackTranscoding": "Permiteți redarea audio care necesită transcodare", "OptionAllUsers": "Toți utilizatorii", @@ -1005,9 +902,8 @@ "Normal": "Normal", "None": "Nici unul", "NoSubtitlesHelp": "Subtitrările nu vor fi încărcate în mod implicit. Acestea pot fi însă activate manual în timpul redării.", - "NoSubtitles": "Fără", "NoSubtitleSearchResultsFound": "Nici un rezultat găsit.", - "NoPluginConfigurationMessage": "Acest plugin nu are setări de configurat.", + "MessageNoPluginConfiguration": "Acest plugin nu are setări de configurat.", "NoNewDevicesFound": "Nu s-au găsit dispozitive noi. Pentru a adăuga un nou tuner, închideți acest dialog și introduceți informațiile dispozitivului manual.", "No": "Nu", "NextUp": "Urmează", @@ -1038,9 +934,8 @@ "MessageUnsetContentHelp": "Conținutul va fi afișat ca foldere simple. Pentru cele mai bune rezultate, utilizați managerul de metadate pentru a seta tipurile de conținut ale sub-foldererelor.", "MessageUnableToConnectToServer": "Nu putem să ne conectăm la serverul selectat în acest moment. Vă rugăm să vă asigurați că funcționează și încercați din nou.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Următoarele locații media vor fi eliminate din biblioteca dvs.:", - "MessageSettingsSaved": "Setări salvate.", "MessageReenableUser": "Consultați mai jos pentru a reactiva", - "MessagePluginInstallDisclaimer": "Pluginurile create de membrii comunității Jellyfin sunt o modalitate excelentă de a vă îmbunătăți experiența Jellyfin cu funcții și beneficii suplimentare. Înainte de instalare, vă rugăm să fiți conștienți de efectele pe care le pot avea asupra serverului dvs. Jellyfin, cum ar fi scanările de bibliotecă mai lungi, procesarea suplimentară a fundalului și scăderea stabilității sistemului.", + "MessagePluginInstallDisclaimer": "Pluginurile create de membrii comunității sunt o modalitate excelentă de a vă îmbunătăți experiența cu funcții și beneficii suplimentare. Înainte de instalare, vă rugăm să fiți conștienți de efectele pe care le pot avea asupra serverului dvs., cum ar fi scanările de bibliotecă mai îndelungate, procesare suplimentară în fundal și scăderea stabilității sistemului.", "MessagePluginConfigurationRequiresLocalAccess": "Pentru a configura acest plugin, vă rugăm să vă conectați direct la serverul dvs. local.", "MessagePleaseWait": "Te rog așteaptă. Poate dura un minut.", "MessagePlayAccessRestricted": "Redarea acestui conținut este în prezent restricționată. Vă rugăm să contactați administratorul serverului pentru mai multe informații.", @@ -1056,7 +951,6 @@ "MessageItemSaved": "Articol salvat.", "MessageInvalidUser": "Nume de utilizator sau parola incorecte. Vă rugăm să încercați din nou.", "MessageInvalidForgotPasswordPin": "A fost introdus un cod PIN nevalid sau expirat. Vă rugăm să încercați din nou.", - "MessageInstallPluginFromApp": "Acest plugin trebuie instalat din aplicația în care intenționați să îl utilizați.", "MessageImageTypeNotSelected": "Vă rugăm să selectați un tip de imagine din meniul derulant.", "MessageImageFileTypeAllowed": "Sunt acceptate numai fișierele JPEG și PNG.", "MessageForgotPasswordInNetworkRequired": "Încercați din nou în rețeaua de domiciliu pentru a iniția procesul de resetare a parolei.", @@ -1064,13 +958,13 @@ "MessageFileReadError": "S-a întâmpinat o eroare în timpul citirii fișierului. Vă rugăm să încercați din nou.", "MessageDownloadQueued": "Descărcare adăugata în coadă.", "MessageDirectoryPickerLinuxInstruction": "Pentru Linux pe Arch Linux, CentOS, Debian, Fedora, openSUSE sau Ubuntu, trebuie să acordați utilizatorului serverului Jellyfin cel puțin permisiunea de citire la locațiile de stocare.", - "MessageDirectoryPickerBSDInstruction": "Pentru BSD, poate fi necesar să configurați stocarea în FreeNAS jail pentru a permite serverului Jellyfin să o acceseze.", + "MessageDirectoryPickerBSDInstruction": "Pentru BSD, poate fi necesar să configurați stocarea în FreeNAS Jail pentru ca Jellyfin să o acceseze.", "MessageDeleteTaskTrigger": "Sigur doriți să ștergeți acest declanșator de activitate?", "MessageCreateAccountAt": "Crează un cont la {0}", "MessageContactAdminToResetPassword": "Vă rugăm să contactați administratorul de sistem pentru a vă reseta parola.", "MessageConfirmShutdown": "Sigur doriți să opriți serverul?", - "MessageConfirmRevokeApiKey": "Sigur doriți să revocați această cheie API? Conexiunea aplicației la Jellyfin Server va fi terminată brusc.", - "MessageConfirmRestart": "Sigur doriți să redemarați serverul Jellyfin?", + "MessageConfirmRevokeApiKey": "Sigur doriți să revocați această cheie API? Conexiunea aplicației la acest server va fi terminată brusc.", + "MessageConfirmRestart": "Sigur doriți să restartați Jellyfin?", "MessageConfirmRemoveMediaLocation": "Sigur doriți să eliminați această locație?", "MessageConfirmRecordingCancellation": "Anulați înregistrarea?", "MessageConfirmProfileDeletion": "Sigur doriți să ștergeți acest profil?", @@ -1086,7 +980,6 @@ "MediaInfoStreamTypeEmbeddedImage": "Imaginea încorporată", "MediaInfoStreamTypeData": "Date", "MediaInfoStreamTypeAudio": "Audio", - "MediaInfoSoftware": "Software", "MediaInfoTimestamp": "Data și ora", "MediaInfoSize": "Mărime", "MediaInfoSampleRate": "Rata monstrei", @@ -1121,16 +1014,13 @@ "LiveBroadcasts": "Emisie în direct", "Live": "În direct", "List": "Listă", - "LinksValue": "Linkuri: {0}", "Like": "Îmi place", "LeaveBlankToNotSetAPassword": "Puteți lăsa acest câmp necompletat pentru a nu seta o parolă.", "LearnHowYouCanContribute": "Aflați cum puteți contribui.", - "LaunchWebAppOnStartupHelp": "Deschideți clientul web în browserul dvs. implicit la pornirea inițială a serverului. Acest lucru nu se va produce atunci când se utilizează funcția serverului de repornire.", - "LaunchWebAppOnStartup": "Lansați interfața web la pornirea serverului", "LatestFromLibrary": "Ultimele {0}", "Large": "Mare", "LanNetworksHelp": "Lista separată de virgule a adreselor IP sau a intrărilor de tip IP/mască de rețea pentru rețelele care vor fi luate în considerare în rețeaua locală atunci când se aplică restricțiile de lățime de bandă. Dacă este setat, toate celelalte adrese IP vor fi considerate a fi în rețeaua externă și vor fi supuse restricțiilor de lățime de bandă externe. Dacă este lăsat necompletat, numai subnetul serverului este considerat a fi în rețeaua locală.", - "LabelffmpegPathHelp": "Calea către executabilul ffmpeg, sau dosarul care conține ffmpeg.", + "LabelffmpegPathHelp": "Calea către executabilul ffmpeg sau dosarul care conține ffmpeg.", "LabelffmpegPath": "Calea către FFmpeg:", "LabelZipCode": "Cod poștal:", "LabelYear": "Anul:", @@ -1163,7 +1053,6 @@ "LabelType": "Tip:", "LabelTunerType": "Tip tuner:", "LabelTunerIpAddress": "Adresă IP Tuner:", - "LabelTranscodingVideoCodec": "Codec video:", "LabelTranscodingThreadCountHelp": "Selectați numărul maxim de fire de execuție de utilizat la transcodare. Reducerea numărului de fire de execuție va scădea utilizarea procesorului, dar este posibil să nu se convertească suficient de repede pentru o experiență de redare lină.", "Suggestions": "Recomandări", "Subtitles": "Subtitrări", @@ -1195,10 +1084,10 @@ "SettingsWarning": "Modificarea acestor valori poate provoca instabilități sau eșecuri de conectivitate. Dacă întâmpinați probleme, vă recomandăm să le schimbați înapoi cu cele din modul implicit.", "SettingsSaved": "Setări salvate.", "Settings": "Setări", - "ServerUpdateNeeded": "Acest Jellyfin Server trebuie actualizat. Pentru a descărca cea mai recentă versiune, accesați {0}", - "ServerRestartNeededAfterPluginInstall": "Jellyfin Server va trebui să fie repornit după instalarea unui plugin.", - "ServerNameIsShuttingDown": "Jellyfin Server - {0} se oprește.", - "ServerNameIsRestarting": "Jellyfin Server - {0} se repornește.", + "ServerUpdateNeeded": "Acest server trebuie actualizat. Pentru a descărca cea mai recentă versiune, accesați {0}", + "ServerRestartNeededAfterPluginInstall": "Jellyfin va trebui să fie repornit după instalarea unui plugin.", + "ServerNameIsShuttingDown": "Serverul de pe {0} se oprește.", + "ServerNameIsRestarting": "Serverul de pe {0} se repornește.", "SeriesYearToPresent": "{0} - Prezent", "SeriesSettings": "Setările serialului", "SeriesRecordingScheduled": "Înregistrarea serialului programată.", @@ -1219,7 +1108,6 @@ "SaveSubtitlesIntoMediaFoldersHelp": "Stocarea subtitrărilor lângă fișierele video le va permite să fie gestionate mai ușor.", "SaveSubtitlesIntoMediaFolders": "Salvați subtitrările în dosarele media", "Runtime": "Timpul de rulare", - "RunAtStartup": "Rulați la pornire", "Rewind": "Derulează", "ResumeAt": "Reluați de la {0}", "ReplaceExistingImages": "Înlocuiți toate imaginile", @@ -1235,11 +1123,11 @@ "ReleaseDate": "Data lansării", "RefreshQueued": "Actualizare adăugată în coadă.", "RefreshMetadata": "Actualizați metadatele", - "RefreshDialogHelp": "Metadatele sunt actualizate pe baza setărilor și a serviciilor de internet care sunt activate în tabloul de bord Jellyfin Server.", + "RefreshDialogHelp": "Metadatele sunt actualizate pe baza setărilor și a serviciilor de internet care sunt activate în tabloul de bord.", "Refresh": "Reîmprospătează", "Recordings": "Înregistrări", "RecordingScheduled": "Înregistrare programată.", - "RecordingPathChangeMessage": "Modificarea dosarului dvs. de înregistrare nu va migra înregistrările existente din vechea locație la cea nouă. Dacă doriți, trebuie să le mutați manual.", + "MessageChangeRecordingPath": "Modificarea dosarului dvs. de înregistrare nu va migra înregistrările existente din vechea locație la cea nouă. Dacă doriți, trebuie să le mutați manual.", "RecordingCancelled": "Înregistrare anulată.", "RecordSeries": "Înregistrează serialele", "Record": "Înregistrează", @@ -1250,7 +1138,6 @@ "RecentlyWatched": "Vizionate recent", "Rate": "Evaluare", "Raised": "Ridicat", - "QueueAllFromHere": "Formează o coadă de aici", "Quality": "Calitatea", "Programs": "Programe", "ProductionLocations": "Locații de producție", @@ -1261,9 +1148,9 @@ "Premiere": "Premieră", "PreferEmbeddedTitlesOverFileNamesHelp": "Aceasta determină titlul afișat implicit atunci când nu sunt disponibile metadate din internet sau metadate locale.", "PreferEmbeddedTitlesOverFileNames": "Preferă titlurile incluse decât numele fișierelor", - "PluginInstalledMessage": "Pluginul a fost instalat cu succes. Jellyfin Server va trebui să fie repornit pentru ca modificările să intre în vigoare.", + "MessagePluginInstalled": "Pluginul a fost instalat cu succes. Serverul va trebui să fie repornit pentru ca modificările să intre în vigoare.", "PleaseSelectTwoItems": "Vă rugăm să selectați cel puțin două elemente.", - "PleaseRestartServerName": "Vă rugăm să reporniți Jellyfin Server - {0}.", + "PleaseRestartServerName": "Vă rugăm să reporniți Jellyfin pe {0}.", "PleaseEnterNameOrId": "Vă rugăm să introduceți un nume sau un ID extern.", "PleaseConfirmPluginInstallation": "Faceți clic pe OK pentru a confirma că ați citit mai sus și doriți să continuați cu instalarea pluginului.", "PleaseAddAtLeastOneFolder": "Vă rugăm să adăugați cel puțin un dosar la această bibliotecă făcând clic pe butonul Adăugare.", @@ -1282,8 +1169,8 @@ "PerfectMatch": "Potrivire perfectă", "People": "Oameni", "PasswordSaved": "Parolă salvată.", - "PasswordResetProviderHelp": "Alegeți un furnizor de resetare a parolei pentru a fi utilizat atunci când acest utilizator solicită o resetare a parolei", - "PasswordResetHeader": "Resetează parola", + "PasswordResetProviderHelp": "Alegeți un furnizor de resetare a parolei pentru a fi utilizat atunci când acest utilizator solicită o resetare a parolei.", + "HeaderResetPassword": "Resetează parola", "PasswordResetConfirmation": "Sigur doriți să resetați parola?", "PasswordResetComplete": "Parola a fost resetată.", "PasswordMatchError": "Confirmarea parolei și parola trebuie să corespundă.", @@ -1302,7 +1189,7 @@ "OptionThumb": "Miniatură", "OptionSubstring": "Subșir", "OptionSpecialEpisode": "Speciale", - "OptionSaveMetadataAsHiddenHelp": "Modificarea acestui lucru se va aplica la noi metadate salvate de acum înainte. Fișierele de metadate existente vor fi actualizate data viitoare când sunt salvate de Jellyfin Server.", + "OptionSaveMetadataAsHiddenHelp": "Modificarea acestui lucru se va aplica la noi metadate salvate de acum înainte. Fișierele de metadate existente vor fi actualizate data viitoare când sunt salvate de server.", "OptionSaveMetadataAsHidden": "Salvați metadata și imaginile ca fișiere ascunse", "OptionResElement": "element res", "OptionRequirePerfectSubtitleMatchHelp": "Cerând o potrivire perfectă va filtra subtitrările pentru a le include doar pe cele care au fost testate și verificate cu fișierul dvs. video exact. Debifând acest lucru, va crește probabilitatea descărcării subtitrărilor, dar va crește șansele de a avea decalaje sau de a greși textul de subtitrare.", @@ -1319,12 +1206,11 @@ "OptionProfileAudio": "Audio", "OptionPosterCard": "Carte de afiș", "OptionPoster": "Afiș", - "OptionPlainVideoItemsHelp": "Dacă este activat, toate videoclipurile sunt reprezentate în DIDL ca „object.item.videoItem” în loc de un tip mai specific, cum ar fi „object.item.videoItem.movie”.", + "OptionPlainVideoItemsHelp": "Toate videoclipurile sunt reprezentate în DIDL ca „object.item.videoItem” în loc de un tip mai specific, cum ar fi „object.item.videoItem.movie”.", "OptionPlainVideoItems": "Afișați toate videoclipurile ca elemente video simple", - "OptionPlainStorageFoldersHelp": "Dacă este activat, toate folderele sunt reprezentate în DIDL ca „object.container.storageFolder” în loc de un tip mai specific, cum ar fi „object.container.person.musicArtist”.", + "OptionPlainStorageFoldersHelp": "Toate dosarele sunt reprezentate în DIDL ca „object.container.storageFolder” în loc de un tip mai specific, cum ar fi „object.container.person.musicArtist”.", "OptionPlainStorageFolders": "Afișați toate dosarele ca dosare simple de stocare", "OptionOnInterval": "La un interval", - "OptionOnAppStartup": "La pornirea aplicației", "OptionNone": "Nici unul", "OptionNew": "Nou…", "OptionMissingEpisode": "Episoade lipsă", @@ -1334,7 +1220,7 @@ "OptionList": "Listă", "OptionIsSD": "SD", "OptionIsHD": "HD", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Dacă sunt activate, aceste solicitări vor fi respectate, dar vor ignora antetul intervalului de octeți.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Aceste solicitări vor fi respectate, dar vor ignora antetul intervalului de octeți.", "OptionIgnoreTranscodeByteRangeRequests": "Ignorați solicitările pentru transcodarea intervalului de octeți", "OptionHomeVideos": "Fotografii", "OptionHlsSegmentedSubtitles": "Subtitrare segmentată HLS", @@ -1349,10 +1235,10 @@ "OptionEnableForAllTuners": "Activare pentru toate dispozitivele tuner", "OptionEnableExternalContentInSuggestionsHelp": "Permiteți trailerelor din internet și programelor TV în direct să fie incluse în conținutul sugerat.", "OptionEnableExternalContentInSuggestions": "Activați conținut extern în sugestii", - "OptionEmbedSubtitles": "Inclus în container", - "OptionDownloadLogoImage": "Siglă", - "OptionDownloadImagesInAdvanceHelp": "În mod implicit, majoritatea imaginilor sunt descărcate numai la cererea unei aplicații din Jellyfin. Activați această opțiune pentru a descărca în prealabil toate imaginile, pe măsură ce fișierele media sunt importate. Acest lucru poate provoca scanări ale bibliotecii semnificativ mai lungi.", - "OptionDownloadImagesInAdvance": "Descărcați imaginile în avans", + "OptionEmbedSubtitles": "Încorporați în container", + "OptionDownloadLogoImage": "Logo", + "OptionDownloadImagesInAdvanceHelp": "În mod implicit, majoritatea imaginilor sunt descărcate numai la cererea unei aplicații Jellyfin. Activați această opțiune pentru a descărca în avans toate imaginile, pe măsură ce fișiere media noi sunt importate. Acest lucru poate duce la mărirea semnificativă a timpilor de scanare a bibliotecii.", + "OptionDownloadImagesInAdvance": "Descărcă imaginile în avans", "OptionDownloadDiscImage": "Disc", "OptionDisplayFolderViewHelp": "Afișați dosarele alături de celelalte biblioteci media. Acest lucru poate fi util dacă doriți să aveți o vizualizare direct în dosar.", "OptionDisplayFolderView": "Afișați o vizualizare de dosar pentru a afișa dosarele media simple", @@ -1371,7 +1257,6 @@ "Watched": "Vizionat", "ViewPlaybackInfo": "Vizualizați informațiile despre redare", "ViewAlbum": "Vizualizați albumul", - "VideoRange": "Interval video", "Vertical": "Vertical", "ValueVideoCodec": "Codec Video: {0}", "ValueTimeLimitSingleHour": "Limită de timp: 1 oră", @@ -1401,7 +1286,7 @@ "Unrated": "Neevaluat", "Unplayed": "Nerulat", "Unmute": "Activați sunetul", - "UninstallPluginHeader": "Dezinstalați pluginul", + "HeaderUninstallPlugin": "Dezinstalați pluginul", "UninstallPluginConfirmation": "Sigur doriți să dezinstalați {0}?", "Uniform": "Constant", "TvLibraryHelp": "Examinați {0}ghidul de denumire TV{1}.", @@ -1417,25 +1302,16 @@ "ThemeSongs": "Melodiile temei", "TagsValue": "Etichete: {0}", "Tags": "Etichete", - "TabUsers": "Utilizatori", "TabStreaming": "Transmitere", "TabServer": "Server", "TabScheduledTasks": "Task-uri programate", - "TabResumeSettings": "Continuă", "TabResponses": "Răspunsuri", "TabPlugins": "Pluginuri", - "TabPlaylists": "Liste redare", - "TabPlayback": "Redare", "TabParentalControl": "Control Parental", "TabNfoSettings": "Setări NFO", "TabNetworking": "Rețele", - "TabMetadata": "Metadată", "TabLogs": "Jurnal", - "TabLiveTV": "TV în Direct", - "TabInfo": "Info", - "TabDisplay": "Afișare", "TabDirectPlay": "Redare directă", - "TabDevices": "Dispozitive", "TabDashboard": "Tablou de bord", "TabContainers": "Containere", "TabCodecs": "Codecuri", @@ -1444,7 +1320,6 @@ "SystemDlnaProfilesHelp": "Profilele de sistem pot fi numai citite. Modificările aduse unui profil de sistem vor fi salvate într-un nou profil personalizat.", "HeaderNavigation": "Navigare", "MessageConfirmAppExit": "Vrei să ieși?", - "CopyStreamURLError": "A apărut o eroare la copierea adresei URL.", "LabelVideoResolution": "Rezoluția video:", "LabelStreamType": "Tipul streamului:", "LabelPlayerDimensions": "Dimensiunile soft redare:", @@ -1454,15 +1329,13 @@ "NoCreatedLibraries": "Se pare că nu ați creat încă biblioteci. {0} Doriți să creați una acum? {1}", "AskAdminToCreateLibrary": "Cereți unui administrator să creeze o bibliotecă.", "PlaybackErrorNoCompatibleStream": "Clientul nu este compatibil cu formatul media, iar serverul nu trimite un format media compatibil.", - "AllowFfmpegThrottlingHelp": "Când un transcod sau un remux se află destul de departe înainte de poziția actuală de redare, întrerupeți procesul, astfel încât să consume mai puține resurse. Acest lucru este util atunci când priviți fără a derula des. Dezactivați acestă opțiune dacă întâmpinați probleme de redare.", + "AllowFfmpegThrottlingHelp": "Când o transcodare sau un remux se află departe de poziția actuală de redare, întrerupeți procesul, astfel încât acesta să consume mai puține resurse. Acest lucru este cel mai util când priviți fără a căuta prin film des. Dezactivați acest lucru dacă întâmpinați probleme de redare.", "AllowFfmpegThrottling": "Limitare Transcod-uri", "Track": "Cale", "Season": "Sezon", - "ReleaseGroup": "Gruparea lansării", "PreferEmbeddedEpisodeInfosOverFileNames": "Preferați informația despre episod încorporată în fișier decât numele fișierelor", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Aceasta folosește informația despre episod din metadatele încorporate, dacă sunt disponibile.", "Person": "Persoană", - "OtherArtist": "Alt artist", "Movie": "Film", "Episode": "Episod", "ClientSettings": "Setări pentru client", @@ -1480,7 +1353,7 @@ "LastSeen": "Văzut ultima dată {0}", "PersonRole": "ca {0}", "ListPaging": "{0}-{1} din {2}", - "WriteAccessRequired": "Jellyfin Server necesită acces de scriere la acest folder. Vă rugăm să vă asigurați accesul la scriere și încercați din nou.", + "WriteAccessRequired": "Jellyfin necesită acces de scriere la acest folder. Vă rugăm să vă asigurați accesul la scriere și încercați din nou.", "PathNotFound": "Calea nu a fost găsită. Vă rugăm să vă asigurați de validitatea căii și încercați din nou.", "YadifBob": "Gigi Bob", "Yadif": "YADIF", @@ -1489,24 +1362,20 @@ "UnsupportedPlayback": "Jellyfin nu poate decripta conținut protejat de DRM, dar tot conținutul va fi încercat indiferent de titlurile protejate. Unele fișiere pot părea complet negre din cauza criptării sau a altor funcții neacceptate, cum ar fi titluri interactive.", "LabelLibraryPageSizeHelp": "Setează cantitatea de elemente de afișat pe o pagină a bibliotecii. Setați la 0 pentru a dezactiva paginarea.", "LabelLibraryPageSize": "Mărimea paginii Bibliotecă:", - "MessageUnauthorizedUser": "Nu sunteți autorizat să accesați serverul în acest moment. Vă rugăm să contactați administratorul serverului pentru mai multe informații.", "ButtonTogglePlaylist": "Listă de redare", - "ButtonToggleContextMenu": "Mai mult", "Filter": "Filtru", "New": "Nou", "HeaderFavoritePlaylists": "Listă Favorită", "ApiKeysCaption": "Lista cheilor API active", "LabelRequireHttpsHelp": "Dacă e selectat, serverul va redirecta automat toate cererile HTTP către HTTPS. Dacă nu se ascultă pe HTTPS, nu are niciun efect.", "LabelRequireHttps": "Trebuie HTTPS", - "LabelNightly": "Ultimă", "LabelStable": "Stabilă", "LabelChromecastVersion": "Versiunea de Chromecast", - "LabelEnableHttpsHelp": "Activează serverul să asculte pe portul HTTPS configurat. Un certificat valid trebuie de asemenea configurat pentru ca să funcţioneze.", + "LabelEnableHttpsHelp": "Ascultă pe portul HTTPS configurat. Un certificat valid trebuie de asemenea configurat pentru ca să funcţioneze.", "LabelEnableHttps": "Activați HTTPS", "HeaderServerAddressSettings": "Setările adresei serverului", "HeaderRemoteAccessSettings": "Setări pentru aces remote", "HeaderHttpsSettings": "Setări https", - "TabDVR": "DVR", "SaveChanges": "Salvează modificările", "HeaderDVR": "DVR", "SyncPlayAccessHelp": "Selectați nivelul de acces pe care îl are acest utilizator la funcția SyncPlay. SyncPlay permite sincronizarea redării cu alte dispozitive.", @@ -1541,8 +1410,8 @@ "HeaderSyncPlaySelectGroup": "Alăturați-vă unui grup", "EnableDetailsBannerHelp": "Afișați o imagine de bandou în partea de sus a paginii cu detalii ale articolului.", "EnableDetailsBanner": "Detalii Bandou", - "EnableBlurhashHelp": "Imaginile care sunt în curs de încărcare vor fi afișate cu un marcaj întinat", - "EnableBlurhash": "Activați marcatoarele întinate pentru imagini", + "EnableBlurHashHelp": "Imaginile care sunt în curs de încărcare vor fi afișate cu un marcaj întinat.", + "EnableBlurHash": "Activați marcatoarele întinate pentru imagini", "ShowMore": "Arată mai mult", "ShowLess": "Arată mai puțin", "ButtonCast": "Proiectează", @@ -1564,5 +1433,14 @@ "LabelRepositoryNameHelp": "Un nume personalizat pentru a distinge acest repertoriu de altele adăugate la serverul dvs.", "ClearQueue": "Golește lista de redare", "StopPlayback": "Oprește redarea", - "ViewAlbumArtist": "Vezi artistul albumului" + "ViewAlbumArtist": "Vezi artistul albumului", + "NextTrack": "Sari la următorul", + "LabelUnstable": "Instabil", + "Preview": "Previzualizare", + "SubtitleVerticalPositionHelp": "Numărul de linie unde apare textul. Numerele pozitive indică de sus în jos. Numerele negative indică de jos în sus.", + "LabelSubtitleVerticalPosition": "Poziție verticală:", + "PreviousTrack": "Sari anterior", + "MessageGetInstalledPluginsError": "A apărut o eroare la obținerea listei de plugin-uri instalate în prezent.", + "MessagePluginInstallError": "A apărut o eroare la instalarea pluginului.", + "PlaybackRate": "Rata de redare" } diff --git a/src/strings/ru.json b/src/strings/ru.json index 0a471bca0c..74c054c99b 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -3,7 +3,6 @@ "AccessRestrictedTryAgainLater": "В настоящее время доступ запрещён. Повторите попытку позже.", "Actor": "Актёр", "Add": "Добавить", - "AddItemToCollectionHelp": "Добавляйте элементы в коллекции, выполняя их поиск, и с помощью правой кнопки мыши или касания меню присоедините их к коллекции.", "AddToCollection": "Добавить в коллекцию", "AddToPlayQueue": "Добавить в очередь воспроизведения", "AddToPlaylist": "Добавить в плей-лист", @@ -24,7 +23,7 @@ "AllowMediaConversionHelp": "Предоставить или запретить доступ к компоненте преобразования медиаданных.", "AllowOnTheFlySubtitleExtraction": "Разрешить динамическое извлечение субтитров", "AllowOnTheFlySubtitleExtractionHelp": "Встроенные субтитры могут быть извлечены из видео и доставлены клиентам в виде обычного текста, в целях предотвращения перекодировки видео. На некоторых системах это может занять продолжительное время и вызвать задержки воспроизведения видео в процессе извлечения. Отключите этот параметр, чтобы встроенные субтитры записывались при перекодировании видео, если они изначально не поддерживаются клиентским устройством.", - "AllowRemoteAccess": "Разрешить удалённый доступ к данному серверу Jellyfin Server.", + "AllowRemoteAccess": "Разрешить удалённый доступ к данному серверу.", "AllowRemoteAccessHelp": "Если флажок снят, то все удалённые подключения будут заблокированы.", "AllowedRemoteAddressesHelp": "Список разделённых запятыми IP-адресов или записей IP/netmask сетей, которым разрешено удалённое соединение. Если оставить это поле пустым, то будут разрешены все удаленные адреса.", "AlwaysPlaySubtitles": "Воспроизводить всегда", @@ -37,10 +36,8 @@ "AsManyAsPossible": "Как можно больше", "Ascending": "По возрастанию", "AspectRatio": "Соотношение сторон", - "AttributeNew": "Новинка", "Audio": "Аудио", "Auto": "Авто", - "AutoBasedOnLanguageSetting": "Авто (на основе настройки языка)", "Backdrop": "Фон", "Backdrops": "Фоны", "Banner": "Баннер", @@ -53,86 +50,59 @@ "Box": "Коробка", "BoxRear": "Коробка (задняя часть)", "Browse": "Навигация", - "BrowsePluginCatalogMessage": "Просмотрите каталог плагинов, чтобы ознакомиться с имеющимися плагинами.", + "MessageBrowsePluginCatalog": "Просмотрите каталог плагинов, чтобы ознакомиться с имеющимися плагинами.", "BurnSubtitlesHelp": "Определяется, должен ли сервер внедрять субтитры при перекодировании. Избежание этого значительно улучшит производительность. Выберите «Авто» для записи основанных на графике форматов (VOBSUB, PGS, SUB, IDX и др.) и некоторых субтитров ASS или SSA.", - "ButtonAdd": "Добавить", "ButtonAddMediaLibrary": "Добавить медиатеку", "ButtonAddScheduledTaskTrigger": "Добавить триггер", "ButtonAddServer": "Добавить сервер", "ButtonAddUser": "Добавить пользователя", - "ButtonArrowDown": "Вниз", "ButtonArrowLeft": "Влево", "ButtonArrowRight": "Вправо", - "ButtonArrowUp": "Вверх", "ButtonAudioTracks": "Аудиодорожки", "ButtonBack": "Назад", "ButtonCancel": "Отменить", "ButtonChangeServer": "Сменить сервер", - "ButtonConnect": "Подсоединиться", - "ButtonDelete": "Удалить", - "ButtonDeleteImage": "Удалить изображение", - "ButtonDown": "Вниз", - "ButtonDownload": "Загрузить", - "ButtonEdit": "Править", - "ButtonEditImages": "Править изображения", "ButtonEditOtherUserPreferences": "Править профиль, изображение и персональные настройки этого пользователя.", - "ButtonFilter": "Фильтр", "ButtonForgotPassword": "Напомнить пароль", "ButtonFullscreen": "Полный экран", "ButtonGotIt": "Понятно", "ButtonGuide": "Телегид", - "ButtonHelp": "Справка", - "ButtonHome": "Главное", "ButtonInfo": "Инфо", - "ButtonLearnMore": "Подробнее", "ButtonLibraryAccess": "Доступ к медиатеке", "ButtonManualLogin": "Войти вручную", "ButtonMore": "Ещё", "ButtonNetwork": "Сеть", - "ButtonNew": "Новое", "ButtonNextTrack": "Следующая дорожка", - "ButtonOff": "Откл", "ButtonOk": "Ок", "ButtonOpen": "Открыть", "ButtonParentalControl": "Родительский контроль", "ButtonPause": "Пауза", - "ButtonPlay": "Воспроизведение", "ButtonPreviousTrack": "Предыдущая дорожка", "ButtonProfile": "Профиль", "ButtonQuickStartGuide": "Руководство по запуску", - "ButtonRefresh": "Обновить", "ButtonRefreshGuideData": "Обновить данные телегида", "ButtonRemove": "Изъять", "ButtonRename": "Переименовать", - "ButtonRepeat": "Повторить", "ButtonResetEasyPassword": "Сбросить простой PIN-код", "ButtonResetPassword": "Сбросить пароль", "ButtonRestart": "Перезапустить", "ButtonResume": "Возобновить", "ButtonRevoke": "Отозвать", - "ButtonSave": "Сохранить", "ButtonScanAllLibraries": "Сканировать все медиатеки", - "ButtonSearch": "Поиск", "ButtonSelectDirectory": "Выбрать каталог", "ButtonSelectServer": "Выбрать сервер", "ButtonSelectView": "Выбрать представление", "ButtonSend": "Передать", "ButtonSettings": "Параметры", - "ButtonShuffle": "Перемешать", "ButtonShutdown": "Завершить работу", "ButtonSignIn": "Вход", "ButtonSignOut": "Выйти", - "ButtonSort": "Сортировать", "ButtonStart": "Запустить", "ButtonStop": "Остановить", "ButtonSubmit": "Подтвердить", - "ButtonSubtitles": "Субтитры", - "ButtonToggleContextMenu": "Ещё", "ButtonTogglePlaylist": "Плей-лист", "ButtonTrailer": "Трейлер", "ButtonUninstall": "Удалить", - "ButtonUp": "Вверх", - "ButtonViewWebsite": "См. вебсайт", "ButtonWebsite": "Веб-сайт", "CancelRecording": "Отменить запись", "CancelSeries": "Отменить сериал", @@ -148,7 +118,7 @@ "ColorTransfer": "Цветопередача", "CommunityRating": "Общественная оценка", "Composer": "Композитор", - "ConfigureDateAdded": "Как конфигурировать дату добавления определяется в Панели Jellyfin Server в параметрах Медиатеки", + "ConfigureDateAdded": "Как конфигурировать дату добавления определяется в Панели в параметрах Медиатеки", "ConfirmDeleteImage": "Удалить изображение?", "ConfirmDeleteItem": "При удалении данного элемента, он удалится и из файловой системы, и из медиатеки. Вы действительно хотите продолжить?", "ConfirmDeleteItems": "При удалении данных элементов, он удалится и из файловой системы, и из медиатеки. Вы действительно хотите продолжить?", @@ -163,7 +133,7 @@ "DatePlayed": "Дата воспроизведения", "DeathDateValue": "Дата смерти: {0}", "Default": "По умолчанию", - "DefaultErrorMessage": "Произошла ошибка при обработке запроса. Повторите попытку позже.", + "ErrorDefault": "Произошла ошибка при обработке запроса. Повторите попытку позже.", "DefaultMetadataLangaugeDescription": "Они являются значениями по умолчанию и могут быть подстроены индивидуально для каждой медиатеки.", "DefaultSubtitlesHelp": "Загрузки субтитров определяются флагами \"По умолчанию\" и \"Форсированные\" во внедрённых метаданных. Языковые настройки учитываются при наличии нескольких опций.", "Delete": "Удалить", @@ -179,8 +149,8 @@ "DetectingDevices": "Обнаруживются устройства", "DeviceAccessHelp": "Это относится только к устройствам, которые могут быть однозначно распознаны и не препятствует доступу через браузер. Фильтрация доступа пользовательского устройства запретит использование новых устройств до тех пор, пока они не будут одобрены.", "DirectPlaying": "Воспроизводится напрямую", - "DirectStreamHelp1": "Медиаданные совместимы с устройством в отношении разрешения и типа медиаданных (H.264, AC3, и т.д.), но в несовместимом файловом контейнере (mkv, avi, wmv и т.д.). Видео будет повторно упаковано динамически перед его трансляцией на устройство.", - "DirectStreamHelp2": "При прямой трансляции файла расходуется очень мало вычислительной мощности без потери качества видео.", + "DirectStreamHelp1": "Медиаданные совместимы с устройством в отношении разрешения и типа медиаданных (H.264, AC3, и т.д.), но в несовместимом файловом контейнере (mkv, avi, wmv и т.д.). Видео будет повторно упаковано динамически перед его отправлением на устройство.", + "DirectStreamHelp2": "Прямая трансляции расходует очень мало вычислительной мощности с минимальной потерей качества видео.", "DirectStreaming": "Транслируется напрямую", "Director": "Режиссёр", "Directors": "Режиссёры", @@ -205,7 +175,6 @@ "EditImages": "Править изображения", "EditMetadata": "Править метаданные", "EditSubtitles": "Править субтитры", - "EnableBackdrops": "Фоны", "EnableBackdropsHelp": "Фоны будут отображаются на заднем плане на некоторых страницах при просмотре медиатеки.", "EnableCinemaMode": "Режим кинозала", "EnableColorCodedBackgrounds": "Обозначеннные цветом фоны", @@ -219,20 +188,18 @@ "EnablePhotosHelp": "Изображения будут обнаруживаться и отображаться наряду с другими медиафайлами.", "EnableStreamLooping": "Зацикливание трансляций", "EnableStreamLoopingHelp": "Включайте, если трансляции содержат данные только на несколько секунд и необходимо непрерывно их запрашивать. Включение этого без необходимости может породить проблемы.", - "EnableThemeSongs": "Тематические композиции", "EnableThemeSongsHelp": "Воспроизведение тематических композиций в фоновом режиме при навигации по медиатеке.", - "EnableThemeVideos": "Тематические видео", "EnableThemeVideosHelp": "Воспроизведение тематических видео в фоновом режиме при навигации по медиатеке.", "Ended": "Прекращённое", "EndsAtValue": "Конец в {0}", "Episodes": "Эпизоды", "ErrorAddingListingsToSchedulesDirect": "Произошла ошибка добавления списка сопоставления в учётную запись Schedules Direct. В Schedules Direct разрешено только ограниченное число таких списков на каждую учётную запись. Вам может понадобится войти на сайт Schedules Direct, и изъять иные перечни из своей учётной записи, прежде чем приступить.", - "ErrorAddingMediaPathToVirtualFolder": "Произошла ошибка при добавлении пути к медиаданным. Убедитесь, что путь является действительным, а процесс Jellyfin Server имеет доступ к этому расположению.", + "ErrorAddingMediaPathToVirtualFolder": "Произошла ошибка при добавлении пути к медиаданным. Убедитесь, что путь действителен и Jellyfin имеет доступ к этому расположению.", "ErrorAddingTunerDevice": "Произошла ошибка при добавлении тюнерного устройства. Убедитесь, что оно доступно и повторите попытку.", "ErrorAddingXmlTvFile": "Произошла ошибка при доступе к XMLTV-файлу. Убедитесь, что файл существует и повторите попытку.", - "ErrorDeletingItem": "Произошла ошибка при удалении элемента с Jellyfin Server. Проверьте, что у Jellyfin Server имеется доступ на запись в медиапапку и повторите попытку.", + "ErrorDeletingItem": "Произошла ошибка при удалении элемента с сервера. Проверьте, что у Jellyfinr имеется доступ на запись в медиапапку и повторите попытку.", "ErrorGettingTvLineups": "Произошла ошибка при загрузке списков сопоставления. Убедитесь, что ваши данные правильны и повторите попытку.", - "ErrorMessageStartHourGreaterThanEnd": "Конечное время должно быть позже, чем начальное время.", + "ErrorStartHourGreaterThanEnd": "Конечное время должно быть позже, чем начальное время.", "ErrorPleaseSelectLineup": "Выделите список сопоставления и повторите попытку. Если списков сопоставления не имеется, то проверьте, что ваше имя пользователя, пароль и почтовый код являются верными.", "ErrorSavingTvProvider": "Произошла ошибка при сохранении поставщика ТВ. Убедитесь, что он доступен и повторите попытку.", "EveryNDays": "Каждые {0} дней", @@ -254,7 +221,7 @@ "FolderTypeMovies": "Фильмы", "FolderTypeMusic": "Музыка", "FolderTypeMusicVideos": "Музыкальные видео", - "FolderTypeTvShows": "ТВ-передачи", + "FolderTypeTvShows": "Сериалы", "FolderTypeUnset": "Разнородное содержание", "Folders": "Папки", "FormatValue": "Формат: {0}", @@ -278,34 +245,27 @@ "HeaderActiveDevices": "Активные устройства", "HeaderActiveRecordings": "Активные записи", "HeaderActivity": "Действия", - "HeaderAddScheduledTaskTrigger": "Добавление триггера", "HeaderAddToCollection": "Добавить в коллекцию", "HeaderAddToPlaylist": "Добавление в плей-лист", "HeaderAddUpdateImage": "Добавление/Обновление изображения", - "HeaderAddUser": "Добавить пользователя", "HeaderAdditionalParts": "Дополнительные части", "HeaderAdmin": "Администрирование", "HeaderAlbumArtists": "Исполнители альбома", - "HeaderAlbums": "Альбомы", "HeaderAlert": "Предупреждение", "HeaderAllowMediaDeletionFrom": "Разрешить удаление медиаданных из", "HeaderApiKey": "API-ключ", "HeaderApiKeys": "API-ключи", - "HeaderApiKeysHelp": "Внешним приложениям требуется API-ключ для того, чтобы подключиться к Jellyfin Server. Ключи выдаются при входе с учётной записью Jellyfin или ключ предоставляется приложению вручную.", + "HeaderApiKeysHelp": "Внешним приложениям требуется API-ключ для того, чтобы подключиться к серверу. Ключи выдаются при входе с учётной записью обычного пользователя или ключ предоставляется приложению вручную.", "HeaderApp": "Приложение", "HeaderAppearsOn": "Фигурирует в", "HeaderAudioBooks": "Аудиокниги", "HeaderAudioSettings": "Параметры аудио", - "HeaderAutomaticUpdates": "Автоматические обновления", "HeaderBlockItemsWithNoRating": "Блокирование элементов с отсутствующей или нераспознанной информацией о возрастной категории:", - "HeaderBooks": "Книги", "HeaderBranding": "Оформление", "HeaderCancelRecording": "Отменить запись", "HeaderCancelSeries": "Отмена сериала", "HeaderCastAndCrew": "Снимались и снимали", - "HeaderCastCrew": "Снимались и снимали", "HeaderChannelAccess": "Доступ ко каналам", - "HeaderChannels": "Каналы", "HeaderChapterImages": "Изображения сцен", "HeaderCodecProfile": "Профиль кодеков", "HeaderCodecProfileHelp": "Профили кодеков обозначают ограничения устройства при воспроизведении с определёнными кодеками. Если применяется ограничение, то медиаданные перекодируются, даже если кодек настроен для прямого воспроизведения.", @@ -333,24 +293,18 @@ "HeaderDevices": "Устройства", "HeaderDirectPlayProfile": "Профиль прямого воспроизведения", "HeaderDirectPlayProfileHelp": "Добавьте профили прямого воспроизведения, чтобы указать, какие форматы могут обрабатываться устройством изначально.", - "HeaderDisplay": "Отображение", "HeaderDownloadSync": "Загрузка и синхро", "HeaderEasyPinCode": "Простой PIN-код", "HeaderEditImages": "Править изображения", "HeaderEnabledFields": "Включённые поля", "HeaderEnabledFieldsHelp": "Снимите флажок, чтобы зафиксировать поле и защитить его данные от изменнений.", - "HeaderEpisodes": "Эпизоды", "HeaderError": "Ошибка", "HeaderExternalIds": "Внешние идентификаторы:", "HeaderFeatureAccess": "Доступ к компонентам", - "HeaderFeatures": "Материалы", "HeaderFetchImages": "Отборка изображений:", "HeaderFetcherSettings": "Параметры отборщика", - "HeaderFilters": "Фильтры", "HeaderForKids": "Детям", - "HeaderForgotPassword": "Забыли пароль", "HeaderFrequentlyPlayed": "Воспроизведённые часто", - "HeaderGenres": "Жанры", "HeaderGuideProviders": "Поставщики данных телегида", "HeaderHttpHeaders": "HTTP-заголовки", "HeaderIdentification": "Распознание", @@ -361,10 +315,9 @@ "HeaderImageSettings": "Настройки изображения", "HeaderInstall": "Установка", "HeaderInstantMix": "Автомикс", - "HeaderItems": "Элементы", "HeaderKeepRecording": "Хранение записи", "HeaderKeepSeries": "Хранение сериала", - "HeaderKodiMetadataHelp": "Для включения или отключения NFO-метаданных, начните править медиатеку в области настройки медиатек и найдите раздел хранителей метаданных.", + "HeaderKodiMetadataHelp": "Для включения или отключения NFO-метаданных, правьте медиатеку и найдите раздел хранителей метаданных.", "HeaderLatestEpisodes": "Новейшие эпизоды", "HeaderLatestMedia": "Новейшие медиаданные", "HeaderLatestMovies": "Новейшие фильмы", @@ -375,16 +328,12 @@ "HeaderLibraryFolders": "Медиатечные папки", "HeaderLibraryOrder": "Порядок медиатек", "HeaderLibrarySettings": "Параметры медиатеки", - "HeaderLiveTV": "Эфир", - "HeaderLiveTv": "Эфир", "HeaderLiveTvTunerSetup": "Установка и настройка тюнера", "HeaderLoginFailure": "Сбой входа", "HeaderMedia": "Медиаданные", "HeaderMediaFolders": "Медиапапки", - "HeaderMediaInfo": "О медиаданных", "HeaderMetadataSettings": "Параметры метаданных", "HeaderMoreLikeThis": "Ещё подобное этому", - "HeaderMovies": "Фильмы", "HeaderMusicQuality": "Качество музыки", "HeaderMusicVideos": "Муз. видео", "HeaderMyDevice": "Моё устройство", @@ -393,7 +342,6 @@ "HeaderNewApiKey": "Новый API-ключ", "HeaderNewDevices": "Новые устройства", "HeaderNextEpisodePlayingInValue": "Следующий эпизод воспроизводится через {0}", - "HeaderNextUp": "Очередное", "HeaderNextVideoPlayingInValue": "Следующее видео воспроизводится через {0}", "HeaderOnNow": "В эфире", "HeaderOtherItems": "Прочие элементы", @@ -401,7 +349,6 @@ "HeaderPassword": "Пароль", "HeaderPasswordReset": "Сброс пароля", "HeaderPaths": "Пути", - "HeaderPeople": "Люди", "HeaderPhotoAlbums": "Фотоальбомы", "HeaderPinCodeReset": "Сброс PIN-кода", "HeaderPlayAll": "Воспроизвести все", @@ -413,7 +360,7 @@ "HeaderPreferredMetadataLanguage": "Выбор языка метаданных", "HeaderProfile": "Профиль", "HeaderProfileInformation": "О профиле", - "HeaderProfileServerSettingsHelp": "Данные значения управляют тем, как Jellyfin Server будет представляться устройству.", + "HeaderProfileServerSettingsHelp": "Данные значения управляют тем, как сервер будет представлять себя клиентам.", "HeaderRecentlyPlayed": "Воспроизведённые недавно", "HeaderRecordingOptions": "Опции записи", "HeaderRecordingPostProcessing": "Постобработка записи", @@ -426,26 +373,23 @@ "HeaderRevisionHistory": "История изменений", "HeaderRunningTasks": "Выполняющиеся задачи", "HeaderScenes": "Сцены", - "HeaderSchedule": "Расписание", "HeaderSeasons": "Сезоны", "HeaderSecondsValue": "{0} с", "HeaderSelectCertificatePath": "Выбор пути к сертификату", "HeaderSelectMetadataPath": "Выбор пути для метаданных", - "HeaderSelectMetadataPathHelp": "Найдите или введите путь, в пределах которого хотите хранить метаданные. Папка должна быть доступна для записи.", + "HeaderSelectMetadataPathHelp": "Найдите или введите путь, который хотите использовать для метаданныхе. Папка должна быть доступна для записи.", "HeaderSelectPath": "Выбор пути", "HeaderSelectServer": "Выбор сервера", "HeaderSelectServerCachePath": "Выбор пути для серверного кэша", "HeaderSelectServerCachePathHelp": "Найдите или введите путь, чтобы использовать для файлов серверного кэша. Папка должна быть доступна для записи.", "HeaderSelectTranscodingPath": "Выбор пути для временных файлов перекодировки", - "HeaderSelectTranscodingPathHelp": "Найдите или введите путь, чтобы использовать для временных файлов перекодировки. Папка должна быть доступна для записи.", + "HeaderSelectTranscodingPathHelp": "Найдите или введите путь, чтобы использовать для файлов перекодировки. Папка должна быть доступна для записи.", "HeaderSendMessage": "Передача сообщения", - "HeaderSeries": "Сериалы", "HeaderSeriesOptions": "Опции сериала", "HeaderSeriesStatus": "Статус сериала", "HeaderServerSettings": "Параметры сервера", "HeaderSettings": "Параметры", "HeaderSetupLibrary": "Установка и настройка медиатеки", - "HeaderShutdown": "Завершение работы", "HeaderSortBy": "Сортировка по", "HeaderSortOrder": "Порядок сортировки", "HeaderSpecialEpisodeInfo": "О спецэпизоде", @@ -459,7 +403,6 @@ "HeaderSubtitleProfiles": "Профили субтитров", "HeaderSubtitleProfilesHelp": "В профилях субтитров описываются форматы субтитров поддерживаемых устройством.", "HeaderSystemDlnaProfiles": "Системные профили", - "HeaderTags": "Теги", "HeaderTaskTriggers": "Триггеры задачи", "HeaderThisUserIsCurrentlyDisabled": "В настоящее время этот пользователь заблокирован", "HeaderTracks": "Дор-ки", @@ -481,7 +424,6 @@ "HeaderXmlDocumentAttributes": "Атрибуты XML-документа", "HeaderXmlSettings": "Параметры XML", "HeaderYears": "Годы", - "HeadersFolders": "Папки", "Help": "Справка...", "Hide": "Скрыть", "HideWatchedContentFromLatestMedia": "Скрыть просмотренное содержание из Новейших медиаданных", @@ -490,8 +432,8 @@ "HttpsRequiresCert": "Чтобы включить HTTPS для внешних подключений, вам нужно будет предоставить доверенный SSL-cертификат, например, Let's Encrypt. Предоставьте сертификат или отключите защищенные соединения.", "Identify": "Распознать", "Images": "Изображения", - "ImportFavoriteChannelsHelp": "При включении, будут импортированы только каналы, которые обозначены как избранное на тюнерном устройстве.", - "ImportMissingEpisodesHelp": "При включении, информация об отсутствующих эпизодах будет импортирована в вашу базу данных Jellyfin и отображаться в пределах сезонов и сериалов. Это может увеличить время сканирования медиатеки.", + "ImportFavoriteChannelsHelp": "Будут импортированы только каналы, которые обозначены как избранное на тюнерном устройстве.", + "ImportMissingEpisodesHelp": "Информация об отсутствующих эпизодах будет импортирована в вашу базу данных и отображена в пределах сезонов и сериалов. Это может заметно увеличить время сканирования медиатеки.", "InstallingPackage": "Устанавливается {0} (версия {1})", "InstantMix": "Автомикс", "ItemCount": "{0} элемент(а/ов)", @@ -515,24 +457,20 @@ "LabelAlbumArtMaxWidthHelp": "Максимальное разрешение альбомных обложек представляемых с помощью upnp:albumArtURI.", "LabelAlbumArtPN": "PN альбомной обложки:", "LabelAlbumArtists": "Исполнители альбома:", - "LabelAll": "Все", "LabelAllowHWTranscoding": "Разрешить аппаратную перекодировку", - "LabelAllowServerAutoRestart": "Разрешить автоматический перезапуск сервера для применения обновлений", - "LabelAllowServerAutoRestartHelp": "Сервер будет перезапускаться только в периоды простоя, когда нет активности пользователей.", "LabelAllowedRemoteAddresses": "Фильтр внешних IP-адресов:", "LabelAllowedRemoteAddressesMode": "Режим фильтра внешних IP-адресов:", "LabelAppName": "Название приложения", "LabelAppNameExample": "Пример: Sickbeard, Sonarr", "LabelArtists": "Исполнители:", - "LabelArtistsHelp": "Для разделения используйте точку с запятой ;", - "LabelAudio": "Аудио", + "LabelArtistsHelp": "Для разделения исполнителей используйте точку с запятой ;", "LabelAudioLanguagePreference": "Выбор языка аудио:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Автоматически обновлять метаданные из Интернета:", "LabelBindToLocalNetworkAddress": "Привязка к адресу в локальной сети:", - "LabelBindToLocalNetworkAddressHelp": "Необязательно. Переопределяется локальный IP-адрес для привязки HTTP-сервера. Если поле пусто, то привязка сервера будет ко всем доступным адресам. При изменении данного значения потребуется перезапуск Jellyfin Server.", + "LabelBindToLocalNetworkAddressHelp": "Переопределяется локальный IP-адрес для HTTP-сервера. Если поле пусто, то привязка сервера будет ко всем доступным адресам. При изменении данного значения потребуется перезапуск.", "LabelBirthDate": "Дата рождения:", "LabelBirthYear": "Год рождения:", - "LabelBlastMessageInterval": "Интервал сообщений проверки активности, с", + "LabelBlastMessageInterval": "Интервал сообщений проверки активности", "LabelBlastMessageIntervalHelp": "Определяет длительность в секундах между бомбардированием сообщениями проверки активности.", "LabelBlockContentWithTags": "Блокирование элементов с тегами:", "LabelBurnSubtitles": "Внедрение субтитров:", @@ -552,11 +490,9 @@ "LabelCustomCertificatePath": "Путь к пользовательскому SSL-сертификату:", "LabelCustomCertificatePathHelp": "Путь к файлу PKCS #12, содержащему сертификат и \tзакрытый ключ для включения поддержки TLS на произвольном домене.", "LabelCustomCss": "Настраиваемые CSS:", - "LabelCustomCssHelp": "Применяйте свою собственную настраиваемую стилизацию к веб-интерфейсу.", - "LabelCustomDeviceDisplayName": "Отображаемое название:", + "LabelCustomCssHelp": "Применяйте свои собственные настраиваемые стили в веб-интерфейсе.", "LabelCustomDeviceDisplayNameHelp": "Приведите произвольное имя для отображения или не заполняйте, чтобы использовать имя, выданное устройством.", "LabelCustomRating": "Произвольная возрастная категория:", - "LabelDashboardTheme": "Тема панели сервера:", "LabelDateAdded": "Дата добавления:", "LabelDateAddedBehavior": "Для нового содержания за дату добавления принимается:", "LabelDateAddedBehaviorHelp": "При наличии значения в метаданных, оно всегда используется приоритетно, чем любая из данных опций.", @@ -571,7 +507,6 @@ "LabelDiscNumber": "Номер диска:", "LabelDisplayLanguage": "Язык отображения:", "LabelDisplayLanguageHelp": "Перевод Jellyfin ведётся на постоянной основе.", - "LabelDisplayMissingEpisodesWithinSeasons": "Отображать отсутствующие эпизоды в пределах сезонов", "LabelDisplayMode": "Режим отображения:", "LabelDisplayName": "Отображаемое название:", "LabelDisplayOrder": "Порядок отображения:", @@ -589,11 +524,11 @@ "LabelEnableBlastAliveMessages": "Бомбардировать сообщениями проверки активности", "LabelEnableBlastAliveMessagesHelp": "Включите, если сервер надёжно не обнаруживается иными UPnP устройствами в своей сети.", "LabelEnableDlnaClientDiscoveryInterval": "Интервал обнаружения клиентов", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Определяется длительность в секундах между SSDP-запросами от Jellyfin.", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Определяется длительность в секундах между SSDP-запросами.", "LabelEnableDlnaDebugLogging": "Включить журналирование отладки DLNA", "LabelEnableDlnaDebugLoggingHelp": "Создаются большие файлы Журнала, рекомендуется использовать только для поиска неполадок.", "LabelEnableDlnaPlayTo": "Включить DLNA-функцию Воспроизвести На", - "LabelEnableDlnaPlayToHelp": "Обнаруживаются устройства внутри своей сети, а также предоставляется возможность удалённо управлять ими.", + "LabelEnableDlnaPlayToHelp": "Обнаруживаются устройства внутри своей сети, а также предоставляется возможность управлять ими удалённо.", "LabelEnableDlnaServer": "Включить DLNA-сервер", "LabelEnableDlnaServerHelp": "Для UPnP-устройств домашней сети возможна навигация по содержанию и его воспроизведение.", "LabelEnableHardwareDecodingFor": "Включить аппаратное декодирование для:", @@ -614,9 +549,9 @@ "LabelForgotPasswordUsernameHelp": "Введите имя пользователя, если помните его.", "LabelFormat": "Формат:", "LabelFriendlyName": "Понятное имя:", - "LabelServerNameHelp": "Это имя используется для распознавания сервера и будет по умолчанию именем компьютера.", + "LabelServerNameHelp": "Это имя используется для распознавания сервера и будет по умолчанию именем хоста сервера.", "LabelGroupMoviesIntoCollections": "Группировать фильмы внутрь коллекций", - "LabelGroupMoviesIntoCollectionsHelp": "При отображении списка фильмов, элементы, принадлежащие к одной коллекции будут отображаться как единый сгруппированный элемент.", + "LabelGroupMoviesIntoCollectionsHelp": "При отображении списков фильмов, фильмы из коллекции будут отображаться как единый группированный элемент.", "LabelH264Crf": "Значение CRF H264-кодирования:", "LabelEncoderPreset": "Предустановка H264-кодирования:", "LabelHardwareAccelerationType": "Аппаратное ускорение:", @@ -624,7 +559,7 @@ "LabelHomeNetworkQuality": "Качество в домашней сети:", "LabelHomeScreenSectionValue": "Главная страница - раздел {0}:", "LabelHttpsPort": "Номер локального HTTPS-порта:", - "LabelHttpsPortHelp": "TCP-порт, ко которому следует создать привязку HTTPS-сервера Jellyfin.", + "LabelHttpsPortHelp": "Номер TCP-порта для HTTPS-сервера.", "LabelIconMaxHeight": "Макс. высота значка:", "LabelIconMaxHeightHelp": "Максимальное разрешение значков представляемых с помощью upnp:icon.", "LabelIconMaxWidth": "Макс. ширина значка:", @@ -652,7 +587,7 @@ "LabelLanguage": "Язык:", "LabelLineup": "Список сопоставления:", "LabelLocalHttpServerPortNumber": "Номер локального HTTP-порта:", - "LabelLocalHttpServerPortNumberHelp": "TCP-порт, ко которому следует создать привязку HTTP-сервера Jellyfin.", + "LabelLocalHttpServerPortNumberHelp": "Номер TCP-порта для HTTP-сервера.", "LabelLockItemToPreventChanges": "Зафиксировать данный элемент, чтобы запретить будущие правки", "LabelLoginDisclaimer": "Предупреждение при входе:", "LabelLoginDisclaimerHelp": "Сообщение будет отображаться в нижней части страницы входа в систему.", @@ -678,7 +613,7 @@ "LabelMetadataReaders": "Считыватели метаданных:", "LabelMetadataReadersHelp": "Ранжируйте предпочитаемые локальные источники метаданных в порядке приоритета. Будет считан первый же найденный файл.", "LabelMetadataSavers": "Хранители метаданных:", - "LabelMetadataSaversHelp": "Выберите форматы файлов, куда будут сохраняться метаданные.", + "LabelMetadataSaversHelp": "Выберите форматы файлов, которые будут использоваться при сохранении метаданных.", "LabelMethod": "Метод:", "LabelMinBackdropDownloadWidth": "Минимальная ширина загружаемого фона:", "LabelMinResumeDuration": "Минимальная длительность для возобновления:", @@ -694,7 +629,7 @@ "LabelMovieCategories": "Фильмовые категории:", "LabelMoviePrefix": "Префикс фильма:", "LabelMoviePrefixHelp": "При применении к названиям фильмов префикса, введите его здесь, чтобы он правильно обрабатывался на сервере.", - "LabelMovieRecordingPath": "Путь к записываемым фильмам (необязательно):", + "LabelMovieRecordingPath": "Путь к записываемым фильмам:", "LabelMusicStreamingTranscodingBitrate": "Битрейт перекодировки музыки:", "LabelMusicStreamingTranscodingBitrateHelp": "Укажите максимальный битрейт при трансляции музыки.", "LabelName": "Имя:", @@ -702,13 +637,12 @@ "LabelNewPassword": "Новый пароль:", "LabelNewPasswordConfirm": "Подтверждение пароля:", "LabelNewsCategories": "Новостные категории:", - "LabelNext": "Следующее", "LabelNotificationEnabled": "Включить данное уведомление", "LabelNumber": "Номер:", "LabelNumberOfGuideDays": "Число дней для загрузки данных телегида:", "LabelNumberOfGuideDaysHelp": "Больше дней загрузки данных телегида обеспечивает возможность заблаговременно назначать расписание и просматривать больше перечней, однако это займёт больше времени для загрузки. При значении «Авто» выбор определяется числом каналов.", - "LabelOptionalNetworkPath": "(Необязательно) Общедоступная сетевая папка:", - "LabelOptionalNetworkPathHelp": "Если данная папка является общей в сети, указание пути к сетевой папке может позволить Jellyfin-приложениям на других устройствах иметь прямой доступ к медиафайлам. Например, {0} или {1}.", + "LabelOptionalNetworkPath": "Общедоступная сетевая папка:", + "LabelOptionalNetworkPathHelp": "Если данная папка является общей в сети, указание пути к сетевой папке может позволить клиентам на других устройствах иметь прямой доступ к медиафайлам. Например, {0} или {1}.", "LabelOriginalAspectRatio": "Исходное соотношение сторон:", "LabelOriginalTitle": "Оригинальное название:", "LabelOverview": "Обзор:", @@ -727,9 +661,7 @@ "LabelPostProcessorArguments": "Аргументы командной строки постобработчика:", "LabelPostProcessorArgumentsHelp": "Используйте {path} как путь к записываемому файлу.", "LabelPreferredDisplayLanguage": "Выбор языка отображения:", - "LabelPreferredDisplayLanguageHelp": "Перевод Jellyfin ведётся на постоянной основе.", "LabelPreferredSubtitleLanguage": "Выбор языка субтитров:", - "LabelPrevious": "Предыдущее", "LabelProfileAudioCodecs": "Аудиокодеки:", "LabelProfileCodecs": "Кодеки:", "LabelProfileCodecsHelp": "Разделяются запятой. Поле можно оставить незаполненным, чтобы применять для всех кодеков.", @@ -743,7 +675,6 @@ "LabelPublicHttpPortHelp": "Номер публичного порта, который сопоставляется с локальным HTTP-портом.", "LabelPublicHttpsPort": "Номер публичного HTTPS-порта:", "LabelPublicHttpsPortHelp": "Номер публичного порта, который сопоставляется с локальным HTTPS-портом.", - "LabelReadHowYouCanContribute": "Как вносить свой вклад.", "LabelReasonForTranscoding": "Причина перекодирования:", "LabelRecord": "Запись:", "LabelRecordingPath": "Стандартный путь для записей:", @@ -752,7 +683,7 @@ "LabelReleaseDate": "Дата выпуска:", "LabelRemoteClientBitrateLimit": "Ограничение битрейта интернет-трансляции, Мбит/с:", "LabelRemoteClientBitrateLimitHelp": "Необязательное ограничение битрейта для каждого из сетевых устройств. Может потребоваться, чтобы не допускать использования устройствами большего битрейта, чем способно пропустить интернет-соединение. Может привести к росту загрузки процессора на вашем сервере, так как потребуется динамическое перекодирование видео для снижения битрейта.", - "LabelRuntimeMinutes": "Длительность, мин:", + "LabelRuntimeMinutes": "Длительность:", "LabelSaveLocalMetadata": "Сохранять иллюстрации внутри медиапапок", "LabelSaveLocalMetadataHelp": "При сохранении иллюстраций внутри медиапапок, те помещаются в месте, где их можно легко править.", "LabelScheduledTaskLastRan": "Последний запуск был {0}, занял {1}.", @@ -764,11 +695,10 @@ "LabelSelectVersionToInstall": "Выбрать версию для установки:", "LabelSendNotificationToUsers": "Передача уведомления для:", "LabelSerialNumber": "Серийный номер", - "LabelSeriesRecordingPath": "Путь к записываемым сериалам (необязательно):", + "LabelSeriesRecordingPath": "Путь к записываемым сериалам:", "LabelServerHost": "Узел:", "LabelServerHostHelp": "192.168.1.100:8096 или https://myserver.com", "LabelSimultaneousConnectionLimit": "Лимит одновременных потоков:", - "LabelSkin": "Оболочка:", "LabelSkipBackLength": "Время отмотки:", "LabelSkipForwardLength": "Время промотки:", "LabelSkipIfAudioTrackPresent": "Пропустить, если аудиодорожка по умолчанию соответствует загружаемому языку", @@ -780,7 +710,6 @@ "LabelSortBy": "Сортировка по:", "LabelSortOrder": "Порядок сортировки:", "LabelSortTitle": "Сортировка по названию:", - "LabelSoundEffects": "Звуковые эффекты:", "LabelSource": "Источник:", "LabelSpecialSeasonsDisplayName": "Отображаемое название спецсезона:", "LabelSportsCategories": "Спортивные категории:", @@ -791,7 +720,6 @@ "LabelSubtitleDownloaders": "Загрузчики субтитров:", "LabelSubtitleFormatHelp": "Пример: srt", "LabelSubtitlePlaybackMode": "Режим субтитров:", - "LabelSubtitles": "Субтитры", "LabelSupportedMediaTypes": "Поддерживаемые типы медиаданных:", "LabelTVHomeScreen": "Главная страница ТВ-режима:", "LabelTag": "Тег:", @@ -804,12 +732,9 @@ "LabelTimeLimitHours": "Временной лимит (час):", "LabelTitle": "Название:", "LabelTrackNumber": "Номер дорожки:", - "LabelTranscodingAudioCodec": "Аудио профиль:", - "LabelTranscodingContainer": "Контейнер:", "LabelTranscodingTempPathHelp": "Укажите произвольный путь для файлов перекодировки, служащие для клиентов. Оставьте пустым, чтобы использовать умолчания сервера.", "LabelTranscodingThreadCount": "Количество перекодирующих подпотоков:", "LabelTranscodingThreadCountHelp": "Выберите максимальное число подпотоков для использования при перекодировке. Сокращение числа подпотоков понижает нагрузку на ЦП, но преобразование может оказаться недостаточно быстрым для впечатления плавного воспроизведения.", - "LabelTranscodingVideoCodec": "Видео кодек:", "LabelTriggerType": "Тип триггера:", "LabelTunerIpAddress": "IP-адрес тюнера:", "LabelTunerType": "Тип тюнера:", @@ -834,7 +759,6 @@ "LabelXDlnaDoc": "Схема X-DLNA:", "LabelXDlnaDocHelp": "Определяется содержание из элемента X_DLNADOC во пространстве имён urn:schemas-dlna-org:device-1-0.", "LabelYear": "Год:", - "LabelYourFirstName": "Ваше имя:", "LabelYoureDone": "Вы готовы!", "LabelZipCode": "Почтовый код:", "LabelffmpegPath": "Путь к FFmpeg:", @@ -845,7 +769,6 @@ "LearnHowYouCanContribute": "Изучите, как вы можете внести свой вклад.", "LibraryAccessHelp": "Выделите медиатеки, чтобы дать доступ этому пользователю. Администраторы могут изменять все папки с помощью «Диспетчера метаданных».", "Like": "Нравится", - "LinksValue": "Ссылки: {0}", "List": "Список", "Live": "Трансляция", "LiveBroadcasts": "Прямые трансляции", @@ -892,20 +815,19 @@ "MessageConfirmProfileDeletion": "Вы действительно хотите удалить данный профиль?", "MessageConfirmRecordingCancellation": "Отменить запись?", "MessageConfirmRemoveMediaLocation": "Вы действительно хотите изъять это расположение?", - "MessageConfirmRestart": "Вы действительно хотите перезапустить Jellyfin Server?", - "MessageConfirmRevokeApiKey": "Вы действительно хотите отозвать данный API-ключ? Подключение приложения к Jellyfin Server будет резко прекращено.", + "MessageConfirmRestart": "Вы действительно хотите перезапустить Jellyfin?", + "MessageConfirmRevokeApiKey": "Вы действительно хотите отозвать данный API-ключ? Подключение приложения к этому серверу будет резко прекращено.", "MessageConfirmShutdown": "Вы действительно хотите завершить работу сервера?", "MessageContactAdminToResetPassword": "Обратитесь к своему системному администратору, чтобы сбросить ваш пароль.", "MessageCreateAccountAt": "Создайте учётную запись на {0}", "MessageDeleteTaskTrigger": "Вы действительно хотите удалить данный триггер задачи?", - "MessageDirectoryPickerBSDInstruction": "Касаемо BSD, возможно, потребуется конфигурировать хранилище в вашем FreeNAS Jail для того, чтобы разрешить Jellyfin получить к нему доступ.", + "MessageDirectoryPickerBSDInstruction": "Касаемо BSD, возможно, потребуется конфигурировать хранилище в вашем FreeNAS Jail, чтобы Jellyfin мог получить доступ к медиаданным.", "MessageDirectoryPickerLinuxInstruction": "Для Linux на Arch Linux, CentOS, Debian, Fedora, openSUSE или Ubuntu, вы должны предоставить пользователю службы, по крайней мере, доступ для чтения к расположениям хранилища.", "MessageDownloadQueued": "Загрузка в очереди.", "MessageEnablingOptionLongerScans": "Включение этой опции может привести к значительному увеличению времени сканирования медиатеки.", "MessageFileReadError": "Произошла ошибка при считывании файла. Повторите попытку позже.", "MessageForgotPasswordFileCreated": "Следующий файл был создан на вашем сервере и содержит инструкции о том, как поступить:", "MessageForgotPasswordInNetworkRequired": "Повторите попытку в пределах своей домашней сети, чтобы начать процесс сброса пароля.", - "MessageInstallPluginFromApp": "Данный плагин должен устанавливаться изнутри приложения, для которого оно предназначено.", "MessageInvalidForgotPasswordPin": "Был введён неверный или истёкший PIN-код. Повторите попытку.", "MessageInvalidUser": "Недопустимое имя пользователя или пароль. Повторите попытку.", "MessageItemSaved": "Элемент сохранён.", @@ -921,16 +843,15 @@ "MessagePleaseEnsureInternetMetadata": "Убедитесь, что включена загрузка метаданных из Интернета.", "MessagePleaseWait": "Подождите. Это может занять минуту.", "MessagePluginConfigurationRequiresLocalAccess": "Чтобы конфигурировать данный плагин войдите непосредственно в свой локальный сервер.", - "MessagePluginInstallDisclaimer": "Плагины, созданные членами сообщества Jellyfin являются отличным способом повышения эффективности Jellyfin с помощью дополнительных функций и компонентов. Перед установкой примите во внимание влияние, которое они могут оказать на Jellyfin Server, например, длительные сканирования медиатеки, дополнительную фоновую обработку и снижение системной стабильности.", + "MessagePluginInstallDisclaimer": "Плагины, созданные членами сообщества являются отличным способом повышения эффективности с помощью дополнительных функций и компонентов. Перед установкой примите во внимание влияние, которое они могут оказать на сервер, например, длительные сканирования медиатеки, дополнительную фоновую обработку и снижение системной стабильности.", "MessageReenableUser": "См. ниже для разблокировки", - "MessageSettingsSaved": "Параметры сохранены.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Из вашей медиатеки будут изъяты следующие расположения медиаданных:", "MessageUnableToConnectToServer": "Мы не можем подсоединиться к выбранному серверу в данный момент. Убедитесь, что он запущен и повторите попытку.", "MessageUnsetContentHelp": "Содержание отображается как обычные папки. Для наилучших результатов используйте диспетчер метаданных, чтобы задать тип содержания подпапок.", "MessageYouHaveVersionInstalled": "В настоящее время установлена версия {0}.", "Metadata": "Метаданные", "MetadataManager": "Дисп. метаданных", - "MetadataSettingChangeHelp": "Изменение параметров метаданных повлияет на новое содержание, которое будет добавляться в дальнейшем. Чтобы обновить существующие содержание, откройте экран с подробностями и нажмите кнопку Обновить, или выполните массовое обновление, с помощью Диспетчера метаданных.", + "MetadataSettingChangeHelp": "Изменение параметров метаданных повлияет на новое содержание, добавляемое в будущем.. Чтобы обновить существующие содержание, откройте экран с подробностями и нажмите кнопку Обновить, или выполните массовое обновление, с помощью Диспетчера метаданных.", "MinutesAfter": "минут(у/ы) после", "MinutesBefore": "минут(у/ы) до", "Mobile": "Мобильный", @@ -955,10 +876,9 @@ "NextUp": "Очередное", "No": "Нет", "NoNewDevicesFound": "Новых устройств не обнаружено. Чтобы добавить новый тюнер, закройте данный диалог и введите сведения об устройстве вручную.", - "NoNextUpItemsMessage": "Ничего не найдено. Начните смотреть свои ТВ-передачи!", - "NoPluginConfigurationMessage": "В данном плагине нет параметров конфигурирования.", + "MessageNoNextUpItems": "Ничего не найдено. Начните смотреть свои ТВ-передачи!", + "MessageNoPluginConfiguration": "В данном плагине нет параметров конфигурирования.", "NoSubtitleSearchResultsFound": "Результатов не найдено.", - "NoSubtitles": "Ничего", "NoSubtitlesHelp": "По умолчанию, субтитры не будут загружаться. Они могут быть все ещё включены вручную во время воспроизведения.", "None": "Ничего", "Normal": "Обычный", @@ -979,7 +899,7 @@ "OptionAllowLinkSharingHelp": "Общедоступны только веб-страницы содержащие сведения о медиаданных. Медиафайлы никогда не предоставляются для общего просмотра. Совместно используемые ресурсы ограничены во времени, а срок действия истекает через {0} дн(я/ей).", "OptionAllowManageLiveTv": "Разрешить управление эфирными записями", "OptionAllowMediaPlayback": "Разрешить воспроизведение медиаданных", - "OptionAllowMediaPlaybackTranscodingHelp": "Ограничение доступа к перекодировке может привести к сбоям воспроизведения в Jellyfin-приложениях из-за неподдерживаемых форматов носителей.", + "OptionAllowMediaPlaybackTranscodingHelp": "Ограничение доступа к перекодировке может привести к сбоям воспроизведения в клиентах из-за неподдерживаемых форматов носителей.", "OptionAllowRemoteControlOthers": "Разрешить удалённое управление другими пользователями", "OptionAllowRemoteSharedDevices": "Разрешить удалённое управление используемыми совместно устройствами", "OptionAllowRemoteSharedDevicesHelp": "DLNA-устройства считаются используемыми совместно, пока какой-либо пользователь не начнёт управлять ими.", @@ -990,9 +910,8 @@ "OptionArtist": "Исполнитель", "OptionAscending": "По возрастанию", "OptionAuto": "Авто", - "OptionAutomatic": "Авто", "OptionAutomaticallyGroupSeries": "Автоматически сливать вместе сериалы, которые разбросаны по нескольким папкам", - "OptionAutomaticallyGroupSeriesHelp": "При включении, сериалы, которые разбросаны по нескольким папкам данной медиатеки, будут автоматически слиты в единый сериал.", + "OptionAutomaticallyGroupSeriesHelp": "Части сериала, которые разбросаны по нескольким папкам данной медиатеки, будут автоматически слиты в единый сериал.", "OptionBlockBooks": "Книги", "OptionBlockChannelContent": "Содержание интернет-канала", "OptionBlockLiveTvChannels": "Эфирные каналы", @@ -1012,7 +931,7 @@ "OptionDatePlayed": "Дата воспроизведения", "OptionDescending": "По убыванию", "OptionDisableUser": "Заблокировать пользователя", - "OptionDisableUserHelp": "При блокировании, этому пользователю не разрешаются любые подключения к серверу. Имеющиеся соединения будут разорваны.", + "OptionDisableUserHelp": "Этому пользователю не разрешаются любые подключения к серверу. Имеющиеся соединения будут разорваны.", "OptionDislikes": "Не нравящиеся", "OptionDisplayFolderView": "Отображать аспект Папки для просмотра обычных медиапапок", "OptionDisplayFolderViewHelp": "Отображение аспекта \"Папки\" рядом с другими вашими медиатеками. Это может быть полезно, если вы хотите вид обычных папок.", @@ -1022,7 +941,7 @@ "OptionDownloadBoxImage": "DVD-бокс", "OptionDownloadDiscImage": "Диск", "OptionDownloadImagesInAdvance": "Загружать изображения заблаговременно", - "OptionDownloadImagesInAdvanceHelp": "По умолчанию, большинство изображений загружаются только при запросе от Jellyfin-приложения. Включите данную опцию, чтобы загружать все изображения заблаговременно, при импорте новых медиаданных. Это может привести к существенно длительным сканированиям медиатеки.", + "OptionDownloadImagesInAdvanceHelp": "По умолчанию, большинство изображений загружаются только при запросе от клиента. Включите данную опцию, чтобы загружать все изображения заблаговременно, при импорте новых медиаданных. Это может привести к существенно длительным сканированиям медиатеки.", "OptionDownloadLogoImage": "Логотип", "OptionDownloadMenuImage": "Меню", "OptionDownloadPrimaryImage": "Основной", @@ -1044,7 +963,6 @@ "OptionExternallyDownloaded": "Внешние загружаемые", "OptionExtractChapterImage": "Включить извлечение изображений сцен", "OptionFavorite": "Избранное", - "OptionFriday": "пятница", "OptionHasSpecialFeatures": "Доп. материалы", "OptionHasSubtitles": "Субтитры", "OptionHasThemeSong": "Тематическая мелодия", @@ -1055,22 +973,20 @@ "OptionHlsSegmentedSubtitles": "Сегмент. субтитры HLS", "OptionHomeVideos": "Фотографии", "OptionIgnoreTranscodeByteRangeRequests": "Игнорировать запросы диапазона байтов перекодировки", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "При включении, эти запросы будут учтены, но заголовок диапазона байтов будет проигнорирован.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Эти запросы будут учтены, но заголовок диапазона байтов будет проигнорирован.", "OptionImdbRating": "Оценка IMDb", "OptionLikes": "Нравящиеся", "OptionMax": "Макс.", "OptionMissingEpisode": "Отсутствующие эпизоды", - "OptionMonday": "понедельник", "OptionNameSort": "Название", "OptionNew": "Новое…", "OptionNone": "Ничего", - "OptionOnAppStartup": "При запуске приложения", "OptionOnInterval": "В интервале", "OptionParentalRating": "Возрастная категория", "OptionPlainStorageFolders": "Отображать все папки, как обычные папки хранения", - "OptionPlainStorageFoldersHelp": "При включении, все папки описываются в DIDL как «object.container.storageFolder», вместо более конкретного типа, например, «object.container.person.musicArtist».", + "OptionPlainStorageFoldersHelp": "Все папки описываются в DIDL как «object.container.storageFolder», вместо более специфичного типа, например, «object.container.person.musicArtist».", "OptionPlainVideoItems": "Отображать все видео, как обычные видео элементы", - "OptionPlainVideoItemsHelp": "При включении, все видео описываются в DIDL как «object.item.videoItem», вместо более конкретного типа, например, «object.item.videoItem.movie».", + "OptionPlainVideoItemsHelp": "Все видео описываются в DIDL как «object.item.videoItem», вместо более специфичного типа, например, «object.item.videoItem.movie».", "OptionPlayCount": "Кол. воспроизведений", "OptionPlayed": "Воспроизведённые", "OptionPremiereDate": "Дата премьеры", @@ -1088,20 +1004,15 @@ "OptionRequirePerfectSubtitleMatchHelp": "Требование полного соответствия, при котором будут отфильтровываться только те субтитры, которые были проверены и подтверждены на соответствие с вашим видеофайлом. Если снять данный флажок, повысится вероятность загрузки субтитров, но увеличатся шансы несовпадения по времени или неверного текста субтитров.", "OptionResumable": "Возможно возобновление", "OptionRuntime": "Длительность", - "OptionSaturday": "суббота", "OptionSaveMetadataAsHidden": "Сохранять метаданные и изображения в виде скрытых файлов", - "OptionSaveMetadataAsHiddenHelp": "Это изменение будет применено к новым метаданным сохраняемым в будущем. Существующие файлы метаданных будут обновлены в следующий раз, когда они будут сохраняться на Jellyfin Server.", + "OptionSaveMetadataAsHiddenHelp": "Это изменение будет применено к новым метаданным сохраняемым в будущем. Существующие файлы метаданных будут обновлены в следующий раз, когда они будут сохраняться на сервере.", "OptionSpecialEpisode": "Спецэпизоды", "OptionSubstring": "Подстрока", - "OptionSunday": "воскресенье", - "OptionThursday": "четверг", "OptionTrackName": "Название трека", - "OptionTuesday": "вторник", "OptionTvdbRating": "Оценка TVDB", "OptionUnairedEpisode": "Ожидаемые эпизоды", "OptionUnplayed": "Невоспроизведённое", "OptionWakeFromSleep": "Выход из спящего режима", - "OptionWednesday": "среда", "OptionWeekdays": "В будни", "OptionWeekends": "Выходные", "OptionWeekly": "Еженедельно", @@ -1114,7 +1025,7 @@ "PasswordMatchError": "Пароль и подтверждение пароля должны совпадать.", "PasswordResetComplete": "Пароль был сброшен.", "PasswordResetConfirmation": "Вы действительно хотите сбросить пароль?", - "PasswordResetHeader": "Сброс пароля", + "HeaderResetPassword": "Сброс пароля", "PasswordSaved": "Пароль был сохранён.", "People": "Люди", "PerfectMatch": "Полное соответствие", @@ -1134,9 +1045,9 @@ "PleaseAddAtLeastOneFolder": "Добавьте, по крайней мере, одну папку к данной медиатеке, нажав кнопку Добавить.", "PleaseConfirmPluginInstallation": "Нажмите кнопку ОК, чтобы подтвердить, что вы прочитали вышеизложенное и хотите приступить к установке плагина.", "PleaseEnterNameOrId": "Введите название или внешний ID.", - "PleaseRestartServerName": "Перезапустите Jellyfin Server - {0}.", + "PleaseRestartServerName": "Перезапустите Jellyfin на {0}.", "PleaseSelectTwoItems": "Выберите хотя бы два элемента.", - "PluginInstalledMessage": "Плагин установлен успешно. Чтобы изменения вступили в силу, будет необходимо перезапустить Jellyfin Server.", + "MessagePluginInstalled": "Плагин установлен успешно. Чтобы изменения вступили в силу, будет необходимо перезапустить сервер.", "PreferEmbeddedTitlesOverFileNames": "Предпочитать внедрённые названия, чем имена файлов", "PreferEmbeddedTitlesOverFileNamesHelp": "Этим определяется отображаемое название по умолчанию, когда нет метаданных с интернета или локальные метаданные недоступны.", "Premiere": "Премьера", @@ -1147,7 +1058,6 @@ "ProductionLocations": "Производ-ные площадки", "Programs": "Передачи", "Quality": "Качество", - "QueueAllFromHere": "В очередь все отсюда", "Raised": "Выпуклая", "Rate": "Оценка", "RecentlyWatched": "Недавно просмотренное", @@ -1158,11 +1068,11 @@ "Record": "Записать", "RecordSeries": "Записать сериал", "RecordingCancelled": "Запись отменена.", - "RecordingPathChangeMessage": "Изменение папки для записи не приведёт к переносу существующих записей со старого места на новое. Вам нужно переместить их вручную, если это необходимо.", + "MessageChangeRecordingPath": "Изменение папки для записи не приведёт к переносу существующих записей со старого места на новое. Вам нужно переместить их вручную, если это необходимо.", "RecordingScheduled": "Запись назначена.", "Recordings": "Записи", "Refresh": "Обновить", - "RefreshDialogHelp": "Обновление метаданных определяются параметрами и интернет-услугами, которые включены в Панели Jellyfin Server.", + "RefreshDialogHelp": "Обновление метаданных определяются параметрами и интернет-услугами, которые включены в Панели.", "RefreshMetadata": "Обновить метаданные", "RefreshQueued": "Обновление в очереди.", "ReleaseDate": "Дата выпуска", @@ -1178,7 +1088,6 @@ "ReplaceExistingImages": "Замена имеющихся изображений", "ResumeAt": "Возобновить с {0}", "Rewind": "Отмотать", - "RunAtStartup": "Запускать при старте системы", "Runtime": "Длительность", "Saturday": "суббота", "Save": "Сохранить", @@ -1201,10 +1110,10 @@ "SeriesRecordingScheduled": "Запись сериала назначена.", "SeriesSettings": "Параметры сериала", "SeriesYearToPresent": "{0} - Н/В", - "ServerNameIsRestarting": "Jellyfin Server - {0} перезапускается.", - "ServerNameIsShuttingDown": "Jellyfin Server - {0} завершает работу.", - "ServerRestartNeededAfterPluginInstall": "После установки плагина будет необходимо перезапустить Jellyfin Server.", - "ServerUpdateNeeded": "Данный Jellyfin Server нуждается в обновлении. Чтобы загрузить свежую версию, посетите {0}", + "ServerNameIsRestarting": "Сервер перезапускается в {0}.", + "ServerNameIsShuttingDown": "Сервер завершает работу в {0}.", + "ServerRestartNeededAfterPluginInstall": "После установки плагина будет необходимо перезапустить Jellyfin.", + "ServerUpdateNeeded": "Данный сервер нуждается в обновлении. Чтобы загрузить свежую версию, посетите {0}", "Settings": "Параметры", "SettingsSaved": "Параметры сохранены.", "SettingsWarning": "Изменение данных значений может привести к нестабильности или сбоям возможности подключения. Если вы испытываете любые проблемы, мы рекомендуем изменить их обратно к стандартным.", @@ -1244,58 +1153,29 @@ "TV": "ТВ", "TabAccess": "Доступ", "TabAdvanced": "Расширенное", - "TabAlbumArtists": "Исполнители альбома", - "TabAlbums": "Альбомы", - "TabArtists": "Исполнители", "TabCatalog": "Каталог", - "TabChannels": "Каналы", "TabCodecs": "Кодеки", - "TabCollections": "Коллекции", "TabContainers": "Контейнеры", "TabDashboard": "Панель", - "TabDevices": "Устройства", "TabDirectPlay": "Прямое воспроизведение", - "TabDisplay": "Отображение", - "TabEpisodes": "Эпизоды", - "TabFavorites": "Избранное", - "TabGenres": "Жанры", - "TabGuide": "Телегид", - "TabInfo": "Инфо", "TabLatest": "Новейшее", - "TabLiveTV": "Эфир", "TabLogs": "Журналы", - "TabMetadata": "Метаданные", - "TabMovies": "Фильмы", "TabMusic": "Музыка", - "TabMusicVideos": "Муз. видео", "TabMyPlugins": "Мои плагины", "TabNetworks": "Телесети", "TabNfoSettings": "Параметры NFO", "TabNotifications": "Уведомления", "TabOther": "Другое", "TabParentalControl": "Управление содержанием", - "TabPassword": "Пароль", - "TabPlayback": "Воспроизведение", - "TabPlaylist": "Плей-лист", - "TabPlaylists": "Плей-листы", "TabPlugins": "Плагины", "TabProfile": "Профиль", "TabProfiles": "Профили", - "TabRecordings": "Записи", "TabResponses": "Отклики", - "TabResumeSettings": "Возобновление", "TabScheduledTasks": "Планировщик", - "TabSeries": "Сериалы", "TabServer": "Сервер", "TabSettings": "Параметры", - "TabShows": "Сериалы", - "TabSongs": "Треки", "TabStreaming": "Трансляция", - "TabSuggestions": "Рекомендации", - "TabTrailers": "Трейлеры", - "TabTranscoding": "Перекодировка", "TabUpcoming": "Ожидаемое", - "TabUsers": "Пользователи", "Tags": "Теги", "TagsValue": "Теги: {0}", "TellUsAboutYourself": "Расскажите о себе", @@ -1315,7 +1195,7 @@ "TvLibraryHelp": "Просмотрите {0}руководство по именованию передач{1}.", "Uniform": "Однородная", "UninstallPluginConfirmation": "Вы действительно хотите удалить {0}?", - "UninstallPluginHeader": "Удаление плагина", + "HeaderUninstallPlugin": "Удаление плагина", "Unmute": "Вкл. звук", "Unplayed": "Невоспроизведённое", "Unrated": "Без категории", @@ -1347,7 +1227,6 @@ "ValueTimeLimitSingleHour": "Временной лимит: 1 час", "ValueVideoCodec": "Видео кодек: {0}", "Vertical": "Вертикально", - "VideoRange": "Диапазон видео", "ViewAlbum": "Посмотреть альбом", "ViewPlaybackInfo": "Сведения о воспроизводимом", "Watched": "Просмотрено", @@ -1372,13 +1251,12 @@ "OptionResElement": "res-элемент", "AuthProviderHelp": "Выберите поставщика аутентификации, который будет использоваться для аутентификации пароля этого пользователя.", "HeaderFavoriteMovies": "Избранные фильмы", - "HeaderFavoriteShows": "Избранные передачи", + "HeaderFavoriteShows": "Избранные сериалы", "HeaderFavoriteEpisodes": "Избранные эпизоды", "HeaderFavoriteAlbums": "Избранные альбомы", "HeaderFavoriteArtists": "Избранные исполнители", "HeaderFavoriteSongs": "Избранные композиции", "HeaderFavoriteVideos": "Избранные видео", - "HeaderHome": "Главное", "LabelAuthProvider": "Поставщик аутентификации:", "LabelPasswordResetProvider": "Поставщик сброса пароля:", "LabelServerName": "Имя сервера:", @@ -1390,9 +1268,6 @@ "DashboardOperatingSystem": "Операционная система: {0}", "DashboardArchitecture": "Архитектура: {0}", "LabelWeb": "Веб:", - "LaunchWebAppOnStartup": "Запустить веб-интерфейс при запуске Jellyfin Server", - "LaunchWebAppOnStartupHelp": "Открывается веб-клиент в браузере по умолчанию при начальном запуске сервера. Это не произойдет при использовании функции перезапуска сервера.", - "MediaInfoSoftware": "ПО", "MediaInfoStreamTypeAudio": "Аудио", "MediaInfoStreamTypeData": "Данные", "MediaInfoStreamTypeEmbeddedImage": "Встроенное изображение", @@ -1415,11 +1290,11 @@ "OptionPosterCard": "Постер-карта", "OptionThumb": "Эскиз", "OptionThumbCard": "Эскиз-карта", - "PasswordResetProviderHelp": "Выберите поставщика сброса пароля, который будет использоваться, когда этот пользователь запрашивает сброс пароля", + "PasswordResetProviderHelp": "Выберите поставщика сброса пароля, который использовуется при запросе пользователем сброса пароля.", "PlaybackData": "Данные воспроизведения", "SubtitleOffset": "Сдвиг субтитров", "TabNetworking": "Работа в сети", - "LabelBaseUrlHelp": "Добавляется пользовательский подкаталог к URL сервера. Например: http://example.com/<baseurl>", + "LabelBaseUrlHelp": "Добавляет пользовательский подкаталог к URL сервера. Например: http://example.com/<baseurl>", "LabelPlayer": "Проигрыватель:", "MoreMediaInfo": "О медиаданных", "LabelVideoCodec": "Видео кодек:", @@ -1453,7 +1328,6 @@ "LabelPlayerDimensions": "Размеры проигрывателя:", "LabelDroppedFrames": "Пропущенные кадры:", "LabelCorruptedFrames": "Испорченные кадры:", - "CopyStreamURLError": "Произошла ошибка при копировании URL.", "OptionForceRemoteSourceTranscoding": "Принудительное перекодирование удалённых источников медиаданных (например, эфирное ТВ)", "NoCreatedLibraries": "Похоже, вы еще не создали ни одной медиатеки. {0}Желаете создать её сейчас?{1}", "AskAdminToCreateLibrary": "Попросите администратора создать медиатеку.", @@ -1474,7 +1348,6 @@ "Track": "Дорожка", "Season": "Сезон", "Person": "Персона", - "OtherArtist": "Другой исполнитель", "Movie": "Фильм", "LabelLibraryPageSize": "Размер страницы медиатеки:", "Episode": "Эпизод", @@ -1484,24 +1357,20 @@ "AlbumArtist": "Исполнитель альбома", "Album": "Альбом", "LastSeen": "Последний раз был {0}", - "WriteAccessRequired": "Jellyfin Server требуются права на запись в эту папку. Обеспечьте доступ для записи и попробуйте снова.", + "WriteAccessRequired": "Jellyfin требуются права на запись в эту папку. Обеспечьте доступ для записи и попробуйте снова.", "PathNotFound": "Путь не может быть найден. Убедитесь, что путь правильный и попробуйте снова.", - "ReleaseGroup": "Релиз-группа", "PreferEmbeddedEpisodeInfosOverFileNames": "Предпочитать встроенную информацию эпизода вместо имён файлов", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Используется информация об эпизоде из встроенных метаданных, если они доступны.", "LabelLibraryPageSizeHelp": "Устанавливается количество элементов для отображения на странице медиатеки. Установите 0 для отключения нумерации страниц.", "LabelDeinterlaceMethod": "Метод устранения гребёнки:", "DeinterlaceMethodHelp": "Выберите метод устранения гребёнки, который будет использоваться при перекодировании чересстрочного содержания.", "UnsupportedPlayback": "Jellyfin не может расшифровать содержимое, защищенное DRM, но в любом случае будет предпринята попытка расшифровки всего содержимого, включая защищенные заголовки. Некоторые файлы могут выглядеть полностью черными из-за шифрования или других неподдерживаемых функций, таких как интерактивные заголовки.", - "MessageUnauthorizedUser": "В настоящее время у вас нет доступа к серверу. Пожалуйста, свяжитесь с администратором сервера для получения дополнительной информации.", "HeaderFavoritePlaylists": "Избранные плей-листы", "LabelRequireHttpsHelp": "Если этот флажок установлен, сервер будет автоматически перенаправлять все запросы через HTTP на HTTPS. Это не имеет никакого эффекта, если сервер не слушает HTTPS.", - "LabelEnableHttpsHelp": "Позволяет серверу слушать HTTPS-порт. Для работы необходим действующий сертификат.", + "LabelEnableHttpsHelp": "Прослушивается указанный HTTPS-порт. Чтобы это вступило в силу, также необходимо предоставить действительный сертификат.", "ApiKeysCaption": "Список действующих текущих API-ключей", - "TabDVR": "DVR", "SaveChanges": "Сохранить изменения", "LabelRequireHttps": "Требуется HTTPS", - "LabelNightly": "Ночная", "LabelStable": "Стабильная", "LabelChromecastVersion": "Версия Chromecast", "LabelEnableHttps": "Включить HTTPS", @@ -1543,10 +1412,10 @@ "MessageSyncPlayErrorNoActivePlayer": "Активный проигрыватель не найден. SyncPlay был отключен.", "ShowMore": "Показать больше", "ShowLess": "Показать меньше", - "EnableBlurhashHelp": "Рисунки, которые всё ещё загружаются, будут отображаться с размытым заполнением", - "EnableBlurhash": "Включить размытые заполнители для изображений", + "EnableBlurHashHelp": "Рисунки, которые всё ещё загружаются, будут отображаться с уникальным заполнением.", + "EnableBlurHash": "Включить размытые заполнители для изображений", "ButtonSyncPlay": "SyncPlay", - "ButtonCast": "В ролях", + "ButtonCast": "Транслировать", "TabRepositories": "Репозитории", "MessageNoGenresAvailable": "Разрешить поставщикам метаданных получать жанры из интернета.", "MessageAddRepository": "Если вы хотите добавить репозиторий, нажмите кнопку рядом с заголовком и заполните необходимую информацию.", @@ -1564,5 +1433,14 @@ "Writers": "Сценаристы", "ViewAlbumArtist": "Посмотреть альбом исполнителя", "ClearQueue": "Очистить очередь", - "ButtonPlayer": "Проигрыватель" + "ButtonPlayer": "Проигрыватель", + "PreviousTrack": "Перейти к предыдущему", + "NextTrack": "Перейти к следующему", + "LabelUnstable": "Нестабильная", + "LabelSubtitleVerticalPosition": "Вертикальная позиция:", + "SubtitleVerticalPositionHelp": "Номер строки, где появляется текст. Положительные числа означают сверху вниз. Отрицательные числа означают снизу вверх.", + "Preview": "Предварительный просмотр", + "MessageGetInstalledPluginsError": "Произошла ошибка при получении списка установленных плагинов.", + "MessagePluginInstallError": "Во время установки плагина произошла ошибка.", + "PlaybackRate": "Рейтинг" } diff --git a/src/strings/sk.json b/src/strings/sk.json index dc754fdff2..6a604e3e29 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -10,7 +10,7 @@ "AllLanguages": "Všetky jazyky", "AllLibraries": "Všetky knižnice", "AllowMediaConversion": "Povoliť konverziu médií", - "AllowRemoteAccess": "Povoliť vzdialené pripojenia k tomuto Jellyfin serveru.", + "AllowRemoteAccess": "Povoliť vzdialené pripojenia k tomuto serveru.", "AllowRemoteAccessHelp": "Nezaškrtnuté znamená, že všetky vzdialené pripojenia budú blokované.", "AlwaysPlaySubtitles": "Vždy prehrať", "AnyLanguage": "Akýkoľvek jazyk", @@ -19,80 +19,54 @@ "AsManyAsPossible": "Najviac ako je možné", "Ascending": "Vzostupne", "AspectRatio": "Pomer strán", - "AttributeNew": "Nové", - "AutoBasedOnLanguageSetting": "Automaticky (na základe nastavenia jazyka)", "Backdrops": "Pozadia", "BirthDateValue": "Narodený/á: {0}", "BirthLocation": "Miesto narodenia", "BirthPlaceValue": "Miesto narodenia: {0}", "BookLibraryHelp": "Audioknihy a učebnice sú podporované. Prečítajte si {0} pravidlá pre názvy kníh v Jellyfine {1}.", "Books": "Knihy", - "ButtonAdd": "Pridať", "ButtonAddMediaLibrary": "Pridať knižnicu médií", "ButtonAddScheduledTaskTrigger": "Pridať spúšťač", "ButtonAddServer": "Pridať server", "ButtonAddUser": "Pridať používateľa", - "ButtonArrowDown": "Dole", "ButtonArrowLeft": "Vľavo", "ButtonArrowRight": "Vpravo", - "ButtonArrowUp": "Hore", "ButtonAudioTracks": "Audio stopy", "ButtonBack": "Späť", "ButtonCancel": "Zrušiť", "ButtonChangeServer": "Zmeniť server", - "ButtonConnect": "Pripojiť", - "ButtonDelete": "Zmazať", - "ButtonDeleteImage": "Zmazať obrázok", - "ButtonDown": "Dole", - "ButtonDownload": "Stiahnuť", - "ButtonEdit": "Upraviť", - "ButtonEditImages": "Upraviť obrázky", "ButtonEditOtherUserPreferences": "Upraviť používateľský profil, obrázok a osobné preferencie.", "ButtonForgotPassword": "Zabudnuté heslo", "ButtonFullscreen": "Celá obrazovka", "ButtonGotIt": "Rozumiem", - "ButtonHelp": "Pomoc", - "ButtonHome": "Domov", - "ButtonLearnMore": "Zistiť viac", "ButtonManualLogin": "Manuálne prihlásenie", "ButtonMore": "Viac", "ButtonNetwork": "Sieť", - "ButtonNew": "Nové", "ButtonNextTrack": "Nasledujúca stopa", "ButtonOpen": "Otvoriť", "ButtonParentalControl": "Rodičovská kontrola", "ButtonPause": "Pozastaviť", - "ButtonPlay": "Prehrať", "ButtonPreviousTrack": "Predchádzajúca stopa", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Príručka rýchleho štartu", - "ButtonRefresh": "Obnoviť", "ButtonRefreshGuideData": "Obnoviť údaje sprievodcu", "ButtonRemove": "Odstrániť", "ButtonRename": "Premenovať", - "ButtonRepeat": "Opakovať", "ButtonResetEasyPassword": "Obnoviť jednoduchý PIN kód", "ButtonResetPassword": "Obnoviť heslo", "ButtonRestart": "Reštartovať", "ButtonResume": "Pokračovať", - "ButtonSave": "Uložiť", "ButtonScanAllLibraries": "Prehľadať všetky knižnice", - "ButtonSearch": "Hľadať", "ButtonSelectDirectory": "Vybrať priečinok", "ButtonSelectServer": "Vybrať server", "ButtonSend": "Odoslať", "ButtonSettings": "Nastavenia", - "ButtonShuffle": "Zamiešať", "ButtonShutdown": "Vypnúť", "ButtonSignIn": "Prihlásiť sa", "ButtonSignOut": "Odhlásiť sa", - "ButtonSort": "Zoradiť", "ButtonSubmit": "Potvrdiť", - "ButtonSubtitles": "Titulky", "ButtonTrailer": "Trailer", "ButtonUninstall": "Odinštalovať", - "ButtonUp": "Hore", - "ButtonViewWebsite": "Zobraziť webovú stránku", "ButtonWebsite": "Webové stránky", "Categories": "Kategórie", "ChannelAccessHelp": "Zvoľte kanály zdieľané s týmto používateľom. Administrátori budú schopní upraviť všetky kanály použitím správcu metadát.", @@ -110,7 +84,7 @@ "DateAdded": "Dátum pridania", "DatePlayed": "Dátum prehrania", "DeathDateValue": "Zomrel/a: {0}", - "DefaultErrorMessage": "Pri spracovaní požiadavky došlo k chybe. Prosím, skúste to neskôr znova.", + "ErrorDefault": "Pri spracovaní požiadavky došlo k chybe. Prosím, skúste to neskôr znova.", "Delete": "Zmazať", "DeleteDeviceConfirmation": "Ste si istý, že chcete odstrániť toto zariadenie? Objaví sa znovu, keď sa ním používateľ nabudúce prihlási.", "DeleteImage": "Zmazať obrázok", @@ -143,7 +117,7 @@ "EnablePhotos": "Zobraziť fotky", "EndsAtValue": "Končí o {0}", "Episodes": "Epizódy", - "ErrorMessageStartHourGreaterThanEnd": "Čas ukončenia musí byť väčší ako čas štartu.", + "ErrorStartHourGreaterThanEnd": "Čas ukončenia musí byť väčší ako čas štartu.", "EveryNDays": "Každých {0} dní", "ExitFullscreen": "Opustiť celú obrazovku", "ExtraLarge": "Veľmi veľké", @@ -177,16 +151,11 @@ "HeaderActivity": "Aktivita", "HeaderAddToCollection": "Pridať do kolekcie", "HeaderAddUpdateImage": "Pridať/aktualizovať obrázok", - "HeaderAddUser": "Pridať používateľa", - "HeaderAlbums": "Albumy", "HeaderApiKey": "Kľúč API", "HeaderApiKeys": "Kľúče API", "HeaderAudioBooks": "Audio knihy", "HeaderAudioSettings": "Nastavenia zvuku", - "HeaderAutomaticUpdates": "Automatické aktualizácie", - "HeaderBooks": "Knihy", "HeaderCastAndCrew": "Obsadenie a štáb", - "HeaderChannels": "Kanály", "HeaderChapterImages": "Obrázky kapitol", "HeaderConfigureRemoteAccess": "Nastaviť vzdialený prístup", "HeaderConfirmPluginInstallation": "Potvrdiť inštaláciu zásuvných modulov", @@ -205,14 +174,10 @@ "HeaderDevices": "Zariadenia", "HeaderEasyPinCode": "Jednoduchý PIN kód", "HeaderEditImages": "Upraviť obrázky", - "HeaderEpisodes": "Epizódy", "HeaderError": "Chyba", "HeaderFetchImages": "Načítať obrázky:", - "HeaderFilters": "Filtre", "HeaderForKids": "Pre deti", - "HeaderForgotPassword": "Zabudnuté heslo", "HeaderFrequentlyPlayed": "Často hrané", - "HeaderGenres": "Žánre", "HeaderHttpHeaders": "HTTP hlavičky", "HeaderIdentification": "Identifikácia", "HeaderIdentificationCriteriaHelp": "Zadajte aspoň jedno identifikačné kritérium.", @@ -220,7 +185,6 @@ "HeaderImageSettings": "Nastavenia obrázkov", "HeaderInstall": "Inštalovať", "HeaderInstantMix": "Okamžitý mix", - "HeaderItems": "Položky", "HeaderLatestEpisodes": "Najnovšie epizódy", "HeaderLatestMedia": "Najnovšie médiá", "HeaderLatestMovies": "Najnovšie filmy", @@ -231,13 +195,9 @@ "HeaderLibraryFolders": "Priečinky knižnice", "HeaderLibraryOrder": "Poradie knižnice", "HeaderLibrarySettings": "Nastavenia knižnice", - "HeaderLiveTV": "Živá TV", - "HeaderLiveTv": "Živá TV", "HeaderMedia": "Médiá", - "HeaderMediaInfo": "Informácie o médiu", "HeaderMetadataSettings": "Nastavenia metadát", "HeaderMoreLikeThis": "Podobné položky", - "HeaderMovies": "Filmy", "HeaderMusicQuality": "Kvalita hudby", "HeaderMusicVideos": "Hudobné videá", "HeaderMyDevice": "Moje zariadenie", @@ -246,13 +206,11 @@ "HeaderNewApiKey": "Nový kľúč API", "HeaderNewDevices": "Nové zariadenia", "HeaderNextEpisodePlayingInValue": "Ďalšia epizóda sa spustí o {0}", - "HeaderNextUp": "Nasleduje", "HeaderNextVideoPlayingInValue": "Ďalšie video sa spustí o {0}", "HeaderOtherItems": "Iné položky", "HeaderPassword": "Heslo", "HeaderPasswordReset": "Obnoviť heslo", "HeaderPaths": "Cesty", - "HeaderPeople": "Ľudia", "HeaderPhotoAlbums": "Albumy fotografií", "HeaderPinCodeReset": "Obnoviť PIN kód", "HeaderPlayAll": "Prehrať všetko", @@ -267,17 +225,14 @@ "HeaderRevisionHistory": "História revízií", "HeaderRunningTasks": "Bežiace úlohy", "HeaderScenes": "Scény", - "HeaderSchedule": "Rozvrh", "HeaderSeasons": "Série", "HeaderSecondsValue": "{0} sekúnd", "HeaderSelectPath": "Vybrať priečinok", "HeaderSelectServer": "Vybrať server", "HeaderSendMessage": "Poslať správu", - "HeaderSeries": "Seriál", "HeaderServerSettings": "Nastavenia servera", "HeaderSettings": "Nastavenia", "HeaderSetupLibrary": "Nastavte Vaše knižnice médií", - "HeaderShutdown": "Vypnúť", "HeaderSortBy": "Zoradiť podľa", "HeaderStartNow": "Začať teraz", "HeaderStopRecording": "Zastaviť nahrávanie", @@ -297,14 +252,13 @@ "HeaderVideos": "Videá", "HeaderXmlSettings": "Nastavenia XML", "HeaderYears": "Roky", - "HeadersFolders": "Priečinky", "Help": "Pomoc", "Hide": "Skryť", "Home": "Domov", "Horizontal": "Horizontálne", "Identify": "Identifikovať", "Images": "Obrázky", - "ImportMissingEpisodesHelp": "Ak je možnosť povolená, informácie o chýbajúcich epizódach budú importované do Vašej Jellyfin databázy a budú zobrazené v sériách a seriáloch. Toto môže spôsobiť podstatne dlhšie skenovania knižníc.", + "ImportMissingEpisodesHelp": "Informácie o chýbajúcich epizódach budú importované do Vašej databázy a budú zobrazené v sériách a seriáloch. Toto môže spôsobiť podstatne dlhšie skenovania knižníc.", "InstallingPackage": "Inštalujem {0} (verzia{1})", "ItemCount": "{0} položiek", "Items": "Položky", @@ -312,15 +266,12 @@ "Label3DFormat": "3D formát:", "LabelAccessDay": "Deň v týždni:", "LabelAirTime": "Čas vysielania:", - "LabelAll": "Všetky", "LabelAllowHWTranscoding": "Povoliť hardvérové transkódovanie", - "LabelAllowServerAutoRestart": "Povoliť automatický reštart servera pre aplikovanie aktualizácií", - "LabelAllowServerAutoRestartHelp": "Server sa reštartuje iba počas obdobia bez aktivity, keď nie je žiadny používateľ aktívny.", "LabelAllowedRemoteAddresses": "Filter vzdialených IP adries:", "LabelAppName": "Názov aplikácie", "LabelAppNameExample": "Príklad: Sickbeard, Sonarr", "LabelArtists": "Umelci:", - "LabelArtistsHelp": "Oddeľte pomocou ;", + "LabelArtistsHelp": "Viacej umelcov oddeľte pomocou bodkočiarky.", "LabelAudioLanguagePreference": "Uprednostňovaný jazyk zvuku:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Automaticky obnoviť metadáta z internetu:", "LabelBirthDate": "Dátum narodenia:", @@ -350,7 +301,6 @@ "LabelDeviceDescription": "Popis zariadenia", "LabelDiscNumber": "Číslo disku:", "LabelDisplayLanguage": "Jazyk rozhrania:", - "LabelDisplayMissingEpisodesWithinSeasons": "Zobraziť chýbajúce epizódy v sériách", "LabelDisplayOrder": "Poradie zobrazenia:", "LabelDownloadLanguages": "Prebrať jazyky:", "LabelDropImageHere": "Presuňte obrázok sem.", @@ -373,9 +323,9 @@ "LabelFont": "Písmo:", "LabelForgotPasswordUsernameHelp": "Zadajte svoje používateľské meno, ak si ho pamätáte.", "LabelFormat": "Formát:", - "LabelServerNameHelp": "Tento názov bude použitý na identifikáciu servera. Ak ostane prázdny, bude použitý názov počítača.", + "LabelServerNameHelp": "Tento názov bude použitý na identifikáciu servera. Ak ostane prázdny, bude použitý názov hostiteľa serveru.", "LabelGroupMoviesIntoCollections": "Zoskupiť filmy do kolekcií", - "LabelGroupMoviesIntoCollectionsHelp": "Pri zobrazení zoznamu filmov budú filmy patriace do kolekcie zobrazené ako jedna zoskupená položka.", + "LabelGroupMoviesIntoCollectionsHelp": "Pri zobrazení zoznamu filmov budú filmy v kolekcií zobrazené ako jedna položka.", "LabelHardwareAccelerationType": "Hardvérová akcelerácia:", "LabelHardwareAccelerationTypeHelp": "Hardvérová akcelerácia vyžaduje dodatočnú konfiguráciu.", "LabelHomeScreenSectionValue": "Sekcia domácej obrazovky {0}:", @@ -407,7 +357,7 @@ "LabelMetadata": "Metadáta:", "LabelMetadataDownloadLanguage": "Preferovaný jazyk:", "LabelMetadataPath": "Umiestnenie metadát:", - "LabelMetadataSaversHelp": "Vyberte formát súboru, do ktorého chcete ukladať vaše metadáta.", + "LabelMetadataSaversHelp": "Vyberte formát súboru, ktorý chcete použiť pre ukladanie metadát.", "LabelMinResumeDurationHelp": "Najkratšia dĺžka videa v sekundách, ktorá uloží rozpozeranú polohu a dovolí sa k nej vrátiť.", "LabelMinResumePercentageHelp": "Tituly budú považované za neprehrané ak budú zastavené pred týmto časom.", "LabelModelDescription": "Popis modelu", @@ -415,16 +365,15 @@ "LabelModelNumber": "Číslo modelu", "LabelModelUrl": "Model URL", "LabelMovieCategories": "Kategórie filmov:", - "LabelMovieRecordingPath": "Umiestnenie filmových nahrávok (voliteľné):", + "LabelMovieRecordingPath": "Umiestnenie pre nahrávanie filmov:", "LabelName": "Meno:", "LabelNewName": "Nové meno:", "LabelNewPassword": "Nové heslo:", "LabelNewPasswordConfirm": "Potvrdenie nového hesla:", "LabelNewsCategories": "Kategórie správ:", - "LabelNext": "Ďalej", "LabelNotificationEnabled": "Povoliť toto hlásenie", "LabelNumber": "Číslo:", - "LabelOptionalNetworkPath": "(Voliteľné) Zdieľaný sieťový priečinok:", + "LabelOptionalNetworkPath": "Zdieľaný sieťový priečinok:", "LabelOriginalAspectRatio": "Pôvodný pomer strán:", "LabelOriginalTitle": "Pôvodný názov:", "LabelOverview": "Prehľad:", @@ -438,7 +387,6 @@ "LabelPlayDefaultAudioTrack": "Prehrať predvolenú zvukovú stopu bez ohľadu na jazyk", "LabelPreferredDisplayLanguage": "Preferovaný jazyk:", "LabelPreferredSubtitleLanguage": "Preferovaný jazyk titulkov:", - "LabelPrevious": "Predchádzajúce", "LabelProfileAudioCodecs": "Audio kodeky:", "LabelProfileCodecs": "Kodeky:", "LabelProfileContainer": "Kontajner:", @@ -447,30 +395,27 @@ "LabelProtocolInfo": "Info o protokole:", "LabelPublicHttpPort": "Verejný HTTP port:", "LabelPublicHttpsPort": "Verejný HTTPS port:", - "LabelReadHowYouCanContribute": "Zistite, ako môžete prispieť.", "LabelRecordingPath": "Predvolené umiestnenie nahrávok:", "LabelRecordingPathHelp": "Uveďte predvolené umiestnenie pre ukladanie nahrávok. Ak je ponechané prázdne, použije sa priečinok s programovými dátami servera.", "LabelReleaseDate": "Dátum vydania:", - "LabelRuntimeMinutes": "Dĺžka (minúty):", + "LabelRuntimeMinutes": "Dĺžka:", "LabelSaveLocalMetadata": "Uložiť obaly a metadáta do priečinka s médiami", "LabelScreensaver": "Šetrič obrazokvy:", "LabelSeasonNumber": "Číslo série:", "LabelSelectUsers": "Zvoľte užívateľov:", "LabelSelectVersionToInstall": "Vyberte verziu, ktorú chcete nainštalovať:", "LabelSerialNumber": "Sériové číslo", - "LabelSeriesRecordingPath": "Umiestnenie seriálových nahrávok (voliteľné):", + "LabelSeriesRecordingPath": "Umiestnenie pre nahrávanie seriálov:", "LabelServerHostHelp": "192.168.1.100:8096 alebo https://mojserver.sk", "LabelSkipBackLength": "Dĺžka skoku dozadu:", "LabelSkipForwardLength": "Dĺžka skoku dopredu:", "LabelSkipIfGraphicalSubsPresent": "Preskočiť ak video obsahuje vložené titulky", "LabelSortBy": "Zoradiť podľa:", - "LabelSoundEffects": "Zvukové efekty:", "LabelSource": "Zdroj:", "LabelSportsCategories": "Športové kategórie:", "LabelStartWhenPossible": "Spustiť akonáhle je možné:", "LabelStatus": "Stav:", "LabelSubtitleFormatHelp": "Príklad: srt", - "LabelSubtitles": "Titulky", "LabelSupportedMediaTypes": "Podporované typy médií:", "LabelTextBackgroundColor": "Farba pozadia textu:", "LabelTextColor": "Farba textu:", @@ -480,9 +425,6 @@ "LabelTimeLimitHours": "Časový limit (v hodinách):", "LabelTitle": "Názov:", "LabelTrackNumber": "Číslo stopy:", - "LabelTranscodingAudioCodec": "Audio kodek:", - "LabelTranscodingContainer": "Obal:", - "LabelTranscodingVideoCodec": "Video kodek:", "LabelTunerIpAddress": "IP adresa tunera:", "LabelTunerType": "Typ tunera:", "LabelType": "Typ:", @@ -493,7 +435,6 @@ "LabelVersion": "Verzia:", "LabelVersionInstalled": "{0} nainštalovaný", "LabelYear": "Rok:", - "LabelYourFirstName": "Meno:", "LabelYoureDone": "Hotovo!", "LabelZipCode": "PSČ:", "LabelffmpegPath": "Cesta k FFmpeg:", @@ -534,7 +475,7 @@ "MessageConfirmProfileDeletion": "Ste si istý, že chcete zmazať tento profil?", "MessageConfirmRecordingCancellation": "Zrušiť nahrávanie?", "MessageConfirmRemoveMediaLocation": "Ste si istý, že chcete odobrať toto umiestnenie?", - "MessageConfirmRestart": "Ste si istý, že chcete reštartovať Jellyfin Server?", + "MessageConfirmRestart": "Ste si istý, že chcete reštartovať Jellyfin?", "MessageConfirmShutdown": "Ste si istý, že chcete vypnúť server?", "MessageEnablingOptionLongerScans": "Povolenie tejto možnosti môže mať za následok podstatne dlhšie skenovania knižníc.", "MessageFileReadError": "Pri čítaní súboru nastala chyba.", @@ -547,7 +488,6 @@ "MessageNothingHere": "Nič tu nie je.", "MessagePleaseEnsureInternetMetadata": "Prosím, uistite sa, že sťahovanie internetových metadát je povolené.", "MessagePleaseWait": "Prosím počkajte. Toto môže chvíľu trvať.", - "MessageSettingsSaved": "Nastavenia uložené.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Nasledujúce umiestnenia médií budú odobraté z vašej knižnice:", "MessageYouHaveVersionInstalled": "Teraz máte nainštalovanú verziu {0}.", "Metadata": "Metadáta", @@ -573,10 +513,9 @@ "Next": "Ďalšie", "NextUp": "Nasleduje", "No": "Nie", - "NoNextUpItemsMessage": "Nič nenájdené. Začnite pozerať vaše seriály!", - "NoPluginConfigurationMessage": "Tento zásuvný modul nemá žiadne nastavenia.", + "MessageNoNextUpItems": "Nič nenájdené. Začnite pozerať vaše seriály!", + "MessageNoPluginConfiguration": "Tento zásuvný modul nemá žiadne nastavenia.", "NoSubtitleSearchResultsFound": "Žiadne výsledky.", - "NoSubtitles": "Žiadne", "None": "Žiadne", "Normal": "Normálne", "NumLocationsValue": "{0} priečinkov", @@ -600,7 +539,6 @@ "OptionArtist": "Umelec", "OptionAscending": "Vzostupne", "OptionAuto": "Automaticky", - "OptionAutomatic": "Automaticky", "OptionAutomaticallyGroupSeries": "Automaticky zlúčiť série, ktoré sú uložené v rôznych priečinkoch", "OptionBlockBooks": "Knihy", "OptionBlockMovies": "Filmy", @@ -617,7 +555,7 @@ "OptionDatePlayed": "Dátum prehrania", "OptionDescending": "Zostupne", "OptionDisableUser": "Zakázať tohto používateľa", - "OptionDisableUserHelp": "Ak možnosť nie je povolená, server nepovolí žiadne pripojenia od tohto používateľa. Aktívne pripojenia budú ihneď ukončené.", + "OptionDisableUserHelp": "Server nepovolí žiadne pripojenia od tohto používateľa. Aktívne pripojenia budú ihneď ukončené.", "OptionDislikes": "Nepáči sa", "OptionDownloadArtImage": "Obal", "OptionDownloadBackImage": "Späť", @@ -634,7 +572,6 @@ "OptionEquals": "Sa rovná", "OptionEveryday": "Každý deň", "OptionFavorite": "Obľúbené", - "OptionFriday": "Piatok", "OptionHasSubtitles": "Titulky", "OptionHasThemeSong": "Tématická hudba", "OptionHasThemeVideo": "Tématické video", @@ -644,11 +581,9 @@ "OptionImdbRating": "Hodnotenie IMDb", "OptionLikes": "Páči sa", "OptionMissingEpisode": "Chýbajúce epizódy", - "OptionMonday": "Pondelok", "OptionNameSort": "Názov", "OptionNew": "Nové…", "OptionNone": "Žiadne", - "OptionOnAppStartup": "Pri spustení aplikácie", "OptionParentalRating": "Rodičovské hodnotenie", "OptionPlainVideoItems": "Zobraziť všetky videá ako obyčajné video položky", "OptionPlayCount": "Počet prehraní", @@ -659,17 +594,12 @@ "OptionReleaseDate": "Dátum vydania", "OptionResumable": "Pozastaviteľný", "OptionRuntime": "Dĺžka", - "OptionSaturday": "Sobota", "OptionSaveMetadataAsHidden": "Uložiť metadáta a obrázky ako skryté súbory", - "OptionSunday": "Nedeľa", - "OptionThursday": "Štvrtok", "OptionTrackName": "Názov skladby", - "OptionTuesday": "Utorok", "OptionTvdbRating": "TVDB hodnotenie", "OptionUnairedEpisode": "Nevysielané epizódy", "OptionUnplayed": "Neprehrané", "OptionWakeFromSleep": "Zobudiť zo spánku", - "OptionWednesday": "Streda", "OptionWeekdays": "Pracovné dni", "OptionWeekends": "Víkendy", "OptionWeekly": "Týždenne", @@ -682,7 +612,7 @@ "PasswordMatchError": "Heslo a potvrdenie hesla sa musia zhodovať.", "PasswordResetComplete": "Heslo bolo obnovené.", "PasswordResetConfirmation": "Naozaj chcete obnoviť heslo?", - "PasswordResetHeader": "Obnoviť heslo", + "HeaderResetPassword": "Obnoviť heslo", "PasswordSaved": "Heslo uložené.", "People": "Ľudia", "PerfectMatch": "Perfektná zhoda", @@ -699,9 +629,9 @@ "Played": "Prehrané", "PleaseAddAtLeastOneFolder": "Pridajte prosím aspoň jeden priečinok do tejto knižnice kliknutím na tlačidlo Pridať.", "PleaseEnterNameOrId": "Prosím, zadajte meno alebo externé ID.", - "PleaseRestartServerName": "Prosím reštartujte Jellyfin Server - {0}.", + "PleaseRestartServerName": "Prosím reštartujte Jellyfin na {0}.", "PleaseSelectTwoItems": "Vyberte prosím aspoň dve položky.", - "PluginInstalledMessage": "Rozšírenie bolo úspešne nainštalované. Je potrebný reštart Jellyfin Server aby sa prejavili zmeny.", + "MessagePluginInstalled": "Rozšírenie bolo úspešne nainštalované. Je potrebný reštart servera aby sa prejavili zmeny.", "Premiere": "Premiéra", "Premieres": "Premiéry", "Previous": "Predchádzajúce", @@ -727,7 +657,6 @@ "ReplaceAllMetadata": "Nahradiť všetky metadáta", "ReplaceExistingImages": "Nahradiť existujúce obrázky", "ResumeAt": "Pokračovať od {0}", - "RunAtStartup": "Spustiť pri štarte", "Saturday": "Sobota", "Save": "Uložiť", "SaveSubtitlesIntoMediaFolders": "Ukladať titulky do priečinkov s médiami", @@ -744,10 +673,10 @@ "SendMessage": "Poslať správu", "Series": "Seriály", "SeriesSettings": "Nastavenia série", - "ServerNameIsRestarting": "Jellyfin Server - {0} sa reštartuje.", - "ServerNameIsShuttingDown": "Jellyfin Server - {0} sa vypína.", - "ServerRestartNeededAfterPluginInstall": "Po inštalácii zásuvného modulu bude potrebný reštart Jellyfin servera.", - "ServerUpdateNeeded": "Tento Jellyfin server treba aktualizovať. Najnovšiu verziu nájdete na {0}", + "ServerNameIsRestarting": "Server {0} sa reštartuje.", + "ServerNameIsShuttingDown": "Server {0} sa vypína.", + "ServerRestartNeededAfterPluginInstall": "Jellyfin bude nutné po inštalácií zásuvného modulu reštartovať.", + "ServerUpdateNeeded": "Tento server je nutné aktualizovať. Pokiaľ chcete stiahnuť najnovšiu verziu, navštívte prosím {0}", "Settings": "Nastavenia", "SettingsSaved": "Nastavenia uložené.", "Share": "Zdieľať", @@ -769,48 +698,25 @@ "Sunday": "Nedeľa", "TabAccess": "Prístup", "TabAdvanced": "Pokročilé", - "TabAlbums": "Albumy", - "TabArtists": "Umelci", "TabCatalog": "Katalóg", - "TabChannels": "Kanály", "TabCodecs": "Kodeky", - "TabCollections": "Kolekcie", "TabContainers": "Kontajnery", "TabDashboard": "Dashboard", - "TabDevices": "Zariadenia", - "TabEpisodes": "Epizódy", - "TabFavorites": "Obľúbené", - "TabGenres": "Žánre", - "TabGuide": "Sprievodca", "TabLatest": "Najnovšie", - "TabLiveTV": "Živá TV", - "TabMetadata": "Metadáta", - "TabMovies": "Filmy", "TabMusic": "Hudba", - "TabMusicVideos": "Hudobné videá", "TabMyPlugins": "Moje zásuvné moduly", "TabNetworks": "Siete", "TabNfoSettings": "NFO nastavenia", "TabNotifications": "Upozornenia", "TabOther": "Iné", "TabParentalControl": "Rodičovská kontrola", - "TabPassword": "Heslo", "TabPlugins": "Zásuvné moduly", "TabProfile": "Profil", "TabProfiles": "Profily", - "TabRecordings": "Nahrávky", "TabResponses": "Odpovede", - "TabResumeSettings": "Pokračovať", "TabScheduledTasks": "Naplánované úlohy", - "TabSeries": "Seriály", "TabSettings": "Nastavenia", - "TabShows": "Seriály", - "TabSongs": "Skladby", - "TabSuggestions": "Návrhy", - "TabTrailers": "Trailery", - "TabTranscoding": "Transkódovanie", "TabUpcoming": "Nadchádzajúce", - "TabUsers": "Užívatelia", "TellUsAboutYourself": "Povedzte nám niečo o sebe", "ThisWizardWillGuideYou": "Tento sprievodca Vám pomôže prejsť inštalačným procesom. Pre začatie zvoľte preferovaný jazyk.", "Thursday": "Štvrtok", @@ -819,7 +725,7 @@ "Trailers": "Trailery", "Tuesday": "Utorok", "UninstallPluginConfirmation": "Ste si istý, že chcete odinštalovať {0}?", - "UninstallPluginHeader": "Odinštalovať rozšírenie", + "HeaderUninstallPlugin": "Odinštalovať rozšírenie", "Unmute": "Zapnúť zvuk", "Unplayed": "Neprehrané", "Unrated": "Nehodnotené", @@ -867,9 +773,7 @@ "Aired": "Odvysielané", "Alerts": "Upozornenia", "AllowOnTheFlySubtitleExtraction": "Povoliť extrahovanie titulkov za behu", - "ButtonFilter": "Filter", "ButtonInfo": "Info", - "ButtonOff": "Vypnúť", "ButtonOk": "Ok", "ButtonStart": "Štart", "ButtonStop": "Zastaviť", @@ -878,7 +782,6 @@ "DirectPlaying": "Priame prehrávanie", "Disabled": "Vypnuté", "Display": "Zobrazenie", - "EnableBackdrops": "Pozadia", "EnableDisplayMirroring": "Zrkadlenie obrazu", "Ended": "Ukončený", "FileReadCancelled": "Čítanie súboru bolo zrušené.", @@ -909,10 +812,8 @@ "DashboardArchitecture": "Architektúra: {0}", "LabelWeb": "Web:", "LeaveBlankToNotSetAPassword": "Toto pole môžete nechať prázdne pre nastavenie bez hesla.", - "LinksValue": "Odkazy: {0}", "List": "Zoznam", "Logo": "Logo", - "MediaInfoSoftware": "Softvér", "MediaInfoStreamTypeAudio": "Audio", "MediaInfoStreamTypeData": "Dáta", "MediaInfoStreamTypeSubtitle": "Titulky", @@ -927,23 +828,19 @@ "ConfirmDeleteItems": "Zmazaním týchto položiek odstránite súbory zo súborového systému aj z knižnice médií. Ste si istý/á, že chcete pokračovať?", "Continuing": "Pokračujúci", "Default": "Predvolené", - "DirectStreamHelp2": "Priame streamovanie súboru používa veľmi málo procesorového výkonu bez straty kvality videa.", + "DirectStreamHelp2": "Priame streamovanie vyžaduje veľmi málo výkonu takmer bez straty kvality videa.", "DirectStreaming": "Priame streamovanie", "DisplayMissingEpisodesWithinSeasonsHelp": "Toto musí byť povolené pre TV knižnice v nastavení servera.", "DisplayModeHelp": "Vyberte štýl layoutu, ktorý chcete pre rozhranie.", "EnableCinemaMode": "Kino režim", "EnableNextVideoInfoOverlay": "Zobraziť informácie o nasledujúcom videu počas prehrávania", "EnableNextVideoInfoOverlayHelp": "Na konci videa sa zobrazia informácie o nasledujúcom videu v aktuálnom playliste.", - "ErrorAddingMediaPathToVirtualFolder": "Pri pridávaní cesty k mediám nastala chyba. Uistite sa prosím, že cesta je platná, a že proces Jellyfin servera má prístup k umiestneniu.", - "HeaderAddScheduledTaskTrigger": "Pridať spúšťač", + "ErrorAddingMediaPathToVirtualFolder": "Pri pridávaní cesty k mediám nastala chyba. Uistite sa prosím, že cesta je platná, a že Jellyfin má prístup k umiestneniu.", "HeaderAddToPlaylist": "Pridať do playlistu", "HeaderAlert": "Upozornenie", - "HeaderCastCrew": "Obsadenie a štáb", "HeaderDownloadSync": "Sťahovanie a synchronizácia", "HeaderExternalIds": "Externé ID:", "HeaderFeatureAccess": "Prístup k funkciám", - "HeaderFeatures": "Funkcie", - "HeaderHome": "Domov", "HeaderLoginFailure": "Prihlásenie zlyhalo", "HeaderMediaFolders": "Priečinky médií", "HeaderRemoveMediaFolder": "Odstrániť priečinok médií", @@ -952,11 +849,9 @@ "HeaderSpecialEpisodeInfo": "Informácie o špeciálnej epizóde", "HeaderSpecialFeatures": "Bonusové materiály", "HeaderSubtitleDownloads": "Sťahovanie titulkov", - "HeaderTags": "Tagy", "HeaderVideoType": "Typ videa", "HeaderVideoTypes": "Typy videí", "LabelAirsBeforeSeason": "Vysielané pred sériou:", - "LabelAudio": "Zvuk", "LabelBlockContentWithTags": "Blokovať položky s tagmi:", "LabelDisplayMode": "Režim zobrazenia:", "LabelDisplaySpecialsWithinSeasons": "Zobraziť špeciálne epizódy v sérií, v ktorej boli odvysielané", @@ -996,9 +891,6 @@ "SortName": "Zoradiť podľa názvu", "TabDirectPlay": "Priame prehrávanie", "TabLogs": "Záznamy", - "TabPlayback": "Prehrávanie", - "TabPlaylist": "Playlist", - "TabPlaylists": "Playlisty", "TabServer": "Server", "TabStreaming": "Streamovanie", "Tags": "Tagy", @@ -1010,7 +902,7 @@ "Absolute": "Absolútne", "LabelDidlMode": "DIDL režim:", "LabelDateTimeLocale": "Lokálne nastavenia dátumu:", - "LabelBlastMessageInterval": "Doba zobrazenie správy (sekundy)", + "LabelBlastMessageInterval": "Doba zobrazenia správy", "LabelAlbumArtMaxWidth": "Maximálna šírka obrázku albumu:", "LabelAlbumArtMaxHeight": "Maximálna výška obrázku albumu:", "LabelAirDays": "Vysielané:", @@ -1019,7 +911,6 @@ "Uniform": "Jednotné", "ThemeVideos": "Tematické videá", "ThemeSongs": "Tématická hudba", - "TabInfo": "Info", "TV": "TV", "SkipEpisodesAlreadyInMyLibraryHelp": "Epizódy budú porovnané na základe čísla série a epizódy, ak sú k dispozícii.", "SimultaneousConnectionLimitHelp": "Maximálny povolený počet súčasných streamov. Zadajte 0 pre vypnutie obmedzenia.", @@ -1043,8 +934,6 @@ "HeaderEnabledFields": "Povolené polia", "HeaderAllowMediaDeletionFrom": "Povoliť zmazanie médií z", "HeaderAdmin": "Admin", - "EnableThemeVideos": "Videá úvodných zvučiek", - "EnableThemeSongs": "Úvodné zvučky", "EnablePhotosHelp": "Obrázky budú detekované a zobrazené spolu s ostatnými multimediálnymi súbormi.", "EnableColorCodedBackgrounds": "Farebne označené pozadia", "DropShadow": "Vrhať tieň", @@ -1064,9 +953,7 @@ "LabelDisplayLanguageHelp": "Preklad Jellyfinu je v neustálom vývoji.", "LabelDefaultUserHelp": "Určuje, ktorá používateľská knižnica by mala byť zobrazená na pripojenom zariadení. Toto nastavenie môže byť prepísané pomocou profilov pre každé zariadenie.", "LabelDateAddedBehaviorHelp": "Pokiaľ majú metadáta hodnotu, bude vždy použitá pred niektorou z týchto možností.", - "LabelDashboardTheme": "Téma dashboardu servera:", "LabelCustomDeviceDisplayNameHelp": "Nahradte vlastným názvom alebo ponechajte prázdne, aby názov určilo zariadenie.", - "LabelCustomDeviceDisplayName": "Zobrazený názov:", "LabelCache": "Cache:", "LabelBurnSubtitles": "Vypáliť titulky:", "LabelBitrate": "Dátový tok:", @@ -1080,7 +967,7 @@ "LabelAllowedRemoteAddressesMode": "Režim filtrácie vzdialenej IP adresy:", "LabelAlbumArtists": "Album umelca:", "InstantMix": "Okamžitý mix", - "ImportFavoriteChannelsHelp": "Pokiaľ je možnosť povolená, tak len kanály označené ako obľúbené budú importované na zariadenie tuneru.", + "ImportFavoriteChannelsHelp": "Len kanály označené ako obľúbené budú importované na zariadenie tuneru.", "HttpsRequiresCert": "Pre povolenie zabezpečeného pripojenia budete musieť dodať dôveryhodný SSL certifikát, ako napríklad Let's Encrypt. Prosím, buď dodajte certifikát alebo zakážte zabezpečené pripojenie.", "HeaderXmlDocumentAttributes": "Atribúty XML dokumentu", "HeaderXmlDocumentAttribute": "Atribúty XML dokumentu", @@ -1089,7 +976,7 @@ "HeaderTranscodingProfileHelp": "Pridať transkódovacie profily pre určenie, ktoré formáty by mali byť použité, keď je transkódovanie vyžadované.", "HeaderSubtitleProfilesHelp": "Profily titulkov popisujú formáty titulkov, ktoré dané zariadenie podporuje.", "HeaderSeriesStatus": "Stav seriálu", - "HeaderSelectTranscodingPathHelp": "Prechádzať alebo zadať cestu, kde by ste chceli uložiť dočasné transkódované súbory. Priečinok musí mať oprávnenie na zapisovanie.", + "HeaderSelectTranscodingPathHelp": "Prechádzať alebo zadať cestu pre súbory transkódovania. Priečinok musí mať oprávnenie na zapisovanie.", "HeaderSelectTranscodingPath": "Vyberte cestu pre dočasné transkódované súbory", "HeaderSelectServerCachePathHelp": "Prechádzať alebo zadať cestu, kde by ste chceli uložiť cache súbory. Priečinok musí mať oprávnenie na zapisovanie.", "HeaderSelectServerCachePath": "Vyberte cestu pre Server Cache", @@ -1099,13 +986,13 @@ "HeaderResponseProfile": "Profil odozvy", "HeaderRemoveMediaLocation": "Odobrať cestu medií", "HeaderRecordingPostProcessing": "Spracovanie nahratých nahrávok", - "HeaderProfileServerSettingsHelp": "Tieto hodnoty určujú, ako sa bude Jellyfin Server prezentovať v zariadeniach.", + "HeaderProfileServerSettingsHelp": "Tieto hodnoty určujú, ako sa bude server prezentovať klientom.", "HeaderPluginInstallation": "Inštalácia zásuvných modulov", "HeaderPlayback": "Prehrávanie medií", "HeaderPlayOn": "Prehrať na", "HeaderOnNow": "Práve teraz", "HeaderLiveTvTunerSetup": "Nastavenie TV tuneru pre živé vysielanie", - "HeaderKodiMetadataHelp": "Pokiaľ chcete povoliť alebo zakázať NFO metadáta, upravte knižnicu v nastavení Jellyfin knižníc v sekcii ukladania metadát.", + "HeaderKodiMetadataHelp": "Pokiaľ chcete povoliť alebo zakázať NFO metadáta, upravte knižnicu v sekcii ukladania metadát.", "HeaderKeepSeries": "Zachovať seriál", "HeaderKeepRecording": "Zachovať nahrávanie", "HeaderImageOptions": "Možnosti obrázkov", @@ -1115,7 +1002,6 @@ "HeaderFavoritePeople": "Obľúbené osoby", "HeaderFavoriteBooks": "Obľúbené knihy", "HeaderEnabledFieldsHelp": "Zrušte zaškrtnutie, aby ste zabránili zmenám dát.", - "HeaderDisplay": "Zobrazenie", "HeaderDirectPlayProfile": "Profil Priameho prehrávania", "HeaderDeveloperInfo": "Informácie pre vývojára", "HeaderDeleteTaskTrigger": "Vymazať spúšťač úlohy", @@ -1131,10 +1017,9 @@ "HeaderBlockItemsWithNoRating": "Blokované položky so žiadnymi alebo nerozpoznanými informáciami o hodnotení:", "HeaderAppearsOn": "Objaví sa", "HeaderApp": "Appka", - "HeaderApiKeysHelp": "Externé aplikácie musia mať vlastný API kľúč, aby mohli komunikovať s Jellyfin Serverom. Kľúče sú vydávané pomocou prihlásenia sa cez Jellyfin účet alebo manuálnym priradením kľúča aplikácií.", + "HeaderApiKeysHelp": "Externé aplikácie musia mať vlastný API kľúč, aby mohli komunikovať so serverom. Kľúče sú vydávané pomocou prihlásenia cez bežný účet alebo manuálnym priradením kľúča aplikácií.", "HeaderAdditionalParts": "Dodatočné časti", "HardwareAccelerationWarning": "Povolenie hardvérovej akcelerácie môže spôsobiť nestabilitu v niektorých podmienkach. Uistite sa, že váš operačný systém a grafické ovládače sú plne aktualizované. Pokiaľ máte po zapnutí problémy s prehrávaním videa, budete musieť zmeniť nastavenie späť na Žiadne.", - "AddItemToCollectionHelp": "Pridať položku do kolekcie jej vyhľadaním a použitím pravého tlačítka myši alebo kliknutím na tlačidlo ponuky a pridať do kolekcie.", "EncoderPresetHelp": "Vyberte hodnotu faster pre zlepšenie výkonu alebo hodnotu slower pre zlepšenie kvality.", "H264CrfHelp": "Constant Rate Factor (CRF) je východzím nastavením kvality pre x264 enkodér. Môžete mu nadstaviť hodnotu medzi 0 a 51, kde nižšia hodnota vedie k vyššej kvalite (za cenu väčšieho súboru). Rozumné hodnoty sú medzi 18 a 28. Východzia hodnota pre x264 je 23, ktorú môžete použiť ako začiatočný bod.", "GuideProviderSelectListings": "Výber zobrazenia", @@ -1146,7 +1031,7 @@ "ErrorSavingTvProvider": "Nastala chyba pri ukladaní sprostredkovateľa TV vysielania. Prosím, uistite sa, že je prístupný a skúste to znova.", "ErrorPleaseSelectLineup": "Prosím, vyberte lineup a skúste to znova. Pokiaľ nie je k dispozícií žiaden lineup, skontrolujte, či je vaše používateľské meno, heslo a PSČ správne.", "ErrorGettingTvLineups": "Nastala chyba pri sťahovaní rozpisov TV programov. Prosím, uistite sa že vaše informácie sú správne a skúste to znova.", - "ErrorDeletingItem": "Nastala chyba pri vymazávaní položky z Jellyfin Servera. Prosím, overte, či Jellyfin Server má práva pre zapisovanie do priečinku s médiami a skúste to znova.", + "ErrorDeletingItem": "Nastala chyba pri vymazávaní položky zo servera. Prosím, overte, či Jellyfin má práva pre zapisovanie do priečinku s médiami a skúste to znova.", "ErrorAddingXmlTvFile": "Nastala chyba pri prístupe k XMLTV súboru. Prosím, uistite sa že súbor existuje a skúste to znova.", "ErrorAddingTunerDevice": "Nastala chyba pri pridávaní tunera. Prosím, uistite sa že je dostupný a skúste to znova.", "EnableThemeVideosHelp": "Prehrať videá úvodných zvučiek na pozadí počas prechádzania knižnice.", @@ -1156,14 +1041,14 @@ "EnableExternalVideoPlayersHelp": "Ponuka externého prehrávača sa zobrazí pri spustení prehrávania videa.", "EnableBackdropsHelp": "Zobraziť pozadia na pozadí pre niektoré stránky pri prechádzaní knižnice.", "DisplayInOtherHomeScreenSections": "Zobrazenie v sekciách domovskej obrazovky, ako sú najnovšie médiá a pokračovať v pozeraní", - "DirectStreamHelp1": "Médium je kompatibilné zo zariadením nezávisle na rozlíšení alebo type média (H.264, AC3, atď.), je však v nekompatibilnom kontajneri (mkv, avi, wmv, atď.). Video bude za behu prebalené do kompatibilného kontajnera ešte pred streamovaním do zariadenia.", + "DirectStreamHelp1": "Médium je kompatibilné zo zariadením nezávisle na rozlíšení alebo type média (H.264, AC3, atď.), je však v nekompatibilnom kontajneri (mkv, avi, wmv, atď.). Video bude za behu prebalené do kompatibilného kontajnera ešte pred odoslaním do zariadenia.", "Depressed": "Stlačený", "DefaultSubtitlesHelp": "Titulky sú načítané v závislosti od predvolených a vynútených nastavení v zabudovaných metadátach. Jazykové predvoľby sú zobrané do úvahy až vtedy, keď je k dispozícií viacero možností.", "DefaultMetadataLangaugeDescription": "Toto sú vaše predvolené hodnoty ktoré môžu byť prispôsobené na základe jednotlivých knižníc.", "CustomDlnaProfilesHelp": "Vytvorte si vlastný profil pre nové zariadenie alebo pre prepísanie systémového profilu.", "CopyStreamURLSuccess": "URL úspešne skopírovaná.", "CopyStreamURL": "Kopírovať URL adresu streamu", - "ConfigureDateAdded": "Konfigurácia, ako sa pridáva dátum, je definovaná v dashboarde Jellyfin Servera pod nastavením Knižnice", + "ConfigureDateAdded": "Konfigurácia pridávania dátumu je definovaná v dashboarde pod nastavením knižnice", "ColorTransfer": "Farba prenosu", "ColorPrimaries": "Primárna farba", "CinemaModeConfigurationHelp": "Kino režim prináša zážitok ako z kina priamo do vašej obývačky s možnosťou prehrať trailery a vlastné intrá pred hlavným programom.", @@ -1172,7 +1057,7 @@ "ButtonSplit": "Rozdeliť", "ButtonAddImage": "Pridať obrázok", "BurnSubtitlesHelp": "Určuje, či má server vpáliť titulky počas transkódovania videa. Vynechanie tejto možnosti výrazne zvýši výkon. Vyberte možnosť Auto, pokiaľ chcete vpáliť do obrazu titulky v grafickom formáte (VOBSUB, PGS, SUB, IDX, …) a niektoré ASS alebo SSA titulky.", - "BrowsePluginCatalogMessage": "Prehliadnite si náš katalóg dostupných zásuvných modulov.", + "MessageBrowsePluginCatalog": "Prehliadnite si náš katalóg dostupných zásuvných modulov.", "Browse": "Prechádzať", "Blacklist": "Blacklist", "Banner": "Banner", @@ -1193,14 +1078,11 @@ "XmlDocumentAttributeListHelp": "Tieto atribúty sú aplikované do koreňového prvku každej XML odpovede.", "Writer": "Napísal", "Whitelist": "Whitelist", - "VideoRange": "Rozsah videa", "UserAgentHelp": "Zadajte vlastnú HTTP hlavičku pre user agenta.", "TitleHostingSettings": "Nastavenie hostingu", "Thumb": "Náhľad", "TheseSettingsAffectSubtitlesOnThisDevice": "Toto nastavenie ovplyvní titulky na tomto zariadení", "TabNetworking": "Sieť", - "TabDisplay": "Zobrazenie", - "TabAlbumArtists": "Umelec albumu", "SystemDlnaProfilesHelp": "Systémové profily sú len na čítanie. Zmeny systémových profilov budú uložené do nového vlastné profilu.", "SubtitleOffset": "Odchýlka titulkov", "SubtitleDownloadersHelp": "Povolí a ohodnotí vaše preferované sťahovače titulkov podľa priority.", @@ -1214,22 +1096,21 @@ "SeriesCancelled": "Seriál zrušený.", "SelectAdminUsername": "Prosím, vyberte si používateľské meno pre účet administrátora.", "RefreshQueued": "Obnovenie zaradené do fronty.", - "RefreshDialogHelp": "Metadáta sa obnovujú na základe nastavení a internetových služieb, ktoré sú povolené v dashboarde Jellyfin Serveru.", - "RecordingPathChangeMessage": "Zmenou priečinku pre nahrávanie sa existujúce nahrávky automaticky nepresunú zo starej lokácie na na novú. Budete ich musieť presunúť ručne, pokiaľ budete chcieť.", + "RefreshDialogHelp": "Metadáta sa obnovujú na základe nastavení a internetových služieb, ktoré sú povolené v dashboarde.", + "MessageChangeRecordingPath": "Zmenou priečinku pre nahrávanie sa existujúce nahrávky automaticky nepresunú zo starej lokácie na na novú. Budete ich musieť presunúť ručne, pokiaľ budete chcieť.", "RecordSeries": "Nahrať sériu", "Raised": "Vystupujúce", - "QueueAllFromHere": "Všetko odtiaľto zaradiť do fronty", "Primary": "Primárna", "PreferEmbeddedTitlesOverFileNamesHelp": "Toto určuje východzí názov zobrazenia, pokiaľ nie sú k dispozícií internetové metadáta alebo lokálne metadáta.", "PreferEmbeddedTitlesOverFileNames": "Preferovať vložené názvy nad názvami súborov", "PleaseConfirmPluginInstallation": "Prosím, kliknite na OK pre potvrdenie, že ste prečítali text uvedený vyššie a chcete pokračovať v inštalácií zásuvného modulu.", "PlaybackData": "Podrobnosti prehrávania", "PlayAllFromHere": "Prehrať všetko odtiaľto", - "PasswordResetProviderHelp": "Zvoľte poskytovateľa obnovy hesla, ktorý bude použitý, keď používateľ požiada o obnovu hesla", + "PasswordResetProviderHelp": "Zvoľte poskytovateľa obnovy hesla, ktorý bude použitý, keď používateľ požiada o obnovu hesla.", "OptionThumbCard": "Náhľadové kartičky", "OptionSubstring": "Podreťazec", "OptionSpecialEpisode": "Špeciály", - "OptionSaveMetadataAsHiddenHelp": "Zmena bude platiť pre nové metadáta uložené v budúcnosti. Existujúce metadáta budú aktualizované na ďalší raz, akonáhle budú uložené Jellyfin Serverom.", + "OptionSaveMetadataAsHiddenHelp": "Zmena bude platiť pre nové metadáta uložené v budúcnosti. Existujúce metadáta budú aktualizované na ďalší raz, akonáhle budú uložené serverom.", "OptionResElement": "Zdrojový element", "OptionRequirePerfectSubtitleMatchHelp": "Vyžadovanie dokonalej zhody filtruje titulky tak, aby obsahovali iba tie ktoré boli odskúšané a overené pre váš konkrétny video súbor. Zrušenie zaškrtnutia tohoto zvýši pravdepodobnosť sťahovania tituliek, ale zvýši šancu chybného časovania alebo nesprávneho textu tituliek.", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Toto je vyžadované pre niektoré zariadenia, ktoré nevedia moc dobre časovo pretáčať.", @@ -1237,18 +1118,18 @@ "OptionRandom": "Náhodne", "OptionProfileVideoAudio": "Video Zvuk", "OptionPosterCard": "Plagátová karta", - "OptionPlainVideoItemsHelp": "Pokiaľ je povolené, všetky videá sú reprezentované v DIDL ako \"object.item.videoItem\" namiesto viac špecifického typu, ako napríklad \"object.item.videoItem.movie\".", - "OptionPlainStorageFoldersHelp": "Pokiaľ je povolené, všetky priečinky sú reprezentované v DIDL ako \"object.container.storageFolder\" namiesto viac špecifického typu, ako napríklad \"object.container.person.musicArtist\".", + "OptionPlainVideoItemsHelp": "Všetky videá sú reprezentované v DIDL ako \"object.item.videoItem\" namiesto viac špecifického typu, ako napríklad \"object.item.videoItem.movie\".", + "OptionPlainStorageFoldersHelp": "Všetky priečinky sú reprezentované v DIDL ako \"object.container.storageFolder\" namiesto viac špecifického typu, ako napríklad \"object.container.person.musicArtist\".", "OptionPlainStorageFolders": "Zobraziť všetky priečinky ako jednoduché priečinky pre ukladanie", "OptionOnInterval": "V intervale", "OptionLoginAttemptsBeforeLockoutHelp": "Hodnota 0 znamená zdedenie východzej hodnoty troch pokusov pre bežného používateľa a päť pre administrátora. Nastavením na -1 sa táto funkcia zakáže.", "OptionLoginAttemptsBeforeLockout": "Určuje, koľko chybných prihlásení môže byť urobených pred uzamknutím.", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "Pokiaľ je povolené, budú tieto požiadavky aj naďalej plnené, avšak hlavičky bajtových rozsahov budú ignorované.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Tieto požiadavky budú aj naďalej plnené, avšak hlavičky bajtových rozsahov budú ignorované.", "OptionIgnoreTranscodeByteRangeRequests": "Ignorovať požiadavky na transkódovanie bajtového rozsahu", "OptionHlsSegmentedSubtitles": "HLS segmentované titulky", "OptionExternallyDownloaded": "Externé sťahovanie", "OptionEnableExternalContentInSuggestionsHelp": "Povoliť zahrnutie internetových trailerov a živých TV programov do navrhovaného obsahu.", - "OptionDownloadImagesInAdvanceHelp": "Vo východzom stave sa väčšina obrázkov sťahuje až po vyžiadaní Jellyfin aplikáciou. Povolením tejto možnosti sa budú všetky obrázky sťahovať popredu, keď sa budú importovať nové médiá. Toto môže spôsobiť výrazne dlhšie skenovanie knižnice.", + "OptionDownloadImagesInAdvanceHelp": "Vo východzom stave sa väčšina obrázkov sťahuje až po vyžiadaní klientom. Povolením tejto možnosti sa budú všetky obrázky sťahovať popredu, keď sa budú importovať nové médiá. Toto môže spôsobiť výrazne dlhšie skenovanie knižnice.", "OptionDownloadBoxImage": "Krabica", "OptionDownloadBannerImage": "Banner", "OptionDisplayFolderViewHelp": "Zobraziť priečinky popri ostatných médiách v knižnici. Toto môže byť užitočné, pokiaľ chcete vidieť jednoduché zobrazenie priečinku.", @@ -1256,10 +1137,10 @@ "OptionBlockTvShows": "Seriál", "OptionBlockLiveTvChannels": "Živé TV kanály", "OptionBanner": "Banner", - "OptionAutomaticallyGroupSeriesHelp": "Pokiaľ je povolené, tak sa série, ktoré sú rozhádzané skrz rôzne priečinky, budú automaticky v tejto knižnici zlučovať do jedného seriálu.", + "OptionAutomaticallyGroupSeriesHelp": "Seriály uložené vo viacerých priečinkoch v tejto knižnici, budú automaticky zlúčené do jedného seriálu.", "OptionAllowVideoPlaybackRemuxing": "Povoliť prehrávanie videa, ktoré vyžaduje konverziu bez opätovného enkódovania", "OptionAllowSyncTranscoding": "Povoliť sťahovanie a synchronizáciu medií, ktoré vyžadujú transkódovanie", - "OptionAllowMediaPlaybackTranscodingHelp": "Obmedzenie prístupu ku transkódovaniu môže spôsobiť zlyhania prehrávania v Jellyfin aplikáciách kvôli nepodporovaným formátom medií.", + "OptionAllowMediaPlaybackTranscodingHelp": "Obmedzenie prístupu ku transkódovaniu môže spôsobiť zlyhania prehrávania v klientoch kvôli nepodporovaným formátom medií.", "MessageNoTrailersFound": "Nainštalujte Trailer kanál pre rozšírenie vášho filmového zážitku pridaním knižnice trailerov z internetu.", "LanNetworksHelp": "Zoznam IP adries alebo IP/netmask záznamov pre všetky siete oddelené čiarkami ktoré budú považované za lokálnu sieť pri vynucovaní obmedzenia šírky pásma. Pokiaľ je toto nastavené, všetky ostatné IP adresy budú považované za vonkajšiu sieť a budú podliehať obmedzeniam šírky pásma vonkajšej siete. Pokiaľ pole ostane prázdne, podsieť serveru bude považovaná za lokálnu sieť.", "LabelUserAgent": "User agent:", @@ -1274,28 +1155,27 @@ "MusicLibraryHelp": "Pozrite si {0}príručku pomenovania hudby{1}.", "MusicAlbum": "Hudobný album", "MoreMediaInfo": "Informácie o médiu", - "MetadataSettingChangeHelp": "Zmena nastavení metadát ovplyvní nový obsah, ktorý bude pridávaný v budúcnosti. Pre obnovenie existujúceho obsahu, otvorte obrazovku s detailom a kliknite na tlačítko obnoviť alebo vykonajte hromadnú obnovu cez metadata manažér.", + "MetadataSettingChangeHelp": "Zmena nastavení metadát ovplyvní nový obsah pridávaný v budúcnosti. Pre obnovenie existujúceho obsahu, otvorte obrazovku s detailom a kliknite na tlačítko obnoviť alebo vykonajte hromadnú obnovu cez metadata manažér.", "MessageUnsetContentHelp": "Obsah bude zobrazený ako jednoduché priečinky. Pre lepšie výsledky použite manažér metadát na nastavenie typu obsahu podpriečinkov.", "MessageUnableToConnectToServer": "Nie sme schopný sa aktuálne pripojiť k vybranému serveru. Prosím, uistite sa že je spustený a skúste to znovu.", "MessageReenableUser": "Pozrite nižšie pre znovu-povolenie", - "MessagePluginInstallDisclaimer": "Zásuvné moduly vytvorené členmi Jellyfin komunity sú úžasná cesta ako zlepšiť váš Jellyfin zážitok s dodatočnými funkciami a benefitmi. Pred inštaláciou sa prosím oboznámte s efektmi, ktoré môžu mať vplyv na váš Jellyfin Server, ako dlhšie prehľadávanie knižníc, dodatočné procesy na pozadí a zníženie stability systému.", + "MessagePluginInstallDisclaimer": "Zásuvné moduly vytvorené členmi komunity sú úžasná cesta ako zlepšiť váš zážitok s dodatočnými funkciami a benefitmi. Pred inštaláciou sa prosím oboznámte s efektmi, ktoré môžu mať vplyv na váš server, ako dlhšie prehľadávanie knižníc, dodatočné procesy na pozadí a zníženie stability systému.", "MessagePluginConfigurationRequiresLocalAccess": "Pre konfiguráciu tohoto zásuvného modulu sa prihláste priamo na lokálny server.", "MessagePlayAccessRestricted": "Prehrávanie tohoto obsahuje je aktuálne obmedzené. Prosím, kontaktujte svojho administrátora servera pre viac informácií.", "MessagePasswordResetForUsers": "Nasledujúci používatelia si nechali obnoviť heslo. Teraz sa môžu prihlásiť s PIN kódom, ktorý použijú k vykonaniu obnovy hesla.", "MessageNoServersAvailable": "Žiadne servery neboli nájdené pomocou automatického objavovania serverov.", "MessageNoMovieSuggestionsAvailable": "V súčastnosti nie sú k dispozícií žiadne filmové návrhy. Začnite pozerať a hodnotiť vaše filmy, potom sa sem vráťte pre Vaše odporúčania.", "MessageNoCollectionsAvailable": "Kolekcie vám umožnia užiť si vlastné zoskupenia filmov, seriálov a albumov. Kliknite na tlačítko + pre začatie vytvárania kolekcie.", - "MessageInstallPluginFromApp": "Tento zásuvný modul musí byť nainštalovaný z aplikácie, ktorú chcete používať.", "MessageImageTypeNotSelected": "Prosím, vyberte typ obrázku z rozbalovacieho menu.", "MessageForgotPasswordInNetworkRequired": "Prosím, skúste to znova vo vašej domácej sieti pre zahájenie procesu obnovy hesla.", "MessageForgotPasswordFileCreated": "Nasledujúci súbor bol vytvorený na vašom serveri a obsahuje inštrukcie, ako postupovať:", "MessageDownloadQueued": "Sťahovanie zaradené do fronty.", "MessageDirectoryPickerLinuxInstruction": "Pre Linuxové distribúcie Arch Linux, CentOS, Debian, Fedora, openSUSE alebo Ubuntu, je potrebné udeliť používateľovi služby oprávnenie aspoň na čítanie.", - "MessageDirectoryPickerBSDInstruction": "Pre BSD možno budete potrebovať nakonfigurovať úložisko priamo vo vašom FreeNAS Jail aby k nim mohol pristupovať Jellyfin.", + "MessageDirectoryPickerBSDInstruction": "Pre BSD možno budete potrebovať nakonfigurovať úložisko priamo vo vašom FreeNAS Jail aby mohol Jellyfin pristupovať k vašim médiám.", "MessageDeleteTaskTrigger": "Naozaj chcete vymazať tento trigger úlohy?", "MessageCreateAccountAt": "Vytvoriť účet v {0}", "MessageContactAdminToResetPassword": "Prosím, kontaktujte vášho systémového administrátora k obnoveniu hesla.", - "MessageConfirmRevokeApiKey": "Ste si istý, že chcete odvolať tento API kľúč? Aplikácie pripojené k Jellyfin Serveru budú rázne ukončené.", + "MessageConfirmRevokeApiKey": "Ste si istý, že chcete odvolať tento API kľúč? Aplikácie pripojené k tomuto serveru budú rázne ukončené.", "Menu": "Menu", "MediaIsBeingConverted": "Médium sa konvertuje do formátu, ktorý je kompatibilný so zariadením, kde sa médium prehráva.", "MediaInfoStreamTypeEmbeddedImage": "Vložený obrázok", @@ -1308,9 +1188,7 @@ "MediaInfoBitrate": "Dátový tok", "MediaInfoAnamorphic": "Anamorfné", "MapChannels": "Nájdi kanály", - "LaunchWebAppOnStartupHelp": "Otvorí webového klienta vo vašom východzom webovom prehliadači pri prvotnom spustení servera. Toto nenastane pokiaľ použijete funkciu reštartovania servera.", - "LaunchWebAppOnStartup": "Spustiť webové rozhranie pri štarte servera", - "LabelffmpegPathHelp": "Cesta k aplikačnému súboru ffmpeg alebo k priečinku obsahujúcemu ffmpeg.", + "LabelffmpegPathHelp": "Cesta k súboru aplikácie ffmpeg alebo k priečinku obsahujúcemu ffmpeg.", "LabelXDlnaDocHelp": "Určuje obsah prvku X_DLNADOC v namespace urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDoc": "X-DLNA dokumentácia:", "LabelXDlnaCapHelp": "Určuje obsah prvku X_DLNACAP v namespace urn:schemas-dlna-org:device-1-0.", @@ -1347,7 +1225,6 @@ "LabelSkipIfGraphicalSubsPresentHelp": "Textové verzie titulkov môžu mať za následok efektívnejšiu dodávku a zníženie šance na transkódovanie videa.", "LabelSkipIfAudioTrackPresentHelp": "Zrušte zaškrtnutie pre zobrazenie titulkov pri všetkých videách, bez ohľadu na jazyk zvuku.", "LabelSkipIfAudioTrackPresent": "Preskočiť, pokiaľ je východzia zvuková stopa rovnaká ako sťahovaný jazyk", - "LabelSkin": "Vzhľad:", "LabelSize": "Veľkosť:", "LabelSimultaneousConnectionLimit": "Limit simultánnych streamov:", "LabelServerName": "Názov serveru:", @@ -1367,7 +1244,6 @@ "LabelProtocolInfoHelp": "Hodnota, ktorá sa použije pri odpovedi na požiadavky GetProtocolInfo z tohoto zariadenia.", "LabelProfileContainersHelp": "Oddelené čiarkou. Pokiaľ zostane pole prázdne, aplikuje sa na všetky kontajnery.", "LabelProfileCodecsHelp": "Oddelené čiarkou. Pokiaľ zostane pole prázdne, aplikuje sa na všetky kodeky.", - "LabelPreferredDisplayLanguageHelp": "Preklad Jellyfinu je v neustálom vývoji.", "LabelPostProcessorArgumentsHelp": "Použi {path} ako cestu k nahrávanému súboru.", "LabelPostProcessorArguments": "Argumenty príkazového riadku pre následné spracovanie:", "LabelPostProcessor": "Aplikácia pre následné spracovanie:", @@ -1378,7 +1254,7 @@ "LabelPersonRoleHelp": "Príklad: Vodič nákladiaku so zmrzlinou", "LabelPasswordResetProvider": "Poskytovateľ obnovy hesla:", "LabelParentNumber": "Číslo rodiča:", - "LabelOptionalNetworkPathHelp": "Pokiaľ je tento priečinok zdielaný vo vašej sieti, môže poskytovanie cesty k zdielanému priečinku umožniť Jellyfin aplikáciám priamy prístup k mediálnym súborom. Napríklad, {0} alebo {1}.", + "LabelOptionalNetworkPathHelp": "Pokiaľ je tento priečinok zdielaný vo vašej sieti, môže poskytovanie cesty k zdielanému priečinku umožniť klientom priamy prístup k mediálnym súborom. Napríklad, {0} alebo {1}.", "LabelNumberOfGuideDaysHelp": "Stiahnutím viacerých dní umožní sprievodca naplánovať a zobraziť viac vecí do budúcnosti, sťahovanie však môže trvať dlhšie. Auto vyberie možnosť podľa počtu kanálov.", "LabelNumberOfGuideDays": "Počet dní pre stiahnutie dát sprievodcu:", "LabelMusicStreamingTranscodingBitrateHelp": "Špecifikujte maximálny dátový tok pre streamovanie hudby.", @@ -1402,7 +1278,7 @@ "LabelLogs": "Logy:", "LabelLoginDisclaimer": "Vyrozumenie prihlásenia:", "LabelLockItemToPreventChanges": "Uzamknúť túto položku pre zabránenie zmien v budúcnosti", - "LabelLocalHttpServerPortNumberHelp": "Číslo TCP portu, na ktoré by sa mal naviazať Jellyfin HTTP server.", + "LabelLocalHttpServerPortNumberHelp": "Číslo portu TCP serveru HTTP.", "LabelKodiMetadataUserHelp": "Uložiť dáta o pozeraní do NFO súboru pre využitie ostatnými aplikáciami.", "LabelKodiMetadataUser": "Ukladá dáta používateľa o pozeraní do NFO súboru pre:", "LabelKodiMetadataEnablePathSubstitutionHelp": "Povoľuje nahradenie ciest k obrázkom pomocou nastavenej cesty serveru pre nahradené cesty.", @@ -1415,26 +1291,26 @@ "LabelIdentificationFieldHelp": "Podreťazec citlivý na veľkosť písmen alebo na regulárne výrazy.", "LabelIconMaxWidthHelp": "Maximálne rozlíšenie ikon pomocou prostredníctvom upnp:icon.", "LabelIconMaxHeightHelp": "Maximálne rozlíšenie ikon pomocou prostredníctvom upnp:icon.", - "LabelHttpsPortHelp": "Číslo TCP portu, na ktoré by sa mal naviazať Jellyfin HTTPS server.", + "LabelHttpsPortHelp": "Číslo portu TCP serveru HTTPS.", "LabelHomeNetworkQuality": "Kvalita na domácej sieti:", "LabelEncoderPreset": "Prednastavené H264 enkódovanie:", "LabelH264Crf": "H264 enkódovanie CRF:", "LabelFriendlyName": "Priateľský názov:", "LabelFolder": "Priečinok:", "LabelExtractChaptersDuringLibraryScanHelp": "Generovať obrázky kapitol počas toho, ako sú videá importované v prvotnom prehľadávaní knižnice. Inak sa budú extrahovať počas naplánovanej úlohy generovania obrázkov kapitol, čo dovoľuje rýchlejšie dokončenie bežného prehľadávania knižnice.", - "LabelBaseUrlHelp": "Pridá vlastný reťazec na URL adresu serveru, napr: http://priklad.sk/<vlastnyretazec>", + "LabelBaseUrlHelp": "Pridá vlastný reťazec na URL adresu serveru, napr: http://priklad.sk/<vlastny-retazec>", "LabelBaseUrl": "Východzia URL:", "LabelEveryXMinutes": "Každý:", "LabelEnableSingleImageInDidlLimitHelp": "Niektoré zariadenia nebudú zobrazovať správne pokiaľ je viacero obrázkov uložených v Didl.", "LabelEnableDlnaPlayTo": "Povoliť DLNA prehrávanie", "LabelEnableDlnaDebugLoggingHelp": "Vytvára veľké súbory s logami a mal by sa použiť len v prípade potreby odstraňovania problémov.", "LabelEnableDlnaDebugLogging": "Povoliť loggovanie DLNA debugu", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Určuje dobu trvania v sekundách medzi SSDP vyhľadávaniami vykonanými Jellyfinom.", - "LabelEnableDlnaClientDiscoveryInterval": "Interval pre objavenie klienta (sekundy)", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Určuje dobu trvania v sekundách medzi SSDP vyhľadávaniami.", + "LabelEnableDlnaClientDiscoveryInterval": "Interval pre objavenie klienta", "LabelEnableAutomaticPortMapHelp": "Automatické namapovanie vejerného portu na lokálny port serveru cez UPnP. Toto nemusí fungovať so všetkými modelmi routerov alebo sieťových konfigurácií. Zmeny sa vykonajú až po reštarte servera.", "LabelEmbedAlbumArtDidlHelp": "Niektoré zariadenia preferujú túto metódu pre získavanie obrázku albumu. Ostatným môže zlyhať prehrávanie pokiaľ je táto možnosť povolená.", "LabelBlastMessageIntervalHelp": "Určuje dobu v sekundách medzi vysielaniami správ o serveri.", - "LabelBindToLocalNetworkAddressHelp": "Voliteľné. Prepísať lokálnu IP adresu viazanú na http server. Pokiaľ zostane prázdna, server sa naviaže na všetky dostupné adresy. Pri zmene tejto hodnoty sa vyžaduje reštart Jellyfin Servera.", + "LabelBindToLocalNetworkAddressHelp": "Prepísať lokálnu IP adresu http serveru. Pokiaľ zostane prázdna, server sa naviaže na všetky dostupné adresy. Pri zmene tejto hodnoty sa vyžaduje reštart.", "LabelAlbumArtPN": "Obrázok albumu PN:", "LabelAlbumArtMaxWidthHelp": "Maximálne rozlíšenie obrázku albumu prostredníctvom upnp:albumArtURI.", "LabelAlbumArtMaxHeightHelp": "Maximálne rozlíšenie obrázku albumu prostredníctvom upnp:albumArtURI.", @@ -1449,7 +1325,6 @@ "LabelPlayerDimensions": "Rozmery prehrávača:", "LabelDroppedFrames": "Vynechané snímky:", "LabelCorruptedFrames": "Poškodené snímky:", - "CopyStreamURLError": "Pri kopírovaní URL nastala chyba.", "OptionForceRemoteSourceTranscoding": "Vynútiť transkódovanie vzdialených mediálnych zdrojov (ako napr. živá TV)", "NoCreatedLibraries": "Vyzerá to tak, že ste zatiaľ nevytvorili žiadnu knižnicu. {0}Chceli by ste nejakú vytvoriť teraz?{1}", "AskAdminToCreateLibrary": "Pokiaľ chcete vytvoriť knižnicu, musíte sa spýtať administrátora.", @@ -1471,15 +1346,13 @@ "LastSeen": "Naposledy videný {0}", "PersonRole": "ako {0}", "ListPaging": "{0}-{1} z {2}", - "WriteAccessRequired": "Jellyfin Server vyžaduje práva na zapisovanie do tohoto priečinku. Prosím, uistite sa že má práva na zapisovanie a skúste to znova.", + "WriteAccessRequired": "Server vyžaduje práva na zapisovanie do tohoto priečinku. Prosím, uistite sa že má práva na zapisovanie a skúste to znova.", "PathNotFound": "Táto cesta nebola nájdená. Prosím, uistite sa že cesta je správna a skúste to znovu.", "YadifBob": "YADIF Bob", "Yadif": "YADIF", "Track": "Stopa", "Season": "Séria", - "ReleaseGroup": "Vydavateľ", "Person": "Osoba", - "OtherArtist": "Ostatný umelci", "Movie": "FIlm", "LabelDeinterlaceMethod": "Metóda odstránenia prekladaného videa:", "Episode": "Epizóda", @@ -1488,21 +1361,17 @@ "AlbumArtist": "Umelec albumu", "LabelLibraryPageSizeHelp": "Určuje množstvo položiek na zobrazenie na stránke knižnice. Nastavte 0 pre vypnutie stránkovania.", "LabelLibraryPageSize": "Veľkosť stránky knižnice:", - "MessageUnauthorizedUser": "Momentálne nemáte oprávnenie na prístup k serveru. Prosím, kontaktujte svojho administrátora serveru pre viac informácií.", "UnsupportedPlayback": "Jellyfin nemôže dešifrovať obsah chránený technológiou DRM, ale pokúsi sa o to, vrátane chránených titulov. Niektoré súbory sa môžu zobraziť ako kompletne čierne z dôvodu, že sú zašifrované alebo obsahujú nepodporované funckie, ako napríklad interaktívne funkcie.", "Filter": "Filter", "New": "Nové", "HeaderFavoritePlaylists": "Obľúbené playlisty", "ButtonTogglePlaylist": "Playlist", - "ButtonToggleContextMenu": "Viac", "ApiKeysCaption": "Zoznam v súčasnosti povolených API kľúčov", - "LabelNightly": "Nočná", "LabelStable": "Stabilná", "LabelChromecastVersion": "Chromecast verzia", - "TabDVR": "DVR", "LabelRequireHttpsHelp": "Pokiaľ je zaškrtnutý, server bude automaticky presmerovávať všetky HTTP požiadavky cez HTTPS. Toto nastavenie nemá žiadny efekt, pokiaľ server nepočúva na HTTPS.", "LabelRequireHttps": "Vyžadovať HTTPS", - "LabelEnableHttpsHelp": "Umožní serveru počúvať na nastavenom HTTPS porte. K správnemu fungovaniu je nutné nakonfigurovať aj platný certifikát.", + "LabelEnableHttpsHelp": "Počúvanie na nastavenom HTTPS porte. K správnemu fungovaniu je nutné nakonfigurovať aj platný certifikát.", "LabelEnableHttps": "Povoliť HTTPS", "HeaderServerAddressSettings": "Nastavenie adresy servera", "HeaderRemoteAccessSettings": "Nastavenie vzdialeného prístupu", @@ -1541,8 +1410,8 @@ "SyncPlayAccessHelp": "Vyberte úroveň prístupu pre tohto používateľa k funkcií SyncPlay. SyncPlay umožňuje zosynchronizovať prehrávanie s ostatnými zariadeniami.", "EnableDetailsBannerHelp": "Zobrazí banner na vrchnej časti detailu položky.", "EnableDetailsBanner": "Detail banneru", - "EnableBlurhashHelp": "Obrázky, ktoré sa stále načítavajú budú zobrazené ako dočasný obrázok s rozmazaným pozadím", - "EnableBlurhash": "Povoliť obrázok s rozmazaným pozadím pre chýbajúce obrázky", + "EnableBlurHashHelp": "Obrázky, ktoré sa stále načítavajú budú zobrazené ako dočasný obrázok s rozmazaným pozadím.", + "EnableBlurHash": "Povoliť obrázok s rozmazaným pozadím pre chýbajúce obrázky", "ShowMore": "Zobraziť viac", "ShowLess": "Zobraziť menej", "ButtonCast": "Prenášať", @@ -1564,5 +1433,14 @@ "Writers": "Scenáristi", "ClearQueue": "Vymazať frontu", "StopPlayback": "Zastaviť prehrávanie", - "ViewAlbumArtist": "Zobraziť interpreta albumu" + "ViewAlbumArtist": "Zobraziť interpreta albumu", + "Preview": "Náhľad", + "SubtitleVerticalPositionHelp": "Číslo riadku, na ktorom sa zobrazí text. Kladné čísla znamenajú smer zhora dole. Záporné čísla zdola hore.", + "LabelSubtitleVerticalPosition": "Vertikálne umiestnenie:", + "PreviousTrack": "Predchádzajúca", + "MessageGetInstalledPluginsError": "Pri načítaní zoznamu nainštalovaných zásuvných modulov došlo k chybe.", + "MessagePluginInstallError": "Pri inštalácií zásuvného modulu došlo k chybe.", + "NextTrack": "Ďalšia", + "LabelUnstable": "Nestabilný", + "PlaybackRate": "Rýchlosť prehrávania" } diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index 16d8472546..641d21e8bc 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -1,18 +1,14 @@ { "ButtonAddUser": "Dodaj Uporabnika", - "ButtonDeleteImage": "Izbrisi sliko", "ButtonQuickStartGuide": "Vodnik za hiter zacetek", "ButtonResetPassword": "Ponastavitev gesla", "ButtonSignOut": "Odjava", "FolderTypeTvShows": "TV", "HeaderAddToCollection": "Dodaj v Zbirko", - "HeaderAddUser": "Dodaj Uporabnika", - "HeaderAutomaticUpdates": "Samodejne Posodobitve", "HeaderEasyPinCode": "Enostavna Pin koda", "HeaderFrequentlyPlayed": "Pogosto Predvajano", "HeaderPaths": "Poti", "HeaderRecentlyPlayed": "Nazadnje Predvajano", - "HeaderSeries": "Serije", "HeaderSettings": "Nastavitve", "HeaderUser": "Uporabnik", "LabelArtists": "Izvajalci:", @@ -23,11 +19,8 @@ "LabelLanguage": "Jezik:", "LabelNewPassword": "Novo geslo:", "LabelNewPasswordConfirm": "Potrditev novega gesla:", - "LabelNext": "Naprej", - "LabelPrevious": "Nazaj", "LabelSelectUsers": "Izberi uporabnike:", "LabelTimeLimitHours": "Časovna omejitev (ure):", - "LabelYourFirstName": "Ime:", "LabelYoureDone": "Koncano!", "MoreUsersCanBeAddedLater": "Uporabnike lahko dodate tudi kasneje preko Nadzorne plošče.", "OptionAllowMediaPlayback": "Dovoli predvajanje vsebin", @@ -44,20 +37,13 @@ "ParentalRating": "Ocena za starše", "Settings": "Nastavitve", "TabAccess": "Dostop", - "TabAlbumArtists": "Izvajalci Albumov", - "TabArtists": "Izvajalci", "TabCatalog": "Katalog", - "TabGenres": "Zvrsti", "TabLatest": "Zadnje", "TabMusic": "Glasba", "TabMyPlugins": "Moji dodatki", "TabNetworks": "Omrezja", - "TabPassword": "Geslo", - "TabPlaylist": "Playlista", "TabProfile": "Profil", "TabProfiles": "Profili", - "TabShows": "Oddaje", - "TabSuggestions": "Predlogi", "TabUpcoming": "Prihajajoče", "TellUsAboutYourself": "Povej nam nekaj o sebi", "ThisWizardWillGuideYou": "Čarovnik vas bo vodil skozi postopek namestitve. Za začetek, izberite jezik.", @@ -86,7 +72,7 @@ "AllowMediaConversionHelp": "Dovoli ali zavrni dostop do pretvarjanja predstavnosti.", "AllowOnTheFlySubtitleExtraction": "Dovoli sprotno izluščenje podnapisov", "AllowOnTheFlySubtitleExtractionHelp": "Vdelani podnapisi so lahko izluščeni iz videa in poslani odjemalcem kot navaden tekst, kar zmanjša potrebo po prekodiranju. Na nekaterih napravah lahko to traja dalj časa in povzroča zatikanje med predvajanjem. Onemogočite to možnost, za vžig vdelanih podnapisov v video s prekodiranjem, za naprave ki sicer ne podpirajo podnapisov.", - "AllowRemoteAccess": "Dovoli oddaljene povezave s tem Jellyfin strežnikom.", + "AllowRemoteAccess": "Dovoli oddaljene povezave s tem strežnikom.", "AllowRemoteAccessHelp": "Če ni označeno, bodo vse oddaljene povezave blokirane.", "Artists": "Izvajalci", "Books": "Knjige", @@ -97,10 +83,7 @@ "Genres": "Zvrsti", "HeaderAlbumArtists": "Izvajalci albuma", "HeaderContinueWatching": "Nadaljuj gledanje", - "HeaderLiveTV": "TV v živo", - "HeaderNextUp": "Sledi", "Movies": "Filmi", - "AddItemToCollectionHelp": "Dodajte elemente v zbirke tako, da jih poiščete in jih z desnim klikom ali dotikom menija dodate v zbirko.", "AllowedRemoteAddressesHelp": "Z vejico ločen seznam IP naslovov ali IP/maska omrežij, ki jim je dovoljen oddaljeni dostop. Če pustite prazno, bodo dovoljeni vsi oddaljeni naslovi.", "AlwaysPlaySubtitles": "Vedno prikaži", "AlwaysPlaySubtitlesHelp": "Podnapisi, ki se ujemajo s prednostnim jezikom bodo naloženi ne glede na jezik zvoka.", @@ -111,10 +94,8 @@ "AsManyAsPossible": "Kolikor je mogoče", "Ascending": "Naraščajoče", "AspectRatio": "Razmerje stranic", - "AttributeNew": "Novo", "Audio": "Zvok", "Auto": "Samodejno", - "AutoBasedOnLanguageSetting": "Samodejno (na podlagi nastavitve jezika)", "Backdrop": "Ozadje", "Backdrops": "Ozadja", "BirthDateValue": "Rojen: {0}", @@ -124,85 +105,60 @@ "Box": "Ovitek", "BoxRear": "Ovitek (zadnja stran)", "Browse": "Brskaj", - "BrowsePluginCatalogMessage": "Poiščite razpoložljive dodatke v našem katalogu.", + "MessageBrowsePluginCatalog": "Poiščite razpoložljive dodatke v našem katalogu.", "BurnSubtitlesHelp": "Določi ali naj strežnik vžge podnapise pri prekodiranju videa. Izogibanje temu lahko občutno izboljša delovanje strežnika. Izberite Samodejno za vžig slikovnih formatov podnapisov (VOBSUB, PGS, SUB, IDX, ...) in nekaterih ASS oziroma SSA podnapisov.", - "ButtonAdd": "Dodaj", "Photos": "Fotografije", "Playlists": "Seznami predvajanja", "Songs": "Pesmi", "Sync": "Sinhroniziraj", - "AuthProviderHelp": "Izberi ponudnika preverjanja pristnosti za preverjanje gesla tega uporabnika.", + "AuthProviderHelp": "Izberite ponudnika preverjanja pristnosti za preverjanje gesla tega uporabnika.", "Banner": "Pasica", "Blacklist": "Črna lista", "ButtonAddMediaLibrary": "Dodaj knjižnico predstavnosti", "ButtonAddScheduledTaskTrigger": "Dodaj sprožilec", "ButtonAddServer": "Dodaj strežnik", - "ButtonArrowDown": "Dol", "ButtonArrowLeft": "Levo", "ButtonArrowRight": "Desno", - "ButtonArrowUp": "Gor", "ButtonAudioTracks": "Zvočna sled", "ButtonBack": "Nazaj", "ButtonCancel": "Prekliči", "ButtonChangeServer": "Spremeni strežnik", - "ButtonConnect": "Poveži", - "ButtonDelete": "Izbriši", - "ButtonDown": "Dol", - "ButtonDownload": "Prenesi", - "ButtonEdit": "Uredi", - "ButtonEditImages": "Uredi slike", "ButtonEditOtherUserPreferences": "Uredi profil tega uporabnika, slike in osebne nastavitve.", - "ButtonFilter": "Filter", "ButtonForgotPassword": "Pozabljeno geslo", "ButtonFullscreen": "Polni zaslon", "ButtonGotIt": "Razumem", "ButtonGuide": "Vodič", - "ButtonHelp": "Pomoč", - "ButtonHome": "Domov", "ButtonInfo": "Info", - "ButtonLearnMore": "Nauči se več", "ButtonLibraryAccess": "Dostop do knjižnic", "ButtonManualLogin": "Ročna prijava", "ButtonMore": "Več", "ButtonNetwork": "Omrežje", - "ButtonNew": "Novo", "ButtonNextTrack": "Naslednja skladba", - "ButtonOff": "Izključi", "ButtonOk": "Ok", "ButtonOpen": "Odpri", "ButtonParentalControl": "Starševski nadzor", "ButtonPause": "Premor", - "ButtonPlay": "Predvajaj", "ButtonPreviousTrack": "Prejšnja skladba", "ButtonProfile": "Profil", - "ButtonRefresh": "Osveži", "ButtonRefreshGuideData": "Osveži TV vodič", "ButtonRemove": "Odstrani", "ButtonRename": "Preimenuj", - "ButtonRepeat": "Ponovi", "ButtonResetEasyPassword": "Ponastavi preprosto PIN kodo", "ButtonRestart": "Ponovno zaženi", "ButtonResume": "Nadaljuj", "ButtonRevoke": "Razveljavi", - "ButtonSave": "Shrani", "ButtonScanAllLibraries": "Preišči vse knjižnice", - "ButtonSearch": "Išči", "ButtonSelectDirectory": "Izberi mapo", "ButtonSelectServer": "Izberi strežnik", "ButtonSelectView": "Izberi pogled", "ButtonSend": "Pošlji", "ButtonSettings": "Nastavitve", - "ButtonShuffle": "Premešaj", "ButtonShutdown": "Ugasni", "ButtonSignIn": "Prijava", - "ButtonSort": "Razvrsti", "ButtonStart": "Začetek", "ButtonStop": "Stop", - "ButtonSubtitles": "Podnapisi", "ButtonTrailer": "Napovednik", "ButtonUninstall": "Odstrani", - "ButtonUp": "Gor", - "ButtonViewWebsite": "Obišči spletno stran", "ButtonWebsite": "Spletna stran", "CancelRecording": "Prekini snemanje", "CancelSeries": "Prekini serijo", @@ -217,7 +173,7 @@ "ColorTransfer": "Prenos barve", "CommunityRating": "Ocena skupnosti", "Composer": "Skladatelj", - "ConfigureDateAdded": "Nastavi kako je določen datum dodajanja v nadzorni plošči Jellyfin Server-ja v kategoriji Knjižnice", + "ConfigureDateAdded": "Nastavite kako je določen datum dodajanja v nadzorni plošči v kategoriji Knjižnice", "ConfirmDeleteImage": "Izbriši sliko?", "ConfirmDeleteItem": "Brisanje tega elementa ga bo izbrisalo iz datotečnega sistema in medijske knjižnice. Ste prepričani da želite nadaljevati?", "ConfirmDeleteItems": "Brisanje teh elementov jih bo izbrisalo iz datotečnega sistema in medijske knjižnice. Ste prepričani da želite nadaljevati?", @@ -257,7 +213,7 @@ "DeleteImage": "Izbriši sliko", "Delete": "Izbiši", "DefaultMetadataLangaugeDescription": "To so vaše privzete nastavitve, ki jih lahko spreminjate za posamezno knjižnico.", - "DefaultErrorMessage": "Prišlo je do težave pri obdelavi zahteve. Poskusite ponovno kasneje.", + "ErrorDefault": "Prišlo je do težave pri obdelavi zahteve. Poskusite ponovno kasneje.", "Default": "Privzeto", "DeathDateValue": "Smrt: {0}", "DatePlayed": "Predvajano", @@ -286,12 +242,11 @@ "HeaderSelectServerCachePath": "Izberite pot predpomnjenih podatkov", "HeaderSelectServer": "Izberi strežnik", "HeaderSelectPath": "Izberi pot", - "HeaderSelectMetadataPathHelp": "Poiščite ali vnesite pot, v kateri želite shranjevati metapodatke. Datoteka mora omogočati pisanje.", + "HeaderSelectMetadataPathHelp": "Prebrskajte ali vnesite pot, ki jo želite uporabiti za metapodatke. Mapa mora dovoliti pisanje.", "HeaderSelectMetadataPath": "Izberi pot metapodatkov", "HeaderSelectCertificatePath": "Izberi pot certifikata", "HeaderSecondsValue": "{0} sekund", "HeaderSeasons": "Sezone", - "HeaderSchedule": "Urnik", "HeaderScenes": "Scene", "HeaderRunningTasks": "Aktivna opravila", "HeaderRestart": "Ponovni zagon", @@ -301,7 +256,7 @@ "HeaderRemoveMediaFolder": "Odstrani mapo predstavnosti", "HeaderRemoteControl": "Upravljanje na daljavo", "HeaderRecordingOptions": "Možnosti snemanja", - "HeaderProfileServerSettingsHelp": "Te vrednosti določajo, kako se bo Jellyfin strežnik predstavil napravi.", + "HeaderProfileServerSettingsHelp": "Te vrednosti določajo, kako se bo strežnik predstavil odjemalcem.", "HeaderProfileInformation": "Informacije o profilu", "HeaderProfile": "Profil", "HeaderPreferredMetadataLanguage": "Prednostni jezik metapodatkov", @@ -313,7 +268,6 @@ "HeaderPlayAll": "Predvajaj vse", "HeaderPinCodeReset": "Ponastavi PIN kodo", "HeaderPhotoAlbums": "Foto albumi", - "HeaderPeople": "Osebe", "HeaderPasswordReset": "Ponastavi geslo", "HeaderPassword": "Geslo", "HeaderParentalRatings": "Ocena za starše", @@ -327,15 +281,12 @@ "HeaderMyDevice": "Moja naprava", "HeaderMusicVideos": "Videospoti", "HeaderMusicQuality": "Kvaliteta glasbe", - "HeaderMovies": "Filmi", "HeaderMoreLikeThis": "Podobno", "HeaderMetadataSettings": "Nastavitve metapodatkov", - "HeaderMediaInfo": "Informacije o predstavnosti", "HeaderMediaFolders": "Mape predstavnosti", "HeaderMedia": "Predstavnost", "HeaderLoginFailure": "Neuspešna prijava", "HeaderLiveTvTunerSetup": "Nastavitev sprejemnika za TV v živo", - "HeaderLiveTv": "TV v živo", "HeaderLibrarySettings": "Nastavitve knjižnice", "HeaderLibraryOrder": "Vrstni red knjižnic", "HeaderLibraryFolders": "Mape knjižnjice", @@ -346,7 +297,7 @@ "HeaderLatestMovies": "Najnovejši filmi", "HeaderLatestMedia": "Najnovejša predstavnost", "HeaderLatestEpisodes": "Najnovejše epizode", - "HeaderKodiMetadataHelp": "Za omogočanje NFO metapodatkov uredite knjižnico v Jellyfin nastavitvah knjižnice v razdelku shranjevanje metapodatkov.", + "HeaderKodiMetadataHelp": "Za omogočanje NFO metapodatkov uredite knjižnico in poiščite možnost v razdelku shranjevanje metapodatkov.", "HeaderKeepSeries": "Ohrani serijo", "HeaderKeepRecording": "Ohrani posnetek", "HeaderInstall": "Namesti", @@ -355,12 +306,8 @@ "HeaderIdentifyItemHelp": "Vnesite vsaj en kriterij iskanja. Odstranite kriterije za več rezultatov.", "HeaderIdentificationCriteriaHelp": "Vnesite vsaj en kriterij za identifikacijo.", "HeaderIdentification": "Identifikacija", - "HeaderHome": "Domov", "HeaderGuideProviders": "Ponudniki TV vodiča", - "HeaderGenres": "Žanri", - "HeaderForgotPassword": "Pozabljeno geslo", "HeaderForKids": "Za otroke", - "HeaderFilters": "Filtri", "HeaderFetcherSettings": "Nastavitve pridobivanja", "HeaderFetchImages": "Pridobi slike:", "HeaderFavoriteVideos": "Priljubljeni videi", @@ -368,12 +315,10 @@ "HeaderFavoriteBooks": "Priljubljene knjige", "HeaderExternalIds": "Zunanji ID-ji:", "HeaderError": "Napaka", - "HeaderEpisodes": "Epizode", "HeaderEnabledFieldsHelp": "Odznači polja in s tem prepreči njihovo urejanje.", "HeaderEnabledFields": "Omogočena polja", "HeaderEditImages": "Uredi slike", "HeaderDownloadSync": "Prenos in sinhronizacija", - "HeaderDisplay": "Prikaz", "HeaderDirectPlayProfileHelp": "Dodaj profil za neposredno predvajanje in določi katere formate naprava podpira.", "HeaderDirectPlayProfile": "Profil za neposredno predvajanje", "HeaderDevices": "Naprave", @@ -397,28 +342,23 @@ "HeaderCodecProfileHelp": "Profili kodeka določajo omejitve naprave pri predvajanju specifičnih kodekov. Če je omejitev dosežena bo predstavnost prekodirana, tudi če je kodek nastavljen za neposredno predvajanje.", "HeaderCodecProfile": "Profil kodeka", "HeaderChapterImages": "Slike poglavij", - "HeaderChannels": "Kanali", "HeaderChannelAccess": "Dostop kanalov", - "HeaderCastCrew": "Igralci in ekipa", "HeaderCastAndCrew": "Igralci in ekipa", "HeaderCancelSeries": "Prekini serijo", "HeaderCancelRecording": "Prekini snemanje", - "HeaderBooks": "Knjige", "HeaderAudioSettings": "Nastavitve zvoka", "HeaderAudioBooks": "Zvočne knjige", "HeaderAppearsOn": "Pojavi se", "HeaderApp": "Aplikacija", - "HeaderApiKeysHelp": "Zunanje aplikacije potrebujejo API ključ za komunikacijo z Jellyfin strežnikom. Ključi so izdani s prijavo z Jellyfin računom ali z ročno dodelitvijo ključa aplikaciji.", + "HeaderApiKeysHelp": "Zunanje aplikacije potrebujejo API ključ za komunikacijo s strežnikom. Ključi so izdani s prijavo z uporabniškim računom ali z ročno dodelitvijo ključa aplikaciji.", "HeaderApiKeys": "API ključi", "HeaderApiKey": "API ključ", "HeaderAllowMediaDeletionFrom": "Dovoli brisanje predstavnosti iz", "HeaderAlert": "Alarm", - "HeaderAlbums": "Albumi", "HeaderAdmin": "Administrator", "HeaderAdditionalParts": "Dodatni deli", "HeaderAddUpdateImage": "Dodaj/posodobi sliko", "HeaderAddToPlaylist": "Dodaj na seznam predvajanja", - "HeaderAddScheduledTaskTrigger": "Dodaj sprožilec", "HeaderActivity": "Aktivnost", "HeaderActiveRecordings": "Aktivna snemanja", "HeaderActiveDevices": "Aktivne naprave", @@ -450,12 +390,12 @@ "FileNotFound": "Datoteka ni najdena.", "File": "Datoteka", "FetchingData": "Pridobivanje dodatnih podatkov", - "Features": "Lastnosti", + "Features": "Funkcije", "Favorite": "Priljubljeno", "FastForward": "Hitro naprej", "FFmpegSavePathNotFound": "Nismo mogli locirati FFmpeg na navedeni poti. FFprobe je prav tako zahtevan in mora biti v isti mapi. Ti komponenti sta običajno združeni skupaj v istem prenosu. Preverite pot in poskusite znova.", "Extras": "Dodatki", - "ExtractChapterImagesHelp": "Izločanje slik poglavij omogoča odjemalcem prikaz grafičnih menijev za izbor scene. Ta proces je lahko počasen, procesorsko zahteven in lahko potrebuje več gigabajtov prostora na disku. Teče ob odkritju novih videov in kot načrtovana naloga ponoči. Urnik izvajanja lahko nastavite v nastavitvah načrtovanih nalog. Zaganjanje tega procesa med urami visoke obremenitve ni priporočeno.", + "ExtractChapterImagesHelp": "Ekstrakcija slik poglavij omogoča odjemalcem prikaz grafičnih menijev za izbor scene. Ta proces je lahko počasen, procesorsko zahteven in lahko potrebuje več gigabajtov prostora na disku. Teče ob odkritju novih videov in kot načrtovana naloga ponoči. Urnik izvajanja lahko nastavite v nastavitvah načrtovanih nalog. Zaganjanje tega procesa med urami visoke obremenitve ni priporočeno.", "ExtraLarge": "Zelo veliko", "ExitFullscreen": "Izhod in celozaslonskega načina", "ErrorSavingTvProvider": "Prišlo je do težave pri shranjevanju TV ponudnika. Preverite ali je dostopen in poskusite znova.", @@ -466,17 +406,15 @@ "EnableStreamLooping": "Samodejno ponavljaj prenose v živo", "DropShadow": "Senca", "EveryNDays": "Vsakih {0} dni", - "ErrorMessageStartHourGreaterThanEnd": "Čas konca mora biti večji od časa začetka.", - "ErrorDeletingItem": "Prišlo je do težave pri brisanju predstavnosti s strežnika. Preverite ali ima Jellyfin strežnik dovoljenje za pisanje v mapi s predstavnostjo in poskusite znova.", + "ErrorStartHourGreaterThanEnd": "Čas konca mora biti večji od časa začetka.", + "ErrorDeletingItem": "Prišlo je do težave pri brisanju predstavnosti s strežnika. Preverite ali ima Jellyfin dovoljenje za pisanje v mapi s predstavnostjo in poskusite znova.", "ErrorAddingXmlTvFile": "Prišlo je do težave pri dostopu do XMLTV datoteke. Preverite ali datoteka obstaja in poskusite znova.", - "ErrorAddingMediaPathToVirtualFolder": "Prišlo je do težave pri dodajanju poti predstavnosti. Preverite ali je pot veljavna in da ima Jellyfin strežnik dovoljenja za dostop.", + "ErrorAddingMediaPathToVirtualFolder": "Prišlo je do težave pri dodajanju poti predstavnosti. Preverite ali je pot veljavna in da ima Jellyfin dovoljenja za dostop.", "Episodes": "Epizode", "EndsAtValue": "Konec ob {0}", "Ended": "Končano", "EnableThemeVideosHelp": "Predvajaj tematske videe v ozadju med brskanjem knjižnice.", - "EnableThemeVideos": "Tematski videi", "EnableThemeSongsHelp": "Predvajaj tematske pesmi v ozadju med brskanjem knjižnice.", - "EnableThemeSongs": "Glavne pesmi", "EnableStreamLoopingHelp": "Omogoči za prenose v živo ki vsebujejo zgolj nekaj sekund podatkov in jih je treba neprestano znova zahtevati. Če to ni potrebno lahko omogočanje povzroči težave.", "EnablePhotosHelp": "Fotografije bodo zaznane in prikazane skupaj z drugo predstavnostjo.", "EnablePhotos": "Prikaži fotografije", @@ -489,7 +427,6 @@ "EnableColorCodedBackgrounds": "Barvno usklajena ozadja", "EnableCinemaMode": "Kino način", "EnableBackdropsHelp": "Prikaži ozadja na nekaterih straneh med brskanjem knjižnice.", - "EnableBackdrops": "Ozadja", "EasyPasswordHelp": "Vaša enostavna PIN koda je uporabna za dostop brez povezave na podprtih napravah in za enostavno prijavo v lokalnem omrežju.", "Images": "Slike", "Identify": "Identificiraj", @@ -499,7 +436,6 @@ "HideWatchedContentFromLatestMedia": "Skrij ogledane vsebine iz razdelka Najnovejša predstavnost", "Hide": "Skrij", "Help": "Pomoč", - "HeadersFolders": "Mape", "HeaderYears": "Leta", "HeaderXmlSettings": "Xml nastavitve", "HeaderXmlDocumentAttributes": "Xml lastnosti dokumenta", @@ -516,14 +452,13 @@ "HeaderTuners": "Sprejemniki", "HeaderTunerDevices": "Sprejemniki", "LabelAllowHWTranscoding": "Dovoli strojno pospešeno prekodiranje", - "HeaderSelectTranscodingPathHelp": "Izberite ali vnesite pot za začasne datoteka prekodiranja. Mapa mora dovoliti zapisovanje.", + "HeaderSelectTranscodingPathHelp": "Prebrskajte ali vnesite pot za datoteka prekodiranja. Mapa mora dovoliti pisanje.", "HeaderContainerProfileHelp": "Profil kontejnerja določa omejitve naprave pri predvajanju določenih formatov. Če je omejitev dosežena, bo predstavnost prekodirana, tudi če je format sicer nastavljen za neposredno predvajanje.", "HeaderTranscodingProfileHelp": "Dodaj profil prekodiranja za izbiro uporabljenih formatov, ko je potrebno prekodiranje.", "HeaderTranscodingProfile": "Profil prekodiranja", "HeaderTracks": "Skladbe", "HeaderThisUserIsCurrentlyDisabled": "Ta uporabnik je trenutno onemogočen", "HeaderTaskTriggers": "Sprožilci opravil", - "HeaderTags": "Oznake", "HeaderSystemDlnaProfiles": "Sistemski profili", "HeaderSubtitleProfilesHelp": "Profili podnapisov določajo formate podnapisov, ki je naprava podpira.", "HeaderSubtitleProfiles": "Profili podnapisov", @@ -537,7 +472,6 @@ "HeaderSpecialEpisodeInfo": "Informacije o posebni epizodi", "HeaderSortOrder": "Vrstni red", "HeaderSortBy": "Razvrsti po", - "HeaderShutdown": "Ugasni", "HeaderSetupLibrary": "Nastavite vaše knjižnjice predstavnosti", "HeaderServerSettings": "Nastavitve strežnika", "HeaderSeriesStatus": "Status serije", @@ -545,7 +479,6 @@ "HeaderSendMessage": "Pošlji sporočilo", "HeaderSelectTranscodingPath": "Izberi pot začasnih datotek prekodiranja", "HeaderRevisionHistory": "Pregled zgodovine", - "HeaderFeatures": "Funkcije", "HeaderFeatureAccess": "Dostop funkcij", "HeaderDeviceAccess": "Dostop naprav", "HeaderContainerProfile": "Profil kontejnerja", @@ -559,14 +492,11 @@ "LabelAlbumArtMaxHeight": "Največja višina slike albuma:", "LabelAlbumArtMaxHeightHelp": "Največja ločljivost slike albuma dostopna preko UPnP:albumArtURI.", "LabelAudioBitDepth": "Bitna globina zvoka:", - "LabelAllowServerAutoRestart": "Dovoli, da se strežnik samodejno znova zažene in uveljavi posodobitve", - "LabelAllowServerAutoRestartHelp": "Strežnik se bo samodejno zagnal zgolj v času mirovanja, ko ne bo aktivnih uporabnikov.", "LabelAllowedRemoteAddresses": "Filter oddaljenih IP naslovov:", "LabelAllowedRemoteAddressesMode": "Način filtra oddaljenih IP naslovov:", "LabelAppName": "Ime aplikacije", "LabelAppNameExample": "Primer: Sickbeard, Sonarr", - "LabelArtistsHelp": "Loči več z ;", - "LabelAudio": "Zvok", + "LabelArtistsHelp": "Loči več izvajalcev s podpičjem.", "LabelAudioBitrate": "Bitna hitrost zvoka:", "LabelAudioChannels": "Kanali zvoka:", "LabelAudioCodec": "Zvočni kodek:", @@ -584,9 +514,7 @@ "LabelAirsAfterSeason": "Predvajanje po sezoni:", "LabelAirsBeforeSeason": "Predvajanje pred sezono:", "LabelAlbumArtists": "Izvajalci albuma:", - "LabelAll": "Vse", "LabelCustomRating": "Prilagojena ocena:", - "LabelDashboardTheme": "Tema nadzorne plošče strežnika:", "LabelBirthDate": "Datum rojstva:", "LabelCache": "Predpomnilnik:", "LabelCachePath": "Pot predpomnilnika:", @@ -598,13 +526,12 @@ "LabelCriticRating": "Ocena kritikov:", "LabelCustomCertificatePathHelp": "Pot do PKCS #12 datoteke, ki vsebuje certifikat in zasebni ključ, za omogočanje TLS povezave na domenah po meri.", "LabelCustomCss": "CSS po meri:", - "LabelCustomCssHelp": "Določite vaš lasten stil spletnega vmesnika.", - "LabelCustomDeviceDisplayName": "Prikazano ime:", + "LabelCustomCssHelp": "Uveljavite vaš lasten slog spletnega vmesnika.", "LabelCustomDeviceDisplayNameHelp": "Določi prikazano ime naprave. Pusti prazno za uporabo imena kot ga sporoči naprava sama.", "LabelDefaultScreen": "Privzeti zaslon:", "LabelDateAdded": "Datum dodajanja:", "LabelDateAddedBehavior": "Vedenje datuma dodajanja za nove vsebine:", - "LabelDateAddedBehaviorHelp": "V kolikor so prisotni ustrezni metapodatki bodo ti vedno uporabljeni najprej.", + "LabelDateAddedBehaviorHelp": "V kolikor so prisotni ustrezni metapodatki bodo ti vedno uporabljeni najprej.", "LabelDateTimeLocale": "Lokacija datuma/časa:", "LabelDefaultUser": "Privzeti uporabnik:", "LabelDeviceDescription": "Opis naprave", @@ -618,14 +545,13 @@ "LabelCollection": "Zbirka:", "LabelCustomCertificatePath": "Lokacija SSL certifikata po meri:", "LabelDidlMode": "DIDL način:", - "LabelDisplayMissingEpisodesWithinSeasons": "Prikaži manjkajoče epizode znotraj sezon", "LabelDay": "Dan:", "LabelDeathDate": "Datum smrti:", "LabelBitrate": "Bitna hitrost:", - "LabelBlastMessageInterval": "Interval sporočila o dostopnosti (sekunde)", + "LabelBlastMessageInterval": "Interval sporočila o dostopnosti", "LabelDefaultUserHelp": "Določi knjižnica katerega uporabnika bo prikazana na povezanih napravah. To lahko preglasite s profili za posamezno napravo.", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Določi trajanje v sekundah med SSDP iskanji, ki jih izvede Jellyfin.", - "LabelEnableDlnaClientDiscoveryInterval": "Interval odkrivanja sprejemnikov (sekunde)", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Določi trajanje v sekundah med SSDP iskanji.", + "LabelEnableDlnaClientDiscoveryInterval": "Interval odkrivanja odjemalcev", "LabelEnableBlastAliveMessagesHelp": "Omogočite, če imajo UPnP naprave težave z zaznavanjem strežnika v omrežju.", "LabelEnableBlastAliveMessages": "Oddajaj sporočila o dostopnosti", "LabelEnableAutomaticPortMapHelp": "Avtomatično posreduje javna vrata na vašem usmerjevalnuku z lokalnimi vrati strežnika preko UPnP. To ne deluje z nekaterimi usmerjevalniki ali omrežnimi nastavitvami. Spremembe bodo uveljavljene po ponovnem zagonu strežnika.", @@ -640,10 +566,10 @@ "LabelDisplayOrder": "Vrstni red prikaza:", "LabelDisplayName": "Prikazano ime:", "LabelDisplayMode": "Način prikaza:", - "LabelBindToLocalNetworkAddressHelp": "Neobvezno. Preglasi lokalni IP naslov za povezavo s HTTP strežnikom. V kolikor pustite prazno se strežnik poveže z vsemi možnimi naslovi. Sprememba vrednosti zahteva ponovni zagon Jellyfin strežnika.", + "LabelBindToLocalNetworkAddressHelp": "Preglasi lokalni IP naslov za HTTP strežnik. V kolikor pustite prazno se strežnik poveže z vsemi možnimi naslovi. Sprememba vrednosti zahteva ponovni zagon.", "InstallingPackage": "Nameščanje {0} (različica {1})", - "ImportMissingEpisodesHelp": "Če je omogočeno, bodo podatki o manjkajočih epizodah dodani v Jellyfin bazo podatkov in prikazani znotraj sezon in serij. To lahko občutno podaljša uvoz v knjižnjico.", - "ImportFavoriteChannelsHelp": "Če je omogočeno, bodo uvoženi zgolj kanali, ki so na sprejemniku označeni kot priljubljeni.", + "ImportMissingEpisodesHelp": "Podatki o manjkajočih epizodah bodo dodani v bazo podatkov in prikazani znotraj sezon in serij. To lahko občutno podaljša čas uvoza v knjižnjico.", + "ImportFavoriteChannelsHelp": "Uvoženi bodo zgolj programi, ki so na sprejemniku označeni kot priljubljeni.", "LabelEnableDlnaServerHelp": "Omogoči UPnP napravam v omrežju da brskajo in predvajajo vsebine.", "LabelFolder": "Mapa:", "LabelIconMaxWidth": "Največja širina ikon:", @@ -662,9 +588,9 @@ "LabelHardwareAccelerationTypeHelp": "Strojno pospeševanje zahteva dodatno konfiguracijo.", "LabelHomeNetworkQuality": "Kvaliteta v domačem omrežju:", "LabelHttpsPort": "Lokalna HTTPS vrata:", - "LabelHttpsPortHelp": "Vrata TCP s katerimi se poveže Jellyfin HTTPS strežnik.", + "LabelHttpsPortHelp": "Vrata TCP za HTTPS strežnik.", "LabelLocalHttpServerPortNumber": "Lokalna HTTP vrata:", - "LabelLocalHttpServerPortNumberHelp": "Vrata TCP s katerimi se poveže Jellyfin HTTP strežnik.", + "LabelLocalHttpServerPortNumberHelp": "Vrata TCP za HTTP strežnik.", "LabelLockItemToPreventChanges": "Zakleni ta element in prepreči spreminjanje v prihodnosti", "LabelMetadataReadersHelp": "Uredi želene lokalne vire metapodatkov po prioriteti. Uporabljena bo prva najdena datoteka.", "LabelMinResumeDuration": "Najkrajša dolžina za nadaljevanje:", @@ -674,7 +600,7 @@ "LabelEnableDlnaDebugLogging": "Omogoči beleženje napak DLNA", "LabelEnableDlnaDebugLoggingHelp": "Ustvari podrobne dnevnike dogodkov. Uporabi zgolj za potrebe odpravljanja težav.", "LabelEnableDlnaPlayTo": "Omogoči DLNA predvajanje na", - "LabelEnableDlnaPlayToHelp": "Zaznaj naprave znotraj omrežja in omogoči upravljanje z njimi.", + "LabelEnableDlnaPlayToHelp": "Zaznaj naprave znotraj omrežja in omogoči oddaljeno upravljanje z njimi.", "LabelEnableDlnaServer": "Omogoči DLNA strežnik", "LabelEnableHardwareDecodingFor": "Omogoči strojno pospešeno predvajanje za:", "LabelEnableRealtimeMonitor": "Omogoči spremljanje v realnem času", @@ -687,7 +613,7 @@ "LabelBaseUrl": "Osnovni URL:", "LabelExtractChaptersDuringLibraryScan": "Izvleči slike poglavij med preiskovanjem knjižnjice", "LabelFormat": "Format:", - "LabelServerNameHelp": "To ime bo uporabljeno za identifikacijo strežnika in je privzeto enako imenu računalnika.", + "LabelServerNameHelp": "To ime bo uporabljeno za identifikacijo strežnika in je privzeto enako imenu strežnika.", "LabelGroupMoviesIntoCollectionsHelp": "Pri prikazovanju seznama filmov bodo filmi iz iste zbirke prikazani kot en združen element.", "LabelH264Crf": "H264 kodiranje CRF:", "LabelIconMaxHeight": "Največja višina ikone:", @@ -733,16 +659,16 @@ "LabelMonitorUsers": "Spremljaj aktivnost iz:", "LabelMovieCategories": "Kategorije filmov:", "LabelMoviePrefix": "Predpona filma:", - "LabelMovieRecordingPath": "Pot za snemanje filmov (neobvezno):", + "LabelMovieRecordingPath": "Pot za snemanje filmov:", "LabelMusicStreamingTranscodingBitrate": "Bitna hitrost pretvarjanja glasbe:", - "LabelMusicStreamingTranscodingBitrateHelp": "Določi največjo bitno hitrost pretakanja glasbe.", + "LabelMusicStreamingTranscodingBitrateHelp": "Določite največjo bitno hitrost pretakanja glasbe.", "LabelName": "Ime:", "LabelFriendlyName": "Uporabniku prijazno ime:", "LabelKodiMetadataEnablePathSubstitutionHelp": "Omogoči zamenjavo poti za poti slik glede na nastavitve zamenjave poti strežnika.", "LabelKodiMetadataSaveImagePaths": "Shrani poti slik znotraj nfo datotek", "LabelMetadataDownloadersHelp": "Omogoči in uredi želene vire metapodatkov po prioriteti. Viri z nižjo prioriteto bodo uporabljeni zgolj za dopolnjevanje manjkajočih informacij.", - "LabelBaseUrlHelp": "Doda podnaslov po meri na konec URL-ja strežnika. Na primer: http://example.com/<baseurl>", - "LabelExtractChaptersDuringLibraryScanHelp": "Ustvari slike poglavij med uvozom videov pri preiskovanju knjižnjice. Sicer bodo ustvarjene med načrtovanim opravilom, kar omogoča hitrejše preiskovanje knjižnjice.", + "LabelBaseUrlHelp": "Dodjte podnaslov po meri na konec URL-ja strežnika. Na primer: http://example.com/<baseurl>", + "LabelExtractChaptersDuringLibraryScanHelp": "Ustvari slike poglavij med uvozom videov pri preiskovanju knjižnjice. Sicer bodo ustvarjene med načrtovanim opravilom ekstrakcije slik, kar omogoča hitrejše preiskovanje knjižnjice.", "LabelForgotPasswordUsernameHelp": "Vpišite svoje uporabniško ime, v kolikor se ga spomnite.", "LabelInNetworkSignInWithEasyPasswordHelp": "Uporabi enostavno PIN kodo za prijavo v naprave znotraj lokalnega omrežja. Vaše geslo bo potrebno zgolj za prijave zunaj domačega omrežja. Če pustite prazno, za prijavo v domačem omrežju omrežju ne boste potrebovali gesla.", "LabelMaxStreamingBitrate": "Največja kvaliteta pretakanja:", @@ -752,14 +678,12 @@ "LabelMoviePrefixHelp": "Če naslovi filmov vsebujejo predpono, jo vnesite tukaj da jo lahko strežnik pravilno obdela.", "LabelNewName": "Novo ime:", "Raised": "Dvignjeni", - "TabCollections": "Zbirke", "Small": "Majhno", "SmartSubtitlesHelp": "Podnapisi, ki se ujemajo z želenim jezikom, bodo naloženi, ko je zvok v tujem jeziku.", "SubtitleAppearanceSettingsDisclaimer": "Te nastavitve ne vplivajo na grafične podnapise (PGS, DVD, itd.) ali ASS/SSA podnapise, ki imajo vdelan svoj lasten slog.", - "PluginInstalledMessage": "Dodatek je bil uspešno nameščen. Za uveljavitev sprememb je potreben ponovni zagon Jellyfin strežnika.", + "MessagePluginInstalled": "Dodatek je bil uspešno nameščen. Za uveljavitev sprememb je potreben ponovni zagon strežnika.", "MessageNoMovieSuggestionsAvailable": "Trenutno ni na voljo nobenih predlogov za filme. Začnite gledati in ocenjevati vaše filme, ter se nato vrnite sem in si oglejte predloge.", "LabelSelectFolderGroups": "Samodejno združi vsebine iz spodnjih map v poglede kot so Filmi, Glasba in TV:", - "TabPlayback": "Predvajanje", "TitlePlayback": "Predvajanje", "MessagePasswordResetForUsers": "Gesla naslednjih uporabnikov so bila ponastavljena. Zdaj se lahko prijavijo s PIN kodami, ki so bile uporabljene za ponastavitev.", "OptionHideUserFromLoginHelp": "Koristno za zasebne ali skrite skrbniške račune. Uporabnik se bo moral prijaviti ročno z vpisom svojega uporabniškega imena in gesla.", @@ -768,7 +692,6 @@ "LabelDropShadow": "Senca:", "LabelHomeScreenSectionValue": "Razdelek domačega zaslona {0}:", "LabelPreferredSubtitleLanguage": "Prednostni jezik podnapisov:", - "NoSubtitles": "Nič", "OnlyImageFormats": "Samo slikovni formati (VOBSUB, PGS, SUB)", "OnlyForcedSubtitles": "Samo prisiljeni", "OptionAllowAudioPlaybackTranscoding": "Dovoli predvajanje zvoka, ki zahteva prekodiranje", @@ -795,7 +718,7 @@ "MessagePlayAccessRestricted": "Predvajanje te vsebine je trenutno omejeno. Za več informacij se obrnite na skrbnika strežnika.", "NoSubtitlesHelp": "Podnapisi se privzeto ne bodo naložili. Med predvajanjem jih lahko še vedno ročno vklopite.", "MessagePluginConfigurationRequiresLocalAccess": "Za nastavitev tega dodatka se prosimo prijavite neposredno na vaš lokalni strežnik.", - "OptionAllowMediaPlaybackTranscodingHelp": "Omejitev dostopa do prekodiranja lahko povzroči napake pri predvajanju v Jellyfin aplikacijah zaradi nepodprtih formatov predstavnosti.", + "OptionAllowMediaPlaybackTranscodingHelp": "Omejitev dostopa do prekodiranja lahko povzroči napake pri predvajanju v odjemalcih zaradi nepodprtih formatov predstavnosti.", "OptionAllowVideoPlaybackRemuxing": "Dovoli predvajanje videoposnetkov, ki zahtevajo pretvarjanje brez prekodiranja", "ViewPlaybackInfo": "Oglejte si informacije o predvajanju", "WizardCompleted": "To je vse kar potrebujemo za zdaj. Jellyfin je začel zbirati informacije o vaši knjižnici predstavnosti. Oglejte si nekaj naših aplikacij in nato kliknite Zaključi za ogled Nadzorne plošče.", @@ -810,18 +733,15 @@ "Smart": "Pametno", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Te nastavitve veljajo tudi za predvajanja Chromecast, ki jih začne ta naprava.", "TabDashboard": "Nadzorna plošča", - "TabLiveTV": "TV v živo", "PinCodeResetConfirmation": "Ali ste prepričani, da želite ponastaviti PIN kodo?", "PreferEmbeddedTitlesOverFileNames": "Prioritiziraj vdelane naslove pred imeni datotek", "PreferEmbeddedTitlesOverFileNamesHelp": "To vpliva na privzeto prikazan naslov, ko ni na voljo internetnih ali lokalnih metapodatkov.", "Rate": "Oceni", "RecentlyWatched": "Nedavno ogledano", "RecommendationBecauseYouLike": "Ker vam je všeč {0}", - "OptionSunday": "Nedelja", "OptionTvdbRating": "TVDB ocena", "OptionUnairedEpisode": "Nepredvajane epizode", "PleaseEnterNameOrId": "Prosimo vnesite ime ali zunanji ID.", - "OptionWednesday": "Sreda", "OptionWeekends": "Vikendi", "Previous": "Prejšnji", "People": "Ljudje", @@ -830,8 +750,8 @@ "OptionReportByteRangeSeekingWhenTranscoding": "Sporoči, da strežnik podpira iskanje po bajtih pri prekodiranju", "Quality": "Kvaliteta", "PlaceFavoriteChannelsAtBeginning": "Postavi priljubljene kanale na začetek", - "LabelOptionalNetworkPath": "(Neobvezno) Omrežna mapa:", - "LabelOptionalNetworkPathHelp": "V primeru, da je mapa deljena v vašem omrežju, lahko Jellyfin deli omrežno pot z ostalimi napravami in jim omogoči neposreden dostop do vsebin. Na primer {0} ali {1}.", + "LabelOptionalNetworkPath": "Omrežna mapa v skupni rabi:", + "LabelOptionalNetworkPathHelp": "V primeru, da je ta mapa deljena v vašem omrežju, lahko Jellyfin deli omrežno pot z ostalimi napravami in jim omogoči neposreden dostop do vsebin. Na primer {0} ali {1}.", "LabelRemoteClientBitrateLimitHelp": "Neobvezna omejitev bitne hitrosti na posamezno predvajanje za vse naprave izven domačega omrežja. S tem lahko preprečite, da bi naprave zahtevale višjo bitno hitrost predvajanja, kot jo lahko prenese vaše omrežje. To lahko poveča obremenitev CPU-ja, saj bo morda potrebno sprotno prekodiranje za zmanjšanje bitne hitrosti.", "LanNetworksHelp": "Z vejico ločen seznam IP naslovov ali IP/maska omrežji, ki bodo upoštevana kot lokalna pri uveljavljanju omejitev pasovne širine. Če nastavite, se bodo vsi ostali naslovi upoštevali kot zunanji in bodo predmet omejitve pasovne širine. Če pustite prazno, bo kot lokalno omrežje upoštevano zgolj omrežje strežnika.", "MessageForgotPasswordInNetworkRequired": "Za začetek ponastavitve gesla prosimo poskusite znova v vašem domačem omrežju.", @@ -841,7 +761,7 @@ "PleaseConfirmPluginInstallation": "Prosimo kliknite OK, da potrdite, da se strinjate z zgoraj napisanim in želite nadaljevati z namestitvijo dodatka.", "Programs": "Programi", "LabelTunerIpAddress": "IP naslov TV/radio sprejemnika:", - "PleaseRestartServerName": "Prosimo ponovno zaženite Jellyfin strežnik - {0}.", + "PleaseRestartServerName": "Prosimo ponovno zaženite Jellyfin na {0}.", "ProductionLocations": "Kraj produkcije", "OptionAllowRemoteSharedDevices": "Dovoli daljinsko upravljanje skupnih naprav", "OptionAllowRemoteSharedDevicesHelp": "DLNA naprave veljajo za skupne, dokler jih ne začne nadzirati uporabnik.", @@ -850,22 +770,20 @@ "TabNetworking": "Omrežje", "OptionSaveMetadataAsHiddenHelp": "Spreminjanje tega bo veljalo za metapodatke shranjene v prihodnje. Obstoječi metapodatki bodo posodobljeni, ko jih bo strežnik naslednjič spremenil.", "OptionSubstring": "Podniz", - "OptionThursday": "Četrtek", "OptionTrackName": "Ime skladbe", - "OptionTuesday": "Torek", "OptionWakeFromSleep": "Prebudi iz spanja", "OptionWeekdays": "Delovni dnevi", "OptionWeekly": "Tedensko", "OriginalAirDateValue": "Prvotni datum predvajanja: {0}", "Overview": "Pregled", - "PackageInstallCancelled": "{0} namestitev preklicana.", - "PackageInstallCompleted": "{0} namestitev uspešna.", - "PackageInstallFailed": "{0} namestitev neuspešna.", + "PackageInstallCancelled": "{0} (različica {1}) namestitev preklicana.", + "PackageInstallCompleted": "{0} (različica {1}) namestitev uspešna.", + "PackageInstallFailed": "{0} (različica {1}) namestitev neuspešna.", "PasswordMatchError": "Geslo in potrditev gesla se moreta ujemati.", "PasswordResetComplete": "Geslo je bilo ponastavljeno.", "PasswordResetConfirmation": "Ali ste prepričani, da želite ponastaviti geslo?", - "PasswordResetHeader": "Ponastavi geslo", - "PasswordResetProviderHelp": "Izberite ponudnika ponastavitve gesla, ki bo uporabljen, ko bo ta uporabnik zahteval ponastavitev gesla", + "HeaderResetPassword": "Ponastavi geslo", + "PasswordResetProviderHelp": "Izberite ponudnika ponastavitve gesla, ki bo uporabljen, ko bo ta uporabnik zahteval ponastavitev gesla.", "PasswordSaved": "Geslo shranjeno.", "PerfectMatch": "Popolno ujemanje", "PictureInPicture": "Slika v sliki", @@ -879,13 +797,10 @@ "PleaseSelectTwoItems": "Prosimo izberite vsaj dva elementa.", "Premieres": "Premiere", "Producer": "Producent", - "QueueAllFromHere": "Dodaj vse tukaj v čakalno vrsto", "Premiere": "Premiera", "OptionRuntime": "Trajanje", - "OptionSaturday": "Sobota", "MediaInfoLayout": "Razporeditev", "Like": "Všeč mi je", - "LinksValue": "Povezave: {0}", "LabelPlayDefaultAudioTrack": "Predvajaj privzeti zvočni posnetek ne glede na jezik", "LabelOriginalTitle": "Izvirni naslov:", "LabelRefreshMode": "Način osveževanja:", @@ -898,7 +813,7 @@ "MediaInfoExternal": "Zunanji", "Refresh": "Osveži", "MetadataManager": "Upravitelj metapodatkov", - "MetadataSettingChangeHelp": "Spreminjanje nastavitev metapodatkov bo vplivalo na nove vsebine. Za osvežitev obstoječih vsebin, odprite okno s podrobnostmi in kliknite gumb Osveži, ali množično osvežite metapodatke z upraviteljem metapodatkov.", + "MetadataSettingChangeHelp": "Spreminjanje nastavitev metapodatkov bo vplivalo na novo dodane vsebine. Za osvežitev obstoječih vsebin, odprite okno s podrobnostmi in kliknite gumb Osveži, ali množično osvežite metapodatke z upraviteljem metapodatkov.", "RefreshMetadata": "Osveži metapodatke", "RefreshQueued": "Osvežitev v čakalni vrsti.", "Shuffle": "Premešaj", @@ -911,7 +826,6 @@ "LabelProtocol": "Protokol:", "LabelProfileVideoCodecs": "Video kodeki:", "LabelProfileCodecsHelp": "Ločeno z vejico. Če pustite prazno, velja za vse kodeke.", - "LabelPreferredDisplayLanguageHelp": "Prevajanje Jellyfin je projekt v teku.", "LabelPleaseRestart": "Spremembe bodo začele veljati po ročni osvežitvi spletnega vmesnika.", "LabelPlaylist": "Seznam predvajanja:", "LabelPlaceOfBirth": "Kraj rojstva:", @@ -922,7 +836,7 @@ "LabelPasswordResetProvider": "Ponudnik ponastavitve gesla:", "LabelPasswordConfirm": "Potrditev gesla:", "LabelPassword": "Geslo:", - "OptionDisableUserHelp": "Če onemogočite strežnik ne bo dovolil povezav od tega uporabnika. Obstoječe povezave bodo prekinjene.", + "OptionDisableUserHelp": "Strežnik ne bo dovolil nobenih povezav od tega uporabnika. Obstoječe povezave bodo prekinjene.", "OptionDescending": "Padajoče", "OptionDatePlayed": "Datum predvajanja", "OptionDateAddedImportTime": "Uporabi datum dodajanja v knjižnico", @@ -941,24 +855,22 @@ "OptionBlockMovies": "Filmi", "OptionBlockBooks": "Knjige", "OptionBanner": "Pasica", - "OptionAutomaticallyGroupSeriesHelp": "Če je omogočeno, bodo serije, ki so razdeljene v več mapah znotraj knjižnice samodejno združene v eno serijo.", + "OptionAutomaticallyGroupSeriesHelp": "Serije, ki so razdeljene v več mapah znotraj knjižnice bodo samodejno združene v eno serijo.", "OptionAutomaticallyGroupSeries": "Samodejno združi serije, ki so razdeljene po več mapah", "OptionAscending": "Naraščajoče", "OptionArtist": "Izvajalec", "OptionAllowUserToManageServer": "Dovoli temu uporabniku upravljanje strežnika", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Naslednja mesta predstavnosti bodo odstranjena iz vaše knjižnice:", - "MessageSettingsSaved": "Nastavitve so bile shranjene.", - "MessagePluginInstallDisclaimer": "Dodatki ustvarjeni s strani članov Jellyfin skupnosti so odličen način za izboljšanje vaše izkušnje z Jellyfin z dodatnimi funkcijami in prednostmi. Preden namestite dodatke se zavedajte, da imajo lahko ti različne vplive na vaš Jellyfin strežnik, kot na primer počasnejše preiskovanje knjižnic, dodatna obdelava podatkov v ozadju in zmanjšana stabilnost sistema.", + "MessagePluginInstallDisclaimer": "Dodatki ustvarjeni s strani članov skupnosti so odličen način za izboljšanje vaše izkušnje z dodatnimi funkcijami in prednostmi. Preden namestite dodatke se zavedajte, da imajo lahko ti različne vplive na vaš strežnik, kot na primer počasnejše preiskovanje knjižnic, dodatna obdelava podatkov v ozadju in zmanjšana stabilnost sistema.", "MessagePleaseWait": "Prosimo, počakajte. To lahko traja nekaj minut.", "MessagePleaseEnsureInternetMetadata": "Prosimo poskrbite, da je prenašanje spletnih metapodatkov omogočeno.", "MessageNothingHere": "Tu ni nič.", - "MessageNoTrailersFound": "Napovednikov ni bilo mogoče najti. Namestite kanal napovednikov in izboljšajte svojo filmsko izkušnjo s knjižnico spletnih napovednikov.", + "MessageNoTrailersFound": "Namestite kanal napovednikov in izboljšajte svojo knjižnico z dodajanjem spletnih napovednikov.", "MessageNoServersAvailable": "Z samodejnim odkrivanjem strežnikov ni bilo mogoče najti nobenega strežnika.", "MessageNoPluginsInstalled": "Nameščenih nimate nobenih dodatkov.", "MessageNoAvailablePlugins": "Dodatki niso na voljo.", "MessageInvalidUser": "Napačno uporabniško ime ali geslo. Prosimo poskusite znova.", "MessageInvalidForgotPasswordPin": "Vnesena je bila napačna ali pretečena PIN koda. Prosimo, poskusite znova.", - "MessageInstallPluginFromApp": "Ta dodatek mora biti nameščen znotraj aplikacije, v kateri ga nameravate uporabljati.", "MessageImageTypeNotSelected": "Prosimo izberite tip slike v spustnem meniju.", "MessageImageFileTypeAllowed": "Podprte so zgolj JPEG in PNG datoteke.", "MessageForgotPasswordFileCreated": "Sledeča datoteka je bila ustvarjena na vašem strežniku in vsebuje navodila za nadaljevanje:", @@ -966,13 +878,13 @@ "MessageEnablingOptionLongerScans": "Če omogočite to možnost, se lahko trajanje preiskovanja knjižnic občutno podaljša.", "MessageDownloadQueued": "Prenos na čakanju.", "MessageDirectoryPickerLinuxInstruction": "Za Linux na sistemu Arch Linux, CentOS, Debian, Fedora, openSUSE ali Ubuntu morate uporabniku storitve dodeliti vsaj dovoljenje za branje vaših shramb.", - "MessageDirectoryPickerBSDInstruction": "Za BSD boste morda morali nastaviti shrambo znotraj vašega FreeNAS Jail-a, da omogočite Jellyfin dostop.", + "MessageDirectoryPickerBSDInstruction": "Za BSD boste morda morali nastaviti shrambo znotraj vašega FreeNAS Jail-a, da omogočite Jellyfin dostop do predstavnosti.", "MessageDeleteTaskTrigger": "Ali ste prepričani, da želite izbrisati ta sprožilec opravil?", "MessageCreateAccountAt": "Ustvarite račun pri {0}", "MessageContactAdminToResetPassword": "Za ponastavitev gesla se obrnite na skrbnika sistema.", "MessageConfirmShutdown": "Ali ste prepričani, da želite zaustaviti strežnik?", - "MessageConfirmRevokeApiKey": "Ali ste prepričani, da želite razveljaviti ta API ključ? Povezava aplikacije z Jellyfin strežnikom bo nenadoma prekinjena.", - "MessageConfirmRestart": "Ali ste prepričani, da želite ponovno zagnati Jellyfin strežnik?", + "MessageConfirmRevokeApiKey": "Ali ste prepričani, da želite razveljaviti ta API ključ? Povezava aplikacije s strežnikom bo nenadoma prekinjena.", + "MessageConfirmRestart": "Ali ste prepričani, da želite ponovno zagnati Jellyfin?", "MessageConfirmRemoveMediaLocation": "Ali ste prepričani, da želite odstraniti to mesto?", "MessageConfirmRecordingCancellation": "Prekliči snemanje?", "MessageConfirmProfileDeletion": "Ali ste prepričani, da želite izbrisati ta profil?", @@ -988,14 +900,13 @@ "MediaInfoStreamTypeEmbeddedImage": "Vdelana sličica", "MediaInfoStreamTypeData": "Podatki", "MediaInfoStreamTypeAudio": "Zvok", - "MediaInfoSoftware": "Programska oprema", "MediaInfoTimestamp": "Časovni žig", "MediaInfoSize": "Velikost", "MediaInfoSampleRate": "Vzorčna hitrost", "MediaInfoResolution": "Ločljivost", "MediaInfoRefFrames": "Ref sličice", "MediaInfoProfile": "Profil", - "MediaInfoPixelFormat": "Format pik", + "MediaInfoPixelFormat": "Format pikslov", "MediaInfoPath": "Pot", "MediaInfoLevel": "Stopnja", "MediaInfoInterlaced": "Prepleteno", @@ -1035,7 +946,7 @@ "LabelVersion": "Različica:", "LabelSelectVersionToInstall": "Izberite različico za namestitev:", "Never": "Nikoli", - "ServerUpdateNeeded": "Jellyfin strežnik je potrebno posodobiti. Za prenos najnovejše različice prosimo obiščite {0}", + "ServerUpdateNeeded": "Ta strežnik je potrebno posodobiti. Za prenos najnovejše različice prosimo obiščite {0}", "LatestFromLibrary": "Najnovejši {0}", "LabelScheduledTaskLastRan": "Nazadnje zagnano {0}. Čas trajanja {1}.", "OptionRandom": "Naključno", @@ -1044,9 +955,7 @@ "OptionProfileAudio": "Zvok", "OptionPremiereDate": "Datum premiere", "OptionOnInterval": "V intervalu", - "OptionOnAppStartup": "Ob zagonu aplikacije", "OptionNew": "Novo…", - "OptionMonday": "Ponedeljek", "OptionMissingEpisode": "Manjkajoče epizode", "OptionLoginAttemptsBeforeLockoutHelp": "Vrednost nič (0) pomeni 3 poskuse za običajne uporabnike in 5 za skrbnike. Nastavite na -1 za onemogočanje te funkcije.", "OptionLoginAttemptsBeforeLockout": "Določa število spodletelih poskusov prijave pred zaklenitvijo uporabnika.", @@ -1056,12 +965,11 @@ "OptionHomeVideos": "Slike", "OptionHideUser": "Skrij tega uporabnika z vstopne strani", "OptionHasTrailer": "Napovednik", - "OptionFriday": "Petek", "OptionEveryday": "Vsak dan", "OptionDvd": "DVD", "OptionDownloadMenuImage": "Meni", "OptionDownloadLogoImage": "Logotip", - "OptionDownloadImagesInAdvanceHelp": "Privzeto se večina slik prenese šele, ko jih zahtevajo aplikacije. Omogočite to možnost za prenos slik vnaprej, pri uvozu predstavnosti. To lahko občutno podaljša preiskovanje knjižnice.", + "OptionDownloadImagesInAdvanceHelp": "Privzeto se večina slik prenese šele, ko jih zahtevajo odjemalci. Omogočite to možnost za prenos slik vnaprej, pri uvozu predstavnosti. To lahko občutno podaljša preiskovanje knjižnic.", "OptionDownloadImagesInAdvance": "Prenesi slike vnaprej", "OptionAllowSyncTranscoding": "Dovoli prenašanje in sinhronizacijo predstavnosti ki zahteva pretvarjanje", "OptionAllowRemoteControlOthers": "Dovoli daljinsko upravljanje drugih uporabnikov", @@ -1074,7 +982,7 @@ "OptionAdminUsers": "Skrbniki", "Option3D": "3D", "NumLocationsValue": "{0} mape", - "NoPluginConfigurationMessage": "Ta dodatek nima nobenih nastavitev.", + "MessageNoPluginConfiguration": "Ta dodatek nima nobenih nastavitev.", "No": "Ne", "News": "Novice", "NewEpisodesOnly": "Samo nove epizode", @@ -1086,26 +994,24 @@ "Mute": "Utišaj", "MoveLeft": "Premakni levo", "MoveRight": "Premakni desno", - "LabelSkin": "Preobleka:", "LabelSize": "Velikost:", "LabelSimultaneousConnectionLimit": "Omejitev števila sočasnih predvajanj:", "LabelServerName": "Ime strežnika:", "LabelServerHostHelp": "192.168.1.100:8096 ali https://myserver.com", "LabelServerHost": "Naslov:", - "LabelSeriesRecordingPath": "Pot za snemanje serij (neobvezno):", + "LabelSeriesRecordingPath": "Pot za snemanje serij:", "LabelSerialNumber": "Serijska številka", "LabelSendNotificationToUsers": "Pošlji obvestilo na:", "LabelSeasonNumber": "Številka sezone:", "LabelScreensaver": "Ohranjevalnik zaslona:", "LabelSaveLocalMetadataHelp": "Shranjevanje slik v mape predstavnosti omogoča lažji dostop in urejanje slik.", "LabelSaveLocalMetadata": "Shrani slike v mape predstavnosti", - "LabelRuntimeMinutes": "Čas trajanja (minute):", + "LabelRuntimeMinutes": "Čas trajanja:", "LabelRemoteClientBitrateLimit": "Omejitev bitne hitrosti pretakanja preko interneta (Mbps):", "LabelRecordingPathHelp": "Določite privzeto lokacijo za shranjevanje posnetkov. Če pustite prazno, bo uporabljena mapa namestitve strežnika.", "LabelRecordingPath": "Privzeta pot posnetkov:", "LabelRecord": "Snemaj:", "LabelReasonForTranscoding": "Razlog za prekodiranje:", - "LabelReadHowYouCanContribute": "Naučite se, kako lahko prispevate.", "LabelPublicHttpsPortHelp": "Številka javnih vrat ki bodo povezana na lokalna HTTPS vrata.", "LabelPublicHttpsPort": "Številka javnih HTTPS vrat:", "LabelPublicHttpPortHelp": "Številka javnih vrat ki bodo povezana na lokalna HTTP vrata.", @@ -1125,7 +1031,6 @@ "LabelNumberOfGuideDays": "Število dni vodiča za prenos:", "LabelNumber": "Številka:", "LabelNotificationEnabled": "Omogoči to obvestilo", - "CopyStreamURLError": "Pri kopiranju naslova URL je prišlo do napake.", "AskAdminToCreateLibrary": "Prosite skrbnika, da ustvari knjižnico.", "AllowFfmpegThrottlingHelp": "Ko je prekodiranja dovolj pred mestom predvajanja se proces ustavi, da bo porabljal manj sredstev. To je najbolj uporabno pri gledanju brez pogostega premikanja mesta predvajanja. Če naletite na težave s predvajanjem onemogočite to možnost.", "AllowFfmpegThrottling": "Zaviraj prekodiranje", @@ -1136,24 +1041,19 @@ "LabelStartWhenPossible": "Začni, ko je mogoče:", "LabelSportsCategories": "Športne kategorije:", "LabelSource": "Vir:", - "LabelSoundEffects": "Zvočni učinki:", "LabelSkipIfGraphicalSubsPresentHelp": "Ohranjanje besedilnih različic podnapisov omogoča učinkovitejše predvajanje in zmanjša potrebo po prekodiranju.", "LabelTriggerType": "Tip sprožilca:", - "LabelTranscodingVideoCodec": "Video kodek:", "LabelTranscodingProgress": "Napredek prekodiranja:", "LabelTranscodingFramerate": "Hitrost prekodiranja:", "LabelTranscodes": "Prekodiranje:", "LabelTranscodingTempPathHelp": "Določite pot po meri za datoteke prekodiranja. Pustite prazno za uporabo privzete lokacije.", "LabelTranscodePath": "Pot prekodiranja:", - "LabelTranscodingContainer": "Kontejner:", - "LabelTranscodingAudioCodec": "Zvočni kodek:", "LabelTrackNumber": "Številka skladbe:", "LabelTime": "Čas:", "LabelTextColor": "Barva besedila:", "LabelTextBackgroundColor": "Barva ozadja besedila:", "LabelTag": "Oznaka:", "LabelSupportedMediaTypes": "Podprti tipi predstavnosti:", - "LabelSubtitles": "Podnapisi", "LabelSubtitlePlaybackMode": "Način podnapisov:", "LabelSubtitleFormatHelp": "Primer: srt", "LabelSubtitleDownloaders": "Pridobivanje podnapisov:", @@ -1184,19 +1084,14 @@ "Trailers": "Napovedniki", "TitleHardwareAcceleration": "Strojno pospeševanje", "Thursday": "Četrtek", - "TabUsers": "Uporabniki", - "TabTrailers": "Napovedniki", "ClientSettings": "Nastavitve odjemalca", "ButtonTogglePlaylist": "Seznam predvajanja", - "ButtonToggleContextMenu": "Več", "Artist": "Izvajalec", "AlbumArtist": "Izvajalec albuma", "Album": "Album", "LibraryAccessHelp": "Izberite knjižnice, ki bodo deljenje s tem uporabnikom. Upravitelji bodo lahko urejali metapodatke z upraviteljem metapodatkov.", "LeaveBlankToNotSetAPassword": "To polje lahko pustite prazno za uporabo brez gesla.", "LearnHowYouCanContribute": "Poglejte, kako lahko pomagate.", - "LaunchWebAppOnStartupHelp": "Ob prvem zagonu strežnika se bo v privzetem brskalniku odprl spletni vmesnik. To se ne bo zgodilo pri uporabi možnosti za ponovni zagon.", - "LaunchWebAppOnStartup": "Ob zagonu strežnika zaženi spletni vmesnik", "LabelffmpegPathHelp": "Pot do datoteke aplikacije ffmpeg ali mape, ki jo vsebuje.", "LabelffmpegPath": "Pot FFmpeg:", "LabelZipCode": "Poštna številka:", @@ -1263,10 +1158,9 @@ "HeaderRemoteAccessSettings": "Nastavitve oddaljenega dostopa", "HeaderOtherItems": "Ostale vsebine", "HeaderNavigation": "Navigacija", - "HeaderItems": "Vsebine", "EnableDecodingColorDepth10Vp9": "Omogoči strojno dekodiranje za 10-bit VP9", "EnableDecodingColorDepth10Hevc": "Omogoči strojno dekodiranje za 10-bit HEVC", - "LabelEnableHttpsHelp": "Omogoči strežniku, da posluša na nastavljenih HTTPS vratih. Za uveljavitev te možnosti mora biti nastavljen tudi veljaven certifikat.", + "LabelEnableHttpsHelp": "Poslušaj na nastavljenih HTTPS vratih. Za uveljavitev te možnosti mora biti nastavljen tudi veljaven certifikat.", "LabelEnableHttps": "Omogoči HTTPS", "LabelEmbedAlbumArtDidlHelp": "Nekatere naprave delujejo bolje s tem načinom pridobivanja grafike albuma. Pri drugih predvajanje morda ne bo delovalo v tem načinu.", "MessageReenableUser": "Za ponovno omogočanje poglejte spodaj", @@ -1278,7 +1172,6 @@ "LabelRepositoryUrl": "URL repozitorija", "HeaderNewRepository": "Nov repozitorij", "MessageNoRepositories": "Ni repozitorijev.", - "MessageUnauthorizedUser": "Trenutno nimate dovoljenja za dostop do tega strežnika. Kontaktirajte skrbnika strežnika za več informacij.", "MediaInfoAspectRatio": "Razmerje stranic", "MediaInfoAnamorphic": "Anamorfno", "MaxParentalRatingHelp": "Vsebine z višjo oceno bodo za tega uporabnika skrite.", @@ -1294,7 +1187,6 @@ "LabelUserAgent": "Uporabniški agent:", "EnableFasterAnimationsHelp": "Uporabi hitrejše animacije in prehode", "EnableFasterAnimations": "Hitrejše animacije", - "LabelNightly": "Nestabilna", "LabelStable": "Stabilna", "LabelChromecastVersion": "Različica Chromecast", "LabelLibraryPageSizeHelp": "Nastavi število prikazanih vsebin na strani knjižnice. Nastavite na 0 za neskončno dolgo stran.", @@ -1317,7 +1209,6 @@ "SaveChanges": "Shrani spremembe", "Save": "Shrani", "Saturday": "sobota", - "RunAtStartup": "Zaženi ob zagonu", "Rewind": "Previj nazaj", "ReplaceExistingImages": "Zamenjaj obstoječe slike", "ReplaceAllMetadata": "Zamenjaj vse metapodatke", @@ -1328,7 +1219,6 @@ "RememberMe": "Zapomni si me", "RecommendationDirectedBy": "Režija", "Person": "Oseba", - "OtherArtist": "Drugi izvajalci", "OptionProfileVideo": "Video", "OptionPoster": "Plakat", "OptionNone": "Nič", @@ -1341,7 +1231,6 @@ "OptionDownloadBoxImage": "Ovitek", "OptionDownloadBannerImage": "Pasica", "OptionDownloadBackImage": "Nazaj", - "OptionAutomatic": "Samodejno", "OptionAuto": "Samodejno", "NextUp": "Sledi", "Next": "Naslednji", @@ -1367,38 +1256,104 @@ "LabelWeb": "Splet:", "LabelLineup": "Postava:", "BoxSet": "Komplet", - "TabMetadata": "Metapodatki", - "TabInfo": "Informacije", - "TabGuide": "Vodič", - "TabFavorites": "Priljubljeni", - "TabEpisodes": "Epizode", - "TabDisplay": "Prikaz", "TabDirectPlay": "Neposredno predvajanje", - "TabDevices": "Naprave", "TabCodecs": "Kodeki", - "TabChannels": "Programi", "OptionRegex": "Regex", "OptionProtocolHls": "HTTP pretakanje v živo", "OptionProfileVideoAudio": "Video zvok", "ThemeSongs": "Glavne pesmi", - "TabTranscoding": "Prekodiranje", "TabStreaming": "Pretakanje", - "TabSongs": "Skladbe", "TabSettings": "Nastavitve", "TabServer": "Strežnik", - "TabSeries": "Serije", "TabScheduledTasks": "Načrtovana opravila", - "TabResumeSettings": "Nadaljuj", - "UninstallPluginHeader": "Odstrani dodatek", + "HeaderUninstallPlugin": "Odstrani dodatek", "UninstallPluginConfirmation": "Ali ste prepričan, da želite odstraniti {0}?", - "ServerRestartNeededAfterPluginInstall": "Po namestitvi dodatka bo potreben ponoven zagon jellyfin strežnika.", + "ServerRestartNeededAfterPluginInstall": "Po namestitvi dodatka bo potreben ponoven zagon jellyfin.", "TabResponses": "Odzivi", - "TabRecordings": "Posnetki", "TabPlugins": "Dodatki", - "TabPlaylists": "Seznami predvajanja", "TabOther": "Ostalo", "TabNotifications": "Obvestila", "TabNfoSettings": "Nastavitve NFO", - "TabMusicVideos": "Videospoti", - "TabMovies": "Filmi" + "OptionForceRemoteSourceTranscoding": "Vsili prekodiranje oddaljenih virov predstavnosti (na primer TV v živo)", + "Off": "Izključeno", + "Normal": "Normalno", + "NoSubtitleSearchResultsFound": "Ni zadetkov.", + "MessageNoNextUpItems": "Ničesar ni bilo mogoče najti. Začnite gledati vaše serije!", + "NoCreatedLibraries": "Izgleda da niste dodali še nobene knjižnice. {0}Želite dodati eno zdaj?{1}", + "NextTrack": "Preskoči na naslednjo", + "TvLibraryHelp": "Preglejte {0}napotke za poimenovanje serij{1}.", + "MusicLibraryHelp": "Preglejte {0}napotke za poimenovanje glasbe{1}.", + "MovieLibraryHelp": "Preglejte {0}napotke za poimenovanje filmov{1}.", + "MoreMediaInfo": "Informacije o predstavnosti", + "Mobile": "Telefon", + "MessageSyncPlayErrorMedia": "Aktivacija SyncPlay ni uspela! Napaka predstavnosti.", + "MessageSyncPlayErrorMissingSession": "Aktivacija SyncPlay ni uspela! Manjka seja.", + "MessageSyncPlayErrorNoActivePlayer": "Najdeno ni bilo nobeno aktivno predvajanje. SyncPlay je bil onemogočen.", + "MessageSyncPlayErrorAccessingGroups": "Pri dostopu do seznama skupin je prišlo do napake.", + "MessageSyncPlayJoinGroupDenied": "Za uporabo SyncPlay je potrebno dovoljenje.", + "MessageSyncPlayGroupDoesNotExist": "Pridružitev skupini ni bila uspešna, ker ta ne obstaja.", + "MessageSyncPlayNoGroupsAvailable": "Na voljo ni nobene skupine. Začnite gledati nekaj.", + "MessageSyncPlayDisabled": "SyncPlay onemogočen.", + "MessageSyncPlayEnabled": "SyncPlay omogočen.", + "MessageUnsetContentHelp": "Vsebine bodo prikazane kot preproste mape. Za najboljše rezultate uporabite upravitelj metapodatkov in nastavite vrsto vsebin podmap.", + "MessageLeaveEmptyToInherit": "Pustite prazno za podedovanje nastavitev od nadrejenega elementa ali globalne privzete vrednosti.", + "LabelXDlnaDocHelp": "Določa vsebino X_DLNADOC elementa v urn:schemas-dlna-org:device-1-0 namespace.", + "LabelXDlnaCapHelp": "Določa vsebino X_DLNACAP elementa v urn:schemas-dlna-org:device-1-0 namespace.", + "OptionDislikes": "Ni mi všeč", + "ClearQueue": "Počisti čakalno vrsto", + "StopPlayback": "Ustavi predvajanje", + "ButtonCast": "Zasedba", + "EnableBlurHashHelp": "Med nalaganjem bodo slike nadomeščene z edinstvenimi nadomestnimi sličicami.", + "EnableBlurHash": "Omogoči zamegljene začasne sličice za slike", + "UnsupportedPlayback": "Jellyfin ne more dešifrirati vsebin zaščitenih z DRM, vendar bo strežnik kljub temu poskušal predvajati vse vsebine. Zaradi šifriranja ali drugih nepodprtih funkcij, na primer interaktivnih naslovov, bodo nekatere vsebine prikazane popolnoma črne.", + "OnApplicationStartup": "Ob zagonu aplikacije", + "EveryXHours": "Vsakih {0} ur", + "EveryHour": "Vsako uro", + "EveryXMinutes": "Vsakih {0} minut", + "OnWakeFromSleep": "Ob prebujenju iz spanja", + "WeeklyAt": "{0}s ob {1}", + "DailyAt": "Vsak dan ob {0}", + "OptionPlainVideoItemsHelp": "Vsi videi so predstavljeni v DIDL kot \"object.item.videoItem\" namesto bolj specifičen tip, kot na primer \"object.item.videoItem.movie\".", + "OptionPlainVideoItems": "Prikaži vse videe kot preproste video vsebine", + "OptionPlainStorageFoldersHelp": "Vse mape so predstavljene v DIDL kot \"object.container.storageFolder\" namesto bolj specifičen tip, kot na primer \"object.container.person.musicArtist\".", + "OptionPlainStorageFolders": "Prikaži vse mape kot enostavne mape shrambe", + "OptionHlsSegmentedSubtitles": "HLS ločeni podnapisi", + "OptionExtractChapterImage": "Omogoči ekstrakcijo slik poglavij", + "OptionEstimateContentLength": "Oceni dolžino vsebine pri prekodiranju", + "OptionEquals": "Je enako", + "OptionEnded": "Zaključeno", + "OptionEnableM2tsModeHelp": "Omogoči m2ts način pri kodiranju v mpegts.", + "OptionEnableM2tsMode": "Omogoči M2ts način", + "OptionDisplayFolderViewHelp": "Prikaže mape poleg ostalih knjižnic predstavnosti. Uporabno za preprost ogled map.", + "OptionDisplayFolderView": "Prikaži pogled mape za prikaz navadnih map predstavnosti", + "Yesterday": "Včeraj", + "Yes": "Da", + "RecommendationStarring": "Nastopa {0}", + "Recordings": "Posnetki", + "RemoveFromCollection": "Odstrani iz zbirke", + "ResumeAt": "Nadaljuj od {0}", + "SaveSubtitlesIntoMediaFolders": "Shrani podnapise v mape predstavnosti", + "ScanForNewAndUpdatedFiles": "Poišči nove in spremenjene datoteke", + "Screenshot": "Posnetek zaslona", + "Screenshots": "Posnetki zaslona", + "Search": "Iskanje", + "ShowAdvancedSettings": "Prikaži napredne nastavitve", + "New": "Novo", + "SubtitleOffset": "Zamik podnapisev", + "Subtitles": "Podnapisi", + "Sunday": "Nedelja", + "TabAdvanced": "Napredno", + "MessageChangeRecordingPath": "Spreminjanje mape posnetkov ne bo premaknilo obstoječih posnetkov iz stare na novo lokacijo. Če želite, jih morate premakniti ročno.", + "RecordingCancelled": "Snemanje preklicano.", + "RecordSeries": "Snemaj serijo", + "Record": "Snemaj", + "RecommendationBecauseYouWatched": "Ker ste gledali {0}", + "Primary": "Primarna", + "PreviousTrack": "Preskoči na prejšnjo", + "PreferEmbeddedEpisodeInfosOverFileNames": "Prioritiziraj vdelane podatke o epizodi pred imenom datoteke", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Uporabi podatke o epizodi iz vdelanih metapodatkov, če so na voljo.", + "MessageGetInstalledPluginsError": "Pri pridobivanju seznama trenutno nameščenih dodatkov je prišlo do napake.", + "MessagePluginInstallError": "Pri nameščanju dodatka je prišlo do napake.", + "PlaybackErrorNoCompatibleStream": "Ta odjemalec ni kompatibilen s predstavnostjo in strežnik ne pošilja kompatibilnega formata predstavnosti.", + "PlaybackRate": "Hitrost predvajanja" } diff --git a/src/strings/sr.json b/src/strings/sr.json index d1ed50e87b..90cbd0d9df 100644 --- a/src/strings/sr.json +++ b/src/strings/sr.json @@ -6,8 +6,6 @@ "Playlists": "Листе", "Photos": "Фотографије", "Movies": "Филмови", - "HeaderNextUp": "Следеће горе", - "HeaderLiveTV": "ТВ уживо", "HeaderFavoriteSongs": "Омиљене песме", "HeaderFavoriteShows": "Омиљене серије", "HeaderFavoriteEpisodes": "Омиљене епизоде", @@ -27,7 +25,6 @@ "AddToPlaylist": "Додај на листу пуштања", "AddToPlayQueue": "Додај у ред за пуштање", "AddToCollection": "Додај у колекцију", - "AddItemToCollectionHelp": "Додајте ставке у колекцију претрагом па затим десним кликом у менију изаберите да додате у колекцију.", "Add": "Додај", "Actor": "Глумац", "AccessRestrictedTryAgainLater": "Приступ је тренутно ограничен. Покушајте поново касније.", @@ -35,42 +32,28 @@ "ButtonParentalControl": "Родитељска контрола", "ButtonOpen": "Отвори", "ButtonOk": "Ок", - "ButtonOff": "Искључи", "ButtonNextTrack": "Следећа нумера", - "ButtonNew": "Ново", "ButtonNetwork": "Мрежа", "ButtonMore": "Више", "ButtonManualLogin": "Ручни логин", "ButtonLibraryAccess": "Приступ библиотеци", - "ButtonLearnMore": "Научи више", "ButtonInfo": "Информације", - "ButtonHome": "Почетна страна", - "ButtonHelp": "Помоћ", "ButtonGuide": "Водич", "ButtonGotIt": "У реду", "ButtonFullscreen": "Пун екран", "ButtonForgotPassword": "Заборављена шифра", - "ButtonFilter": "Филтер", - "ButtonDownload": "Преузми", - "ButtonDown": "Доле", - "ButtonDeleteImage": "Обриши слику", - "ButtonDelete": "Обриши", - "ButtonConnect": "Повежи се", "ButtonChangeServer": "Промени Сервер", "ButtonCancel": "Откажи", "ButtonBack": "Назад", "ButtonAudioTracks": "Избор језика звука", - "ButtonArrowUp": "Горе", "ButtonArrowRight": "Десно", "ButtonArrowLeft": "Лево", - "ButtonArrowDown": "Доле", "ButtonAddUser": "Додај корисника", "ButtonAddServer": "Додај сервер", "ButtonAddScheduledTaskTrigger": "Додај прекидач", "ButtonAddMediaLibrary": "Додај каталог медија", "ButtonAddImage": "Додај слику", - "ButtonAdd": "Додај", - "BrowsePluginCatalogMessage": "Претражуј наш каталог доступних додатака", + "MessageBrowsePluginCatalog": "Претражуј наш каталог доступних додатака", "Browse": "Изабери", "BoxRear": "Омот (позади)", "Box": "Омот", @@ -78,9 +61,7 @@ "BirthPlaceValue": "Место рођења: {0}", "BirthLocation": "Место рођења", "BirthDateValue": "Рођен", - "AutoBasedOnLanguageSetting": "Аутоматски (зависи од подешавања језика)", "Audio": "Звук", - "AttributeNew": "Ново", "AroundTime": "Около", "AnyLanguage": "Било који језик", "AlwaysPlaySubtitles": "Увек налепи титлове", @@ -103,7 +84,6 @@ "DateAdded": "Датум додавања", "CustomDlnaProfilesHelp": "Направите прилагођени профил да бисте циљали на нови уређај или прегазили системски профил.", "CriticRating": "Оцена критике", - "CopyStreamURLError": "Десила се грешка приликом копирања адресе.", "CopyStreamURLSuccess": "Адреса копирана успешно.", "CopyStreamURL": "Копирајте адресу стрим-а", "Continuing": "Наставља", @@ -130,45 +110,33 @@ "CancelSeries": "Откажи серију", "CancelRecording": "Откажи снимање", "ButtonWebsite": "Веб сајт", - "ButtonViewWebsite": "Погледајте веб сајт", - "ButtonUp": "Горе", "ButtonUninstall": "Деинсталирај", "ButtonTrailer": "Трејлер", - "ButtonSubtitles": "Титлови", "ButtonSubmit": "Пошаљите", "ButtonSplit": "Подели", "ButtonStop": "Заустави", "ButtonStart": "Почни", - "ButtonSort": "Сортирај", "ButtonSignOut": "Одјавите се", "ButtonSignIn": "Пријавите се", "ButtonShutdown": "Искључи", - "ButtonShuffle": "Промешај", "ButtonSettings": "Подешавања", "ButtonSend": "Пошаљи", "ButtonSelectView": "Изаберите приказ", "ButtonSelectServer": "Иѕаберите сервер", "ButtonSelectDirectory": "Изаберите Директоријум", - "ButtonSearch": "Тражи", "ButtonScanAllLibraries": "Скенирај све библиотеке", - "ButtonSave": "Сачувај", "ButtonRevoke": "Опозови", "ButtonResume": "Настави", "ButtonRestart": "Покрени поново", "ButtonResetPassword": "Ресетуј шифру", "ButtonResetEasyPassword": "Ресетујте једноставан ПИН код", - "ButtonRepeat": "Пусти поново", "ButtonRename": "Преименуј", "ButtonRemove": "Уклони", "ButtonRefreshGuideData": "Освежи податке водича", - "ButtonRefresh": "Освежи", "ButtonQuickStartGuide": "Кратки водич за почетак", "ButtonProfile": "Профил", "ButtonPreviousTrack": "Претходна нумера", - "ButtonPlay": "Пусти", "ButtonEditOtherUserPreferences": "Уредите профил корисника, слику и личне поставке.", - "ButtonEditImages": "Уреди слике", - "ButtonEdit": "Уреди", "BurnSubtitlesHelp": "Одређује да ли сервер треба да кодира титлове приликом транскодирања видео записа. Избегавање тога увелико ће побољшати перформансе. Изаберите Аутоматски да бисте снимили формате засноване на слици (VOBSUB, PGS, SUB, IDX) и одређене ASS или SSA титлове.", "BoxSet": "Бокс сет", "BookLibraryHelp": "Подржани су аудио и текстуалне књиге. Прегледајте {0} водич за именовање књига {1}.", diff --git a/src/strings/sv.json b/src/strings/sv.json index dfc0fa6826..c5f82a59d7 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -2,7 +2,6 @@ "AccessRestrictedTryAgainLater": "För närvarande är åtkomsten begränsad. Försök igen senare.", "Actor": "Skådespelare", "Add": "Lägg till", - "AddItemToCollectionHelp": "Lägg till objekt i samlingar genom att söka efter dem och använda deras högerklick- eller pekmeny för att lägga till dem i en samling.", "AddToCollection": "Lägg till i samling", "AddToPlayQueue": "Lägg till i spelkö", "AddToPlaylist": "Lägg till i spellista", @@ -20,7 +19,7 @@ "AllowHWTranscodingHelp": "Tillåt TV-mottagaren att omkoda strömmar. Det kan minska behovet av omkodning på Jellyfin Servern.", "AllowOnTheFlySubtitleExtraction": "Tillåt undertextsextrahering under uppspelning", "AllowOnTheFlySubtitleExtractionHelp": "Inbäddade undertexter kan extraheras ur videor och skickas till klienter i textformat för att förhindra omkodning. I vissa system kan detta ta en lång tid och förhindra videouppspelningen under extraheringsprocessen. Avaktivera detta för att bränna in inbäddade undertexter genom omkodning när de inte stöds av klienten.", - "AllowRemoteAccess": "Tillåt fjärranslutningar till denna Jellyfin-server.", + "AllowRemoteAccess": "Tillåt fjärranslutningar till denna server.", "AllowRemoteAccessHelp": "Om avaktiverat så blockeras alla fjärranslutningar.", "AlwaysPlaySubtitles": "Visa alltid", "AlwaysPlaySubtitlesHelp": "Undertexter på det önskade språket kommer att laddas oavsett ljudspårets språk.", @@ -31,9 +30,7 @@ "Artists": "Artister", "AsManyAsPossible": "Så många som möjligt", "AspectRatio": "Bildförhållande", - "AttributeNew": "Ny", "Audio": "Ljud", - "AutoBasedOnLanguageSetting": "Automatisk (baserad på språkinställning)", "Backdrop": "Fondbild", "Backdrops": "Fondbilder", "Banner": "Banderoll", @@ -45,80 +42,54 @@ "Box": "Omslag", "BoxRear": "Omslag (baksida)", "Browse": "Bläddra", - "BrowsePluginCatalogMessage": "Besök katalogen för att se tillgängliga tillägg.", + "MessageBrowsePluginCatalog": "Besök katalogen för att se tillgängliga tillägg.", "BurnSubtitlesHelp": "Avgör ifall servern ska \"bränna in\" undertexterna under transkodning. Att undvika detta förbättrar prestandan avsevärt. Välj \"Automatisk\" för att bränna bild-baserade format (ex. VOBSUB, PGS, SUB/IDX, ...) och vissa ASS/SSA-undertexter.", - "ButtonAdd": "Lägg till", "ButtonAddMediaLibrary": "Lägg till mediabibliotek", "ButtonAddScheduledTaskTrigger": "Lägg till utlösare", "ButtonAddServer": "Lägg till server", "ButtonAddUser": "Ny användare", - "ButtonArrowDown": "Ned", "ButtonArrowLeft": "Vänster", "ButtonArrowRight": "Höger", - "ButtonArrowUp": "Upp", "ButtonAudioTracks": "Ljudspår", "ButtonBack": "Föregående", "ButtonCancel": "Avbryt", "ButtonChangeServer": "Byt server", - "ButtonConnect": "Anslut", - "ButtonDelete": "Ta bort", - "ButtonDeleteImage": "Ta bort bild", - "ButtonDown": "Ner", - "ButtonDownload": "Ladda ned", - "ButtonEdit": "Ändra", - "ButtonEditImages": "Ändra bilder", "ButtonEditOtherUserPreferences": "Ändra den här användarens profil, bild och personliga inställningar.", - "ButtonFilter": "Filtrera", "ButtonForgotPassword": "Glömt Lösenord", "ButtonFullscreen": "Fullskärm", "ButtonGotIt": "Ok", - "ButtonHelp": "Hjälp", - "ButtonHome": "Hem", - "ButtonLearnMore": "Läs mer", "ButtonLibraryAccess": "Biblioteksåtkomst", "ButtonManualLogin": "Manuell inloggning", "ButtonMore": "Mer", "ButtonNetwork": "Nätverk", - "ButtonNew": "Nytillkommet", "ButtonNextTrack": "Nästa spår", - "ButtonOff": "Av", "ButtonOk": "OK", "ButtonOpen": "Öppna", "ButtonParentalControl": "Föräldralås", "ButtonPause": "Paus", - "ButtonPlay": "Spela upp", "ButtonPreviousTrack": "Föregående spår", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Snabbstartguide", - "ButtonRefresh": "Uppdatera", "ButtonRefreshGuideData": "Uppdatera programguiden", "ButtonRemove": "Ta bort", "ButtonRename": "Ändra namn", - "ButtonRepeat": "Upprepa", "ButtonResetEasyPassword": "Återställ enkel pin-kod", "ButtonResetPassword": "Återställ lösenord", "ButtonRestart": "Starta om", "ButtonResume": "Återuppta", "ButtonRevoke": "Återkalla", - "ButtonSave": "Spara", "ButtonScanAllLibraries": "Scanna alla bibliotek", - "ButtonSearch": "Sök", "ButtonSelectDirectory": "Välj mapp", "ButtonSelectServer": "Välj server", "ButtonSelectView": "Välj vy", "ButtonSend": "Skicka", "ButtonSettings": "Inställningar", - "ButtonShuffle": "Blanda", "ButtonShutdown": "Stäng av", "ButtonSignIn": "Logga in", "ButtonSignOut": "Logga ut", - "ButtonSort": "Sortera", "ButtonStop": "Stopp", "ButtonSubmit": "Bekräfta", - "ButtonSubtitles": "Undertexter", "ButtonUninstall": "Avinstallera", - "ButtonUp": "Upp", - "ButtonViewWebsite": "Gå till hemsidan", "ButtonWebsite": "Hemsida", "CancelRecording": "Avbryt inspelning", "CancelSeries": "Avbryt serie", @@ -130,7 +101,7 @@ "Collections": "Samlingar", "CommunityRating": "Användaromdöme", "Composer": "Kompositör", - "ConfigureDateAdded": "Konfigurera hur tillagt datum bestäms i Jellyfin servern under Biblioteksinställningar", + "ConfigureDateAdded": "Konfigurera hur tillagt datum bestäms under Biblioteksinställningar", "ConfirmDeleteImage": "Ta bort bild?", "ConfirmDeleteItem": "Tar du bort det här objeketet så tas det bort från både ditt filsystem och mediabibliotek. Är du säker på att du vill fortsätta?", "ConfirmDeleteItems": "Tar du bort dessa objekt tas dom också bort ifrån både ditt filsystem och mediabibliotek. Är du säker på att du vill fortsätta?", @@ -145,7 +116,7 @@ "DatePlayed": "Senast visad", "DeathDateValue": "Död: {0}", "Default": "Standard", - "DefaultErrorMessage": "Ett fel uppstd vid begäran. Försök igen senare.", + "ErrorDefault": "Ett fel uppstd vid begäran. Försök igen senare.", "DefaultSubtitlesHelp": "Undertexter visas baserat på standardspråk och tvingande undertexter i den inbäddade metadatan. Förvalsspråk kommer väljas när fler val är möjliga.", "Delete": "Ta bort", "DeleteDeviceConfirmation": "Är du säker på att du vill ta bort den här enheten? Den kommer att dyka upp igen nästa gång en användare kopplar upp sig med den.", @@ -159,7 +130,7 @@ "DetectingDevices": "Söker efter enheter", "DeviceAccessHelp": "Detta tillämpas endast för enheter som kan bli unikt identifierade och som inte förhindrar åtkomst till browsern. Filtering av användarenheter kommer att blockera dom från att använda nya enheter tills dom har blivit godkända här.", "DirectPlaying": "Direktuppspelning", - "DirectStreamHelp1": "Innehållet är kompatibelt med enheten vad gäller upplösning och medietyp (H.264, AC3 osv.) men är i ett inkompatibelt filformat (mkv, avi, wmv osv.). Videofilen kommer att packas om i realtid innan den strömmas till enheten.", + "DirectStreamHelp1": "Innehållet har en kompatibel upplösning och mediatyp (H.264, AC3, osv.) för enheten, men är i en inkompatibel filbehållare (mkv, avi, wmv, osv.). Videofilen kommer att packas om i realtid innan den strömmas till enheten.", "DirectStreamHelp2": "Direktströmning av en fil använder väldigt lite resurser av CPU'n utan att bildkvaliten försämras.", "DirectStreaming": "Direktströmning", "Director": "Regissör", @@ -185,7 +156,6 @@ "EditImages": "Ändra bilder", "EditMetadata": "Redigera metadata", "EditSubtitles": "Ändra undertexter", - "EnableBackdrops": "Fondbilder", "EnableBackdropsHelp": "Visar fondbilder i bakgrunden av vissa sidor vid bläddring i biblioteket.", "EnableCinemaMode": "Bioläge", "EnableColorCodedBackgrounds": "Färgkodade bakgrundsbilder", @@ -197,9 +167,7 @@ "EnableNextVideoInfoOverlayHelp": "Vid slutet av en video, visa information om nästföljande video i spellistan.", "EnablePhotos": "Visa foton", "EnablePhotosHelp": "Bilder kommer upptäckas och visas tillsammans med andra mediefiler.", - "EnableThemeSongs": "Signaturmelodi", "EnableThemeSongsHelp": "Spela ledmotiv i bakgrunden vid bläddring i biblioteket.", - "EnableThemeVideos": "Tema-videor", "EnableThemeVideosHelp": "Spela tema-videos i bakgrunden vid bläddring i biblioteket.", "Ended": "Avslutad", "EndsAtValue": "Slutar vid: {0}", @@ -208,7 +176,7 @@ "ErrorAddingTunerDevice": "Det gick inte att lågga till den här TV-mottagaren. Säkerställ att den går att nå och försök igen.", "ErrorDeletingItem": "Det gick inte att ta bort det här objektet från Jellyfin-servern. Kontrollera att Jellyfin-servern har skrivrättigheter till media-mappen och försök igen.", "ErrorGettingTvLineups": "Ett fel uppstod vid nedladdningen utav TV-sortimentet. Se till så att uppgifterna stämmer och försök igen.", - "ErrorMessageStartHourGreaterThanEnd": "Sluttiden måste vara senare än starttiden.", + "ErrorStartHourGreaterThanEnd": "Sluttiden måste vara senare än starttiden.", "ErrorPleaseSelectLineup": "Välj en lineup och försök igen. Om inga lineups finns tillgängliga, kolla så att användarnamn, lösenord och postnummer stämmer.", "ErrorSavingTvProvider": "Ett fel uppstod när TV-tjänsten skulle sparas. Se till att den går att nå och försök igen senare.", "EveryNDays": "Var {0}:e dag", @@ -248,14 +216,11 @@ "HeaderActiveDevices": "Aktiva enheter", "HeaderActiveRecordings": "Pågående inspelningar", "HeaderActivity": "Aktivitet", - "HeaderAddScheduledTaskTrigger": "Lägg till utlösare", "HeaderAddToCollection": "Lägg till samling", "HeaderAddToPlaylist": "Lägg till i Spellista", "HeaderAddUpdateImage": "Lägg till/uppdatera bild", - "HeaderAddUser": "Lägg till användare", "HeaderAdditionalParts": "Ytterligare delar", "HeaderAlbumArtists": "Albumartister", - "HeaderAlbums": "Album", "HeaderAlert": "Varning", "HeaderAllowMediaDeletionFrom": "Tillåt mediaborttagning från", "HeaderApiKey": "API-nyckel", @@ -263,15 +228,11 @@ "HeaderApiKeysHelp": "Externa applikationer behöver en API-nyckel för att kommunicera med Jellyfin servern. Nycklar skapas genom att logga in med ett Jellyfin-konto eller genom att manuellt skapa en nyckel till applikationen.", "HeaderAudioBooks": "Ljudböcker", "HeaderAudioSettings": "Ljudinställningar", - "HeaderAutomaticUpdates": "Automatiska uppdateringar", "HeaderBlockItemsWithNoRating": "Blockera innehåll med ingen eller okänd åldersgräns:", - "HeaderBooks": "Böcker", "HeaderCancelRecording": "Avbryt inspelning", "HeaderCancelSeries": "Avbryt serie", "HeaderCastAndCrew": "Medverkande", - "HeaderCastCrew": "Rollista & besättning", "HeaderChannelAccess": "Kanalåtkomst", - "HeaderChannels": "Kanaler", "HeaderChapterImages": "Kapitelbilder", "HeaderCodecProfile": "Profil för videokodning", "HeaderCodecProfileHelp": "Avkodarprofiler bestämmer begränsningarna hos en enhet när den spelar upp olika kodningstyper. Om en begränsning är aktuell kommer innehållet att kodas om, även om kodningstypen sig är inställd för direkt avspelning.", @@ -299,23 +260,17 @@ "HeaderDevices": "Enheter", "HeaderDirectPlayProfile": "Profil för direktuppspelning", "HeaderDirectPlayProfileHelp": "Ange direktuppspelningsprofiler för att indikera vilka format enheten kan spela upp utan omkodning.", - "HeaderDisplay": "Visning", "HeaderDownloadSync": "Ladda ner & Synka", "HeaderEasyPinCode": "Lätt pinkod", "HeaderEditImages": "Redigera bilder", "HeaderEnabledFields": "Aktiverade fält", "HeaderEnabledFieldsHelp": "Bocka ur ett fält för att låsa det och undvik att dess data ändras.", - "HeaderEpisodes": "Avsnitt", "HeaderError": "Fel", "HeaderExternalIds": "Externa ID:", "HeaderFeatureAccess": "Tillgång till funktioner", - "HeaderFeatures": "Extramaterial", "HeaderFetchImages": "Hämta bilder:", - "HeaderFilters": "Filter", "HeaderForKids": "För barn", - "HeaderForgotPassword": "Glömt Lösenord", "HeaderFrequentlyPlayed": "Ofta spelade", - "HeaderGenres": "Genrer", "HeaderGuideProviders": "Källor för programguide", "HeaderHttpHeaders": "HTTP headers", "HeaderIdentification": "Identifiering", @@ -325,7 +280,6 @@ "HeaderImageSettings": "Bildinställningar", "HeaderInstall": "Installera", "HeaderInstantMix": "Direktmix", - "HeaderItems": "Objekt", "HeaderKeepRecording": "Fortsätt spela in", "HeaderKeepSeries": "Behåll serie", "HeaderKodiMetadataHelp": "Jellyfin har stöd för NFO-metadatafiler. För att aktivera eller inaktivera NFO-metadata, använd Metadata-fliken för att konfigurera NFO-stöd för dina mediatyper.", @@ -339,14 +293,10 @@ "HeaderLibraryFolders": "Biblioteksmappar", "HeaderLibraryOrder": "Biblioteksordning", "HeaderLibrarySettings": "Biblioteksinställningar", - "HeaderLiveTV": "Live-TV", - "HeaderLiveTv": "Live-TV", "HeaderLoginFailure": "Misslyckad inloggning", "HeaderMediaFolders": "Mediamappar", - "HeaderMediaInfo": "Medieinformation", "HeaderMetadataSettings": "Metadatainställningar", "HeaderMoreLikeThis": "Mer som denna", - "HeaderMovies": "Filmer", "HeaderMusicQuality": "Musikkvalitet", "HeaderMusicVideos": "Musikvideor", "HeaderMyDevice": "Min enhet", @@ -355,14 +305,12 @@ "HeaderNewApiKey": "Ny API-nyckel", "HeaderNewDevices": "Nya enheter", "HeaderNextEpisodePlayingInValue": "Nästa avsnitt börjar om {0}", - "HeaderNextUp": "Nästa", "HeaderNextVideoPlayingInValue": "Nästa video börjar om {0}", "HeaderOnNow": "Visas nu", "HeaderOtherItems": "Övriga objekt", "HeaderPassword": "Lösenord", "HeaderPasswordReset": "Återställning av lösenordet", "HeaderPaths": "Sökvägar", - "HeaderPeople": "Personer", "HeaderPhotoAlbums": "Fotoalbum", "HeaderPinCodeReset": "Återställ pinkod", "HeaderPlayAll": "Spela upp alla", @@ -387,7 +335,6 @@ "HeaderRevisionHistory": "Revisionshistorik", "HeaderRunningTasks": "Pågående aktiviteter", "HeaderScenes": "Kapitel", - "HeaderSchedule": "Schema", "HeaderSeasons": "Säsonger", "HeaderSecondsValue": "{0} sekunder", "HeaderSelectCertificatePath": "Välj sökväg för certifikat", @@ -400,13 +347,11 @@ "HeaderSelectTranscodingPath": "Välj plats för mellanlagring vid omkodning", "HeaderSelectTranscodingPathHelp": "Bläddra fram till eller ange plats för omkodarens mellanlagring. Katalogen måste vara tillgänglig för skrivning.", "HeaderSendMessage": "Skicka meddelande", - "HeaderSeries": "Serier", "HeaderSeriesOptions": "Seriealternativ", "HeaderSeriesStatus": "Seriestatus", "HeaderServerSettings": "Serverinställningar", "HeaderSettings": "Inställningar", "HeaderSetupLibrary": "Sätt upp dina mediabibliotek", - "HeaderShutdown": "Stäng av", "HeaderSortBy": "Sortera efter", "HeaderSortOrder": "Sortering", "HeaderSpecialEpisodeInfo": "Information om specialavsnitt", @@ -418,7 +363,6 @@ "HeaderSubtitleProfiles": "Undertextprofiler", "HeaderSubtitleProfilesHelp": "Undertextprofiler beskriver de undertextformat som stöds av enheten.", "HeaderSystemDlnaProfiles": "Systemprofiler", - "HeaderTags": "Etiketter", "HeaderTaskTriggers": "Aktivitetsutlösare", "HeaderThisUserIsCurrentlyDisabled": "Den här användaren är inaktiverad", "HeaderTracks": "Spår", @@ -438,7 +382,6 @@ "HeaderXmlDocumentAttributes": "XML-dokumentattribut", "HeaderXmlSettings": "XML-inställningar", "HeaderYears": "År", - "HeadersFolders": "Mappar", "Help": "Hjälp", "Hide": "Dölj", "HideWatchedContentFromLatestMedia": "Dölj visat innehåll ifrån senaste media", @@ -470,15 +413,11 @@ "LabelAlbumArtMaxWidthHelp": "Högsta upplösning hos omslagsbilder presenterade via upnp:albumArtURI.", "LabelAlbumArtPN": "PN för omslagsbilder:", "LabelAlbumArtists": "Albumartist:", - "LabelAll": "Alla", "LabelAllowHWTranscoding": "Tillåt hårdvaruomkodning", - "LabelAllowServerAutoRestart": "Tillåt att servern startas om automatiskt efter uppdateringar", - "LabelAllowServerAutoRestartHelp": "Servern startas om endast då inga användare är inloggade.", "LabelAppName": "Appens namn", "LabelAppNameExample": "Exempel: Sickbeard, Sonarr", "LabelArtists": "Artister:", "LabelArtistsHelp": "Separera med vid flera ;", - "LabelAudio": "Ljud", "LabelAudioLanguagePreference": "Önskat ljudspråk:", "LabelAutomaticallyRefreshInternetMetadataEvery": "Uppdatera metadata automatiskt ifrån internet:", "LabelBindToLocalNetworkAddress": "Knyt till lokal nätverksadress:", @@ -505,10 +444,8 @@ "LabelCustomCertificatePathHelp": "Lägg upp ditt eget SSL-certifkat i .pfx-format.", "LabelCustomCss": "Egen CSS-stil:", "LabelCustomCssHelp": "Använd din egen CSS-stil för webbgränssnittet.", - "LabelCustomDeviceDisplayName": "Visningsnamn:", "LabelCustomDeviceDisplayNameHelp": "Ange ett anpassat enhetsnamn. Lämna blankt för att använda det namn enheten själv rapporterar.", "LabelCustomRating": "Anpassad åldersgräns:", - "LabelDashboardTheme": "Kontrollpanelstema:", "LabelDateAdded": "Inlagd den:", "LabelDateAddedBehavior": "Hantering av datum för nytt innehåll:", "LabelDateAddedBehaviorHelp": "Om ett metadatavärde finns kommer det att användas i stället för dessa.", @@ -523,7 +460,6 @@ "LabelDiscNumber": "Skivnummer:", "LabelDisplayLanguage": "Visningsspråk:", "LabelDisplayLanguageHelp": "Att översätta Jellyfin är ett pågående projekt.", - "LabelDisplayMissingEpisodesWithinSeasons": "Visa saknade avsnitt i säsonger", "LabelDisplayMode": "Visningsläge:", "LabelDisplayName": "Visningsnamn:", "LabelDisplayOrder": "Visningsordning:", @@ -653,7 +589,6 @@ "LabelNewPassword": "Nytt lösenord:", "LabelNewPasswordConfirm": "Bekräfta nytt lösenord:", "LabelNewsCategories": "Nyhetskategorier:", - "LabelNext": "Nästa", "LabelNotificationEnabled": "Aktivera denna meddelandetyp", "LabelNumber": "Nr:", "LabelNumberOfGuideDays": "Antal dagars tablå att hämta:", @@ -675,9 +610,7 @@ "LabelPlayDefaultAudioTrack": "Använd det förvalda ljudspåret oavsett språk", "LabelPlaylist": "Spellista:", "LabelPreferredDisplayLanguage": "Föredraget visningsspråk:", - "LabelPreferredDisplayLanguageHelp": "Att översätta Jellyfin är ett pågående projekt.", "LabelPreferredSubtitleLanguage": "Önskat språk för undertexter:", - "LabelPrevious": "Föregående", "LabelProfileAudioCodecs": "Kodning av ljud:", "LabelProfileCodecs": "Videokodningar:", "LabelProfileCodecsHelp": "Åtskilda med kommatecken, detta kan lämnas tomt för att gälla för alla kodningsformat.", @@ -691,7 +624,6 @@ "LabelPublicHttpPortHelp": "Det publika portnumret som ska mappas till den lokala porten för HTTP.", "LabelPublicHttpsPort": "Publikt portnummer för HTTPS:", "LabelPublicHttpsPortHelp": "Det publika portnumret som ska mappas till den lokala porten för HTTPS.", - "LabelReadHowYouCanContribute": "Se hur du kan hjälpa till.", "LabelReasonForTranscoding": "Orsak för omkodning:", "LabelRecord": "Spela in:", "LabelRecordingPath": "Standard inspelningssökväg:", @@ -716,7 +648,6 @@ "LabelServerHost": "Värd:", "LabelServerHostHelp": "192.168.1.100:8096 eller https://min.server.com", "LabelSimultaneousConnectionLimit": "Begränsning för samtidiga strömmar:", - "LabelSkin": "Skal:", "LabelSkipBackLength": "'Hoppa bakåt'-längd:", "LabelSkipForwardLength": "'Hoppa framåt'-längd:", "LabelSkipIfAudioTrackPresent": "Hoppa över om det förvalda ljudspårets språk är samma som det hämtade", @@ -728,7 +659,6 @@ "LabelSortBy": "Sortera efter:", "LabelSortOrder": "Sortering:", "LabelSortTitle": "Sorteringstitel:", - "LabelSoundEffects": "Ljudeffekter:", "LabelSource": "Källa:", "LabelSpecialSeasonsDisplayName": "Visningsnamn för specialsäsong:", "LabelSportsCategories": "Sportkategorier:", @@ -738,7 +668,6 @@ "LabelSubtitleDownloaders": "Undertextskällor:", "LabelSubtitleFormatHelp": "Exempel: srt", "LabelSubtitlePlaybackMode": "Undertextläge:", - "LabelSubtitles": "Undertexter", "LabelSupportedMediaTypes": "Mediaformat som stöds:", "LabelTVHomeScreen": "Hemskärm i TV-läge:", "LabelTag": "Etikett:", @@ -751,12 +680,9 @@ "LabelTimeLimitHours": "Tidsbegränsning (timmar):", "LabelTitle": "Titel:", "LabelTrackNumber": "Spår nr:", - "LabelTranscodingAudioCodec": "Ljudkodning:", - "LabelTranscodingContainer": "Behållare:", "LabelTranscodingTempPathHelp": "Ange en egen sökväg där omkodningar skall sparas för klienter. Lämna blankt för att använda förvald plats.", "LabelTranscodingThreadCount": "Trådar för omkodning:", "LabelTranscodingThreadCountHelp": "Välj maximala antalet trådar som ska användas vid omkodning. Att minska antalet trådar sänker cpu-belastningan men ökar även risken att omkodning inte kan ske snabbt nog för felfri uppspelning.", - "LabelTranscodingVideoCodec": "Videokodning:", "LabelTriggerType": "Typ av utlösare:", "LabelTunerIpAddress": "IP-adress till TV-mottagare:", "LabelTunerType": "Typ av TV-mottagare:", @@ -774,7 +700,6 @@ "LabelXDlnaCapHelp": "Anger innehållet i elementet X_DLNACAP i namnutrymmet urn:schemas-dlna-org:device-1-0.", "LabelXDlnaDocHelp": "Anger innehållet i elementet X_DLNADOC i namnutrymmet urn:schemas-dlna-org:device-1-0.", "LabelYear": "År:", - "LabelYourFirstName": "Ditt förnamn:", "LabelYoureDone": "Klart!", "LabelZipCode": "Postnummer:", "LabelffmpegPath": "FFmpeg-sökväg:", @@ -784,7 +709,6 @@ "LearnHowYouCanContribute": "Se hur du kan hjälpa till.", "LibraryAccessHelp": "Ange vilka mediemappar den här användaren ska ha tillgång till. Administratörer har rätt att redigera alla mappar i metadatahanteraren.", "Like": "Gilla", - "LinksValue": "Länkar: {0}", "List": "Lista", "LiveBroadcasts": "Livesändningar", "LiveTV": "Live-TV", @@ -839,7 +763,6 @@ "MessageFileReadError": "Ett fel uppstod när filen lästes in. Var god försök igen.", "MessageForgotPasswordFileCreated": "Följande fil har skapats på din server och innehåller information om hur du går vidare:", "MessageForgotPasswordInNetworkRequired": "Försök igen innanför ditt hemma-nätverk, att starta återställningen av lösenordet.", - "MessageInstallPluginFromApp": "Detta tillägg måste installeras inifrån den app det skall användas i.", "MessageInvalidForgotPasswordPin": "Koden har gått ut eller så är den felaktig. Försök igen.", "MessageInvalidUser": "Felaktigt användarnamn eller lösenord. Försök igen.", "MessageItemSaved": "Objektet har sparats.", @@ -857,7 +780,6 @@ "MessagePluginConfigurationRequiresLocalAccess": "Logga in på din din lokala Jellyfin Server för att konfigurera det här tillägget.", "MessagePluginInstallDisclaimer": "Tillägg skapade av Jellyfin-användare är ett bra sätt att förbättra din Jellyfin-upplevelse med ytterligare funktionalitet. Observera att detta kan påverka din Jellyfin-server så som längre tidsåtgång för biblioteksskanningar, ytterligare bakgrundsprocesser och minskad systemstabilitet.", "MessageReenableUser": "Se nedan för att aktivera igen", - "MessageSettingsSaved": "Inställningarna har sparats.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Följande mediaplatser kommer att tas bort från ditt bibliotek:", "MessageUnableToConnectToServer": "Vi kunde inte upprätta anslutning till vald server just nu. Försäkra dig om att den är påslagen och försök igen.", "MessageUnsetContentHelp": "Innehåll kommer visas som enkla mappar. För bästa resultat, använd en metadata-hanterare för att ställa in typ av innehåll för undermapparna.", @@ -886,10 +808,9 @@ "Next": "Nästa", "No": "Nej", "NoNewDevicesFound": "Inga nya enheter hittades. För att lägga tilll en ny tuner, stäng denna rutan och mata in enhetsinformation manuellt.", - "NoNextUpItemsMessage": "Hittade inget. Sätt igång och titta!", - "NoPluginConfigurationMessage": "Detta tillägg har inga inställningar att konfigurera.", + "MessageNoNextUpItems": "Hittade inget. Sätt igång och titta!", + "MessageNoPluginConfiguration": "Detta tillägg har inga inställningar att konfigurera.", "NoSubtitleSearchResultsFound": "Inga resultat hittades.", - "NoSubtitles": "Inga", "NoSubtitlesHelp": "Undertexter kommer inte visas per standard. Det kan fortfarande sättas på manuellt under uppspelning.", "None": "Inga", "NumLocationsValue": "{0} mappar", @@ -969,7 +890,6 @@ "OptionExternallyDownloaded": "Extern nerladdning", "OptionExtractChapterImage": "Aktivera extrahering av kapitelbilder", "OptionFavorite": "Favoriter", - "OptionFriday": "Fredag", "OptionHasSpecialFeatures": "Extramaterial", "OptionHasSubtitles": "Undertexter", "OptionHasThemeSong": "Ledmotiv", @@ -983,11 +903,9 @@ "OptionImdbRating": "Betyg på IMDB", "OptionLikes": "Gillar", "OptionMissingEpisode": "Saknade avsnitt", - "OptionMonday": "Måndag", "OptionNameSort": "Namn", "OptionNew": "Ny…", "OptionNone": "Inga", - "OptionOnAppStartup": "När servern startar", "OptionOnInterval": "Med visst intervall", "OptionParentalRating": "Föräldraklassning", "OptionPlainStorageFolders": "Visa alla mappar som vanliga lagringsmappar", @@ -1008,19 +926,14 @@ "OptionRequirePerfectSubtitleMatchHelp": "Att kräva en perfekt matchning filtrerar undertexter till att bara inkludera de som testats och verifierats med din exakta videofil. Stänger du av detta ökas chansen att undertexter laddas ned, men ökar chanserna att de är osynkade eller felaktiga.", "OptionResumable": "Kan återupptas", "OptionRuntime": "Speltid", - "OptionSaturday": "Lördag", "OptionSaveMetadataAsHidden": "Spara metadata och bilder som dolda filer", "OptionSpecialEpisode": "Specialavsnitt", "OptionSubstring": "Delsträng", - "OptionSunday": "Söndag", - "OptionThursday": "Torsdag", "OptionTrackName": "Spårnamn", - "OptionTuesday": "Tisdag", "OptionTvdbRating": "TVDB-betyg", "OptionUnairedEpisode": "Ej sända avsnitt", "OptionUnplayed": "Ej visad", "OptionWakeFromSleep": "Vakna ur energisparläge", - "OptionWednesday": "Onsdag", "OptionWeekdays": "Veckodagar", "OptionWeekends": "Helger", "OptionWeekly": "Varje vecka", @@ -1033,7 +946,7 @@ "PasswordMatchError": "Lösenordet och bekräftelsen måste överensstämma.", "PasswordResetComplete": "Lösenordet har återställts.", "PasswordResetConfirmation": "Är du säker på att du vill återställa lösenordet?", - "PasswordResetHeader": "Återställ lösenord", + "HeaderResetPassword": "Återställ lösenord", "PasswordSaved": "Lösenordet har sparats.", "People": "Personer", "PerfectMatch": "Perfekt matchning", @@ -1055,7 +968,7 @@ "PleaseEnterNameOrId": "Ange ett namn eller externt id.", "PleaseRestartServerName": "Vänligen starta om Jellyfin Server - {0}.", "PleaseSelectTwoItems": "Var god välj minst två objekt.", - "PluginInstalledMessage": "Tillägget har installerats. Jellyfin Server behöver startas om för att verkställa ändringarna.", + "MessagePluginInstalled": "Tillägget har installerats. Jellyfin Server behöver startas om för att verkställa ändringarna.", "PreferEmbeddedTitlesOverFileNames": "Föredra inbäddade titlar över filnamnen", "PreferEmbeddedTitlesOverFileNamesHelp": "Det här bestämmer visningstiteln när ingen internet metadata eller lokal metadata finns att tillgå.", "Premiere": "Premiär", @@ -1066,7 +979,6 @@ "ProductionLocations": "Produktionsplatser", "Programs": "Program", "Quality": "Kvalitet", - "QueueAllFromHere": "Köa alla fr o m här", "Raised": "Upphöjd", "Rate": "Betygsätt", "RecentlyWatched": "Nyligen sedda", @@ -1095,7 +1007,6 @@ "ReplaceAllMetadata": "Ersätt all metadata", "ReplaceExistingImages": "Skriv över befintliga bilder", "ResumeAt": "Återuppta från {0}", - "RunAtStartup": "Kör vid uppstart", "Runtime": "Speltid", "Saturday": "Lördag", "Save": "Spara", @@ -1152,54 +1063,28 @@ "Sync": "Synk", "SystemDlnaProfilesHelp": "Systemprofiler är skrivskyddade. Ändringar av en systemprofil resulterar att en ny anpassad profil skapas.", "TabAdvanced": "Avancerat", - "TabAlbumArtists": "Albumartister", - "TabAlbums": "Album", - "TabArtists": "Artister", "TabCatalog": "Katalog", - "TabChannels": "Kanaler", "TabCodecs": "Kodningsformat", - "TabCollections": "Samlingar", "TabContainers": "Behållare", "TabDashboard": "Kontrollpanel", - "TabDevices": "Enheter", "TabDirectPlay": "Direktuppspelning", - "TabDisplay": "Visning", - "TabEpisodes": "Avsnitt", - "TabFavorites": "Favoriter", - "TabGenres": "Genrer", - "TabGuide": "TV-guide", "TabLatest": "Nytillkommet", - "TabLiveTV": "Live-TV", "TabLogs": "Loggfiler", - "TabMovies": "Filmer", "TabMusic": "Musik", - "TabMusicVideos": "Musikvideor", "TabMyPlugins": "Mina tillägg", "TabNetworks": "TV-bolag", "TabNfoSettings": "NFO-inställingar", "TabNotifications": "Meddelanden", "TabOther": "Övrigt", "TabParentalControl": "Föräldralås", - "TabPassword": "Lösenord", - "TabPlayback": "Uppspelning", - "TabPlaylist": "Spellista", - "TabPlaylists": "Spellistor", "TabPlugins": "Tillägg", "TabProfile": "Profil", "TabProfiles": "Profiler", - "TabRecordings": "Inspelningar", "TabResponses": "Svar", - "TabResumeSettings": "Återuppta", "TabScheduledTasks": "Schemalagda aktiviteter", - "TabSeries": "Serie", "TabSettings": "Inställningar", - "TabShows": "Serier", - "TabSongs": "Låtar", "TabStreaming": "Strömning", - "TabSuggestions": "Förslag", - "TabTranscoding": "Omkodning", "TabUpcoming": "Kommande", - "TabUsers": "Användare", "Tags": "Etiketter", "TagsValue": "Etiketter: {0}", "TellUsAboutYourself": "Berätta om dig själv", @@ -1217,7 +1102,7 @@ "Tuesday": "Tisdag", "TvLibraryHelp": "Läs om {0} namngivningsguide för TV-serier{1}.", "UninstallPluginConfirmation": "Är du säker på att du vill avinstallera {0}?", - "UninstallPluginHeader": "Avinstallera tillägg", + "HeaderUninstallPlugin": "Avinstallera tillägg", "Unmute": "Muting av", "Unplayed": "Inte spelad", "Unrated": "Ej klassad", @@ -1286,14 +1171,13 @@ "ButtonGuide": "Guide", "Blacklist": "Svartlista", "Auto": "Automatisk", - "AuthProviderHelp": "Välj en autentiserings leverantör som ska användas för att autentisera denna användarens lösenord.", + "AuthProviderHelp": "Välj en autentiseringsleverantör som ska användas för att autentisera denna användarens lösenord.", "Ascending": "Stigande", "AllowedRemoteAddressesHelp": "Kommaavgränsad lista av IP-adresser eller IP/nätmask poster för nätverk som kommer bli tillåtna att ansluta avlägset. Om fältet lämnas tomt så kommer alla avlägsna adresser tillåtas.", "AllowMediaConversionHelp": "Tillåt eller neka tillgång till media konvertings funktionen.", "AllowMediaConversion": "Tillåt media konvertering", "Alerts": "Alarm", "HeaderMedia": "Media", - "HeaderHome": "Hem", "HeaderFavoriteVideos": "Favoritvideor", "HeaderFavoriteSongs": "Favoritlåtar", "HeaderFavoriteArtists": "Favoritartister", @@ -1350,21 +1234,16 @@ "HeaderParentalRatings": "Föräldrabetyg", "HeaderNavigation": "Navigering", "HeaderBranding": "Märke", - "CopyStreamURLError": "Kunde inte kopiera videoadress.", "AskAdminToCreateLibrary": "Fråga en administratör för att skapa ett bibliotek.", "Whitelist": "Vitlista", - "VideoRange": "Video räckvidd", "ValueOneAlbum": "1 album", "ValueMinutes": "{0} min", "ValueContainer": "Behållare: {0}", "UserAgentHelp": "Stöd en egen user-agent HTTP rubrik.", "Uniform": "Enhetlig", "Trailers": "Trailers", - "TabTrailers": "Trailers", "TabServer": "Server", "TabNetworking": "Nätverk", - "TabMetadata": "Metadata", - "TabInfo": "Info", "TabAccess": "Tillgång", "TV": "TV", "SubtitleOffset": "Undertext justering", @@ -1375,7 +1254,7 @@ "SelectAdminUsername": "Vänligen välj ett användarnamn för admin kontot.", "SaveSubtitlesIntoMediaFoldersHelp": "Spara undertexter vid video filer kommer göra det mer enklare att hantera.", "Rewind": "Spola tillbaka", - "RecordingPathChangeMessage": "Ändring av din inspelnings mapp kommer inte migrera existerande inspelningar från gamla platsen till den nya. Du behöver flytta dom manuellt om så önskas.", + "MessageChangeRecordingPath": "Ändring av din inspelnings mapp kommer inte migrera existerande inspelningar från gamla platsen till den nya. Du behöver flytta dom manuellt om så önskas.", "PlaybackData": "Uppspelnings Data", "PasswordResetProviderHelp": "Välj en Lösenords Återställnings Provider att använda när denna användare begär att återställa lösenordet", "OptionThumbCard": "Miniatyr kort", @@ -1398,7 +1277,6 @@ "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", "OptionBlockTrailers": "Trailers", "OptionBanner": "Banner", - "OptionAutomatic": "Auto", "OptionAuto": "Auto", "OptionArtist": "Artist", "OptionForceRemoteSourceTranscoding": "Tvinga omkodning på fjärr media källor (som LiveTV)", @@ -1424,14 +1302,11 @@ "MediaInfoStreamTypeEmbeddedImage": "Inbäddad bild", "MediaInfoStreamTypeData": "Data", "MediaInfoStreamTypeAudio": "Ljud", - "MediaInfoSoftware": "Mjukvara", "MediaInfoLayout": "Design", "MediaInfoContainer": "Behållare", "ManageLibrary": "Hantera bibliotek", "Live": "Live", "LeaveBlankToNotSetAPassword": "Du kan lämna detta fält tomt för att inte ange lösenord.", - "LaunchWebAppOnStartupHelp": "Öppna webbgränssnittet i din standardwebbläsare när servern först startar. Detta händer inte när du använder starta om-funktionen.", - "LaunchWebAppOnStartup": "Öppna webbgränssnittet när servern startar", "LanNetworksHelp": "Kommatecken separerad lista på IP adresser eller IP/nätmask inlägg för nätverk som anses vara på lokala nätverket för att tvinga fram bandbredd begränsningar. Om angett, alla andra IP adresser kommer att anses vara på ett externt nätverk och kommer tilldelas till det externa bandbredd begränsningarna. Om lämnat tomt, endast serverns subnet anses vara på det lokala nätverket.", "LabelXDlnaDoc": "X-DLNA-dokumentation:", "LabelXDlnaCap": "X-DLNA-begränsning:", @@ -1468,18 +1343,15 @@ "PathNotFound": "Sökvägen hittades inte. Säkerställ att sökvägen är korrekt och försök igen.", "Track": "Spår", "Season": "Säsong", - "ReleaseGroup": "Releasegrupp", "PreferEmbeddedEpisodeInfosOverFileNames": "Föredra inbäddad avsnittsinformation före filnamn", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Detta använder avsnittets information från inbäddad metadata om tillgängligt.", "Person": "Person", - "OtherArtist": "Annan artist", "Movie": "Film", "Episode": "Avsnitt", "ClientSettings": "Klientinställningar", "BoxSet": "Samlingsbox", "Artist": "Artist", "ButtonTogglePlaylist": "Spellista", - "ButtonToggleContextMenu": "Mer", "AlbumArtist": "Albumartist", "LabelLibraryPageSize": "Bibliotekets sidstorlek:", "LabelDeinterlaceMethod": "Deinterlacing-metod:", @@ -1489,14 +1361,12 @@ "Yadif": "YADIF", "Filter": "Filter", "New": "Ny", - "MessageUnauthorizedUser": "Du har inte behörighet att komma åt servern just nu. Kontakta din serveradministratör för mer information.", "HeaderFavoritePlaylists": "Favoritspellista", "OnWakeFromSleep": "Vid start från vilande läge", "UnsupportedPlayback": "Jellyfin kan inte dekryptera inehåll skyddat av DRM men allt inehåll kommer ändå försökas, även skyddade titlar. Vissa filer kan se helt svarta ut på grund av kryptering eller andra funktioner som inte stöds, till exempel interaktiva titlar.", "LabelLibraryPageSizeHelp": "Sätter en begränsad sidstorlek i bibliotek. Sätt 0 för att avaktivera begränsad sidstorlek.", "ApiKeysCaption": "Lista av aktiva API-nycklar", "DeinterlaceMethodHelp": "Välj metod för borttagning av inflätning vid konvertering av inflätat inehåll.", - "TabDVR": "PVR", "SaveChanges": "Spara ändringar", "LabelRequireHttps": "Kräv HTTPS", "LabelChromecastVersion": "Chromecast-version", @@ -1538,8 +1408,8 @@ "StopPlayback": "Stoppa uppspelning", "ButtonPlayer": "Spelare", "ButtonCast": "Roller", - "EnableBlurhashHelp": "Bilder som fortfarande laddas kommer visas med en suddig platshållare", - "EnableBlurhash": "Aktivera suddiga platshållare för bilder", + "EnableBlurHashHelp": "Bilder som fortfarande laddas kommer visas med en suddig platshållare", + "EnableBlurHash": "Aktivera suddiga platshållare för bilder", "Writers": "Skribenter", "ViewAlbumArtist": "Visa albums artist", "TabRepositories": "Förvaringsplatser", @@ -1563,6 +1433,5 @@ "MessageSyncPlayDisabled": "SyncPlay avaktiverat.", "MessageSyncPlayEnabled": "SyncPlay aktiverat.", "MessageNoGenresAvailable": "Aktivera vissa metadataleverantörer att hämta genrer från internet.", - "LabelRepositoryNameHelp": "Ett eget namn för att särskilja denna förvaringsplats från andra tillagda på din server.", - "LabelNightly": "Nattlig" + "LabelRepositoryNameHelp": "Ett eget namn för att särskilja denna förvaringsplats från andra tillagda på din server." } diff --git a/src/strings/ta.json b/src/strings/ta.json new file mode 100644 index 0000000000..439231e2c7 --- /dev/null +++ b/src/strings/ta.json @@ -0,0 +1,1460 @@ +{ + "AddToPlayQueue": "இசைத்தல் வரிசையில் சேர்", + "AddToCollection": "சேகரிப்பில் சேர்க்கவும்", + "Add": "சேர்", + "Actor": "நடிகர்", + "AccessRestrictedTryAgainLater": "அணுகல் தற்போது தடைசெய்யப்பட்டுள்ளது. பின்னர் மீண்டும் முயற்சிக்கவும்.", + "Absolute": "அறுதி", + "AdditionalNotificationServices": "கூடுதல் அறிவிப்பு சேவைகளை நிறுவ சொருகி பட்டியலை உலாவுக.", + "AddedOnValue": "{0} சேர்க்கப்பட்டது", + "AddToPlaylist": "பட்டியலில் சேர்", + "AirDate": "ஒளிபரப்பப்பட்ட தேதி", + "AsManyAsPossible": "முடிந்தவரை பல", + "Artists": "கலைஞர்", + "Artist": "கலைஞர்", + "Art": "கலை", + "AroundTime": "சுற்றி", + "Anytime": "எப்போது வேண்டுமானாலும்", + "AnyLanguage": "எந்த மொழியும்", + "AlwaysPlaySubtitlesHelp": "ஆடியோ மொழியைப் பொருட்படுத்தாமல் மொழி விருப்பத்துடன் பொருந்தக்கூடிய வசன வரிகள் ஏற்றப்படும்.", + "AlwaysPlaySubtitles": "எப்போதும் ப்ளே", + "AllowedRemoteAddressesHelp": "தொலைதூரத்துடன் இணைக்க அனுமதிக்கப்படும் நெட்வொர்க்குகளுக்கான ஐபி முகவரிகள் அல்லது ஐபி / நெட்மாஸ்க் உள்ளீடுகளின் கமாவால் பிரிக்கப்பட்ட பட்டியல். காலியாக இருந்தால், எல்லா தொலை முகவரிகளும் அனுமதிக்கப்படும்.", + "AllowRemoteAccessHelp": "தேர்வு செய்யப்படாவிட்டால், எல்லா தொலைநிலை இணைப்புகளும் தடுக்கப்படும்.", + "AllowRemoteAccess": "இந்த சேவையகத்திற்கு தொலை இணைப்புகளை அனுமதிக்கவும்.", + "AllowFfmpegThrottlingHelp": "ஒரு டிரான்ஸ்கோட் அல்லது ரீமக்ஸ் தற்போதைய பின்னணி நிலையிலிருந்து வெகு தொலைவில் இருக்கும்போது, செயல்முறையை இடைநிறுத்துங்கள், இதனால் அது குறைந்த ஆதாரங்களை நுகரும். அடிக்கடி தேடாமல் பார்க்கும்போது இது மிகவும் பயனுள்ளதாக இருக்கும். பின்னணி சிக்கல்களை நீங்கள் சந்தித்தால் இதை அணைக்கவும்.", + "AllowFfmpegThrottling": "திராட்டில் ட்ரான்ஸ்கோட்கள்", + "AllowOnTheFlySubtitleExtractionHelp": "வீடியோ டிரான்ஸ்கோடிங்கைத் தடுக்க உதவும் வகையில் உட்பொதிக்கப்பட்ட வசனங்களை வீடியோக்களிலிருந்து பிரித்தெடுத்து வாடிக்கையாளர்களுக்கு எளிய உரையில் வழங்கலாம். சில கணினிகளில் இது நீண்ட நேரம் எடுக்கும் மற்றும் பிரித்தெடுக்கும் செயல்பாட்டின் போது வீடியோ பிளேபேக் நிறுத்தப்படும். கிளையன்ட் சாதனத்தால் பூர்வீகமாக ஆதரிக்கப்படாதபோது உட்பொதிக்கப்பட்ட வசன வரிகள் வீடியோ டிரான்ஸ்கோடிங்கில் எரிக்கப்படுவதை முடக்கு.", + "AllowOnTheFlySubtitleExtraction": "வசன வரிகள் பிரித்தெடுக்க அனுமதிக்கவும்", + "AllowMediaConversionHelp": "மாற்றும் ஊடக அம்சத்திற்கான அணுகலை வழங்கவும் அல்லது மறுக்கவும்.", + "AllowMediaConversion": "ஊடக மாற்றத்தை அனுமதிக்கவும்", + "AllowHWTranscodingHelp": "ட்யூனரை பயன்படுத்தும்போது ஸ்ட்ரீம்களை டிரான்ஸ்கோட் செய்ய அனுமதிக்கவும். இது சேவையகத்திற்கு தேவையான டிரான்ஸ்கோடிங்கைக் குறைக்க உதவும்.", + "AllLibraries": "அனைத்து நூலகங்களும்", + "AllLanguages": "அனைத்து மொழிகளையும்", + "AllEpisodes": "எல்லா அத்தியாயங்களும்", + "AllComplexFormats": "அனைத்து சிக்கலான வடிவங்களும் (ASS, SSA, VOBSUB, PGS, SUB, IDX,…)", + "AllChannels": "எல்லா சேனல்களும்", + "All": "அனைத்தும்", + "Alerts": "விழிப்பூட்டல்கள்", + "AlbumArtist": "கலைஞர்", + "Album": "ஆல்பம்", + "Aired": "ஒளிபரப்பானது", + "AuthProviderHelp": "இந்த பயனரின் கடவுச்சொல்லை அங்கீகரிக்க பயன்படும் அங்கீகார வழங்குநரைத் தேர்ந்தெடுக்கவும்.", + "Audio": "ஒலி", + "AttributeNew": "புதியது", + "AspectRatio": "விகிதம்", + "AskAdminToCreateLibrary": "ஒரு நூலகத்தை உருவாக்க நிர்வாகியிடம் கேளுங்கள்.", + "Ascending": "ஏறுவரிசை", + "BoxSet": "பெட்டி தொகுப்பு", + "Box": "பெட்டி", + "Books": "புத்தகங்கள்", + "BookLibraryHelp": "ஆடியோ மற்றும் உரை புத்தகங்கள் துணைபுரிகின்றன. {0} புத்தக பெயரிடும் வழிகாட்டியை மதிப்பாய்வு செய்யவும் {1}.", + "Blacklist": "தடுப்புப்பட்டியல்", + "BirthPlaceValue": "பிறந்த இடம்: {0}", + "BirthLocation": "பிறந்த இடம்", + "BirthDateValue": "பிறப்பு: {0}", + "Banner": "பதாகை", + "Backdrops": "பின்புலங்கள்", + "Backdrop": "பின்னணி", + "Auto": "தானாக", + "ButtonArrowLeft": "இடப்பக்கம்", + "ButtonArrowDown": "கீழே", + "ButtonAddUser": "பயனரைச் சேர்க்கவும்", + "ButtonAddServer": "சேவையகத்தைச் சேர்க்கவும்", + "ButtonAddScheduledTaskTrigger": "தூண்டுதலைச் சேர்க்கவும்", + "ButtonAddMediaLibrary": "ஊடக நூலகத்தைச் சேர்க்கவும்", + "ButtonAddImage": "படத்தைச் சேர்க்கவும்", + "BurnSubtitlesHelp": "வீடியோக்களை டிரான்ஸ்கோட் செய்யும் போது சேவையகம் வசன வரிகள் எரிக்க வேண்டுமா என்பதை தீர்மானிக்கிறது. இதைத் தவிர்ப்பது செயல்திறனை பெரிதும் மேம்படுத்தும். பட அடிப்படையிலான வடிவங்கள் (VOBSUB, PGS, SUB, IDX,…) மற்றும் சில ASS அல்லது SSA வசன வரிகள் எரிக்க ஆட்டோவைத் தேர்ந்தெடுக்கவும்.", + "MessageBrowsePluginCatalog": "கிடைக்கக்கூடிய செருகுநிரல்களைக் காண எங்கள் சொருகி பட்டியலை உலாவுக.", + "Browse": "உலவ", + "BoxRear": "பெட்டி (பின்புறம்)", + "ValueSpecialEpisodeName": "சிறப்பு - {0}", + "Sync": "ஒத்திசைவு", + "Songs": "பாடல்கள்", + "Shows": "தொடர்கள்", + "Playlists": "தொடர் பட்டியல்கள்", + "Photos": "புகைப்படங்கள்", + "Movies": "திரைப்படங்கள்", + "HeaderNextUp": "அடுத்ததாக", + "HeaderLiveTV": "நேரடித் தொலைக்காட்சி", + "HeaderFavoriteSongs": "பிடித்த பாட்டுகள்", + "HeaderFavoriteArtists": "பிடித்த கலைஞர்கள்", + "HeaderFavoriteAlbums": "பிடித்த ஆல்பங்கள்", + "HeaderFavoriteEpisodes": "பிடித்த அத்தியாயங்கள்", + "HeaderFavoriteShows": "பிடித்த தொடர்கள்", + "HeaderContinueWatching": "தொடர்ந்து பார்", + "HeaderAlbumArtists": "இசைக் கலைஞர்கள்", + "Genres": "வகைகள்", + "Folders": "கோப்புறைகள்", + "Favorites": "பிடித்தவை", + "Collections": "தொகுப்புகள்", + "Channels": "சேனல்கள்", + "Albums": "ஆல்பங்கள்", + "Preview": "முன்னோட்டம்", + "ButtonArrowUp": "மேலே", + "ButtonArrowRight": "வலப்பக்க", + "ButtonGotIt": "அறிந்துகொண்டேன்", + "ButtonFullscreen": "முழு திரை", + "ButtonForgotPassword": "கடவுச்சொல்லை மறந்துவிட்டீர்களா", + "ButtonEditOtherUserPreferences": "இந்த பயனரின் சுயவிவரம், படம் மற்றும் தனிப்பட்ட விருப்பங்களைத் திருத்தவும்.", + "ButtonDownload": "பதிவிறக்க", + "ButtonDown": "கீழே", + "ButtonDeleteImage": "படத்தை நீக்கு", + "ButtonDelete": "அழி", + "ButtonConnect": "இணை", + "ButtonChangeServer": "சேவையகத்தை மாற்று", + "ButtonCancel": "ரத்துசெய்", + "ButtonBack": "பின்னால்", + "ButtonAudioTracks": "ஒலிப்பதிவுகள்", + "ButtonUp": "மேலே", + "ButtonUninstall": "நிறுவல் நீக்கு", + "ButtonTrailer": "டிரெய்லர்", + "ButtonTogglePlaylist": "பிளேலிஸ்ட்", + "ButtonSubmit": "சமர்ப்பிக்கவும்", + "ButtonSplit": "பிரிக்கவும்", + "ButtonStop": "நிறுத்து", + "ButtonStart": "தொடங்கு", + "ButtonSort": "வகைபடுத்து", + "ButtonSignOut": "வெளியேறு", + "ButtonSignIn": "உள்நுழைக", + "ButtonShutdown": "பணிநிறுத்தம்", + "ButtonShuffle": "கலக்கு", + "ButtonSettings": "அமைப்புகள்", + "ButtonSend": "அனுப்புக", + "ButtonSelectView": "பார்வையைத் தேர்ந்தெடுக்கவும்", + "ButtonSelectServer": "சேவையகத்தைத் தேர்ந்தெடுக்கவும்", + "ButtonSelectDirectory": "கோப்பகத்தைத் தேர்ந்தெடுக்கவும்", + "ButtonScanAllLibraries": "அனைத்து நூலகங்களையும் ஸ்கேன் செய்யுங்கள்", + "ButtonRevoke": "திரும்பப் பெறு", + "ButtonResume": "மீண்டும் தொடர்", + "ButtonRestart": "மறுதொடக்கம்", + "ButtonResetPassword": "கடவுச்சொல்லை மீட்டமைக்க", + "ButtonResetEasyPassword": "எளிதான முள் குறியீட்டை மீட்டமைக்கவும்", + "ButtonRename": "மறுபெயரிடு", + "ButtonRemove": "அகற்று", + "ButtonRefreshGuideData": "வழிகாட்டி தரவைப் புதுப்பிக்கவும்", + "ButtonQuickStartGuide": "விரைவு தொடக்க வழிகாட்டி", + "ButtonProfile": "சுயவிவரம்", + "ButtonPreviousTrack": "முந்தைய பாடல்", + "ButtonPause": "இடைநிறுத்தம்", + "ButtonParentalControl": "பெற்றோர் கட்டுப்பாடு", + "ButtonOpen": "திற", + "ButtonOk": "சரி", + "ButtonNextTrack": "அடுத்த பாடல்", + "ButtonNew": "புதியது", + "ButtonNetwork": "வலைப்பின்னல்", + "ButtonMore": "மேலும்", + "ButtonManualLogin": "கைமுறை புகுபதிகை", + "ButtonLibraryAccess": "நூலக அனுமதி", + "ButtonInfo": "தகவல்", + "ButtonGuide": "வழிகாட்டி", + "Categories": "பிரிவுகள்", + "CancelSeries": "தொடரை ரத்துசெய்", + "CancelRecording": "பதிவை ரத்துசெய்", + "ButtonWebsite": "இணையதளம்", + "ClientSettings": "வாடிக்கையாளர் அமைப்புகள்", + "CinemaModeConfigurationHelp": "சினிமா பயன்முறை தியேட்டர் அனுபவத்தை உங்கள் வாழ்க்கை அறைக்கு நேராக கொண்டு வருகிறது, முக்கிய அம்சத்திற்கு முன் டிரெய்லர்கள் மற்றும் தனிப்பயன் அறிமுகங்களை இயக்கும் திறன் கொண்டது.", + "ChannelNumber": "சேனல் எண்", + "ChannelNameOnly": "சேனல் {0} மட்டுமே", + "ChannelAccessHelp": "இந்த பயனருடன் பகிர சேனல்களைத் தேர்ந்தெடுக்கவும். நிர்வாகிகள் மெட்டாடேட்டா நிர்வாகியைப் பயன்படுத்தி அனைத்து சேனல்களையும் திருத்த முடியும்.", + "ChangingMetadataImageSettingsNewContent": "மெட்டாடேட்டா அல்லது கலைப்படைப்பு பதிவிறக்க அமைப்புகளுக்கான மாற்றங்கள் உங்கள் நூலகத்தில் சேர்க்கப்பட்ட புதிய உள்ளடக்கத்திற்கு மட்டுமே பொருந்தும். இருக்கும் தலைப்புகளில் மாற்றங்களைப் பயன்படுத்த, அவற்றின் மெட்டாடேட்டாவை கைமுறையாக புதுப்பிக்க வேண்டும்.", + "Episode": "அத்தியாயம்", + "EndsAtValue": "{0} இல் முடிகிறது", + "Ended": "முடிந்தது", + "EnableDetailsBannerHelp": "உருப்படி விவரங்கள் பக்கத்தின் மேலே ஒரு பேனர் படத்தைக் காண்பி.", + "EnableDetailsBanner": "விவரங்கள் பேனர்", + "EnableThemeVideosHelp": "நூலகத்தில் உலாவும்போது பின்னணியில் தீம் வீடியோக்களை இயக்குங்கள்.", + "EnableThemeSongsHelp": "நூலகத்தில் உலாவும்போது பின்னணியில் தீம் பாடல்களை இயக்குங்கள்.", + "EnableStreamLoopingHelp": "நேரடி ஸ்ட்ரீம்களில் சில வினாடிகள் மட்டுமே தரவு இருந்தால் தொடர்ந்து இயக்கப்பட வேண்டும். தேவைப்படாதபோது இதை இயக்குவது சிக்கல்களை ஏற்படுத்தக்கூடும்.", + "EnableStreamLooping": "ஆட்டோ-லூப் லைவ் ஸ்ட்ரீம்கள்", + "EnablePhotosHelp": "பிற ஊடக கோப்புகளுடன் படங்கள் கண்டறியப்பட்டு காண்பிக்கப்படும்.", + "EnablePhotos": "புகைப்படங்களைக் காண்பி", + "EnableNextVideoInfoOverlayHelp": "ஒரு வீடியோவின் முடிவில், தற்போதைய பிளேலிஸ்ட்டில் வரும் அடுத்த வீடியோ பற்றிய தகவலைக் காண்பி.", + "EnableNextVideoInfoOverlay": "பிளேபேக்கின் போது அடுத்த வீடியோ தகவலைக் காட்டு", + "EnableHardwareEncoding": "வன்பொருள் குறியாக்கத்தை இயக்கு", + "EnableExternalVideoPlayersHelp": "வீடியோ பிளேபேக்கைத் தொடங்கும்போது வெளிப்புற பிளேயர் மெனு காண்பிக்கப்படும்.", + "EnableExternalVideoPlayers": "வெளிப்புற வீடியோ பிளேயர்கள்", + "EnableDisplayMirroring": "காட்சி பிரதிபலிப்பு", + "EnableDecodingColorDepth10Vp9": "VP9 க்கு 10-பிட் வன்பொருள் டிகோடிங்கை இயக்கவும்", + "EnableDecodingColorDepth10Hevc": "HEVC க்கு 10-பிட் வன்பொருள் டிகோடிங்கை இயக்கவும்", + "EnableColorCodedBackgrounds": "வண்ண குறியிடப்பட்ட பின்னணிகள்", + "EnableCinemaMode": "சினிமா பயன்முறை", + "EnableBackdropsHelp": "நூலகத்தை உலாவும்போது சில பக்கங்களின் பின்னணியில் பின்னணியைக் காண்பி.", + "EditSubtitles": "வசன வரிகள் திருத்து", + "EditMetadata": "மெட்டாடேட்டாவைத் திருத்து", + "EditImages": "படங்களைத் திருத்து", + "Edit": "தொகு", + "EasyPasswordHelp": "உங்கள் எளிதான முள் குறியீடு ஆதரிக்கப்பட்ட கிளையண்ட்களில் ஆஃப்லைன் அணுகலுக்காகப் பயன்படுத்தப்படுகிறது, மேலும் நெட்வொர்க் உள்நுழைவிலும் எளிதாகப் பயன்படுத்தலாம்.", + "DropShadow": "நிழல் விட்டுவிடு", + "DrmChannelsNotImported": "டிஆர்எம் கொண்ட சேனல்கள் இறக்குமதி செய்யப்படாது.", + "DownloadsValue": "{0} பதிவிறக்கங்கள்", + "Download": "பதிவிறக்க", + "Down": "கீழ்", + "DoNotRecord": "பதிவு செய்ய வேண்டாம்", + "DisplayModeHelp": "இடைமுகத்திற்கு நீங்கள் விரும்பும் தளவமைப்பு பாணியைத் தேர்ந்தெடுக்கவும்.", + "DisplayMissingEpisodesWithinSeasonsHelp": "சேவையக உள்ளமைவில் டிவி நூலகங்களுக்கும் இது இயக்கப்பட வேண்டும்.", + "DisplayMissingEpisodesWithinSeasons": "காணாமல் போன அத்தியாயங்களை பருவங்களுக்குள் காண்பி", + "DisplayInOtherHomeScreenSections": "சமீபத்திய மீடியா போன்ற முகப்புத் திரைப் பிரிவுகளில் காண்பிக்கவும், தொடர்ந்து பார்க்கவும்", + "DisplayInMyMedia": "முகப்புத் திரையில் காட்சி", + "Display": "காட்சி", + "Dislike": "விரும்பவில்லை", + "Disconnect": "துண்டிக்கவும்", + "Disc": "வட்டு", + "Disabled": "முடக்கப்பட்டது", + "Directors": "இயக்குநர்கள்", + "Director": "இயக்குனர்", + "DirectStreaming": "நேரடி ஸ்ட்ரீமிங்", + "DirectStreamHelp2": "வீடியோ தரத்தில் குறைந்த இழப்புடன் நேரடி ஸ்ட்ரீம் மிகக் குறைந்த செயலாக்க சக்தியைப் பயன்படுத்துகிறது.", + "DirectStreamHelp1": "தீர்மானம் மற்றும் மீடியா வகை (H.264, AC3, போன்றவை) தொடர்பான சாதனத்துடன் ஊடகங்கள் இணக்கமாக உள்ளன, ஆனால் பொருந்தாத கோப்பு கொள்கலனில் (mkv, avi, wmv, போன்றவை). சாதனத்திற்கு அனுப்பப்படுவதற்கு முன்பு வீடியோ பறக்கையில் மீண்டும் தொகுக்கப்படும்.", + "DirectPlaying": "நேரடி விளையாட்டு", + "DeviceAccessHelp": "இது தனிப்பட்ட முறையில் அடையாளம் காணக்கூடிய சாதனங்களுக்கு மட்டுமே பொருந்தும் மற்றும் உலாவி அணுகலைத் தடுக்காது. பயனர் சாதன அணுகலை வடிகட்டுவது, அவை இங்கு அங்கீகரிக்கப்படும் வரை புதிய சாதனங்களைப் பயன்படுத்துவதைத் தடுக்கும்.", + "DetectingDevices": "சாதனங்களைக் கண்டறிதல்", + "Desktop": "டெஸ்க்டாப்", + "Descending": "இறங்கு வரிசை", + "Depressed": "மனச்சோர்வு", + "DeleteUserConfirmation": "இந்த பயனரை நீக்க விரும்புகிறீர்களா?", + "DeleteUser": "பயனரை நீக்கு", + "DeleteMedia": "மீடியாவை நீக்கு", + "DeleteImageConfirmation": "இந்த படத்தை நீக்க விரும்புகிறீர்களா?", + "DeleteImage": "படத்தை நீக்கு", + "DeleteDeviceConfirmation": "இந்த சாதனத்தை நீக்க விரும்புகிறீர்களா? அடுத்த முறை ஒரு பயனர் உள்நுழையும்போது அது மீண்டும் தோன்றும்.", + "Delete": "அழி", + "DeinterlaceMethodHelp": "ஒன்றோடொன்று உள்ளடக்கத்தை டிரான்ஸ்கோடிங் செய்யும்போது பயன்படுத்த வேண்டிய deinterlacing முறையைத் தேர்ந்தெடுக்கவும்.", + "DefaultSubtitlesHelp": "உட்பொதிக்கப்பட்ட மெட்டாடேட்டாவில் இயல்புநிலை மற்றும் கட்டாயக் கொடிகளின் அடிப்படையில் வசன வரிகள் ஏற்றப்படுகின்றன. பல விருப்பங்கள் கிடைக்கும்போது மொழி விருப்பத்தேர்வுகள் கருதப்படுகின்றன.", + "DefaultMetadataLangaugeDescription": "இவை உங்கள் இயல்புநிலைகள் மற்றும் ஒவ்வொரு நூலக அடிப்படையில் தனிப்பயனாக்கலாம்.", + "ErrorDefault": "கோரிக்கையை செயலாக்குவதில் பிழை ஏற்பட்டது. பின்னர் மீண்டும் முயற்சிக்கவும்.", + "Default": "இயல்புநிலை", + "DeathDateValue": "இறந்தது: {0}", + "DatePlayed": "விளையாடிய தேதி", + "DateAdded": "தேதி சேர்க்கப்பட்டது", + "CustomDlnaProfilesHelp": "புதிய சாதனத்தை குறிவைக்க அல்லது கணினி சுயவிவரத்தை மேலெழுத தனிப்பயன் சுயவிவரத்தை உருவாக்கவும்.", + "CriticRating": "விமர்சன மதிப்பீடு", + "CopyStreamURLSuccess": "URL வெற்றிகரமாக நகலெடுக்கப்பட்டது.", + "CopyStreamURL": "ஸ்ட்ரீம் URL ஐ நகலெடுக்கவும்", + "Continuing": "தொடர்கிறது", + "ContinueWatching": "தொடர்ந்து பார்த்துக் கொள்ளுங்கள்", + "Connect": "இணைக்கவும்", + "ConfirmEndPlayerSession": "ஜெல்லிஃபினை {0} இல் நிறுத்த விரும்புகிறீர்களா?", + "ConfirmDeletion": "நீக்குதலை உறுதிப்படுத்தவும்", + "ConfirmDeleteItems": "இந்த உருப்படிகளை நீக்குவது கோப்பு முறைமை மற்றும் உங்கள் ஊடக நூலகம் இரண்டிலிருந்தும் அவற்றை நீக்கும். நீங்கள் தொடர விரும்புகிறீர்களா?", + "ConfirmDeleteItem": "இந்த உருப்படியை நீக்குவது கோப்பு முறைமை மற்றும் உங்கள் ஊடக நூலகம் இரண்டிலிருந்தும் நீக்கப்படும். நீங்கள் தொடர விரும்புகிறீர்களா?", + "ConfirmDeleteImage": "படத்தை நீக்கவா?", + "ConfigureDateAdded": "நூலக அமைப்புகளின் கீழ் டாஷ்போர்டில் சேர்க்கப்பட்ட தேதி எவ்வாறு தீர்மானிக்கப்படுகிறது என்பதை உள்ளமைக்கவும்", + "Composer": "இசையமைப்பாளர்", + "CommunityRating": "சமூக மதிப்பீடு", + "ColorTransfer": "வண்ண பரிமாற்றம்", + "ColorSpace": "வண்ண இடம்", + "ColorPrimaries": "வண்ண முதன்மைகள்", + "EveryNDays": "ஒவ்வொரு {0} நாட்களும்", + "ErrorSavingTvProvider": "டிவி வழங்குநரைச் சேமிப்பதில் பிழை ஏற்பட்டது. அணுகக்கூடியது என்பதை உறுதிசெய்து மீண்டும் முயற்சிக்கவும்.", + "ErrorPleaseSelectLineup": "தயவுசெய்து ஒரு வரிசையைத் தேர்ந்தெடுத்து மீண்டும் முயற்சிக்கவும். வரிசைகள் எதுவும் கிடைக்கவில்லை என்றால், உங்கள் பயனர்பெயர், கடவுச்சொல் மற்றும் அஞ்சல் குறியீடு சரியானதா என்பதை சரிபார்க்கவும்.", + "ErrorStartHourGreaterThanEnd": "இறுதி நேரம் தொடக்க நேரத்தை விட அதிகமாக இருக்க வேண்டும்.", + "ErrorGettingTvLineups": "டிவி வரிசைகளை பதிவிறக்குவதில் பிழை ஏற்பட்டது. உங்கள் தகவல் சரியானது என்பதை உறுதிசெய்து மீண்டும் முயற்சிக்கவும்.", + "ErrorDeletingItem": "சேவையகத்திலிருந்து உருப்படியை நீக்குவதில் பிழை ஏற்பட்டது. ஜெல்லிஃபின் மீடியா கோப்புறையில் எழுத அணுகல் உள்ளதா என்பதை சரிபார்த்து மீண்டும் முயற்சிக்கவும்.", + "ErrorAddingXmlTvFile": "XMLTV கோப்பை அணுகுவதில் பிழை ஏற்பட்டது. கோப்பு இருப்பதை உறுதிசெய்து மீண்டும் முயற்சிக்கவும்.", + "ErrorAddingTunerDevice": "ட்யூனர் சாதனத்தைச் சேர்ப்பதில் பிழை ஏற்பட்டது. அணுகக்கூடியது என்பதை உறுதிசெய்து மீண்டும் முயற்சிக்கவும்.", + "ErrorAddingMediaPathToVirtualFolder": "ஊடக பாதையைச் சேர்ப்பதில் பிழை ஏற்பட்டது. பாதை செல்லுபடியாகும் என்பதை உறுதிப்படுத்தவும், அந்த இடத்திற்கு ஜெல்லிஃபின் அணுகல் உள்ளது.", + "ErrorAddingListingsToSchedulesDirect": "உங்கள் அட்டவணைகள் நேரடி கணக்கில் வரிசையைச் சேர்ப்பதில் பிழை ஏற்பட்டது. அட்டவணைகள் நேரடி ஒரு கணக்கிற்கு ஒரு குறிப்பிட்ட எண்ணிக்கையிலான வரிசைகளை மட்டுமே அனுமதிக்கிறது. தொடர்வதற்கு முன் நீங்கள் அட்டவணைகள் நேரடி இணையதளத்தில் உள்நுழைந்து மற்றவர்களின் பட்டியலை உங்கள் கணக்கிலிருந்து அகற்ற வேண்டும்.", + "Episodes": "அத்தியாயங்கள்", + "HeaderConfirmPluginInstallation": "செருகுநிரல் நிறுவலை உறுதிப்படுத்தவும்", + "HeaderConfigureRemoteAccess": "தொலைநிலை அணுகலை உள்ளமைக்கவும்", + "HeaderCodecProfileHelp": "குறிப்பிட்ட கோடெக்குகளை இயக்கும்போது கோடெக் சுயவிவரங்கள் சாதனத்தின் வரம்புகளைக் குறிக்கின்றன. ஒரு வரம்பு பொருந்தினால், கோடெக் நேரடி விளையாட்டிற்காக கட்டமைக்கப்பட்டிருந்தாலும், மீடியா டிரான்ஸ்கோட் செய்யப்படும்.", + "HeaderCodecProfile": "கோடெக் சுயவிவரம்", + "HeaderChapterImages": "பாடம் படங்கள்", + "HeaderChannelAccess": "சேனல் அணுகல்", + "HeaderCastAndCrew": "நடிகர்கள் & குழு", + "HeaderCancelSeries": "தொடரை ரத்துசெய்", + "HeaderCancelRecording": "பதிவை ரத்துசெய்", + "HeaderBranding": "பிராண்டிங்", + "HeaderBlockItemsWithNoRating": "இல்லை அல்லது அங்கீகரிக்கப்படாத மதிப்பீட்டு தகவல் இல்லாத உருப்படிகளைத் தடு:", + "HeaderAudioSettings": "ஆடியோ அமைப்புகள்", + "HeaderAudioBooks": "ஆடியோ புத்தகங்கள்", + "HeaderAppearsOn": "தோன்றும்", + "HeaderApp": "செயலி", + "ApiKeysCaption": "தற்போது இயக்கப்பட்ட API விசைகளின் பட்டியல்", + "HeaderApiKeysHelp": "சேவையகத்துடன் தொடர்புகொள்வதற்கு வெளிப்புற பயன்பாடுகள் ஏபிஐ விசையை வைத்திருக்க வேண்டும். விசைகள் ஒரு சாதாரண பயனர் கணக்கில் உள்நுழைந்து அல்லது பயன்பாட்டிற்கு ஒரு விசையை கைமுறையாக வழங்குவதன் மூலம் வழங்கப்படுகின்றன.", + "HeaderApiKeys": "API விசைகள்", + "HeaderApiKey": "API விசை", + "HeaderAllowMediaDeletionFrom": "இருந்து மீடியாவை நீக்க அனுமதிக்கவும்", + "HeaderAlert": "எச்சரிக்கை", + "HeaderAdmin": "நிர்வாகம்", + "HeaderAdditionalParts": "கூடுதல் பாகங்கள்", + "HeaderAddUpdateImage": "படத்தைச் சேர்க்கவும் / புதுப்பிக்கவும்", + "HeaderAddToPlaylist": "பட்டியலில் சேர்", + "HeaderAddToCollection": "சேகரிப்பில் சேர்", + "HeaderActivity": "செயல்பாடு", + "HeaderActiveRecordings": "செயலில் பதிவுகள்", + "HeaderActiveDevices": "செயலில் உள்ள சாதனங்கள்", + "HeaderAccessScheduleHelp": "சில மணிநேரங்களுக்கான அணுகலைக் கட்டுப்படுத்த அணுகல் அட்டவணையை உருவாக்கவும்.", + "HeaderAccessSchedule": "அணுகல் அட்டவணை", + "HardwareAccelerationWarning": "வன்பொருள் முடுக்கம் இயக்குவது சில சூழல்களில் உறுதியற்ற தன்மையை ஏற்படுத்தக்கூடும். உங்கள் இயக்க முறைமை மற்றும் வீடியோ இயக்கிகள் முழுமையாக புதுப்பித்த நிலையில் இருப்பதை உறுதிசெய்க. இதை இயக்கிய பின் வீடியோவை இயக்குவதில் சிக்கல் இருந்தால், நீங்கள் அமைப்பை எதுவும் இல்லை என மாற்ற வேண்டும்.", + "HDPrograms": "HD நிரல்கள்", + "EncoderPresetHelp": "செயல்திறனை மேம்படுத்த வேகமான மதிப்பை அல்லது தரத்தை மேம்படுத்த மெதுவான மதிப்பைத் தேர்வுசெய்க.", + "H264CrfHelp": "நிலையான விகித காரணி (CRF) என்பது x264 குறியாக்கிக்கான இயல்புநிலை தர அமைப்பாகும். நீங்கள் 0 மற்றும் 51 க்கு இடையில் மதிப்புகளை அமைக்கலாம், அங்கு குறைந்த மதிப்புகள் சிறந்த தரத்தை ஏற்படுத்தும் (அதிக கோப்பு அளவுகளின் இழப்பில்). சேன் மதிப்புகள் 18 முதல் 28 வரை உள்ளன. X264 இன் இயல்புநிலை 23 ஆகும், எனவே இதை நீங்கள் ஒரு தொடக்க புள்ளியாக பயன்படுத்தலாம்.", + "GuideProviderSelectListings": "பட்டியல்களைத் தேர்ந்தெடுக்கவும்", + "GuideProviderLogin": "உள்நுழைய", + "Guide": "வழிகாட்டி", + "GuestStar": "விருந்தினர் நட்சத்திரம்", + "GroupVersions": "குழு பதிப்புகள்", + "GroupBySeries": "தொடர் அடிப்படையில் குழு", + "Genre": "வகை", + "General": "பொது", + "Fullscreen": "முழு திரை", + "Friday": "வெள்ளி", + "FormatValue": "வடிவம்: {0}", + "FolderTypeUnset": "கலப்பு உள்ளடக்கம்", + "FolderTypeTvShows": "தொலைக்காட்சி நிகழ்ச்சிகள்", + "FolderTypeMusicVideos": "இசை கானொளி", + "FolderTypeMusic": "இசை", + "FolderTypeMovies": "திரைப்படங்கள்", + "FolderTypeBooks": "புத்தகங்கள்", + "Filters": "வடிப்பான்கள்", + "FileReadError": "கோப்பைப் படிக்கும்போது பிழை ஏற்பட்டது.", + "FileReadCancelled": "படித்த கோப்பு ரத்து செய்யப்பட்டது.", + "FileNotFound": "கோப்பு கிடைக்கவில்லை.", + "File": "கோப்பு", + "FetchingData": "கூடுதல் தரவைப் பெறுகிறது", + "Features": "அம்சங்கள்", + "Favorite": "பிடித்தது", + "FastForward": "வேகமாக முன்னோக்கி", + "FFmpegSavePathNotFound": "நீங்கள் உள்ளிட்ட பாதையைப் பயன்படுத்தி FFmpeg ஐ எங்களால் கண்டுபிடிக்க முடியவில்லை. FFprobe தேவைப்படுகிறது மற்றும் அதே கோப்புறையில் இருக்க வேண்டும். இந்த கூறுகள் பொதுவாக ஒரே பதிவிறக்கத்தில் ஒன்றாக தொகுக்கப்படுகின்றன. பாதையை சரிபார்த்து மீண்டும் முயற்சிக்கவும்.", + "Extras": "கூடுதல்", + "ExtractChapterImagesHelp": "அத்தியாயப் படங்களை பிரித்தெடுப்பது வாடிக்கையாளர்களுக்கு வரைகலை காட்சி தேர்வு மெனுக்களைக் காண்பிக்கும். செயல்முறை மெதுவாகவும், வள தீவிரமாகவும் இருக்கலாம், மேலும் பல ஜிகாபைட் இடம் தேவைப்படலாம். வீடியோக்கள் கண்டுபிடிக்கப்பட்டதும், இரவு திட்டமிடப்பட்ட பணியாகவும் இது இயங்குகிறது. திட்டமிடப்பட்ட பணிகள் பகுதியில் அட்டவணை கட்டமைக்கப்படுகிறது. அதிகபட்ச பயன்பாட்டு நேரங்களில் இந்த பணியை இயக்க பரிந்துரைக்கப்படவில்லை.", + "ExtraLarge": "கூடுதல் பெரியது", + "ExitFullscreen": "முழு திரையில் இருந்து வெளியேறவும்", + "HeaderFeatureAccess": "அம்ச அணுகல்", + "HeaderFavoritePlaylists": "பிடித்த இசைப்பட்டியல்கள்", + "HeaderFavoriteVideos": "பிடித்த வீடியோக்கள்", + "HeaderFavoritePeople": "பிடித்த மக்கள்", + "HeaderFavoriteMovies": "பிடித்த திரைப்படங்கள்", + "HeaderFavoriteBooks": "பிடித்த புத்தகங்கள்", + "HeaderExternalIds": "வெளி ஐடிகள்:", + "HeaderError": "பிழை", + "HeaderEnabledFieldsHelp": "ஒரு புலத்தை பூட்டவும், அதன் தரவு மாற்றப்படுவதைத் தடுக்கவும் தேர்வுநீக்கு.", + "HeaderEnabledFields": "இயக்கப்பட்ட புலங்கள்", + "HeaderEditImages": "படங்களைத் திருத்து", + "HeaderEasyPinCode": "எளிதாக பின் குறியீடு", + "HeaderDVR": "டி.வி.ஆர்", + "HeaderDownloadSync": "பதிவிறக்கம் & ஒத்திசை", + "HeaderDirectPlayProfileHelp": "சாதனம் சொந்த முறையில் கையாளக்கூடிய வடிவமைப்புகளைக் குறிக்க நேரடி ப்ளே சுயவிவரங்களைச் சேர்க்கவும்.", + "HeaderDirectPlayProfile": "நேரடி ப்ளே சுயவிவரம்", + "HeaderDevices": "சாதனங்கள்", + "HeaderDeviceAccess": "சாதன அணுகல்", + "HeaderDeveloperInfo": "உருவாக்குனர் தகவல்", + "HeaderDetectMyDevices": "எனது சாதனங்களைக் கண்டறியவும்", + "HeaderDeleteTaskTrigger": "பணி தூண்டுதலை நீக்கு", + "HeaderDeleteProvider": "வழங்குநரை நீக்கு", + "HeaderDeleteItems": "உருப்படிகளை நீக்கு", + "HeaderDeleteItem": "உருப்படியை நீக்கு", + "HeaderDeleteDevice": "சாதனத்தை நீக்கு", + "HeaderDefaultRecordingSettings": "இயல்புநிலை பதிவு அமைப்புகள்", + "HeaderDateIssued": "வழங்கப்பட்ட தேதி", + "HeaderCustomDlnaProfiles": "தனிப்பயன் சுயவிவரங்கள்", + "HeaderContinueListening": "தொடர்ந்து கேளுங்கள்", + "HeaderContainerProfileHelp": "குறிப்பிட்ட வடிவங்களை இயக்கும்போது கொள்கலன் சுயவிவரங்கள் சாதனத்தின் வரம்புகளைக் குறிக்கின்றன. ஒரு வரம்பு பொருந்தினால், நேரடி விளையாட்டுக்காக வடிவமைப்பு கட்டமைக்கப்பட்டிருந்தாலும், மீடியா டிரான்ஸ்கோட் செய்யப்படும்.", + "HeaderContainerProfile": "கொள்கலன் சுயவிவரம்", + "HeaderConnectionFailure": "இணைப்பு தோல்வி", + "HeaderConnectToServer": "சேவையகத்துடன் இணைக்கவும்", + "HeaderConfirmRevokeApiKey": "API விசையைத் திரும்பப்பெறுக", + "HeaderConfirmProfileDeletion": "சுயவிவர நீக்குதலை உறுதிப்படுத்தவும்", + "HeaderSortBy": "மூலம் வரிசைப்படுத்து", + "HeaderSetupLibrary": "உங்கள் மீடியா நூலகங்களை அமைக்கவும்", + "HeaderSettings": "அமைப்புகள்", + "HeaderServerSettings": "சேவையக அமைப்புகள்", + "HeaderServerAddressSettings": "சேவையக முகவரி அமைப்புகள்", + "HeaderSeriesStatus": "தொடர் நிலை", + "HeaderSeriesOptions": "தொடர் விருப்பங்கள்", + "HeaderSendMessage": "செய்தியை அனுப்பு", + "HeaderSelectTranscodingPathHelp": "டிரான்ஸ்கோட் கோப்புகளுக்கு பயன்படுத்த பாதையை உலாவவும் அல்லது உள்ளிடவும். கோப்புறை எழுதக்கூடியதாக இருக்க வேண்டும்.", + "HeaderSelectTranscodingPath": "டிரான்ஸ்கோடிங் தற்காலிக பாதையைத் தேர்ந்தெடுக்கவும்", + "HeaderSelectServerCachePathHelp": "சேவையக தேக்கக கோப்புகளுக்கு பயன்படுத்த பாதையை உலாவவும் அல்லது உள்ளிடவும். கோப்புறை எழுதக்கூடியதாக இருக்க வேண்டும்.", + "HeaderSelectServerCachePath": "சேவையக தேக்கக பாதையைத் தேர்ந்தெடுக்கவும்", + "HeaderSelectServer": "சேவையகத்தைத் தேர்ந்தெடுக்கவும்", + "HeaderSelectPath": "பாதையைத் தேர்ந்தெடுக்கவும்", + "HeaderSelectMetadataPathHelp": "மெட்டாடேட்டாவிற்கு நீங்கள் பயன்படுத்த விரும்பும் பாதையை உலாவவும் அல்லது உள்ளிடவும். கோப்புறை எழுதக்கூடியதாக இருக்க வேண்டும்.", + "HeaderSelectMetadataPath": "மெட்டாடேட்டா பாதையைத் தேர்ந்தெடுக்கவும்", + "HeaderSelectCertificatePath": "சான்றிதழ் பாதையைத் தேர்ந்தெடுக்கவும்", + "HeaderSecondsValue": "{0} விநாடிகள்", + "HeaderSeasons": "பருவங்கள்", + "HeaderScenes": "காட்சிகள்", + "HeaderRunningTasks": "இயங்கும் பணிகள்", + "HeaderRevisionHistory": "திருத்த வரலாறு", + "HeaderRestart": "மறுதொடக்கம்", + "HeaderResponseProfileHelp": "சில வகையான மீடியாக்களை இயக்கும்போது சாதனத்திற்கு அனுப்பப்பட்ட தகவல்களைத் தனிப்பயனாக்க பதில் சுயவிவரங்கள் ஒரு வழியை வழங்குகின்றன.", + "HeaderResponseProfile": "பதில் சுயவிவரம்", + "HeaderRemoveMediaLocation": "மீடியா இருப்பிடத்தை அகற்று", + "HeaderRemoveMediaFolder": "மீடியா கோப்புறையை அகற்று", + "HeaderRemoteControl": "தொலையியக்கி", + "HeaderRemoteAccessSettings": "தொலைநிலை அணுகல் அமைப்புகள்", + "HeaderRecordingPostProcessing": "பதிவு செயலாக்கம் பதிவு செய்தல்", + "HeaderRecordingOptions": "பதிவு செய்தல் விருப்பங்கள்", + "HeaderRecentlyPlayed": "சமீபத்தில் இசையப்பட்டுள்ளது", + "HeaderProfileServerSettingsHelp": "இந்த மதிப்புகள் சேவையகம் எவ்வாறு வாடிக்கையாளர்களுக்கு முன்வைக்கும் என்பதைக் கட்டுப்படுத்துகிறது.", + "HeaderProfileInformation": "சுயவிவர தகவல்", + "HeaderProfile": "சுயவிவரம்", + "HeaderPreferredMetadataLanguage": "விருப்பமான மெட்டாடேட்டா மொழி", + "HeaderPluginInstallation": "செருகுநிரல் நிறுவல்", + "HeaderPleaseSignIn": "உள்நுழைக", + "HeaderPlaybackError": "பின்னணி பிழை", + "HeaderPlayback": "மீடியா பிளேபேக்", + "HeaderPlayOn": "இயக்கு", + "HeaderPlayAll": "அனைத்தும் இயக்கு", + "HeaderPinCodeReset": "பின் குறியீட்டை மீட்டமை", + "HeaderPhotoAlbums": "புகைப்பட ஆல்பங்கள்", + "HeaderPaths": "பாதைகள்", + "HeaderPasswordReset": "கடவுச்சொல் மீட்டமைப்பு", + "HeaderPassword": "கடவுச்சொல்", + "HeaderParentalRatings": "பெற்றோர் மதிப்பீடுகள்", + "HeaderOtherItems": "பிற உருப்படிகள்", + "HeaderOnNow": "இப்போது", + "HeaderNextVideoPlayingInValue": "அடுத்த வீடியோ {0} இல் இயங்குகிறது", + "HeaderNextEpisodePlayingInValue": "அடுத்த எபிசோட் {0} இல் விளையாடுகிறது", + "HeaderNewDevices": "புதிய சாதனங்கள்", + "HeaderNewApiKey": "புதிய API விசை", + "HeaderNavigation": "வழிசெலுத்தல்", + "HeaderMyMediaSmall": "எனது மீடியா (சிறியது)", + "HeaderMyMedia": "எனது மீடியா", + "HeaderMyDevice": "என் உபகரணம்", + "HeaderMusicVideos": "இசை கானொளி", + "HeaderMusicQuality": "இசை தரம்", + "HeaderMoreLikeThis": "இது போன்றது", + "HeaderMetadataSettings": "மெட்டாடேட்டா அமைப்புகள்", + "HeaderMediaFolders": "மீடியா கோப்புறைகள்", + "HeaderMedia": "மீடியா", + "HeaderLoginFailure": "உள்நுழைவு தோல்வி", + "HeaderLiveTvTunerSetup": "லைவ் டிவி ட்யூனர் அமைப்பு", + "HeaderLibrarySettings": "நூலக அமைப்புகள்", + "HeaderLibraryOrder": "நூலக ஆணை", + "HeaderLibraryFolders": "நூலக கோப்புறைகள்", + "HeaderLibraryAccess": "நூலக அணுகல்", + "HeaderLibraries": "நூலகங்கள்", + "HeaderLatestRecordings": "சமீபத்திய பதிவுகள்", + "HeaderLatestMusic": "சமீபத்திய இசை", + "HeaderLatestMovies": "சமீபத்திய திரைப்படங்கள்", + "HeaderLatestMedia": "சமீபத்திய மீடியா", + "HeaderLatestEpisodes": "சமீபத்திய அத்தியாயங்கள்", + "HeaderKodiMetadataHelp": "NFO மெட்டாடேட்டாவை இயக்க அல்லது முடக்க, ஒரு நூலகத்தைத் திருத்தி மெட்டாடேட்டா சேவர்ஸ் பகுதியைக் கண்டறியவும்.", + "HeaderKeepSeries": "தொடரை வைத்திருங்கள்", + "HeaderKeepRecording": "பதிவுசெய்து கொள்ளுங்கள்", + "HeaderInstantMix": "உடனடி கலவை", + "HeaderInstall": "நிறுவு", + "HeaderImageSettings": "பட அமைப்புகள்", + "HeaderImageOptions": "பட விருப்பங்கள்", + "HeaderIdentifyItemHelp": "ஒன்று அல்லது அதற்கு மேற்பட்ட தேடல் அளவுகோல்களை உள்ளிடவும். தேடல் முடிவுகளை அதிகரிக்க அளவுகோல்களை அகற்று.", + "HeaderIdentificationHeader": "அடையாள தலைப்பு", + "HeaderIdentificationCriteriaHelp": "குறைந்தது ஒரு அடையாள அளவுகோல்களை உள்ளிடவும்.", + "HeaderIdentification": "அடையாளம்", + "HeaderHttpsSettings": "HTTPS அமைப்புகள்", + "HeaderHttpHeaders": "HTTP தலைப்புகள்", + "HeaderGuideProviders": "டிவி வழிகாட்டி தரவு வழங்குநர்கள்", + "HeaderFrequentlyPlayed": "அடிக்கடி இசைக்கும்", + "HeaderForKids": "குழந்தைகளுக்காக", + "HeaderFetcherSettings": "பெறுதல் அமைப்புகள்", + "HeaderFetchImages": "படங்களை பெறுங்கள்:", + "Home": "முகப்பு", + "HideWatchedContentFromLatestMedia": "சமீபத்திய மீடியாவிலிருந்து பார்த்த உள்ளடக்கத்தை மறை", + "Hide": "மறை", + "Help": "உதவி", + "HeaderYears": "ஆண்டுகள்", + "HeaderXmlSettings": "XML அமைப்புகள்", + "HeaderXmlDocumentAttributes": "XML ஆவண பண்புக்கூறுகள்", + "HeaderXmlDocumentAttribute": "XML ஆவண பண்புக்கூறு", + "HeaderVideos": "வீடியோக்கள்", + "HeaderVideoTypes": "வீடியோ வகைகள்", + "HeaderVideoType": "வீடியோ வகை", + "HeaderVideoQuality": "வீடியோ தரம்", + "HeaderUsers": "பயனர்கள்", + "HeaderUser": "பயனர்", + "HeaderUploadImage": "படத்தை பதிவேற்றம் செய்யவும்", + "HeaderUpcomingOnTV": "தொலைக்காட்சியில் வரவிருக்கும்", + "HeaderTypeText": "உரையை உள்ளிடவும்", + "HeaderTypeImageFetchers": "{0} படத்தை எடுப்பவர்கள்", + "HeaderTuners": "ட்யூனர்கள்", + "HeaderTunerDevices": "ட்யூனர் சாதனங்கள்", + "HeaderTranscodingProfileHelp": "டிரான்ஸ்கோடிங் தேவைப்படும்போது எந்த வடிவங்களைப் பயன்படுத்த வேண்டும் என்பதைக் குறிக்க டிரான்ஸ்கோடிங் சுயவிவரங்களைச் சேர்க்கவும்.", + "HeaderTranscodingProfile": "டிரான்ஸ்கோடிங் சுயவிவரம்", + "HeaderTracks": "தடங்கள்", + "HeaderThisUserIsCurrentlyDisabled": "இந்த பயனர் தற்போது முடக்கப்பட்டுள்ளது", + "HeaderTaskTriggers": "பணி தூண்டுதல்கள்", + "HeaderSystemDlnaProfiles": "கணினி சுயவிவரங்கள்", + "HeaderSyncPlayEnabled": "ஒத்திசைவு இயக்கப்பட்டது", + "HeaderSyncPlaySelectGroup": "ஒரு குழுவில் சேர", + "HeaderSubtitleProfilesHelp": "சாதனம் ஆதரிக்கும் வசன வடிவங்களை வசன சுயவிவரங்கள் விவரிக்கின்றன.", + "HeaderSubtitleProfiles": "வசன சுயவிவரங்கள்", + "HeaderSubtitleProfile": "வசன சுயவிவரம்", + "HeaderSubtitleDownloads": "வசன பதிவிறக்கங்கள்", + "HeaderSubtitleAppearance": "வசனத் தோற்றம்", + "HeaderStopRecording": "பதிவு செய்வதை நிறுத்து", + "HeaderStatus": "நிலை", + "HeaderStartNow": "இப்போதே துவக்கு", + "HeaderSpecialFeatures": "சிறப்பு அம்சங்கள்", + "HeaderSpecialEpisodeInfo": "சிறப்பு எபிசோட் தகவல்", + "HeaderSortOrder": "வரிசைப்படுத்து வரிசை", + "LabelAccessStart": "ஆரம்பிக்கும் நேரம்:", + "LabelAccessEnd": "இறுதி நேரம்:", + "LabelAccessDay": "வாரத்தின் நாள்:", + "LabelAbortedByServerShutdown": "(சேவையக பணிநிறுத்தத்தால் கைவிடப்பட்டது)", + "Label3DFormat": "3D வடிவம்:", + "Kids": "குழந்தைகள்", + "Items": "உருப்படிகள்", + "ItemCount": "{0} உருப்படிகள்", + "InstantMix": "உடனடி கலவை", + "InstallingPackage": "{0} (பதிப்பு {1}) ஐ நிறுவுகிறது", + "ImportMissingEpisodesHelp": "காணாமல் போன அத்தியாயங்கள் பற்றிய தகவல்கள் உங்கள் தரவுத்தளத்தில் இறக்குமதி செய்யப்பட்டு பருவங்கள் மற்றும் தொடர்களில் காண்பிக்கப்படும். இது கணிசமாக நீண்ட நூலக ஸ்கேன்களை ஏற்படுத்தக்கூடும்.", + "ImportFavoriteChannelsHelp": "ட்யூனர் சாதனத்தில் பிடித்ததாகக் குறிக்கப்பட்ட சேனல்கள் மட்டுமே இறக்குமதி செய்யப்படும்.", + "Images": "படங்கள்", + "Identify": "அடையாளம் காணவும்", + "HttpsRequiresCert": "பாதுகாப்பான இணைப்புகளை இயக்க, நீங்கள் மறைகுறியாக்கம் போன்ற நம்பகமான SSL சான்றிதழை வழங்க வேண்டும். தயவுசெய்து ஒரு சான்றிதழை வழங்கவும் அல்லது பாதுகாப்பான இணைப்புகளை முடக்கவும்.", + "Horizontal": "கிடைமட்ட", + "LabelBlockContentWithTags": "குறிச்சொற்களைக் கொண்ட உருப்படிகளைத் தடு:", + "LabelBlastMessageIntervalHelp": "உயிருள்ள செய்திகளுக்கு இடையில் வினாடிகளில் கால அளவை தீர்மானிக்கிறது.", + "LabelBlastMessageInterval": "உயிருள்ள செய்தி இடைவெளி", + "LabelBitrate": "பிட்ரேட்:", + "LabelBirthYear": "பிறந்த வருடம்:", + "LabelBirthDate": "பிறந்த தேதி:", + "LabelBindToLocalNetworkAddressHelp": "HTTP சேவையகத்திற்கான உள்ளூர் ஐபி முகவரியை மேலெழுதவும். காலியாக இருந்தால், கிடைக்கக்கூடிய எல்லா முகவரிகளுடனும் சேவையகம் பிணைக்கப்படும். இந்த மதிப்பை மாற்ற மறுதொடக்கம் தேவை.", + "LabelBindToLocalNetworkAddress": "உள்ளூர் பிணைய முகவரியுடன் பிணைக்கவும்:", + "LabelAutomaticallyRefreshInternetMetadataEvery": "இணையத்திலிருந்து மெட்டாடேட்டாவை தானாக புதுப்பிக்கவும்:", + "LabelAuthProvider": "அங்கீகார வழங்குநர்:", + "LabelAudioSampleRate": "ஆடியோ மாதிரி வீதம்:", + "LabelAudioLanguagePreference": "விருப்பமான ஆடியோ மொழி:", + "LabelAudioCodec": "ஆடியோ கோடெக்:", + "LabelAudioChannels": "ஆடியோ சேனல்கள்:", + "LabelAudioBitrate": "ஆடியோ பிட்ரேட்:", + "LabelAudioBitDepth": "ஆடியோ பிட் ஆழம்:", + "LabelArtistsHelp": "அரைக்காற்புள்ளியுடன் பல கலைஞர்களைப் பிரிக்கவும்.", + "LabelArtists": "கலைஞர்கள்:", + "LabelAppNameExample": "எடுத்துக்காட்டு: Sickbeard, Sonarr", + "LabelAppName": "பயன்பாட்டின் பெயர்", + "LabelAllowedRemoteAddressesMode": "தொலை ஐபி முகவரி வடிகட்டி பயன்முறை:", + "LabelAllowedRemoteAddresses": "தொலை ஐபி முகவரி வடிப்பான்:", + "LabelAllowHWTranscoding": "வன்பொருள் டிரான்ஸ்கோடிங்கை அனுமதிக்கவும்", + "LabelAlbumArtists": "ஆல்பம் கலைஞர்கள்:", + "LabelAlbumArtPN": "ஆல்பம் படம் PN:", + "LabelAlbumArtMaxWidthHelp": "ஆல்பம் படத்தின் அதிகபட்ச தெளிவுத்திறன் upnp வழியாக வெளிப்படுத்தப்படுகிறது: albumArtURI.", + "LabelAlbumArtMaxWidth": "ஆல்பம் படம் அதிகபட்ச அகலம்:", + "LabelAlbumArtMaxHeightHelp": "ஆல்பம் படத்தின் அதிகபட்ச தெளிவுத்திறன் upnp வழியாக வெளிப்படுத்தப்படுகிறது: albumArtURI.", + "LabelAlbumArtMaxHeight": "ஆல்பம் படம் அதிகபட்ச உயரம்:", + "LabelAlbumArtHelp": "ஆல்பம் கலைக்கு PN பயன்படுத்தப்படுகிறது, dlna: profileID பண்புக்கூறு upnp: albumArtURI. சில சாதனங்களுக்கு படத்தின் அளவைப் பொருட்படுத்தாமல் ஒரு குறிப்பிட்ட மதிப்பு தேவைப்படுகிறது.", + "LabelAlbum": "ஆல்பம்:", + "LabelAirsBeforeSeason": "பருவத்திற்கு முன் ஒளிபரப்பாகிறது:", + "LabelAirsBeforeEpisode": "அத்தியாயத்திற்கு முன் ஒளிபரப்பாகிறது:", + "LabelAirsAfterSeason": "பருவத்திற்குப் பிறகு ஒளிபரப்பாகிறது:", + "LabelAirTime": "ஒளிபரப்பப்பட்ட நேரம்:", + "LabelAirDays": "ஒளிபரப்பப்பட்ட நாட்கள்:", + "LabelEmbedAlbumArtDidl": "Didlல் ஆல்பம் கலையை உட்பொதிக்கவும்", + "LabelEasyPinCode": "எளிதாக பின் குறியீடு:", + "LabelDynamicExternalId": "{0} ஐடி:", + "LabelDropShadow": "வீழ்நிழல்:", + "LabelDroppedFrames": "கைவிடப்பட்ட பிரேம்கள்:", + "LabelDropImageHere": "படத்தை இங்கே இணைக்கவும் அல்லது உலவ கிளிக் செய்யவும்.", + "LabelDownloadLanguages": "மொழிகளைப் பதிவிறக்குங்கள்:", + "LabelDownMixAudioScaleHelp": "குறைக்கும் போது ஆடியோவை அதிகரிக்கவும். ஒன்றின் மதிப்பு அசல் ஒலி அளவை பாதுகாக்கும்.", + "LabelDownMixAudioScale": "குறைக்கும் போது ஆடியோ ஏற்றம்:", + "LabelDisplaySpecialsWithinSeasons": "அவர்கள் ஒளிபரப்பிய பருவங்களுக்குள் சிறப்புகளைக் காண்பி", + "LabelDisplayOrder": "காட்சி வரிசை:", + "LabelDisplayName": "காட்சி பெயர்:", + "LabelDisplayMode": "காட்சி முறை:", + "LabelDisplayLanguageHelp": "ஜெல்லிஃபின் மொழிபெயர்ப்பது ஒரு தொடர்ச்சியான திட்டம்.", + "LabelDisplayLanguage": "காட்சி மொழி:", + "LabelDiscNumber": "வட்டு எண்:", + "LabelDidlMode": "DIDL பயன்முறை:", + "LabelDeviceDescription": "சாதன விளக்கம்", + "LabelDeinterlaceMethod": "நீக்குதல் முறை:", + "LabelDefaultUserHelp": "இணைக்கப்பட்ட சாதனங்களில் எந்த பயனர் நூலகம் காட்டப்பட வேண்டும் என்பதை தீர்மானிக்கிறது. சுயவிவரங்களைப் பயன்படுத்தி ஒவ்வொரு சாதனத்திற்கும் இது மேலெழுதப்படலாம்.", + "LabelDefaultUser": "இயல்புநிலை பயனர்:", + "LabelDefaultScreen": "இயல்புநிலை திரை:", + "LabelDeathDate": "இறப்பு தேதி:", + "LabelDay": "நாள்:", + "LabelDateTimeLocale": "தேதி நேர இடம்:", + "LabelDateAddedBehaviorHelp": "ஒரு மெட்டாடேட்டா மதிப்பு இருந்தால், இந்த விருப்பங்களில் ஒன்றுக்கு முன்பே இது எப்போதும் பயன்படுத்தப்படும்.", + "LabelDateAddedBehavior": "புதிய உள்ளடக்கத்திற்கான தேதி சேர்க்கப்பட்ட நடத்தை:", + "LabelDateAdded": "சேர்க்கப்பட்ட தேதி:", + "LabelCustomRating": "தனிப்பயன் மதிப்பீடு:", + "LabelCustomDeviceDisplayNameHelp": "தனிப்பயன் காட்சி பெயரை வழங்கவும் அல்லது சாதனத்தால் புகாரளிக்கப்பட்ட பெயரைப் பயன்படுத்த காலியாக விடவும்.", + "LabelCustomCssHelp": "வலை இடைமுகத்தில் உங்கள் சொந்த தனிப்பயன் பாணிகளைப் பயன்படுத்துங்கள்.", + "LabelCustomCss": "தனிப்பயன் CSS:", + "LabelCustomCertificatePathHelp": "தனிப்பயன் களத்தில் TLS ஆதரவை இயக்க சான்றிதழ் மற்றும் தனிப்பட்ட விசையைக் கொண்ட PKCS # 12 கோப்பிற்கான பாதை.", + "LabelCustomCertificatePath": "தனிப்பயன் SSL சான்றிதழ் பாதை:", + "LabelCurrentPassword": "தற்போதைய கடவுச்சொல்:", + "LabelCriticRating": "விமர்சன மதிப்பீடு:", + "LabelCountry": "நாடு:", + "LabelCorruptedFrames": "சிதைந்த பிரேம்கள்:", + "LabelContentType": "உள்ளடக்க வகை:", + "LabelCommunityRating": "சமூக மதிப்பீடு:", + "LabelCollection": "தொகுப்பு:", + "LabelChannels": "சேனல்கள்:", + "LabelCertificatePasswordHelp": "உங்கள் சான்றிதழுக்கு கடவுச்சொல் தேவைப்பட்டால், அதை இங்கே உள்ளிடவும்.", + "LabelCertificatePassword": "சான்றிதழ் கடவுச்சொல்:", + "LabelCancelled": "ரத்து செய்யப்பட்டது", + "LabelCachePathHelp": "படங்கள் போன்ற சேவையக தற்காலிக சேமிப்பு கோப்புகளுக்கான தனிப்பயன் இருப்பிடத்தைக் குறிப்பிடவும். சேவையக இயல்புநிலையைப் பயன்படுத்த காலியாக விடவும்.", + "LabelCachePath": "தற்காலிக சேமிப்பு பாதை:", + "LabelCache": "தற்காலிக சேமிப்பு:", + "LabelBurnSubtitles": "வசன வரிகள் பதிக்க:", + "LabelPleaseRestart": "வலை கிளையண்டை கைமுறையாக மீண்டும் ஏற்றிய பிறகு மாற்றங்கள் நடைமுறைக்கு வரும்.", + "LabelPlayMethod": "பிளே முறை:", + "LabelPlaylist": "பிளேலிஸ்ட்:", + "LabelPlayerDimensions": "பிளேயர் பரிமாணங்கள்:", + "LabelPlayer": "பிளேயர்:", + "LabelPlayDefaultAudioTrack": "மொழியைப் பொருட்படுத்தாமல் இயல்புநிலை ஆடியோ டிராக்கை இயக்கு", + "LabelPlaceOfBirth": "பிறந்த இடம்:", + "LabelPersonRoleHelp": "எடுத்துக்காட்டு: ஐஸ்கிரீம் டிரக் டிரைவர்", + "LabelPersonRole": "பங்கு:", + "LabelPath": "பாதை:", + "LabelPasswordRecoveryPinCode": "அஞ்சல் குறியீடு:", + "LabelPasswordResetProvider": "கடவுச்சொல் மீட்டமை வழங்குநர்:", + "LabelPasswordConfirm": "கடவுச்சொல் (உறுதிப்படுத்து):", + "LabelPassword": "கடவுச்சொல்:", + "LabelParentalRating": "பெற்றோர் மதிப்பீடு:", + "LabelParentNumber": "பெற்றோர் எண்:", + "LabelOverview": "கண்ணோட்டம்:", + "LabelOriginalTitle": "அசல் தலைப்பு:", + "LabelOriginalAspectRatio": "அசல் விகித விகிதம்:", + "LabelOptionalNetworkPathHelp": "இந்த கோப்புறை உங்கள் பிணையத்தில் பகிரப்பட்டால், பிணைய பகிர்வு பாதையை வழங்குவது பிற சாதனங்களில் உள்ள வாடிக்கையாளர்களுக்கு மீடியா கோப்புகளை நேரடியாக அணுக அனுமதிக்கும். எடுத்துக்காட்டாக, {0} அல்லது {1}.", + "LabelOptionalNetworkPath": "பகிரப்பட்ட பிணைய கோப்புறை:", + "LabelNumberOfGuideDaysHelp": "வழிகாட்டி தரவின் அதிக நாட்கள் பதிவிறக்குவது முன்கூட்டியே திட்டமிடவும் மேலும் பட்டியல்களைக் காணவும் திறனை வழங்குகிறது, ஆனால் பதிவிறக்குவதற்கு அதிக நேரம் எடுக்கும். சேனல்களின் எண்ணிக்கையின் அடிப்படையில் ஆட்டோ தேர்வு செய்யும்.", + "LabelNumberOfGuideDays": "பதிவிறக்க வழிகாட்டி தரவின் நாட்களின் எண்ணிக்கை:", + "LabelNumber": "எண்:", + "LabelNotificationEnabled": "இந்த அறிவிப்பை இயக்கவும்", + "LabelNewsCategories": "செய்தி பிரிவுகள்:", + "LabelNewPasswordConfirm": "புதிய கடவு சொல்லை உறுதி செய்:", + "LabelNewPassword": "புதிய கடவுச்சொல்:", + "LabelNewName": "புதிய பெயர்:", + "LabelUnstable": "நிலையற்றது", + "LabelStable": "நிலையானது", + "LabelChromecastVersion": "Chromecast பதிப்பு", + "LabelName": "பெயர்:", + "LabelMusicStreamingTranscodingBitrateHelp": "இசையை ஸ்ட்ரீமிங் செய்யும் போது அதிகபட்ச பிட்ரேட்டைக் குறிப்பிடவும்.", + "LabelMusicStreamingTranscodingBitrate": "இசை டிரான்ஸ்கோடிங் பிட்ரேட்:", + "LabelMovieRecordingPath": "திரைப்பட பதிவு பாதை:", + "LabelMoviePrefixHelp": "திரைப்பட தலைப்புகளுக்கு ஒரு முன்னொட்டு பயன்படுத்தப்பட்டால், அதை இங்கே உள்ளிடவும், இதனால் சேவையகம் அதை சரியாக கையாள முடியும்.", + "LabelMoviePrefix": "திரைப்பட முன்னொட்டு:", + "LabelMovieCategories": "திரைப்பட பிரிவுகள்:", + "LabelMonitorUsers": "இதிலிருந்து செயல்பாட்டைக் கண்காணிக்கவும்:", + "LabelModelUrl": "மாதிரி URL", + "LabelModelNumber": "மாதிரி எண்", + "LabelModelName": "மாதிரி பெயர்", + "LabelModelDescription": "மாதிரி விளக்கம்", + "LabelMinScreenshotDownloadWidth": "குறைந்தபட்ச ஸ்கிரீன்ஷாட் பதிவிறக்க அகலம்:", + "LabelMinResumePercentageHelp": "இந்த நேரத்திற்கு முன் நிறுத்தப்பட்டால் தலைப்புகள் காட்டப்படாது என்று கருதப்படுகிறது.", + "LabelMinResumePercentage": "குறைந்தபட்ச மறுதொடக்கம் சதவீதம்:", + "LabelMinResumeDurationHelp": "பின்னணி இருப்பிடத்தைச் சேமிக்கும் மற்றும் மீண்டும் தொடங்க அனுமதிக்கும் வினாடிகளில் மிகக் குறுகிய வீடியோ நீளம்.", + "LabelMinResumeDuration": "குறைந்தபட்ச மறுதொடக்கம் காலம்:", + "LabelMinBackdropDownloadWidth": "குறைந்தபட்ச பின்னணி பதிவிறக்க அகலம்:", + "LabelMethod": "முறை:", + "LabelMetadataSaversHelp": "உங்கள் மெட்டாடேட்டாவைச் சேமிக்கும்போது பயன்படுத்த கோப்பு வடிவங்களைத் தேர்வுசெய்க.", + "LabelMetadataSavers": "மெட்டாடேட்டா சேமிப்பாளர்கள்:", + "LabelMetadataReadersHelp": "உங்கள் விருப்பமான உள்ளூர் மெட்டாடேட்டா ஆதாரங்களை முன்னுரிமையின் அடிப்படையில் வரிசைப்படுத்தவும். கண்டுபிடிக்கப்பட்ட முதல் கோப்பு படிக்கப்படும்.", + "LabelMetadataReaders": "மெட்டாடேட்டா வாசகர்கள்:", + "LabelMetadataPathHelp": "பதிவிறக்கம் செய்யப்பட்ட கலைப்படைப்பு மற்றும் மெட்டாடேட்டாவிற்கான தனிப்பயன் இருப்பிடத்தைக் குறிப்பிடவும்.", + "LabelMetadataPath": "மெட்டாடேட்டா பாதை:", + "LabelMetadataDownloadersHelp": "முன்னுரிமைக்கு ஏற்ப உங்களுக்கு விருப்பமான மெட்டாடேட்டா பதிவிறக்கிகளை இயக்கவும் தரவரிசைப்படுத்தவும். காணாமல் போன தகவல்களை நிரப்ப மட்டுமே குறைந்த முன்னுரிமை பதிவிறக்கிகள் பயன்படுத்தப்படும்.", + "LabelMetadataDownloadLanguage": "விருப்பமான பதிவிறக்க மொழி:", + "LabelMetadata": "மெட்டாடேட்டா:", + "LabelMessageTitle": "செய்தி தலைப்பு:", + "LabelMessageText": "செய்தி உரை:", + "LabelMaxStreamingBitrateHelp": "ஸ்ட்ரீமிங் செய்யும் போது அதிகபட்ச பிட்ரேட்டைக் குறிப்பிடவும்.", + "LabelMaxStreamingBitrate": "அதிகபட்ச ஸ்ட்ரீமிங் தரம்:", + "LabelMaxScreenshotsPerItem": "ஒரு உருப்படிக்கு அதிகபட்ச ஸ்கிரீன் ஷாட்கள்:", + "LabelMaxResumePercentageHelp": "இந்த நேரத்திற்குப் பிறகு நிறுத்தப்பட்டால் தலைப்புகள் முழுமையாக விளையாடப்படும் என்று கருதப்படுகிறது.", + "LabelMaxResumePercentage": "அதிகபட்ச மறுதொடக்கம் சதவீதம்:", + "LabelMaxParentalRating": "அனுமதிக்கப்பட்ட அதிகபட்ச பெற்றோர் மதிப்பீடு:", + "LabelMaxChromecastBitrate": "Chromecast ஸ்ட்ரீமிங் தரம்:", + "LabelMaxBackdropsPerItem": "ஒரு உருப்படிக்கு அதிகபட்ச பின்னணி எண்ணிக்கை:", + "LabelMatchType": "பொருந்தும் வகை:", + "LabelManufacturerUrl": "உற்பத்தியாளர் URL", + "LabelManufacturer": "உற்பத்தியாளர்:", + "LabelLogs": "பதிவுகள்:", + "LabelLoginDisclaimerHelp": "உள்நுழைவு பக்கத்தின் கீழே காண்பிக்கப்படும் செய்தி.", + "LabelLoginDisclaimer": "உள்நுழைவு மறுப்பு:", + "LabelLockItemToPreventChanges": "எதிர்கால மாற்றங்களைத் தடுக்க இந்த உருப்படியைப் பூட்டவும்", + "LabelLocalHttpServerPortNumberHelp": "HTTP சேவையகத்திற்கான TCP போர்ட் எண்.", + "LabelLocalHttpServerPortNumber": "உள்ளூர் HTTP போர்ட் எண்:", + "LabelLineup": "வரிசை:", + "LabelLibraryPageSizeHelp": "நூலகப் பக்கத்தில் காண்பிக்க வேண்டிய பொருட்களின் அளவை அமைக்கிறது. பேஜிங்கை முடக்க 0 என அமைக்கவும்.", + "LabelLibraryPageSize": "நூலக பக்க அளவு:", + "LabelLanguage": "மொழி:", + "LabelLanNetworks": "LAN நெட்வொர்க்குகள்:", + "LabelKodiMetadataUserHelp": "பிற பயன்பாடுகளைப் பயன்படுத்த வாட்ச் தரவை NFO கோப்புகளில் சேமிக்கவும்.", + "LabelKodiMetadataUser": "இதற்காக பயனர் கண்காணிப்பு தரவை NFO கோப்புகளில் சேமிக்கவும்:", + "LabelKodiMetadataSaveImagePathsHelp": "Kodi வழிகாட்டுதல்களுக்கு இணங்காத படக் கோப்பு பெயர்கள் உங்களிடம் இருந்தால் இது பரிந்துரைக்கப்படுகிறது.", + "LabelKodiMetadataSaveImagePaths": "பட வழிகளை nfo கோப்புகளுக்குள் சேமிக்கவும்", + "LabelKodiMetadataEnablePathSubstitutionHelp": "சேவையகத்தின் பாதை மாற்று அமைப்புகளைப் பயன்படுத்தி பட பாதைகளின் பாதை மாற்றீட்டை இயக்குகிறது.", + "LabelKodiMetadataEnablePathSubstitution": "பாதை மாற்றீட்டை இயக்கு", + "LabelKodiMetadataEnableExtraThumbsHelp": "படங்களை பதிவிறக்கும் போது அவை அதிகபட்ச கோடி தோல் பொருந்தக்கூடிய தன்மைக்காக எக்ஸ்ட்ராஃபனார்ட் மற்றும் எக்ஸ்ட்ராஹம்ப்ஸில் சேமிக்கப்படும்.", + "LabelKodiMetadataEnableExtraThumbs": "extrafanart-ஐ extrathumbs புலத்திற்கு நகலெடுக்கவும்", + "LabelKodiMetadataDateFormatHelp": "NFO கோப்புகளில் உள்ள அனைத்து தேதிகளும் இந்த வடிவமைப்பைப் பயன்படுத்தி பாகுபடுத்தப்படும்.", + "LabelKodiMetadataDateFormat": "வெளியீட்டு தேதி வடிவம்:", + "LabelKidsCategories": "குழந்தைகள் பிரிவுகள்:", + "LabelKeepUpTo": "தொடர்ந்து இருங்கள்:", + "LabelInternetQuality": "இணைய தரம்:", + "LabelInNetworkSignInWithEasyPasswordHelp": "உங்கள் உள்ளூர் நெட்வொர்க்கில் உள்ள வாடிக்கையாளர்களுக்கு உள்நுழைய எளிதான முள் குறியீட்டைப் பயன்படுத்தவும். உங்கள் வழக்கமான கடவுச்சொல் வீட்டிலிருந்து மட்டுமே தேவைப்படும். முள் குறியீடு காலியாக இருந்தால், உங்கள் வீட்டு நெட்வொர்க்கில் கடவுச்சொல் தேவையில்லை.", + "LabelInNetworkSignInWithEasyPassword": "எனது எளிதான முள் குறியீட்டைக் கொண்டு பிணைய உள்நுழைவை இயக்கவும்", + "LabelImportOnlyFavoriteChannels": "பிடித்ததாகக் குறிக்கப்பட்ட சேனல்களுக்கு கட்டுப்படுத்தவும்", + "LabelImageType": "பட வகை:", + "LabelImageFetchersHelp": "முன்னுரிமைக்கு ஏற்ப உங்களுக்கு விருப்பமான பட பெறுபவர்களை இயக்கவும் தரவரிசைப்படுத்தவும்.", + "LabelIdentificationFieldHelp": "ஒரு வழக்கு-உணர்வற்ற அடி மூலக்கூறு அல்லது ரீஜெக்ஸ் வெளிப்பாடு.", + "LabelIconMaxWidthHelp": "Upnp: ஐகான் வழியாக வெளிப்படும் ஐகான்களின் அதிகபட்ச தீர்மானம்.", + "LabelIconMaxWidth": "ஐகான் அதிகபட்ச அகலம்:", + "LabelIconMaxHeightHelp": "Upnp: ஐகான் வழியாக வெளிப்படும் ஐகான்களின் அதிகபட்ச தீர்மானம்.", + "LabelIconMaxHeight": "ஐகான் அதிகபட்ச உயரம்:", + "LabelHttpsPortHelp": "HTTPS சேவையகத்திற்கான TCP போர்ட் எண்.", + "LabelHttpsPort": "உள்ளூர் HTTPS போர்ட் எண்:", + "LabelHomeScreenSectionValue": "முகப்புத் திரை பிரிவு {0}:", + "LabelHomeNetworkQuality": "முகப்பு நெட்வொர்க் தரம்:", + "LabelHardwareAccelerationTypeHelp": "வன்பொருள் முடுக்கம் கூடுதல் உள்ளமைவு தேவை.", + "LabelHardwareAccelerationType": "வன்பொருள் முடுக்கம்:", + "LabelEncoderPreset": "H264 மற்றும் H265 குறியாக்க முன்னமைவு:", + "LabelH264Crf": "H264 குறியாக்கம் CRF:", + "LabelGroupMoviesIntoCollectionsHelp": "மூவி பட்டியல்களைக் காண்பிக்கும் போது, ஒரு தொகுப்பில் உள்ள திரைப்படங்கள் ஒரு குழுவாகக் காட்டப்படும்.", + "LabelGroupMoviesIntoCollections": "திரைப்படங்களை தொகுப்பாக குழு செய்யவும்", + "LabelServerNameHelp": "சேவையகத்தை அடையாளம் காண இந்த பெயர் பயன்படுத்தப்படும் மற்றும் சேவையகத்தின் ஹோஸ்ட்பெயருக்கு இயல்புநிலையாக இருக்கும்.", + "LabelFriendlyName": "நட்பு பெயர்:", + "LabelFormat": "வடிவம்:", + "LabelForgotPasswordUsernameHelp": "உங்கள் பயனர்பெயரை நினைவில் வைத்திருந்தால் உள்ளிடவும்.", + "LabelFont": "எழுத்துரு:", + "LabelFolder": "கோப்புறை:", + "LabelFinish": "முடி", + "LabelFileOrUrl": "கோப்பு அல்லது URL:", + "LabelFailed": "தோல்வி", + "LabelExtractChaptersDuringLibraryScanHelp": "நூலக ஸ்கேன் போது வீடியோக்கள் இறக்குமதி செய்யப்படும்போது அத்தியாய படங்களை உருவாக்கவும். இல்லையெனில், வழக்கமான பட ஸ்கேன் வேகமாக முடிக்க அனுமதிக்கும் அத்தியாயப் படங்கள் திட்டமிடப்பட்ட பணியின் போது அவை பிரித்தெடுக்கப்படும்.", + "LabelExtractChaptersDuringLibraryScan": "நூலக ஸ்கேன் போது அத்தியாய படங்களை பிரித்தெடுக்கவும்", + "LabelBaseUrlHelp": "சேவையக URL இல் தனிப்பயன் துணை அடைவைச் சேர்க்கவும். உதாரணத்திற்கு: http://example.com/<baseurl>", + "LabelBaseUrl": "அடிப்படை URL:", + "LabelEveryXMinutes": "ஒவ்வொரு:", + "LabelEvent": "நிகழ்வு:", + "LabelEpisodeNumber": "அத்தியாயம் எண்:", + "LabelEndDate": "கடைசி தேதி:", + "LabelEnableSingleImageInDidlLimitHelp": "Didlக்குள் பல படங்கள் பதிக்கப்பட்டிருந்தால் சில சாதனங்கள் சரியாக வழங்கப்படாது.", + "LabelEnableSingleImageInDidlLimit": "ஒற்றை உட்பொதிக்கப்பட்ட படத்திற்கு வரம்பு", + "LabelEnableRealtimeMonitorHelp": "கோப்புகளுக்கான மாற்றங்கள் ஆதரிக்கப்பட்ட கோப்பு முறைமைகளில் உடனடியாக செயல்படுத்தப்படும்.", + "LabelEnableRealtimeMonitor": "நிகழ்நேர கண்காணிப்பை இயக்கு", + "LabelEnableHttpsHelp": "கட்டமைக்கப்பட்ட HTTPS போர்ட்டில் கேளுங்கள். இது நடைமுறைக்கு வர செல்லுபடியாகும் சான்றிதழும் வழங்கப்பட வேண்டும்.", + "LabelEnableHttps": "HTTPS ஐ இயக்கு", + "LabelEnableHardwareDecodingFor": "இதற்கான வன்பொருள் டிகோடிங்கை இயக்கவும்:", + "LabelEnableDlnaServerHelp": "உள்ளடக்கத்தை உலவ மற்றும் இயக்க உங்கள் பிணையத்தில் உள்ள UPnP சாதனங்களை அனுமதிக்கிறது.", + "LabelEnableDlnaServer": "DLNA சேவையகத்தை இயக்கு", + "LabelEnableDlnaPlayToHelp": "உங்கள் நெட்வொர்க்கில் உள்ள சாதனங்களைக் கண்டறிந்து அவற்றை தொலைவிலிருந்து கட்டுப்படுத்தும் திறனை வழங்குகின்றன.", + "LabelEnableDlnaPlayTo": "DLNA Play To ஐ இயக்கு", + "LabelEnableDlnaDebugLoggingHelp": "பெரிய பதிவுக் கோப்புகளை உருவாக்கவும், சரிசெய்தல் நோக்கங்களுக்காக மட்டுமே பயன்படுத்தப்பட வேண்டும்.", + "LabelEnableDlnaDebugLogging": "DLNA பிழைத்திருத்த பதிவை இயக்கு", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "SSDP தேடல்களுக்கு இடையில் வினாடிகளில் கால அளவை தீர்மானிக்கிறது.", + "LabelEnableDlnaClientDiscoveryInterval": "கிளையண்ட் கண்டுபிடிப்பு இடைவெளி", + "LabelEnableBlastAliveMessagesHelp": "உங்கள் பிணையத்தில் உள்ள பிற UPnP சாதனங்களால் சேவையகம் நம்பகத்தன்மையுடன் கண்டறியப்படாவிட்டால் இதை இயக்கவும்.", + "LabelEnableBlastAliveMessages": "உயிருள்ள செய்திகளை வழங்கவும்", + "LabelEnableAutomaticPortMapHelp": "உங்கள் திசைவியின் பொது துறைமுகங்களை உங்கள் சேவையகத்தில் உள்ள உள்ளூர் துறைமுகங்களுக்கு UPnP வழியாக தானாக அனுப்பவும். இது சில திசைவி மாதிரிகள் அல்லது பிணைய உள்ளமைவுகளுடன் இயங்காது. சேவையகம் மறுதொடக்கம் செய்யப்படும் வரை மாற்றங்கள் பொருந்தாது.", + "LabelEnableAutomaticPortMap": "தானியங்கி போர்ட் மேப்பிங்கை இயக்கு", + "LabelEmbedAlbumArtDidlHelp": "ஆல்பம் படம் பெறுவதற்கு சில சாதனங்கள் இந்த முறையை விரும்புகின்றன. இயக்கப்பட்ட இந்த விருப்பத்துடன் மற்றவர்கள் விளையாடத் தவறலாம்.", + "ManageRecording": "பதிவை நிர்வகிக்கவும்", + "ManageLibrary": "நூலகத்தை நிர்வகிக்கவும்", + "Logo": "லோகோ", + "LiveTV": "நேரடி தொலைக்காட்சி", + "LiveBroadcasts": "நேரடி ஒளிபரப்பு", + "Live": "நேரலை", + "List": "பட்டியல்", + "Like": "விருப்பம்", + "LibraryAccessHelp": "இந்த பயனருடன் பகிர நூலகங்களைத் தேர்ந்தெடுக்கவும். நிர்வாகிகள் மெட்டாடேட்டா நிர்வாகியைப் பயன்படுத்தி அனைத்து கோப்புறைகளையும் திருத்த முடியும்.", + "LeaveBlankToNotSetAPassword": "கடவுச்சொல் எதுவும் அமைக்க இந்த புலத்தை காலியாக விடலாம்.", + "LearnHowYouCanContribute": "நீங்கள் எவ்வாறு பங்களிக்க முடியும் என்பதை அறிக.", + "LatestFromLibrary": "சமீபத்திய {0}", + "Large": "பெரியது", + "LanNetworksHelp": "அலைவரிசை கட்டுப்பாடுகளைச் செயல்படுத்தும்போது உள்ளூர் பிணையத்தில் பரிசீலிக்கப்படும் நெட்வொர்க்குகளுக்கான ஐபி முகவரிகள் அல்லது ஐபி / நெட்மாஸ்க் உள்ளீடுகளின் கமாவால் பிரிக்கப்பட்ட பட்டியல். அமைக்கப்பட்டால், மற்ற அனைத்து ஐபி முகவரிகளும் வெளிப்புற நெட்வொர்க்கில் இருப்பதாகக் கருதப்படும் மற்றும் வெளிப்புற அலைவரிசை கட்டுப்பாடுகளுக்கு உட்பட்டதாக இருக்கும். காலியாக இருந்தால், சேவையகத்தின் சப்நெட் மட்டுமே உள்ளூர் பிணையத்தில் கருதப்படுகிறது.", + "LabelffmpegPathHelp": "Ffmpeg பயன்பாட்டுக் கோப்பு அல்லது ffmpeg கொண்ட கோப்புறையின் பாதை.", + "LabelffmpegPath": "FFmpeg பாதை:", + "LabelZipCode": "அஞ்சல் குறியீடு:", + "LabelYoureDone": "நீங்கள் முடித்துவிட்டீர்கள்!", + "LabelYear": "ஆண்டு:", + "LabelXDlnaDocHelp": "X_DLNADOC உறுப்பின் உள்ளடக்கத்தை urn: schemas-dlna-org: device-1-0 பெயர்வெளியில் தீர்மானிக்கிறது.", + "LabelXDlnaDoc": "X-DLNA ஆவணம்:", + "LabelXDlnaCapHelp": "X_DLNACAP உறுப்பின் உள்ளடக்கத்தை urn: schemas-dlna-org: device-1-0 பெயர்வெளியில் தீர்மானிக்கிறது.", + "LabelXDlnaCap": "X-DLNA திறன்:", + "LabelWeb": "வலை:", + "LabelVideoResolution": "வீடியோ தெளிவுத்திறன்:", + "LabelVideoCodec": "வீடியோ கோடெக்:", + "LabelVideoBitrate": "வீடியோ பிட்ரேட்:", + "LabelVideo": "வீடியோ", + "DashboardArchitecture": "கட்டமைப்பு: {0}", + "DashboardOperatingSystem": "இயக்க முறைமை: {0}", + "DashboardServerName": "சேவையகம்: {0}", + "DashboardVersionNumber": "பதிப்பு: {0}", + "LabelVersionInstalled": "{0} நிறுவப்பட்டது", + "LabelVersion": "பதிப்பு:", + "LabelValue": "மதிப்பு:", + "LabelVaapiDeviceHelp": "வன்பொருள் முடுக்கத்திற்கு பயன்படுத்தப்படும் ரெண்டர் முனை இது.", + "LabelVaapiDevice": "VA API சாதனம்:", + "LabelUsername": "பயனர்பெயர்:", + "LabelUserRemoteClientBitrateLimitHelp": "சேவையக பின்னணி அமைப்புகளில் அமைக்கப்பட்ட இயல்புநிலை உலகளாவிய மதிப்பை மேலெழுதவும்.", + "LabelUserLoginAttemptsBeforeLockout": "பயனர் பூட்டப்படுவதற்கு முன்பு தோல்வியுற்ற உள்நுழைவு முயற்சிகள்:", + "LabelUserLibraryHelp": "சாதனத்தில் காண்பிக்க வேண்டிய பயனர் நூலகத்தைத் தேர்ந்தெடுக்கவும். இயல்புநிலை அமைப்பைப் பெறுவதற்கு காலியாக விடவும்.", + "LabelUserLibrary": "பயனர் நூலகம்:", + "LabelUserAgent": "பயனர் முகவர்:", + "LabelUser": "பயனர்:", + "LabelUseNotificationServices": "பின்வரும் சேவைகளைப் பயன்படுத்தவும்:", + "LabelTypeText": "உரை", + "LabelTypeMetadataDownloaders": "{0} மெட்டாடேட்டா பதிவிறக்கிகள்:", + "LabelType": "வகை:", + "LabelTunerType": "ட்யூனர் வகை:", + "LabelTunerIpAddress": "ட்யூனர் ஐபி முகவரி:", + "LabelTriggerType": "தூண்டுதல் வகை:", + "LabelTranscodingThreadCountHelp": "டிரான்ஸ்கோடிங் செய்யும்போது பயன்படுத்த வேண்டிய அதிகபட்ச நூல்களைத் தேர்ந்தெடுக்கவும். நூல் எண்ணிக்கையைக் குறைப்பது CPU பயன்பாட்டைக் குறைக்கும், ஆனால் மென்மையான பின்னணி அனுபவத்திற்கு போதுமானதாக மாற்றாது.", + "LabelTranscodingThreadCount": "டிரான்ஸ்கோடிங் நூல் எண்ணிக்கை:", + "LabelTranscodingProgress": "டிரான்ஸ்கோடிங் முன்னேற்றம்:", + "LabelTranscodingFramerate": "டிரான்ஸ்கோடிங் ஃப்ரேம்ரேட்:", + "LabelTranscodes": "டிரான்ஸ்கோட்கள்:", + "LabelTranscodingTempPathHelp": "வாடிக்கையாளர்களுக்கு வழங்கப்பட்ட டிரான்ஸ்கோட் கோப்புகளுக்கான தனிப்பயன் பாதையை குறிப்பிடவும். சேவையக இயல்புநிலையைப் பயன்படுத்த காலியாக விடவும்.", + "LabelTranscodePath": "டிரான்ஸ்கோட் பாதை:", + "LabelTrackNumber": "ட்ராக் எண்:", + "LabelTitle": "தலைப்பு:", + "LabelTimeLimitHours": "கால எல்லை (மணிநேரம்):", + "LabelTime": "நேரம்:", + "LabelTheme": "தீம்:", + "LabelTextSize": "உரை அளவு:", + "LabelTextColor": "உரை நிறம்:", + "LabelTextBackgroundColor": "உரை பின்னணி நிறம்:", + "LabelTagline": "கோஷம்:", + "LabelTag": "குறிச்சொல்:", + "LabelTVHomeScreen": "டிவி பயன்முறை முகப்புத் திரை:", + "LabelSyncPlayAccess": "ஒத்திசைவு அணுகல்", + "LabelSyncPlayAccessNone": "இந்த பயனருக்கு முடக்கப்பட்டது", + "LabelSyncPlayAccessJoinGroups": "குழுக்களில் சேர பயனரை அனுமதிக்கவும்", + "LabelSyncPlayAccessCreateAndJoinGroups": "குழுக்களை உருவாக்க மற்றும் சேர பயனரை அனுமதிக்கவும்", + "LabelSyncPlayLeaveGroupDescription": "ஒத்திசைவை முடக்கு", + "LabelSyncPlayLeaveGroup": "குழுவிலிருந்து விலகு", + "LabelSyncPlayNewGroupDescription": "புதிய குழுவை உருவாக்கவும்", + "LabelSyncPlayNewGroup": "புதிய குழு", + "LabelSyncPlaySyncMethod": "ஒத்திசைவு முறை:", + "LabelSyncPlayPlaybackDiff": "பின்னணி நேர வேறுபாடு:", + "MillisecondsUnit": "ms", + "LabelSyncPlayTimeOffset": "சேவையகத்துடன் நேரம் ஈடுசெய்யப்பட்டது:", + "LabelSupportedMediaTypes": "ஆதரிக்கப்படும் ஊடக வகைகள்:", + "LabelSubtitlePlaybackMode": "வசன முறை:", + "LabelSubtitleFormatHelp": "எடுத்துக்காட்டு: srt", + "LabelSubtitleDownloaders": "வசன பதிவிறக்கிகள்:", + "LabelStreamType": "ஸ்ட்ரீம் வகை:", + "LabelStopping": "நிறுத்துகிறது", + "LabelStopWhenPossible": "சாத்தியமான வகையில் நிறுத்து:", + "LabelStatus": "நிலை:", + "LabelStartWhenPossible": "முடிந்தவரை தொடங்குங்கள்:", + "LabelSportsCategories": "விளையாட்டு பிரிவுகள்:", + "LabelSpecialSeasonsDisplayName": "சிறப்பு பருவ காட்சி பெயர்:", + "LabelSource": "மூலம்:", + "LabelSortTitle": "வரிசை தலைப்பு:", + "LabelSortOrder": "வரிசை வகை:", + "LabelSortBy": "வரிசைப்படுத்து:", + "LabelSonyAggregationFlagsHelp": "திரட்டலில் திரட்டல் ஃப்ளாக்ஸ் உறுப்பு உள்ளடக்கத்தை தீர்மானிக்கிறது: schemas-sonycom: av பெயர்வெளி.", + "LabelSonyAggregationFlags": "Sony திரட்டல் கொடிகள்:", + "LabelSkipIfGraphicalSubsPresentHelp": "வசன வரிகள் உரை பதிப்புகளை வைத்திருப்பது மிகவும் திறமையான விநியோகத்திற்கு வழிவகுக்கும் மற்றும் வீடியோ டிரான்ஸ்கோடிங்கின் சாத்தியத்தை குறைக்கும்.", + "LabelSkipIfGraphicalSubsPresent": "வீடியோவில் ஏற்கனவே உட்பொதிக்கப்பட்ட வசன வரிகள் இருந்தால் தவிர்க்கவும்", + "LabelSkipIfAudioTrackPresentHelp": "ஆடியோ மொழியைப் பொருட்படுத்தாமல் எல்லா வீடியோக்களுக்கும் வசன வரிகள் இருப்பதை உறுதிப்படுத்த இதைத் தேர்வுநீக்கவும்.", + "LabelSkipIfAudioTrackPresent": "இயல்புநிலை ஆடியோ டிராக் பதிவிறக்க மொழியுடன் பொருந்தினால் தவிர்க்கவும்", + "LabelSkipForwardLength": "முன்னோக்கி நீளத்தைத் தவிர்:", + "LabelSkipBackLength": "பின் நீளத்தைத் தவிர்:", + "LabelSize": "அளவு:", + "LabelSimultaneousConnectionLimit": "ஒரே நேரத்தில் ஸ்ட்ரீம் வரம்பு:", + "LabelServerName": "சேவையக பெயர்:", + "LabelServerHostHelp": "192.168.1.100:8096 or https://myserver.com", + "LabelServerHost": "தொகுப்பாளர்:", + "LabelSeriesRecordingPath": "தொடர் பதிவு பாதை:", + "LabelSerialNumber": "வரிசை எண்", + "LabelSendNotificationToUsers": "அறிவிப்பை இதற்கு அனுப்பவும்:", + "LabelSelectVersionToInstall": "நிறுவ பதிப்பைத் தேர்ந்தெடுக்கவும்:", + "LabelSelectUsers": "பயனர்களைத் தேர்ந்தெடுக்கவும்:", + "LabelSelectFolderGroupsHelp": "தேர்வு செய்யப்படாத கோப்புறைகள் தங்களது சொந்த பார்வையில் காண்பிக்கப்படும்.", + "LabelSelectFolderGroups": "திரைப்படங்கள், இசை மற்றும் டிவி போன்ற காட்சிகளில் பின்வரும் கோப்புறைகளிலிருந்து உள்ளடக்கத்தை தானாக தொகுக்கவும்:", + "LabelSeasonNumber": "பருவ எண்:", + "EnableFasterAnimationsHelp": "வேகமான அனிமேஷன்கள் மற்றும் மாற்றங்களைப் பயன்படுத்தவும்", + "EnableFasterAnimations": "வேகமான அனிமேஷன்கள்", + "LabelScreensaver": "ஸ்கிரீன்சேவர்:", + "LabelScheduledTaskLastRan": "கடைசியாக ஓடியது {0}, எடுத்துக் கொண்டது {1}.", + "LabelSaveLocalMetadataHelp": "கலைப்படைப்புகளை மீடியா கோப்புறைகளில் சேமிப்பது அவற்றை எளிதில் திருத்தக்கூடிய இடத்தில் வைக்கும்.", + "LabelSaveLocalMetadata": "கலைப்படைப்புகளை மீடியா கோப்புறைகளில் சேமிக்கவும்", + "LabelRuntimeMinutes": "இயக்க நேரம்:", + "LabelRequireHttpsHelp": "சரிபார்க்கப்பட்டால், சேவையகம் தானாகவே HTTP வழியாக அனைத்து கோரிக்கைகளையும் HTTPS க்கு திருப்பிவிடும். HTTPS இல் சேவையகம் கேட்கவில்லை என்றால் இது எந்த விளைவையும் ஏற்படுத்தாது.", + "LabelRequireHttps": "HTTPS தேவை", + "LabelRemoteClientBitrateLimitHelp": "நெட்வொர்க் சாதனங்களுக்கு வெளியே ஒரு விருப்பமான ஸ்ட்ரீம் பிட்ரேட் வரம்பு. உங்கள் இணைய இணைப்பு கையாளக்கூடியதை விட சாதனங்களை அதிக பிட்ரேட்டைக் கோருவதைத் தடுக்க இது பயனுள்ளதாக இருக்கும். பறக்கும்போது வீடியோக்களை குறைந்த பிட்ரேட்டுக்கு டிரான்ஸ்கோட் செய்வதற்காக இது உங்கள் சேவையகத்தில் CPU சுமை அதிகரிக்கும்.", + "LabelRemoteClientBitrateLimit": "இணைய ஸ்ட்ரீமிங் பிட்ரேட் வரம்பு (Mbps):", + "LabelReleaseDate": "வெளிவரும் தேதி:", + "LabelRefreshMode": "புதுப்பிப்பு பயன்முறை:", + "LabelRecordingPathHelp": "பதிவுகளைச் சேமிக்க இயல்புநிலை இருப்பிடத்தைக் குறிப்பிடவும். காலியாக இருந்தால், சேவையகத்தின் நிரல் தரவு கோப்புறை பயன்படுத்தப்படும்.", + "LabelRecordingPath": "இயல்புநிலை பதிவு பாதை:", + "LabelRecord": "பதிவு:", + "LabelReasonForTranscoding": "டிரான்ஸ்கோடிங்கிற்கான காரணம்:", + "LabelPublicHttpsPortHelp": "உள்ளூர் HTTPS துறைமுகத்துடன் பொருத்தப்பட வேண்டிய பொது துறைமுக எண்.", + "LabelPublicHttpsPort": "பொது HTTPS போர்ட் எண்:", + "LabelPublicHttpPortHelp": "உள்ளூர் HTTP துறைமுகத்துடன் பொருத்தப்பட வேண்டிய பொது போர்ட் எண்.", + "LabelPublicHttpPort": "பொது HTTP போர்ட் எண்:", + "LabelProtocolInfoHelp": "சாதனத்திலிருந்து GetProtocolInfo கோரிக்கைகளுக்கு பதிலளிக்கும் போது பயன்படுத்தப்படும் மதிப்பு.", + "LabelProtocolInfo": "நெறிமுறை தகவல்:", + "LabelProtocol": "நெறிமுறை:", + "LabelProfileVideoCodecs": "வீடியோ கோடெக்குகள்:", + "LabelProfileContainersHelp": "கமாவால் பிரிக்கப்பட்டது. எல்லா கொள்கலன்களுக்கும் விண்ணப்பிக்க இதை காலியாக விடலாம்.", + "LabelProfileContainer": "கொள்கலன்:", + "LabelProfileCodecsHelp": "கமாவால் பிரிக்கப்பட்டது. எல்லா கோடெக்குகளுக்கும் விண்ணப்பிக்க இதை காலியாக விடலாம்.", + "LabelProfileCodecs": "கோடெக்குகள்:", + "LabelProfileAudioCodecs": "ஆடியோ கோடெக்குகள்:", + "LabelPreferredSubtitleLanguage": "விருப்பமான வசன மொழி:", + "LabelPreferredDisplayLanguage": "விருப்பமான காட்சி மொழி:", + "LabelPostProcessorArgumentsHelp": "பதிவு கோப்புக்கான பாதையாக {path} ஐப் பயன்படுத்தவும்.", + "LabelPostProcessorArguments": "பிந்தைய செயலி கட்டளை வரி வாதங்கள்:", + "LabelPostProcessor": "செயலாக்கத்திற்கு பிந்தைய பயன்பாடு:", + "MapChannels": "சேனல் மேப்பிங்", + "MoveLeft": "இடதுபுறமாக நகர்த்தவும்", + "MoreMediaInfo": "மீடியா தகவல்", + "MoreUsersCanBeAddedLater": "டாஷ்போர்டுக்குள் இருந்து அதிகமான பயனர்களை பின்னர் சேர்க்கலாம்.", + "MoreFromValue": "{0} இலிருந்து மேலும்", + "Monday": "திங்கட்கிழமை", + "Mobile": "கைபேசி", + "MinutesBefore": "நிமிடங்களுக்கு முன்", + "MinutesAfter": "நிமிடங்கள் கழித்து", + "MetadataSettingChangeHelp": "மெட்டாடேட்டா அமைப்புகளை மாற்றுவது புதிய உள்ளடக்கத்தை முன்னோக்கி செல்லும். இருக்கும் உள்ளடக்கத்தைப் புதுப்பிக்க, விவரம் திரையைத் திறந்து புதுப்பிப்பு பொத்தானைக் கிளிக் செய்க, அல்லது மெட்டாடேட்டா நிர்வாகியைப் பயன்படுத்தி மொத்தமாக புதுப்பிப்புகளைச் செய்யுங்கள்.", + "MetadataManager": "மெட்டாடேட்டா மேலாளர்", + "Metadata": "மெட்டாடேட்டா", + "MessageSyncPlayErrorMedia": "ஒத்திசைவை இயக்குவதில் தோல்வி! மீடியா பிழை.", + "MessageSyncPlayErrorMissingSession": "ஒத்திசைவை இயக்குவதில் தோல்வி! அமர்வு இல்லை.", + "MessageSyncPlayErrorNoActivePlayer": "செயலில் உள்ள எந்த பிளேயரும் கிடைக்கவில்லை. ஒத்திசைவு முடக்கப்பட்டுள்ளது.", + "MessageSyncPlayErrorAccessingGroups": "குழுக்கள் பட்டியலை அணுகும்போது பிழை ஏற்பட்டது.", + "MessageSyncPlayLibraryAccessDenied": "இந்த உள்ளடக்கத்திற்கான அணுகல் தடைசெய்யப்பட்டுள்ளது.", + "MessageSyncPlayJoinGroupDenied": "ஒத்திசைவைப் பயன்படுத்த அனுமதி தேவை.", + "MessageSyncPlayCreateGroupDenied": "ஒரு குழுவை உருவாக்க அனுமதி தேவை.", + "MessageSyncPlayGroupDoesNotExist": "குழு இல்லாததால் குழுவில் சேர முடியவில்லை.", + "MessageSyncPlayPlaybackPermissionRequired": "பின்னணி அனுமதி தேவை.", + "MessageSyncPlayNoGroupsAvailable": "குழுக்கள் எதுவும் கிடைக்கவில்லை. முதலில் ஏதாவது வாசிக்க தொடங்குங்கள்.", + "MessageSyncPlayGroupWait": "{0} இடையகப்படுத்துகிறது…", + "MessageSyncPlayUserLeft": "{0} குழுவிலிருந்து வெளியேறினார்.", + "MessageSyncPlayUserJoined": "{0} குழுவில் சேர்ந்துள்ளார்.", + "MessageSyncPlayDisabled": "ஒத்திசைவு முடக்கப்பட்டது.", + "MessageSyncPlayEnabled": "ஒத்திசைவு இயக்கப்பட்டது.", + "MessageYouHaveVersionInstalled": "நீங்கள் தற்போது {0} பதிப்பை நிறுவியுள்ளீர்கள்.", + "MessageUnsetContentHelp": "உள்ளடக்கம் எளிய கோப்புறைகளாக காண்பிக்கப்படும். சிறந்த முடிவுகளுக்கு துணை கோப்புறைகளின் உள்ளடக்க வகைகளை அமைக்க மெட்டாடேட்டா நிர்வாகியைப் பயன்படுத்தவும்.", + "MessageUnableToConnectToServer": "தேர்ந்தெடுக்கப்பட்ட சேவையகத்துடன் இப்போது எங்களால் இணைக்க முடியவில்லை. இது இயங்குவதை உறுதிசெய்து மீண்டும் முயற்சிக்கவும்.", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "உங்கள் நூலகத்திலிருந்து பின்வரும் ஊடக இருப்பிடங்கள் அகற்றப்படும்:", + "MessageReenableUser": "மீண்டும் இயக்க கீழே காண்க", + "MessagePluginInstallDisclaimer": "கூடுதல் அம்சங்கள் மற்றும் நன்மைகளுடன் உங்கள் அனுபவத்தை மேம்படுத்த சமூக உறுப்பினர்களால் உருவாக்கப்பட்ட செருகுநிரல்கள் சிறந்த வழியாகும். நிறுவுவதற்கு முன், உங்கள் சேவையகத்தில் அவை நீண்ட நூலக ஸ்கேன், கூடுதல் பின்னணி செயலாக்கம் மற்றும் கணினி நிலைத்தன்மை குறைதல் போன்ற விளைவுகளைப் பற்றி எச்சரிக்கையாக இருங்கள்.", + "MessagePluginConfigurationRequiresLocalAccess": "இந்த சொருகி கட்டமைக்க உங்கள் உள்ளூர் சேவையகத்தில் நேரடியாக உள்நுழைக.", + "MessagePleaseWait": "தயவுசெய்து காத்திருங்கள். இதற்கு ஒரு நிமிடம் ஆகலாம்.", + "MessagePleaseEnsureInternetMetadata": "இணைய மெட்டாடேட்டாவைப் பதிவிறக்குவது இயக்கப்பட்டிருப்பதை உறுதிசெய்க.", + "MessagePlayAccessRestricted": "இந்த உள்ளடக்கத்தின் பின்னணி தற்போது தடைசெய்யப்பட்டுள்ளது. மேலும் தகவலுக்கு உங்கள் சேவையக நிர்வாகியைத் தொடர்பு கொள்ளவும்.", + "MessagePasswordResetForUsers": "பின்வரும் பயனர்கள் தங்கள் கடவுச்சொற்களை மீட்டமைத்துள்ளனர். மீட்டமைப்பைச் செய்யப் பயன்படுத்தப்பட்ட முள் குறியீடுகளுடன் அவர்கள் இப்போது உள்நுழையலாம்.", + "MessageNothingHere": "இங்கு எதுவுமில்லை.", + "MessageNoTrailersFound": "இணைய டிரெய்லர்களின் நூலகத்தைச் சேர்ப்பதன் மூலம் உங்கள் திரைப்பட அனுபவத்தை மேம்படுத்த டிரெய்லர்கள் சேனலை நிறுவவும்.", + "MessageNoServersAvailable": "தானியங்கி சேவையக கண்டுபிடிப்பைப் பயன்படுத்தி சேவையகங்கள் எதுவும் கண்டுபிடிக்கப்படவில்லை.", + "MessageNoPluginsInstalled": "உங்களிடம் செருகுநிரல்கள் எதுவும் நிறுவப்படவில்லை.", + "MessageNoMovieSuggestionsAvailable": "திரைப்பட பரிந்துரைகள் எதுவும் தற்போது கிடைக்கவில்லை. உங்கள் திரைப்படங்களைப் பார்க்கவும் மதிப்பீடு செய்யவும் தொடங்கவும், பின்னர் உங்கள் பரிந்துரைகளைக் காண மீண்டும் வாருங்கள்.", + "MessageNoGenresAvailable": "இணையத்திலிருந்து வகைகளை இழுக்க சில மெட்டாடேட்டா வழங்குநர்களை இயக்கவும்.", + "MessageNoCollectionsAvailable": "திரைப்படங்கள், தொடர் மற்றும் ஆல்பங்களின் தனிப்பயனாக்கப்பட்ட குழுக்களை அனுபவிக்க தொகுப்புகள் உங்களை அனுமதிக்கின்றன. தொகுப்புகளை உருவாக்கத் தொடங்க + பொத்தானைக் கிளிக் செய்க.", + "MessageAddRepository": "நீங்கள் ஒரு களஞ்சியத்தைச் சேர்க்க விரும்பினால், தலைப்புக்கு அடுத்துள்ள பொத்தானைக் கிளிக் செய்து கோரப்பட்ட தகவலை நிரப்பவும்.", + "LabelRepositoryNameHelp": "உங்கள் சேவையகத்தில் சேர்க்கப்பட்ட மற்றவர்களிடமிருந்து இந்த களஞ்சியத்தை வேறுபடுத்துவதற்கான தனிப்பயன் பெயர்.", + "LabelRepositoryName": "களஞ்சிய பெயர்", + "LabelRepositoryUrlHelp": "நீங்கள் சேர்க்க விரும்பும் களஞ்சிய மேனிஃபெஸ்டின் இடம்.", + "LabelRepositoryUrl": "களஞ்சிய URL", + "HeaderNewRepository": "புதிய களஞ்சியம்", + "MessageNoRepositories": "களஞ்சியங்கள் இல்லை.", + "MessageNoAvailablePlugins": "கிடைக்கக்கூடிய செருகுநிரல்கள் இல்லை.", + "MessageLeaveEmptyToInherit": "பெற்றோர் உருப்படி அல்லது உலகளாவிய இயல்புநிலை மதிப்பிலிருந்து அமைப்புகளைப் பெறுவதற்கு காலியாக விடவும்.", + "MessageItemsAdded": "உருப்படிகள் சேர்க்கப்பட்டன.", + "MessageItemSaved": "உருப்படி சேமிக்கப்பட்டது.", + "MessageInvalidUser": "தவறான பயனர்பெயர் அல்லது கடவுச்சொல். தயவுசெய்து மீண்டும் முயற்சி செய்க.", + "MessageInvalidForgotPasswordPin": "தவறான அல்லது காலாவதியான முள் குறியீடு உள்ளிடப்பட்டது. தயவுசெய்து மீண்டும் முயற்சி செய்க.", + "MessageImageTypeNotSelected": "கீழ்தோன்றும் மெனுவிலிருந்து பட வகையைத் தேர்ந்தெடுக்கவும்.", + "MessageImageFileTypeAllowed": "JPEG மற்றும் PNG கோப்புகள் மட்டுமே ஆதரிக்கப்படுகின்றன.", + "MessageForgotPasswordInNetworkRequired": "கடவுச்சொல் மீட்டமைப்பு செயல்முறையைத் தொடங்க உங்கள் வீட்டு நெட்வொர்க்கில் மீண்டும் முயற்சிக்கவும்.", + "MessageForgotPasswordFileCreated": "பின்வரும் கோப்பு உங்கள் சேவையகத்தில் உருவாக்கப்பட்டது மற்றும் எவ்வாறு தொடரலாம் என்பதற்கான வழிமுறைகளைக் கொண்டுள்ளது:", + "MessageFileReadError": "கோப்பைப் படிப்பதில் பிழை ஏற்பட்டது. தயவுசெய்து மீண்டும் முயற்சி செய்க.", + "MessageEnablingOptionLongerScans": "இந்த விருப்பத்தை இயக்குவது கணிசமாக நீண்ட நூலக ஸ்கேன்களுக்கு வழிவகுக்கும்.", + "MessageDownloadQueued": "பதிவிறக்கம் வரிசைப்படுத்தப்பட்டுள்ளது.", + "MessageDirectoryPickerLinuxInstruction": "Arch Linux, CentOS, Debian, Fedora, openSUSE அல்லது Ubuntu ஆகியவற்றில் லினக்ஸைப் பொறுத்தவரை, சேவை பயனருக்கு உங்கள் சேமிப்பிட இருப்பிடங்களுக்கு குறைந்தபட்சம் படிக்க அணுகலை வழங்க வேண்டும்.", + "MessageDirectoryPickerBSDInstruction": "BSD ஐப் பொறுத்தவரை, உங்கள் FreeNAS சிறைக்குள் சேமிப்பிடத்தை உள்ளமைக்க வேண்டியிருக்கலாம், எனவே ஜெல்லிஃபின் உங்கள் மீடியாவை அணுக முடியும்.", + "MessageDeleteTaskTrigger": "இந்த பணி தூண்டுதலை நீக்க விரும்புகிறீர்களா?", + "MessageCreateAccountAt": "{0} இல் ஒரு கணக்கை உருவாக்கவும்", + "MessageContactAdminToResetPassword": "உங்கள் கடவுச்சொல்லை மீட்டமைக்க உங்கள் கணினி நிர்வாகியைத் தொடர்பு கொள்ளவும்.", + "MessageConfirmShutdown": "சேவையகத்தை நிறுத்த விரும்புகிறீர்களா?", + "MessageConfirmRevokeApiKey": "இந்த API விசையை திரும்பப் பெற விரும்புகிறீர்களா? இந்த சேவையகத்திற்கான பயன்பாட்டின் இணைப்பு திடீரென நிறுத்தப்படும்.", + "MessageConfirmRestart": "ஜெல்லிஃபின் மறுதொடக்கம் செய்ய விரும்புகிறீர்களா?", + "MessageConfirmRemoveMediaLocation": "இந்த இருப்பிடத்தை அகற்ற விரும்புகிறீர்களா?", + "MessageConfirmRecordingCancellation": "பதிவை ரத்து செய்யவா?", + "MessageConfirmProfileDeletion": "இந்த சுயவிவரத்தை நீக்க விரும்புகிறீர்களா?", + "MessageConfirmDeleteTunerDevice": "இந்த சாதனத்தை நீக்க விரும்புகிறீர்களா?", + "MessageConfirmDeleteGuideProvider": "இந்த வழிகாட்டி வழங்குநரை நீக்க விரும்புகிறீர்களா?", + "MessageConfirmAppExit": "நீங்கள் வெளியேற விரும்புகிறீர்களா?", + "MessageAreYouSureYouWishToRemoveMediaFolder": "இந்த மீடியா கோப்புறையை அகற்ற விரும்புகிறீர்களா?", + "MessageAreYouSureDeleteSubtitles": "இந்த வசன கோப்பை நீக்க விரும்புகிறீர்களா?", + "MessageAlreadyInstalled": "இந்த பதிப்பு ஏற்கனவே நிறுவப்பட்டுள்ளது.", + "Menu": "பட்டியல்", + "MediaIsBeingConverted": "மீடியா இயங்கும் சாதனத்துடன் பொருந்தக்கூடிய வடிவமாக ஊடகங்கள் மாற்றப்படுகின்றன.", + "MediaInfoStreamTypeVideo": "காணொளி", + "MediaInfoStreamTypeSubtitle": "வசன வரிகள்", + "MediaInfoStreamTypeEmbeddedImage": "உட்பொதிக்கப்பட்ட படம்", + "MediaInfoStreamTypeData": "தகவல்", + "MediaInfoStreamTypeAudio": "ஆடியோ", + "MediaInfoTimestamp": "நேர முத்திரை", + "MediaInfoSize": "அளவு", + "MediaInfoSampleRate": "மாதிரி விகிதம்", + "MediaInfoResolution": "தெளிவுத்திறன்", + "MediaInfoRefFrames": "குறிப்பு கட்டமைப்பு", + "MediaInfoProfile": "சுயவிவரம்", + "MediaInfoPixelFormat": "பிக்சல் வடிவம்", + "MediaInfoPath": "பாதை", + "MediaInfoLevel": "நிலை", + "MediaInfoLayout": "தளவமைப்பு", + "MediaInfoLanguage": "மொழி", + "MediaInfoInterlaced": "ஒன்றோடொன்று", + "MediaInfoFramerate": "ஃப்ரேமரேட்", + "MediaInfoForced": "கட்டாயப்படுத்தப்பட்டது", + "MediaInfoExternal": "வெளிப்புறம்", + "MediaInfoDefault": "இயல்புநிலை", + "MediaInfoContainer": "கொள்கலன்", + "MediaInfoCodecTag": "கோடெக் குறிச்சொல்", + "MediaInfoCodec": "கோடெக்", + "MediaInfoChannels": "சேனல்கள்", + "MediaInfoBitrate": "பிட்ரேட்", + "MediaInfoBitDepth": "பிட் ஆழம்", + "MediaInfoAspectRatio": "விகித விகிதம்", + "MediaInfoAnamorphic": "அனமார்பிக்", + "MaxParentalRatingHelp": "அதிக மதிப்பீட்டைக் கொண்ட உள்ளடக்கம் இந்த பயனரிடமிருந்து மறைக்கப்படும்.", + "MarkUnplayed": "வாசிக்கப்படாதது குறி இடு", + "MarkPlayed": "வாசிக்கப்பட்டது குறி இடு", + "OptionEveryday": "தினமும்", + "OptionEstimateContentLength": "டிரான்ஸ்கோடிங் செய்யும் போது உள்ளடக்க நீளத்தை மதிப்பிடுங்கள்", + "OptionEquals": "சமம்", + "OptionEnded": "முடிந்தது", + "OptionEnableM2tsModeHelp": "Mpegts க்கு குறியாக்கம் செய்யும் போது m2ts பயன்முறையை இயக்கவும்.", + "OptionEnableM2tsMode": "M2ts பயன்முறையை இயக்கு", + "OptionEnableForAllTuners": "அனைத்து ட்யூனர் சாதனங்களுக்கும் இயக்கு", + "OptionEnableExternalContentInSuggestionsHelp": "பரிந்துரைக்கப்பட்ட உள்ளடக்கத்தில் இணைய டிரெய்லர்கள் மற்றும் நேரடி தொலைக்காட்சி நிரல்களை சேர்க்க அனுமதிக்கவும்.", + "OptionEnableExternalContentInSuggestions": "பரிந்துரைகளில் வெளிப்புற உள்ளடக்கத்தை இயக்கவும்", + "OptionEnableAccessToAllLibraries": "எல்லா நூலகங்களுக்கும் அணுகலை இயக்கவும்", + "OptionEnableAccessToAllChannels": "எல்லா சேனல்களுக்கும் அணுகலை இயக்கவும்", + "OptionEnableAccessFromAllDevices": "எல்லா சாதனங்களிலிருந்தும் அணுகலை இயக்கவும்", + "OptionEmbedSubtitles": "கொள்கலனுக்குள் உட்பொதிக்கவும்", + "OptionDvd": "டிவிடி", + "OptionDownloadThumbImage": "சிறுபடம்", + "OptionDownloadPrimaryImage": "முதன்மை", + "OptionDownloadMenuImage": "பட்டியல்", + "OptionDownloadLogoImage": "லோகோ", + "OptionDownloadImagesInAdvanceHelp": "இயல்பாக, பெரும்பாலான படங்கள் கிளையன்ட் கோரியபோது மட்டுமே பதிவிறக்கப்படும். புதிய மீடியா இறக்குமதி செய்யப்படுவதால், எல்லா படங்களையும் முன்கூட்டியே பதிவிறக்க இந்த விருப்பத்தை இயக்கவும். இது கணிசமாக நீண்ட நூலக ஸ்கேன்களை ஏற்படுத்தக்கூடும்.", + "OptionDownloadImagesInAdvance": "படங்களை முன்கூட்டியே பதிவிறக்கவும்", + "OptionDownloadDiscImage": "வட்டு", + "OptionDownloadBoxImage": "பெட்டி", + "OptionDownloadBannerImage": "பதாகை", + "OptionDownloadBackImage": "பின்னால்", + "OptionDownloadArtImage": "கலை", + "OptionDisplayFolderViewHelp": "உங்கள் பிற ஊடக நூலகங்களுடன் கோப்புறைகளைக் காண்பி. நீங்கள் ஒரு எளிய கோப்புறை காட்சியைப் பெற விரும்பினால் இது பயனுள்ளதாக இருக்கும்.", + "OptionDisplayFolderView": "எளிய மீடியா கோப்புறைகளைக் காட்ட கோப்புறை காட்சியைக் காண்பி", + "OptionDislikes": "வெறுப்புகள்", + "OptionDisableUserHelp": "இந்த பயனரிடமிருந்து எந்த இணைப்பையும் சேவையகம் அனுமதிக்காது. தற்போதுள்ள இணைப்புகள் திடீரென நிறுத்தப்படும்.", + "OptionDisableUser": "இந்த பயனரை முடக்கு", + "OptionDescending": "இறங்கு", + "OptionDatePlayed": "உடன் தேதி", + "OptionDateAddedImportTime": "நூலகத்தில் ஸ்கேன் செய்யப்பட்ட தேதியைப் பயன்படுத்தவும்", + "OptionDateAddedFileTime": "கோப்பு உருவாக்கும் தேதியைப் பயன்படுத்தவும்", + "OptionDateAdded": "சேர்த்த தேதி", + "OptionDaily": "தினசரி", + "OptionCustomUsers": "தனிப்பயன்", + "OptionCriticRating": "விமர்சன மதிப்பீடு", + "OptionContinuing": "தொடர்கிறது", + "OptionCommunityRating": "சமூக மதிப்பீடு", + "OptionCaptionInfoExSamsung": "CaptionInfoEx (சாம்சங்)", + "OptionBluray": "ப்ளூ-ரே", + "OptionBlockTvShows": "தொலைக்காட்சி நிகழ்ச்சிகள்", + "OptionBlockTrailers": "டிரெய்லர்கள்", + "OptionBlockMusic": "இசை", + "OptionBlockMovies": "திரைப்படங்கள்", + "OptionBlockLiveTvChannels": "நேரடி தொலைக்காட்சி சேனல்கள்", + "OptionBlockChannelContent": "இணைய சேனல் உள்ளடக்கம்", + "OptionBlockBooks": "புத்தகங்கள்", + "OptionBanner": "பதாகை", + "OptionAutomaticallyGroupSeriesHelp": "இந்த நூலகத்திற்குள் பல கோப்புறைகளில் பரவியிருக்கும் தொடர்கள் தானாக ஒரு தொடராக ஒன்றிணைக்கப்படும்.", + "OptionAutomaticallyGroupSeries": "பல கோப்புறைகளில் பரவியிருக்கும் தொடர்களை தானாக இணைக்கவும்", + "OptionAuto": "தானாக", + "OptionAscending": "ஏறுதல்", + "OptionArtist": "கலைஞர்", + "OptionAllowVideoPlaybackTranscoding": "டிரான்ஸ்கோடிங் தேவைப்படும் வீடியோ பிளேபேக்கை அனுமதிக்கவும்", + "OptionAllowVideoPlaybackRemuxing": "மறு குறியாக்கம் இல்லாமல் மாற்றம் தேவைப்படும் வீடியோ பிளேபேக்கை அனுமதிக்கவும்", + "OptionAllowUserToManageServer": "சேவையகத்தை நிர்வகிக்க இந்த பயனரை அனுமதிக்கவும்", + "OptionAllowSyncTranscoding": "டிரான்ஸ்கோடிங் தேவைப்படும் மீடியா பதிவிறக்கம் மற்றும் ஒத்திசைவை அனுமதிக்கவும்", + "OptionAllowRemoteSharedDevicesHelp": "ஒரு பயனர் அவற்றைக் கட்டுப்படுத்தத் தொடங்கும் வரை DLNA சாதனங்கள் பகிரப்பட்டதாகக் கருதப்படுகின்றன.", + "OptionAllowRemoteSharedDevices": "பகிரப்பட்ட சாதனங்களின் தொலைநிலைக் கட்டுப்பாட்டை அனுமதிக்கவும்", + "OptionAllowRemoteControlOthers": "பிற பயனர்களின் ரிமோட் கண்ட்ரோலை அனுமதிக்கவும்", + "OptionAllowMediaPlaybackTranscodingHelp": "டிரான்ஸ்கோடிங்கிற்கான அணுகலைக் கட்டுப்படுத்துவது ஆதரிக்கப்படாத ஊடக வடிவங்கள் காரணமாக வாடிக்கையாளர்களுக்கு பின்னணி தோல்விகளை ஏற்படுத்தக்கூடும்.", + "OptionAllowMediaPlayback": "மீடியா பிளேபேக்கை அனுமதிக்கவும்", + "OptionAllowManageLiveTv": "லைவ் டிவி பதிவு நிர்வாகத்தை அனுமதிக்கவும்", + "OptionAllowLinkSharingHelp": "ஊடகத் தகவல்களைக் கொண்ட வலைப்பக்கங்கள் மட்டுமே பகிரப்படுகின்றன. மீடியா கோப்புகள் ஒருபோதும் பகிரங்கமாக பகிரப்படுவதில்லை. பங்குகள் நேர வரம்புக்குட்பட்டவை மற்றும் {0} நாட்களுக்குப் பிறகு காலாவதியாகும்.", + "OptionAllowLinkSharing": "சமூக ஊடக பகிர்வை அனுமதிக்கவும்", + "OptionAllowContentDownloading": "மீடியா பதிவிறக்க மற்றும் ஒத்திசைக்க அனுமதிக்கவும்", + "OptionAllowBrowsingLiveTv": "நேரடி தொலைக்காட்சி அணுகலை அனுமதிக்கவும்", + "OptionForceRemoteSourceTranscoding": "தொலைநிலை ஊடக மூலங்களின் டிரான்ஸ்கோடிங்கை கட்டாயப்படுத்தவும் (லைடிவி போன்றவை)", + "OptionAllowAudioPlaybackTranscoding": "டிரான்ஸ்கோடிங் தேவைப்படும் ஆடியோ பிளேபேக்கை அனுமதிக்கவும்", + "OptionAllUsers": "அனைத்து பயனாளர்கள்", + "OptionAlbumArtist": "ஆல்பம் கலைஞர்", + "OptionAlbum": "ஆல்பம்", + "OptionAdminUsers": "நிர்வாகிகள்", + "OnlyImageFormats": "பட வடிவங்கள் மட்டுமே (VOBSUB, PGS, SUB)", + "Option3D": "3D", + "OnlyForcedSubtitlesHelp": "கட்டாயமாக குறிக்கப்பட்ட வசன வரிகள் மட்டுமே ஏற்றப்படும்.", + "OnlyForcedSubtitles": "கட்டாயப்படுத்தப்பட்டது மட்டுமே", + "OneChannel": "ஒரு சேனல்", + "Off": "முடக்கு", + "NumLocationsValue": "{0} கோப்புறைகள்", + "Normal": "இயல்பானது", + "None": "எதுவுமில்லை", + "NoSubtitlesHelp": "முன்னிருப்பாக வசன வரிகள் ஏற்றப்படாது. பிளேபேக்கின் போது அவற்றை கைமுறையாக இயக்கலாம்.", + "NoSubtitleSearchResultsFound": "முடிவுகள் எதுவும் இல்லை.", + "MessageNoPluginConfiguration": "இந்த சொருகி கட்டமைக்க எந்த அமைப்புகளும் இல்லை.", + "MessageNoNextUpItems": "எதுவும் கிடைக்கவில்லை. உங்கள் நிகழ்ச்சிகளைப் பார்க்கத் தொடங்குங்கள்!", + "NoNewDevicesFound": "புதிய சாதனங்கள் எதுவும் கிடைக்கவில்லை. புதிய ட்யூனரைச் சேர்க்க, இந்த உரையாடலை மூடி சாதனத் தகவலை கைமுறையாக உள்ளிடவும்.", + "NoCreatedLibraries": "நீங்கள் இதுவரை எந்த நூலகங்களையும் உருவாக்கவில்லை என்று தெரிகிறது. {0} இப்போது ஒன்றை உருவாக்க விரும்புகிறீர்களா? {1}", + "No": "இல்லை", + "NextUp": "அடுத்தது", + "NextTrack": "அடுத்ததுக்குச் செல்க", + "Next": "அடுத்தது", + "News": "செய்தி", + "NewEpisodesOnly": "புதிய அத்தியாயங்கள் மட்டுமே", + "NewEpisodes": "புதிய அத்தியாயங்கள்", + "NewCollectionNameExample": "எடுத்துக்காட்டு: Star Wars Collection", + "NewCollectionHelp": "திரைப்படங்கள் மற்றும் பிற நூலக உள்ளடக்கங்களின் தனிப்பயனாக்கப்பட்ட குழுக்களை உருவாக்க தொகுப்புகள் உங்களை அனுமதிக்கின்றன.", + "NewCollection": "புதிய தொகுப்பு", + "Never": "ஒருபோதும்", + "Name": "பெயர்", + "MySubtitles": "எனது வசன வரிகள்", + "Mute": "முடக்கு", + "MusicVideo": "இசை கானொளி", + "MusicLibraryHelp": "{0} இசை பெயரிடும் வழிகாட்டியை {1} மதிப்பாய்வு செய்யவும்.", + "MusicArtist": "இசைக் கலைஞர்", + "MusicAlbum": "இசை ஆல்பம்", + "Movie": "திரைப்படம்", + "MovieLibraryHelp": "{0} மூவி பெயரிடும் வழிகாட்டியை {1} மதிப்பாய்வு செய்யவும்.", + "MoveRight": "வலதுபுறம் நகர்த்தவும்", + "PlayAllFromHere": "அனைத்தையும் இங்கிருந்து வாசிக்கவும்", + "Play": "வாசிக்கவும்", + "PlaceFavoriteChannelsAtBeginning": "பிடித்த சேனல்களை ஆரம்பத்தில் வைக்கவும்", + "PinCodeResetConfirmation": "பின் குறியீட்டை மீட்டமைக்க விரும்புகிறீர்களா?", + "PinCodeResetComplete": "முள் குறியீடு மீட்டமைக்கப்பட்டது.", + "PictureInPicture": "படத்தினுள் படம்", + "Person": "நபர்", + "PerfectMatch": "சரியான பொருத்தம்", + "People": "மக்கள்", + "PasswordSaved": "கடவுச்சொல் சேமிக்கப்பட்டது.", + "PasswordResetProviderHelp": "இந்த பயனர் கடவுச்சொல் மீட்டமைப்பைக் கோரும்போது பயன்படுத்த கடவுச்சொல் மீட்டமைப்பு வழங்குநரைத் தேர்வுசெய்க.", + "HeaderResetPassword": "கடவுச்சொல்லை மீட்டமைக்க", + "PasswordResetConfirmation": "கடவுச்சொல்லை மீட்டமைக்க நிச்சயமாக விரும்புகிறீர்களா?", + "PasswordResetComplete": "கடவுச்சொல் மீட்டமைக்கப்பட்டது.", + "PasswordMatchError": "கடவுச்சொல் மற்றும் கடவுச்சொல் உறுதிப்படுத்தல் பொருந்த வேண்டும்.", + "ParentalRating": "பெற்றோர் மதிப்பீடு", + "PackageInstallFailed": "{0} (பதிப்பு {1}) நிறுவல் தோல்வியடைந்தது.", + "PackageInstallCompleted": "{0} (பதிப்பு {1}) நிறுவல் முடிந்தது.", + "PackageInstallCancelled": "{0} (பதிப்பு {1}) நிறுவல் ரத்து செய்யப்பட்டது.", + "Overview": "கண்ணோட்டம்", + "OriginalAirDateValue": "அசல் ஒளிபரப்பப்பட்ட தேதி: {0}", + "OptionWeekly": "வாராந்திர", + "OptionWeekends": "வார இறுதி நாட்கள்", + "OptionWeekdays": "வார நாட்கள்", + "OptionWakeFromSleep": "தூக்கத்திலிருந்து விழிப்பதற்கு", + "OptionUnplayed": "காட்டப்படாதது", + "OptionUnairedEpisode": "ஒளிபரப்பப்படாத அத்தியாயங்கள்", + "OptionTvdbRating": "TVDB மதிப்பீடு", + "OptionTrackName": "ட்ராக் பெயர்", + "OptionThumbCard": "சிறுபட அட்டை", + "OptionThumb": "சிறுபடம்", + "OptionSubstring": "மூலக்கூறு", + "OptionSpecialEpisode": "சிறப்பு", + "OptionSaveMetadataAsHiddenHelp": "இதை மாற்றுவது முன்னோக்கிச் செல்லும் புதிய மெட்டாடேட்டாவுக்கு பொருந்தும். தற்போதுள்ள மெட்டாடேட்டா கோப்புகள் அடுத்த முறை சேவையகத்தால் சேமிக்கப்படும் போது அவை புதுப்பிக்கப்படும்.", + "OptionSaveMetadataAsHidden": "மெட்டாடேட்டா மற்றும் படங்களை மறைக்கப்பட்ட கோப்புகளாக சேமிக்கவும்", + "OptionRuntime": "இயக்க நேரம்", + "OptionResumable": "மீண்டும் தொடங்கக்கூடியது", + "OptionResElement": "res கூறு", + "OptionRequirePerfectSubtitleMatchHelp": "சரியான பொருத்தம் தேவைப்பட்டால், உங்கள் சரியான வீடியோ கோப்புடன் சோதிக்கப்பட்ட மற்றும் சரிபார்க்கப்பட்டவற்றை மட்டுமே சேர்க்க வசன வரிகள் வடிகட்டப்படும். இதைத் தேர்வுசெய்வது வசன வரிகள் பதிவிறக்கம் செய்யப்படுவதற்கான வாய்ப்பை அதிகரிக்கும், ஆனால் தவறான அல்லது தவறான வசன உரைக்கான வாய்ப்புகளை அதிகரிக்கும்.", + "OptionRequirePerfectSubtitleMatch": "எனது வீடியோ கோப்புகளுக்கு சரியான பொருத்தமாக இருக்கும் வசன வரிகள் மட்டுமே பதிவிறக்கவும்", + "OptionReportByteRangeSeekingWhenTranscodingHelp": "நேரம் நன்றாகத் தேடாத சில சாதனங்களுக்கு இது தேவைப்படுகிறது.", + "OptionReportByteRangeSeekingWhenTranscoding": "டிரான்ஸ்கோடிங் செய்யும் போது பைட் தேடுவதை சேவையகம் ஆதரிக்கிறது என்று புகாரளிக்கவும்", + "OptionReleaseDate": "வெளியீட்டு தேதி", + "OptionRegex": "ரீஜெக்ஸ்", + "OptionRandom": "சீரற்ற", + "OptionProtocolHttp": "HTTP", + "OptionProtocolHls": "HTTP நேரடி ஒளிபரப்பு", + "OptionProfileVideoAudio": "வீடியோ ஆடியோ", + "OptionProfileVideo": "காணொளி", + "OptionProfilePhoto": "புகைப்படம்", + "OptionProfileAudio": "ஆடியோ", + "OptionPremiereDate": "பிரீமியர் தேதி", + "OptionPosterCard": "சுவரொட்டி அட்டை", + "OptionPoster": "சுவரொட்டி", + "OptionPlayed": "வாசிக்கப்பட்டது", + "OptionPlayCount": "ப்ளே கவுண்ட்", + "OptionPlainVideoItemsHelp": "எல்லா வீடியோக்களும் டிஐடிஎல்லில் \"object.item.videoItem\" என குறிப்பிடப்படுகின்றன, அதாவது \"object.item.videoItem.movie\" போன்ற ஒரு குறிப்பிட்ட வகைக்கு பதிலாக.", + "OptionPlainVideoItems": "எல்லா வீடியோக்களையும் எளிய வீடியோ உருப்படிகளாகக் காண்பி", + "OptionPlainStorageFoldersHelp": "அனைத்து கோப்புறைகளும் டிஐடிஎல்லில் \"object.container.storageFolder\" என குறிப்பிடப்படுகின்றன, அதாவது \"object.container.person.musicArtist\" போன்ற ஒரு குறிப்பிட்ட வகைக்கு பதிலாக.", + "OptionPlainStorageFolders": "எல்லா கோப்புறைகளையும் வெற்று சேமிப்பக கோப்புறைகளாகக் காண்பி", + "OptionParentalRating": "பெற்றோர் மதிப்பீடு", + "OptionOnInterval": "ஒரு இடைவெளியில்", + "OptionNone": "எதுவுமில்லை", + "OptionNew": "புதிய…", + "OptionNameSort": "பெயர்", + "OptionMissingEpisode": "தவறிய பாகங்கள்", + "OptionMax": "அதிகபட்சம்", + "OptionLoginAttemptsBeforeLockoutHelp": "பூஜ்ஜியத்தின் மதிப்பு என்பது சாதாரண பயனர்களுக்கான மூன்று முயற்சிகளின் இயல்புநிலையையும், நிர்வாகிகளுக்கு ஐந்து முயற்சிகளையும் பெறுவதாகும். இதை -1 ஆக அமைப்பது அம்சத்தை முடக்கும்.", + "OptionLoginAttemptsBeforeLockout": "கதவடைப்பு ஏற்படுவதற்கு முன்பு எத்தனை தவறான உள்நுழைவு முயற்சிகள் செய்யப்படலாம் என்பதை தீர்மானிக்கிறது.", + "OptionList": "பட்டியல்", + "OptionLikes": "விருப்பங்கள்", + "OptionIsSD": "எஸ்டி", + "OptionIsHD": "எச்டி", + "OptionImdbRating": "IMDb மதிப்பீடு", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "இந்த கோரிக்கைகள் மதிக்கப்படும், ஆனால் பைட் வரம்பு தலைப்பை புறக்கணிக்கும்.", + "OptionIgnoreTranscodeByteRangeRequests": "டிரான்ஸ்கோட் பைட் வரம்பு கோரிக்கைகளை புறக்கணிக்கவும்", + "OptionHomeVideos": "புகைப்படங்கள்", + "OptionHlsSegmentedSubtitles": "HLS பிரிக்கப்பட்ட வசன வரிகள்", + "OptionHideUserFromLoginHelp": "தனிப்பட்ட அல்லது மறைக்கப்பட்ட நிர்வாகி கணக்குகளுக்கு பயனுள்ளதாக இருக்கும். பயனர் தங்கள் பயனர்பெயர் மற்றும் கடவுச்சொல்லை உள்ளிட்டு கைமுறையாக உள்நுழைய வேண்டும்.", + "OptionHideUser": "உள்நுழைவு திரைகளிலிருந்து இந்த பயனரை மறைக்கவும்", + "OptionHasTrailer": "டிரெய்லர்", + "OptionHasThemeVideo": "தீம் வீடியோ", + "OptionHasThemeSong": "தீம் பாடல்", + "OptionHasSubtitles": "வசன வரிகள்", + "OptionHasSpecialFeatures": "சிறப்பு அம்சங்கள்", + "OptionFavorite": "பிடித்தவை", + "OptionExtractChapterImage": "அத்தியாயம் படத்தை பிரித்தெடுப்பதை இயக்கு", + "OptionExternallyDownloaded": "வெளிப்புற பதிவிறக்க", + "PlaybackData": "பின்னணி தரவு", + "PlayFromBeginning": "ஆரம்பத்தில் இருந்து வாசிக்கவும்", + "PlayCount": "வாசிப்பு எண்ணிக்கை", + "StopRecording": "பதிவு செய்வதை நிறுத்துங்கள்", + "Sports": "விளையாட்டு", + "SortName": "பெயரை வரிசைப்படுத்து", + "SortChannelsBy": "சேனல்களை வரிசைப்படுத்து:", + "SortByValue": "{0} மூலம் வரிசைப்படுத்து", + "Sort": "வரிசைப்படுத்து", + "SmartSubtitlesHelp": "ஆடியோ வெளிநாட்டு மொழியில் இருக்கும்போது மொழி விருப்பத்துடன் பொருந்தக்கூடிய வசனங்கள் ஏற்றப்படும்.", + "Smart": "ஸ்மார்ட்", + "Smaller": "மிக சிறிய", + "SmallCaps": "சிறிய எழுத்துக்கள்", + "Small": "சிறிய", + "SkipEpisodesAlreadyInMyLibraryHelp": "எபிசோடுகள் கிடைக்கும்போது, சீசன் மற்றும் எபிசோட் எண்களைப் பயன்படுத்தி ஒப்பிடப்படும்.", + "SkipEpisodesAlreadyInMyLibrary": "எனது நூலகத்தில் ஏற்கனவே இருக்கும் அத்தியாயங்களை பதிவு செய்ய வேண்டாம்", + "SimultaneousConnectionLimitHelp": "அனுமதிக்கப்பட்ட ஒரே நேரத்தில் நீரோடைகளின் அதிகபட்ச எண்ணிக்கை. வரம்பில்லாமல் 0 ஐ உள்ளிடவும்.", + "Filter": "வடிகட்டு", + "New": "புதிய", + "Shuffle": "கலக்கு", + "ShowYear": "ஆண்டு காட்டு", + "ShowTitle": "தலைப்பைக் காட்டு", + "ShowMore": "மேலும் காட்ட", + "ShowLess": "குறைவாகக் காட்டு", + "ShowIndicatorsFor": "இதற்கான குறிகாட்டிகளைக் காட்டு:", + "ShowAdvancedSettings": "மேம்பட்ட அமைப்புகளைக் காட்டு", + "Share": "பகிர்", + "SettingsWarning": "இந்த மதிப்புகளை மாற்றுவது உறுதியற்ற தன்மை அல்லது இணைப்பு தோல்விகளை ஏற்படுத்தக்கூடும். உங்களுக்கு ஏதேனும் சிக்கல்கள் ஏற்பட்டால், அவற்றை இயல்புநிலைக்கு மாற்ற பரிந்துரைக்கிறோம்.", + "SettingsSaved": "அமைப்புகள் சேமிக்கப்பட்டன.", + "Settings": "அமைப்புகள்", + "ServerUpdateNeeded": "இந்த சேவையகத்தை புதுப்பிக்க வேண்டும். சமீபத்திய பதிப்பைப் பதிவிறக்க, தயவுசெய்து {0} ஐ பார்வையிடவும்", + "ServerRestartNeededAfterPluginInstall": "செருகுநிரலை நிறுவிய பின் ஜெல்லிஃபின் மறுதொடக்கம் செய்யப்பட வேண்டும்.", + "ServerNameIsShuttingDown": "{0} இல் உள்ள சேவையகம் மூடப்படும்.", + "ServerNameIsRestarting": "{0} இல் உள்ள சேவையகம் மறுதொடக்கம் செய்யப்படுகிறது.", + "SeriesYearToPresent": "{0} - தற்போது", + "SeriesSettings": "தொடர் அமைப்புகள்", + "SeriesRecordingScheduled": "தொடர் பதிவு திட்டமிடப்பட்டுள்ளது.", + "SeriesDisplayOrderHelp": "எபிசோட்களை ஒளிபரப்பப்பட்ட தேதி, டிவிடி ஆர்டர் அல்லது முழுமையான எண்ணால் வரிசைப்படுத்தவும்.", + "SeriesCancelled": "தொடர் ரத்து செய்யப்பட்டது.", + "Series": "தொடர்", + "SendMessage": "செய்தி அனுப்ப", + "SelectAdminUsername": "நிர்வாகி கணக்கிற்கான பயனர்பெயரைத் தேர்ந்தெடுக்கவும்.", + "Season": "பருவம்", + "SearchResults": "தேடல் முடிவுகள்", + "SearchForSubtitles": "வசன வரிகள் தேடுங்கள்", + "SearchForMissingMetadata": "காணாமல் போன மெட்டாடேட்டாவைத் தேடுங்கள்", + "SearchForCollectionInternetMetadata": "கலைப்படைப்பு மற்றும் மெட்டாடேட்டாவிற்கு இணையத்தில் தேடுங்கள்", + "Search": "தேடு", + "Screenshots": "ஸ்கிரீன்ஷாட்கள்", + "Screenshot": "ஸ்கிரீன்ஷாட்", + "Schedule": "அட்டவணை", + "ScanLibrary": "ஸ்கேன் நூலகம்", + "ScanForNewAndUpdatedFiles": "புதிய மற்றும் புதுப்பிக்கப்பட்ட கோப்புகளை ஸ்கேன் செய்யுங்கள்", + "SaveSubtitlesIntoMediaFoldersHelp": "வீடியோ கோப்புகளுக்கு அடுத்ததாக வசன வரிகள் சேமிப்பது அவற்றை எளிதாக நிர்வகிக்க அனுமதிக்கும்.", + "SaveSubtitlesIntoMediaFolders": "மீடியா கோப்புறைகளில் வசன வரிகளைச் சேமிக்கவும்", + "SaveChanges": "மாற்றங்களை சேமியுங்கள்", + "Save": "சேமியுங்கள்", + "Saturday": "சனிக்கிழமை", + "Runtime": "இயக்க நேரம்", + "Rewind": "முன்னோக்கிச்செலுத்து", + "ResumeAt": "{0} இலிருந்து மீண்டும் தொடங்குங்கள்", + "ReplaceExistingImages": "இருக்கும் படங்களை மாற்றவும்", + "ReplaceAllMetadata": "எல்லா மெட்டாடேட்டாவையும் மாற்றவும்", + "RepeatOne": "மீண்டும் ஒருமுறை", + "RepeatMode": "பயன்முறையை மீண்டும் செய்யவும்", + "RepeatEpisodes": "அத்தியாயங்களை மீண்டும் செய்யவும்", + "RepeatAll": "அனைத்தையும் மீண்டும் செய்யவும்", + "Repeat": "மீண்டும்", + "RemoveFromPlaylist": "பிளேலிஸ்ட்டில் இருந்து அகற்று", + "RemoveFromCollection": "சேகரிப்பிலிருந்து அகற்று", + "RememberMe": "என்னை நினைவிற்கொள்ளவும்", + "ReleaseDate": "வெளியீட்டு தேதி", + "RefreshQueued": "புதுப்பிப்பு வரிசைப்படுத்தப்பட்டுள்ளது.", + "RefreshMetadata": "மெட்டாடேட்டாவைப் புதுப்பிக்கவும்", + "RefreshDialogHelp": "டாஷ்போர்டில் இயக்கப்பட்ட அமைப்புகள் மற்றும் இணைய சேவைகளின் அடிப்படையில் மெட்டாடேட்டா புதுப்பிக்கப்படுகிறது.", + "Refresh": "புதுப்பிப்பு", + "Recordings": "பதிவுகள்", + "RecordingScheduled": "பதிவு திட்டமிடப்பட்டுள்ளது.", + "MessageChangeRecordingPath": "உங்கள் ரெக்கார்டிங் கோப்புறையை மாற்றுவது ஏற்கனவே இருக்கும் பதிவுகளை பழைய இடத்திலிருந்து புதிய இடத்திற்கு மாற்றாது. விரும்பினால் அவற்றை கைமுறையாக நகர்த்த வேண்டும்.", + "RecordingCancelled": "பதிவு ரத்து செய்யப்பட்டது.", + "RecordSeries": "தொடரை பதிவு செய்", + "Record": "பதிவு செய்", + "RecommendationStarring": "{0} நடித்த", + "RecommendationDirectedBy": "{0} ஐ இயக்கியது", + "RecommendationBecauseYouWatched": "நீங்கள் {0} பார்த்ததால்", + "RecommendationBecauseYouLike": "நீங்கள் {0} ஐ விரும்புவதால்", + "RecentlyWatched": "சமீபத்தில் பார்த்தது", + "Rate": "மதிப்பிடுங்கள்", + "Raised": "எழுப்பப்பட்ட", + "Quality": "தரம்", + "Programs": "நிகழ்ச்சிகள்", + "ProductionLocations": "தயாரிப்பு தளம்", + "Producer": "தயாரிப்பாளர்", + "Primary": "முதன்மை", + "PreviousTrack": "முந்தையதைத் தவிர்", + "Previous": "முந்தையது", + "Premieres": "பிரீமியர்ஸ்", + "Premiere": "பிரீமியர்", + "PreferEmbeddedEpisodeInfosOverFileNames": "கோப்பு பெயர்களில் உட்பொதிக்கப்பட்ட எபிசோட் தகவலை விரும்புங்கள்", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "இது உட்பொதிக்கப்பட்ட மெட்டாடேட்டாவிலிருந்து எபிசோட் தகவலைப் பெற்றால் பயன்படுத்துகிறது.", + "PreferEmbeddedTitlesOverFileNamesHelp": "இணைய மெட்டாடேட்டா அல்லது உள்ளூர் மெட்டாடேட்டா கிடைக்காதபோது இயல்புநிலை காட்சி தலைப்பை இது தீர்மானிக்கிறது.", + "PreferEmbeddedTitlesOverFileNames": "கோப்பு பெயர்களில் உட்பொதிக்கப்பட்ட தலைப்புகளை விரும்புங்கள்", + "MessageGetInstalledPluginsError": "தற்போது நிறுவப்பட்ட செருகுநிரல்களின் பட்டியலைப் பெறும்போது பிழை ஏற்பட்டது.", + "MessagePluginInstallError": "சொருகி நிறுவும் போது பிழை ஏற்பட்டது.", + "MessagePluginInstalled": "சொருகி வெற்றிகரமாக நிறுவப்பட்டுள்ளது. மாற்றங்கள் நடைமுறைக்கு வர சேவையகத்தை மறுதொடக்கம் செய்ய வேண்டும்.", + "PleaseSelectTwoItems": "குறைந்தது இரண்டு உருப்படிகளைத் தேர்ந்தெடுக்கவும்.", + "PleaseRestartServerName": "ஜெல்லிஃபினை {0} இல் மறுதொடக்கம் செய்யுங்கள்.", + "PleaseEnterNameOrId": "ஒரு பெயர் அல்லது வெளிப்புற ஐடியை உள்ளிடவும்.", + "PleaseConfirmPluginInstallation": "மேலே உள்ளதைப் படித்திருப்பதை உறுதிப்படுத்த சரி என்பதைக் கிளிக் செய்து, சொருகி நிறுவலைத் தொடர விரும்புகிறீர்கள்.", + "PleaseAddAtLeastOneFolder": "சேர் பொத்தானைக் கிளிக் செய்வதன் மூலம் இந்த நூலகத்தில் குறைந்தது ஒரு கோப்புறையாவது சேர்க்கவும்.", + "Played": "வாசிக்கப்பட்டது", + "PlaybackErrorNoCompatibleStream": "இந்த கிளையன்ட் ஊடகத்துடன் பொருந்தாது மற்றும் சேவையகம் இணக்கமான ஊடக வடிவமைப்பை அனுப்பவில்லை.", + "PlayNextEpisodeAutomatically": "அடுத்த அத்தியாயத்தை தானாக இயக்கு", + "PlayNext": "அடுத்ததை வாசிக்கவும்", + "Yesterday": "நேற்று", + "Yes": "ஆம்", + "YadifBob": "யடிஃப் பாப்", + "Yadif": "யடிஃப்", + "XmlTvSportsCategoriesHelp": "இந்த வகைகளைக் கொண்ட நிகழ்ச்சிகள் விளையாட்டுத் திட்டங்களாகக் காட்டப்படும். '|' உடன் பலவற்றைப் பிரிக்கவும்.", + "XmlTvPathHelp": "XMLTV கோப்புக்கான பாதை. ஜெல்லிஃபின் இந்த கோப்பைப் படித்து புதுப்பிப்புகளுக்கு அவ்வப்போது சரிபார்க்கும். கோப்பை உருவாக்கி புதுப்பிக்க நீங்கள் பொறுப்பு.", + "XmlTvNewsCategoriesHelp": "இந்த வகைகளைக் கொண்ட நிகழ்ச்சிகள் செய்தித் திட்டங்களாகக் காட்டப்படும். '|' உடன் பலவற்றைப் பிரிக்கவும்.", + "XmlTvMovieCategoriesHelp": "இந்த வகைகளைக் கொண்ட நிகழ்ச்சிகள் திரைப்படங்களாக காண்பிக்கப்படும். '|' உடன் பலவற்றைப் பிரிக்கவும்.", + "XmlTvKidsCategoriesHelp": "இந்த வகைகளைக் கொண்ட நிகழ்ச்சிகள் குழந்தைகளுக்கான நிரல்களாக காண்பிக்கப்படும். '|' உடன் பலவற்றைப் பிரிக்கவும்.", + "XmlDocumentAttributeListHelp": "இந்த பண்புக்கூறுகள் ஒவ்வொரு XML பதிலின் மூல உறுப்புக்கும் பயன்படுத்தப்படுகின்றன.", + "Writers": "எழுத்தாளர்கள்", + "Writer": "எழுத்தாளர்", + "WizardCompleted": "இப்போது நமக்குத் தேவை அவ்வளவுதான். ஜெல்லிஃபின் உங்கள் ஊடக நூலகம் பற்றிய தகவல்களை சேகரிக்கத் தொடங்கியுள்ளார். எங்கள் சில பயன்பாடுகளைப் பாருங்கள், பின்னர் டாஷ்போர்டு ஐக் காண பினிஷ் என்பதைக் கிளிக் செய்க.", + "Whitelist": "அனுமதிப்பட்டியல்", + "WelcomeToProject": "ஜெல்லிஃபினுக்கு வருக!", + "Wednesday": "புதன்கிழமை", + "Watched": "ஏற்கனவே பார்த்தேன்", + "ViewPlaybackInfo": "பின்னணி தகவலைக் காண்க", + "ViewAlbumArtist": "ஆல்பம் கலைஞரைக் காண்க", + "ViewAlbum": "ஆல்பத்தைக் காண்க", + "Vertical": "செங்குத்தாக", + "ValueVideoCodec": "வீடியோ கோடெக்: {0}", + "ValueTimeLimitSingleHour": "கால எல்லை: 1 மணி நேரம்", + "ValueTimeLimitMultiHour": "கால எல்லை: {0} மணி", + "ValueSongCount": "{0} பாடல்கள்", + "ValueSeriesCount": "{0} தொடர்", + "ValueSeconds": "{0} விநாடிகள்", + "ValueOneSong": "1 பாடல்", + "ValueOneSeries": "1 தொடர்", + "ValueOneMusicVideo": "1 இசை வீடியோ", + "ValueOneMovie": "1 திரைப்படம்", + "ValueOneEpisode": "1 அத்தியாயம்", + "ValueOneAlbum": "1 ஆல்பம்", + "ValueMusicVideoCount": "{0} இசை வீடியோக்கள்", + "ValueMovieCount": "{0} திரைப்படங்கள்", + "ValueMinutes": "{0} நிமிடம்", + "ValueEpisodeCount": "{0} அத்தியாயங்கள்", + "ValueDiscNumber": "வட்டு {0}", + "ValueContainer": "கொள்கலன்: {0}", + "ValueConditions": "நிபந்தனைகள்: {0}", + "ValueCodec": "கோடெக்: {0}", + "ValueAudioCodec": "ஆடியோ கோடெக்: {0}", + "ValueAlbumCount": "{0} ஆல்பங்கள்", + "UserProfilesIntro": "சிறுமணி காட்சி அமைப்புகள், விளையாட்டு நிலை மற்றும் பெற்றோரின் கட்டுப்பாடுகள் ஆகியவற்றைக் கொண்ட பயனர் சுயவிவரங்களுக்கான ஆதரவை ஜெல்லிஃபின் கொண்டுள்ளது.", + "UserAgentHelp": "தனிப்பயன் பயனர் முகவர் HTTP தலைப்பை வழங்கவும்.", + "Upload": "பதிவேற்றவும்", + "Up": "மேலே", + "Unrated": "மதிப்பிடப்படாதது", + "Unplayed": "காட்டப்படாதது", + "Unmute": "முடக்கு நீக்கம்", + "HeaderUninstallPlugin": "செருகுநிரலை நிறுவல் நீக்கு", + "UninstallPluginConfirmation": "{0} ஐ நிறுவல் நீக்க விரும்புகிறீர்களா?", + "Uniform": "சீராக", + "TvLibraryHelp": "{0} டிவி பெயரிடும் வழிகாட்டியை {1} மதிப்பாய்வு செய்யவும்.", + "Tuesday": "செவ்வாய்", + "Transcoding": "டிரான்ஸ்கோடிங்", + "Trailers": "டிரெய்லர்கள்", + "TrackCount": "{0} தடங்கள்", + "Track": "தடம்", + "TitlePlayback": "பின்னணி", + "TitleHostingSettings": "ஹோஸ்டிங் அமைப்புகள்", + "TitleHardwareAcceleration": "வன்பொருள் முடுக்கம்", + "Thursday": "வியாழக்கிழமை", + "Thumb": "சிறுபடம்", + "ThisWizardWillGuideYou": "இந்த வழிகாட்டி அமைவு செயல்முறை மூலம் உங்களுக்கு வழிகாட்ட உதவும். தொடங்க, நீங்கள் விரும்பும் மொழியைத் தேர்ந்தெடுக்கவும்.", + "TheseSettingsAffectSubtitlesOnThisDevice": "இந்த அமைப்புகள் இந்த சாதனத்தில் வசன வரிகள் பாதிக்கின்றன", + "ThemeVideos": "தீம் வீடியோக்கள்", + "ThemeSongs": "தீம் பாடல்கள்", + "TellUsAboutYourself": "உங்களைப் பற்றி சொல்லுங்கள்", + "TagsValue": "குறிச்சொற்கள்: {0}", + "Tags": "குறிச்சொற்கள்", + "TabUpcoming": "வரவிருக்கும்", + "TabStreaming": "ஸ்ட்ரீமிங்", + "TabSettings": "அமைப்புகள்", + "TabServer": "சேவையகம்", + "TabScheduledTasks": "திட்டமிடப்பட்ட பணிகள்", + "TabResponses": "பதில்கள்", + "TabProfiles": "சுயவிவரங்கள்", + "TabProfile": "சுயவிவரம்", + "TabPlugins": "செருகுநிரல்கள்", + "TabParentalControl": "பெற்றோர் கட்டுப்பாடு", + "TabOther": "மற்றவை", + "TabNotifications": "அறிவிப்புகள்", + "TabNfoSettings": "NFO அமைப்புகள்", + "TabNetworking": "நெட்வொர்க்கிங்", + "TabNetworks": "நெட்வொர்க்குகள்", + "TabMyPlugins": "எனது செருகுநிரல்கள்", + "TabMusic": "இசை", + "TabLogs": "பதிவுகள்", + "TabLatest": "அண்மை", + "TabDirectPlay": "நேரடி நாடகம்", + "TabDashboard": "டாஷ்போர்டு", + "TabContainers": "கொள்கலன்கள்", + "TabCodecs": "கோடெக்குகள்", + "TabRepositories": "களஞ்சியங்கள்", + "TabCatalog": "அட்டவணை", + "TabAdvanced": "மேம்படுத்தபட்ட", + "TabAccess": "அணுகல்", + "TV": "தொலைக்காட்சி", + "SystemDlnaProfilesHelp": "கணினி சுயவிவரங்கள் படிக்க மட்டுமே. கணினி சுயவிவரத்திற்கான மாற்றங்கள் புதிய தனிப்பயன் சுயவிவரத்தில் சேமிக்கப்படும்.", + "SyncPlayAccessHelp": "இந்த பயனர் ஒத்திசைவு அம்சத்திற்கு அணுகல் அளவைத் தேர்ந்தெடுக்கவும். ஒத்திசைவு பிளேபேக்கை பிற சாதனங்களுடன் ஒத்திசைக்க உதவுகிறது.", + "Sunday": "ஞாயிற்றுக்கிழமை", + "Suggestions": "பரிந்துரைகள்", + "Subtitles": "வசன வரிகள்", + "SubtitleOffset": "வசன ஆஃப்செட்", + "SubtitleDownloadersHelp": "முன்னுரிமைக்கு ஏற்ப உங்களுக்கு விருப்பமான வசன பதிவிறக்கிகளை இயக்கவும் தரவரிசைப்படுத்தவும்.", + "SubtitleAppearanceSettingsDisclaimer": "இந்த அமைப்புகள் வரைகலை வசன வரிகள் (PGD, DVD போன்றவை) அல்லது அவற்றின் சொந்த பாணியை உட்பொதிக்கும் ASS/SSA வசன வரிகள் பொருந்தாது.", + "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "இந்தச் சாதனத்தால் தொடங்கப்பட்ட எந்த Chromecast இயக்கத்திற்கும் இந்த அமைப்புகள் பொருந்தும்.", + "Studios": "ஸ்டுடியோக்கள்", + "PathNotFound": "பாதை கண்டுபிடிக்க முடியவில்லை. பாதை செல்லுபடியாகும் என்பதை உறுதிசெய்து மீண்டும் முயற்சிக்கவும்.", + "SubtitleVerticalPositionHelp": "உரை தோன்றும் வரி எண். நேர்மறை எண்கள் மேல் கீழே குறிக்கின்றன. எதிர்மறை எண்கள் கீழே மேலே குறிக்கின்றன.", + "LabelSubtitleVerticalPosition": "செங்குத்து நிலை:", + "ClearQueue": "வரிசையை அழிக்கவும்", + "StopPlayback": "பிளேபேக்கை நிறுத்துங்கள்", + "ButtonPlayer": "பிளேயர்", + "ButtonCast": "நடிகர்கள்", + "ButtonSyncPlay": "ஒத்திசைவு", + "EnableBlurHashHelp": "இன்னும் ஏற்றப்படும் படங்கள் தனித்துவமான ஒதுக்கிடத்துடன் காண்பிக்கப்படும்.", + "EnableBlurHash": "படங்களுக்கு மங்கலான ஒதுக்கிடங்களை இயக்கவும்", + "UnsupportedPlayback": "DRM ஆல் பாதுகாக்கப்பட்ட உள்ளடக்கத்தை ஜெல்லிஃபின் டிக்ரிப்ட் செய்ய முடியாது, ஆனால் பாதுகாக்கப்பட்ட தலைப்புகள் உட்பட எல்லா உள்ளடக்கமும் பொருட்படுத்தாமல் முயற்சிக்கப்படும். குறியாக்கம் அல்லது ஊடாடும் தலைப்புகள் போன்ற பிற ஆதரிக்கப்படாத அம்சங்கள் காரணமாக சில கோப்புகள் முற்றிலும் கருப்பு நிறத்தில் தோன்றக்கூடும்.", + "OnApplicationStartup": "பயன்பாட்டு தொடக்கத்தில்", + "EveryXHours": "ஒவ்வொரு {0} மணி நேரமும்", + "EveryHour": "ஒவ்வொரு மணி நேரமும்", + "EveryXMinutes": "ஒவ்வொரு {0} நிமிடங்களும்", + "OnWakeFromSleep": "தூக்கத்திலிருந்து எழுந்தவுடன்", + "WeeklyAt": "{1} இல் {0}", + "DailyAt": "தினசரி {0}", + "LastSeen": "கடைசியாக பார்த்தது {0}", + "PersonRole": "{0} என", + "ListPaging": "{0} - {2} இன் {1}", + "WriteAccessRequired": "ஜெல்லிஃபினுக்கு இந்த கோப்புறையில் எழுத அணுகல் தேவை. எழுதும் அணுகலை உறுதிசெய்து மீண்டும் முயற்சிக்கவும்.", + "PlaybackRate": "பின்னணி வீதம்" +} diff --git a/src/strings/tr.json b/src/strings/tr.json index f6ea6c7188..053da36a5e 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -4,40 +4,26 @@ "AllLibraries": "Bütün kütüphaneler", "AllowRemoteAccess": "Bu Jellyfin sunucusuna uzaktan bağlanmaya izin ver.", "AllowRemoteAccessHelp": "Eğer işaretlenmemişse, bütün uzak bağlantılar bloke edilicek.", - "AttributeNew": "Yeni", - "BrowsePluginCatalogMessage": "Mevcut eklentileri görebilmek için eklenti katologuna göz atın.", - "ButtonAdd": "Ekle", + "MessageBrowsePluginCatalog": "Mevcut eklentileri görebilmek için eklenti katologuna göz atın.", "ButtonAddUser": "Kullanıcı Ekle", "ButtonArrowRight": "Sağ", "ButtonBack": "Geri", "ButtonCancel": "İptal", - "ButtonDelete": "Sil", - "ButtonDeleteImage": "Resmi Sil", - "ButtonEdit": "Düzenle", - "ButtonFilter": "Filtrele", - "ButtonHelp": "Yardım", - "ButtonHome": "Anasayfa", "ButtonInfo": "Bilgi", "ButtonManualLogin": "Manuel Giriş", - "ButtonNew": "Yeni", "ButtonOk": "Tamam", "ButtonPause": "Duraklat", - "ButtonPlay": "Oynat", "ButtonQuickStartGuide": "Hızlı başlangıç rehberi", "ButtonRefreshGuideData": "Kılavuzu Yinele", "ButtonRemove": "Sil", "ButtonResetPassword": "Şifre Sıfırla", "ButtonRestart": "Tekrar Başlat", - "ButtonSave": "Kayıt", - "ButtonSearch": "Arama", "ButtonSelectDirectory": "Dosyayı Seç", "ButtonSend": "Gönder", "ButtonSettings": "Ayarlar", "ButtonSignIn": "Giriş Yapın", "ButtonSignOut": "Çıkış Yap", - "ButtonSort": "Sırala", "ButtonStop": "Durdur", - "ButtonSubtitles": "Altyazılar", "ChannelAccessHelp": "Bu kullanıcıyla paylaşmak üzere kanalları seç. Yöneticiler bütün kanalları metada yöneticisi ile düzenleyebilecekler.", "Continuing": "Devam ediyor", "Delete": "Sil", @@ -57,15 +43,11 @@ "FolderTypeTvShows": "TV", "Friday": "Cuma", "HeaderActiveRecordings": "Aktif Kayıtlar", - "HeaderAddUser": "Kullanıcı Ekle", - "HeaderAutomaticUpdates": "Otomatik Güncelleme", - "HeaderChannels": "Kanallar", "HeaderCodecProfile": "Codec Profili", "HeaderContinueWatching": "İzlemeye Devam Et", "HeaderCustomDlnaProfiles": "Özel Profiller", "HeaderDeviceAccess": "Cihaz Erişimi", "HeaderEasyPinCode": "Kolay Pin Kodu", - "HeaderFilters": "Filtreler", "HeaderFrequentlyPlayed": "Sıkça Oynatılan", "HeaderImageSettings": "Resim Ayarları", "HeaderLatestEpisodes": "En yeni bölümler", @@ -75,7 +57,6 @@ "HeaderLibraryFolders": "Media Klasörleri", "HeaderMediaFolders": "Media Klasörleri", "HeaderMusicVideos": "Müzik vidyoları", - "HeaderNextUp": "Sonraki hafta", "HeaderPlayAll": "Hepsini oynat", "HeaderPleaseSignIn": "Lütfen Giriş Yapın", "HeaderPreferredMetadataLanguage": "Tercih Edilen Meta Dili", @@ -84,7 +65,6 @@ "HeaderResponseProfile": "Profil Görüntüleme", "HeaderScenes": "Sahneler", "HeaderSendMessage": "Mesaj Gönder", - "HeaderSeries": "Series", "HeaderServerSettings": "Sunucu ayarları", "HeaderSetupLibrary": "Medya kütüphanelerini kur", "HeaderStatus": "Durum", @@ -92,7 +72,6 @@ "HeaderTaskTriggers": "Görev tetikleyicileri", "HeaderTranscodingProfile": "Kodlama Profili", "HeaderUsers": "Kullanıcılar", - "LabelAllowServerAutoRestart": "Bu sunucuya güncellemeleri uygulamak için yeniden başlama izni ver", "LabelArtists": "Sanatçılar:", "LabelAudioLanguagePreference": "Ses Dili Tercihi:", "LabelCachePath": "Önbellek Yolu:", @@ -101,7 +80,6 @@ "LabelCountry": "Ülke:", "LabelCurrentPassword": "Kullanımdaki şifre:", "LabelDay": "Gün:", - "LabelDisplayMissingEpisodesWithinSeasons": "Sezondaki kayıp bölümleri göster", "LabelEnableDlnaServer": "DLNA Sunucusunu Etkinleştir", "LabelFinish": "Bitir", "LabelIconMaxHeight": "Maksimum simge genişliği:", @@ -113,9 +91,7 @@ "LabelName": "İsim:", "LabelNewPassword": "Yeni şifre:", "LabelNewPasswordConfirm": "Yeni şifreyi onayla:", - "LabelNext": "Sonraki", "LabelPassword": "Şifre:", - "LabelPrevious": "Önceki", "LabelProfileAudioCodecs": "Ses Codec:", "LabelProfileCodecs": "Codecler:", "LabelProfileVideoCodecs": "Video Codec:", @@ -130,7 +106,6 @@ "LabelUser": "Kullanıcı:", "LabelUserLibrary": "Kullanıcı Kütüphanesi:", "LabelYear": "Yıl:", - "LabelYourFirstName": "İlk Ad:", "LabelYoureDone": "Bitti!", "LibraryAccessHelp": "Bu kullanıcı ile paylaşmak için kütüphaneleri seçin. Yöneticiler meta yöneticisini kullanarak tüm klasörleri düzenlemesi mümkün olacaktır.", "Live": "Canlı", @@ -144,7 +119,6 @@ "OptionAllowUserToManageServer": "Bu kullanıcıya sunucuyu yönetme izni ver", "OptionArtist": "Sanatçı", "OptionAscending": "Yükselen", - "OptionAutomatic": "Otomatik", "OptionContinuing": "Topluluk", "OptionCriticRating": "Yorumcu Puanı", "OptionDaily": "Günlük", @@ -165,7 +139,6 @@ "OptionEnableAccessToAllLibraries": "Bütün kütüphanelere erişim izni ver", "OptionEnded": "Bitmiş", "OptionFavorite": "Favoriler", - "OptionFriday": "Cuma", "OptionHasSubtitles": "Altyazı", "OptionHasThemeSong": "Tema Şarkısı", "OptionHasThemeVideo": "Tema Videosu", @@ -173,7 +146,6 @@ "OptionHideUser": "Bu kullanıcıyı giriş ekranında gösterme", "OptionImdbRating": "İMDb Reyting", "OptionLikes": "Beğenilenler", - "OptionMonday": "Pazartesi", "OptionNameSort": "İsim", "OptionPlayCount": "Oynatma sayacı", "OptionPlayed": "Çalındı", @@ -184,15 +156,10 @@ "OptionReleaseDate": "Yayınlanma Tarihi", "OptionResumable": "Başlatılabilir", "OptionRuntime": "Süresi", - "OptionSaturday": "Cumartesi", "OptionSpecialEpisode": "Özel", - "OptionSunday": "Pazar", - "OptionThursday": "Perşembe", "OptionTrackName": "Parça İsmi", - "OptionTuesday": "Salı", "OptionTvdbRating": "TVDB Puanı", "OptionUnplayed": "Çalınmayan", - "OptionWednesday": "Çarşamba", "OptionWeekly": "Haftalık", "ParentalRating": "Ebeveyn değeri", "PasswordMatchError": "Parola ve Sifre Eslesmelidir.", @@ -208,44 +175,24 @@ "Sunday": "Pazar", "TabAccess": "Erişim", "TabAdvanced": "Gelişmiş", - "TabAlbumArtists": "Albüm Sanatçıları", - "TabAlbums": "Albümler", - "TabArtists": "Sanatçılar", "TabCatalog": "Katalog", - "TabChannels": "Kanallar", "TabCodecs": "Codecler", - "TabEpisodes": "Bölümler", - "TabFavorites": "Favoriler", - "TabGenres": "Türler", - "TabGuide": "Kılavuz", - "TabInfo": "Bilgi", "TabLatest": "En yeni", - "TabMovies": "Filmler", "TabMusic": "Muzik", - "TabMusicVideos": "Klipler", "TabMyPlugins": "Eklentilerim", "TabNetworks": "Ağlar", "TabNotifications": "Bildirimler", - "TabPassword": "Şifre", - "TabPlaylist": "Oynatma listesi", "TabProfile": "Profil", "TabProfiles": "Profiller", - "TabRecordings": "Kayıtlar", - "TabSeries": "Seriler", "TabServer": "Sunucu", "TabSettings": "Ayarlar", - "TabShows": "Diziler", - "TabSongs": "Şarkılar", - "TabSuggestions": "Önerilenler", - "TabTrailers": "Fragmanlar", - "TabTranscoding": "Kodlayıcı", "TabUpcoming": "Gelecek", "TellUsAboutYourself": "Kendinizden bahsedin", "ThisWizardWillGuideYou": "Bu sihirbaz kurulum işlemi boyunca size yardımcı olacaktır. Başlamak için, tercih ettiğiniz dili seçiniz.", "Thursday": "Perşembe", "Tuesday": "Salı", "UninstallPluginConfirmation": "Kaldırmak İstediginizden Eminmisiniz {0} ?", - "UninstallPluginHeader": "Eklenti Kaldır", + "HeaderUninstallPlugin": "Eklenti Kaldır", "Wednesday": "Çarşamba", "WelcomeToProject": "Jellyfin'ye Hoş Geldiniz!", "Absolute": "Mutlak", @@ -263,7 +210,6 @@ "AirDate": "Yayın tarihi", "Aired": "Yayınlanma tarihi", "Alerts": "Uyarılar", - "ButtonEditImages": "Resimleri Düzenle", "ButtonEditOtherUserPreferences": "Bu kullanıcının profilini, resmini ve kişisel tercihlerini düzenleyin.", "ButtonForgotPassword": "Şifremi unuttum", "ButtonFullscreen": "Tam Ekran", @@ -275,7 +221,6 @@ "HeaderFavoriteAlbums": "Favori Albümler", "HeaderFavoriteArtists": "Favori Sanatçılar", "HeaderFavoriteSongs": "Favori Şarkılar", - "HeaderLiveTV": "Canlı TV", "Movies": "Filmler", "Photos": "Fotoğraflar", "Playlists": "Çalma listeleri", @@ -287,16 +232,12 @@ "AllEpisodes": "Tüm bölümler", "AllLanguages": "Tüm diller", "AllowMediaConversion": "Medya dönüşümüne izin ver", - "AddItemToCollectionHelp": "Ögeleri koleksiyona eklemek için; arama yapın ve üzerine sağ tıklayın veya sekme menüsünden koleksiyona ekleyin.", "AllowHWTranscodingHelp": "Ayarlayıcının anında akışları dönüştürmesine izin verin. Bu, sunucunun gerektirdiği kodlamanın azaltılmasına yardımcı olabilir.", "ColorSpace": "Renk uzayı", - "ButtonConnect": "Bağlan", "ColorTransfer": "Renk transferi", "ButtonPreviousTrack": "Önceki parça", "ButtonProfile": "Profil", - "ButtonRefresh": "Yenile", "ButtonRename": "Yeniden Adlandır", - "ButtonRepeat": "Tekrar", "ButtonResume": "Devam Et", "ButtonRevoke": "Geri al", "ChannelNumber": "Kanal numarası", @@ -338,21 +279,14 @@ "ButtonGotIt": "Anlaşıldı", "ButtonMore": "Dahası", "ButtonOpen": "Aç", - "ButtonArrowUp": "Yukarı", "ButtonNetwork": "Ağ", - "ButtonDownload": "İndir", "ButtonNextTrack": "Sonraki parça", - "ButtonOff": "Kapalı", "ButtonParentalControl": "Ebeveyn Kontrolü", - "ButtonArrowDown": "Aşağı", "ButtonArrowLeft": "Sol", - "ButtonDown": "Aşağı", "ButtonGuide": "Rehber", - "ButtonLearnMore": "Daha fazla bilgi edin", "ButtonLibraryAccess": "Kütüphane erişimi", "ButtonScanAllLibraries": "Tüm Kütüphaneleri Tara", "ButtonSelectView": "Görünüm seç", - "ButtonShuffle": "Karıştır", "ButtonShutdown": "Kapat", "ChannelNameOnly": "Yalnızca {0} kanalı", "ConfirmDeleteItems": "Bu öğeleri silmek, onları hem dosya sisteminden hem de medya kitaplığınızdan siler. Devam etmek istediğinize emin misiniz?", @@ -364,7 +298,6 @@ "Display": "Görüntüle", "DisplayInMyMedia": "Ana ekranda görüntüleme", "DisplayInOtherHomeScreenSections": "En son medya gibi ana ekran bölümlerinde görüntüleyin ve izlemeye devam edin", - "EnableBackdrops": "Arka planında", "BurnSubtitlesHelp": "Sunucunun video işlendiği esnada, altyazının görüntüye gömülmesini sağlar. Performansı çok düşürür, zorunda kalmadıkça bu özelliği seçmeyin. Görüntü tabanlı biçimleri (VOBSUB, PGS, SUB / IDX, vb.) Ve bazı ASS / SSA altyazıların görüntüye gömülmesi için Otomatik'i seçin.", "ConfirmDeleteItem": "Bu öğeyi silmek, onu hem dosya sisteminden hem de medya kütüphanenizden siler. Devam etmek istediğinize emin misiniz?", "ValueSpecialEpisodeName": "Özel - {0}", @@ -387,7 +320,6 @@ "AspectRatio": "En/Boy oranı", "Audio": "Ses", "AuthProviderHelp": "Bu kullanıcının şifresini doğrulamak için kullanılacak bir Kimlik Doğrulama Sağlayıcısı seçin.", - "AutoBasedOnLanguageSetting": "Otomatik (dil ayarına göre)", "Backdrop": "zemin", "Backdrops": "Zeminler", "Banner": "afiş", @@ -402,11 +334,9 @@ "ButtonStart": "Başlat", "ButtonTrailer": "Fragman", "Box": "Kutu", - "ButtonViewWebsite": "Web sitesini görüntüle", "CancelRecording": "Kayıttan Vazgeç", "CancelSeries": "Dizileri iptal et", "ButtonUninstall": "Kaldır", - "ButtonUp": "Yukarı", "ButtonWebsite": "Website", "Categories": "Kategoriler", "DrmChannelsNotImported": "DRM'li kanallar içe aktarılmayacak.", @@ -421,7 +351,7 @@ "DatePlayed": "Oynanan tarih", "DeathDateValue": "Öldü: {0}", "Default": "Varsayılan", - "DefaultErrorMessage": "İsteğin işlenmesi sırasında bir hata oluştu. Lütfen daha sonra tekrar deneyiniz.", + "ErrorDefault": "İsteğin işlenmesi sırasında bir hata oluştu. Lütfen daha sonra tekrar deneyiniz.", "DefaultMetadataLangaugeDescription": "Bunlar varsayılan ayarlarınızdır ve kitaplık bazında özelleştirilebilir.", "DeleteUserConfirmation": "Bu kullanıcıyı silmek istediğinden emin misin?", "Depressed": "Bunalımlı", @@ -440,24 +370,19 @@ "EnableCinemaMode": "Sinema Modu", "EnableColorCodedBackgrounds": "Renk kodlu arka planlar", "HeaderGuideProviders": "TV Rehberi Veri Sağlayıcıları", - "HeaderGenres": "Türler", - "HeaderForgotPassword": "Parolanızı mı unuttunuz", "HeaderForKids": "Çocuklar için", "HeaderFetcherSettings": "Alıcı Ayarları", "HeaderFetchImages": "Görüntüleri Getir:", - "HeaderFeatures": "Özellikleri", "HeaderFeatureAccess": "Özellik Erişimi", "HeaderFavoriteVideos": "Favori Videolar", "HeaderFavoriteMovies": "Favori Filmler", "HeaderFavoriteBooks": "favori kitaplar", "HeaderExternalIds": "Dış kimlikler:", "HeaderError": "Hata", - "HeaderEpisodes": "Bölümler", "HeaderEnabledFieldsHelp": "Kilitlemek ve verilerinin değişmesini önlemek için bir alanın işaretini kaldırın.", "HeaderEnabledFields": "Etkin Alanlar", "HeaderEditImages": "Görüntüleri Düzenle", "HeaderDownloadSync": "İndir ve Eşitle", - "HeaderDisplay": "Görüntüle", "HeaderDirectPlayProfileHelp": "Aygıtın yerel olarak hangi biçimlerde kullanılabileceğini göstermek için doğrudan oynatma profilleri ekleyin.", "HeaderDirectPlayProfile": "Doğrudan Oyun Profili", "HeaderDevices": "Cihazlar", @@ -482,12 +407,10 @@ "HeaderCodecProfileHelp": "Codec profilleri, belirli kodlayıcıları oynatırken cihazın sınırlamalarını gösterir. Eğer bir sınırlama uygulanırsa, kodeğin doğrudan oynaması için yapılandırılmış olsa bile, ortam kodlanır.", "HeaderChapterImages": "Bölüm Görüntüleri", "HeaderChannelAccess": "Kanal erişimi", - "HeaderCastCrew": "Kast ekibi", "HeaderCastAndCrew": "Kast ekibi", "HeaderCancelSeries": "Serileri İptal Et", "HeaderCancelRecording": "Kaydı İptal Et", "HeaderBranding": "dağlama", - "HeaderBooks": "Kitaplar", "HeaderBlockItemsWithNoRating": "Tanınmayan veya bilinmeyen derecelendirme bilgisine sahip öğeleri engelle:", "HeaderAudioSettings": "Ses ayarları", "HeaderAudioBooks": "Sesli Kitaplar", @@ -498,13 +421,11 @@ "HeaderApiKey": "API Anahtarı", "HeaderAllowMediaDeletionFrom": "Medyadan Silinmeye İzin Ver", "HeaderAlert": "Alarm", - "HeaderAlbums": "Albümler", "HeaderAdmin": "Yönetici", "HeaderAdditionalParts": "İlave parçalar", "HeaderAddUpdateImage": "Resim Ekle / Güncelle", "HeaderAddToPlaylist": "Oynatma listesine ekle", "HeaderAddToCollection": "Koleksiyona ekle", - "HeaderAddScheduledTaskTrigger": "Tetikleyici ekle", "HeaderActivity": "Aktivite", "HeaderActiveDevices": "Aktif Cihazlar", "HeaderAccessScheduleHelp": "Belirli saatlerle erişimi sınırlamak için bir erişim programı oluşturun.", @@ -538,7 +459,7 @@ "EveryNDays": "Her {0} günde", "ErrorSavingTvProvider": "TV sağlayıcısını kaydederken bir hata oluştu. Lütfen erişilebilir olduğundan emin olun ve tekrar deneyin.", "ErrorPleaseSelectLineup": "Lütfen bir grup seçin ve tekrar deneyin. Hiç bir sıralama yoksa, lütfen kullanıcı adınızın, şifrenizin ve posta kodunuzun doğru olup olmadığını kontrol edin.", - "ErrorMessageStartHourGreaterThanEnd": "Bitiş saati, başlangıç saatinden büyük olmalıdır.", + "ErrorStartHourGreaterThanEnd": "Bitiş saati, başlangıç saatinden büyük olmalıdır.", "ErrorGettingTvLineups": "TV dizilimini indirirken bir hata oluştu. Lütfen bilgilerinizin doğru olduğundan emin olun ve tekrar deneyin.", "ErrorDeletingItem": "Öğe Jellyfin Sunucusundan silinirken bir hata oluştu. Lütfen Jellyfin Server'ın medya klasörüne yazma erişimi olup olmadığını kontrol edin ve tekrar deneyin.", "ErrorAddingXmlTvFile": "XmlTV dosyasına erişilirken bir hata oluştu. Lütfen dosyanın var olduğundan emin olun ve tekrar deneyin.", @@ -548,9 +469,7 @@ "Episodes": "Bölümler", "EndsAtValue": "{0} konumundaki biter", "EnableThemeVideosHelp": "Kitaplığa göz atarken tema videoları arka planda oynatın.", - "EnableThemeVideos": "Tema videoları", "EnableThemeSongsHelp": "Kitaplığa göz atarken tema şarkıları arka planda çalın.", - "EnableThemeSongs": "Tema şarkıları", "EnableStreamLoopingHelp": "Canlı akışlar yalnızca birkaç saniye veri içeriyorsa ve sürekli istenmesi gerekiyorsa bunu etkinleştirin. Gerekmediğinde bunu etkinleştirmek sorunlara neden olabilir.", "EnableStreamLooping": "Otomatik döngü canlı akışları", "Hide": "Gizle", @@ -565,7 +484,6 @@ "HeaderSelectCertificatePath": "Sertifika Yolunu Seç", "HeaderSecondsValue": "{0} Saniye", "HeaderSeasons": "Sezonlar", - "HeaderSchedule": "Zamanla", "HeaderRunningTasks": "Çalışan Görevler", "HeaderRevisionHistory": "Revizyon Geçmişi", "HeaderRestart": "Yeniden Başlat", @@ -580,7 +498,6 @@ "HeaderPlayback": "Medya Oynatma", "HeaderPinCodeReset": "Pin Kodunu Sıfırla", "HeaderPhotoAlbums": "Fotoğraf Albümleri", - "HeaderPeople": "Kişiler", "HeaderPasswordReset": "Şifre Sıfırlama", "HeaderPassword": "Şifre", "HeaderParentalRatings": "Ebeveyn Derecelendirmeleri", @@ -594,14 +511,11 @@ "HeaderMyMedia": "Benim Medyam", "HeaderMyDevice": "Benim Cihazım", "HeaderMusicQuality": "Müzik Kalitesi", - "HeaderMovies": "Filmler", "HeaderMoreLikeThis": "Buna Benzer Daha Fazla", "HeaderMetadataSettings": "Meta Verisi Ayarları", - "HeaderMediaInfo": "Medya Bilgisi", "HeaderMedia": "Medya", "HeaderLoginFailure": "Giriş Başarısız", "HeaderLiveTvTunerSetup": "Canlı TV istasyon Kurulumu", - "HeaderLiveTv": "Canlı TV", "HeaderLibrarySettings": "Kütüphane Ayarları", "HeaderLibraryOrder": "Kütüphane Sırası", "HeaderLibraryAccess": "Kütüphane Erişimi", @@ -609,7 +523,6 @@ "HeaderLatestMusic": "Son Müzik", "HeaderKeepSeries": "Seriyi Sakla", "HeaderKeepRecording": "Kaydı Sakla", - "HeaderItems": "Öğeler", "HeaderInstall": "Yükle", "HeaderImageOptions": "Resim Seçenekleri", "HeaderIdentifyItemHelp": "Bir veya daha fazla arama kriteri giriniz. Faha fazla arama sonucu için kriter kaldırın.", @@ -617,7 +530,6 @@ "HeaderIdentificationCriteriaHelp": "En az bir kimlik kriteri girmelisiniz.", "HeaderIdentification": "Kimlik", "HeaderHttpHeaders": "HTTP Başlıkları", - "HeaderHome": "Ana Sayfa", "HeaderFavoritePeople": "Favori Kişiler", "LabelEnableAutomaticPortMap": "Otomatik port eşleştirmeyi etkinleştir", "LabelEasyPinCode": "Basit pin kodu:", @@ -646,10 +558,8 @@ "LabelAudioSampleRate": "Ses örnekleme hızı:", "LabelAudioCodec": "Ses kodeği:", "LabelAudioChannels": "Ses kanalları:", - "LabelAudio": "Ses", "LabelAppName": "Uygulama adı", "LabelAllowHWTranscoding": "Donanım kod dönüştürmesine izin ver", - "LabelAll": "Tümü", "LabelAlbumArtMaxWidth": "Albüm resmi maks. genişlik:", "LabelAlbumArtMaxHeight": "Albüm resmi maks. yükseklik:", "LabelAlbum": "Albüm:", @@ -665,7 +575,6 @@ "Identify": "Tanımla", "Horizontal": "Yatay", "Help": "Yardım", - "HeadersFolders": "Klasörler", "HeaderYears": "Yıl", "HeaderXmlSettings": "Xml Ayarları", "HeaderXmlDocumentAttributes": "Xml Döküman Öznitelikleri", @@ -676,7 +585,6 @@ "HeaderTypeText": "Metin Gir", "HeaderTunerDevices": "Alıcı Cihazları", "HeaderThisUserIsCurrentlyDisabled": "Bu kullanıcı şu anda pasif", - "HeaderTags": "Etiketler", "HeaderSubtitleProfiles": "Altyazı Profilleri", "HeaderSubtitleProfile": "Altyazı Profili", "HeaderSubtitleDownloads": "Altyazı İndirmeleri", @@ -686,7 +594,6 @@ "HeaderSpecialEpisodeInfo": "Özel Bölüm Bilgisi", "HeaderSortOrder": "Sıralama Düzeni", "HeaderSortBy": "Sırala", - "HeaderShutdown": "Kapat", "HeaderSettings": "Ayarlar", "LabelLogs": "Günlük:", "HeaderSelectMetadataPathHelp": "İçinde meta veri depolamak istediğiniz yola göz atın veya bu yolu girin. Klasörün yazılabilir olması gerekir.", @@ -703,7 +610,6 @@ "HeaderSelectTranscodingPathHelp": "Geçici Video Kodlama dosyaları için bir dosya yolu seçin yada yazın. Dosya yoluna yazma yetkisi gereklidir.", "HeaderSelectTranscodingPath": "Video Kodlaması İçin Geçici Dosya Yolu Seç", "HeaderSelectServerCachePathHelp": "Önbellek dosyaları için bir dosya yolu seçin yada yazın. Dosya yoluna yazma yetkisi gereklidir.", - "CopyStreamURLError": "URL kopyalanırken bir hata oluştu.", "OptionNone": "Hiçbiri", "None": "Hiçbiri", "HeaderNavigation": "Navigasyon", @@ -755,11 +661,9 @@ "LabelSupportedMediaTypes": "Desteklenen Ortam Türleri:", "LabelSubtitlePlaybackMode": "Altyazı biçimi:", "LabelSubtitleFormatHelp": "Örnek: srt", - "LabelSubtitles": "Altyazılar", "LabelStreamType": "Akış türü:", "LabelSubtitleDownloaders": "Altyazı indiriciler:", "LabelStopping": "Durduruluyor", - "LabelSoundEffects": "Ses efektleri:", "LabelSortOrder": "Sıralama düzeni:", "LabelSortBy": "Sıralama türü:", "LabelSkipIfGraphicalSubsPresent": "Video halihazırda gömülü altyazı barındırıyorsa atla", diff --git a/src/strings/uk.json b/src/strings/uk.json index 0b93964474..893311884c 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -1,14 +1,11 @@ { - "BirthDateValue": "Народився: {0}", + "BirthDateValue": "Дата народження: {0}", "BirthPlaceValue": "Місце народження: {0}", "ButtonAddUser": "Додати користувача", "ButtonCancel": "Скасувати", - "ButtonFilter": "Фільтр", - "ButtonNew": "Новий", "ButtonRename": "Перейменувати", "ButtonResetPassword": "Скинути пароль", - "ButtonSave": "Зберігти", - "ButtonSignOut": "Sign out", + "ButtonSignOut": "Вийти", "DeathDateValue": "Помер: {0}", "Dislike": "Не подобається", "Favorite": "Улюблене", @@ -16,17 +13,12 @@ "FolderTypeMovies": "Фільми", "FolderTypeMusic": "Музика", "FolderTypeTvShows": "ТБ", - "HeaderAlbums": "Альбоми", - "HeaderAutomaticUpdates": "Автоматичне оновлення", - "HeaderBooks": "Книги", "HeaderDeleteDevice": "Видалить пристрій", "HeaderLatestEpisodes": "Нещодавно переглянуті серії", "HeaderLatestMedia": "Нещодавно переглянуті", "HeaderLatestMovies": "Нещодавні фільми", "HeaderLatestMusic": "Остання музика", - "HeaderMovies": "Фільми", "HeaderSeasons": "Сезони", - "HeaderSeries": "Series", "HeaderSettings": "Налаштування", "HeaderTracks": "Доріжки", "HeaderUsers": "Користувачі", @@ -37,10 +29,7 @@ "LabelDeathDate": "Дата смерті:", "LabelLanguage": "Мова:", "LabelNewPassword": "Новий пароль:", - "LabelNext": "Вперед", "LabelPath": "Шлях:", - "LabelPrevious": "Назад", - "LabelYourFirstName": "Ім’я:", "Like": "Подобається", "MediaInfoAspectRatio": "Співвідношення сторін", "MediaInfoChannels": "Канали", @@ -65,19 +54,11 @@ "ParentalRating": "Parental Rating", "Save": "Зберігти", "Settings": "Налаштування", - "TabCollections": "Колекції", - "TabEpisodes": "Епізоди", - "TabGenres": "Жанри", - "TabMetadata": "Метадані", - "TabMovies": "Фільми", "TabNetworks": "Мережі", "TabNotifications": "Повідомлення", - "TabPassword": "Пароль", "TabPlugins": "Додатки", "TabProfile": "Профіль", "TabProfiles": "Профілі", - "TabTrailers": "Трейлери", - "TabUsers": "Користувачі", "ValueAlbumCount": "{0} альбомів", "ValueDiscNumber": "Диск {0}", "ValueEpisodeCount": "{0} епізодів", @@ -93,50 +74,47 @@ "ValueSeriesCount": "{0} серій", "ValueSongCount": "{0} пісень", "AddToPlaylist": "Додати до списку відтворення", - "AccessRestrictedTryAgainLater": "На цей момент доступ заборонений. Повторіть спробу пізніше.", - "Actor": "Виконавець", + "AccessRestrictedTryAgainLater": "На даний момент доступ обмежений. Будь ласка, спробуйте пізніше.", + "Actor": "Актор", "AllLanguages": "Усі мови", - "AllLibraries": "Усі бібліотеки", + "AllLibraries": "Усі медіатеки", "AddToCollection": "Додати до колекції", "AddToPlayQueue": "Додати до черги відтворення", "All": "Всі", "AllChannels": "Всі канали", "AllEpisodes": "Всі епізоди", - "AllowRemoteAccess": "Дозволити віддалене підключення до цього сервера Jellyfin.", + "AllowRemoteAccess": "Дозволити віддалене підключення до цього сервера.", "AlwaysPlaySubtitles": "Завжди вмикати субтитри", "AnyLanguage": "Будь-яка мова", - "Anytime": "Завжди", + "Anytime": "У будь-який час", "Add": "Додати", - "AddedOnValue": "Додано", + "AddedOnValue": "Додано {0}", "Albums": "Альбоми", "Absolute": "Абсолютний", "HeaderFavoriteEpisodes": "Улюблені серії", "Movies": "Фільми", "Collections": "Колекції", - "Folders": "Директорії", - "HeaderNextUp": "Наступний", - "HeaderAlbumArtists": "Виконавці альбомів", + "Folders": "Каталоги", + "HeaderAlbumArtists": "Виконавці альбому", "HeaderFavoriteSongs": "Улюблені пісні", "Favorites": "Улюблені", "HeaderFavoriteAlbums": "Улюблені альбоми", "Genres": "Жанри", "Books": "Книги", "Artists": "Виконавці", - "HeaderLiveTV": "Ефірне ТБ", "Channels": "Канали", "HeaderFavoriteArtists": "Улюблені виконавці", "HeaderFavoriteShows": "Улюблені шоу", "HeaderContinueWatching": "Продовжити перегляд", - "AddItemToCollectionHelp": "Додайте елементи до колекції за допомогою пошуку або кліком правої кнопкої миші чи натисненням на меню.", - "AllowedRemoteAddressesHelp": "Список з комами, в якості розділювачів, визначає IP-адреси та IP/мережеві маски для мереж, яким дозволено підключатись віддалено. Якщо залишити строку пустою, то усі віддалені підключення будуть дозволені.", + "AllowedRemoteAddressesHelp": "Список розділених комами IP-адрес або IP/мережевих масок, яким буде дозволено віддалено підключатися. Якщо залишити порожнім, усі віддалені адреси будуть дозволені.", "AllowRemoteAccessHelp": "Якщо не відмічено прапорцем, усі віддалені підключення будуть заблоковані.", "AllowFfmpegThrottling": "Примусово обмежити перекодування", - "AllowMediaConversionHelp": "Надайте або забороніть доступ для можливості перетворення медіа.", + "AllowMediaConversionHelp": "Надати або заборонити доступ до функції конвертації медіа.", "AllowMediaConversion": "Дозволити перетворення медіа", "Alerts": "Термінові сповіщення", "AlbumArtist": "Виконавець альбому", "Album": "Альбом", - "AdditionalNotificationServices": "Пошук у каталозі плагінів для встановлення додаткових сервісів сповіщень.", + "AdditionalNotificationServices": "Перегляньте каталог плагінів, щоб встановити додаткові служби сповіщення.", "ShowYear": "Відобразити рік", "ShowTitle": "Відобразити назву", "Raised": "Піднятий", @@ -144,21 +122,151 @@ "DropShadow": "Тінь", "Blacklist": "Чорний список", "BirthLocation": "Місце народження", - "Banner": "Обкладинка", - "AutoBasedOnLanguageSetting": "Автоматично (на основі поточної мови)", + "Banner": "Банер", "Auto": "Автоматично", - "AuthProviderHelp": "Оберіть сервіс аутентифікації, який буде використаний з поточним паролем користувача.", + "AuthProviderHelp": "Оберіть сервіс аутентифікації, який буде використаний для автентифікації пароля даного користувача.", "Audio": "Аудіо", - "AttributeNew": "Новий", - "AspectRatio": "Відношення сторін", - "AskAdminToCreateLibrary": "Попросіть адміністратора створити бібліотеку.", + "AspectRatio": "Співвідношення сторін", + "AskAdminToCreateLibrary": "Попросіть адміністратора створити медіатеку.", "Ascending": "У порядку зростання", - "AsManyAsPossible": "Настільки багато наскільки можливо", + "AsManyAsPossible": "Якнайбільше", "Artist": "Виконавець", - "Art": "Мистецтво", + "Art": "Обкладинка", "AllowOnTheFlySubtitleExtractionHelp": "Вбудовані субтитри можуть бути експортовані з відео і надіслані, по черзі, клієнтам у вигляді тексту. Це допоможе уникнути перекодування відео. На деяких системах, перекодування може зайняти тривалий час і зупинити відтворення відео, для того щоб забезпечити експортування. Вимкнення цієї функції дозволить вбудованим субтитрам бути інтегрованим у відео, під час перекодування, якщо вбудовані субтитри не підтримуються на стороні клієнта.", "AllowOnTheFlySubtitleExtraction": "Дозволити експортування субтитрів «на льоту»", - "AllowHWTranscodingHelp": "Дозволити клієнту перекодування на «на льоту». Це дозволить відмикати перекодування, якщо вона вимагається сервером.", + "AllowHWTranscodingHelp": "Тюнеру дозволяється перекодувати потоки на льоту. Це може допомогти зменшити перекодування, необхідне серверу.", "AllComplexFormats": "Усі складні формати (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)", - "ButtonSyncPlay": "SyncPlay" + "ButtonSyncPlay": "SyncPlay", + "ValueSpecialEpisodeName": "Спецепізод - {0}", + "Sync": "Синхронізація", + "Songs": "Пісні", + "Shows": "Шоу", + "Playlists": "Плейлисти", + "Photos": "Фотографії", + "Aired": "Ефірний", + "AirDate": "Дата ефіру", + "CustomDlnaProfilesHelp": "Створіть спеціальний профіль, для нового пристрою або змініть системний профіль.", + "CriticRating": "Рейтинг критиків", + "CopyStreamURLSuccess": "URL-адреса успішно скопійована.", + "CopyStreamURL": "Скопіювати URL-адресу потоку", + "Continuing": "Продовження", + "ContinueWatching": "Продовжити перегляд", + "Connect": "Підключитись", + "ConfirmEndPlayerSession": "Ви хочете вимкнути Jellyfin на {0}?", + "ConfirmDeletion": "Підтвердити видалення", + "ConfirmDeleteItems": "Видалення цих елементів видалить їх як з файлової системи, так і з медіатеки. Ви впевнені, що хочете продовжити?", + "ConfirmDeleteItem": "Видалення цього елемента видалить його як з файлової системи, так і з медіатеки. Ви впевнені, що хочете продовжити?", + "ConfirmDeleteImage": "Видалити зображення?", + "ConfigureDateAdded": "Налаштуйте, як визначається дата додавання на інформаційній панелі в налаштуваннях медіатеки", + "Composer": "Композитор", + "CommunityRating": "Рейтинг спільноти", + "ColorTransfer": "Передача кольору", + "ColorSpace": "Кольоровий простір", + "ColorPrimaries": "Основні кольори", + "ClientSettings": "Налаштування клієнта", + "CinemaModeConfigurationHelp": "Режим кінотеатру забезпечує враження від глядацького залу прямо у вашій вітальні з можливістю відтворювати трейлери та власні відео перед фільмом.", + "ChannelNumber": "Номер каналу", + "ChannelNameOnly": "Тільки канал {0}", + "ChannelAccessHelp": "Виберіть канали, якими поділитись з даним користувачем. Адміністратори зможуть редагувати всі канали за допомогою менеджера метаданих.", + "ChangingMetadataImageSettingsNewContent": "Зміни в налаштуваннях завантаження метаданих або зображень стосуються лише нового вмісту, доданого до вашої бібліотеки. Щоб застосувати зміни до існуючих творів, потрібно оновити їх метадані вручну.", + "Categories": "Категорії", + "CancelSeries": "Скасувати серіал", + "CancelRecording": "Скасувати запис", + "ButtonWebsite": "Веб-сайт", + "ButtonUninstall": "Видалити", + "ButtonTrailer": "Трейлер", + "ButtonTogglePlaylist": "Плейлист", + "ButtonSubmit": "Підтвердити", + "ButtonSplit": "Розділити", + "ButtonStop": "Зупинити", + "ButtonStart": "Почати", + "ButtonSignIn": "Вхід", + "ButtonShutdown": "Завершити роботу", + "ButtonSettings": "Налаштування", + "ButtonSend": "Надіслати", + "ButtonSelectView": "Вибрати вигляд", + "ButtonSelectServer": "Вибрати сервер", + "ButtonSelectDirectory": "Вибрати каталог", + "ButtonScanAllLibraries": "Сканувати всі медіатеки", + "ButtonRevoke": "Відмінити", + "ButtonResume": "Відновити", + "ButtonRestart": "Перезапустити", + "ButtonResetEasyPassword": "Скинути простий пін-код", + "ButtonRemove": "Видалити", + "ButtonRefreshGuideData": "Оновити дані телегіда", + "ButtonQuickStartGuide": "Посібник по швидкому запуску", + "ButtonProfile": "Профіль", + "ButtonPreviousTrack": "Попередня доріжка", + "ButtonPause": "Пауза", + "ButtonParentalControl": "Батьківський контроль", + "ButtonOpen": "Відкрити", + "ButtonOk": "Ок", + "ButtonNextTrack": "Наступна доріжка", + "ButtonNetwork": "Мережа", + "ButtonMore": "Більше", + "ButtonManualLogin": "Ввести ім’я користувача вручну", + "ButtonLibraryAccess": "Доступ до медіатеки", + "ButtonInfo": "Інформація", + "ButtonGuide": "Телегід", + "ButtonGotIt": "Зрозуміло", + "ButtonFullscreen": "Повноекранний режим", + "ButtonForgotPassword": "Забув(ла) пароль", + "ButtonEditOtherUserPreferences": "Редагувати профіль, зображення та особисті налаштування даного користувача.", + "ButtonChangeServer": "Змінити сервер", + "ButtonBack": "Назад", + "ButtonAudioTracks": "Аудіозаписи", + "ButtonArrowRight": "Вправо", + "ButtonArrowLeft": "Вліво", + "ButtonAddServer": "Додати сервер", + "ButtonAddScheduledTaskTrigger": "Додати тригер", + "ButtonAddMediaLibrary": "Додати медіатеку", + "ButtonAddImage": "Додати зображення", + "BurnSubtitlesHelp": "Визначає, чи повинен сервер додавати субтитри під час перекодування відео. Уникнення цього значно покращить продуктивність. Виберіть Автоматично для записування форматів на основі зображень (VOBSUB, PGS, SUB, IDX, ...) та певні субтитри ASS або SSA.", + "MessageBrowsePluginCatalog": "Перегляньте каталог плагінів, щоб ознайомитися з доступними плагінами.", + "Browse": "Огляд", + "BoxRear": "Коробка (задня частина)", + "BoxSet": "Колекція", + "Box": "Коробка", + "BookLibraryHelp": "Підтримуються аудіо та текстові книги. Перегляньте {0} посібник з іменування книг {1}.", + "Backdrops": "Фони", + "Backdrop": "Фон", + "AroundTime": "Приблизно", + "AlwaysPlaySubtitlesHelp": "Субтитри, що відповідають мовним параметрам, завантажуватимуться незалежно від мови звуку.", + "AllowFfmpegThrottlingHelp": "Коли перекодування або перепакування досить далеко випереджає поточну позицію відтворення, процес призупиняється, щоб зекономити ресурси. Це найкорисніше при перегляді, коли рідко міняється позиція відтворення. Вимкніть це, якщо виникнуть проблеми з відтворенням.", + "ExitFullscreen": "Вийти з повноекранного режиму", + "Episodes": "Серії", + "Episode": "Серія", + "Ended": "Закінчилось", + "EnableThemeVideos": "Тематичні відео", + "EnableThemeSongs": "Тематичні пісні", + "EnablePhotos": "Показувати фото", + "EnableHardwareEncoding": "Ввімкнути апаратне кодування", + "EnableExternalVideoPlayers": "Зовнішні відеоплеєри", + "EnableCinemaMode": "Режим кіно", + "EditSubtitles": "Редагувати субтитри", + "EditMetadata": "Редагувати метадані", + "EditImages": "Редагувати зображення", + "Edit": "Редагувати", + "DownloadsValue": "{0} завантажень", + "Download": "Завантажити", + "Down": "Вниз", + "DoNotRecord": "Не записувати", + "Depressed": "Подавлений", + "ErrorDefault": "Виникла помилка при обробці запиту. Будь-ласка повторіть пізніше.", + "DatePlayed": "Дата програвання", + "DateAdded": "Дата додана", + "Default": "За замовчуванням", + "Delete": "Видалити", + "DeleteImage": "Видалити зображення", + "DeleteMedia": "Видалити медіа", + "DeleteUser": "Видалити користувача", + "Desktop": "Робочий стіл", + "DetectingDevices": "Виявлення пристроїв", + "DirectStreaming": "Пряме мовлення", + "Director": "Режисер", + "Directors": "Режисери", + "Disabled": "Відключено", + "Disc": "Диск", + "Display": "Дисплей", + "Disconnect": "Відключити" } diff --git a/src/strings/vi.json b/src/strings/vi.json index 4481559761..68718d4c5d 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -1,19 +1,13 @@ { "Add": "Thêm", "All": "Tất cả", - "BrowsePluginCatalogMessage": "Duyệt qua các danh mục plugin của chúng tôi để xem các plugin có sẵn.", - "ButtonAdd": "Thêm", + "MessageBrowsePluginCatalog": "Duyệt qua các danh mục plugin của chúng tôi để xem các plugin có sẵn.", "ButtonAddUser": "Thêm người dùng", "ButtonCancel": "Thoát", - "ButtonDeleteImage": "Xóa hình ảnh", - "ButtonNew": "Mới", "ButtonRemove": "Gỡ bỏ", "ButtonResetPassword": "Reset mật khẩu", - "ButtonSave": "Lưu", - "ButtonSearch": "Tìm kiếm", "ButtonSelectDirectory": "Lựa chọn trực tiếp", "ButtonSignOut": "Sign out", - "ButtonSort": "Phân loại", "Delete": "Xóa", "DeleteImage": "Xóa hình ảnh", "DeleteImageConfirmation": "Bạn có chắc muốn xóa hình ảnh này?", @@ -22,19 +16,15 @@ "FileReadCancelled": "Tệp tin đọc đã bị hủy.", "FileReadError": "Có một lỗi xảy ra khi đọc tệp tin này.", "FolderTypeTvShows": "TV", - "HeaderAddUser": "Thêm người dùng", - "HeaderAutomaticUpdates": "Tự động cập nhật", "HeaderCustomDlnaProfiles": "Hồ sơ khách hàng", "HeaderFeatureAccess": "Truy cập tính năng", "HeaderFrequentlyPlayed": "Phát thường xuyên", "HeaderLatestEpisodes": "Các tập phim mới nhất", "HeaderLatestMovies": "Phim mới nhất", "HeaderRecentlyPlayed": "Phát gần đây", - "HeaderSeries": "Series", "HeaderStatus": "Trạng thái", "HeaderSystemDlnaProfiles": "Hồ sơ hệ thống", "HeaderUsers": "dùng", - "LabelAllowServerAutoRestart": "Cho phép máy chủ tự động khởi động lại để áp dụng các bản cập nhật", "LabelAudioLanguagePreference": "Ngôn ngữ thoại ưa thích:", "LabelCountry": "Quốc gia:", "LabelCurrentPassword": "Mật khẩu hiện tại:", @@ -46,12 +36,9 @@ "LabelName": "Tên:", "LabelNewPassword": "Mật khẩu mới:", "LabelNewPasswordConfirm": "Xác nhận mật khẩu mới:", - "LabelNext": "Tiếp theo", - "LabelPrevious": "Trước", "LabelSaveLocalMetadata": "Lưu các ảnh nghệ thuật và metadata vào trong các thư mục media", "LabelSaveLocalMetadataHelp": "Lưu các ảnh nghệ thuật và metadata vào trong các thư mục media, sẽ đưa chúng vào một nơi bạn có thể chỉnh sửa dễ dàng hơn.", "LabelTime": "Thời gian:", - "LabelYourFirstName": "Tên của bạn:", "LabelYoureDone": "Bạn đã hoàn thành!", "MaxParentalRatingHelp": "Nội dung với đánh giá cao hơn sẽ được ẩn đi từ người dùng này.", "MessageNothingHere": "Không có gì ở đây.", @@ -59,7 +46,6 @@ "OptionAlbumArtist": "Album nghệ sỹ", "OptionAllowUserToManageServer": "Cho phép người dùng này quản lý máy chủ", "OptionArtist": "Nghệ sỹ", - "OptionAutomatic": "Tự động", "OptionCommunityRating": "Đánh giá của cộng đồng", "OptionDateAdded": "Ngày thêm", "OptionDatePlayed": "Ngày phát", @@ -78,12 +64,9 @@ "OptionIsHD": "Độ nét cao", "OptionIsSD": "Độ nét tiêu chuẩn", "OptionLikes": "Thích", - "OptionMonday": "Thứ Hai", "OptionNameSort": "Tên", "OptionPlayCount": "Số lần phát", "OptionRuntime": "Thời gian phát", - "OptionSaturday": "Thứ Bảy", - "OptionSunday": "Chủ Nhật", "OptionTrackName": "Tên bài", "ParentalRating": "Parental Rating", "PasswordMatchError": "Mật khẩu và mật khẩu xác nhận cần phải khớp nhau .", @@ -94,28 +77,18 @@ "Save": "Lưu", "SettingsSaved": "Lưu các cài đặt.", "Sunday": "Chủ Nhật", - "TabAlbumArtists": "Các Album nghệ sỹ", - "TabAlbums": "Các Album", - "TabArtists": "Các nghệ sỹ", "TabCatalog": "Danh mục", - "TabEpisodes": "Các tập phim", - "TabGenres": "Các thể loại", "TabLatest": "Mới nhất", - "TabMovies": "Các phim", - "TabMusicVideos": "Các video âm nhạc", "TabMyPlugins": "Các plugin của tôi", "TabNetworks": "Các mạng", - "TabPassword": "Mật khẩu", "TabProfile": "Hồ sơ", "TabProfiles": "Hồ sơ", "TabServer": "Máy chủ", - "TabSongs": "Các ca khúc", - "TabTranscoding": "Mã hóa", "TabUpcoming": "Sắp diễn ra", "TellUsAboutYourself": "Nói cho chúng tôi biết đôi điều về Bạn", "ThisWizardWillGuideYou": "Thủ thuật này sẽ hướng dẫn quá trình cài đặt cho bạn. Để bắt đầu, vui lòng lựa chọn ngôn ngữ bạn ưa thích.", "UninstallPluginConfirmation": "Bạn có chắc muốn gỡ bỏ{0}?", - "UninstallPluginHeader": "Gỡ bỏ Plugin", + "HeaderUninstallPlugin": "Gỡ bỏ Plugin", "AccessRestrictedTryAgainLater": "Truy cập hiện đang bị hạn chế. Hãy thử lại sau.", "AddToCollection": "Thêm vào bộ sưu tập", "Actor": "Diễn viên", @@ -123,46 +96,30 @@ "ButtonResume": "Tiếp tục", "ButtonRestart": "Khởi động lại", "ButtonResetEasyPassword": "Đặt lại mã pin nhanh", - "ButtonRepeat": "Lặp lại", "ButtonRename": "Đổi tên", "ButtonRefreshGuideData": "Làm mới dữ liệu hướng dẫn", - "ButtonRefresh": "Làm mới", "ButtonQuickStartGuide": "Hướng dẫn nhanh", "ButtonProfile": "Hồ sơ", "ButtonPreviousTrack": "Bài trước", - "ButtonPlay": "Chơi", "ButtonPause": "Tạm dừng", "ButtonParentalControl": "Kiểm soát của cha mẹ", "ButtonOpen": "Mở", - "ButtonOff": "Tắt", "ButtonNextTrack": "Tiếp theo", "ButtonNetwork": "Mạng", "ButtonMore": "Thêm", "ButtonManualLogin": "Đăng nhập thủ công", "ButtonLibraryAccess": "Truy cập thư viện", - "ButtonLearnMore": "Tìm hiểu thêm", "ButtonInfo": "Thông tin", - "ButtonHome": "Trang chủ", - "ButtonHelp": "Giúp đỡ", "ButtonGuide": "Hướng dẫn", "ButtonGotIt": "Hiểu rồi", "ButtonFullscreen": "Toàn màn hình", "ButtonForgotPassword": "Quên mật khẩu", - "ButtonFilter": "Lọc", "ButtonEditOtherUserPreferences": "Chỉnh sửa thông tin, hình ảnh và sở thích cá nhân.", - "ButtonEditImages": "Sửa hình ảnh", - "ButtonEdit": "Sửa", - "ButtonDownload": "Tải", - "ButtonDown": "Xuống", - "ButtonDelete": "Xoá", - "ButtonConnect": "Kết nối", "ButtonChangeServer": "Đổi máy chủ", "ButtonBack": "Lùi", "ButtonAudioTracks": "Track âm thanh", - "ButtonArrowUp": "Lên", "ButtonArrowRight": "Phải", "ButtonArrowLeft": "Trái", - "ButtonArrowDown": "Xuống", "ButtonAddServer": "Thêm máy chủ", "ButtonAddScheduledTaskTrigger": "Thêm kích hoạt", "ButtonAddMediaLibrary": "Thêm thư viện Media", @@ -178,11 +135,9 @@ "BirthDateValue": "Sinh năm: {0}", "Backdrops": "Phông nền", "Backdrop": "Phông nền", - "AutoBasedOnLanguageSetting": "Tự động (dựa trên cài đặt ngôn ngữ)", "Auto": "Tự động", "AuthProviderHelp": "Chọn Nhà cung cấp xác thực sẽ được sử dụng để xác thực mật khẩu người dùng này.", "Audio": "Âm thanh", - "AttributeNew": "Tạo mới", "AspectRatio": "Tỷ lệ khung hình", "AskAdminToCreateLibrary": "Yêu cầu quản trị viên tạo thư viện.", "Ascending": "Tăng dần", @@ -214,22 +169,17 @@ "AddedOnValue": "Đã thêm {0}", "AddToPlaylist": "Thêm vào danh sách phát", "AddToPlayQueue": "Thêm vào hàng đợi", - "AddItemToCollectionHelp": "Thêm các mục vào bộ sưu tập bằng cách tìm kiếm và nhấp chuột phải hoặc nhấn vào menu để thêm chúng vào bộ sưu tập.", "Absolute": "Tuyệt đối", "ButtonSend": "Gửi", "ButtonSelectView": "Chọn chế độ xem", "ButtonSelectServer": "Chọn máy chủ", "ButtonScanAllLibraries": "Quét tất cả các thư viện", "ButtonOk": "Đồng Ý", - "ButtonShuffle": "Xáo trộn", "Categories": "Phân loại", "CancelRecording": "Ngưng ghi hình", "ButtonWebsite": "Trang web", - "ButtonViewWebsite": "Xem trang web", - "ButtonUp": "Lên", "ButtonUninstall": "Gỡ cài đặt", "ButtonTrailer": "Tóm tắt", - "ButtonSubtitles": "Phụ đề", "ButtonSubmit": "Đăng", "ButtonSplit": "Tách", "ButtonStop": "Ngưng", @@ -237,14 +187,13 @@ "ButtonSignIn": "Đăng nhập", "ButtonShutdown": "Tắt", "ButtonSettings": "Cài đặt", - "DefaultErrorMessage": "Có lỗi xảy ra trong lúc xử lý yêu cầu của bạn. Xin hãy thử lại sau.", + "ErrorDefault": "Có lỗi xảy ra trong lúc xử lý yêu cầu của bạn. Xin hãy thử lại sau.", "Default": "Mặc định", "DeathDateValue": "Không hoạt động: {0}", "DatePlayed": "Ngày phát", "DateAdded": "Ngày thêm vào", "CustomDlnaProfilesHelp": "Tạo một bộ thiết lập tuỳ chọn dành cho một thiết bị mới hoặc thay thế một thiết lập hệ thống.", "CriticRating": "Đánh giá phê bình", - "CopyStreamURLError": "Có lỗi xảy ra lúc sao chép URL.", "CopyStreamURLSuccess": "URL đã được sao chép.", "CopyStreamURL": "Sao Chép URL Phát Sóng", "Continuing": "Tiếp tục", @@ -271,7 +220,6 @@ "ChangingMetadataImageSettingsNewContent": "Thay đổi về thiết lập của việc tải thông tin hoặc hình ảnh sẽ chỉ có tác dụng với những nội dung mới được thêm vào thư viện. Để những thiết lập mới có tác dụng với nội dung đã có sẵn, bạn sẽ phải cập nhật lại thông tin của chúng.", "CancelSeries": "Ngưng series", "ButtonTogglePlaylist": "Danh sách phát", - "ButtonToggleContextMenu": "Thêm", "BoxSet": "Tuyển tập", "Box": "Hộp", "Banner": "Ảnh bìa", @@ -313,7 +261,6 @@ "DoNotRecord": "Không ghi lại", "EnableCinemaMode": "Chế độ rạp phim", "EnableBackdropsHelp": "Hiển thị phông nền phía sau một số trang khi xem thư viện.", - "EnableBackdrops": "Phông nền", "EditSubtitles": "Chỉnh sửa phụ đề", "EditMetadata": "Chỉnh sửa thông tin", "EditImages": "Chỉnh sửa hình ảnh", @@ -337,14 +284,11 @@ "HeaderConfigureRemoteAccess": "Thiết Lập Truy Cập Từ Xa", "HeaderCodecProfile": "Bộ Giải Mã", "HeaderChapterImages": "Hình Ảnh Phân Đoạn", - "HeaderChannels": "Kênh", "HeaderChannelAccess": "Quyền Truy Cập Kênh", - "HeaderCastCrew": "Diễn Viên & Ê-kíp", "HeaderCastAndCrew": "Diễn Viên & Ê-kíp", "HeaderCancelSeries": "Huỷ Series", "HeaderCancelRecording": "Dừng Ghi Âm/Ghi Hình", "HeaderBranding": "Tạo Thương Hiệu", - "HeaderBooks": "Sách", "HeaderBlockItemsWithNoRating": "Khoá những mục không có thông tin đánh giá hoặc thông tin không đáng tin cậy:", "HeaderAudioSettings": "Cài Đặt Âm Thanh", "HeaderAudioBooks": "Sách Nói", @@ -355,14 +299,12 @@ "HeaderApiKey": "API Key", "HeaderAllowMediaDeletionFrom": "Cho Phép Xoá Nội Dung", "HeaderAlert": "Thông Báo", - "HeaderAlbums": "Albums", "HeaderAlbumArtists": "Nghệ Sĩ Album", "HeaderAdmin": "Quản Trị", "HeaderAdditionalParts": "Phần Bổ Sung", "HeaderAddUpdateImage": "Thêm/Thay Đổi Hình Ảnh", "HeaderAddToPlaylist": "Thêm vào Danh Sách Phát", "HeaderAddToCollection": "Thêm vào Bộ Sưu Tập", - "HeaderAddScheduledTaskTrigger": "Thêm Kích Hoạt Tác Vụ", "HeaderActivity": "Hoạt Động", "HeaderActiveRecordings": "Bản Ghi Hình/Ghi Âm Đang Hoạt Động", "HardwareAccelerationWarning": "Bật tính năng hỗ trợ từ phần cứng có thể gây ra sự bất ổn trong một vài môi trường. Hãy chắc chắn rằng điều hành và driver thiết bị đồ hoạ đã được cập nhật mới nhất. Nếu gặp vấn đề khi phát video sau khi bật tính năng này, bạn nên tắt tính năng này.", @@ -405,7 +347,7 @@ "EveryNDays": "Mỗi {0} ngày", "ErrorSavingTvProvider": "Có lỗi xảy ra khi lưu thông tin của nhà cung cấp TV này. Hãy thử lại khi chắc chắn rằng nó có thể truy cập.", "ErrorPleaseSelectLineup": "Hãy chọn một danh sách và thử lại. Nếu không có danh sách nào sẵn sàng, hãy chắc chắn rằng thông tin tài khoản, mật khẩu, và mã bưu điện đều chính xác.", - "ErrorMessageStartHourGreaterThanEnd": "Thời gian kết thúc phải lớn hơn thời gian bắt đầu.", + "ErrorStartHourGreaterThanEnd": "Thời gian kết thúc phải lớn hơn thời gian bắt đầu.", "ErrorGettingTvLineups": "Có lỗi xảy ra khi tải danh sách TV này. Hãy thử lại khi chắc chắn rằng thông tin của bạn chính xác.", "ErrorDeletingItem": "Có lỗi xảy ra khi xoá mục này khỏi máy chủ Jellyfin. Hãy thử lại sau khi kiểm tra chắc chắn rằng máy chủ Jellyfin có quyền ghi/xoá vào thư mục nội dung.", "ErrorAddingXmlTvFile": "Có lỗi xảy ra khi truy cập tài liệu XMLTV. Hãy thử lại khi chắc chắn rằng tài liệu này tồn tại.", @@ -417,9 +359,7 @@ "EndsAtValue": "Kết thúc tại {0}", "Ended": "Đã kết thúc", "EnableThemeVideosHelp": "Phát nền những video chủ đề khi lướt qua thư viện nội dung.", - "EnableThemeVideos": "Video chủ đề", "EnableThemeSongsHelp": "Phát những bài hát chủ đề khi lướt qua thư viện nội dung.", - "EnableThemeSongs": "Nhạc chủ đề", "EnableStreamLoopingHelp": "Cho phép tính năng này nếu live streams chỉ dài một vài giây và cần được lặp lại liên tục. Bật tính năng này khi không cần thiết có thể gây ra nhiều vấn đề khác.", "EnableStreamLooping": "Tự động phát lại live streams", "EnablePhotosHelp": "Hình ảnh sẽ được nhận diện và hiển thị bên cạnh những nội dung media.", @@ -441,7 +381,6 @@ "HeaderPlayAll": "Phát Tất Cả", "HeaderPinCodeReset": "Đặt Lại Mã PIN", "HeaderPhotoAlbums": "Album Ảnh", - "HeaderPeople": "Nhân Vật", "HeaderPaths": "Đường Dẫn", "HeaderPasswordReset": "Đặt Lại Mật Khẩu", "HeaderPassword": "Mật Khẩu", @@ -449,7 +388,6 @@ "HeaderOtherItems": "Những Mục Khác", "HeaderOnNow": "Phát Sóng Hiện Tại", "HeaderNextVideoPlayingInValue": "Video Tiếp Theo Sẽ Phát trong {0}", - "HeaderNextUp": "Tiếp Theo", "HeaderNextEpisodePlayingInValue": "Tập Tiếp Theo Sẽ Được Chạy trong {0}", "HeaderNewDevices": "Thiết Bị Mới", "HeaderNewApiKey": "Mã API Mới", @@ -459,16 +397,12 @@ "HeaderMyDevice": "Thiết Bị Của Tôi", "HeaderMusicVideos": "Video Âm Nhạc", "HeaderMusicQuality": "Chất Lượng Âm Nhạc", - "HeaderMovies": "Phim", "HeaderMoreLikeThis": "Nội Dung Tương Tự", "HeaderMetadataSettings": "Cài Đặt Dữ Liệu Bổ Trợ", - "HeaderMediaInfo": "Thông Tin Nội Dung", "HeaderMediaFolders": "Thư Mục Chứa Nội Dung", "HeaderMedia": "Nội Dung", "HeaderLoginFailure": "Đăng Nhập Không Thành Công", "HeaderLiveTvTunerSetup": "Cài Đặt Bộ Bắt Sóng TV", - "HeaderLiveTv": "Truyền Hình Trực Tiếp", - "HeaderLiveTV": "Truyền Hình Trực Tiếp", "HeaderLibrarySettings": "Cài Đặt Thư Viện", "HeaderLibraryOrder": "Thứ Tự Thư Viện", "HeaderLibraryFolders": "Thư Mục Của Thư Viện", @@ -480,7 +414,6 @@ "HeaderKodiMetadataHelp": "Để bật hoặc tắt dữ liệu từ NFO, hãy chỉnh sửa thư viện trong phần cài đặt thư viện của Jellyfin và điều chỉnh phần lưu trữ dữ liệu bổ trợ.", "HeaderKeepSeries": "Lưu Series", "HeaderKeepRecording": "Tiếp Tục Ghi Âm/Ghi Hình", - "HeaderItems": "Mục", "HeaderInstantMix": "Trộn Lẫn Nhanh", "HeaderInstall": "Cài Đặt", "HeaderImageSettings": "Thiết Lập Hình Ảnh", @@ -490,15 +423,10 @@ "HeaderIdentificationCriteriaHelp": "Nhập vào ít nhật một thông tin nhận biết.", "HeaderIdentification": "Thông Tin Nhận Biết", "HeaderHttpHeaders": "HTTP Headers", - "HeaderHome": "Trang Chủ", "HeaderGuideProviders": "Nhà Cung Cấp Lịch Phát Sóng TV", - "HeaderGenres": "Thể Loại", - "HeaderForgotPassword": "Quên Mật Khẩu", "HeaderForKids": "Dành Cho Trẻ Em", - "HeaderFilters": "Bộ Lọc", "HeaderFetcherSettings": "Cài Đặt Chương Trình Tải Xuống", "HeaderFetchImages": "Tải Hình Ảnh:", - "HeaderFeatures": "Nổi Bật", "HeaderFavoritePeople": "Nhân Vật Yêu Thích", "HeaderFavoriteAlbums": "Album Yêu Thích", "HeaderFavoriteBooks": "Sách Yêu Thích", @@ -510,13 +438,11 @@ "HeaderFavoriteMovies": "Phim Yêu Thích", "HeaderExternalIds": "Mã Định Danh Từ Bên Ngoài:", "HeaderError": "Lỗi", - "HeaderEpisodes": "Tập", "HeaderEnabledFieldsHelp": "Bỏ chọn một mục để khoá lựa chọn đó và không để nó thay đổi.", "HeaderEnabledFields": "Những Mục Được Kích Hoạt", "HeaderEditImages": "Chỉnh Sửa Hình Ảnh", "HeaderEasyPinCode": "Mã PIN Đơn Giản", "HeaderDownloadSync": "Tải Xuống Và Đồng Bộ", - "HeaderDisplay": "Hiển Thị", "HeaderDirectPlayProfileHelp": "Thêm thiết lập phát trực tiếp để chỉ ra những định dạng mà thiết bị có thể phát trực tiếp mà không cần chuyển mã.", "HeaderDirectPlayProfile": "Thiết Lập Phát Trực Tiếp", "HeaderDevices": "Thiết Bị", @@ -547,7 +473,6 @@ "HeaderSelectCertificatePath": "Chọn Đường Dẫn Đến Chứng Chỉ", "HeaderSecondsValue": "{0} Giây", "HeaderSeasons": "Phần", - "HeaderSchedule": "Lịch Phát Sóng", "HeaderScenes": "Phân Cảnh", "HeaderRunningTasks": "Những Tác Vụ Hoạt Động", "HeaderRevisionHistory": "Lịch Sử Chỉnh Sửa", @@ -565,7 +490,6 @@ "HeaderTracks": "Bài Hát", "HeaderThisUserIsCurrentlyDisabled": "Người dùng này hiện tại đang bị khoá", "HeaderTaskTriggers": "Kích Hoạt Tác Vụ", - "HeaderTags": "Nhãn", "HeaderSubtitleProfilesHelp": "Hồ sơ phụ đề chỉ ra những định dạng phụ đề được hỗ trợ bởi thiết bị phát.", "HeaderSubtitleProfiles": "Hồ Sơ Phụ Đề", "HeaderSubtitleProfile": "Hồ Sơ Phụ Đề", @@ -574,9 +498,7 @@ "HeaderStopRecording": "Ngừng Ghi Hình/Ghi Âm", "HeaderSpecialFeatures": "Những Phần Đặc Biệt Nổi Bật", "HeaderSpecialEpisodeInfo": "Thông Tin Tập Đặc Biệt", - "HeaderShutdown": "Tắt Máy Chủ", "LabelCustomDeviceDisplayNameHelp": "Cung cấp một tên hiển thị riêng hoặc bỏ trống để sử dụng tên có sẵn của thiết bị.", - "LabelCustomDeviceDisplayName": "Tên hiển thị:", "LabelCustomCssHelp": "Áp dụng tuỳ chỉnh riêng của bạn vào giao diện trang web.", "LabelCustomCss": "CSS tuỳ chọn:", "LabelCustomCertificatePathHelp": "Đường dẫn đến tập tin PKCS #12 chứa chứng chỉ (certificate) và khoá riêng (private key) để bật tính năng TLS trên một tên miền tuỳ chọn.", @@ -609,16 +531,13 @@ "LabelAudioChannels": "Các kênh âm thanh:", "LabelAudioBitrate": "Bitrate của âm thanh:", "LabelAudioBitDepth": "Chiều sâu của âm thanh:", - "LabelAudio": "Âm Thanh", "LabelArtistsHelp": "Sử dụng dấu ; để tách rời nhiều nghệ", "LabelArtists": "Nghệ sĩ:", "LabelAppNameExample": "Ví dụ: Sickbeard, Sonarr", "LabelAppName": "Tên ứng dụng", "LabelAllowedRemoteAddressesMode": "Chế độ bộ lọc địa chỉ IP từ xa:", "LabelAllowedRemoteAddresses": "Bộ lọc địa chỉ IP từ xa:", - "LabelAllowServerAutoRestartHelp": "Máy chủ chỉ khởi động lại trong thời gian rỗi khi không có người dùng đang sử dụng.", "LabelAllowHWTranscoding": "Cho phép chuyển mã bằng phần cứng", - "LabelAll": "Tất Cả", "LabelAlbumArtists": "Nghệ sĩ album:", "LabelAlbumArtPN": "Bìa album PN:", "LabelAlbumArtMaxWidthHelp": "Độ phân giải cao nhất của bìa album thông qua upnp:albumArtURI.", @@ -652,7 +571,6 @@ "HideWatchedContentFromLatestMedia": "Ẩn những nội dung đã xem khỏi phần nội dung mới nhất", "Hide": "Ẩn", "Help": "Trợ Giúp", - "HeadersFolders": "Thư Mục", "HeaderYears": "Năm", "HeaderXmlSettings": "Cài Đặt XML", "HeaderXmlDocumentAttributes": "Những Thuộc Tính Tài Liệu XML", @@ -685,7 +603,6 @@ "LabelDisplayOrder": "Thứ tự hiển thị:", "LabelDisplayName": "Tên hiển thị:", "LabelDisplayMode": "Chế độ hiển thị:", - "LabelDisplayMissingEpisodesWithinSeasons": "Hiển thị những tập bị thiếu", "LabelDisplayLanguageHelp": "Dự án chuyển ngữ Jellyfin là một dự án diễn ra ra liên tục.", "LabelDisplayLanguage": "Ngôn ngữ hiển thị:", "LabelDiscNumber": "Đĩa số:", @@ -700,7 +617,6 @@ "LabelDateAddedBehaviorHelp": "Nếu có giá trị dữ liệu bổ trợ, nó sẽ luôn được sử dụng trước một trong các tùy chọn này.", "LabelDateAddedBehavior": "Ngày thêm hành vi cho nội dung mới:", "LabelDateAdded": "Ngày thêm vào:", - "LabelDashboardTheme": "Chủ đề bảng điều khiển máy chủ:", "LabelCustomRating": "Đánh giá tuỳ chọn:", "HeaderFavoritePlaylists": "Danh Sách Phát Yêu Thích", "ApiKeysCaption": "Danh sách các mã API đang hoạt động", diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index c496ab54d0..a44b9ab992 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -2,7 +2,6 @@ "AccessRestrictedTryAgainLater": "目前访问受限,请稍后再试。", "Actor": "演员", "Add": "添加", - "AddItemToCollectionHelp": "通过搜索项目并右键或轻触得到的弹出菜单来将项目添加到集合中。", "AddToCollection": "加入集合", "AddToPlayQueue": "添加至播放队列", "AddToPlaylist": "添加至播放列表", @@ -23,7 +22,7 @@ "AllowMediaConversionHelp": "授予或拒绝访问媒体转换功能。", "AllowOnTheFlySubtitleExtraction": "允许实时提取字幕", "AllowOnTheFlySubtitleExtractionHelp": "为避免视频转码,可以从视频中提取内置的字幕,并以纯文本的形式发送给客户端。在某些系统中这个提取的进程可能会花费较长时间并导致视频播放出现卡顿。如果禁用这个选项,当内置字幕不能被客户端设备原生支持时,字幕将通过视频转码被烧录进视频中。", - "AllowRemoteAccess": "允许与此 Jellyfin 服务器进行远程连接。", + "AllowRemoteAccess": "允许与此服务器进行远程连接。", "AllowRemoteAccessHelp": "如果取消勾选,所有的远程连接将会被阻止。", "AllowedRemoteAddressesHelp": "允许远程连接的 IP 地址或 IP/子网掩码 的列表,以逗号分隔。如果留空,则允许所有远程地址。", "AlwaysPlaySubtitles": "总是显示", @@ -33,10 +32,8 @@ "Artists": "艺术家", "AsManyAsPossible": "尽可能多", "Ascending": "升序", - "AttributeNew": "新增", "Audio": "音频", "Auto": "自动", - "AutoBasedOnLanguageSetting": "自动(取决于语言设置)", "Backdrop": "背景", "Backdrops": "背景", "Banner": "横幅", @@ -47,84 +44,58 @@ "BookLibraryHelp": "现已支持音频和文本书籍。浏览{0}有声读物命名指南{1}。", "Books": "书籍", "Browse": "浏览", - "BrowsePluginCatalogMessage": "浏览我们的插件目录来查看现有插件。", + "MessageBrowsePluginCatalog": "浏览我们的插件目录来查看现有插件。", "BurnSubtitlesHelp": "服务器在转换视频时是否应压制字幕。避免压制字幕会提高服务器性能。选择“自动”以压制基于图像的字幕格式(如 VOBSUB, PGS, SUB, IDX 等)和一些复杂的 ASS/SSA 字幕。", - "ButtonAdd": "添加", "ButtonAddMediaLibrary": "添加媒体库", "ButtonAddScheduledTaskTrigger": "添加触发器", "ButtonAddServer": "添加服务器", "ButtonAddUser": "添加用户", - "ButtonArrowDown": "下", "ButtonArrowLeft": "左", "ButtonArrowRight": "右", - "ButtonArrowUp": "上", "ButtonAudioTracks": "音轨", "ButtonBack": "返回", "ButtonCancel": "取消", "ButtonChangeServer": "更改服务器", - "ButtonConnect": "连接", - "ButtonDelete": "删除", - "ButtonDeleteImage": "删除图片", - "ButtonDown": "下", - "ButtonDownload": "下载", - "ButtonEdit": "编辑", - "ButtonEditImages": "修改图片", "ButtonEditOtherUserPreferences": "编辑这个用户的用户配置,图片和个人参数。", - "ButtonFilter": "筛选", "ButtonForgotPassword": "忘记密码", "ButtonFullscreen": "全屏", "ButtonGotIt": "知道了", "ButtonGuide": "指南", - "ButtonHelp": "帮助", - "ButtonHome": "首页", "ButtonInfo": "详情", - "ButtonLearnMore": "了解更多", "ButtonLibraryAccess": "媒体库访问", "ButtonManualLogin": "手动登录", "ButtonMore": "更多", "ButtonNetwork": "网络", - "ButtonNew": "新增", "ButtonNextTrack": "下一音轨", - "ButtonOff": "关", "ButtonOk": "确定", "ButtonOpen": "打开", "ButtonParentalControl": "家长控制", "ButtonPause": "暂停", - "ButtonPlay": "播放", "ButtonPreviousTrack": "上一音轨", "ButtonProfile": "配置", "ButtonQuickStartGuide": "快速入门指南", - "ButtonRefresh": "刷新", "ButtonRefreshGuideData": "刷新指南数据", "ButtonRemove": "移除", "ButtonRename": "重命名", - "ButtonRepeat": "重播", "ButtonResetEasyPassword": "复位简易PIN码", "ButtonResetPassword": "重置密码", "ButtonRestart": "重启", "ButtonResume": "恢复播放", "ButtonRevoke": "撤销", - "ButtonSave": "保存", "ButtonScanAllLibraries": "扫描所有媒体库", - "ButtonSearch": "搜索", "ButtonSelectDirectory": "选择目录", "ButtonSelectServer": "选择服务器", "ButtonSelectView": "选择视图", "ButtonSend": "发送", "ButtonSettings": "设置", - "ButtonShuffle": "随机播放", "ButtonShutdown": "关机", "ButtonSignIn": "登录", "ButtonSignOut": "退出", - "ButtonSort": "排序", "ButtonStart": "开始", "ButtonStop": "停止", "ButtonSubmit": "提交", - "ButtonSubtitles": "字幕", "ButtonTrailer": "预告片", "ButtonUninstall": "卸载", - "ButtonUp": "上", - "ButtonViewWebsite": "浏览网站", "ButtonWebsite": "网站", "CancelRecording": "取消录制", "CancelSeries": "取消系列", @@ -148,7 +119,7 @@ "DatePlayed": "播放日期", "DeathDateValue": "去世:{0}", "Default": "默认", - "DefaultErrorMessage": "处理请求时发生错误。请稍后尝试。", + "ErrorDefault": "处理请求时发生错误。请稍后尝试。", "DefaultMetadataLangaugeDescription": "这些是你的默认设置并且可以在你的每个媒体库中被单独自定义。", "DefaultSubtitlesHelp": "字幕将基于内嵌元数据中的“默认”标志和“强制”标志来载入。当多个选项可用时,将根据语言偏好决定。", "Delete": "删除", @@ -163,7 +134,7 @@ "DetectingDevices": "正在侦测设备", "DeviceAccessHelp": "这仅适用于可以唯一标识的设备,而不会阻止浏览器访问。限制用户设备访问会阻止使用未在此被批准的新增设备。", "DirectPlaying": "直接播放", - "DirectStreamHelp2": "直接串流只占用占用很少的CPU并且视频的品质不会有任何损失。", + "DirectStreamHelp2": "直接串流只占用占用很少的CPU并且视频的品质只会有极小程度的损失。", "DirectStreaming": "直接串流", "Director": "导演", "Disabled": "已禁用", @@ -186,7 +157,6 @@ "EditImages": "修改图片", "EditMetadata": "编辑元数据", "EditSubtitles": "修改字幕", - "EnableBackdrops": "背景图", "EnableBackdropsHelp": "当浏览媒体库时背景图将作为一些页面的背景显示。", "EnableCinemaMode": "影院模式", "EnableDisplayMirroring": "显示镜像", @@ -199,19 +169,17 @@ "EnablePhotosHelp": "图片将被检测到并和其他媒体文件一起显示。", "EnableStreamLooping": "自动循环直播流", "EnableStreamLoopingHelp": "如果直播流仅包含了几秒钟的数据并且需要被不断的请求,请启用此项。如果在没有相关问题的情况下启动此项,可能会导致一些问题。", - "EnableThemeSongs": "主题曲", "EnableThemeSongsHelp": "当浏览媒体库时主题曲将作为背景音乐播放。", - "EnableThemeVideos": "主题视频", "EnableThemeVideosHelp": "当浏览媒体库时主题视频将作为背景视频播放。", "Ended": "结束", "EndsAtValue": "结束于 {0}", "Episodes": "剧集", "ErrorAddingListingsToSchedulesDirect": "我们将阵容添加到您的Schedules Direct帐户时出错。 Schedules Direct只允许有限的账号排序。 您可能需要在继续前直接登入Schedules Direct 网站并删除其他列表。", - "ErrorAddingMediaPathToVirtualFolder": "添加媒体路径时发生错误。请确认路径是有效的,并且你的 Jellyfin 服务器进程有对该位置的访问权。", + "ErrorAddingMediaPathToVirtualFolder": "添加媒体路径时发生错误。请确认路径是有效的,并且Jellyfin有对该位置的访问权。", "ErrorAddingTunerDevice": "添加协调器设备时发生错误。请确认它是可访问的然后再试一次。", "ErrorAddingXmlTvFile": "访问 XmlTV 文件时发生错误。请确认该文件是否存在然后再试一次。", "ErrorGettingTvLineups": "下载 TV 节目表 时发生错误。请确认你的信息是否正确,然后再试。", - "ErrorMessageStartHourGreaterThanEnd": "结束时间必须在开始时间后。", + "ErrorStartHourGreaterThanEnd": "结束时间必须在开始时间后。", "ErrorPleaseSelectLineup": "请选择一个阵容, 然后再试一次。如果没有可用的阵容, 请检查您的用户名、密码和邮政编码是否正确。", "ErrorSavingTvProvider": "保存 TV 提供商时发生错误。请确认它是可访问的然后再试一次。", "EveryNDays": "每 {0} 天", @@ -252,30 +220,23 @@ "HeaderActiveDevices": "活动的设备", "HeaderActiveRecordings": "正在录制的节目", "HeaderActivity": "活动", - "HeaderAddScheduledTaskTrigger": "添加触发", - "HeaderAddToCollection": "加入收藏", + "HeaderAddToCollection": "加入集合", "HeaderAddToPlaylist": "添加到播放列表", "HeaderAddUpdateImage": "添加/更新 图片", - "HeaderAddUser": "添加用户", "HeaderAdditionalParts": "附加部分", "HeaderAdmin": "管理", "HeaderAlbumArtists": "专辑作家", - "HeaderAlbums": "专辑", "HeaderAlert": "警报", "HeaderAllowMediaDeletionFrom": "允许从中删除媒体", "HeaderApiKey": "API 密钥", "HeaderApiKeys": "API 密钥", - "HeaderApiKeysHelp": "外部应用程序需要 API 密钥才能与 Jellyfin Server 进行通信。使用 Jellyfin 账户进行登录时密钥将会自动生成,您也可以手动为某个应用程序分配一个密钥。", + "HeaderApiKeysHelp": "外部应用程序需要 API 密钥才能与服务器进行通信。密钥会在使用普通账户登录时自动生成,或是手动为应用分配。", "HeaderAudioBooks": "有声读物", "HeaderAudioSettings": "声音设置", - "HeaderAutomaticUpdates": "自动更新", "HeaderBlockItemsWithNoRating": "通过没有评级和设置不允许的评级锁定内容:", - "HeaderBooks": "书籍", "HeaderBranding": "品牌", "HeaderCastAndCrew": "演员表", - "HeaderCastCrew": "演职人员", "HeaderChannelAccess": "频道访问", - "HeaderChannels": "频道", "HeaderChapterImages": "剧集图片", "HeaderCodecProfile": "编解码器配置", "HeaderCodecProfileHelp": "编解码器的配置文件标明了设备播放特定编码时的限制。如果在限制之内则媒体将被转码,否则编解码器将被配置为直接播放。", @@ -303,24 +264,18 @@ "HeaderDevices": "设备", "HeaderDirectPlayProfile": "直接播放配置", "HeaderDirectPlayProfileHelp": "添加直接播放配置文件标明哪些媒体格式设备可以自己处理。", - "HeaderDisplay": "显示", "HeaderDownloadSync": "下载与同步", "HeaderEasyPinCode": "简单 PIN 码", "HeaderEditImages": "修改图片", "HeaderEnabledFields": "已启用的栏", "HeaderEnabledFieldsHelp": "反选栏以锁定并不让其数据被更改。", - "HeaderEpisodes": "集数", "HeaderError": "错误", "HeaderExternalIds": "外部 ID:", "HeaderFeatureAccess": "可使用的功能", - "HeaderFeatures": "功能", "HeaderFetchImages": "获取图像:", "HeaderFetcherSettings": "读取器设置", - "HeaderFilters": "筛选", "HeaderForKids": "给儿童", - "HeaderForgotPassword": "忘记密码", "HeaderFrequentlyPlayed": "多次播放", - "HeaderGenres": "风格", "HeaderGuideProviders": "电视指南数据提供方", "HeaderHttpHeaders": "HTTP 头部", "HeaderIdentification": "身份识别", @@ -331,8 +286,7 @@ "HeaderImageSettings": "图片设置", "HeaderInstall": "安装", "HeaderInstantMix": "速成合辑", - "HeaderItems": "项目", - "HeaderKodiMetadataHelp": "要启用或禁用 NFO 元数据, 请在 Jellyfin 库安装程序中编辑库, 然后找到“元数据储户”部分。", + "HeaderKodiMetadataHelp": "要启用或禁用 NFO 元数据, 请编辑库, 然后找到“元数据储户”部分。", "HeaderLatestEpisodes": "最新剧集", "HeaderLatestMedia": "最新媒体", "HeaderLatestMovies": "最新电影", @@ -343,30 +297,24 @@ "HeaderLibraryFolders": "媒体文件夹", "HeaderLibraryOrder": "媒体库顺序", "HeaderLibrarySettings": "媒体库设置", - "HeaderLiveTV": "电视直播", - "HeaderLiveTv": "电视直播", "HeaderLiveTvTunerSetup": "电视直播协调器安装", "HeaderLoginFailure": "登录失败", "HeaderMedia": "媒体", "HeaderMediaFolders": "媒体文件夹", - "HeaderMediaInfo": "媒体信息", "HeaderMetadataSettings": "元数据设置", "HeaderMoreLikeThis": "更多类似的", - "HeaderMovies": "电影", "HeaderMusicVideos": "音乐视频", "HeaderMyDevice": "我的设备", "HeaderMyMedia": "我的媒体", "HeaderMyMediaSmall": "我的媒体 (小)", "HeaderNewApiKey": "新 API 密钥", "HeaderNewDevices": "新设备", - "HeaderNextUp": "接下来", "HeaderOnNow": "现在", "HeaderOtherItems": "其他项目", "HeaderParentalRatings": "家长分级", "HeaderPassword": "密码", "HeaderPasswordReset": "密码重置", "HeaderPaths": "路径", - "HeaderPeople": "人物", "HeaderPhotoAlbums": "相册", "HeaderPinCodeReset": "重置PIN码", "HeaderPlayAll": "全部播放", @@ -377,7 +325,7 @@ "HeaderPreferredMetadataLanguage": "首选元数据语言", "HeaderProfile": "配置", "HeaderProfileInformation": "配置信息", - "HeaderProfileServerSettingsHelp": "这些参数将控制 Jellyfin 媒体服务器如何呈现给设备。", + "HeaderProfileServerSettingsHelp": "这些参数将控制服务器如何将自己呈现给客户端。", "HeaderRecentlyPlayed": "最近播放", "HeaderRecordingOptions": "录制选项", "HeaderRecordingPostProcessing": "记录后处理", @@ -390,7 +338,6 @@ "HeaderRevisionHistory": "修订历史", "HeaderRunningTasks": "运行的任务", "HeaderScenes": "场景", - "HeaderSchedule": "计划", "HeaderSeasons": "季", "HeaderSecondsValue": "{0} 秒", "HeaderSelectCertificatePath": "选择证书路径", @@ -401,14 +348,12 @@ "HeaderSelectServerCachePath": "选择服务器缓存路径", "HeaderSelectServerCachePathHelp": "浏览或输入一个路径用于服务器缓存文件,此文件夹必须可写。", "HeaderSelectTranscodingPath": "选择临时解码路径", - "HeaderSelectTranscodingPathHelp": "浏览或输入一个路径用于临时转码,此文件夹必须可写。", + "HeaderSelectTranscodingPathHelp": "浏览或输入一个路径用于转码文件,此文件夹必须可写。", "HeaderSendMessage": "发送消息", - "HeaderSeries": "电视剧", "HeaderSeriesOptions": "系列选项", "HeaderServerSettings": "服务器设置", "HeaderSettings": "设置", "HeaderSetupLibrary": "设置你的媒体库", - "HeaderShutdown": "关机", "HeaderSortBy": "排序方式", "HeaderSortOrder": "排序顺序", "HeaderSpecialEpisodeInfo": "特别剧集信息", @@ -421,7 +366,6 @@ "HeaderSubtitleProfiles": "字幕配置", "HeaderSubtitleProfilesHelp": "字幕配置文件描述设备所支持的字幕格式。", "HeaderSystemDlnaProfiles": "系统配置", - "HeaderTags": "标签", "HeaderTaskTriggers": "任务触发条件", "HeaderThisUserIsCurrentlyDisabled": "此用户当前已禁用", "HeaderTracks": "音轨", @@ -442,16 +386,15 @@ "HeaderXmlDocumentAttributes": "XML文档属性", "HeaderXmlSettings": "XML设置", "HeaderYears": "年份", - "HeadersFolders": "文件夹", "Help": "帮助", "Hide": "隐藏", "HideWatchedContentFromLatestMedia": "从最新媒体中隐藏已观看的内容", "Home": "首页", - "HttpsRequiresCert": "要启用安全连接, 您需要提供一个受信任的 SSL 证书, 例如 Let's Encrypt 。请提供证书或禁用安全连接。", + "HttpsRequiresCert": "要启用安全连接, 您需要提供一个受信任的 SSL 证书, 如 \"Let's Encrypt\"。请提供证书或禁用安全连接。", "Identify": "识别", "Images": "图片", - "ImportFavoriteChannelsHelp": "如果启用,只有在协调器设备中被标记为我的最爱的频道才会被导入。", - "ImportMissingEpisodesHelp": "如果启用,会将缺少的剧集信息导入到你的 Jellyfin 数据库并分季分剧显示。可能会大大延长媒体库扫描时间。", + "ImportFavoriteChannelsHelp": "只有在协调器设备中被标记为我的最爱的频道才会被导入。", + "ImportMissingEpisodesHelp": "缺少的剧集信息将被导入到你的数据库并分季分剧显示。可能会大大延长媒体库扫描时间。", "InstallingPackage": "正在安装 {0}(版本 {1})", "InstantMix": "即时混音", "ItemCount": "{0} 项", @@ -474,23 +417,20 @@ "LabelAlbumArtMaxWidthHelp": "通过UPnP显示的专辑封面超链接的最大分辨率。", "LabelAlbumArtPN": "专辑封面PN:", "LabelAlbumArtists": "专辑作家:", - "LabelAll": "所有", "LabelAllowHWTranscoding": "允许硬件转码", - "LabelAllowServerAutoRestart": "允许服务器自动重启来安装更新", - "LabelAllowServerAutoRestartHelp": "该服务器仅会在空闲和没有活动用户的期间重新启动。", "LabelAllowedRemoteAddresses": "远程IP地址过滤器:", "LabelAllowedRemoteAddressesMode": "远程IP地址过滤器模式:", "LabelAppName": "APP名称", "LabelAppNameExample": "例如:Sickbeard, Sonarr", "LabelArtists": "艺术家:", - "LabelArtistsHelp": "独立多功能 ;", + "LabelArtistsHelp": "将多个艺术家用分号分隔。", "LabelAudioLanguagePreference": "首选音频语言:", "LabelAutomaticallyRefreshInternetMetadataEvery": "自动从互联网获取元数据并刷新:", "LabelBindToLocalNetworkAddress": "监听的本地网络地址:", - "LabelBindToLocalNetworkAddressHelp": "(可选的)覆盖 HTTP 服务器绑定的本地 IP 地址。如果留空,服务器将会监听所有可用的地址。改变这个值需要重启 Jellyfin 服务器。", + "LabelBindToLocalNetworkAddressHelp": "覆盖 HTTP 服务器绑定的本地 IP 地址。如果留空,服务器将会监听所有可用的地址。重启后生效。", "LabelBirthDate": "出生日期:", "LabelBirthYear": "出生年份:", - "LabelBlastMessageInterval": "活动信号的时间间隔(秒)", + "LabelBlastMessageInterval": "活动信号的时间间隔", "LabelBlastMessageIntervalHelp": "确定爆炸活动消息之间的持续时间(以秒为单位)。", "LabelBlockContentWithTags": "通过标签锁定内容:", "LabelBurnSubtitles": "烧录字幕:", @@ -501,7 +441,7 @@ "LabelCertificatePassword": "证书密码:", "LabelCertificatePasswordHelp": "如果你的证书需要密码,请在此输入它。", "LabelChannels": "频道:", - "LabelCollection": "收藏:", + "LabelCollection": "集合:", "LabelCommunityRating": "公众评分:", "LabelContentType": "内容类型:", "LabelCorruptedFrames": "损坏的帧:", @@ -512,10 +452,8 @@ "LabelCustomCertificatePathHelp": "提供一个包含了证书和私钥的 PKCS #12 文件的路径以在一个自定义域名上启动 TLS 支持。", "LabelCustomCss": "自定义CSS:", "LabelCustomCssHelp": "应用你的自定义样式到网页。", - "LabelCustomDeviceDisplayName": "显示名称:", "LabelCustomDeviceDisplayNameHelp": "自定义设备显示名称或留空则使用设备报告名称。", "LabelCustomRating": "自定义分级:", - "LabelDashboardTheme": "控制台主题:", "LabelDateAdded": "加入日期:", "LabelDateAddedBehavior": "新内容加入的日期:", "LabelDateAddedBehaviorHelp": "如果一个媒体资料的值存在,它总是优先于这些选项前使用。", @@ -530,7 +468,6 @@ "LabelDiscNumber": "光盘号:", "LabelDisplayLanguage": "显示的语言:", "LabelDisplayLanguageHelp": "Jellyfin的翻译工作是一个不断推进的工程项目。", - "LabelDisplayMissingEpisodesWithinSeasons": "显示每季里缺少的剧集", "LabelDisplayMode": "显示模式:", "LabelDisplayName": "显示名称:", "LabelDisplayOrder": "显示顺序:", @@ -546,11 +483,11 @@ "LabelEmbedAlbumArtDidl": "在DIDL中嵌入专辑封面", "LabelEmbedAlbumArtDidlHelp": "有些设备首选这种方式获取专辑封面。启用该选项可能导致其他设备播放失败。", "LabelEnableAutomaticPortMap": "开启自动端口映射", - "LabelEnableAutomaticPortMapHelp": "通过UPnP将路由器端口自动转发到服务器端口。这可能不适用于某些型号的路由器和网络配置。需要服务器重新启动后才会应用更改。", + "LabelEnableAutomaticPortMapHelp": "勾选以通过 UPnP 自动映射公共端口到本地端口。这个选项在某些不支持的路由器和网络配置上可能不起作用。服务端重启之前设置不会生效。", "LabelEnableBlastAliveMessages": "爆发活动信号", "LabelEnableBlastAliveMessagesHelp": "如果该服务器不能被网络中的其他UPnP设备检测到,请启用此选项。", - "LabelEnableDlnaClientDiscoveryInterval": "客户端搜寻时间间隔(秒)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "确定由 Jellyfin 执行的 SSDP 搜索之间的持续时间 (以秒为单位)。", + "LabelEnableDlnaClientDiscoveryInterval": "客户端搜寻时间间隔", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "确定SSDP 搜索之间的持续时间 (以秒为单位)。", "LabelEnableDlnaDebugLogging": "启用 DLNA 调试日志", "LabelEnableDlnaDebugLoggingHelp": "创建一个很大的日志文件,仅应在排除故障时使用。", "LabelEnableDlnaPlayTo": "启用 DLNA 播放", @@ -559,7 +496,7 @@ "LabelEnableDlnaServerHelp": "允许你网络上的 UPnP 设备浏览并播放内容。", "LabelEnableHardwareDecodingFor": "启用硬件解码:", "LabelEnableRealtimeMonitor": "启用实时监控", - "LabelEnableRealtimeMonitorHelp": "文件更改将立即在支持的文件系统上处理。", + "LabelEnableRealtimeMonitorHelp": "在支持的文件系统中,文件更改将即时处理。", "LabelEnableSingleImageInDidlLimit": "仅限单一的嵌入式图像", "LabelEnableSingleImageInDidlLimitHelp": "如果多个图像嵌入在DIDL,某些设备将无法正确渲染。", "LabelEndDate": "结束日期:", @@ -575,9 +512,9 @@ "LabelForgotPasswordUsernameHelp": "输入你的用户名,如果你还记得。", "LabelFormat": "格式:", "LabelFriendlyName": "好记的名称:", - "LabelServerNameHelp": "此名称将用做服务器名,如果留空,将使用计算机名。", - "LabelGroupMoviesIntoCollections": "批量添加电影到收藏", - "LabelGroupMoviesIntoCollectionsHelp": "显示电影列表时,属于一个收藏的电影将显示为一个分组。", + "LabelServerNameHelp": "此名称将用做服务器名,默认使用服务器的主机名。", + "LabelGroupMoviesIntoCollections": "批量添加电影到集合", + "LabelGroupMoviesIntoCollectionsHelp": "显示电影列表时,同一集合的电影将显示为一个分组。", "LabelH264Crf": "H264 CRF 编码质量等级:", "LabelEncoderPreset": "H264 和 H265 编码预设:", "LabelHardwareAccelerationType": "硬件加速:", @@ -585,7 +522,7 @@ "LabelHomeNetworkQuality": "家庭网络质量:", "LabelHomeScreenSectionValue": "主屏幕模块{0}:", "LabelHttpsPort": "本地 HTTPS 端口号:", - "LabelHttpsPortHelp": "Jellyfin HTTPS 服务器监听端口。", + "LabelHttpsPortHelp": "HTTPS 服务器监听的 TCP 端口号。", "LabelIconMaxHeight": "图标最大高度:", "LabelIconMaxHeightHelp": "通过UPnP显示的图标最大分辨率。", "LabelIconMaxWidth": "图标最大宽度:", @@ -612,7 +549,7 @@ "LabelLanguage": "语言:", "LabelLineup": "排队:", "LabelLocalHttpServerPortNumber": "本地 HTTP 端口号:", - "LabelLocalHttpServerPortNumberHelp": "Jellyfin HTTP 服务器监听的 TCP 端口。", + "LabelLocalHttpServerPortNumberHelp": "HTTP 服务器监听的 TCP 端口号。", "LabelLockItemToPreventChanges": "锁定此项目防止改动", "LabelLoginDisclaimer": "登录声明:", "LabelLoginDisclaimerHelp": "将在登录页面底部显示的信息。", @@ -654,21 +591,20 @@ "LabelMovieCategories": "电影分类:", "LabelMoviePrefix": "电影前缀:", "LabelMoviePrefixHelp": "如果将前缀应用于影片标题, 请在此处输入它, 以便服务器可以正确处理它。", - "LabelMovieRecordingPath": "电影录制路径 (可选的):", + "LabelMovieRecordingPath": "电影录制路径:", "LabelMusicStreamingTranscodingBitrate": "音乐转码的比特率:", - "LabelMusicStreamingTranscodingBitrateHelp": "请指定一个音乐媒体串流时的最大比特率。", + "LabelMusicStreamingTranscodingBitrateHelp": "请指定音乐媒体串流时的最大比特率。", "LabelName": "名字:", "LabelNewName": "新名字:", "LabelNewPassword": "新密码:", "LabelNewPasswordConfirm": "新密码确认:", "LabelNewsCategories": "新分类:", - "LabelNext": "下一个", "LabelNotificationEnabled": "启用此通知", "LabelNumber": "编号:", "LabelNumberOfGuideDays": "下载几天的节目指南:", "LabelNumberOfGuideDaysHelp": "下载更多天的节目指南可以帮你进一步查看节目列表并做出提前安排,但下载过程也将耗时更久。它将基于频道数量自动选择。", - "LabelOptionalNetworkPath": "(可选的)共享的网络文件夹:", - "LabelOptionalNetworkPathHelp": "如果这个文件夹在你的网络上是共享的,提供这个网络共享地址能够允许其他设备上的 Jellyfin 应用程序直接访问媒体文件,例如 {0} 或者 {1}。", + "LabelOptionalNetworkPath": "共享的网络文件夹:", + "LabelOptionalNetworkPathHelp": "如果这个文件夹在你的网络上是共享的,提供这个网络共享地址能够允许其他设备上的客户端直接访问媒体文件,例如 {0} 或者 {1}。", "LabelOriginalAspectRatio": "原始长宽比:", "LabelOriginalTitle": "原标题:", "LabelOverview": "内容概述:", @@ -687,9 +623,7 @@ "LabelPostProcessorArguments": "处理器后命令行参数:", "LabelPostProcessorArgumentsHelp": "使用 {path} 作为录制文件的路径。", "LabelPreferredDisplayLanguage": "首选显示语言:", - "LabelPreferredDisplayLanguageHelp": "Jellyfin的翻译工作是一个不断推进的工程项目。", "LabelPreferredSubtitleLanguage": "字幕语言偏好:", - "LabelPrevious": "上一个", "LabelProfileAudioCodecs": "音频编解码器:", "LabelProfileCodecs": "编解码器:", "LabelProfileCodecsHelp": "以逗号分隔。留空则适用于所有编解码器。", @@ -703,7 +637,6 @@ "LabelPublicHttpPortHelp": "映射到本地 HTTP 端口的公开端口号。", "LabelPublicHttpsPort": "公开 HTTPS 端口号:", "LabelPublicHttpsPortHelp": "映射到本地 HTTPS 端口的公开端口号。", - "LabelReadHowYouCanContribute": "了解如何做出贡献。", "LabelReasonForTranscoding": "转码原因:", "LabelRecord": "录制:", "LabelRecordingPath": "默认录制路径:", @@ -712,7 +645,7 @@ "LabelReleaseDate": "发行日期:", "LabelRemoteClientBitrateLimit": "互联网流媒体传输比特率限制(Mbps):", "LabelRemoteClientBitrateLimitHelp": "所有网络设备都有一个可选的每流比特率限制。这对于防止设备请求比 internet 连接所能处理的更高的比特率非常有用。这可能会导致服务器上的 CPU 负载增加, 以便将视频转码到较低的比特率。", - "LabelRuntimeMinutes": "播放时长(分钟):", + "LabelRuntimeMinutes": "播放时长:", "LabelSaveLocalMetadata": "将媒体图像保存到媒体所在文件夹", "LabelSaveLocalMetadataHelp": "直接将媒体图像保存到媒体所在文件夹以方便编辑。", "LabelScheduledTaskLastRan": "最后运行 {0}, 花费时间 {1}.", @@ -722,11 +655,10 @@ "LabelSelectVersionToInstall": "选择安装版本:", "LabelSendNotificationToUsers": "发送通知至:", "LabelSerialNumber": "序列号", - "LabelSeriesRecordingPath": "电视剧录制路径 (可选的):", + "LabelSeriesRecordingPath": "电视剧录制路径:", "LabelServerHost": "主机:", "LabelServerHostHelp": "192.168.1.100:8096 或 https://myserver.com", "LabelSimultaneousConnectionLimit": "并发流限制:", - "LabelSkin": "皮肤:", "LabelSkipBackLength": "跳过长度:", "LabelSkipForwardLength": "快进时限:", "LabelSkipIfAudioTrackPresent": "如果默认音轨的语言和下载语言一样则跳过", @@ -738,7 +670,6 @@ "LabelSortBy": "排序依据:", "LabelSortOrder": "排序顺序:", "LabelSortTitle": "短标题:", - "LabelSoundEffects": "音效:", "LabelSource": "来源:", "LabelSpecialSeasonsDisplayName": "SP 季显示的名称:", "LabelSportsCategories": "体育分类:", @@ -750,7 +681,6 @@ "LabelSubtitleDownloaders": "字幕下载器:", "LabelSubtitleFormatHelp": "例如:SRT", "LabelSubtitlePlaybackMode": "字幕模式:", - "LabelSubtitles": "字幕", "LabelSupportedMediaTypes": "支持的媒体类型:", "LabelTVHomeScreen": "TV 模式主屏幕:", "LabelTag": "标签:", @@ -763,12 +693,9 @@ "LabelTimeLimitHours": "时间限制(小时):", "LabelTitle": "标题:", "LabelTrackNumber": "音轨号码:", - "LabelTranscodingAudioCodec": "音频编解码器:", - "LabelTranscodingContainer": "容器:", "LabelTranscodingTempPathHelp": "设置转码文件存储目录。留空以使用服务器默认文件夹。", "LabelTranscodingThreadCount": "转码线程数:", "LabelTranscodingThreadCountHelp": "选择转码时使用的最大线程数。\n减少线程数量将会降低CPU使用率,可能无法快速进行转换并流畅的播放。", - "LabelTranscodingVideoCodec": "视频编解码器:", "LabelTriggerType": "触发类型:", "LabelTunerIpAddress": "调谐器 IP 地址:", "LabelTunerType": "调谐器类型:", @@ -793,11 +720,10 @@ "LabelXDlnaDoc": "X-DLNA DOC:", "LabelXDlnaDocHelp": "决定在 urn:schemas-dlna-org:device-1-0 namespace 中的 X-Dlna doc 元素的内容。", "LabelYear": "年份:", - "LabelYourFirstName": "你的名字:", "LabelYoureDone": "完成!", "LabelZipCode": "邮编:", "LabelffmpegPath": "FFmpeg 路径:", - "LabelffmpegPathHelp": "FFmpeg 应用程序的文件,或者包含了 FFmpeg 的文件夹的路径。", + "LabelffmpegPathHelp": "FFmpeg 应用文件或包含 FFmpeg 的文件夹的路径。", "LanNetworksHelp": "在强制带宽限制时,认作本地网络上的 IP 地址或 IP/网络掩码条目的逗号分隔列表。如果设置此项,所有其它 IP 地址将被视为在外部网络上,并且将受到外部带宽限制。如果保留为空,则只将服务器的子网视为本地网络。", "Large": "大", "LatestFromLibrary": "最新的{0}", @@ -844,20 +770,19 @@ "MessageConfirmProfileDeletion": "你确定希望删除此配置文件?", "MessageConfirmRecordingCancellation": "取消录制?", "MessageConfirmRemoveMediaLocation": "你确定要移除此位置?", - "MessageConfirmRestart": "你确定要重启 Jellyfin 服务端?", - "MessageConfirmRevokeApiKey": "你确定你希望撤销这个 API 秘钥吗?这个应用程序与 Jellyfin 服务器的连接将会被立刻中断。", + "MessageConfirmRestart": "你确定要重启 Jellyfin?", + "MessageConfirmRevokeApiKey": "你确定你希望撤销这个 API 秘钥吗?这个应用程序与本服务器的连接将会被立刻中断。", "MessageConfirmShutdown": "你确定要关闭服务端?", "MessageContactAdminToResetPassword": "请联系你的管理员以重置你的密码。", "MessageCreateAccountAt": "在 {0} 创建帐户", "MessageDeleteTaskTrigger": "你确定删除这个任务触发条件?", - "MessageDirectoryPickerBSDInstruction": "对于 BSD 系统,你需要设置包含你的 FreeNAS Jail 虚拟机的存储以允许 Jellyfin 访问它。", + "MessageDirectoryPickerBSDInstruction": "对于 BSD 系统,您需要配置包含您 FreeNAS Jail 虚拟机的存储以允许 Jellyfin 访问您的媒体文件。", "MessageDirectoryPickerLinuxInstruction": "对于Arch Linux、 CentOS、Debian、Fedora、OpenSuse、Ubuntu上的Linux系统,你必须授权系统服务用户访问你存储位置。", "MessageDownloadQueued": "下载已列队。", "MessageEnablingOptionLongerScans": "启用此选项可能会大大延长媒体库扫描时间。", "MessageFileReadError": "读取文件发生错误。", "MessageForgotPasswordFileCreated": "已在服务器上创建了以下文件, 并包含有关后续步骤说明:", "MessageForgotPasswordInNetworkRequired": "请连接你的家庭网络后再试一次以开始密码重置流程。", - "MessageInstallPluginFromApp": "这个插件必须从你打算使用的应用程序中安装。", "MessageInvalidForgotPasswordPin": "无效的或过期的 pin 码。请再试一次。", "MessageInvalidUser": "用户名或密码不可用。请重试。", "MessageItemSaved": "项目已保存。", @@ -872,9 +797,8 @@ "MessagePleaseEnsureInternetMetadata": "请确认已启用从网络上下载媒体资料的选项。", "MessagePleaseWait": "请稍等。这将花费大约1分钟的时间。", "MessagePluginConfigurationRequiresLocalAccess": "请直接登录你的本地服务器以设置这个插件。", - "MessagePluginInstallDisclaimer": "安装 Jellyfin 社区成员构建的插件来获取额外的功能是增强你的 Jellyfin 体验的一种很好的方式。但在安装之前请意识到他们可能会对你的 Jellyfin 服务器造成的影响,如更长的媒体库扫描时间、额外的背景数据加工、降低系统稳定性等。", + "MessagePluginInstallDisclaimer": "安装社区成员构建的插件来获取额外的功能是增强您体验的一种很好的方式。但在安装之前请意识到他们可能会对你的服务器造成影响,如更长的媒体库扫描时间、额外的后台处理、以及系统稳定性的降低等。", "MessageReenableUser": "请参阅以下以重新启用", - "MessageSettingsSaved": "设置已保存。", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "以下媒体路径将从你的媒体库移除:", "MessageUnableToConnectToServer": "现在无法连接所选择的服务器,请确保该服务器目前正在运行。", "MessageUnsetContentHelp": "内容将显示为纯文件夹。为取得最佳效果, 请使用元数据管理器设置子文件夹的内容类型。", @@ -897,7 +821,7 @@ "MySubtitles": "我的字幕", "Name": "名称", "Never": "从不", - "NewCollection": "新收藏", + "NewCollection": "新集合", "NewCollectionHelp": "“收藏”允许你为电影和其他媒体库内容创建个性化分组。", "NewCollectionNameExample": "例如:星球大战收藏", "NewEpisodes": "新剧集", @@ -907,10 +831,9 @@ "NextUp": "下一步", "No": "否", "NoNewDevicesFound": "找不到新设备。要添加新调谐器, 请关闭此对话框并手动输入设备信息。", - "NoNextUpItemsMessage": "没有发现。开始看你的节目!", - "NoPluginConfigurationMessage": "此插件没有配置选项。", + "MessageNoNextUpItems": "没有发现。开始看你的节目!", + "MessageNoPluginConfiguration": "此插件没有配置选项。", "NoSubtitleSearchResultsFound": "未找到结果。", - "NoSubtitles": "无字幕", "NoSubtitlesHelp": "字幕将默认不被加载,但你仍然可以在播放时手动打开字幕。", "None": "无", "Normal": "普通", @@ -930,7 +853,7 @@ "OptionAllowLinkSharingHelp": "只有网页包含的媒体信息会被共享。媒体文件不会被公开共享。共享是有时间限制的并且会在 {0} 天后到期。", "OptionAllowManageLiveTv": "允许电视直播录制管理", "OptionAllowMediaPlayback": "允许播放媒体", - "OptionAllowMediaPlaybackTranscodingHelp": "由于不支持的媒体格式, 限制对代码转换的访问可能会导致 Jellyfin 应用程序中的播放失败。", + "OptionAllowMediaPlaybackTranscodingHelp": "限制对转码的访问可能会由于不支持的媒体格式导致客户端中播放失败。", "OptionAllowRemoteControlOthers": "允许其他用户全程控制", "OptionAllowRemoteSharedDevices": "允许远程控制共享的设备", "OptionAllowRemoteSharedDevicesHelp": "DLNA 设备在用户对他们进行控制前都被视为是共享的。", @@ -941,9 +864,8 @@ "OptionArtist": "艺术家", "OptionAscending": "升序", "OptionAuto": "自动", - "OptionAutomatic": "自动", "OptionAutomaticallyGroupSeries": "自动合并分布在不同文件夹的电视剧", - "OptionAutomaticallyGroupSeriesHelp": "如果启用,分布在这个媒体库的多个文件夹中的同一部电视剧将会自动整合成一部电视剧。", + "OptionAutomaticallyGroupSeriesHelp": "在这个媒体库的多个文件夹中的同一部电视剧将会自动整合成一部电视剧。", "OptionBlockBooks": "书籍", "OptionBlockChannelContent": "互联网频道内容", "OptionBlockLiveTvChannels": "电视直播频道", @@ -964,7 +886,7 @@ "OptionDatePlayed": "播放日期", "OptionDescending": "降序", "OptionDisableUser": "禁用此用户", - "OptionDisableUserHelp": "如果禁用该用户,服务器将不允许该用户连接。现有的连接将被终止。", + "OptionDisableUserHelp": "服务器将不允许来自该用户的任何连接。现有的连接将立即被终止。", "OptionDislikes": "不喜欢", "OptionDisplayFolderView": "显示一个“文件夹”类别用于按文件夹分类浏览你的媒体文件夹", "OptionDisplayFolderViewHelp": "在你的媒体库列表中显示文件夹。如果你有按文件夹分类进行浏览的需求,这会非常有用。", @@ -974,7 +896,7 @@ "OptionDownloadBoxImage": "包装", "OptionDownloadDiscImage": "光盘", "OptionDownloadImagesInAdvance": "提前下载图片", - "OptionDownloadImagesInAdvanceHelp": "默认下,大部分图片只有在 Jellyfin 应用程序请求时下载。开启此选项将随着媒体导入时下载所有图片。这可能需要更久媒体库扫描时间。", + "OptionDownloadImagesInAdvanceHelp": "默认大多数图片只在客户端请求时下载。开启此选项将在新媒体导入时预先下载所有图片。这可能大大延长媒体库扫描时间。", "OptionDownloadMenuImage": "菜单", "OptionDownloadPrimaryImage": "封面图", "OptionDownloadThumbImage": "缩略图", @@ -995,7 +917,6 @@ "OptionExternallyDownloaded": "外部下载", "OptionExtractChapterImage": "开启剧集图片提取", "OptionFavorite": "我的最爱", - "OptionFriday": "星期五", "OptionHasSpecialFeatures": "特殊功能", "OptionHasSubtitles": "字幕", "OptionHasThemeSong": "主题曲", @@ -1006,24 +927,22 @@ "OptionHlsSegmentedSubtitles": "HLS分段字幕", "OptionHomeVideos": "照片", "OptionIgnoreTranscodeByteRangeRequests": "忽略转码字节范围请求", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "如果启用,这些请求会被兑现,但会忽略的字节范围标头。", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "这些请求会被兑现,但会忽略的字节范围标头。", "OptionImdbRating": "IMDb 评分", "OptionIsHD": "HD高清", "OptionIsSD": "SD标清", "OptionLikes": "喜欢", "OptionMax": "最大", "OptionMissingEpisode": "缺少的剧集", - "OptionMonday": "星期一", "OptionNameSort": "名字", "OptionNew": "新建…", "OptionNone": "没有", - "OptionOnAppStartup": "在程序启动时", "OptionOnInterval": "在一个期间", "OptionParentalRating": "家长分级", "OptionPlainStorageFolders": "显示所有文件夹作为一般存储文件夹", - "OptionPlainStorageFoldersHelp": "如果启用,所有文件夹在DIDL中显示为“ object.container.storageFolder ”,而不是一个更具体的类型,如“ object.container.person.musicArtist ” 。", + "OptionPlainStorageFoldersHelp": "所有文件夹在DIDL中显示为 \"object.container.storageFolder\" ,而不是一个更具体的类型,如 \"object.container.person.musicArtist\" 。", "OptionPlainVideoItems": "显示所有视频为一般视频项目", - "OptionPlainVideoItemsHelp": "如果启用,所有视频在DIDL中显示为“object.item.videoItem”,而不是一个更具体的类型,如“object.item.videoItem.movie ” 。", + "OptionPlainVideoItemsHelp": "所有视频在DIDL中显示为 \"object.item.videoItem\" ,而不是一个更具体的类型,如 \"object.item.videoItem.movie\" 。", "OptionPlayCount": "播放次数", "OptionPlayed": "已播放", "OptionPremiereDate": "首映日期", @@ -1042,20 +961,15 @@ "OptionResElement": "res 元素", "OptionResumable": "可恢复播放", "OptionRuntime": "播放时长", - "OptionSaturday": "星期六", "OptionSaveMetadataAsHidden": "保存媒体资料和图像为隐藏文件", - "OptionSaveMetadataAsHiddenHelp": "更改此项将应用于以后保存的元数据。现有元数据文件将在下一次 Jellyfin 服务器保存它们时被更新。", + "OptionSaveMetadataAsHiddenHelp": "更改此项将应用于以后保存的元数据。现有元数据文件将在下一次服务器保存它们时被更新。", "OptionSpecialEpisode": "特集", "OptionSubstring": "子串", - "OptionSunday": "星期天", - "OptionThursday": "星期四", "OptionTrackName": "曲目名称", - "OptionTuesday": "星期二", "OptionTvdbRating": "TVDB 评分", "OptionUnairedEpisode": "尚未发布的剧集", "OptionUnplayed": "未播放", "OptionWakeFromSleep": "从睡眠中唤醒", - "OptionWednesday": "星期三", "OptionWeekdays": "工作日", "OptionWeekends": "周末", "OptionWeekly": "每周", @@ -1068,7 +982,7 @@ "PasswordMatchError": "密码和确认密码必须匹配。", "PasswordResetComplete": "密码已重置。", "PasswordResetConfirmation": "你确定要重置密码?", - "PasswordResetHeader": "密码重置", + "HeaderResetPassword": "密码重置", "PasswordSaved": "密码已保存。", "People": "人物", "PerfectMatch": "最佳匹配", @@ -1085,9 +999,9 @@ "PleaseAddAtLeastOneFolder": "请点击添加按钮,添加至少一个文件夹到这个媒体库。", "PleaseConfirmPluginInstallation": "请点击“OK”以确认你已经阅读了上述内容并希望继续插件安装进程。", "PleaseEnterNameOrId": "请输入一个名称或一个外部ID。", - "PleaseRestartServerName": "请重启 Jellyfin 服务器 - {0}。", + "PleaseRestartServerName": "请重启 Jellyfin - {0}。", "PleaseSelectTwoItems": "请至少选择2个项目。", - "PluginInstalledMessage": "这个插件已经被成功安装。Jellyfin 服务器需要重启以使该插件生效。", + "MessagePluginInstalled": "此插件已成功安装。服务器需要重启以使该插件生效。", "PreferEmbeddedTitlesOverFileNames": "优先使用内置的标题而不是文件名", "PreferEmbeddedTitlesOverFileNamesHelp": "这将在没有 internet 元数据或本地元数据可用时确定默认显示标题。", "Premiere": "首映", @@ -1097,7 +1011,6 @@ "ProductionLocations": "产地", "Programs": "节目", "Quality": "质量", - "QueueAllFromHere": "这里的全部内容都加入队列", "Rate": "评级", "RecentlyWatched": "最近观看", "RecommendationBecauseYouLike": "因为你喜欢 {0}", @@ -1107,14 +1020,14 @@ "Record": "录制", "RecordSeries": "录制电视剧", "RecordingCancelled": "录制已取消。", - "RecordingPathChangeMessage": "更改录制文件夹不会将现有录制从旧位置迁移到新的。您需要手动移动它们 (如果需要)。", + "MessageChangeRecordingPath": "更改录制文件夹不会将现有录制从旧位置迁移到新的。您需要手动移动它们 (如果需要)。", "RecordingScheduled": "录制预设。", "Refresh": "刷新", "RefreshMetadata": "刷新元数据", "RefreshQueued": "列队已刷新。", "ReleaseDate": "发行日期", "RememberMe": "记住我", - "RemoveFromCollection": "从收藏中移除", + "RemoveFromCollection": "从集合中移除", "RemoveFromPlaylist": "从播放列表中移除", "Repeat": "重播", "RepeatAll": "全部循环", @@ -1124,7 +1037,6 @@ "ReplaceExistingImages": "替换现有图片", "ResumeAt": "恢复播放于{0}", "Rewind": "倒回", - "RunAtStartup": "开机时启动", "Runtime": "播放时长", "Saturday": "星期六", "Save": "保存", @@ -1144,10 +1056,10 @@ "SeriesRecordingScheduled": "电视剧录制计划。", "SeriesSettings": "系列设定", "SeriesYearToPresent": "{0} - 现在", - "ServerNameIsRestarting": "Jellyfin Server - {0} 重启中。", - "ServerNameIsShuttingDown": "Jellyfin 服务器 - {0} 正在关闭。", - "ServerRestartNeededAfterPluginInstall": "安装插件后,Jellyfin 服务器需要重启以使插件生效。", - "ServerUpdateNeeded": "Jellyfin 服务器需要更新,请访问 {0} 以下载最新的版本", + "ServerNameIsRestarting": "服务器- {0} 重启中。", + "ServerNameIsShuttingDown": "服务器 - {0} 正在关闭。", + "ServerRestartNeededAfterPluginInstall": "安装插件后,Jellyfin需要重启。", + "ServerUpdateNeeded": "服务器需要更新,请访问 {0} 以下载最新的版本", "Settings": "设置", "SettingsSaved": "设置已保存。", "SettingsWarning": "更改这些值可能会导致不稳定或连接故障。如果您遇到任何问题, 我们建议将它们重新更改为默认值。", @@ -1179,58 +1091,29 @@ "TV": "电视", "TabAccess": "访问", "TabAdvanced": "高级", - "TabAlbumArtists": "专辑艺术家", - "TabAlbums": "专辑", - "TabArtists": "艺术家", "TabCatalog": "目录", - "TabChannels": "频道", "TabCodecs": "编解码器", - "TabCollections": "收藏", "TabContainers": "媒体载体", "TabDashboard": "控制台", - "TabDevices": "设备", "TabDirectPlay": "直接播放", - "TabDisplay": "显示", - "TabEpisodes": "剧集", - "TabFavorites": "我的最爱", - "TabGenres": "风格", - "TabGuide": "指南", - "TabInfo": "信息", "TabLatest": "最新", - "TabLiveTV": "电视直播", "TabLogs": "日志", - "TabMetadata": "元数据", - "TabMovies": "电影", "TabMusic": "音乐", - "TabMusicVideos": "音乐视频", "TabMyPlugins": "我的插件", "TabNetworks": "网络", "TabNfoSettings": "NFO 设定", "TabNotifications": "通知", "TabOther": "其他", "TabParentalControl": "家长控制", - "TabPassword": "密码", - "TabPlayback": "播放", - "TabPlaylist": "播放列表", - "TabPlaylists": "播放列表", "TabPlugins": "插件", "TabProfile": "个人配置", "TabProfiles": "配置", - "TabRecordings": "录制", "TabResponses": "响应", - "TabResumeSettings": "恢复", "TabScheduledTasks": "计划任务", - "TabSeries": "电视剧", "TabServer": "服务器", "TabSettings": "设置", - "TabShows": "节目", - "TabSongs": "歌曲", "TabStreaming": "流媒体传输", - "TabSuggestions": "建议", - "TabTrailers": "预告片", - "TabTranscoding": "转码", "TabUpcoming": "即将发布", - "TabUsers": "用户", "Tags": "标签", "TellUsAboutYourself": "请介绍一下你自己", "ThemeSongs": "主题曲", @@ -1248,7 +1131,7 @@ "Tuesday": "星期二", "TvLibraryHelp": "回顾{0}电视节目命名指南{1}。", "UninstallPluginConfirmation": "你确定要卸载 {0}?", - "UninstallPluginHeader": "卸载插件", + "HeaderUninstallPlugin": "卸载插件", "Unmute": "取消静音", "Unplayed": "未播放", "Unrated": "未分级", @@ -1304,7 +1187,7 @@ "ColorSpace": "色彩空间", "Directors": "导演", "ColorTransfer": "色彩转换", - "ConfirmDeleteItem": "这将同时在磁盘和媒体库中删除这个项目。确认删除?", + "ConfirmDeleteItem": "从媒体库中删除此项时,也会同时从文件系统中删除。确定要删除吗?", "ConfirmDeleteItems": "从媒体库中删除这些项目时,也会同时从文件系统中删除。确定要删除吗?", "ConfirmEndPlayerSession": "确认要关闭位于{0}的Jellyfin吗?", "ValueSeconds": "{0}秒", @@ -1319,19 +1202,18 @@ "HeaderFavoriteVideos": "最爱的视频", "HeaderVideoType": "视频类型", "Items": "项目", - "LabelAudio": "音频", "LabelServerName": "服务器名称:", "LabelTranscodePath": "转码路径:", "LabelTranscodes": "转码:", "AuthProviderHelp": "选择用于验证此用户密码的身份验证提供者。", - "ColorPrimaries": "基色", - "ConfigureDateAdded": "在Jellyfin Server仪表板媒体库的设置里确认如何添加日期", + "ColorPrimaries": "原色", + "ConfigureDateAdded": "配置如何确定Jellyfin Server仪表板中媒体库设置下的添加日期", "DisplayModeHelp": "选择您想要的界面布局风格。", "EnableColorCodedBackgrounds": "彩色背景", - "ErrorDeletingItem": "从 Jellyfin Server 删除项目时出错。请确认 Jellyfin Server 是否拥有对媒体目录的写权限,然后重试。", + "ErrorDeletingItem": "从服务器删除项目时出错。请检查Jellyfin是否拥有对媒体目录的写权限,然后重试。", "GroupBySeries": "按系列分组", "HeaderApp": "应用程序", - "DirectStreamHelp1": "该媒体文件的分辨率和编码(H.264、AC3 等)与您的设备兼容,但容器格式(.mkv、.avi、.wmv 等)不受支持。因此,视频在串流至您的设备之前将会被即时封装为另一种格式。", + "DirectStreamHelp1": "该媒体文件的分辨率和编码(H.264、AC3 等)与您的设备兼容,但文件格式(.mkv、.avi、.wmv 等)不受支持。因此,视频在串流至您的设备之前将会被即时封装为另一种格式。", "HeaderAppearsOn": "同时出现于", "HeaderCancelSeries": "取消系列", "HeaderFavoriteEpisodes": "最爱的剧集", @@ -1340,7 +1222,7 @@ "HeaderKeepSeries": "保持系列", "HeaderMusicQuality": "音频质量", "HeaderNextEpisodePlayingInValue": "下一集在 {0} 后播放", - "HeaderNextVideoPlayingInValue": "下一部影片在 {0} 后播放", + "HeaderNextVideoPlayingInValue": "下一个视频将在{0}播放", "HeaderPlayOn": "播放在", "HeaderSeriesStatus": "系列状态", "HeaderStopRecording": "停止录制", @@ -1348,21 +1230,19 @@ "LabelAuthProvider": "认证提供者:", "LabelKeepUpTo": "保持:", "LabelPasswordResetProvider": "密码重置提供者:", - "LabelPersonRoleHelp": "示例:冰淇淋卡车司机", + "LabelPersonRoleHelp": "例如:冰淇淋车司机", "LabelSelectFolderGroups": "自动将来自下列文件夹的内容分组至电影、音乐、电视等视图中:", - "LabelSelectFolderGroupsHelp": "未选中的文件夹将显示在自身的视图中。", + "LabelSelectFolderGroupsHelp": "未勾选的文件夹将在它们自己的视图中显示。", "LabelUserLoginAttemptsBeforeLockout": "用户被封禁前可尝试的次数:", "DashboardVersionNumber": "版本:{0}", "DashboardServerName": "服务器:{0}", "LabelVideo": "视频", "LabelWeb": "网页:", "LeaveBlankToNotSetAPassword": "您可以将此字段留空以设置空密码。", - "LinksValue": "链接:{0}", "LiveBroadcasts": "直播", "LiveTV": "电视直播", "Logo": "商标", "ManageRecording": "管理录音", - "MediaInfoSoftware": "软件", "MediaInfoStreamTypeAudio": "音频", "MediaInfoStreamTypeData": "数据", "MediaInfoStreamTypeEmbeddedImage": "内嵌图片", @@ -1378,14 +1258,14 @@ "OptionDownloadLogoImage": "标志", "OptionLoginAttemptsBeforeLockout": "确定在锁定之前可以进行多少次不正确的登录尝试。", "OptionLoginAttemptsBeforeLockoutHelp": "如果值为0,则表示将允许普通用户尝试三次、管理员尝试五次的默认值。将此设置为-1将禁用此功能。", - "PasswordResetProviderHelp": "选择一个密码重置提供者用于密码重置", + "PasswordResetProviderHelp": "选择一个密码重置提供者用于此用户申请重置密码。", "PlaceFavoriteChannelsAtBeginning": "将最喜爱的频道置顶", "PlayNext": "播放下一个", "PlayNextEpisodeAutomatically": "自动播放下一集", "Premieres": "首映", "Raised": "提高", "Recordings": "录音", - "RefreshDialogHelp": "元数据根据设置和Jellyfin服务器中启用的网络服务进行刷新。", + "RefreshDialogHelp": "元数据根据设置和仪表盘中启用的网络服务进行刷新。", "RepeatEpisodes": "重复剧集", "Schedule": "日程", "Screenshot": "屏幕截图", @@ -1397,15 +1277,11 @@ "Smaller": "更小", "TagsValue": "标签:{0}", "Vertical": "垂直", - "VideoRange": "视频范围", "Depressed": "凹陷", "Uniform": "轮廓", - "HeaderHome": "主页", "DashboardOperatingSystem": "操作系统:{0}", "DashboardArchitecture": "架构:{0}", "GroupVersions": "按版本分组", - "LaunchWebAppOnStartup": "当启动服务器时,打开Web界面", - "LaunchWebAppOnStartupHelp": "服务器启动时在默认浏览器中打开网页端。使用重启服务器功能时此项不生效。", "MusicAlbum": "音乐专辑", "MusicArtist": "音乐艺术家", "MusicVideo": "音乐视频", @@ -1441,14 +1317,13 @@ "ButtonAddImage": "添加图片", "LabelPlayer": "播放器:", "LabelBaseUrl": "基础 URL:", - "LabelBaseUrlHelp": "为服务器 URL添加自定义子目录,例如:http://example.com/<baseurl>。", + "LabelBaseUrlHelp": "为服务器 URL添加自定义子目录,例如:http://example.com/<baseurl>", "MusicLibraryHelp": "重播 {0}音乐命名指南{1}。", "HeaderFavoritePeople": "最喜欢的人物", "OptionRandom": "随机", "ButtonSplit": "拆分", "SelectAdminUsername": "请为管理员账户选择一个用户名。", "HeaderNavigation": "导航", - "CopyStreamURLError": "复制URL地址时发生错误。", "MessageConfirmAppExit": "你要退出吗?", "OptionForceRemoteSourceTranscoding": "强制远程转码(像电视直播一样)", "NoCreatedLibraries": "看上去您还未创建任何资料库。{0} 您想现在创建一个吗? {1}", @@ -1461,9 +1336,7 @@ "ClientSettings": "客户端设置", "Track": "音轨", "Season": "季", - "ReleaseGroup": "发行组", "Person": "人物", - "OtherArtist": "其他艺术家", "Movie": "电影", "Episode": "剧集", "BoxSet": "套装", @@ -1480,7 +1353,7 @@ "EveryXHours": "每 {0} 小时", "EveryHour": "每小时", "EveryXMinutes": "每 {0} 分钟", - "WriteAccessRequired": "Jellyfin 服务端需要此文件夹的写入权限。请确认是否拥有写入权限并重试。", + "WriteAccessRequired": "Jellyfin需要此文件夹的写入权限。请确认是否拥有写入权限并重试。", "PathNotFound": "无法找到此路径。请确认路径有效并重试。", "YadifBob": "YADIF Bob", "Yadif": "YADIF", @@ -1489,26 +1362,22 @@ "LabelLibraryPageSize": "媒体库分页阈值:", "LabelLibraryPageSizeHelp": "设置媒体库页面每页要显示的最多媒体个数。设置为 0 以禁用分页。", "UnsupportedPlayback": "Jellyfin无法解密被DRM保护的内容,但仍然会尝试播放包括受保护内容在内的所有内容。某些文件由于被加密或包含不受支持的特性(如互动标题),在播放时可能显示为黑屏。", - "MessageUnauthorizedUser": "您目前无权访问服务器。更多有关信息,请与服务器管理员联系。", "Filter": "过滤", "New": "新的", "HeaderFavoritePlaylists": "收藏的播放列表", "ButtonTogglePlaylist": "播放列表", - "ButtonToggleContextMenu": "更多", "HeaderServerAddressSettings": "服务器地址设置", "HeaderRemoteAccessSettings": "远程访问设置", "HeaderHttpsSettings": "HTTPS 设置", "ApiKeysCaption": "当前启用的 API 密钥", - "TabDVR": "DVR", "SaveChanges": "保存更改", "LabelRequireHttpsHelp": "开启后服务器将自动将所有 HTTP 请求重定向到 HTTPS。如果服务器没有启用 HTTPS 则不生效。", "LabelRequireHttps": "强制 HTTPS", "LabelStable": "稳定版", - "LabelEnableHttpsHelp": "开启服务器对所配置 HTTPS 端口的监听。必须配置有效的证书才会生效。", + "LabelEnableHttpsHelp": "监听已配置的 HTTPS 端口。必须配置有效的证书才会生效。", "LabelEnableHttps": "启用 HTTPS", "LabelChromecastVersion": "Chromecast版本", "HeaderDVR": "DVR", - "LabelNightly": "开发版", "MessageSyncPlayErrorAccessingGroups": "访问群组列表时发生错误。", "MessageSyncPlayLibraryAccessDenied": "对此内容的访问受到限制。", "MessageSyncPlayCreateGroupDenied": "需要权限以创建群组。", @@ -1533,8 +1402,8 @@ "EnableDetailsBanner": "详细信息页面的横幅", "ButtonCast": "投射", "ButtonSyncPlay": "SyncPlay", - "EnableBlurhashHelp": "仍在加载的图片将显示带有模糊的占位符", - "EnableBlurhash": "为图片启用模糊的占位符", + "EnableBlurHashHelp": "仍在加载的图片将以独特的的占位符显示。", + "EnableBlurHash": "为图片启用模糊的占位符", "SyncPlayAccessHelp": "为此用户选择对同步播放功能的访问级别。同步播放让你可以和其他设备同步播放进度。", "ShowMore": "显示更多", "ShowLess": "显示更少", @@ -1564,5 +1433,14 @@ "ClearQueue": "清空队列", "StopPlayback": "停止播放", "Writers": "作者", - "ViewAlbumArtist": "查看专辑艺术家" + "ViewAlbumArtist": "查看专辑艺术家", + "Preview": "预览", + "SubtitleVerticalPositionHelp": "文字出现的行号。正数表示由上到下,负数表示由下到上。", + "LabelSubtitleVerticalPosition": "垂直位置:", + "PreviousTrack": "上一曲", + "MessageGetInstalledPluginsError": "获取已安装插件列表时出现错误。", + "MessagePluginInstallError": "安装插件时出现错误。", + "NextTrack": "下一曲", + "LabelUnstable": "不稳定", + "PlaybackRate": "播放速率" } diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index b52dcbc1ef..21ac5f304c 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -1,32 +1,20 @@ { "Add": "添加", - "ButtonAdd": "增加", "ButtonAddScheduledTaskTrigger": "新增觸發點", "ButtonAddUser": "添加用戶", "ButtonCancel": "取消", - "ButtonDelete": "删除", - "ButtonDeleteImage": "刪除圖像", - "ButtonEdit": "編輯", - "ButtonFilter": "過濾", - "ButtonHelp": "幫助", "ButtonManualLogin": "手動登入", - "ButtonNew": "新增", "ButtonOk": "確定", - "ButtonPlay": "播放", "ButtonQuickStartGuide": "快速入門指南", - "ButtonRefresh": "重新整理", "ButtonRefreshGuideData": "重新整理指南資料", "ButtonRemove": "清除", "ButtonRename": "重新命名", "ButtonResetPassword": "重設密碼", "ButtonRestart": "重新啟動", - "ButtonSave": "儲存", "ButtonSelectDirectory": "選擇目錄", "ButtonSignIn": "登入", "ButtonSignOut": "登出", - "ButtonSort": "排序", "ButtonSubmit": "提交", - "ButtonSubtitles": "字幕", "ChannelAccessHelp": "選擇此用戶共享頻道。管理員將能夠使用資料管理器而編輯所有文件夾。", "Continuing": "繼續", "CustomDlnaProfilesHelp": "為新的設備建立自定配置或覆蓋原有系統配置。", @@ -43,22 +31,15 @@ "Friday": "星期五", "HeaderActiveDevices": "生效裝置", "HeaderActiveRecordings": "正在錄影的節目", - "HeaderAddScheduledTaskTrigger": "新增觸發", "HeaderAddToCollection": "添加到收藏庫", - "HeaderAddUser": "添加用戶", "HeaderAdditionalParts": "附加部份", - "HeaderAutomaticUpdates": "自動更新", - "HeaderBooks": "書籍", "HeaderBranding": "界面", - "HeaderCastCrew": "演員陣容", - "HeaderChannels": "頻道", "HeaderCustomDlnaProfiles": "自定配置", "HeaderDeviceAccess": "允許裝置通行", "HeaderDevices": "裝置", "HeaderEasyPinCode": "簡易 Pin 碼", "HeaderFeatureAccess": "可以使用的功能", "HeaderFetchImages": "獲取圖像:", - "HeaderFilters": "篩選條件", "HeaderFrequentlyPlayed": "經常播放", "HeaderImageSettings": "圖像設置", "HeaderLatestEpisodes": "最新劇集", @@ -66,9 +47,7 @@ "HeaderLatestRecordings": "最近錄影的節目", "HeaderMediaFolders": "媒體文件夾", "HeaderMusicVideos": "MV", - "HeaderNextUp": "接下來", "HeaderPaths": "路徑", - "HeaderPeople": "人物", "HeaderPleaseSignIn": "請登入", "HeaderRecentlyPlayed": "最近播放", "HeaderRemoteControl": "遙控器", @@ -76,7 +55,6 @@ "HeaderRunningTasks": "運行任務", "HeaderScenes": "場景", "HeaderSeasons": "季度劇集", - "HeaderSeries": "電視劇:", "HeaderSetupLibrary": "建立你的媒體資料庫", "HeaderSpecialFeatures": "特色", "HeaderStatus": "狀態", @@ -86,8 +64,6 @@ "Help": "幫助", "LabelAirsAfterSeason": "已播放劇集季度:", "LabelAirsBeforeSeason": "尚未播放劇集季度:", - "LabelAllowServerAutoRestart": "允許自動重新啟動來更新", - "LabelAllowServerAutoRestartHelp": "只在沒有活躍用戶和空檔時間重新啟動。", "LabelArtists": "藝人:", "LabelArtistsHelp": "分開多重使用 ;", "LabelAudioLanguagePreference": "首選音訊語言:", @@ -101,7 +77,6 @@ "LabelCustomCss": "自訂 CSS:", "LabelCustomCssHelp": "應用自訂 CSS Web 界面。", "LabelDay": "日子:", - "LabelDisplayMissingEpisodesWithinSeasons": "顯示每季缺少劇集資料", "LabelDisplaySpecialsWithinSeasons": "顯示劇集季度中的特集", "LabelEnableAutomaticPortMap": "啟用自動連接埠映射", "LabelEnableAutomaticPortMapHelp": "自動嘗試映射公共連接埠到 UPnP 本地連接埠。這可能無法用於某些路由器。", @@ -148,19 +123,15 @@ "LabelName": "名稱:", "LabelNewPassword": "新密碼:", "LabelNewPasswordConfirm": "新密碼確認:", - "LabelNext": "下一個", "LabelNumberOfGuideDays": "下載電視指南日數", "LabelNumberOfGuideDaysHelp": "下載更多電視指南資料會提供更好時間表查看能力,但將需要更長的下載時間。自動基於頻道數目來選擇。", "LabelPassword": "密碼:", "LabelPath": "路徑:", "LabelPreferredDisplayLanguage": "首選語言:", - "LabelPreferredDisplayLanguageHelp": "翻譯 Jellyfin 是一個進行中的項目。", - "LabelPrevious": "前一個", "LabelPublicHttpPort": "公共 http 連接埠號碼:", "LabelPublicHttpPortHelp": "公共連接埠號碼應映射到本地 http 連接埠。", "LabelPublicHttpsPort": "公共 https 連接埠號碼:", "LabelPublicHttpsPortHelp": "公共連接埠號碼應映射到本地 https 連接埠。", - "LabelReadHowYouCanContribute": "了解如何作出貢獻。", "LabelSaveLocalMetadata": "儲存媒體圖片和資料屬性到媒體所屬的文件夾", "LabelSaveLocalMetadataHelp": "直接儲存媒體圖片和資料到媒體文件夾,讓編輯工作更容易。", "LabelSelectUsers": "選擇用戶:", @@ -173,7 +144,6 @@ "LabelTriggerType": "觸發類型:", "LabelUser": "用戶:", "LabelVersionInstalled": "已安裝 {0}", - "LabelYourFirstName": "您的名字是:", "LabelYoureDone": "大功告成!", "LibraryAccessHelp": "選擇與此用戶共享媒體文件夾。管理員將能夠使用媒體資料瀏覽器而編輯所有文件夾。", "MaxParentalRatingHelp": "此用戶會被隱藏具有較高評價的家長評級內容。", @@ -186,7 +156,7 @@ "MoreUsersCanBeAddedLater": "稍後在控制台可以添加更多用戶。", "NewCollection": "新收藏庫", "NewCollectionNameExample": "例如:星球大戰收藏庫", - "NoNextUpItemsMessage": "未有發現。開始欣賞您的節目!", + "MessageNoNextUpItems": "未有發現。開始欣賞您的節目!", "OptionAdminUsers": "管理員", "OptionAlbum": "唱片", "OptionAlbumArtist": "唱片歌手", @@ -202,7 +172,6 @@ "OptionArtist": "歌手", "OptionAscending": "遞升", "OptionAuto": "自動", - "OptionAutomatic": "自動", "OptionBlockBooks": "書籍", "OptionBluray": "藍光", "OptionCommunityRating": "討論區評分", @@ -232,7 +201,6 @@ "OptionEnableAccessToAllLibraries": "允許所有媒體庫通行", "OptionEnded": "完成", "OptionFavorite": "我的最愛", - "OptionFriday": "星期五", "OptionHasSpecialFeatures": "特色", "OptionHasSubtitles": "字幕", "OptionHasThemeSong": "主題曲", @@ -246,9 +214,7 @@ "OptionIsSD": "標清", "OptionLikes": "正評", "OptionMissingEpisode": "缺少的劇集", - "OptionMonday": "星期一", "OptionNameSort": "名稱", - "OptionOnAppStartup": "在伺服器啟動", "OptionOnInterval": "每個時段", "OptionParentalRating": "家長評級", "OptionPlayCount": "播放次數", @@ -259,17 +225,12 @@ "OptionReleaseDate": "發佈日期", "OptionResumable": "能夠恢復", "OptionRuntime": "運行時間", - "OptionSaturday": "星期六", "OptionSpecialEpisode": "特集", - "OptionSunday": "星期日", - "OptionThursday": "星期四", "OptionTrackName": "曲目名稱", - "OptionTuesday": "星期二", "OptionTvdbRating": "Tvdb 評分", "OptionUnairedEpisode": "尚未播放的劇集", "OptionUnplayed": "未播放", "OptionWakeFromSleep": "從休眠中恢復", - "OptionWednesday": "星期三", "OptionWeekly": "每週", "ParentalRating": "Parental Rating", "Play": "播放", @@ -283,43 +244,19 @@ "SystemDlnaProfilesHelp": "系統配置文件是唯讀的。更改系統配置文件將被保存到一個自定新配置文件。", "TabAccess": "可以通行", "TabAdvanced": "進階", - "TabAlbumArtists": "唱片歌手", - "TabAlbums": "專輯", - "TabArtists": "藝人", "TabCatalog": "目錄", - "TabChannels": "頻道", - "TabCollections": "藏品", "TabDashboard": "狀態", - "TabDevices": "裝置", - "TabEpisodes": "劇集", - "TabFavorites": "我的最受", - "TabGenres": "風格", - "TabGuide": "指南", - "TabInfo": "資訊", "TabLatest": "最新", - "TabMetadata": "媒體資料屬性", - "TabMovies": "電影", "TabMusic": "音樂", - "TabMusicVideos": "MV", "TabMyPlugins": "我的插件", "TabNetworks": "網絡", "TabNotifications": "通知", "TabOther": "其它", - "TabPassword": "密碼", - "TabPlaylist": "播放清單", "TabProfile": "簡介", "TabProfiles": "簡介", - "TabRecordings": "錄影", - "TabSeries": "電視劇", "TabServer": "伺服器", "TabSettings": "設定", - "TabShows": "節目", - "TabSongs": "歌曲", - "TabSuggestions": "建議", - "TabTrailers": "預告", - "TabTranscoding": "轉碼中", "TabUpcoming": "即將發佈", - "TabUsers": "用戶", "TellUsAboutYourself": "介紹一下自己", "ThisWizardWillGuideYou": "此教學協助您完成安裝過程。首先,請選擇您的語言。", "Thursday": "星期四", @@ -341,7 +278,6 @@ "AsManyAsPossible": "越多越好", "Audio": "音頻", "Auto": "自動", - "AutoBasedOnLanguageSetting": "自動 (基於語言設定)", "BirthLocation": "出生地點", "AllLanguages": "全部語言", "All": "全部", @@ -354,7 +290,6 @@ "Playlists": "播放清單", "Photos": "相片", "Movies": "電影", - "HeaderLiveTV": "電視直播", "HeaderFavoriteSongs": "最愛的歌曲", "HeaderFavoriteShows": "最愛的節目", "HeaderFavoriteEpisodes": "最愛的劇集", @@ -371,7 +306,6 @@ "Albums": "專輯", "Absolute": "絕對", "AuthProviderHelp": "選擇用於驗證該用戶密碼的身份驗證提供程序。", - "AttributeNew": "新", "AspectRatio": "長寬比", "AskAdminToCreateLibrary": "要求管理員創建一個庫。", "Ascending": "上升", @@ -381,7 +315,7 @@ "AlwaysPlaySubtitlesHelp": "無論語言是哪種音頻,都將加載與語言首選項匹配的字幕。", "AllowedRemoteAddressesHelp": "IP地址或IP /網絡掩碼條目的逗號分隔列表,用於允許遠程連接的網絡。 如果保留為空白,將允許所有遠程地址。", "AllowRemoteAccessHelp": "如果未選中,則將阻止所有遠程連接。", - "AllowRemoteAccess": "允許與此Jellyfin服務器的遠程連接。", + "AllowRemoteAccess": "允許與此Jellyfin伺服器的遠端連接。", "AllowFfmpegThrottlingHelp": "當轉碼或無損複製進度遠超於當前播放位置,暫停進程可減少資源消耗。 在不經常觀看的情況下,此功能最為有用。 如果遇到播放問題,請關閉此功能。", "AllowOnTheFlySubtitleExtractionHelp": "可以從視頻中提取嵌入式字幕,然後以純文本格式將其交付給客戶端,以幫助防止視頻轉碼。 在某些系統上,這可能需要很長時間,並且會導致提取過程中視頻播放停止。 如果客戶端設備本身不支持嵌入的字幕,則可以禁用此選項以通過視頻轉碼刻錄字幕。", "AllowOnTheFlySubtitleExtraction": "允許即時提取字幕", @@ -400,7 +334,6 @@ "AdditionalNotificationServices": "瀏覽插件目錄以安裝其他通知服務。", "AddToPlayQueue": "添加到播放隊列", "AddToCollection": "添加到收藏", - "AddItemToCollectionHelp": "搜尋物件並使用右鍵點擊或點擊菜單將他們添加到收藏中。", "AccessRestrictedTryAgainLater": "目前存取受限。 請稍後再試。", "AllowFfmpegThrottling": "轉碼調節器", "Dislike": "不喜歡", @@ -409,7 +342,7 @@ "Disabled": "已停用", "Directors": "導演", "Director": "導演", - "DirectStreaming": "直接直播", + "DirectStreaming": "直接串流", "DirectPlaying": "直接播放", "DetectingDevices": "偵測裝置中", "Desktop": "桌面", @@ -419,17 +352,16 @@ "DeleteMedia": "刪除媒體", "DeleteImageConfirmation": "你確定要刪除此圖片嗎?", "DeleteImage": "刪除圖片", - "DefaultErrorMessage": "處理此請求時發生錯誤,請稍後再嘗試。", + "ErrorDefault": "處理此請求時發生錯誤,請稍後再嘗試。", "Default": "預設", - "DateAdded": "日期已新增", - "CopyStreamURLError": "複製URL時發生錯誤。", - "CopyStreamURLSuccess": "成功複製URL。", - "CopyStreamURL": "複製直播URL", + "DateAdded": "新增日期", + "CopyStreamURLSuccess": "成功複製網址。", + "CopyStreamURL": "複製串流網址", "ContinueWatching": "繼續觀看", "Connect": "連接", - "ConfirmEndPlayerSession": "你要關閉 {0} 的Jellyfin嗎?", + "ConfirmEndPlayerSession": "是否關閉 {0} 的Jellyfin?", "ConfirmDeleteImage": "刪除圖片?", - "CommunityRating": "社群分數", + "CommunityRating": "社群評分", "ClientSettings": "客戶端設定", "ChannelNumber": "頻道號碼", "ChannelNameOnly": "只有頻道 {0}", @@ -437,11 +369,9 @@ "CancelSeries": "取消片集", "CancelRecording": "取消錄影", "ButtonWebsite": "網頁", - "ButtonViewWebsite": "瀏覽網頁", "ButtonUninstall": "解除安裝", "ButtonTrailer": "預告", "ButtonTogglePlaylist": "播放清單", - "ButtonToggleContextMenu": "更多", "ButtonSplit": "分開", "ButtonStop": "停止", "ButtonStart": "開始", @@ -449,36 +379,27 @@ "ButtonSettings": "設定", "ButtonSend": "傳送", "ButtonSelectServer": "選擇伺服器", - "ButtonSearch": "搜尋", "ButtonScanAllLibraries": "掃瞄所有媒體櫃", "ButtonRevoke": "撤銷", "ButtonResume": "恢復", "ButtonResetEasyPassword": "重設PIN碼", - "ButtonRepeat": "重複", "ButtonProfile": "檔案", "ButtonPause": "暫停", "ButtonParentalControl": "家長控制", "ButtonOpen": "開啟", "ButtonNetwork": "網絡", "ButtonMore": "更多", - "ButtonLearnMore": "了解更多", "ButtonInfo": "資訊", - "ButtonHome": "主頁", "ButtonGuide": "教學", "ButtonGotIt": "了解", "ButtonFullscreen": "全螢幕", "ButtonForgotPassword": "忘記密碼", "ButtonEditOtherUserPreferences": "更改用戶個人檔案,圖片及個人偏好。", - "ButtonEditImages": "更改圖片", - "ButtonDownload": "下載", - "ButtonConnect": "連接", "ButtonChangeServer": "更換伺服器", "ButtonBack": "返回", "ButtonAudioTracks": "音軌", - "ButtonArrowUp": "箭咀上", "ButtonArrowRight": "箭咀右", "ButtonArrowLeft": "箭咀左", - "ButtonArrowDown": "箭咀下", "ButtonAddServer": "新增伺服器", "ButtonAddMediaLibrary": "新增媒體櫃", "ButtonAddImage": "新增圖片", @@ -491,19 +412,30 @@ "Backdrop": "背景", "AlwaysPlaySubtitles": "經常播放", "Display": "顯示", - "EnableBackdrops": "背景", "EditImages": "更改圖片", "DownloadsValue": "下載數目 {0}", "Download": "下載", "DisplayInMyMedia": "在主頁顯示", "ButtonSyncPlay": "SyncPlay", - "ButtonDown": "向下", "BurnSubtitlesHelp": "確定若服務器對視頻進行轉碼時是否嵌入字幕。 關閉這功能將使用更少時間。 選擇'自動'可嵌入基於圖像的格式字幕(VOBSUB,PGS,SUB,IDX等)和某些ASS或SSA字幕。", - "BrowsePluginCatalogMessage": "瀏覽我們的插件目錄以查看可用的插件。", + "MessageBrowsePluginCatalog": "瀏覽我們的插件目錄以查看可用的插件。", "BoxRear": "盒裝(背面)", "BoxSet": "套裝", "Box": "盒裝", "Composer": "作曲家", "ButtonPreviousTrack": "上一曲", - "ButtonNextTrack": "下一曲" + "ButtonNextTrack": "下一曲", + "ColorTransfer": "色彩移動", + "ColorSpace": "色彩空間", + "ColorPrimaries": "主色調", + "CinemaModeConfigurationHelp": "影院模式可在播放主影片前加入預告片及自定引言片段,帶來戲院式體驗。", + "ChangingMetadataImageSettingsNewContent": "任何資料變更只適用於新加入到媒體庫的內容。如要更改舊有媒體的內容,請手動刷新資料。", + "ButtonSelectView": "選擇介面", + "ButtonLibraryAccess": "媒體庫存取", + "BookLibraryHelp": "支援文字及有聲書本。請查閱{0} 書本命名教學 {1}。", + "DatePlayed": "播放日期", + "CriticRating": "評論家評分", + "ConfirmDeletion": "確定刪除", + "ConfirmDeleteItems": "刪除這些物品將會從檔案系統及媒體庫中刪除。請問是否繼續?", + "ConfirmDeleteItem": "刪除此物品將會從檔案系統及媒體庫中刪除。請問是否繼續?" } diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index 22a40d3247..52d960ba5c 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -3,35 +3,22 @@ "All": "全部", "AllowRemoteAccessHelp": "如果未勾選,所有連線都將被阻擋。", "Browse": "瀏覽", - "BrowsePluginCatalogMessage": "瀏覽我們的模組目錄來查看可用的模組。", - "ButtonAdd": "新增", + "MessageBrowsePluginCatalog": "瀏覽我們的附加元件目錄來查看可用的附加元件。", "ButtonAddServer": "新增伺服器", "ButtonAddUser": "新增使用者", "ButtonCancel": "取消", - "ButtonDelete": "刪除", - "ButtonDeleteImage": "刪除圖像", - "ButtonEdit": "編輯", - "ButtonEditImages": "編輯圖片", - "ButtonFilter": "過濾", "ButtonForgotPassword": "忘記密碼", "ButtonGotIt": "我知道了", "ButtonGuide": "節目表", - "ButtonHome": "首頁", - "ButtonNew": "建立", "ButtonOk": "確定", - "ButtonPlay": "播放", "ButtonQuickStartGuide": "快速入門指南", - "ButtonRefresh": "重新整理", "ButtonRefreshGuideData": "更新電視節目表", "ButtonRemove": "清除", "ButtonResetPassword": "重設密碼", - "ButtonSave": "保存", - "ButtonSearch": "搜尋", "ButtonSelectDirectory": "選擇目錄", "ButtonSelectServer": "選擇伺服器", "ButtonSignIn": "登入", "ButtonSignOut": "登出", - "ButtonSort": "排序", "ConfirmDeleteItem": "刪除此項目時,也會一併從檔案系統及媒體櫃中刪除。確定要刪除嗎?", "ConfirmDeletion": "確定刪除", "Continuing": "繼續", @@ -57,18 +44,13 @@ "Friday": "星期五", "GuideProviderLogin": "登入", "HeaderActiveRecordings": "正在錄影的節目", - "HeaderAddUser": "增加使用者", "HeaderAdditionalParts": "附加部份", "HeaderAdmin": "管理", - "HeaderAutomaticUpdates": "自動更新", - "HeaderCastCrew": "拍攝人員及演員", - "HeaderChannels": "頻道", "HeaderCustomDlnaProfiles": "自訂設定檔", "HeaderDeleteItem": "刪除項目", "HeaderEasyPinCode": "簡易 PIN 碼", "HeaderFeatureAccess": "可以使用的功能", "HeaderFetchImages": "擷取圖像:", - "HeaderForgotPassword": "忘記密碼", "HeaderFrequentlyPlayed": "經常播放", "HeaderGuideProviders": "節目表提供者", "HeaderImageSettings": "圖像設置", @@ -76,11 +58,8 @@ "HeaderLatestEpisodes": "最新劇集", "HeaderLatestMovies": "最新電影", "HeaderLatestRecordings": "最新錄影的節目", - "HeaderLiveTV": "電視直播", - "HeaderLiveTv": "電視", "HeaderMediaFolders": "媒體資料夾", "HeaderMusicVideos": "MV", - "HeaderNextUp": "接下來", "HeaderPaths": "路徑", "HeaderPlayAll": "全部播放", "HeaderPleaseSignIn": "請登入", @@ -89,33 +68,29 @@ "HeaderScenes": "場景", "HeaderSelectServer": "選擇伺服器", "HeaderSelectServerCachePath": "選擇伺服器快取路徑", - "HeaderSeries": "系列", "HeaderSpecialFeatures": "特色", "HeaderStatus": "狀態", "HeaderSystemDlnaProfiles": "系統設定", "HeaderUsers": "使用者", "Help": "說明", "ItemCount": "{0}個項目", - "LabelAllowServerAutoRestart": "允許伺服器自動重新啟動去安裝更新資料", - "LabelAllowServerAutoRestartHelp": "伺服器只會在沒有使用者在使用時重新啟動。", - "LabelAudioLanguagePreference": "音頻語言偏好選項:", + "LabelAudioLanguagePreference": "音訊語言偏好選項:", "LabelCachePath": "快取路徑:", "LabelCollection": "收藏櫃:", "LabelContentType": "內容類型:", "LabelCountry": "國家:", "LabelCurrentPassword": "當前的密碼:", "LabelDay": "日:", - "LabelDisplayMissingEpisodesWithinSeasons": "顯示節目季度內缺少的單元", - "LabelEnableDlnaClientDiscoveryInterval": "尋找客戶端時間間隔(秒)", + "LabelEnableDlnaClientDiscoveryInterval": "尋找用戶端時間間隔", "LabelEnableDlnaDebugLogging": "記錄 DLNA 除錯資料到日誌", "LabelEnableDlnaDebugLoggingHelp": "將會建立非常大的日誌檔案,建議在進行故障排除時啟用。", "LabelEnableDlnaPlayTo": "播放到 DLNA 設備", - "LabelEnableRealtimeMonitor": "啟用實時監控", - "LabelEnableRealtimeMonitorHelp": "支持的檔案系統上的更改,將會立即處理。", + "LabelEnableRealtimeMonitor": "啟用即時監控", + "LabelEnableRealtimeMonitorHelp": "檔案的更改將在支援的檔案系統上立即處理。", "LabelEvent": "事件:", "LabelEveryXMinutes": "每:", "LabelFinish": "完成", - "LabelServerNameHelp": "名稱將用於辨識服務器,預設是伺服器的電腦名稱。", + "LabelServerNameHelp": "名稱將作為伺服器名稱,預設是伺服器的主機名稱。", "LabelLanguage": "語言:", "LabelMaxBackdropsPerItem": "每個項目背景的最大數目:", "LabelMaxParentalRating": "最大允許的家長評級:", @@ -132,17 +107,14 @@ "LabelName": "名字:", "LabelNewPassword": "新密碼:", "LabelNewPasswordConfirm": "確認新密碼:", - "LabelNext": "下一個", "LabelPassword": "密碼:", "LabelPlaylist": "播放清單:", - "LabelPrevious": "上一個", "LabelRefreshMode": "更新模式:", - "LabelSaveLocalMetadata": "將媒體圖像及資料檔存到媒體所在的資料夾", - "LabelSaveLocalMetadataHelp": "直接儲存圖片及資料到媒體所在的資料夾能使編輯更容易。", + "LabelSaveLocalMetadata": "將媒體圖像及中繼資料存到媒體所在的資料夾", + "LabelSaveLocalMetadataHelp": "直接儲存圖片及中繼資料到媒體所在的資料夾能使編輯更容易。", "LabelTime": "時間:", "LabelTriggerType": "觸發類型:", "LabelUser": "使用者:", - "LabelYourFirstName": "您的名字:", "LabelYoureDone": "完成,耶!", "LibraryAccessHelp": "選擇媒體資料夾與此使用者共享。管理員將可以使用中繼資料管理器編輯所有的媒體資料夾。", "Like": "喜歡", @@ -152,15 +124,15 @@ "MessageItemsAdded": "已新增項目。", "MessageNoMovieSuggestionsAvailable": "目前並沒有推薦的電影,開始觀看並對您的電影評分後,我們就會為您推薦您可能會喜歡的內容。", "MessageNothingHere": "這裡沒有什麼。", - "MessagePasswordResetForUsers": "下列使用者的密碼已被重新設置。該使用者現在可以使用在密碼重置時所使用之 PIN 代碼進行登入。", - "MessagePleaseEnsureInternetMetadata": "請確保已啟用從互聯網下載媒體資料。", + "MessagePasswordResetForUsers": "下列使用者的密碼已被重新設置。該使用者現在可以使用在密碼重設時所使用之 PIN 代碼進行登入。", + "MessagePleaseEnsureInternetMetadata": "請確保已啟用從網際網路下載媒體資料。", "Monday": "星期一", "MoreUsersCanBeAddedLater": "也可於控制台內新增使用者。", "MySubtitles": "我的字幕", "NewCollection": "新合集", "NewCollectionHelp": "收藏櫃讓您能夠建立個人化的影音及其他媒體的分類。", - "NewCollectionNameExample": "例子:星球大戰合集", - "NoNextUpItemsMessage": "沒有找到。開始看你的節目!", + "NewCollectionNameExample": "例子:星際大戰合集", + "MessageNoNextUpItems": "沒有找到。開始看你的節目!", "NoSubtitleSearchResultsFound": "無結果。", "OptionAlbum": "專輯", "OptionAlbumArtist": "專輯歌手", @@ -169,7 +141,6 @@ "OptionAllowUserToManageServer": "允許該使用者管理伺服器", "OptionArtist": "歌手", "OptionAscending": "升序", - "OptionAutomatic": "自動", "OptionBlockLiveTvChannels": "電視頻道", "OptionBluray": "藍光", "OptionCommunityRating": "社區評分", @@ -180,7 +151,7 @@ "OptionDatePlayed": "播放日期", "OptionDescending": "降序", "OptionDisableUser": "停用該使用者", - "OptionDisableUserHelp": "被停用的使用者將被伺服器封鎖,即便正處於連線狀態也將被中斷。", + "OptionDisableUserHelp": "被停用的使用者將被伺服器封鎖,現有的連線也將中斷。", "OptionDislikes": "不喜歡", "OptionDownloadArtImage": "圖像", "OptionDownloadBackImage": "媒體包裝背面", @@ -189,24 +160,21 @@ "OptionDownloadLogoImage": "標誌", "OptionDownloadMenuImage": "菜單", "OptionDownloadPrimaryImage": "主要圖", - "OptionDownloadThumbImage": "縮略圖", + "OptionDownloadThumbImage": "縮圖", "OptionDvd": "DVD", "OptionEnded": "完結", "OptionFavorite": "我的最愛", - "OptionFriday": "星期五", "OptionHasSubtitles": "字幕", "OptionHasThemeSong": "主題曲", "OptionHasThemeVideo": "主題影片", "OptionHideUser": "在登入頁面隱藏此使用者", "OptionImdbRating": "IMDB評分", - "OptionIsHD": "高清", + "OptionIsHD": "高畫質", "OptionIsSD": "標清", "OptionLikes": "喜歡", "OptionMissingEpisode": "缺少了的單元", - "OptionMonday": "星期一", "OptionNameSort": "名字", "OptionNew": "新增…", - "OptionOnAppStartup": "在伺服器啟動", "OptionOnInterval": "每時段", "OptionParentalRating": "家長評級", "OptionPlayCount": "播放次數", @@ -214,17 +182,12 @@ "OptionPremiereDate": "首映日期", "OptionResumable": "可恢復", "OptionRuntime": "播放長度", - "OptionSaturday": "星期六", "OptionSpecialEpisode": "特集", - "OptionSunday": "星期天", - "OptionThursday": "星期四", "OptionTrackName": "曲目名稱", - "OptionTuesday": "星期二", "OptionTvdbRating": "TVDB 評分", "OptionUnairedEpisode": "還未發佈的單元", "OptionUnplayed": "未播放", "OptionWakeFromSleep": "從休眠中回復", - "OptionWednesday": "星期三", "OptionWeekly": "每週", "OriginalAirDateValue": "原始播出日期:{0}", "ParentalRating": "Parental Rating", @@ -238,51 +201,31 @@ "RecordingCancelled": "已取消排程錄製。", "RecordingScheduled": "已排程錄製。", "Refresh": "重新整理", - "RefreshDialogHelp": "詳細資料的更新方式會依據 Jellyfin 的設定及已經啟用的網路服務來進行。", + "RefreshDialogHelp": "中繼資料的更新方式會依據伺服器設定及已經啟用的網路服務來進行。", "ReplaceAllMetadata": "取代所有中繼資料", "ReplaceExistingImages": "取代現有圖片", "Saturday": "星期六", "Save": "保存", "Search": "搜尋", - "SearchForCollectionInternetMetadata": "在互聯網上搜索媒體圖像和資料", - "SearchForMissingMetadata": "搜尋遺失的詳細資料", + "SearchForCollectionInternetMetadata": "在網路上搜尋媒體圖像和資料", + "SearchForMissingMetadata": "搜尋遺失的中繼資料", "SearchForSubtitles": "搜尋字幕", "SeriesRecordingScheduled": "已排程錄製整個系列。", - "ServerUpdateNeeded": "此Jellyfin伺服器需要更新,請至{0}取得最新版本", + "ServerUpdateNeeded": "伺服器需要更新,請至 {0} 取得最新版本", "SettingsSaved": "設置已保存。", "Share": "分享", "Subtitles": "字幕", "Sunday": "星期天", "TabAdvanced": "進階", - "TabAlbumArtists": "專輯歌手", - "TabAlbums": "專輯", - "TabArtists": "歌手", "TabCatalog": "目錄", - "TabChannels": "頻道", - "TabEpisodes": "單元", - "TabGenres": "類型", - "TabGuide": "節目表", - "TabInfo": "資訊", "TabLatest": "最新", - "TabLiveTV": "電視", - "TabMetadata": "媒體資料", - "TabMovies": "電影", "TabMusic": "音樂", - "TabMyPlugins": "我的插件", - "TabNetworks": "網絡", - "TabPassword": "密碼", - "TabPlaylist": "播放清單", + "TabMyPlugins": "我的附加元件", + "TabNetworks": "網路", "TabProfile": "設定", "TabProfiles": "設定", - "TabRecordings": "錄影", - "TabSeries": "電視劇", "TabServer": "伺服器", "TabSettings": "設定", - "TabShows": "節目", - "TabSongs": "歌曲", - "TabSuggestions": "建議", - "TabTrailers": "預告", - "TabTranscoding": "轉碼中", "TabUpcoming": "接下來", "TellUsAboutYourself": "介紹一下自己", "ThisWizardWillGuideYou": "此精靈將帶你完成安裝過程,開始之前,請選擇您慣用的語言。", @@ -290,14 +233,14 @@ "TrackCount": "{0} 個曲目", "Tuesday": "星期二", "UninstallPluginConfirmation": "你確定要解除安裝 {0}?", - "UninstallPluginHeader": "解除安裝插件", + "HeaderUninstallPlugin": "解除安裝附加元件", "UserProfilesIntro": "Jellyfin 可單獨對使用者進行設定,所有使用者擁有自己的顯示設置,播放狀態和家長控制。", "Wednesday": "星期三", "WelcomeToProject": "歡迎使用 Jellyfin!", "WizardCompleted": "這就是我們所需的全部資訊,Jellyfin 現在正在收集你的媒體櫃的資料,在這段時間內,不妨參考我們推出的應用程式。按一下完成進入控制台。", "Actor": "演員", "AddToPlayQueue": "加入播放清單", - "AddToPlaylist": "加入播放列表", + "AddToPlaylist": "加入播放清單", "Absolute": "絕對", "AccessRestrictedTryAgainLater": "目前存取受限,請稍後再試。", "AddedOnValue": "已加入 {0}", @@ -310,7 +253,7 @@ "AllLibraries": "所有媒體", "AllowMediaConversion": "允許媒體轉檔", "AllowMediaConversionHelp": "授予或拒絕存取媒體轉檔功能。", - "AllowRemoteAccess": "允許遠端存取該 Jellyfin 伺服器。", + "AllowRemoteAccess": "允許遠端存取伺服器。", "AlwaysPlaySubtitles": "總是顯示字幕", "AlwaysPlaySubtitlesHelp": "將會載入符合語音設定的字幕,無論語音是哪一個語言。", "AnyLanguage": "任何語言", @@ -321,10 +264,8 @@ "AsManyAsPossible": "越多越好", "Ascending": "遞增", "AspectRatio": "長寬比", - "AttributeNew": "新增", "Audio": "音訊", "Auto": "自動", - "AutoBasedOnLanguageSetting": "自動(根據語言設定)", "Backdrop": "背景", "Backdrops": "背景", "Banner": "橫幅", @@ -336,45 +277,35 @@ "ButtonAddMediaLibrary": "新增媒體櫃", "ButtonArrowLeft": "左", "ButtonArrowRight": "右", - "ButtonArrowUp": "上", "ButtonAudioTracks": "音軌", "ButtonBack": "返回", "ButtonChangeServer": "更換伺服器", - "AddItemToCollectionHelp": "利用搜尋並使用右鍵或點擊目錄將項目新增到收藏中。", "AddToCollection": "加入收藏", "AirDate": "播出日期", "Aired": "已播於", "AllEpisodes": "所有集數", - "AllowHWTranscodingHelp": "若啟用,將會允許調諧器同步轉檔,這會減少 Jellyfin 伺服器轉檔必要。", - "AllowOnTheFlySubtitleExtraction": "允許同步字幕截取", - "AllowOnTheFlySubtitleExtractionHelp": "可以從影片中提取內建字幕並以純文字的形式給 Jellyfin 應用程式以避免影片轉檔。某些系統中提取的過程可能會花費較長時間並導致影片播放出現停滯。若停用這個選項,當內建字幕不被播放端設備支援時,字幕將透過轉檔嵌入影片中。", - "AllowedRemoteAddressesHelp": "可以從非本地連線的IP位址,用冒號分隔,留白則允許所有IP。", + "AllowHWTranscodingHelp": "若啟用,將會允許調諧器同步轉檔,能夠減少伺服器轉檔需求。", + "AllowOnTheFlySubtitleExtraction": "允許即時擷取字幕", + "AllowOnTheFlySubtitleExtractionHelp": "從影片中提取內建字幕並以純文字的形式顯示以避免影片轉檔。某些系統中提取的過程可能花費較長時間並導致影片播放出現停滯。若停用這個選項,當內建字幕不被播放端設備支援時,字幕將透過轉檔嵌入影片中。", + "AllowedRemoteAddressesHelp": "可以從非本地連線的 IP 位址或 IP/子網域遮罩清單,用冒號分隔。 留白則允許所有IP。", "BookLibraryHelp": "支援有聲書和電子書。請瀏覽 {0}書籍命名指南{1}。", "Box": "盒子", "BoxRear": "盒子(背面)", - "BurnSubtitlesHelp": "根據字幕格式決定伺服器在影片轉檔時是否燒錄字幕。避免燒錄字幕時消耗過多伺服器資源。選擇「自動」以燒錄基於圖片的字幕格式(如 VOBSUB、PGS 或 SUB/IDX 等)和一些複雜的 ASS/SSA 字幕。", - "ButtonArrowDown": "下", - "ButtonConnect": "連結", - "ButtonDown": "下", - "ButtonDownload": "下載", + "BurnSubtitlesHelp": "根據字幕格式決定伺服器在影片轉檔時是否燒錄字幕。避免燒錄字幕時消耗過多伺服器資源。選擇「自動」以燒錄圖片格式的字幕(如 VOBSUB、PGS 或 SUB/IDX 等)與複雜的 ASS/SSA 字幕。", "ButtonEditOtherUserPreferences": "編輯使用者個人檔案、大頭貼和個人設定。", "ButtonFullscreen": "全螢幕", - "ButtonHelp": "幫助", "ButtonInfo": "詳細資料", - "ButtonLearnMore": "瞭解更多", "ButtonLibraryAccess": "媒體庫存取", "ButtonManualLogin": "手動登入", "ButtonMore": "更多", "ButtonNetwork": "網路", "ButtonNextTrack": "下一首", - "ButtonOff": "關", "ButtonOpen": "開", "ButtonParentalControl": "家長控制", "ButtonPause": "暫停", "ButtonPreviousTrack": "上一首", "ButtonProfile": "個人首頁", "ButtonRename": "重新命名", - "ButtonRepeat": "重覆播放", "ButtonResetEasyPassword": "重設簡單 PIN 碼", "ButtonRestart": "重新啟動", "ButtonResume": "繼續播放", @@ -383,21 +314,17 @@ "ButtonSelectView": "選擇顯示方式", "ButtonSend": "傳送", "ButtonSettings": "設定", - "ButtonShuffle": "隨機播放", "ButtonShutdown": "關機", "ButtonStart": "開始", "ButtonStop": "停止", "ButtonSubmit": "送出", - "ButtonSubtitles": "字幕", "ButtonTrailer": "預告片", "ButtonUninstall": "解除安裝", - "ButtonUp": "上", - "ButtonViewWebsite": "查看網站", "ButtonWebsite": "網站", "CancelRecording": "取消錄影", "CancelSeries": "取消系列", "Categories": "類別", - "ChangingMetadataImageSettingsNewContent": "更改影片中繼資料或媒體圖像的下載設定僅對以後添加至媒體庫中的新内容生效,若需更改已存在的資料,請手動更新中繼資料。", + "ChangingMetadataImageSettingsNewContent": "更改影片中繼資料或媒體圖像的下載設定僅對以後添加至媒體庫中的新內容生效,若需更改已存在的資料,請手動更新中繼資料。", "ChannelAccessHelp": "選擇與此使用者共享之頻道。管理員將能夠使用中繼資料管理器編輯所有資料夾。", "ChannelNameOnly": "只在頻道 {0}", "ChannelNumber": "頻道號碼", @@ -421,7 +348,7 @@ "ColorSpace": "色彩空間", "ColorTransfer": "色彩傳輸", "CommunityRating": "社群評分", - "DefaultErrorMessage": "處理請求時發生錯誤。請稍後再試。", + "ErrorDefault": "處理請求時發生錯誤。請稍後再試。", "DefaultMetadataLangaugeDescription": "這些預設設定可以在你的媒體庫中單獨設定。", "DefaultSubtitlesHelp": "字幕將基於中繼資料中的「預設」標記和「強制」標記來載入,當有多個選項可用時,將根據語言偏好決定。", "DeleteDeviceConfirmation": "你確定你要刪除這個裝置嗎?當有使用者用這個裝置登入時,這個裝置會再次出現。", @@ -433,7 +360,7 @@ "DeviceAccessHelp": "只適用於用唯一辨識方法的裝置,並不會阻止瀏覽器存取。已過濾的使用者裝置會被拒絕存取,直到他們被批准。", "DirectPlaying": "直接播放", "DirectStreamHelp1": "媒體在畫質和媒體類型(H.264、AC3 等)方面與裝置相容。但是在不相容的檔案格式(.mkv、.avi、.wmv 等)中,在影片傳輸到裝置之前,將會重新轉檔。", - "DirectStreamHelp2": "直接串流檔案會占用非常少的處理效能並且影片的品質不會有任何損失。", + "DirectStreamHelp2": "直接串流檔案會占用較少的 CPU 且影片品質不會有任何損失。", "DirectStreaming": "直接串流", "Director": "導演", "Directors": "導演", @@ -450,11 +377,10 @@ "Down": "下", "DownloadsValue": "{0} 個下載", "DrmChannelsNotImported": "受 DMR 保護的頻道將不會被導入。", - "DropShadow": "背景投影", + "DropShadow": "陰影", "EasyPasswordHelp": "你的簡易 PIN 碼將會用於在支援的 Jellyfin 應用上進行離線存取,同時也可被用於區域網路的登入。", "EditMetadata": "編輯中繼資料", "EditSubtitles": "編輯字幕", - "EnableBackdrops": "背景", "EnableBackdropsHelp": "瀏覽媒體庫時背景圖將作為頁面的背景。", "EnableCinemaMode": "影院模式", "EnableColorCodedBackgrounds": "色彩背景", @@ -463,31 +389,29 @@ "EnableExternalVideoPlayersHelp": "當你開始播放影片時,將會顯示外部播放器選單。", "EnableHardwareEncoding": "啟用硬體編碼", "EnableNextVideoInfoOverlay": "在播放時顯示下一個影片資訊", - "EnableNextVideoInfoOverlayHelp": "在影片結束前,顯示當前播放列表中下一個影片的資訊。", + "EnableNextVideoInfoOverlayHelp": "在影片結束前,顯示當前播放清單中下一個影片的資訊。", "EnablePhotos": "顯示圖片", "EnablePhotosHelp": "圖片將被偵測到並和其他媒體檔案一起顯示。", "EnableStreamLooping": "自動循環播放直播", "EnableStreamLoopingHelp": "如果直播僅包含了幾秒鐘的數據並且需要被不斷的請求,請啟用此項。如果在沒有相關問題的情況下啟動此項,可能會導致一些問題。", - "EnableThemeSongs": "主題曲", "EnableThemeSongsHelp": "瀏覽媒體庫時主題曲將作為背景音樂播放。", - "EnableThemeVideos": "啟用主題影片", "EnableThemeVideosHelp": "瀏覽媒體庫時主題影片將作為背景影片播放。", "Episodes": "劇集", - "ErrorAddingListingsToSchedulesDirect": "在將電視節目時間表新增到您的 Schedules Direct 帳號時出現錯誤。每個 Schedules Direct 帳號只允許有限的時間表。您在繼續前可能需要登入 Schedules Direct 網站並刪除帳號中的其它列表。", - "ErrorAddingMediaPathToVirtualFolder": "新增媒體路徑時發生錯誤,請確認路徑是否有效,且你的 Jellyfin 伺服器有對該位置的存取權。", - "ErrorAddingTunerDevice": "新增調諧器設備時發生錯誤,請確認它是否可被存取後再試一次。", - "ErrorAddingXmlTvFile": "存取 XMLTV 檔案時發生錯誤,請確認該檔案是否存在後再試一次。", - "ErrorDeletingItem": "從 Jellyfin 伺服器刪除項目時發生錯誤,請確認伺服器對該磁碟有寫入權限並再試一次。", + "ErrorAddingListingsToSchedulesDirect": "在將電視節目時間表新增到您的 Schedules Direct 帳號時出現錯誤。每個 Schedules Direct 帳號只允許有限的時間表。您在繼續前可能需要登入 Schedules Direct 網站並刪除帳號中的其它清單。", + "ErrorAddingMediaPathToVirtualFolder": "新增媒體路徑時發生錯誤,請確認路徑是否有效,且 Jellyfin 具該位置的存取權。", + "ErrorAddingTunerDevice": "新增調諧器設備時發生錯誤,請確認它是否可被存取後重試。", + "ErrorAddingXmlTvFile": "存取 XMLTV 檔案時發生錯誤,請確認該檔案是否存在後重試。", + "ErrorDeletingItem": "從伺服器刪除項目時發生錯誤,請確認伺服器對該位址有寫入權限並重試。", "ErrorGettingTvLineups": "下載電視節目表時發生錯誤,請確認你的資訊是否正確並重試。", - "ErrorMessageStartHourGreaterThanEnd": "結束時間必須在開始時間後。", - "ErrorPleaseSelectLineup": "請選擇節目表,然後再試一次。如果沒有可用的節目表,請檢查您的使用者名稱、密碼和郵遞區號是否正確。", + "ErrorStartHourGreaterThanEnd": "結束時間必須在開始時間後。", + "ErrorPleaseSelectLineup": "請選擇節目表,然後重試。若無可用的節目表,請檢查您的使用者名稱、密碼和郵遞區號是否正確。", "ErrorSavingTvProvider": "儲存電視供應商時發生錯誤,請確認是否可存取並重試。", "EveryNDays": "每 {0} 天", "ExitFullscreen": "結束全螢幕", "ExtraLarge": "特大", "ExtractChapterImagesHelp": "擷取章節圖片將允許 Jellyfin 顯示圖片形式的章節選單,過程可能會非常緩慢、佔用大量 CPU 資源,並且可能需要幾 GB 的硬碟空間。\n擷取會在影片被偵測到時啟動,同時也可作為一個夜間計劃任務運行,這個任務可以在「計劃任務」選項中進行設定,不建議在尖峰時刻使用時間進行這個任務。", "Extras": "額外", - "FFmpegSavePathNotFound": "我們無法通過你輸入的路徑找到 FFmpeg。 FFprobe 同樣也是必要且應該被放在同一個資料夾中。他們通常會被打包在一起以供下載。請檢查這個路徑然後再試一次。", + "FFmpegSavePathNotFound": "我們無法通過你輸入的路徑找到 FFmpeg。 FFprobe 同樣也是必要且應該被放在同一個資料夾中。他們通常會被打包在一起以供下載。請檢查這個路徑後重試。", "FastForward": "快轉", "Favorites": "我的最愛", "Features": "功能", @@ -505,7 +429,7 @@ "GroupVersions": "按版本分組", "GuestStar": "客串", "Guide": "指南", - "GuideProviderSelectListings": "選擇列表", + "GuideProviderSelectListings": "選擇清單", "H264CrfHelp": "CRF 是 x264 編碼器的預設畫質設置。此方法允許編碼器自動分配位元速率來試著達到一定輸出品質。讓每個畫格得到它需要的位元數來保持所需的品質等級。CRF 會得到最佳的位元速率分配結果。", "EncoderPresetHelp": "速度越慢則會得到更好的壓縮編碼效率。", "HDPrograms": "HD 節目", @@ -514,23 +438,20 @@ "HeaderAccessScheduleHelp": "建立一個存取時程以限制可存取的時段。", "HeaderActiveDevices": "運行中裝置", "HeaderActivity": "活動", - "HeaderAddScheduledTaskTrigger": "新增觸發", "HeaderAddToCollection": "加到收藏", - "HeaderAddToPlaylist": "加到播放列表", + "HeaderAddToPlaylist": "加到播放清單", "HeaderAddUpdateImage": "新增/更新圖片", "HeaderAlbumArtists": "專輯演出者", - "HeaderAlbums": "專輯", "HeaderAlert": "通知", "HeaderAllowMediaDeletionFrom": "允許從中刪除媒體", "HeaderApiKey": "API 金鑰", "HeaderApiKeys": "API 金鑰", - "HeaderApiKeysHelp": "外部應用程式需要有一個 API 金鑰以用於和 Jellyfin 伺服器溝通。金鑰會在 Jellyfin 使用者登入時自動發行,或者你可以手動為應用程式產生一個金鑰。", + "HeaderApiKeysHelp": "外部應用程式需要有一個 API 金鑰以用於和伺服器溝通。金鑰會在使用者登入時自動發行,也可以手動產生一個金鑰。", "HeaderApp": "應用程式", "HeaderAppearsOn": "同時出現於", "HeaderAudioBooks": "有聲書", "HeaderAudioSettings": "音訊設定", "HeaderBlockItemsWithNoRating": "封鎖沒有評級或設置不允許的內容:", - "HeaderBooks": "書籍", "HeaderBranding": "品牌", "HeaderCancelRecording": "取消錄製", "HeaderCancelSeries": "取消系列", @@ -538,15 +459,15 @@ "HeaderChannelAccess": "節目存取", "HeaderChapterImages": "章節圖片", "HeaderCodecProfile": "編碼設定檔", - "HeaderCodecProfileHelp": "編碼器的設定檔標明了設備播放特定編碼時的限制;如果在限制之內則媒體將被轉碼,否則編碼器將被設定為直接播放。", + "HeaderCodecProfileHelp": "編碼器的設定檔標明了設備播放特定編碼時的限制;如果在限制之內則媒體將被轉檔,否則編碼器將被設定為直接播放。", "HeaderConfigureRemoteAccess": "設定遠端控制", - "HeaderConfirmPluginInstallation": "確認插件安裝", + "HeaderConfirmPluginInstallation": "確認附加元件安裝", "HeaderConfirmProfileDeletion": "確認刪除個人資料", - "HeaderConfirmRevokeApiKey": "重置 API 金鑰", + "HeaderConfirmRevokeApiKey": "重設 API 金鑰", "HeaderConnectToServer": "連結至伺服器", "HeaderConnectionFailure": "連結失敗", "HeaderContainerProfile": "影片載體設定", - "HeaderContainerProfileHelp": "影片容器的設定檔標明了設備播放特定媒體格式時的限制。如果在限制之內則媒體將被轉碼,否則媒體格式將被設定為直接播放。", + "HeaderContainerProfileHelp": "影片容器的設定檔標明了設備播放特定媒體格式時的限制。如果在限制之內則媒體將被轉檔,否則媒體格式將被設定為直接播放。", "HeaderContinueListening": "繼續聆聽", "HeaderContinueWatching": "繼續觀賞", "HeaderDateIssued": "發布日期", @@ -561,27 +482,22 @@ "HeaderDevices": "裝置", "HeaderDirectPlayProfile": "直接播放設定檔", "HeaderDirectPlayProfileHelp": "新增直接播放設定檔,標明哪些媒體格式設備可以自己處理。", - "HeaderDisplay": "顯示", "HeaderDownloadSync": "下載與同步", "HeaderEditImages": "編輯圖片", "HeaderEnabledFields": "已啟用的欄位", "HeaderEnabledFieldsHelp": "反選欄位以鎖定並不讓其數據被更改。", - "HeaderEpisodes": "集數", "HeaderError": "錯誤", "HeaderExternalIds": "外部 ID:", "HeaderFavoriteAlbums": "最愛專輯", "HeaderFavoriteArtists": "最愛演出者", "HeaderFavoriteEpisodes": "最愛影集", "HeaderFavoriteMovies": "最愛電影", - "HeaderFavoritePlaylists": "最愛播放列表", + "HeaderFavoritePlaylists": "最愛播放清單", "HeaderFavoriteShows": "最愛節目", "HeaderFavoriteSongs": "最愛歌曲", "HeaderFavoriteVideos": "最愛的影片", - "HeaderFeatures": "功能", "HeaderFetcherSettings": "擷取器設置", - "HeaderFilters": "篩選條件", "HeaderForKids": "給兒童", - "HeaderGenres": "類型", "HeaderHttpHeaders": "HTTP 標頭", "HeaderIdentification": "身份識別", "HeaderIdentificationCriteriaHelp": "至少輸入一個識別標準。", @@ -589,10 +505,9 @@ "HeaderIdentifyItemHelp": "輸入一個或多個搜索條件。刪除條件可得到更多搜索結果。", "HeaderImageOptions": "圖片選項", "HeaderInstall": "安裝", - "HeaderItems": "項目", "HeaderKeepRecording": "繼續錄製", "HeaderKeepSeries": "保存系列", - "HeaderKodiMetadataHelp": "要啟用或停用 NFO 中繼資料,請在 Jellyfin「建立媒體庫」頁面中編輯該媒體庫「中繼資料儲存」部分。", + "HeaderKodiMetadataHelp": "要啟用或停用 NFO 中繼資料,請在設定裡「建立媒體庫」頁面中編輯「中繼資料儲存」部分。", "HeaderLatestMedia": "最新媒體", "HeaderLatestMusic": "最新音樂", "HeaderLibraries": "媒體庫", @@ -603,10 +518,8 @@ "HeaderLiveTvTunerSetup": "電視直播調諧器安裝", "HeaderLoginFailure": "登入失敗", "HeaderMedia": "媒體", - "HeaderMediaInfo": "媒體資訊", "HeaderMetadataSettings": "中繼資料設定", "HeaderMoreLikeThis": "更多類似的", - "HeaderMovies": "電影", "HeaderMusicQuality": "音質", "HeaderMyDevice": "我的裝置", "HeaderMyMedia": "我的媒體", @@ -620,13 +533,12 @@ "HeaderOtherItems": "其他項目", "HeaderPassword": "密碼", "HeaderPasswordReset": "重設密碼", - "HeaderPeople": "使用者", "HeaderPhotoAlbums": "相簿", "HeaderPinCodeReset": "重設PIN碼", "HeaderPlayOn": "播放在", "HeaderPlayback": "媒體播放", "HeaderPlaybackError": "播放錯誤", - "HeaderPluginInstallation": "插件安裝", + "HeaderPluginInstallation": "附加元件安裝", "HeaderRecordingOptions": "錄影選項", "HeaderRecordingPostProcessing": "錄影後製", "HeaderRemoteControl": "遙控", @@ -638,15 +550,14 @@ "HeaderSeasons": "季數", "HeaderSecondsValue": "{0} 秒", "HeaderSelectPath": "選擇位址", - "HeaderSelectTranscodingPath": "選擇轉碼暫放位址", - "HeaderSelectTranscodingPathHelp": "瀏覽或輸入轉碼用來存暫時資料的位址。資料夾需可讀取。", + "HeaderSelectTranscodingPath": "選擇轉檔暫放位址", + "HeaderSelectTranscodingPathHelp": "瀏覽或輸入轉檔用來存暫時資料的位址。資料夾需具寫入權限。", "HeaderSendMessage": "傳送訊息", "HeaderSeriesOptions": "系列選項", "HeaderSeriesStatus": "系列狀態", "HeaderServerSettings": "伺服器設定", "HeaderSettings": "設定", "HeaderSetupLibrary": "設置你的媒體庫", - "HeaderShutdown": "關機", "HeaderSortBy": "分類", "HeaderSortOrder": "分類順序", "HeaderSpecialEpisodeInfo": "特集資訊", @@ -654,7 +565,6 @@ "HeaderStopRecording": "停止錄影", "HeaderSubtitleAppearance": "字幕外觀", "HeaderSubtitleDownloads": "字幕下載", - "HeaderTags": "標籤", "HeaderThisUserIsCurrentlyDisabled": "這個使用者目前停用", "HeaderTracks": "軌", "HeaderTunerDevices": "調諧器裝置", @@ -668,19 +578,18 @@ "AuthProviderHelp": "選擇用於驗證使用者密碼的身份驗證提供者。", "HeaderParentalRatings": "家長評級", "HeaderProfile": "設定檔", - "HeaderProfileInformation": "設定檔信息", - "HeaderProfileServerSettingsHelp": "這些數值將控制 Jellyfin 伺服器如何呈現給設備。", + "HeaderProfileInformation": "設定檔訊息", + "HeaderProfileServerSettingsHelp": "這些數值將控制伺服器如何呈現給設備。", "HeaderResponseProfile": "回覆設定檔", "HeaderResponseProfileHelp": "當播放某些類型的媒體時,回覆設定檔提供一種方法來發送自定訊息到設備。", - "HeaderSchedule": "日程表", "HeaderSelectCertificatePath": "選擇證書路徑", - "HeaderSelectMetadataPath": "選擇數據路徑", + "HeaderSelectMetadataPath": "選擇中繼資料路徑", "HeaderSubtitleProfile": "字幕設定檔", "HeaderSubtitleProfiles": "字幕設定檔", "HeaderSubtitleProfilesHelp": "字幕設定檔描述設備所支援的字幕格式。", "HeaderTaskTriggers": "任務觸發", - "HeaderTranscodingProfile": "轉碼設定", - "HeaderTranscodingProfileHelp": "新增轉碼設定檔標明哪些媒體格式需要轉碼處理。", + "HeaderTranscodingProfile": "轉檔設定", + "HeaderTranscodingProfileHelp": "新增轉檔設定檔標明哪些媒體格式需要轉檔處理。", "HeaderTuners": "調諧器", "HeaderTypeImageFetchers": "{0} 圖片獲取程序", "HeaderTypeText": "輸入文字", @@ -695,7 +604,6 @@ "HeaderXmlDocumentAttributes": "XML 檔案屬性", "HeaderXmlSettings": "XML 設置", "HeaderYears": "年份", - "HeadersFolders": "資料夾", "Hide": "隱藏", "HideWatchedContentFromLatestMedia": "從最新媒體中隱藏已觀看的內容", "Home": "首頁", @@ -703,15 +611,15 @@ "HttpsRequiresCert": "要啟用安全連線,您需要提供受信任的SSL證書,如 Let's Encrypt。 請提供證書,或停用安全連線。", "Identify": "識別", "Images": "圖片", - "ImportFavoriteChannelsHelp": "若啟用,只有在調諧器設備中被標記為我的最愛的頻道才會被導入。", - "ImportMissingEpisodesHelp": "若啟用,有關缺失劇集的數據導入您的 Jellyfin 媒體庫,並在季節和系列中顯示。 這可能會導致媒體庫掃描延長。", - "InstallingPackage": "正在安装 {0}(版本 {1})", + "ImportFavoriteChannelsHelp": "若啟用,僅於調諧器設備中被標記為我的最愛的頻道才會被導入。", + "ImportMissingEpisodesHelp": "缺失劇集的資料將導入您的媒體庫,並在季度與系列中顯示。 可能導致媒體庫掃描延長。", + "InstallingPackage": "正在安裝 {0}(版本 {1})", "InstantMix": "即時混音", "Items": "項目", "Kids": "兒童", "Label3DFormat": "3D 格式:", "LabelAbortedByServerShutdown": "(因為伺服器關閉被中止)", - "LabelAccessDay": "一周中的何時:", + "LabelAccessDay": "一週中的何時:", "LabelAccessEnd": "結束時間:", "LabelAccessStart": "開始時間:", "LabelAirDays": "播出日期:", @@ -722,27 +630,25 @@ "LabelAlbum": "專輯:", "LabelAlbumArtHelp": "PN 在 upnp:albumArtURI 裡的 dlna:profileID 屬性用於專輯封面。某些設備不管圖像的尺寸大小,都會要求特定的值。", "LabelAlbumArtMaxHeight": "專輯封面最大高度:", - "LabelAlbumArtMaxHeightHelp": "通過 upnp:albumArtURI 顯示的專輯封面超鏈接的最大分辨率。", + "LabelAlbumArtMaxHeightHelp": "通過 upnp:albumArtURI 顯示的專輯封面超連結的最大解析度。", "LabelAlbumArtMaxWidth": "專輯封面最大寬度:", - "LabelAlbumArtMaxWidthHelp": "通過 upnp:albumArtURI 顯示的專輯封面超鏈接的最大解析度。", + "LabelAlbumArtMaxWidthHelp": "通過 upnp:albumArtURI 顯示的專輯封面超連結的最大解析度。", "LabelAlbumArtPN": "專輯封面 PN :", "LabelAlbumArtists": "專輯作家:", - "LabelAll": "所有", - "LabelAllowHWTranscoding": "允許硬體轉碼", - "LabelAllowedRemoteAddresses": "遠端 IP 過濾:", - "LabelAllowedRemoteAddressesMode": "遠端 IP 過濾模式:", + "LabelAllowHWTranscoding": "允許硬體轉檔", + "LabelAllowedRemoteAddresses": "遠端 IP 位址過濾:", + "LabelAllowedRemoteAddressesMode": "遠端 IP 位址過濾模式:", "LabelAppName": "APP 名稱", "LabelAppNameExample": "例如:可愛蹦蹦主機、小安的 Jellyfin", "LabelArtists": "藝人:", - "LabelArtistsHelp": "分開多重使用 ;", - "LabelAudio": "音頻", + "LabelArtistsHelp": "將多位演出者以「;」分隔。", "LabelAuthProvider": "認證提供者:", "LabelAutomaticallyRefreshInternetMetadataEvery": "從網路自動抓取中繼資料:", - "LabelBindToLocalNetworkAddress": "綁定本地網絡地址:", - "LabelBindToLocalNetworkAddressHelp": "(選用)覆蓋 HTTP 伺服器綁定的本地 IP 地址。如果留空,伺服器將會監聽所有可用的地址。改變此欄位需重啟 Jellyfin 伺服器。", + "LabelBindToLocalNetworkAddress": "綁定本地網路地址:", + "LabelBindToLocalNetworkAddressHelp": "(選用)覆蓋 HTTP 伺服器綁定的本地 IP 位址。如果留空,伺服器將會監聽所有可用的地址。改變此欄位需重啟 Jellyfin 伺服器。", "LabelBirthDate": "出生日期:", "LabelBirthYear": "出生年:", - "LabelBlastMessageInterval": "活動信號的時間間隔(秒)", + "LabelBlastMessageInterval": "活動信號的時間間隔", "LabelBlastMessageIntervalHelp": "確定伺服器活動消息之間的持續時間(秒)。", "LabelBlockContentWithTags": "通過標籤鎖定內容:", "LabelBurnSubtitles": "燒錄字幕:", @@ -757,17 +663,14 @@ "LabelCustomCertificatePath": "自訂 SSL 證書路徑:", "LabelCustomCertificatePathHelp": "提供包含證書和金鑰的 PKCS #12 文件的路徑以在自訂域名上啟用 TLS。", "LabelCustomCss": "自訂 CSS:", - "LabelCustomCssHelp": "於 Web 介面套用您的自訂樣式。", - "LabelCustomDeviceDisplayName": "顯示名稱:", + "LabelCustomCssHelp": "於網頁介面套用您的自訂樣式。", "Depressed": "凹陷", - "HeaderHome": "首頁", "HeaderSelectMetadataPathHelp": "瀏覽或者輸入路徑以用於保存中繼資料,請確保資料夾可以寫入。", "HeaderSelectServerCachePathHelp": "瀏覽或者輸入路徑以用於伺服器快取檔案。請確保該資料夾可以被寫入。", "LabelCustomDeviceDisplayNameHelp": "指定自訂的顯示名稱,或者留空以使用設備自己報告的名稱。", "LabelCustomRating": "自訂分級:", - "LabelDashboardTheme": "控制台佈景主題:", "LabelDateAdded": "新增日期:", - "LabelDateAddedBehavior": "新内容加入的日期應使用:", + "LabelDateAddedBehavior": "新內容加入的日期應使用:", "LabelDateTimeLocale": "設定時區:", "LabelDeathDate": "死亡時間:", "LabelDefaultScreen": "預設分頁:", @@ -779,7 +682,7 @@ "LabelDisplayLanguageHelp": "翻譯 Jellyfin 是個進行中的專案。", "LabelDisplayMode": "顯示模式:", "LabelDisplayName": "顯示名稱:", - "MessageNoPluginsInstalled": "您尚未安裝任何模組。", + "MessageNoPluginsInstalled": "您尚未安裝任何附加元件。", "Mobile": "手機", "Option3D": "3D", "OptionEveryday": "每天", @@ -787,20 +690,18 @@ "LabelAudioBitDepth": "音訊位元深度:", "LabelBaseUrl": "根路徑:", "LabelIconMaxHeight": "圖示最高高度:", - "LabelHttpsPortHelp": "Jellyfin 的 HTTPS 伺服器應綁定的 TCP 端口。", - "LabelIconMaxHeightHelp": "通過 upnp:icon 的圖標最大解析度。", + "LabelHttpsPortHelp": "HTTPS 伺服器的 TCP 埠。", + "LabelIconMaxHeightHelp": "通過 upnp:icon 的圖示最大解析度。", "CopyStreamURL": "複製串流連結", "MediaInfoDefault": "預設", "MediaInfoStreamTypeAudio": "音訊", - "LabelDateAddedBehaviorHelp": "如果原本就有中繼資料,將會優先使用其數據。", + "LabelDateAddedBehaviorHelp": "若原本就有中繼資料,將會優先使用。", "LabelScreensaver": "螢幕保護程式:", "LabelSeasonNumber": "季:", "LabelDropImageHere": "拖移圖片到這裡,或是點擊來選取。", "LabelImageType": "圖片格式:", - "LabelIdentificationFieldHelp": "不區分大小寫的子字符串或正則表達式。", + "LabelIdentificationFieldHelp": "不區分大小寫的子字串或正則表達式。", "Large": "大", - "LabelTranscodingAudioCodec": "音訊編碼:", - "MessageSettingsSaved": "設定已儲存.", "LabelTranscodePath": "轉檔路徑:", "LabelTranscodes": "轉檔:", "MinutesAfter": "分後", @@ -808,7 +709,6 @@ "LabelVersionInstalled": "{0} 已安裝", "DashboardVersionNumber": "版本:{0}", "DashboardServerName": "伺服器:{0}", - "NoSubtitles": "無", "List": "清單", "OptionAllowMediaPlayback": "允許播放媒體", "OneChannel": "單聲道", @@ -819,12 +719,11 @@ "ResumeAt": "從 {0} 繼續播放", "Settings": "設定", "TabAccess": "存取", - "TabDevices": "裝置", "TabDirectPlay": "直接播放", "ThemeSongs": "主題曲", "ThemeVideos": "主題曲影片", "Upload": "上傳", - "PasswordResetHeader": "重設密碼", + "HeaderResetPassword": "重設密碼", "ScanLibrary": "掃描媒體庫", "ValueAudioCodec": "音訊編碼:{0}", "ValueCodec": "編碼:{0}", @@ -847,9 +746,9 @@ "Shuffle": "隨機播放", "Smart": "智慧", "HeaderFavoriteBooks": "最愛的書籍", - "LabelAudioBitrate": "音訊比特率:", + "LabelAudioBitrate": "音訊位元率:", "LabelAudioCodec": "音訊編碼:", - "LabelBitrate": "比特率:", + "LabelBitrate": "位元率:", "LabelAudioChannels": "音訊聲道:", "LabelAudioSampleRate": "音訊取樣率:", "LabelFont": "字體:", @@ -857,14 +756,13 @@ "LabelDisplayOrder": "顯示順序:", "LabelEnableBlastAliveMessages": "活動訊息", "LabelEnableDlnaServer": "啟用 DLNA 伺服器", - "LabelEnableDlnaServerHelp": "允許網絡上的 UPnP 設備瀏覽和播放內容。", + "LabelEnableDlnaServerHelp": "允許網路上的 UPnP 設備瀏覽和播放內容。", "LabelEnableHardwareDecodingFor": "為以下啟用硬體解碼:", "LabelEpisodeNumber": "集:", "LabelBaseUrlHelp": "您可以在此處自訂伺服器 URL 路徑的子目錄,如:http://example.com/<baseurl>", "LabelExtractChaptersDuringLibraryScan": "於媒體庫掃描時擷取章節圖片", - "LabelHttpsPort": "本地 HTTPS 端口:", + "LabelHttpsPort": "本地 HTTPS 埠:", "LabelFailed": "失敗", - "LabelSubtitles": "字幕", "LabelSupportedMediaTypes": "支援的媒體類型:", "LabelTextBackgroundColor": "文字背景顏色:", "LabelTextColor": "文字顏色:", @@ -888,7 +786,7 @@ "ManageLibrary": "管理媒體庫", "MarkPlayed": "標記為已播放", "MarkUnplayed": "標記為未播放", - "MediaInfoBitrate": "比特率", + "MediaInfoBitrate": "位元率", "MediaInfoChannels": "聲道", "MediaInfoCodec": "編碼", "MediaInfoContainer": "影片容器", @@ -902,7 +800,7 @@ "MessageConfirmDeleteTunerDevice": "您確定要刪除這部裝置嗎?", "MessageConfirmRecordingCancellation": "取消錄製?", "MessageImageFileTypeAllowed": "僅支援 JPEG 和 PNG。", - "MessageInvalidUser": "錯誤的使用者名稱或密碼,請再試一次。", + "MessageInvalidUser": "錯誤的使用者名稱或密碼,請重試。", "MessageItemSaved": "項目已儲存。", "MessagePleaseWait": "請稍候。", "MinutesBefore": "分前", @@ -935,8 +833,7 @@ "RecentlyWatched": "最近觀賞", "RecommendationBecauseYouLike": "因為您喜歡 {0}", "SearchResults": "搜尋結果", - "TabPlaylists": "播放清單", - "TabPlugins": "模組", + "TabPlugins": "附加元件", "Transcoding": "轉檔", "ValueTimeLimitMultiHour": "時間限制:{0} 小時", "ValueVideoCodec": "影片編碼:{0}", @@ -946,10 +843,10 @@ "LabelServerName": "伺服器名稱:", "LabelTag": "標記:", "LabelTranscodingTempPathHelp": "指定轉檔後的儲存路徑,留空將使用預設值。", - "LabelffmpegPathHelp": "路徑指向 FFmpeg,或是包含其的資料夾。", + "LabelffmpegPathHelp": "FFmpeg 的路徑,或是包含其的資料夾。", "ManageRecording": "管理錄影", "MessageAlreadyInstalled": "已安裝此版本。", - "MessageConfirmRestart": "您確定要重新啟動嗎?", + "MessageConfirmRestart": "您確定要重新啟動 Jellyfin 嗎?", "Metadata": "中繼資料", "OptionAllUsers": "所有使用者", "OptionHomeVideos": "圖片", @@ -962,7 +859,6 @@ "RepeatMode": "重複模式", "Runtime": "運行時間", "TV": "電視", - "TabUsers": "使用者", "Trailers": "預告", "LabelImageFetchersHelp": "啟用並按優先順序排序您的首選圖片擷取器。", "LabelDownMixAudioScale": "縮混時的音訊增強:", @@ -970,7 +866,7 @@ "LabelDownloadLanguages": "下載語言:", "LabelDynamicExternalId": "{0} Id:", "LabelEasyPinCode": "簡易代碼:", - "LabelEnableAutomaticPortMap": "啟用自動端口映射", + "LabelEnableAutomaticPortMap": "啟用自動埠映射", "LabelEnableSingleImageInDidlLimit": "限制單個嵌入式圖片", "LabelEndDate": "結束日期:", "LabelLockItemToPreventChanges": "鎖定此項目來避免被更改", @@ -983,17 +879,16 @@ "LabelSelectVersionToInstall": "選擇要安裝的版本:", "LabelSendNotificationToUsers": "傳送通知給:", "LabelSortBy": "排序按照:", - "LabelVideoBitrate": "影片比特率:", + "LabelVideoBitrate": "影片位元率:", "MediaInfoSize": "大小", "MediaInfoTimestamp": "時間戳", - "MediaInfoSoftware": "軟體", "MediaInfoStreamTypeData": "檔案", "MediaInfoStreamTypeEmbeddedImage": "內嵌語言", "MediaInfoStreamTypeSubtitle": "字幕", "MediaInfoStreamTypeVideo": "影片", "Menu": "選單", "MetadataManager": "中繼資料管理器", - "NoPluginConfigurationMessage": "這個模組沒有設定選項可供更改。", + "MessageNoPluginConfiguration": "這個附加元件沒有選項可供更改。", "NoSubtitlesHelp": "字幕不會自動讀取,但可於播放時手動選取。", "Normal": "正常", "OptionAllowContentDownloading": "允許下載及同步媒體", @@ -1002,7 +897,6 @@ "OptionBlockTrailers": "預告", "OptionBlockTvShows": "電視節目", "OptionList": "清單", - "TabMusicVideos": "MV", "Yesterday": "昨天", "Yes": "是", "ButtonAddImage": "新增圖片", @@ -1012,18 +906,18 @@ "LabelGroupMoviesIntoCollections": "將電影分組", "LabelKodiMetadataDateFormat": "釋出日期格式:", "LabelIconMaxWidth": "Icon 最寬寬度:", - "LabelGroupMoviesIntoCollectionsHelp": "顯示電影列表時,屬於相同集合的電影將作為分組項目顯示。", + "LabelGroupMoviesIntoCollectionsHelp": "顯示電影清單時,屬於相同集合的電影將作為分組項目顯示。", "LabelEncoderPreset": "H264 解碼品質:", "LabelHardwareAccelerationType": "硬體加速:", - "LabelIconMaxWidthHelp": "通過 upnp:icon 的圖標最大解析度。", + "LabelIconMaxWidthHelp": "通過 upnp:icon 的圖示最大解析度。", "LabelImportOnlyFavoriteChannels": "僅限收藏的頻道", "LabelInNetworkSignInWithEasyPassword": "啟用以簡易密碼進行區域網路登入", "LabelH264Crf": "H264 編碼 CRF:", "LabelMaxStreamingBitrate": "最大串流畫質:", - "LabelMaxStreamingBitrateHelp": "指定最大串流比特率。", + "LabelMaxStreamingBitrateHelp": "指定最大串流位元率。", "LabelMessageText": "訊息文字:", "LabelMessageTitle": "訊息標題:", - "LabelMetadataDownloadLanguage": "首選下載語言:", + "LabelMetadataDownloadLanguage": "偏好下載語言:", "LabelMetadata": "中繼資料:", "LabelMethod": "方法:", "LabelNewName": "新名稱:", @@ -1040,8 +934,6 @@ "TabCodecs": "編碼", "TabContainers": "影片容器", "TabDashboard": "控制台", - "TabDisplay": "顯示", - "TabFavorites": "最愛", "TabLogs": "日誌", "TabNotifications": "通知", "TabOther": "其他", @@ -1050,7 +942,6 @@ "TabStreaming": "串流", "TagsValue": "標記:{0}", "Thumb": "縮圖", - "TabResumeSettings": "繼續播放", "ValueAlbumCount": "{0} 張專輯", "ValueContainer": "影片容器:{0}", "ValueEpisodeCount": "{0} 集", @@ -1071,7 +962,6 @@ "OptionProtocolHttp": "HTTP", "TabNfoSettings": "NFO 設定", "FetchingData": "獲取額外資料", - "LabelTranscodingVideoCodec": "影片編碼:", "MediaInfoBitDepth": "位元深度", "Mute": "靜音", "MessageConfirmShutdown": "你確定要關閉伺服器嗎?", @@ -1089,36 +979,32 @@ "OptionEnableM2tsMode": "啟用 M2ts 模式", "LabelKeepUpTo": "保持:", "LabelKidsCategories": "兒童分類:", - "LabelKodiMetadataEnablePathSubstitution": "啟用路徑替換", + "LabelKodiMetadataEnablePathSubstitution": "啟用路徑取代", "LabelKodiMetadataEnableExtraThumbs": "複製 extrafanart 到 extrathumbs 欄位", "LabelMovieCategories": "電影分類:", "LabelMoviePrefix": "電影前綴:", "LabelProfileContainer": "影片容器:", "LabelDropShadow": "陰影:", "LabelTVHomeScreen": "電視模式主畫面:", - "LabelTranscodingContainer": "影片容器:", "MovieLibraryHelp": "查看 {0}Jellyfin 電影命名指南{1}。", "None": "無", - "LinksValue": "連結:{0}", - "OptionAllowMediaPlaybackTranscodingHelp": "由於不支持的媒體格式,限制轉檔可能會導致 Jellyfin 應用程式播放失敗。", + "OptionAllowMediaPlaybackTranscodingHelp": "限制轉檔可能會導致播放不支援的格式時失敗。", "MediaInfoLevel": "等級", "MessageNoTrailersFound": "安裝 Trailer channel 來新增網路上預告片,以增進你的電影體驗。", "OptionHasSpecialFeatures": "特色", "RecommendationStarring": "主演 {0}", "Rewind": "倒帶", - "RunAtStartup": "開機時啟動", "SubtitleOffset": "字幕偏移", - "TabPlayback": "播放", "Unrated": "尚未評等", "Up": "上", "ValueOneSeries": "1 劇集", "Writer": "編劇", "XmlTvMovieCategoriesHelp": "有這些類別的節目會被當作電影,以「|」來分隔多個項目。", "ValueSeriesCount": "{0} 劇集", - "LabelHardwareAccelerationTypeHelp": "硬件加速需要額外的配置。", + "LabelHardwareAccelerationTypeHelp": "硬體加速需要額外的配置。", "LabelHomeNetworkQuality": "區域網路畫質:", - "LabelHomeScreenSectionValue": "主畫面模塊 {0}:", - "LabelMetadataDownloadersHelp": "啟用媒體屬性下載器的優先次序,愈下次序只會用來填補缺少的信息。", + "LabelHomeScreenSectionValue": "主畫面模組 {0}:", + "LabelMetadataDownloadersHelp": "啟用中繼資料下載器的優先次序,愈下次序只會用來填補缺少的訊息。", "LabelMetadataReaders": "中繼資料閱讀器:", "LabelMetadataSaversHelp": "選取儲存中繼資料的檔案格式。", "LabelModelNumber": "型號", @@ -1128,7 +1014,7 @@ "OptionDownloadBannerImage": "橫幅", "OptionEnableAccessToAllChannels": "允許存取所有頻道", "OptionEnableAccessToAllLibraries": "允許存取所有媒體庫", - "OptionEnableForAllTuners": "开启所有调谐器", + "OptionEnableForAllTuners": "開啟所有調諧器", "OptionExtractChapterImage": "開啟章節圖片擷取", "OptionEnableM2tsModeHelp": "當編碼為 MPEGTS 時啟用 M2TS 模式。", "OptionEquals": "等於", @@ -1143,10 +1029,10 @@ "SeriesDisplayOrderHelp": "按播出日期、DVD 順序或編號對劇集進行排序。", "SeriesSettings": "系列設定", "SeriesYearToPresent": "{0} - 現在", - "ServerNameIsRestarting": "Jellyfin Server - {0} 重啟中。", - "ServerNameIsShuttingDown": "Jellyfin 伺服器 - {0} 正在關閉。", + "ServerNameIsRestarting": "伺服器將於 {0} 後重新啟動。", + "ServerNameIsShuttingDown": "伺服器將於 {0} 後關閉。", "SimultaneousConnectionLimitHelp": "允許的同時串流的最大數量。輸入 0 表示無限制。", - "SkipEpisodesAlreadyInMyLibrary": "不錄製我的媒體庫裡已存在的劇集", + "SkipEpisodesAlreadyInMyLibrary": "不錄製已存在於媒體庫中的劇集", "SmallCaps": "小型大寫字母", "SortChannelsBy": "頻道排序方式:", "SortName": "排序名稱", @@ -1154,28 +1040,27 @@ "StopRecording": "停止錄影", "LabelDefaultUserHelp": "確定哪些使用者媒體庫將顯示在連接裝置上。這可以為每個裝置提供不同的使用者設定檔。", "LabelEnableBlastAliveMessagesHelp": "若此伺服器無法被其他 UPnP 裝置偵測到,請啟用此選項。", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "由 Jellyfin 決定進行 SSDP 搜尋之間的持續時間(以秒為單位)。", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "決定進行 SSDP 搜尋之間的持續時間(以秒為單位)。", "LabelEnableDlnaPlayToHelp": "偵測您網路裡的設備並遠端控制它們。", "LabelExtractChaptersDuringLibraryScanHelp": "當媒體庫匯入影片並掃描時,將擷取章節圖片。\n否則,章節圖片將在之後的計畫任務中擷取,而媒體庫會更快完成掃描。", "LabelMoviePrefixHelp": "若前綴套用到電影標題,請在此處輸入它來方便伺服器能夠正確處理。", - "LabelMovieRecordingPath": "電影錄製路徑(選用):", + "LabelMovieRecordingPath": "電影錄製路徑:", "LabelNotificationEnabled": "啟用這個通知", "LabelProfileContainersHelp": "以逗號分隔,留空則適用於所有影片容器。", "LabelSelectFolderGroupsHelp": "未選中的資料夾將在其自己的檢視中顯示。", "LabelSerialNumber": "序號", - "LabelSeriesRecordingPath": "電視劇錄影路徑(選用):", + "LabelSeriesRecordingPath": "影集錄影路徑:", "LabelServerHost": "主機:", "LabelSimultaneousConnectionLimit": "同時串流限制:", "LabelSize": "大小:", - "LabelSkin": "主題:", "LabelSkipBackLength": "跳過長度:", - "LabelSkipIfGraphicalSubsPresentHelp": "保留文字版本的字幕會更有效率傳遞,減低影片轉碼的機會。", + "LabelSkipIfGraphicalSubsPresentHelp": "保留文字版本的字幕會更有效率傳遞,減低影片轉檔的機會。", "LabelStopWhenPossible": "當可能時自動停止:", "LabelStopping": "停止", "LabelTagline": "個性宣言:", "LabelSubtitleDownloaders": "字幕下載器:", - "LabelSubtitleFormatHelp": "例如:SRT", - "LabelSubtitlePlaybackMode": "字幕模式:", + "LabelSubtitleFormatHelp": "如:SRT", + "LabelSubtitlePlaybackMode": "字幕載入:", "LabelTranscodingThreadCount": "轉檔執行緒數:", "LabelTunerIpAddress": "調諧器 IP 位址:", "LabelTunerType": "調諧器類型:", @@ -1188,7 +1073,6 @@ "LabelWeb": "網站:", "LabelXDlnaCapHelp": "決定在 urn:schemas-dlna-org:device-1-0 namespace 中的 X_DLNACAP 元素的內容。", "LabelXDlnaDocHelp": "決定在 urn:schemas-dlna-org:device-1-0 namespace 中的 X-Dlna doc 元素的內容。", - "LaunchWebAppOnStartup": "在啟動伺服器時啟動使用者介面", "LabelUserRemoteClientBitrateLimitHelp": "覆蓋伺服器重播設定中設置的預設全域值。", "LabelTranscodingThreadCountHelp": "選擇轉檔時要使用的最大執行緒數,減少執行緒數將降低 CPU 使用率,但轉換速度可能不足以提供流暢的播放體驗。", "LabelXDlnaCap": "X-DLNA 上限:", @@ -1208,22 +1092,22 @@ "MessageConfirmDeleteGuideProvider": "您確定要刪除此指南提供者嗎?", "MessageConfirmProfileDeletion": "您確定要刪除這個設定檔嗎?", "MessageConfirmRemoveMediaLocation": "您確定要移除這個位置嗎?", - "MessageConfirmRevokeApiKey": "您確定要撤銷這個 API 金鑰嗎?這個應用程式與 Jellyfin 伺服器的連接將立即中斷。", + "MessageConfirmRevokeApiKey": "您確定要撤銷這個 API 金鑰嗎?這個應用程式與伺服器的連接將立即中斷。", "MessageCreateAccountAt": "在 {0} 建立使用者", "MessageDeleteTaskTrigger": "您確定要刪除這個任務觸發器嗎?", "MessageDirectoryPickerBSDInstruction": "對於 BSD 系統,您需要設定包含您 FreeNAS Jail 虛擬機的儲存以便 Jellyfin 存取。", "MessageDirectoryPickerLinuxInstruction": "使用 Linux on Arch Linux、CentOS、Debian、Fedora、openSUSE 或 Ubuntu 作業系統,您必須授權使用者至少讀取權限來存取您的儲存路徑。", "MessageEnablingOptionLongerScans": "啟用這個選項可能會延長媒體庫的掃描時間。", "MessageFileReadError": "讀取檔案時發生錯誤。", - "MessageForgotPasswordInNetworkRequired": "請檢查您的區域網路後再開始密碼重置流程。", + "MessageForgotPasswordInNetworkRequired": "請檢查您的區域網路後再開始密碼重設流程。", "MessageForgotPasswordFileCreated": "已在伺服器上建立了以下檔案,並包含有關後續步驟說明:", - "MessageNoAvailablePlugins": "沒有可用的模組。", + "MessageNoAvailablePlugins": "沒有可用的附加元件。", "MessageNoServersAvailable": "無法自動偵測伺服器。", "MessageLeaveEmptyToInherit": "保留為空以繼承父項或全域預設值的設定。", "MessageNoCollectionsAvailable": "分組能夠讓您享受個性化的影片、劇集和專輯。點擊+按鈕開始建立分組。", "MessagePlayAccessRestricted": "此內容的播放受到限制,聯繫您的伺服器管理員以獲取更多訊息。", - "MessagePluginConfigurationRequiresLocalAccess": "請直接登入你的本地伺服器以設定這個模組。", - "MessagePluginInstallDisclaimer": "安裝 Jellyfin 社區成員建立的模組來獲取額外的功能可以最佳化您的 Jellyfin。但他們可能會對你的 Jellyfin 伺服器造成的影響,如更長的媒體庫掃描時間、額外的背景資料處理和降低系統穩定性等。", + "MessagePluginConfigurationRequiresLocalAccess": "請直接登入你的本地伺服器以設定這個附加元件。", + "MessagePluginInstallDisclaimer": "安裝 Jellyfin 社區成員建立的附加元件來讓您的 Jellyfin 獲取額外的功能最佳化您的使用體驗。但可能會對你的 Jellyfin 伺服器效能造成影響,如更長的媒體庫掃描時間、額外的背景資料處理與系統穩定性降低等。", "MessageReenableUser": "請參閱以下以重新啟用", "MessageUnableToConnectToServer": "無法連上所選的伺服器,請確保該伺服器正在運作中。", "MessageYouHaveVersionInstalled": "你目前安裝了 {0} 版本。", @@ -1232,7 +1116,7 @@ "NoNewDevicesFound": "找不到裝置,要添加新調諧器,請關閉此對話框並手動輸入裝置訊息。", "OnlyForcedSubtitles": "僅顯示強制字幕", "OnlyImageFormats": "圖片格式(VOBSUB、PGS、SUB)", - "OptionAllowLinkSharingHelp": "只有網頁包含的媒體訊息會被共享,媒體檔案本身不會被公開共享,共享的內容會在 {0} 天後到期。", + "OptionAllowLinkSharingHelp": "只有網頁包含的媒體訊息會被共享,媒體檔案本身不會被公開共享,共享的內容會在 {0} 天后到期。", "OptionAllowRemoteSharedDevices": "允許遠端控制共享裝置", "OptionAllowSyncTranscoding": "允許需要轉檔的媒體下載和同步", "OptionAllowVideoPlaybackRemuxing": "允許播放需轉換但無需重新編碼的影片", @@ -1240,13 +1124,13 @@ "MetadataSettingChangeHelp": "更改中繼資料設定將影響新增的新內容。要重新整理現有內容,請打開詳細訊息視窗並點選「重新整理」按鈕,或使用中繼資料管理器執行批次重新整理。", "MusicLibraryHelp": "查看{0}音樂命名指南{1}。", "OptionAutomaticallyGroupSeries": "自動合併分布在不同資料夾的電視劇", - "OptionAutomaticallyGroupSeriesHelp": "分布在這個媒體庫的多個文件夾中的同一部電視劇將會自動整合成一部電視劇。", + "OptionAutomaticallyGroupSeriesHelp": "媒體庫中同一部電視劇的多個資料夾將會自動整合一起。", "OptionDateAddedImportTime": "使用加入媒體庫時的掃描日期", "OptionDisplayFolderView": "顯示「資料夾」類別來瀏覽你的媒體資料夾", "OptionEmbedSubtitles": "在影片容器中嵌入", "OptionDownloadImagesInAdvance": "提前下載圖片", "OptionEnableAccessFromAllDevices": "允許所有裝置存取", - "OptionDownloadImagesInAdvanceHelp": "預設情況下,大多數圖片僅在Jellyfin應用程式請求時下載。啟用此選項可於匯入新媒體後提前下載所有圖片,可能會延長的媒體庫掃描時間。", + "OptionDownloadImagesInAdvanceHelp": "預設情況下,大多數圖片僅在應用程式請求時下載。啟用此選項可於匯入新媒體時提前下載所有圖片,可能會延長的媒體庫掃描時間。", "OptionEnableExternalContentInSuggestionsHelp": "允許將網際網路預告片和直播電視節目包含在建議的內容中。", "OptionHideUserFromLoginHelp": "對私人或隱藏的管理員帳戶很有用,但需手動輸入使用者名稱和密碼登入。", "OptionPlainStorageFolders": "顯示所有資料夾作為一般存儲資料夾", @@ -1254,16 +1138,16 @@ "OptionPlainVideoItemsHelp": "所有影片在 DIDL 中顯示為「object.item.videoItem」,而不是一個更具體的類型,如「object.item.videoItem.movie」。", "OptionProtocolHls": "HTTP 直播串流", "OptionReportByteRangeSeekingWhenTranscoding": "轉檔時,回報伺服器支持的位元組查詢", - "OptionSaveMetadataAsHidden": "儲存媒體資料和圖片為隱藏文件", + "OptionSaveMetadataAsHidden": "儲存中繼資料和圖片為隱藏文件", "OptionSubstring": "子串", "OptionWeekdays": "工作日", "Overview": "概述", "PackageInstallCancelled": "{0} (版本 {1})安裝被取消。", "PlayAllFromHere": "從這裡開始全部播放", "PleaseAddAtLeastOneFolder": "請點擊新增按鈕,新增至少一個資料夾到這個媒體庫。", - "PleaseConfirmPluginInstallation": "點擊「OK」以確認您已經閱讀了上述內容並希望繼續安裝模組。", + "PleaseConfirmPluginInstallation": "點擊「OK」以確認您已經閱讀了上述內容並希望繼續安裝附加元件。", "PleaseEnterNameOrId": "請輸入一個名稱或一個外部 ID。", - "PleaseRestartServerName": "請重啟 Jellyfin 伺服器 - {0}。", + "PleaseRestartServerName": "請重啟 Jellyfin 於 {0}。", "PleaseSelectTwoItems": "請至少選擇 2 個項目。", "PreferEmbeddedTitlesOverFileNames": "優先使用內建的標題而不是檔案名稱", "PreferEmbeddedTitlesOverFileNamesHelp": "這將在沒有網路上的中繼資料或本地中繼資料可用時顯示預設標題。", @@ -1276,35 +1160,34 @@ "Programs": "節目", "Quality": "品質", "PackageInstallFailed": "{0} (版本 {1}) 安裝失敗。", - "QueueAllFromHere": "將這裡的全部內容加入佇列", - "Raised": "提高", + "Raised": "浮凹", "Rate": "評等", "Recordings": "錄影", - "ServerRestartNeededAfterPluginInstall": "安裝模組後,Jellyfin 伺服器需要重啟以使模組生效。", + "ServerRestartNeededAfterPluginInstall": "安裝附加元件後,Jellyfin 伺服器需要重啟使其生效。", "ShowIndicatorsFor": "顯示指標:", "Sort": "排序", "Studios": "工作室", "TheseSettingsAffectSubtitlesOnThisDevice": "這些設定僅影響該裝置的字幕顯示", "TitleHardwareAcceleration": "硬體加速", "TitleHostingSettings": "主機設定", - "Uniform": "輪廓", + "Uniform": "邊框", "Unmute": "取消靜音", "Unplayed": "尚未播放", "TvLibraryHelp": "查看 {0} 電視命名指南 {1} 。", "LabelMonitorUsers": "監控活動:", "LabelPleaseRestart": "改動將在手動重啟用戶端後生效。", "LabelProfileCodecsHelp": "以逗號分隔。留空則適用於所有編解碼器。", - "OptionPlainStorageFoldersHelp": "如果啟用,所有文件夾在DIDL中顯示為「object.container.storageFolder 」,而不是一個更具體的類型,如「object.container.person.musicArtist」。", + "OptionPlainStorageFoldersHelp": "所有資料夾在 DIDL 中顯示為「object.container.storageFolder 」,而不是一個更具體的類型,如「object.container.person.musicArtist」。", "LabelInNetworkSignInWithEasyPasswordHelp": "你可以在你的家庭網路中使用你的簡易 PIN 碼登錄 Jellyfin 應用程式,僅在你使用外部網路時才需要輸入密碼,如果 PIN 碼留空,那麼在你的區域網路中便不需輸入密碼。", "LabelReleaseDate": "釋出日期:", "LabelRemoteClientBitrateLimit": "網際網路串流傳輸位元率限制(Mbps):", - "LanNetworksHelp": "在強制頻寬限制時,認作本地網路上的 IP 地址或 IP/子網域遮罩項目的逗號分隔列表。若設置此項,所有其它 IP 地址將被視作在外部網路上,并且將受到外部頻寬限制。如果保留爲空,則只將服務器的子網域遮罩作本地網路。", + "LanNetworksHelp": "在強制頻寬限制時,認作本地網路上的 IP 位址或 IP/子網域遮罩項目的逗號分隔清單。若設置此項,所有其它 IP 位址將被視作在外部網路上,並且將受到外部頻寬限制。如果保留為空,則只將伺服器的子網域遮罩作本地網路。", "OptionIgnoreTranscodeByteRangeRequests": "忽略轉檔位元組範圍請求", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "如果啟用,這些請求會被兌現,但會忽略的位元組範圍標頭。", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "這些請求會被接受,但會忽略的位元組範圍標頭。", "OptionLoginAttemptsBeforeLockoutHelp": "若值為 0,則表示將允許普通使用者嘗試三次、管理員嘗試五次的預設值,設定為 -1 來停用此功能。", "OptionRequirePerfectSubtitleMatchHelp": "僅下載經過測試並確認跟此影片檔案完美匹配的字幕。取消勾選這個項目可以增加找到並下載字幕的可能性,但可能會下載時間軸、翻譯不正確的字幕。", - "PluginInstalledMessage": "這個模組安裝成功,但 Jellyfin 伺服器需要重啟以使模組生效。", - "RecordingPathChangeMessage": "更改錄製資料夾不會將現有錄製從舊位置遷移到新的,您需要手動移動它們。", + "MessagePluginInstalled": "附加元件安裝成功,但需要重新啟動 Jellyfin 伺服器以使附加元件生效。", + "MessageChangeRecordingPath": "更改錄製資料夾不會將現有錄製從舊位置遷移到新的,您需要手動移動它們。", "LabelEmbedAlbumArtDidl": "於 Didl 中嵌入專輯封面", "LabelEnableAutomaticPortMapHelp": "透過 UPnP 自動將路由器上的公共埠轉發到伺服器上的本地埠。這可能不適用於某些路由器型號或網路設定。在伺服器重新啟動後才會進行更改。", "LabelEmbedAlbumArtDidlHelp": "有些裝置使用這個方式來取得專輯封面,啟用這個選項可能導致其他設備播放失敗。", @@ -1312,9 +1195,9 @@ "LabelEnableSingleImageInDidlLimitHelp": "若在 Didl 中嵌入多個圖片,某些裝置可能無法正常顯示。", "SortByValue": "排序方式:{0}", "LabelLineup": "排隊:", - "LabelLocalHttpServerPortNumber": "本地 HTTP 端口:", - "LabelLocalHttpServerPortNumberHelp": "Jellyfin HTTP 伺服器監聽的 TCP 端口。", - "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "這些設定也會被套用在任何透過此裝置發起的 Chromecast 播放。", + "LabelLocalHttpServerPortNumber": "本地 HTTP 埠:", + "LabelLocalHttpServerPortNumberHelp": "HTTP 伺服器的 TCP 埠。", + "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "此設定也會影響透過此裝置投放的 Chromecast。", "LabelLoginDisclaimer": "登入字句:", "LabelLogs": "日誌:", "SubtitleDownloadersHelp": "按優先順序啟用並排列您的首選字幕下載程式。", @@ -1322,18 +1205,18 @@ "SystemDlnaProfilesHelp": "系統設定檔案是唯讀的,更改系統設定檔案將被儲存到自訂的新設定檔案。", "LabelNumber": "編號:", "LabelNumberOfGuideDays": "下載電視指南日數:", - "OnlyForcedSubtitlesHelp": "僅被標記為「強制」的字幕會被載入。", + "OnlyForcedSubtitlesHelp": "僅標記為「強制」的字幕會被載入。", "PackageInstallCompleted": "{0} (版本 {1}) 安裝完成。", "OptionDisplayFolderViewHelp": "在其他媒體庫旁邊顯示資料夾,對想要一個普通的資料夾檢視很有用。", "LabelReasonForTranscoding": "轉檔原因:", "LabelRecord": "錄影:", "LabelRecordingPath": "預設錄影路徑:", "LabelRecordingPathHelp": "指定用於存儲轉檔的位置,留空將使用伺服器的程式根目錄。", - "LabelRemoteClientBitrateLimitHelp": "所有網路裝置都有可選的流位元率限制,這對於防止設備請求比網路連接所能處理的更高的位元率非常有用。這可能會導致伺服器上的 CPU 負載增加,以便將影片轉檔到較低的位元率。", + "LabelRemoteClientBitrateLimitHelp": "所有網路裝置都能夠調整流位元率限制,這對於防止設備請求比網路連接所能處理的更高的位元率非常有用。這可能會導致伺服器上的 CPU 負載增加,以便將影片轉檔到較低的位元率。", "SmartSubtitlesHelp": "當音訊為外語時,將載入與語言偏好匹配的字幕。", "SubtitleAppearanceSettingsDisclaimer": "這些設定將不會套用在圖形字幕(如 PGS、DVD 等),或者一些有著自己的內建樣式的字幕(ASS/SSA)。", "UserAgentHelp": "提供自訂的使用者代理 HTTP 標頭。", - "LabelRuntimeMinutes": "播放時長(分鐘):", + "LabelRuntimeMinutes": "播放時間:", "LabelScheduledTaskLastRan": "最後執行 {0},花費時間 {1}。", "LabelSkipForwardLength": "快轉長度:", "LabelSkipIfAudioTrackPresent": "如果預設音軌的語言和下載語言一樣則跳過", @@ -1343,7 +1226,6 @@ "LabelSonyAggregationFlagsHelp": "決定在 urn:schemas-dlna-org:device-1-0 namespace 中的 aggregationFlags 元素的內容。", "LabelSortOrder": "排列順序:", "LabelSortTitle": "短標題:", - "LabelSoundEffects": "音效:", "LabelSource": "來源:", "LabelSpecialSeasonsDisplayName": "SP 季顯示名稱:", "LabelSportsCategories": "體育分類:", @@ -1351,7 +1233,7 @@ "LabelVaapiDevice": "VA API 裝置:", "DashboardArchitecture": "架構:{0}", "MediaInfoSampleRate": "採樣率", - "MessageContactAdminToResetPassword": "請聯繫您的管理員來重置密碼。", + "MessageContactAdminToResetPassword": "請聯絡您的管理員來重設密碼。", "MessageUnsetContentHelp": "內容將顯示為純資料夾,建議使用中繼資料管理器設置子資料夾的內容類型。", "OptionAllowAudioPlaybackTranscoding": "允許播放需要轉檔的音訊", "OptionCustomUsers": "自訂", @@ -1360,18 +1242,18 @@ "XmlTvNewsCategoriesHelp": "有這些類別的節目會被當作新聞節目,以「|」來分隔多個項目。", "LabelKodiMetadataEnableExtraThumbsHelp": "為了相容 Kodi 主題,下載的圖片將被同時儲存在 extrafanart 和 extrathumbs 資料夾中。", "LabelInternetQuality": "網路畫質:", - "LabelKodiMetadataEnablePathSubstitutionHelp": "允許將圖片的路徑以伺服器路徑來替換。", - "LabelKodiMetadataSaveImagePathsHelp": "如果您的圖片檔案名稱不符合 Kodi 規範,建議啟用。", - "LabelKodiMetadataUser": "儲存這些使用者的觀看資料到 NFO 檔案裏:", + "LabelKodiMetadataEnablePathSubstitutionHelp": "允許將圖片的路徑以伺服器路徑取代。", + "LabelKodiMetadataSaveImagePathsHelp": "若如果您的圖片檔案名稱不符合 Kodi 規範,建議啟用。", + "LabelKodiMetadataUser": "儲存這些使用者的觀看資料到 NFO 檔案中:", "LabelKodiMetadataUserHelp": "儲存觀看資料到 NFO 檔案中以便其他應用程式使用。", - "LabelMetadataReadersHelp": "優先排序您的首選資料屬性來源,首個找到的文件將被讀取。", + "LabelMetadataReadersHelp": "優先排序您的中繼資料屬性來源,首個找到的文件將被讀取。", "LabelMetadataSavers": "中繼資料儲存方式:", "LabelModelDescription": "型號描述", "LabelModelName": "型號名稱", "LabelModelUrl": "型號網址", - "LabelMusicStreamingTranscodingBitrate": "音樂轉檔比特率:", - "LabelMusicStreamingTranscodingBitrateHelp": "指定音樂串流時的最大比特率。", - "LabelOptionalNetworkPathHelp": "如果這個資料夾在網路上分享,提供網路分享路徑可以供其他 Jellyfin 應用程式直接存取媒體檔案,例如 {0} 或者 {1}。", + "LabelMusicStreamingTranscodingBitrate": "音樂轉檔位元率:", + "LabelMusicStreamingTranscodingBitrateHelp": "指定音樂串流時的最大位元率。", + "LabelOptionalNetworkPathHelp": "如果這個資料夾在網路上分享,提供網路分享路徑可以供其他應用程式直接存取媒體檔案,例如 {0} 或者 {1}。", "LabelOriginalAspectRatio": "原始長寬比:", "LabelOverview": "內容概述:", "LabelParentalRating": "家長分級:", @@ -1390,16 +1272,14 @@ "LabelPostProcessorArguments": "處理器後命令行參數:", "LabelPostProcessorArgumentsHelp": "使用 {path} 作為錄製檔案的路徑。", "LabelPreferredDisplayLanguage": "首選語言:", - "LabelPreferredDisplayLanguageHelp": "歡迎一起翻譯 Jellyfin!", "LabelPreferredSubtitleLanguage": "字幕語言偏好:", "LabelProtocol": "協議:", "LabelProtocolInfo": "協議資訊:", - "LabelPublicHttpPort": "公開 HTTP 端口:", - "LabelPublicHttpsPort": "公開 HTTPS 端口:", + "LabelPublicHttpPort": "公開 HTTP 埠:", + "LabelPublicHttpsPort": "公開 HTTPS 埠:", "LabelProtocolInfoHelp": "當響應來自裝置的 GetProtocolInfo(獲取協議訊息)請求時,該值將被使用。", "LabelPublicHttpPortHelp": "公開連接埠應映射到本地 HTTP 連接埠。", "LabelPublicHttpsPortHelp": "公開連接埠應映射到本地 HTTPS 連接埠。", - "LabelReadHowYouCanContribute": "瞭解如何一同貢獻。", "LabelSelectFolderGroups": "自動將以下資料夾中的內容分組到視圖中,例如電影、音樂和電視:", "LabelStatus": "狀態:", "LiveBroadcasts": "直播", @@ -1410,62 +1290,56 @@ "SaveSubtitlesIntoMediaFoldersHelp": "將字幕存儲在影片檔案旁邊可以讓管理更方便。", "ScanForNewAndUpdatedFiles": "掃描新的和有修改的文件", "Schedule": "排程", - "TabCollections": "收藏", "TabNetworking": "網路", "TitlePlayback": "播放", "ValueConditions": "條件:{0}", "Vertical": "垂直", - "VideoRange": "影片範圍", "ViewPlaybackInfo": "查看播放訊息", "XmlTvSportsCategoriesHelp": "有這些類別的節目會被當作體育節目,以「|」來分隔多個項目。", "XmlTvPathHelp": "XML 電視檔案的路徑,Jellyfin 將讀取該檔案並定期檢查其更新,您負責建立和更新檔案。", - "MessageInvalidForgotPasswordPin": "簡易代碼錯誤或已過期,請再試一次。", + "MessageInvalidForgotPasswordPin": "簡易代碼錯誤或已過期,請重試。", "OptionAllowVideoPlaybackTranscoding": "允許播放需要轉檔的影片", "Small": "小", "Smaller": "更小", "XmlTvKidsCategoriesHelp": "有這些類別的節目會被當作兒童節目,以「|」來分隔多個項目。", "TabResponses": "響應", "LabelDisplaySpecialsWithinSeasons": "顯示劇集季度中的特集", - "LabelNumberOfGuideDaysHelp": "下載更多電視指南資料會提供更好時間表查看能力,但將需要更長的下載時間。自動基於頻道數目來選擇。", - "LabelOptionalNetworkPath": "(選用)分享的網路資料夾:", - "MessageInstallPluginFromApp": "必須從要在其中使用它的應用程式中安裝此模組。", + "LabelNumberOfGuideDaysHelp": "下載多日的節目指南可以幫你進一步查看節目列表並做出提前安排,但下載過程也將耗時更久。它將基於頻道數量自動選擇。", + "LabelOptionalNetworkPath": "分享的網路資料夾:", "OptionResElement": "res 元素", "PinCodeResetComplete": "PIN 碼已被重設。", "PinCodeResetConfirmation": "你確定要重設 PIN 碼?", - "PasswordResetProviderHelp": "選擇密碼重設提供者以便使用者重設密碼", + "PasswordResetProviderHelp": "選擇重設密碼提供者以便使用者重設密碼。", "PlaceFavoriteChannelsAtBeginning": "將喜愛的頻道置頂", "PlaybackData": "恢復播放資料", "OptionRandom": "隨機", "HeaderFavoritePeople": "最愛人物", - "XmlDocumentAttributeListHelp": "這些屬性會在每一個XML回應的根元素上應用。", + "XmlDocumentAttributeListHelp": "這些屬性會在每一個 XML 回應的根元素上套用。", "SkipEpisodesAlreadyInMyLibraryHelp": "劇集將使用季和劇集編號進行比較。", - "SelectAdminUsername": "請為管理員賬戶選擇一個用戶名。", - "CopyStreamURLError": "複製連結的時候發生錯誤。", - "OptionSaveMetadataAsHiddenHelp": "更改此項將應用於以後保存的元數據。現有元數據文件將在下一次 Jellyfin 伺服器保存它們時被更新。", + "SelectAdminUsername": "請為管理員帳戶選擇一個使用者名稱。", + "OptionSaveMetadataAsHiddenHelp": "更改此項將套用至未來保存的中繼資料。現有中繼資料檔案將在下一次伺服器儲存它們時被更新。", "OptionAllowRemoteSharedDevicesHelp": "DLNA裝置將被視為共享中,直至有使用者控制。", - "OptionForceRemoteSourceTranscoding": "强制遠端轉碼(像電視直播一樣)", + "OptionForceRemoteSourceTranscoding": "強制遠端轉檔(像電視直播一樣)", "MessageConfirmAppExit": "您要退出嗎?", - "LaunchWebAppOnStartupHelp": "伺服器啓動時在默認游覽器中打開網頁端。使用重啓伺服器功能時此項不生效。", - "LabelVideoResolution": "視頻解析度:", + "LabelVideoResolution": "影片解析度:", "LabelStreamType": "串流類型:", "LabelPlayerDimensions": "播放器尺寸:", "LabelDroppedFrames": "丟棄的幀:", "LabelCorruptedFrames": "損壞的幀:", "ButtonSplit": "分割", - "AskAdminToCreateLibrary": "如要建立資料庫,請聯繫管理員。", + "AskAdminToCreateLibrary": "如要建立資料庫,請聯絡管理員。", "NoCreatedLibraries": "看來您還未創任何媒體庫。{0}立刻創一個新的嗎?{1}", - "ClientSettings": "客戶端設定", - "AllowFfmpegThrottlingHelp": "當轉檔或重組進度大量超前目前播放進度時,將暫停轉檔節省消耗的資源。在不常跳播的時候最有效。如果遇到播放問題,請關閉此功能。", + "ClientSettings": "用戶端設定", + "AllowFfmpegThrottlingHelp": "當轉檔或重組進度遠超於目前播放進度時,將暫停轉檔節省消耗的資源。在不常跳播的時候最有效。如果遇到播放問題,請關閉此功能。", "AllowFfmpegThrottling": "限制轉檔", - "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "這將會使用內建劇集資料。", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "這將會使用內建中繼資料。", "PlaybackErrorNoCompatibleStream": "用戶端與該媒體不相容,伺服器也未傳送相容的媒體格式。", "PreferEmbeddedEpisodeInfosOverFileNames": "優先使用內建劇集資訊而不是檔案名稱", - "OtherArtist": "其他歌手", "Artist": "演出者", "AlbumArtist": "專輯歌手", "Album": "專輯", "YadifBob": "YADIF Bob", - "WriteAccessRequired": "Jellyfin 伺服器需要此資料夾的寫入權限,請確認是否擁有寫入權限並重試。", + "WriteAccessRequired": "伺服器需要此資料夾的寫入權限,請確認是否擁有寫入權限並重試。", "PathNotFound": "無法找到此路徑,請確認路徑可用並重試。", "Track": "音軌", "Yadif": "YADIF", @@ -1480,31 +1354,27 @@ "EveryXHours": "每 {0} 小時", "OnApplicationStartup": "當應用程式啟動時", "Season": "季", - "ReleaseGroup": "發行組織", "Person": "人物", "Movie": "電影", "LabelLibraryPageSizeHelp": "設置媒體庫頁面每頁要顯示的最多媒體個數。設置為 0 來停用分頁。", "LabelLibraryPageSize": "媒體庫分頁大小:", "LabelDeinterlaceMethod": "反交錯方法:", "Episode": "劇集", - "DeinterlaceMethodHelp": "選擇對隔行掃描內容進行轉碼時所用的反交錯方法。", + "DeinterlaceMethodHelp": "選擇對隔行掃描內容進行轉檔時所用的反交錯方法。", "BoxSet": "套裝", "UnsupportedPlayback": "Jellyfin 無法解密受 DRM 保護的內容,但仍然會嘗試播放所有內容。某些檔案由於被加密或包含如互動標題等不受支援的內容,在播放時可能會沒有畫面。", - "MessageUnauthorizedUser": "您目前無權存取伺服器,請與您的伺服器管理員聯繫以獲取更多訊息。", "Filter": "篩選器", "New": "新增", - "ApiKeysCaption": "目前已啟用的API金鑰列表", + "ApiKeysCaption": "目前已啟用的 API 金鑰清單", "ButtonTogglePlaylist": "播放清單", - "ButtonToggleContextMenu": "更多", "ButtonSyncPlay": "SyncPlay", "LabelRequireHttpsHelp": "開啟後伺服器將自動將所有 HTTP 請求導向 HTTPS。如果伺服器沒有啟用 HTTPS 則不生效。", "EnableFasterAnimationsHelp": "使用更快的動畫與過渡效果", "EnableFasterAnimations": "更快的動畫", "LabelRequireHttps": "強制 HTTPS", - "LabelNightly": "開發版", "LabelStable": "穩定版", "LabelChromecastVersion": "Chromecast 版本", - "LabelEnableHttpsHelp": "讓伺服器監聽指定的 HTTPS 端口。須設定有效的證書以便使其生效。", + "LabelEnableHttpsHelp": "監聽指定的 HTTPS 埠。須設定有效的證書使其生效。", "LabelEnableHttps": "啟用HTTPS", "HeaderServerAddressSettings": "伺服器位置設定", "HeaderRemoteAccessSettings": "遠端存取設定", @@ -1525,17 +1395,16 @@ "ShowLess": "顯示更少", "ShowMore": "顯示更多", "SyncPlayAccessHelp": "選取該使用者對同步播放的存取權。此功能能讓你與其他裝置同步播放進度。", - "EnableBlurhash": "啟用模糊的占位圖片", - "EnableBlurhashHelp": "尚未讀取完畢的圖片會先顯示模糊的版本", + "EnableBlurHash": "啟用模糊的占位圖片", + "EnableBlurHashHelp": "尚未讀取完畢的圖片會先顯示模糊的版本。", "ClearQueue": "清空佇列", "StopPlayback": "停止播放", "ButtonPlayer": "播放器", "ButtonCast": "投放", "Writers": "作者", "ViewAlbumArtist": "檢視專輯演出者", - "TabDVR": "DVR", "TabRepositories": "儲存庫", - "MessageSyncPlayErrorAccessingGroups": "存取群組列表時發生錯誤。", + "MessageSyncPlayErrorAccessingGroups": "存取群組清單時發生錯誤。", "MessageSyncPlayLibraryAccessDenied": "存取受限。", "MessageSyncPlayJoinGroupDenied": "需要同步播放之權限。", "MessageSyncPlayCreateGroupDenied": "需要建立群組之權限。", @@ -1564,5 +1433,13 @@ "MillisecondsUnit": "毫秒", "HeaderSyncPlayEnabled": "已啟用同步播放", "HeaderSyncPlaySelectGroup": "加入群組", - "HeaderDVR": "DVR" + "HeaderDVR": "DVR", + "SubtitleVerticalPositionHelp": "文字出現的行號。正數表示由上到下,負數表示由下到上。", + "MessagePluginInstallError": "安裝附加元件時發生了錯誤。", + "MessageGetInstalledPluginsError": "取得已安裝的附加元件清單時發生了錯誤。", + "Preview": "預覽", + "LabelSubtitleVerticalPosition": "垂直位置:", + "PreviousTrack": "上一首", + "NextTrack": "下一首", + "LabelUnstable": "不穩定" } diff --git a/src/styles/_mixins.scss b/src/styles/_mixins.scss new file mode 100644 index 0000000000..ed23ab0833 --- /dev/null +++ b/src/styles/_mixins.scss @@ -0,0 +1,23 @@ +@mixin background-cover($position) { + background-position: $position; + background-repeat: no-repeat; + background-size: cover; +} + +@mixin circle($size) { + @include square($size); + border-radius: 100%; +} + +@mixin position($position, $top: null, $right: null, $bottom: null, $left: null) { + position: $position; + top: $top; + right: $right; + bottom: $bottom; + left: $left; +} + +@mixin square($size) { + height: $size; + width: $size; +} diff --git a/yarn.lock b/yarn.lock index ef66f04419..d3aee5fe79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,16 +18,16 @@ invariant "^2.2.4" semver "^5.5.0" -"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.0.tgz#73b9c33f1658506887f767c26dae07798b30df76" - integrity sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg== +"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.11.4": + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.4.tgz#4301dfdfafa01eeb97f1896c5501a3f0655d4229" + integrity sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" + "@babel/generator" "^7.11.4" "@babel/helper-module-transforms" "^7.11.0" "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.0" + "@babel/parser" "^7.11.4" "@babel/template" "^7.10.4" "@babel/traverse" "^7.11.0" "@babel/types" "^7.11.0" @@ -40,26 +40,26 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/eslint-parser@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.11.0.tgz#b123924edd44508782c030066c926f1b807151cd" - integrity sha512-dJDM2Pc01D9TwKL3Mmz2xgVF9X953RBHq9H4gywbN1q8MrfvXmNHfsCt06vvByBVQqm+9WxMs+doEH/R09TwWQ== +"@babel/eslint-parser@^7.11.4": + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.11.4.tgz#f79bac69088097a8418f5c67fc462c89a72c2f48" + integrity sha512-syIzsqEUvmc6WEYbLqrvBODCM1wMo3SQ4h4G9gtCcQctv1VUlA5davRAWHFm7ncQlxcJs4I7kaflsnAP8iA8Aw== dependencies: eslint-scope "5.1.0" eslint-visitor-keys "^1.3.0" semver "^6.3.0" -"@babel/eslint-plugin@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.11.0.tgz#55d5b6bd29859cabce152f16d01b3a8150d5b295" - integrity sha512-+gfPM0/T6d25jKBgmxWp38W0jqRs16Vt7DPBxGOcnN/7nS2A/6QoaXOYEaccvWS5a9UpWlMIAylivp6UtH8/sQ== +"@babel/eslint-plugin@^7.11.3": + version "7.11.3" + resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.11.3.tgz#66b531f90592f8f0621d072b59ea2c37c91e8d0d" + integrity sha512-gmi3lgaWlYpNb+h7qPfv5GVz2ZVwzCDyV+kAGj+3il+Mv5uan5Yccvdw7m14UAAY2tdTbB0VgRF6ZLjUbrUm0g== dependencies: eslint-rule-composer "^0.3.0" -"@babel/generator@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== +"@babel/generator@^7.11.0", "@babel/generator@^7.11.4": + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.4.tgz#1ec7eec00defba5d6f83e50e3ee72ae2fee482be" + integrity sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g== dependencies: "@babel/types" "^7.11.0" jsesc "^2.5.1" @@ -281,10 +281,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.4", "@babel/parser@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz#a9d7e11aead25d3b422d17b2c6502c8dddef6a5d" - integrity sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw== +"@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.4": + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.4.tgz#6fa1a118b8b0d80d0267b719213dc947e88cc0ca" + integrity sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA== "@babel/plugin-proposal-async-generator-functions@^7.10.4": version "7.10.4" @@ -1265,10 +1265,10 @@ acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== after@0.8.2: version "0.8.2" @@ -1294,9 +1294,9 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5: - version "6.12.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" - integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== + version "6.12.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" + integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -1335,13 +1335,6 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - ansi-gray@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" @@ -2375,7 +2368,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2420,11 +2413,6 @@ character-reference-invalid@^1.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - chokidar@^2.0.0, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -2505,18 +2493,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -2775,6 +2751,11 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" +confusing-browser-globals@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" + integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== + connect-history-api-fallback@^1: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" @@ -2969,7 +2950,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -2980,6 +2961,15 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -3025,16 +3015,15 @@ css-has-pseudo@^0.10.0: postcss "^7.0.6" postcss-selector-parser "^5.0.0-rc.4" -css-loader@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.2.0.tgz#b57efb92ac8f0cd85bf92d89df9634ef1f51b8bf" - integrity sha512-ko7a9b0iFpWtk9eSI/C8IICvZeGtYnjxYjw45rJprokXj/+kBd/siX4vAIBq9Uij8Jubc4jL1EvSnTjCEwaHSw== +css-loader@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.2.2.tgz#b668b3488d566dc22ebcf9425c5f254a05808c89" + integrity sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg== dependencies: camelcase "^6.0.0" cssesc "^3.0.0" icss-utils "^4.1.1" loader-utils "^2.0.0" - normalize-path "^3.0.0" postcss "^7.0.32" postcss-modules-extract-imports "^2.0.0" postcss-modules-local-by-default "^3.0.3" @@ -3229,10 +3218,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-fns@^2.15.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.15.0.tgz#424de6b3778e4e69d3ff27046ec136af58ae5d5f" - integrity sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ== +date-fns@^2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.0.tgz#d34f0f5f2fd498c984513042e8f7247ea86c4cb7" + integrity sha512-DWTRyfOA85sZ4IiXPHhiRIOs3fW5U6Msrp+gElXARa6EpoQTXPyHQmh7hr+ssw2nx9FtOQWnAMJKgL5vaJqILw== dateformat@^2.0.0: version "2.2.0" @@ -3354,7 +3343,7 @@ decompress@^4.0.0, decompress@^4.2.0: pify "^2.3.0" strip-dirs "^2.0.0" -deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -3804,6 +3793,13 @@ enhanced-resolve@^4.3.0: memory-fs "^0.5.0" tapable "^1.0.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -4014,7 +4010,7 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@5.1.0: +eslint-scope@5.1.0, eslint-scope@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== @@ -4030,47 +4026,35 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== - -eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint@^7.7.0: + version "7.7.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.7.0.tgz#18beba51411927c4b64da0a8ceadefe4030d6073" + integrity sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" + chalk "^4.0.0" + cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" + enquirer "^2.3.5" + eslint-scope "^5.1.0" + eslint-utils "^2.1.0" + eslint-visitor-keys "^1.3.0" + espree "^7.2.0" + esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" @@ -4079,40 +4063,38 @@ eslint@^6.8.0: ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" + levn "^0.4.1" + lodash "^4.17.19" minimatch "^3.0.4" - mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.3" + optionator "^0.9.1" progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" table "^5.2.3" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== +espree@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" + integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g== dependencies: - acorn "^7.1.1" + acorn "^7.3.1" acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" + eslint-visitor-keys "^1.3.0" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: +esquery@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== @@ -4292,15 +4274,6 @@ extend@3.0.2, extend@^3.0.0, extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -4336,9 +4309,9 @@ fancy-log@^1.1.0, fancy-log@^1.3.2, fancy-log@^1.3.3: time-stamp "^1.0.0" fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^2.2.6: version "2.2.7" @@ -4369,7 +4342,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -4406,13 +4379,6 @@ figures@^1.3.5: escape-string-regexp "^1.0.5" object-assign "^4.1.0" -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-4.0.0.tgz#633567d15364aefe0b299e1e217735e8f3a9f6e8" @@ -5290,11 +5256,12 @@ gulp-sourcemaps@^2.6.5: strip-bom-string "1.X" through2 "2.X" -gulp-terser@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.2.1.tgz#d5b0ee7ebb1107c1a7bb92449629b07a1951b896" - integrity sha512-wFWfO6hqPwHbzyulA67ZiC2mFXQO4bPno82cvL/V6qZsFXvYxKeeFuLSNsv+i/POhyfNJLkDrcye4rRxkvJUAA== +gulp-terser@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.4.0.tgz#0ac4dfdbed4ab46906007c5b358810c1642b9764" + integrity sha512-7df9leJna3WOmj76tYHxjpn7BSU+vmKVjVSd6bz3uLEyrzCfZI97KPhRcIabrSNzs0UY/UXTt+JwkxPw3sF85w== dependencies: + is-promise "^4.0.0" plugin-error "^1.0.1" terser ">=4" through2 "^4.0.2" @@ -5492,10 +5459,10 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== -hls.js@^0.14.7: - version "0.14.7" - resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.14.7.tgz#47fbd2662b13121ab17c07aea06b1c07828240cf" - integrity sha512-9JY0D9nwMrfQPRWc8/kEJTKK0TYfDTzIs6Xq+gdCvasRxdvQKQ2T76rdueTkS0AsFV6sQlJN0wxbnI44aRvvUA== +hls.js@^0.14.10: + version "0.14.10" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.14.10.tgz#51365ecc2764066e6b4379587aee64c1e181f683" + integrity sha512-muBt5Gxhapgk2uV8aEKRYe9GJ6AI5niFfDuOd8ZXHga519RNJ0+QAeRPdEpl1QKMqj1lT/6r/WKVnLL+ePB6ow== dependencies: eventemitter3 "^4.0.3" url-toolkit "^2.1.6" @@ -5653,7 +5620,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5860,25 +5827,6 @@ ini@^1.3.4, ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^3.0.0" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - interpret@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -6213,6 +6161,11 @@ is-promise@^2.1: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + is-regex@^1.0.5, is-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" @@ -6395,9 +6348,9 @@ js-base64@^2.1.8, js-base64@^2.1.9: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -6599,13 +6552,13 @@ levenary@^1.1.1: dependencies: leven "^3.1.0" -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" + prelude-ls "^1.2.1" + type-check "~0.4.0" "libass-wasm@https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf-smarttv": version "4.0.0" @@ -7275,11 +7228,6 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -7412,11 +7360,6 @@ mute-stdout@^1.0.0: resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nan@^2.12.1, nan@^2.13.2: version "2.14.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" @@ -7815,13 +7758,6 @@ once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - openurl@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" @@ -7834,17 +7770,17 @@ opn@5.3.0: dependencies: is-wsl "^1.1.0" -optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" optipng-bin@^6.0.0: version "6.0.0" @@ -7886,7 +7822,7 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -8208,6 +8144,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -9118,10 +9059,10 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.1 source-map "^0.6.1" supports-color "^6.1.0" -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prepend-http@^1.0.1: version "1.0.4" @@ -9514,10 +9455,10 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== regexpu-core@^4.7.0: version "4.7.0" @@ -9831,14 +9772,6 @@ responselike@1.0.2: dependencies: lowercase-keys "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -9888,11 +9821,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" @@ -9917,13 +9845,6 @@ rxjs@^5.5.6: dependencies: symbol-observable "1.0.1" -rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -10038,12 +9959,12 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.2, semver@^7.3.2: +semver@7.3.2, semver@^7.2.1, semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -10162,11 +10083,23 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -10774,10 +10707,10 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" - integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== +strip-json-comments@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-outer@^1.0.0: version "1.0.1" @@ -10985,7 +10918,7 @@ supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -11185,7 +11118,7 @@ through2@^4.0.2: dependencies: readable-stream "3" -through@^2.3.6, through@^2.3.8, through@~2.3.4: +through@^2.3.8, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -11220,13 +11153,6 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - to-absolute-glob@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" @@ -11361,11 +11287,16 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.9.0: +tslib@^1.10.0: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +tslib@^1.9.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -11383,17 +11314,12 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - prelude-ls "~1.1.2" - -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + prelude-ls "^1.2.1" type-fest@^0.13.1: version "0.13.1" @@ -12013,17 +11939,17 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-stream@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-5.2.1.tgz#35c992161399fe8cad9c10d4a5c258f022629b39" - integrity sha512-WvyVU0K1/VB1NZ7JfsaemVdG0PXAQUqbjUNW4A58th4pULvKMQxG+y33HXTL02JvD56ko2Cub+E2NyPwrLBT/A== +webpack-stream@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-6.0.0.tgz#0524b739a3c3a487362ee2e97522d0b8d366a510" + integrity sha512-bYv7apmGB1j0JBpa5Fgyky/1mWyzHOnUPXv+RmkgpK4FXPWCMBspgnYFmhE7Ly68JSp77eonFzm6WArWy4afpQ== dependencies: fancy-log "^1.3.3" lodash.clone "^4.3.2" lodash.some "^4.2.2" - memory-fs "^0.4.1" + memory-fs "^0.5.0" plugin-error "^1.0.1" - supports-color "^5.5.0" + supports-color "^7.1.0" through "^2.3.8" vinyl "^2.1.0" webpack "^4.26.1" @@ -12062,10 +11988,10 @@ webworkify@^1.5.0: resolved "https://registry.yarnpkg.com/webworkify/-/webworkify-1.5.0.tgz#734ad87a774de6ebdd546e1d3e027da5b8f4a42c" integrity sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g== -whatwg-fetch@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz#8e134f701f0a4ab5fda82626f113e2b647fd16dc" - integrity sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w== +whatwg-fetch@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.0.tgz#e11de14f4878f773fbebcde8871b2c0699af8b30" + integrity sha512-rsum2ulz2iuZH08mJkT0Yi6JnKhwdw4oeyMjokgxd+mmqYSd9cPpOQf01TIWgjxG/U4+QR+AwKq6lSbXVxkyoQ== which-module@^1.0.0: version "1.0.0" @@ -12084,6 +12010,13 @@ which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -12091,7 +12024,7 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -word-wrap@~1.2.3: +word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==