Merge remote-tracking branch 'upstream/master' into slideshow-zoom

This commit is contained in:
MrTimscampi 2020-04-04 00:04:23 +02:00
commit e32fe240b7
100 changed files with 2984 additions and 2752 deletions

View File

@ -33,7 +33,7 @@ jobs:
- task: NodeTool@0
displayName: 'Install Node'
inputs:
versionSpec: '10.x'
versionSpec: '12.x'
- task: Cache@2
displayName: 'Check Cache'
@ -82,7 +82,7 @@ jobs:
- task: NodeTool@0
displayName: 'Install Node'
inputs:
versionSpec: '10.x'
versionSpec: '12.x'
- task: Cache@2
displayName: 'Check Cache'

View File

@ -3,6 +3,12 @@ env:
browser: true
amd: true
parserOptions:
ecmaVersion: 6
sourceType: module
ecmaFeatures:
impliedStrict: true
globals:
# New browser globals
DataView: readonly

584
.gitignore vendored
View File

@ -1,578 +1,10 @@
# config
config.json
# Created by https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode
# Edit at https://www.gitignore.io/?templates=node,rider,macos,linux,windows,visualstudio,visualstudiocode
### Linux ###
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Dependency lockfile
package-lock.json
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
### Rider ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
### Windows ###
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
### VisualStudio ###
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true
**/wwwroot/lib/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- Backup*.rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# End of https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode
# dist for webpack output
# npm
dist
node_modules
# ide
.idea
.vscode

View File

@ -18,16 +18,42 @@ const stream = require('webpack-stream');
const inject = require('gulp-inject');
const postcss = require('gulp-postcss');
const sass = require('gulp-sass');
sass.compiler = require('node-sass')
const gulpif = require('gulp-if');
const lazypipe = require('lazypipe');
sass.compiler = require('node-sass');
let config;
if (mode.production()) {
var config = require('./webpack.prod.js');
config = require('./webpack.prod.js');
} else {
var config = require('./webpack.dev.js');
config = require('./webpack.dev.js');
}
const options = {
javascript: {
query: ['src/**/*.js', '!src/bundle.js', '!src/standalone.js', '!src/scripts/apploader.js']
},
apploader: {
query: ['src/standalone.js', 'src/scripts/apploader.js']
},
css: {
query: ['src/**/*.css', 'src/**/*.scss']
},
html: {
query: ['src/**/*.html', '!src/index.html']
},
images: {
query: ['src/**/*.png', 'src/**/*.jpg', 'src/**/*.gif', 'src/**/*.svg']
},
copy: {
query: ['src/**/*.json', 'src/**/*.ico']
},
injectBundle: {
query: 'src/index.html'
}
};
function serve() {
browserSync.init({
server: {
@ -36,51 +62,99 @@ function serve() {
port: 8080
});
watch(['src/**/*.js', '!src/bundle.js'], javascript);
watch('src/bundle.js', webpack);
watch('src/**/*.css', css);
watch(['src/**/*.html', '!src/index.html'], html);
watch(['src/**/*.png', 'src/**/*.jpg', 'src/**/*.gif', 'src/**/*.svg'], images);
watch(['src/**/*.json', 'src/**/*.ico'], copy);
watch('src/index.html', injectBundle);
watch(['src/standalone.js', 'src/scripts/apploader.js'], standalone);
}
let events = ['add', 'change'];
function standalone() {
return src(['src/standalone.js', 'src/scripts/apploader.js'], { base: './src/' })
.pipe(concat('scripts/apploader.js'))
.pipe(dest('dist/'));
watch(options.javascript.query).on('all', function (event, path) {
if (events.includes(event)) {
javascript(path);
}
});
watch(options.apploader.query, apploader(true));
watch('src/bundle.js', webpack);
watch(options.css.query).on('all', function (event, path) {
if (events.includes(event)) {
css(path);
}
});
watch(options.html.query).on('all', function (event, path) {
if (events.includes(event)) {
html(path);
}
});
watch(options.images.query).on('all', function (event, path) {
if (events.includes(event)) {
images(path);
}
});
watch(options.copy.query).on('all', function (event, path) {
if (events.includes(event)) {
copy(path);
}
});
watch(options.injectBundle.query, injectBundle);
}
function clean() {
return del(['dist/']);
}
function javascript() {
return src(['src/**/*.js', '!src/bundle.js'], { base: './src/' })
.pipe(mode.development(sourcemaps.init({ loadMaps: true })))
.pipe(babel({
let pipelineJavascript = lazypipe()
.pipe(function () {
return mode.development(sourcemaps.init({ loadMaps: true }));
})
.pipe(function () {
return babel({
presets: [
['@babel/preset-env']
]
}))
.pipe(terser({
});
})
.pipe(function () {
return terser({
keep_fnames: true,
mangle: false
}))
.pipe(mode.development(sourcemaps.write('.')))
});
})
.pipe(function () {
return mode.development(sourcemaps.write('.'));
});
function javascript(query) {
return src(typeof query !== 'function' ? query : options.javascript.query, { base: './src/' })
.pipe(pipelineJavascript())
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function apploader(standalone) {
function task() {
return src(options.apploader.query, { base: './src/' })
.pipe(gulpif(standalone, concat('scripts/apploader.js')))
.pipe(pipelineJavascript())
.pipe(dest('dist/'))
.pipe(browserSync.stream());
};
task.displayName = 'apploader';
return task;
}
function webpack() {
return stream(config)
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function css() {
return src(['src/**/*.css', 'src/**/*.scss'], { base: './src/' })
function css(query) {
return src(typeof query !== 'function' ? query : options.css.query, { base: './src/' })
.pipe(mode.development(sourcemaps.init({ loadMaps: true })))
.pipe(sass().on('error', sass.logError))
.pipe(postcss())
@ -89,28 +163,28 @@ function css() {
.pipe(browserSync.stream());
}
function html() {
return src(['src/**/*.html', '!src/index.html'], { base: './src/' })
function html(query) {
return src(typeof query !== 'function' ? query : options.html.query, { base: './src/' })
.pipe(mode.production(htmlmin({ collapseWhitespace: true })))
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function images() {
return src(['src/**/*.png', 'src/**/*.jpg', 'src/**/*.gif', 'src/**/*.svg'], { base: './src/' })
function images(query) {
return src(typeof query !== 'function' ? query : options.images.query, { base: './src/' })
.pipe(mode.production(imagemin()))
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function copy() {
return src(['src/**/*.json', 'src/**/*.ico'], { base: './src/' })
function copy(query) {
return src(typeof query !== 'function' ? query : options.copy.query, { base: './src/' })
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function injectBundle() {
return src('src/index.html', { base: './src/' })
return src(options.injectBundle.query, { base: './src/' })
.pipe(inject(
src(['src/scripts/apploader.js'], { read: false }, { base: './src/' }), { relative: true }
))
@ -118,6 +192,10 @@ function injectBundle() {
.pipe(browserSync.stream());
}
exports.default = series(clean, parallel(javascript, webpack, css, html, images, copy), injectBundle)
exports.standalone = series(exports.default, standalone)
exports.serve = series(exports.standalone, serve)
function build(standalone) {
return series(clean, parallel(javascript, apploader(standalone), webpack, css, html, images, copy), injectBundle);
}
exports.default = build(false);
exports.standalone = build(true);
exports.serve = series(exports.standalone, serve);

View File

@ -6,6 +6,7 @@
"license": "GPL-2.0-or-later",
"devDependencies": {
"@babel/core": "^7.8.6",
"@babel/plugin-transform-modules-amd": "^7.8.3",
"@babel/polyfill": "^7.8.7",
"@babel/preset-env": "^7.8.6",
"autoprefixer": "^9.7.4",
@ -17,12 +18,13 @@
"cssnano": "^4.1.10",
"del": "^5.1.0",
"eslint": "^6.8.0",
"file-loader": "^5.0.2",
"file-loader": "^6.0.0",
"gulp": "^4.0.2",
"gulp-babel": "^8.0.0",
"gulp-cli": "^2.2.0",
"gulp-concat": "^2.6.1",
"gulp-htmlmin": "^5.0.1",
"gulp-if": "^3.0.0",
"gulp-imagemin": "^7.1.0",
"gulp-inject": "^5.0.5",
"gulp-mode": "^1.0.2",
@ -30,7 +32,8 @@
"gulp-sass": "^4.0.2",
"gulp-sourcemaps": "^2.6.5",
"gulp-terser": "^1.2.0",
"html-webpack-plugin": "^3.2.0",
"html-webpack-plugin": "^4.0.2",
"lazypipe": "^1.0.2",
"node-sass": "^4.13.1",
"postcss-loader": "^3.0.0",
"postcss-preset-env": "^6.7.0",
@ -56,14 +59,13 @@
"jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto",
"jquery": "^3.4.1",
"jstree": "^3.3.7",
"libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus",
"libjass": "^0.11.0",
"libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf",
"material-design-icons-iconfont": "^5.0.1",
"native-promise-only": "^0.8.0-a",
"page": "^1.11.5",
"query-string": "^6.11.1",
"resize-observer-polyfill": "^1.5.1",
"shaka-player": "^2.5.9",
"shaka-player": "^2.5.10",
"sortablejs": "^1.10.2",
"swiper": "^5.3.1",
"webcomponents.js": "^0.7.24",
@ -72,6 +74,24 @@
"babel": {
"presets": [
"@babel/preset-env"
],
"overrides": [
{
"test": [
"src/components/autoFocuser.js",
"src/components/cardbuilder/cardBuilder.js",
"src/components/dom.js",
"src/components/filedownloader.js",
"src/components/filesystem.js",
"src/components/input/keyboardnavigation.js",
"src/components/sanatizefilename.js",
"src/scripts/settings/webSettings.js",
"src/components/scrollManager.js"
],
"plugins": [
"@babel/plugin-transform-modules-amd"
]
}
]
},
"browserslist": [

View File

@ -63,6 +63,10 @@ progress[aria-valuenow]::before {
}
.adminDrawerLogo {
display: none;
}
.layout-mobile .adminDrawerLogo {
padding: 1.5em 1em 1.2em;
border-bottom: 1px solid #e0e0e0;
margin-bottom: 1em;
@ -161,7 +165,7 @@ div[data-role=controlgroup] a.ui-btn-active {
@media all and (min-width: 40em) {
.content-primary {
padding-top: 7em;
padding-top: 4.6em;
}
.withTabs .content-primary {

View File

@ -21,7 +21,7 @@
}
.libraryPage {
padding-top: 7em !important;
padding-top: 7em;
}
.itemDetailPage {
@ -115,7 +115,7 @@
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: inline-flex;
margin: 0.3em 0 0 0.5em;
margin: 0 0 0 0.5em;
height: 1.7em;
-webkit-box-align: center;
-webkit-align-items: center;
@ -128,6 +128,10 @@
margin-top: 0;
}
.layout-mobile .pageTitleWithDefaultLogo {
background-image: url(../img/icon-transparent.png);
}
.headerLeft,
.skinHeader {
display: -webkit-box;
@ -242,7 +246,6 @@
}
@media all and (min-width: 40em) {
.dashboardDocument .adminDrawerLogo,
.dashboardDocument .mainDrawerButton {
display: none !important;
}
@ -268,12 +271,6 @@
}
}
@media all and (max-width: 60em) {
.libraryDocument .mainDrawerButton {
display: none;
}
}
@media all and (max-width: 84em) {
.withSectionTabs .headerTop {
padding-bottom: 0.55em;
@ -316,7 +313,7 @@
}
.dashboardDocument .mainDrawer-scrollContainer {
margin-top: 6em !important;
margin-top: 4.6em !important;
}
}
@ -1122,3 +1119,50 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
.itemsViewSettingsContainer > .button-flat {
margin: 0;
}
.layout-mobile #myPreferencesMenuPage {
padding-top: 3.75em;
}
.itemDetailsGroup {
margin-bottom: 1.5em;
}
.trackSelections {
max-width: 44em;
}
.detailsGroupItem,
.trackSelections .selectContainer {
display: flex;
max-width: 44em;
margin: 0 0 0.5em !important;
}
.trackSelections .selectContainer {
margin: 0 0 0.3em !important;
}
.detailsGroupItem .label,
.trackSelections .selectContainer .selectLabel {
cursor: default;
flex-grow: 0;
flex-shrink: 0;
flex-basis: 6.25em;
margin: 0 0.6em 0 0;
}
.trackSelections .selectContainer .selectLabel {
margin: 0 0.2em 0 0;
}
.trackSelections .selectContainer .detailTrackSelect {
font-size: inherit;
padding: 0;
overflow: hidden;
}
.trackSelections .selectContainer .selectArrowContainer .selectArrow {
margin-top: 0;
font-size: 1.4em;
}

View File

@ -84,13 +84,6 @@ _define("webcomponents", function() {
return webcomponents;
});
// libjass
var libjass = require("libjass");
require("libjass/libjass.css");
_define("libjass", function() {
return libjass;
});
// libass-wasm
var libass_wasm = require("libass-wasm");
_define("JavascriptSubtitlesOctopus", function() {

View File

@ -511,9 +511,16 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
return baseRoute;
}
var popstateOccurred = false;
window.addEventListener('popstate', function () {
popstateOccurred = true;
});
function getHandler(route) {
return function (ctx, next) {
ctx.isBack = popstateOccurred;
handleRoute(ctx, next, route);
popstateOccurred = false;
};
}

View File

@ -1,4 +1,4 @@
define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSettings, browser, events, htmlMediaHelper) {
define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], function (appSettings, browser, events, htmlMediaHelper, webSettings) {
"use strict";
function getBaseProfileOptions(item) {
@ -276,15 +276,17 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet
features.push("otherapppromotions");
features.push("displaymode");
features.push("targetblank");
// allows users to connect to more than one server
//features.push("multiserver");
features.push("screensaver");
if (!browser.orsay && !browser.tizen && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) {
webSettings.enableMultiServer().then(enabled => {
if (enabled) features.push("multiserver")
})
if (!browser.orsay && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) {
features.push("subtitleappearancesettings");
}
if (!browser.orsay && !browser.tizen) {
if (!browser.orsay) {
features.push("subtitleburnsettings");
}

View File

@ -1,22 +1,29 @@
define(["focusManager", "layoutManager"], function (focusManager, layoutManager) {
"use strict";
/* eslint-disable indent */
/**
* Module for performing auto-focus.
* @module components/autoFocuser
*/
import focusManager from "focusManager";
import layoutManager from "layoutManager";
/**
* Previously selected element.
*/
var activeElement;
let activeElement;
/**
* Returns true if AutoFocuser is enabled.
* Returns _true_ if AutoFocuser is enabled.
*/
function isEnabled() {
export function isEnabled() {
return layoutManager.tv;
}
/**
* Start AutoFocuser
* Start AutoFocuser.
*/
function enable() {
export function enable() {
if (!isEnabled()) {
return;
}
@ -28,24 +35,19 @@ define(["focusManager", "layoutManager"], function (focusManager, layoutManager)
console.debug("AutoFocuser enabled");
}
/**
* Create an array from some source.
*/
var arrayFrom = Array.prototype.from || function (src) {
return Array.prototype.slice.call(src);
}
/**
* Set focus on a suitable element, taking into account the previously selected.
* @param {HTMLElement} [container] - Element to limit scope.
* @returns {HTMLElement} Focused element.
*/
function autoFocus(container) {
export function autoFocus(container) {
if (!isEnabled()) {
return;
return null;
}
container = container || document.body;
var candidates = [];
let candidates = [];
if (activeElement) {
// These elements are recreated
@ -62,10 +64,10 @@ define(["focusManager", "layoutManager"], function (focusManager, layoutManager)
candidates.push(activeElement);
}
candidates = candidates.concat(arrayFrom(container.querySelectorAll(".btnResume")));
candidates = candidates.concat(arrayFrom(container.querySelectorAll(".btnPlay")));
candidates = candidates.concat(Array.from(container.querySelectorAll(".btnResume")));
candidates = candidates.concat(Array.from(container.querySelectorAll(".btnPlay")));
var focusedElement;
let focusedElement;
candidates.every(function (element) {
if (focusManager.isCurrentlyFocusable(element)) {
@ -79,7 +81,7 @@ define(["focusManager", "layoutManager"], function (focusManager, layoutManager)
if (!focusedElement) {
// FIXME: Multiple itemsContainers
var itemsContainer = container.querySelector(".itemsContainer");
const itemsContainer = container.querySelector(".itemsContainer");
if (itemsContainer) {
focusedElement = focusManager.autoFocus(itemsContainer);
@ -93,9 +95,8 @@ define(["focusManager", "layoutManager"], function (focusManager, layoutManager)
return focusedElement;
}
return {
export default {
isEnabled: isEnabled,
enable: enable,
autoFocus: autoFocus
};
});

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,34 @@
define([], function() {
'use strict';
if (window.appMode === "cordova" || window.appMode === "android") {
return {
load: function () {
window.chrome = window.chrome || {};
return Promise.resolve();
}
};
} else {
var ccLoaded = false;
return {
load: function () {
if (ccLoaded) {
return Promise.resolve();
}
return new Promise(function (resolve, reject) {
var fileref = document.createElement("script");
fileref.setAttribute("type", "text/javascript");
fileref.onload = function () {
ccLoaded = true;
resolve();
};
fileref.setAttribute("src", "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js");
document.querySelector("head").appendChild(fileref);
});
}
};
}
});

View File

@ -1,18 +1,7 @@
define(["dialogHelper", "loading", "connectionManager", "globalize", "actionsheet", "emby-input", "paper-icon-button-light", "emby-button", "listViewStyle", "material-icons", "formDialogStyle"], function (dialogHelper, loading, connectionManager, globalize, actionsheet) {
define(["dom", "dialogHelper", "loading", "connectionManager", "globalize", "actionsheet", "emby-input", "paper-icon-button-light", "emby-button", "listViewStyle", "material-icons", "formDialogStyle"], function (dom, dialogHelper, loading, connectionManager, globalize, actionsheet) {
"use strict";
return function (options) {
function parentWithClass(elem, className) {
while (!elem.classList || !elem.classList.contains(className)) {
elem = elem.parentNode;
if (!elem) {
return null;
}
}
return elem;
}
function mapChannel(button, channelId, providerChannelId) {
loading.show();
var providerId = options.providerId;
@ -26,7 +15,7 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee
},
dataType: "json"
}).then(function (mapping) {
var listItem = parentWithClass(button, "listItem");
var listItem = dom.parentWithClass(button, "listItem");
button.setAttribute("data-providerid", mapping.ProviderChannelId);
listItem.querySelector(".secondary").innerHTML = getMappingSecondaryName(mapping, currentMappingOptions.ProviderName);
loading.hide();
@ -34,7 +23,7 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee
}
function onChannelsElementClick(e) {
var btnMap = parentWithClass(e.target, "btnMap");
var btnMap = dom.parentWithClass(e.target, "btnMap");
if (btnMap) {
var channelId = btnMap.getAttribute("data-id");

View File

@ -1,25 +1,12 @@
define(['dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (dialogHelper, loading, appHost, layoutManager, connectionManager, appRouter, globalize) {
define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (dom, dialogHelper, loading, appHost, layoutManager, connectionManager, appRouter, globalize) {
'use strict';
var currentServerId;
function parentWithClass(elem, className) {
while (!elem.classList || !elem.classList.contains(className)) {
elem = elem.parentNode;
if (!elem) {
return null;
}
}
return elem;
}
function onSubmit(e) {
loading.show();
var panel = parentWithClass(this, 'dialog');
var panel = dom.parentWithClass(this, 'dialog');
var collectionId = panel.querySelector('#selectCollectionToAddTo').value;

View File

@ -1,40 +1,65 @@
define(['dialog', 'globalize'], function (dialog, globalize) {
define(["browser", "dialog", "globalize"], function(browser, dialog, globalize) {
'use strict';
return function (text, title) {
function replaceAll(str, find, replace) {
return str.split(find).join(replace);
}
var options;
if (typeof text === 'string') {
options = {
title: title,
text: text
};
} else {
options = text;
}
var items = [];
items.push({
name: options.cancelText || globalize.translate('ButtonCancel'),
id: 'cancel',
type: 'cancel'
});
items.push({
name: options.confirmText || globalize.translate('ButtonOk'),
id: 'ok',
type: options.primary === 'delete' ? 'delete' : 'submit'
});
options.buttons = items;
return dialog(options).then(function (result) {
if (result === 'ok') {
return Promise.resolve();
if (browser.tv && window.confirm) {
// Use the native confirm dialog
return function (options) {
if (typeof options === 'string') {
options = {
title: '',
text: options
};
}
return Promise.reject();
});
};
var text = replaceAll(options.text || '', '<br/>', '\n');
var result = confirm(text);
if (result) {
return Promise.resolve();
} else {
return Promise.reject();
}
};
} else {
// Use our own dialog
return function (text, title) {
var options;
if (typeof text === 'string') {
options = {
title: title,
text: text
};
} else {
options = text;
}
var items = [];
items.push({
name: options.cancelText || globalize.translate('ButtonCancel'),
id: 'cancel',
type: 'cancel'
});
items.push({
name: options.confirmText || globalize.translate('ButtonOk'),
id: 'ok',
type: options.primary === 'delete' ? 'delete' : 'submit'
});
options.buttons = items;
return dialog(options).then(function (result) {
if (result === 'ok') {
return Promise.resolve();
}
return Promise.reject();
});
};
}
});

View File

@ -1,27 +0,0 @@
define([], function () {
'use strict';
function replaceAll(str, find, replace) {
return str.split(find).join(replace);
}
return function (options) {
if (typeof options === 'string') {
options = {
title: '',
text: options
};
}
var text = replaceAll(options.text || '', '<br/>', '\n');
var result = confirm(text);
if (result) {
return Promise.resolve();
} else {
return Promise.reject();
}
};
});

View File

@ -63,7 +63,7 @@
<div class="selectContainer fldDateTimeLocale hide">
<select is="emby-select" class="selectDateTimeLocale" label="${LabelDateTimeLocale}">
<option value="">${AutoBasedOnLanguageSetting}</option>
<option value="">${Auto}</option>
<option value="ar">Arabic</option>
<option value="be-BY">Belarusian (Belarus)</option>
<option value="bg-BG">Bulgarian (Bulgaria)</option>

View File

@ -1,8 +1,18 @@
define([], function () {
'use strict';
/* eslint-disable indent */
function parentWithAttribute(elem, name, value) {
/**
* Useful DOM utilities.
* @module components/dom
*/
/**
* Returns parent of element with specified attribute value.
* @param {HTMLElement} elem - Element whose parent need to find.
* @param {string} name - Attribute name.
* @param {mixed} value - Attribute value.
* @returns {HTMLElement} Parent with specified attribute value.
*/
export function parentWithAttribute(elem, name, value) {
while ((value ? elem.getAttribute(name) !== value : !elem.getAttribute(name))) {
elem = elem.parentNode;
@ -14,8 +24,13 @@ define([], function () {
return elem;
}
function parentWithTag(elem, tagNames) {
/**
* Returns parent of element with one of specified tag names.
* @param {HTMLElement} elem - Element whose parent need to find.
* @param {(string|Array)} tagNames - Tag name or array of tag names.
* @returns {HTMLElement} Parent with one of specified tag names.
*/
export function parentWithTag(elem, tagNames) {
// accept both string and array passed in
if (!Array.isArray(tagNames)) {
tagNames = [tagNames];
@ -32,9 +47,14 @@ define([], function () {
return elem;
}
/**
* Returns _true_ if class list contains one of specified names.
* @param {DOMTokenList} classList - Class list.
* @param {Array} classNames - Array of class names.
* @returns {boolean} _true_ if class list contains one of specified names.
*/
function containsAnyClass(classList, classNames) {
for (var i = 0, length = classNames.length; i < length; i++) {
for (let i = 0, length = classNames.length; i < length; i++) {
if (classList.contains(classNames[i])) {
return true;
}
@ -42,8 +62,13 @@ define([], function () {
return false;
}
function parentWithClass(elem, classNames) {
/**
* Returns parent of element with one of specified class names.
* @param {HTMLElement} elem - Element whose parent need to find.
* @param {(string|Array)} classNames - Class name or array of class names.
* @returns {HTMLElement} Parent with one of specified class names.
*/
export function parentWithClass(elem, classNames) {
// accept both string and array passed in
if (!Array.isArray(classNames)) {
classNames = [classNames];
@ -60,9 +85,9 @@ define([], function () {
return elem;
}
var supportsCaptureOption = false;
let supportsCaptureOption = false;
try {
var opts = Object.defineProperty({}, 'capture', {
const opts = Object.defineProperty({}, 'capture', {
// eslint-disable-next-line getter-return
get: function () {
supportsCaptureOption = true;
@ -73,29 +98,58 @@ define([], function () {
console.debug('error checking capture support');
}
function addEventListenerWithOptions(target, type, handler, options) {
var optionsOrCapture = options;
/**
* Adds event listener to specified target.
* @param {EventTarget} target - Event target.
* @param {string} type - Event type.
* @param {function} handler - Event handler.
* @param {Object} [options] - Listener options.
*/
export function addEventListener(target, type, handler, options) {
let optionsOrCapture = options || {};
if (!supportsCaptureOption) {
optionsOrCapture = options.capture;
optionsOrCapture = optionsOrCapture.capture;
}
target.addEventListener(type, handler, optionsOrCapture);
}
function removeEventListenerWithOptions(target, type, handler, options) {
var optionsOrCapture = options;
/**
* Removes event listener from specified target.
* @param {EventTarget} target - Event target.
* @param {string} type - Event type.
* @param {function} handler - Event handler.
* @param {Object} [options] - Listener options.
*/
export function removeEventListener(target, type, handler, options) {
let optionsOrCapture = options || {};
if (!supportsCaptureOption) {
optionsOrCapture = options.capture;
optionsOrCapture = optionsOrCapture.capture;
}
target.removeEventListener(type, handler, optionsOrCapture);
}
var windowSize;
var windowSizeEventsBound;
/**
* Cached window size.
*/
let windowSize;
/**
* Flag of event listener bound.
*/
let windowSizeEventsBound;
/**
* Resets cached window size.
*/
function clearWindowSize() {
windowSize = null;
}
function getWindowSize() {
/**
* Returns window size.
* @returns {Object} Window size.
*/
export function getWindowSize() {
if (!windowSize) {
windowSize = {
innerHeight: window.innerHeight,
@ -104,46 +158,60 @@ define([], function () {
if (!windowSizeEventsBound) {
windowSizeEventsBound = true;
addEventListenerWithOptions(window, "orientationchange", clearWindowSize, { passive: true });
addEventListenerWithOptions(window, 'resize', clearWindowSize, { passive: true });
addEventListener(window, "orientationchange", clearWindowSize, { passive: true });
addEventListener(window, 'resize', clearWindowSize, { passive: true });
}
}
return windowSize;
}
var standardWidths = [480, 720, 1280, 1440, 1920, 2560, 3840, 5120, 7680];
function getScreenWidth() {
var width = window.innerWidth;
var height = window.innerHeight;
/**
* Standard screen widths.
*/
const standardWidths = [480, 720, 1280, 1440, 1920, 2560, 3840, 5120, 7680];
/**
* Returns screen width.
* @returns {number} Screen width.
*/
export function getScreenWidth() {
let width = window.innerWidth;
const height = window.innerHeight;
if (height > width) {
width = height * (16.0 / 9.0);
}
var closest = standardWidths.sort(function (a, b) {
const closest = standardWidths.sort(function (a, b) {
return Math.abs(width - a) - Math.abs(width - b);
})[0];
return closest;
}
var _animationEvent;
function whichAnimationEvent() {
/**
* Name of animation end event.
*/
let _animationEvent;
/**
* Returns name of animation end event.
* @returns {string} Name of animation end event.
*/
export function whichAnimationEvent() {
if (_animationEvent) {
return _animationEvent;
}
var t;
var el = document.createElement("div");
var animations = {
const el = document.createElement("div");
const animations = {
"animation": "animationend",
"OAnimation": "oAnimationEnd",
"MozAnimation": "animationend",
"WebkitAnimation": "webkitAnimationEnd"
};
for (t in animations) {
for (let t in animations) {
if (el.style[t] !== undefined) {
_animationEvent = animations[t];
return animations[t];
@ -154,26 +222,36 @@ define([], function () {
return _animationEvent;
}
function whichAnimationCancelEvent() {
/**
* Returns name of animation cancel event.
* @returns {string} Name of animation cancel event.
*/
export function whichAnimationCancelEvent() {
return whichAnimationEvent().replace('animationend', 'animationcancel').replace('AnimationEnd', 'AnimationCancel');
}
var _transitionEvent;
function whichTransitionEvent() {
/**
* Name of transition end event.
*/
let _transitionEvent;
/**
* Returns name of transition end event.
* @returns {string} Name of transition end event.
*/
export function whichTransitionEvent() {
if (_transitionEvent) {
return _transitionEvent;
}
var t;
var el = document.createElement("div");
var transitions = {
const el = document.createElement("div");
const transitions = {
"transition": "transitionend",
"OTransition": "oTransitionEnd",
"MozTransition": "transitionend",
"WebkitTransition": "webkitTransitionEnd"
};
for (t in transitions) {
for (let t in transitions) {
if (el.style[t] !== undefined) {
_transitionEvent = transitions[t];
return transitions[t];
@ -184,16 +262,15 @@ define([], function () {
return _transitionEvent;
}
return {
export default {
parentWithAttribute: parentWithAttribute,
parentWithClass: parentWithClass,
parentWithTag: parentWithTag,
addEventListener: addEventListenerWithOptions,
removeEventListener: removeEventListenerWithOptions,
addEventListener: addEventListener,
removeEventListener: removeEventListener,
getWindowSize: getWindowSize,
getScreenWidth: getScreenWidth,
whichTransitionEvent: whichTransitionEvent,
whichAnimationEvent: whichAnimationEvent,
whichAnimationCancelEvent: whichAnimationCancelEvent
};
});

View File

@ -1,18 +1,14 @@
define(['multi-download'], function (multiDownload) {
'use strict';
import multiDownload from "multi-download"
return {
download: function (items) {
export function download(items) {
if (window.NativeShell) {
items.map(function (item) {
window.NativeShell.downloadFile(item.url);
});
} else {
multiDownload(items.map(function (item) {
return item.url;
}));
}
}
};
});
if (window.NativeShell) {
items.map(function (item) {
window.NativeShell.downloadFile(item.url);
});
} else {
multiDownload(items.map(function (item) {
return item.url;
}));
}
}

View File

@ -1,18 +1,13 @@
define([], function () {
'use strict';
export function fileExists(path) {
if (window.NativeShell && window.NativeShell.FileSystem) {
return window.NativeShell.FileSystem.fileExists(path);
}
return Promise.reject();
}
return {
fileExists: function (path) {
if (window.NativeShell && window.NativeShell.FileSystem) {
return window.NativeShell.FileSystem.fileExists(path);
}
return Promise.reject();
},
directoryExists: function (path) {
if (window.NativeShell && window.NativeShell.FileSystem) {
return window.NativeShell.FileSystem.directoryExists(path);
}
return Promise.reject();
}
};
});
export function directoryExists(path) {
if (window.NativeShell && window.NativeShell.FileSystem) {
return window.NativeShell.FileSystem.directoryExists(path);
}
return Promise.reject();
}

View File

@ -1,4 +1,4 @@
define(["dialogHelper", "globalize", "connectionManager", "events", "browser", "require", "emby-checkbox", "emby-collapse", "css!./style"], function (dialogHelper, globalize, connectionManager, events, browser, require) {
define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "browser", "require", "emby-checkbox", "emby-collapse", "css!./style"], function (dom, dialogHelper, globalize, connectionManager, events, browser, require) {
"use strict";
function renderOptions(context, selector, cssClass, items, isCheckedFn) {
@ -106,16 +106,6 @@ define(["dialogHelper", "globalize", "connectionManager", "events", "browser", "
events.trigger(instance, "filterchange");
}
function parentWithClass(elem, className) {
while (!elem.classList || !elem.classList.contains(className)) {
elem = elem.parentNode;
if (!elem) {
return null;
}
}
return elem;
}
function setVisibility(context, options) {
if (options.mode == "livetvchannels" || options.mode == "albums" || options.mode == "artists" || options.mode == "albumartists" || options.mode == "songs") {
hideByClass(context, "videoStandard");
@ -320,7 +310,7 @@ define(["dialogHelper", "globalize", "connectionManager", "events", "browser", "
triggerChange(self);
});
context.addEventListener("change", function (e) {
var chkGenreFilter = parentWithClass(e.target, "chkGenreFilter");
var chkGenreFilter = dom.parentWithClass(e.target, "chkGenreFilter");
if (chkGenreFilter) {
var filterName = chkGenreFilter.getAttribute("data-filter");
var filters = query.Genres || "";
@ -334,7 +324,7 @@ define(["dialogHelper", "globalize", "connectionManager", "events", "browser", "
triggerChange(self);
return;
}
var chkTagFilter = parentWithClass(e.target, "chkTagFilter");
var chkTagFilter = dom.parentWithClass(e.target, "chkTagFilter");
if (chkTagFilter) {
var filterName = chkTagFilter.getAttribute("data-filter");
var filters = query.Tags || "";
@ -348,7 +338,7 @@ define(["dialogHelper", "globalize", "connectionManager", "events", "browser", "
triggerChange(self);
return;
}
var chkYearFilter = parentWithClass(e.target, "chkYearFilter");
var chkYearFilter = dom.parentWithClass(e.target, "chkYearFilter");
if (chkYearFilter) {
var filterName = chkYearFilter.getAttribute("data-filter");
var filters = query.Years || "";
@ -362,7 +352,7 @@ define(["dialogHelper", "globalize", "connectionManager", "events", "browser", "
triggerChange(self);
return;
}
var chkOfficialRatingFilter = parentWithClass(e.target, "chkOfficialRatingFilter");
var chkOfficialRatingFilter = dom.parentWithClass(e.target, "chkOfficialRatingFilter");
if (chkOfficialRatingFilter) {
var filterName = chkOfficialRatingFilter.getAttribute("data-filter");
var filters = query.OfficialRatings || "";

View File

@ -80,7 +80,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
if (track) {
var format = (track.Codec || '').toLowerCase();
if (format === 'ssa' || format === 'ass') {
// libjass is needed here
return false;
}
}
@ -1047,7 +1046,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
lastCustomTrackMs = 0;
}
function renderWithSubtitlesOctopus(videoElement, track, item) {
function renderSsaAss(videoElement, track, item) {
var attachments = self._currentPlayOptions.mediaSource.MediaAttachments || [];
var options = {
video: videoElement,
@ -1059,89 +1058,25 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
legacyWorkerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker-legacy.js",
onError: function() {
htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror');
}
},
// new octopus options; override all, even defaults
renderMode: 'blend',
dropAllAnimations: false,
libassMemoryLimit: 40,
libassGlyphLimit: 40,
targetFps: 24,
prescaleTradeoff: 0.8,
softHeightLimit: 1080,
hardHeightLimit: 2160,
resizeVariation: 0.2,
renderAhead: 90
};
require(['JavascriptSubtitlesOctopus'], function(SubtitlesOctopus) {
currentSubtitlesOctopus = new SubtitlesOctopus(options);
});
}
function renderWithLibjass(videoElement, track, item) {
var rendererSettings = {};
if (browser.ps4) {
// Text outlines are not rendering very well
rendererSettings.enableSvg = false;
} else if (browser.edge || browser.msie) {
// svg not rendering at all
rendererSettings.enableSvg = false;
}
// probably safer to just disable everywhere
rendererSettings.enableSvg = false;
require(['libjass', 'ResizeObserver'], function (libjass, ResizeObserver) {
libjass.ASS.fromUrl(getTextTrackUrl(track, item)).then(function (ass) {
var clock = new libjass.renderers.ManualClock();
currentClock = clock;
// Create a DefaultRenderer using the video element and the ASS object
var renderer = new libjass.renderers.WebRenderer(ass, clock, videoElement.parentNode, rendererSettings);
currentAssRenderer = renderer;
renderer.addEventListener("ready", function () {
try {
renderer.resize(videoElement.offsetWidth, videoElement.offsetHeight, 0, 0);
if (!self._resizeObserver) {
self._resizeObserver = new ResizeObserver(onVideoResize, {});
self._resizeObserver.observe(videoElement);
}
//clock.pause();
} catch (ex) {
//alert(ex);
}
});
}, function () {
htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror');
});
});
}
function renderSsaAss(videoElement, track, item) {
if (supportsCanvas() && supportsWebWorkers()) {
console.debug('rendering subtitles with SubtitlesOctopus');
renderWithSubtitlesOctopus(videoElement, track, item);
} else {
console.debug('rendering subtitles with libjass');
renderWithLibjass(videoElement, track, item);
}
}
function onVideoResize() {
if (browser.iOS) {
// the new sizes will be delayed for about 500ms with wkwebview
setTimeout(resetVideoRendererSize, 500);
} else {
resetVideoRendererSize();
}
}
function resetVideoRendererSize() {
var renderer = currentAssRenderer;
if (renderer) {
var videoElement = self._mediaElement;
var width = videoElement.offsetWidth;
var height = videoElement.offsetHeight;
console.debug('videoElement resized: ' + width + 'x' + height);
renderer.resize(width, height, 0, 0);
}
}
function requiresCustomSubtitlesElement() {
// after a system update, ps4 isn't showing anything when creating a track element dynamically
@ -1231,7 +1166,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
if (!itemHelper.isLocalItem(item) || track.IsExternal) {
var format = (track.Codec || '').toLowerCase();
if (format === 'ssa' || format === 'ass') {
// libjass is needed here
renderSsaAss(videoElement, track, item);
return;
}

View File

@ -1,4 +1,4 @@
define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader', 'browser', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'emby-checkbox', 'paper-icon-button-light', 'emby-button', 'formDialogStyle', 'cardStyle'], function (loading, appHost, dialogHelper, connectionManager, imageLoader, browser, layoutManager, scrollHelper, globalize, require) {
define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader', 'browser', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'emby-checkbox', 'paper-icon-button-light', 'emby-button', 'formDialogStyle', 'cardStyle'], function (dom, loading, appHost, dialogHelper, connectionManager, imageLoader, browser, layoutManager, scrollHelper, globalize, require) {
'use strict';
var enableFocusTransform = !browser.slow && !browser.edge;
@ -126,21 +126,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
return html;
}
function parentWithClass(elem, className) {
while (!elem.classList || !elem.classList.contains(className)) {
elem = elem.parentNode;
if (!elem) {
return null;
}
}
return elem;
}
function downloadRemoteImage(page, apiClient, url, type, provider) {
var options = getBaseRemoteOptions();
options.Type = type;
@ -152,7 +138,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
apiClient.downloadRemoteImage(options).then(function () {
hasChanges = true;
var dlg = parentWithClass(page, 'dialog');
var dlg = dom.parentWithClass(page, 'dialog');
dialogHelper.close(dlg);
});
}
@ -162,7 +148,6 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
}
function getRemoteImageHtml(image, imageType, apiClient) {
var tagName = layoutManager.tv ? 'button' : 'div';
var enableFooterButtons = !layoutManager.tv;
@ -293,7 +278,6 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
}
function initEditor(page, apiClient) {
page.querySelector('#selectBrowsableImageType').addEventListener('change', function () {
browsableImageType = this.value;
browsableImageStartIndex = 0;
@ -319,14 +303,14 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
page.addEventListener('click', function (e) {
var btnDownloadRemoteImage = parentWithClass(e.target, 'btnDownloadRemoteImage');
var btnDownloadRemoteImage = dom.parentWithClass(e.target, 'btnDownloadRemoteImage');
if (btnDownloadRemoteImage) {
var card = parentWithClass(btnDownloadRemoteImage, 'card');
var card = dom.parentWithClass(btnDownloadRemoteImage, 'card');
downloadRemoteImage(page, apiClient, card.getAttribute('data-imageurl'), card.getAttribute('data-imagetype'), card.getAttribute('data-imageprovider'));
return;
}
var btnImageCard = parentWithClass(e.target, 'btnImageCard');
var btnImageCard = dom.parentWithClass(e.target, 'btnImageCard');
if (btnImageCard) {
downloadRemoteImage(page, apiClient, btnImageCard.getAttribute('data-imageurl'), btnImageCard.getAttribute('data-imagetype'), btnImageCard.getAttribute('data-imageprovider'));
}
@ -334,7 +318,6 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
}
function showEditor(itemId, serverId, itemType) {
loading.show();
require(['text!./imagedownloader.template.html'], function (template) {
@ -380,7 +363,6 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
}
function onDialogClosed() {
var dlg = this;
if (layoutManager.tv) {
@ -397,9 +379,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader'
return {
show: function (itemId, serverId, itemType, imageType) {
return new Promise(function (resolve, reject) {
currentResolve = resolve;
currentReject = reject;
hasChanges = false;

View File

@ -1,165 +1,168 @@
define(["inputManager", "layoutManager"], function (inputManager, layoutManager) {
"use strict";
/**
* Module for performing keyboard navigation.
* @module components/input/keyboardnavigation
*/
/**
* Key name mapping.
*/
// Add more to support old browsers
var KeyNames = {
13: "Enter",
19: "Pause",
27: "Escape",
32: "Space",
37: "ArrowLeft",
38: "ArrowUp",
39: "ArrowRight",
40: "ArrowDown",
// MediaRewind (Tizen/WebOS)
412: "MediaRewind",
// MediaStop (Tizen/WebOS)
413: "MediaStop",
// MediaPlay (Tizen/WebOS)
415: "MediaPlay",
// MediaFastForward (Tizen/WebOS)
417: "MediaFastForward",
// Back (WebOS)
461: "Back",
// Back (Tizen)
10009: "Back",
// MediaTrackPrevious (Tizen)
10232: "MediaTrackPrevious",
// MediaTrackNext (Tizen)
10233: "MediaTrackNext",
// MediaPlayPause (Tizen)
10252: "MediaPlayPause"
};
import inputManager from "inputManager";
import layoutManager from "layoutManager";
/**
* Keys used for keyboard navigation.
*/
var NavigationKeys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"];
/**
* Key name mapping.
*/
const KeyNames = {
13: "Enter",
19: "Pause",
27: "Escape",
32: "Space",
37: "ArrowLeft",
38: "ArrowUp",
39: "ArrowRight",
40: "ArrowDown",
// MediaRewind (Tizen/WebOS)
412: "MediaRewind",
// MediaStop (Tizen/WebOS)
413: "MediaStop",
// MediaPlay (Tizen/WebOS)
415: "MediaPlay",
// MediaFastForward (Tizen/WebOS)
417: "MediaFastForward",
// Back (WebOS)
461: "Back",
// Back (Tizen)
10009: "Back",
// MediaTrackPrevious (Tizen)
10232: "MediaTrackPrevious",
// MediaTrackNext (Tizen)
10233: "MediaTrackNext",
// MediaPlayPause (Tizen)
10252: "MediaPlayPause"
};
var hasFieldKey = false;
try {
hasFieldKey = "key" in new KeyboardEvent("keydown");
} catch (e) {
console.error("error checking 'key' field");
/**
* Keys used for keyboard navigation.
*/
const NavigationKeys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"];
let hasFieldKey = false;
try {
hasFieldKey = "key" in new KeyboardEvent("keydown");
} catch (e) {
console.error("error checking 'key' field");
}
if (!hasFieldKey) {
// Add [a..z]
for (let i = 65; i <= 90; i++) {
KeyNames[i] = String.fromCharCode(i).toLowerCase();
}
}
if (!hasFieldKey) {
// Add [a..z]
for (var i = 65; i <= 90; i++) {
KeyNames[i] = String.fromCharCode(i).toLowerCase();
/**
* Returns key name from event.
*
* @param {KeyboardEvent} event - Keyboard event.
* @return {string} Key name.
*/
export function getKeyName(event) {
return KeyNames[event.keyCode] || event.key;
}
/**
* Returns _true_ if key is used for navigation.
*
* @param {string} key - Key name.
* @return {boolean} _true_ if key is used for navigation.
*/
export function isNavigationKey(key) {
return NavigationKeys.indexOf(key) != -1;
}
export function enable() {
document.addEventListener("keydown", function (e) {
const key = getKeyName(e);
// Ignore navigation keys for non-TV
if (!layoutManager.tv && isNavigationKey(key)) {
return;
}
}
/**
* Returns key name from event.
*
* @param {KeyboardEvent} keyboard event
* @return {string} key name
*/
function getKeyName(event) {
return KeyNames[event.keyCode] || event.key;
}
let capture = true;
/**
* Returns _true_ if key is used for navigation.
*
* @param {string} key name
* @return {boolean} _true_ if key is used for navigation
*/
function isNavigationKey(key) {
return NavigationKeys.indexOf(key) != -1;
}
switch (key) {
case "ArrowLeft":
inputManager.handle("left");
break;
case "ArrowUp":
inputManager.handle("up");
break;
case "ArrowRight":
inputManager.handle("right");
break;
case "ArrowDown":
inputManager.handle("down");
break;
function enable() {
document.addEventListener("keydown", function (e) {
var key = getKeyName(e);
case "Back":
inputManager.handle("back");
break;
// Ignore navigation keys for non-TV
if (!layoutManager.tv && isNavigationKey(key)) {
return;
}
var capture = true;
switch (key) {
case "ArrowLeft":
inputManager.handle("left");
break;
case "ArrowUp":
inputManager.handle("up");
break;
case "ArrowRight":
inputManager.handle("right");
break;
case "ArrowDown":
inputManager.handle("down");
break;
case "Back":
case "Escape":
if (layoutManager.tv) {
inputManager.handle("back");
break;
case "Escape":
if (layoutManager.tv) {
inputManager.handle("back");
} else {
capture = false;
}
break;
case "MediaPlay":
inputManager.handle("play");
break;
case "Pause":
inputManager.handle("pause");
break;
case "MediaPlayPause":
inputManager.handle("playpause");
break;
case "MediaRewind":
inputManager.handle("rewind");
break;
case "MediaFastForward":
inputManager.handle("fastforward");
break;
case "MediaStop":
inputManager.handle("stop");
break;
case "MediaTrackPrevious":
inputManager.handle("previoustrack");
break;
case "MediaTrackNext":
inputManager.handle("nexttrack");
break;
default:
} else {
capture = false;
}
}
break;
if (capture) {
console.debug("disabling default event handling");
e.preventDefault();
}
});
}
case "MediaPlay":
inputManager.handle("play");
break;
case "Pause":
inputManager.handle("pause");
break;
case "MediaPlayPause":
inputManager.handle("playpause");
break;
case "MediaRewind":
inputManager.handle("rewind");
break;
case "MediaFastForward":
inputManager.handle("fastforward");
break;
case "MediaStop":
inputManager.handle("stop");
break;
case "MediaTrackPrevious":
inputManager.handle("previoustrack");
break;
case "MediaTrackNext":
inputManager.handle("nexttrack");
break;
// Gamepad initialisation. No script is required if no gamepads are present at init time, saving a bit of resources.
// Whenever the gamepad is connected, we hand all the control of the gamepad to gamepadtokey.js by removing the event handler
function attachGamepadScript(e) {
console.log("Gamepad connected! Attaching gamepadtokey.js script");
window.removeEventListener("gamepadconnected", attachGamepadScript);
require(["components/input/gamepadtokey"]);
}
default:
capture = false;
}
// No need to check for gamepads manually at load time, the eventhandler will be fired for that
window.addEventListener("gamepadconnected", attachGamepadScript);
if (capture) {
console.debug("disabling default event handling");
e.preventDefault();
}
});
}
return {
enable: enable,
getKeyName: getKeyName,
isNavigationKey: isNavigationKey
};
});
// Gamepad initialisation. No script is required if no gamepads are present at init time, saving a bit of resources.
// Whenever the gamepad is connected, we hand all the control of the gamepad to gamepadtokey.js by removing the event handler
function attachGamepadScript(e) {
console.log("Gamepad connected! Attaching gamepadtokey.js script");
window.removeEventListener("gamepadconnected", attachGamepadScript);
require(["components/input/gamepadtokey"]);
}
// No need to check for gamepads manually at load time, the eventhandler will be fired for that
window.addEventListener("gamepadconnected", attachGamepadScript);
export default {
enable: enable,
getKeyName: getKeyName,
isNavigationKey: isNavigationKey
};

View File

@ -296,8 +296,6 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize",
var html = "";
var providerIds = item.ProviderIds || {};
for (var i = 0, length = idList.length; i < length; i++) {
var idInfo = idList[i];
@ -306,9 +304,12 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize",
html += '<div class="inputContainer">';
var idLabel = globalize.translate("LabelDynamicExternalId").replace("{0}", idInfo.Name);
var fullName = idInfo.Name;
if (idInfo.Type) {
fullName = idInfo.Name + " " + globalize.translate(idInfo.Type);
}
var value = providerIds[idInfo.Key] || "";
var idLabel = globalize.translate("LabelDynamicExternalId").replace("{0}", fullName);
html += '<input is="emby-input" class="txtLookupId" data-providerkey="' + idInfo.Key + '" id="' + id + '" label="' + idLabel + '"/>';

View File

@ -396,6 +396,12 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct
parent.querySelector(".chkEnableEmbeddedTitlesContainer").classList.remove("hide");
}
if (contentType === "tvshows") {
parent.querySelector(".chkEnableEmbeddedEpisodeInfosContainer").classList.remove("hide");
} else {
parent.querySelector(".chkEnableEmbeddedEpisodeInfosContainer").classList.add("hide");
}
return populateMetadataSettings(parent, contentType);
}
@ -493,6 +499,7 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct
SeasonZeroDisplayName: parent.querySelector("#txtSeasonZeroName").value,
AutomaticRefreshIntervalDays: parseInt(parent.querySelector("#selectAutoRefreshInterval").value),
EnableEmbeddedTitles: parent.querySelector("#chkEnableEmbeddedTitles").checked,
EnableEmbeddedEpisodeInfos: parent.querySelector("#chkEnableEmbeddedEpisodeInfos").checked,
SkipSubtitlesIfEmbeddedSubtitlesPresent: parent.querySelector("#chkSkipIfGraphicalSubsPresent").checked,
SkipSubtitlesIfAudioTrackMatches: parent.querySelector("#chkSkipIfAudioTrackPresent").checked,
SaveSubtitlesWithMedia: parent.querySelector("#chkSaveSubtitlesLocally").checked,
@ -545,6 +552,7 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct
parent.querySelector("#chkImportMissingEpisodes").checked = options.ImportMissingEpisodes;
parent.querySelector(".chkAutomaticallyGroupSeries").checked = options.EnableAutomaticSeriesGrouping;
parent.querySelector("#chkEnableEmbeddedTitles").checked = options.EnableEmbeddedTitles;
parent.querySelector("#chkEnableEmbeddedEpisodeInfos").checked = options.EnableEmbeddedEpisodeInfos;
parent.querySelector("#chkSkipIfGraphicalSubsPresent").checked = options.SkipSubtitlesIfEmbeddedSubtitlesPresent;
parent.querySelector("#chkSaveSubtitlesLocally").checked = options.SaveSubtitlesWithMedia;
parent.querySelector("#chkSkipIfAudioTrackPresent").checked = options.SkipSubtitlesIfAudioTrackMatches;

View File

@ -28,6 +28,13 @@
</label>
<div class="fieldDescription checkboxFieldDescription">${PreferEmbeddedTitlesOverFileNamesHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription chkEnableEmbeddedEpisodeInfosContainer hide advanced">
<label>
<input is="emby-checkbox" type="checkbox" id="chkEnableEmbeddedEpisodeInfos" />
<span>${PreferEmbeddedEpisodeInfosOverFileNames}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${PreferEmbeddedEpisodeInfosOverFileNamesHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription advanced">
<label>

View File

@ -465,7 +465,12 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
var id = "txt1" + idInfo.Key;
var formatString = idInfo.UrlFormatString || '';
var labelText = globalize.translate('LabelDynamicExternalId').replace('{0}', idInfo.Name);
var fullName = idInfo.Name;
if (idInfo.Type) {
fullName = idInfo.Name + " " + globalize.translate(idInfo.Type);
}
var labelText = globalize.translate("LabelDynamicExternalId").replace("{0}", fullName);
html += '<div class="inputContainer">';
html += '<div class="flex align-items-center">';

View File

@ -3162,7 +3162,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
// User clicked stop or content ended
var state = self.getPlayerState(player);
var streamInfo = getPlayerData(player).streamInfo;
var data = getPlayerData(player);
var streamInfo = data.streamInfo;
var nextItem = self._playNextAfterEnded ? self._playQueueManager.getNextItemInfo() : null;
@ -3210,6 +3211,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
showPlaybackInfoErrorMessage(self, displayErrorCode, nextItem);
} else if (nextItem) {
self.nextTrack();
} else {
// Nothing more to play - clear data
data.streamInfo = null;
}
}

View File

@ -1,24 +1,10 @@
define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', 'connectionManager', 'userSettings', 'appRouter', 'globalize', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (shell, dialogHelper, loading, layoutManager, playbackManager, connectionManager, userSettings, appRouter, globalize) {
define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', 'connectionManager', 'userSettings', 'appRouter', 'globalize', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (dom, shell, dialogHelper, loading, layoutManager, playbackManager, connectionManager, userSettings, appRouter, globalize) {
'use strict';
var currentServerId;
function parentWithClass(elem, className) {
while (!elem.classList || !elem.classList.contains(className)) {
elem = elem.parentNode;
if (!elem) {
return null;
}
}
return elem;
}
function onSubmit(e) {
var panel = parentWithClass(this, 'dialog');
var panel = dom.parentWithClass(this, 'dialog');
var playlistId = panel.querySelector('#selectPlaylistToAddTo').value;
var apiClient = connectionManager.getApiClient(currentServerId);
@ -35,11 +21,9 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
}
function createPlaylist(apiClient, dlg) {
loading.show();
var url = apiClient.getUrl("Playlists", {
Name: dlg.querySelector('#txtNewPlaylistName').value,
Ids: dlg.querySelector('.fldSelectedItemIds').value || '',
userId: apiClient.getCurrentUserId()
@ -50,9 +34,7 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
type: "POST",
url: url,
dataType: "json"
}).then(function (result) {
loading.hide();
var id = result.Id;
@ -63,16 +45,13 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
}
function redirectToPlaylist(apiClient, id) {
appRouter.showItem(id, apiClient.serverId());
}
function addToPlaylist(apiClient, dlg, id) {
var itemIds = dlg.querySelector('.fldSelectedItemIds').value || '';
if (id === 'queue') {
playbackManager.queue({
serverId: apiClient.serverId(),
ids: itemIds.split(',')
@ -85,7 +64,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
loading.show();
var url = apiClient.getUrl("Playlists/" + id + "/Items", {
Ids: itemIds,
userId: apiClient.getCurrentUserId()
});
@ -95,7 +73,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
url: url
}).then(function () {
loading.hide();
dlg.submitted = true;
@ -108,7 +85,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
}
function populatePlaylists(editorOptions, panel) {
var select = panel.querySelector('#selectPlaylistToAddTo');
loading.hide();
@ -116,7 +92,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
panel.querySelector('.newPlaylistInfo').classList.add('hide');
var options = {
Recursive: true,
IncludeItemTypes: "Playlist",
SortBy: 'SortName',
@ -125,7 +100,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
var apiClient = connectionManager.getApiClient(currentServerId);
apiClient.getItems(apiClient.getCurrentUserId(), options).then(function (result) {
var html = '';
if (editorOptions.enableAddToPlayQueue !== false && playbackManager.isPlaying()) {
@ -135,7 +109,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
html += '<option value="">' + globalize.translate('OptionNew') + '</option>';
html += result.Items.map(function (i) {
return '<option value="' + i.Id + '">' + i.Name + '</option>';
});
@ -159,7 +132,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
}
function getEditorHtml(items) {
var html = '';
html += '<div class="formDialogContent smoothScrollY" style="padding-top:2em;">';
@ -195,7 +167,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
}
function initEditor(content, options, items) {
content.querySelector('#selectPlaylistToAddTo').addEventListener('change', function () {
if (this.value) {
content.querySelector('.newPlaylistInfo').classList.add('hide');
@ -235,7 +206,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
}
PlaylistEditor.prototype.show = function (options) {
var items = options.items || {};
currentServerId = options.serverId;
@ -272,7 +242,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
initEditor(dlg, options, items);
dlg.querySelector('.btnCancel').addEventListener('click', function () {
dialogHelper.close(dlg);
});
@ -281,7 +250,6 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager',
}
return dialogHelper.open(dlg).then(function () {
if (layoutManager.tv) {
centerFocus(dlg.querySelector('.formDialogContent'), false, false);
}

View File

@ -1,28 +0,0 @@
define([], function () {
'use strict';
function replaceAll(str, find, replace) {
return str.split(find).join(replace);
}
return function (options) {
if (typeof options === 'string') {
options = {
label: '',
text: options
};
}
var label = replaceAll(options.label || '', '<br/>', '\n');
var result = prompt(label, options.text || '');
if (result) {
return Promise.resolve(result);
} else {
return Promise.reject(result);
}
};
});

View File

@ -1,6 +1,10 @@
define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function (dialogHelper, layoutManager, scrollHelper, globalize, dom, require) {
define(["browser", 'dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function(browser, dialogHelper, layoutManager, scrollHelper, globalize, dom, require) {
'use strict';
function replaceAll(str, find, replace) {
return str.split(find).join(replace);
}
function setInputProperties(dlg, options) {
var txtInput = dlg.querySelector('#txtInput');
@ -13,7 +17,6 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 're
}
function showDialog(options, template) {
var dialogOptions = {
removeOnClose: true,
scrollY: false
@ -71,34 +74,49 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 're
dlg.style.minWidth = (Math.min(400, dom.getWindowSize().innerWidth - 50)) + 'px';
return dialogHelper.open(dlg).then(function () {
if (layoutManager.tv) {
scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false);
}
var value = submitValue;
if (value) {
return value;
if (submitValue) {
return submitValue;
} else {
return Promise.reject();
}
});
}
return function (options) {
if ((browser.tv || browser.xboxOne) && window.confirm) {
return function (options) {
if (typeof options === 'string') {
options = {
label: '',
text: options
};
}
return new Promise(function (resolve, reject) {
require(['text!./prompt.template.html'], function (template) {
var label = replaceAll(options.label || '', '<br/>', '\n');
var result = prompt(label, options.text || '');
if (typeof options === 'string') {
options = {
title: '',
text: options
};
}
showDialog(options, template).then(resolve, reject);
if (result) {
return Promise.resolve(result);
} else {
return Promise.reject(result);
}
};
} else {
return function (options) {
return new Promise(function (resolve, reject) {
require(['text!./prompt.template.html'], function (template) {
if (typeof options === 'string') {
options = {
title: '',
text: options
};
}
showDialog(options, template).then(resolve, reject);
});
});
});
};
};
}
});

View File

@ -1,19 +1,6 @@
define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (shell, dialogHelper, loading, layoutManager, connectionManager, appRouter, globalize) {
define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (dom, shell, dialogHelper, loading, layoutManager, connectionManager, appRouter, globalize) {
'use strict';
function parentWithClass(elem, className) {
while (!elem.classList || !elem.classList.contains(className)) {
elem = elem.parentNode;
if (!elem) {
return null;
}
}
return elem;
}
function getEditorHtml() {
var html = '';
@ -65,7 +52,7 @@ define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager'
loading.show();
var instance = this;
var dlg = parentWithClass(e.target, 'dialog');
var dlg = dom.parentWithClass(e.target, 'dialog');
var options = instance.options;
var apiClient = connectionManager.getApiClient(options.serverId);

View File

@ -1,96 +1,90 @@
// From https://github.com/parshap/node-sanitize-filename
define([], function () {
'use strict';
const illegalRe = /[\/\?<>\\:\*\|":]/g;
// eslint-disable-next-line no-control-regex
const controlRe = /[\x00-\x1f\x80-\x9f]/g;
const reservedRe = /^\.+$/;
const windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i;
const windowsTrailingRe = /[\. ]+$/;
var illegalRe = /[\/\?<>\\:\*\|":]/g;
// eslint-disable-next-line no-control-regex
var controlRe = /[\x00-\x1f\x80-\x9f]/g;
var reservedRe = /^\.+$/;
var windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i;
var windowsTrailingRe = /[\. ]+$/;
function isHighSurrogate(codePoint) {
return codePoint >= 0xd800 && codePoint <= 0xdbff;
}
function isHighSurrogate(codePoint) {
return codePoint >= 0xd800 && codePoint <= 0xdbff;
function isLowSurrogate(codePoint) {
return codePoint >= 0xdc00 && codePoint <= 0xdfff;
}
function getByteLength(string) {
if (typeof string !== "string") {
throw new Error("Input must be string");
}
function isLowSurrogate(codePoint) {
return codePoint >= 0xdc00 && codePoint <= 0xdfff;
}
function getByteLength(string) {
if (typeof string !== "string") {
throw new Error("Input must be string");
}
var charLength = string.length;
var byteLength = 0;
var codePoint = null;
var prevCodePoint = null;
for (var i = 0; i < charLength; i++) {
codePoint = string.charCodeAt(i);
// handle 4-byte non-BMP chars
// low surrogate
if (isLowSurrogate(codePoint)) {
// when parsing previous hi-surrogate, 3 is added to byteLength
if (prevCodePoint != null && isHighSurrogate(prevCodePoint)) {
byteLength += 1;
} else {
byteLength += 3;
}
} else if (codePoint <= 0x7f) {
const charLength = string.length;
let byteLength = 0;
let codePoint = null;
let prevCodePoint = null;
for (let i = 0; i < charLength; i++) {
codePoint = string.charCodeAt(i);
// handle 4-byte non-BMP chars
// low surrogate
if (isLowSurrogate(codePoint)) {
// when parsing previous hi-surrogate, 3 is added to byteLength
if (prevCodePoint != null && isHighSurrogate(prevCodePoint)) {
byteLength += 1;
} else if (codePoint >= 0x80 && codePoint <= 0x7ff) {
byteLength += 2;
} else if (codePoint >= 0x800 && codePoint <= 0xffff) {
} else {
byteLength += 3;
}
prevCodePoint = codePoint;
} else if (codePoint <= 0x7f) {
byteLength += 1;
} else if (codePoint >= 0x80 && codePoint <= 0x7ff) {
byteLength += 2;
} else if (codePoint >= 0x800 && codePoint <= 0xffff) {
byteLength += 3;
}
return byteLength;
prevCodePoint = codePoint;
}
function truncate(string, byteLength) {
if (typeof string !== "string") {
throw new Error("Input must be string");
}
return byteLength;
}
var charLength = string.length;
var curByteLength = 0;
var codePoint;
var segment;
for (var i = 0; i < charLength; i += 1) {
codePoint = string.charCodeAt(i);
segment = string[i];
if (isHighSurrogate(codePoint) && isLowSurrogate(string.charCodeAt(i + 1))) {
i += 1;
segment += string[i];
}
curByteLength += getByteLength(segment);
if (curByteLength === byteLength) {
return string.slice(0, i + 1);
} else if (curByteLength > byteLength) {
return string.slice(0, i - segment.length + 1);
}
}
return string;
function truncate(string, byteLength) {
if (typeof string !== "string") {
throw new Error("Input must be string");
}
return {
sanitize: function (input, replacement) {
var sanitized = input
.replace(illegalRe, replacement)
.replace(controlRe, replacement)
.replace(reservedRe, replacement)
.replace(windowsReservedRe, replacement)
.replace(windowsTrailingRe, replacement);
return truncate(sanitized, 255);
const charLength = string.length;
let curByteLength = 0;
let codePoint;
let segment;
for (let i = 0; i < charLength; i += 1) {
codePoint = string.charCodeAt(i);
segment = string[i];
if (isHighSurrogate(codePoint) && isLowSurrogate(string.charCodeAt(i + 1))) {
i += 1;
segment += string[i];
}
};
});
curByteLength += getByteLength(segment);
if (curByteLength === byteLength) {
return string.slice(0, i + 1);
} else if (curByteLength > byteLength) {
return string.slice(0, i - segment.length + 1);
}
}
return string;
}
export function sanitize(input, replacement) {
const sanitized = input
.replace(illegalRe, replacement)
.replace(controlRe, replacement)
.replace(reservedRe, replacement)
.replace(windowsReservedRe, replacement)
.replace(windowsTrailingRe, replacement);
return truncate(sanitized, 255);
}

View File

@ -1,38 +1,46 @@
define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManager) {
"use strict";
/* eslint-disable indent */
/**
* Module for controlling scroll behavior.
* @module components/scrollManager
*/
import dom from "dom";
import browser from "browser";
import layoutManager from "layoutManager";
/**
* Scroll time in ms.
*/
var ScrollTime = 270;
const ScrollTime = 270;
/**
* Epsilon for comparing values.
*/
var Epsilon = 1e-6;
const Epsilon = 1e-6;
// FIXME: Need to scroll to top of page to fully show the top menu. This can be solved by some marker of top most elements or their containers
/**
* Returns minimum vertical scroll.
* Scroll less than that value will be zeroed.
*
* @return {number} minimum vertical scroll
* @return {number} Minimum vertical scroll.
*/
function minimumScrollY() {
var topMenu = document.querySelector(".headerTop");
const topMenu = document.querySelector(".headerTop");
if (topMenu) {
return topMenu.clientHeight;
}
return 0;
}
var supportsSmoothScroll = "scrollBehavior" in document.documentElement.style;
const supportsSmoothScroll = "scrollBehavior" in document.documentElement.style;
var supportsScrollToOptions = false;
let supportsScrollToOptions = false;
try {
var elem = document.createElement("div");
const elem = document.createElement("div");
var opts = Object.defineProperty({}, "behavior", {
const opts = Object.defineProperty({}, "behavior", {
// eslint-disable-next-line getter-return
get: function () {
supportsScrollToOptions = true;
@ -47,10 +55,10 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* Returns value clamped by range [min, max].
*
* @param {number} value clamped value
* @param {number} min begining of range
* @param {number} max ending of range
* @return {number} clamped value
* @param {number} value - Clamped value.
* @param {number} min - Begining of range.
* @param {number} max - Ending of range.
* @return {number} Clamped value.
*/
function clamp(value, min, max) {
return value <= min ? min : value >= max ? max : value;
@ -60,15 +68,15 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
* Returns the required delta to fit range 1 into range 2.
* In case of range 1 is bigger than range 2 returns delta to fit most out of range part.
*
* @param {number} begin1 begining of range 1
* @param {number} end1 ending of range 1
* @param {number} begin2 begining of range 2
* @param {number} end2 ending of range 2
* @return {number} delta: <0 move range1 to the left, >0 - to the right
* @param {number} begin1 - Begining of range 1.
* @param {number} end1 - Ending of range 1.
* @param {number} begin2 - Begining of range 2.
* @param {number} end2 - Ending of range 2.
* @return {number} Delta: <0 move range1 to the left, >0 - to the right.
*/
function fitRange(begin1, end1, begin2, end2) {
var delta1 = begin1 - begin2;
var delta2 = end2 - end1;
const delta1 = begin1 - begin2;
const delta2 = end2 - end1;
if (delta1 < 0 && delta1 < delta2) {
return -delta1;
} else if (delta2 < 0) {
@ -80,13 +88,21 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* Ease value.
*
* @param {number} t value in range [0, 1]
* @return {number} eased value in range [0, 1]
* @param {number} t - Value in range [0, 1].
* @return {number} Eased value in range [0, 1].
*/
function ease(t) {
return t*(2 - t); // easeOutQuad === ease-out
}
/**
* @typedef {Object} Rect
* @property {number} left - X coordinate of top-left corner.
* @property {number} top - Y coordinate of top-left corner.
* @property {number} width - Width.
* @property {number} height - Height.
*/
/**
* Document scroll wrapper helps to unify scrolling and fix issues of some browsers.
*
@ -100,41 +116,68 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
*
* Tizen 5 Browser/Native: scrolls documentElement (and window); has a document.scrollingElement
*/
function DocumentScroller() {
}
DocumentScroller.prototype = {
class DocumentScroller {
/**
* Horizontal scroll position.
* @type {number}
*/
get scrollLeft() {
return window.pageXOffset;
},
}
set scrollLeft(val) {
window.scroll(val, window.pageYOffset);
},
}
/**
* Vertical scroll position.
* @type {number}
*/
get scrollTop() {
return window.pageYOffset;
},
}
set scrollTop(val) {
window.scroll(window.pageXOffset, val);
},
}
/**
* Horizontal scroll size (scroll width).
* @type {number}
*/
get scrollWidth() {
return Math.max(document.documentElement.scrollWidth, document.body.scrollWidth);
},
}
/**
* Vertical scroll size (scroll height).
* @type {number}
*/
get scrollHeight() {
return Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);
},
}
/**
* Horizontal client size (client width).
* @type {number}
*/
get clientWidth() {
return Math.min(document.documentElement.clientWidth, document.body.clientWidth);
},
}
/**
* Vertical client size (client height).
* @type {number}
*/
get clientHeight() {
return Math.min(document.documentElement.clientHeight, document.body.clientHeight);
},
}
getBoundingClientRect: function() {
/**
* Returns bounding client rect.
* @return {Rect} Bounding client rect.
*/
getBoundingClientRect() {
// Make valid viewport coordinates: documentElement.getBoundingClientRect returns rect of entire document relative to viewport
return {
left: 0,
@ -142,26 +185,34 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
width: this.clientWidth,
height: this.clientHeight
};
},
}
scrollTo: function() {
/**
* Scrolls window.
* @param {...mixed} args See window.scrollTo.
*/
scrollTo() {
window.scrollTo.apply(window, arguments);
}
};
var documentScroller = new DocumentScroller();
}
/**
* Returns parent element that can be scrolled. If no such, returns documentElement.
* Default (document) scroller.
*/
const documentScroller = new DocumentScroller();
/**
* Returns parent element that can be scrolled. If no such, returns document scroller.
*
* @param {HTMLElement} element element for which parent is being searched
* @param {boolean} vertical search for vertical scrollable parent
* @param {HTMLElement} element - Element for which parent is being searched.
* @param {boolean} vertical - Search for vertical scrollable parent.
* @param {HTMLElement|DocumentScroller} Parent element that can be scrolled or document scroller.
*/
function getScrollableParent(element, vertical) {
if (element) {
var nameScroll = "scrollWidth";
var nameClient = "clientWidth";
var nameClass = "scrollX";
let nameScroll = "scrollWidth";
let nameClient = "clientWidth";
let nameClass = "scrollX";
if (vertical) {
nameScroll = "scrollHeight";
@ -169,7 +220,7 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
nameClass = "scrollY";
}
var parent = element.parentElement;
let parent = element.parentElement;
while (parent) {
// Skip 'emby-scroller' because it scrolls by itself
@ -187,20 +238,20 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* @typedef {Object} ScrollerData
* @property {number} scrollPos current scroll position
* @property {number} scrollSize scroll size
* @property {number} clientSize client size
* @property {number} scrollPos - Current scroll position.
* @property {number} scrollSize - Scroll size.
* @property {number} clientSize - Client size.
*/
/**
* Returns scroll data for specified orientation.
* Returns scroller data for specified orientation.
*
* @param {HTMLElement} scroller scroller
* @param {boolean} vertical vertical scroll data
* @return {ScrollerData} scroll data
* @param {HTMLElement} scroller - Scroller.
* @param {boolean} vertical - Vertical scroller data.
* @return {ScrollerData} Scroller data.
*/
function getScrollerData(scroller, vertical) {
var data = {};
let data = {};
if (!vertical) {
data.scrollPos = scroller.scrollLeft;
@ -218,14 +269,14 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* Returns position of child of scroller for specified orientation.
*
* @param {HTMLElement} scroller scroller
* @param {HTMLElement} element child of scroller
* @param {boolean} vertical vertical scroll
* @return {number} child position
* @param {HTMLElement} scroller - Scroller.
* @param {HTMLElement} element - Child of scroller.
* @param {boolean} vertical - Vertical scroll.
* @return {number} Child position.
*/
function getScrollerChildPos(scroller, element, vertical) {
var elementRect = element.getBoundingClientRect();
var scrollerRect = scroller.getBoundingClientRect();
const elementRect = element.getBoundingClientRect();
const scrollerRect = scroller.getBoundingClientRect();
if (!vertical) {
return scroller.scrollLeft + elementRect.left - scrollerRect.left;
@ -237,21 +288,21 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* Returns scroll position for element.
*
* @param {ScrollerData} scrollerData scroller data
* @param {number} elementPos child element position
* @param {number} elementSize child element size
* @param {boolean} centered scroll to center
* @return {number} scroll position
* @param {ScrollerData} scrollerData - Scroller data.
* @param {number} elementPos - Child element position.
* @param {number} elementSize - Child element size.
* @param {boolean} centered - Scroll to center.
* @return {number} Scroll position.
*/
function calcScroll(scrollerData, elementPos, elementSize, centered) {
var maxScroll = scrollerData.scrollSize - scrollerData.clientSize;
const maxScroll = scrollerData.scrollSize - scrollerData.clientSize;
var scroll;
let scroll;
if (centered) {
scroll = elementPos + (elementSize - scrollerData.clientSize) / 2;
} else {
var delta = fitRange(elementPos, elementPos + elementSize - 1, scrollerData.scrollPos, scrollerData.scrollPos + scrollerData.clientSize - 1);
const delta = fitRange(elementPos, elementPos + elementSize - 1, scrollerData.scrollPos, scrollerData.scrollPos + scrollerData.clientSize - 1);
scroll = scrollerData.scrollPos - delta;
}
@ -261,14 +312,14 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* Calls scrollTo function in proper way.
*
* @param {HTMLElement} scroller scroller
* @param {ScrollToOptions} options scroll options
* @param {HTMLElement} scroller - Scroller.
* @param {ScrollToOptions} options - Scroll options.
*/
function scrollToHelper(scroller, options) {
if ("scrollTo" in scroller) {
if (!supportsScrollToOptions) {
var scrollX = (options.left !== undefined ? options.left : scroller.scrollLeft);
var scrollY = (options.top !== undefined ? options.top : scroller.scrollTop);
const scrollX = (options.left !== undefined ? options.left : scroller.scrollLeft);
const scrollY = (options.top !== undefined ? options.top : scroller.scrollTop);
scroller.scrollTo(scrollX, scrollY);
} else {
scroller.scrollTo(options);
@ -286,14 +337,14 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* Performs built-in scroll.
*
* @param {HTMLElement} xScroller horizontal scroller
* @param {number} scrollX horizontal coordinate
* @param {HTMLElement} yScroller vertical scroller
* @param {number} scrollY vertical coordinate
* @param {boolean} smooth smooth scrolling
* @param {HTMLElement} xScroller - Horizontal scroller.
* @param {number} scrollX - Horizontal coordinate.
* @param {HTMLElement} yScroller - Vertical scroller.
* @param {number} scrollY - Vertical coordinate.
* @param {boolean} smooth - Smooth scrolling.
*/
function builtinScroll(xScroller, scrollX, yScroller, scrollY, smooth) {
var scrollBehavior = smooth ? "smooth" : "instant";
const scrollBehavior = smooth ? "smooth" : "instant";
if (xScroller !== yScroller) {
scrollToHelper(xScroller, {left: scrollX, behavior: scrollBehavior});
@ -303,7 +354,10 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
}
}
var scrollTimer;
/**
* Requested frame for animated scroll.
*/
let scrollTimer;
/**
* Resets scroll timer to stop scrolling.
@ -316,29 +370,29 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* Performs animated scroll.
*
* @param {HTMLElement} xScroller horizontal scroller
* @param {number} scrollX horizontal coordinate
* @param {HTMLElement} yScroller vertical scroller
* @param {number} scrollY vertical coordinate
* @param {HTMLElement} xScroller - Horizontal scroller.
* @param {number} scrollX - Horizontal coordinate.
* @param {HTMLElement} yScroller - Vertical scroller.
* @param {number} scrollY - Vertical coordinate.
*/
function animateScroll(xScroller, scrollX, yScroller, scrollY) {
var ox = xScroller.scrollLeft;
var oy = yScroller.scrollTop;
var dx = scrollX - ox;
var dy = scrollY - oy;
const ox = xScroller.scrollLeft;
const oy = yScroller.scrollTop;
const dx = scrollX - ox;
const dy = scrollY - oy;
if (Math.abs(dx) < Epsilon && Math.abs(dy) < Epsilon) {
return;
}
var start;
let start;
function scrollAnim(currentTimestamp) {
start = start || currentTimestamp;
var k = Math.min(1, (currentTimestamp - start) / ScrollTime);
let k = Math.min(1, (currentTimestamp - start) / ScrollTime);
if (k === 1) {
resetScrollTimer();
@ -348,8 +402,8 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
k = ease(k);
var x = ox + dx*k;
var y = oy + dy*k;
const x = ox + dx*k;
const y = oy + dy*k;
builtinScroll(xScroller, x, yScroller, y, false);
@ -362,11 +416,11 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* Performs scroll.
*
* @param {HTMLElement} xScroller horizontal scroller
* @param {number} scrollX horizontal coordinate
* @param {HTMLElement} yScroller vertical scroller
* @param {number} scrollY vertical coordinate
* @param {boolean} smooth smooth scrolling
* @param {HTMLElement} xScroller - Horizontal scroller.
* @param {number} scrollX - Horizontal coordinate.
* @param {HTMLElement} yScroller - Vertical scroller.
* @param {number} scrollY - Vertical coordinate.
* @param {boolean} smooth - Smooth scrolling.
*/
function doScroll(xScroller, scrollX, yScroller, scrollY, smooth) {
@ -403,26 +457,26 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* Returns true if scroll manager is enabled.
*/
var isEnabled = function() {
export function isEnabled() {
return layoutManager.tv;
};
}
/**
* Scrolls the document to a given position.
*
* @param {number} scrollX horizontal coordinate
* @param {number} scrollY vertical coordinate
* @param {boolean} [smooth=false] smooth scrolling
* @param {number} scrollX - Horizontal coordinate.
* @param {number} scrollY - Vertical coordinate.
* @param {boolean} [smooth=false] - Smooth scrolling.
*/
var scrollTo = function(scrollX, scrollY, smooth) {
export function scrollTo(scrollX, scrollY, smooth) {
smooth = !!smooth;
// Scroller is document itself by default
var scroller = getScrollableParent(null, false);
const scroller = getScrollableParent(null, false);
var xScrollerData = getScrollerData(scroller, false);
var yScrollerData = getScrollerData(scroller, true);
const xScrollerData = getScrollerData(scroller, false);
const yScrollerData = getScrollerData(scroller, true);
scrollX = clamp(Math.round(scrollX), 0, xScrollerData.scrollSize - xScrollerData.clientSize);
scrollY = clamp(Math.round(scrollY), 0, yScrollerData.scrollSize - yScrollerData.clientSize);
@ -433,39 +487,39 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
/**
* Scrolls the document to a given element.
*
* @param {HTMLElement} element target element of scroll task
* @param {boolean} [smooth=false] smooth scrolling
* @param {HTMLElement} element - Target element of scroll task.
* @param {boolean} [smooth=false] - Smooth scrolling.
*/
var scrollToElement = function(element, smooth) {
export function scrollToElement(element, smooth) {
smooth = !!smooth;
var scrollCenterX = true;
var scrollCenterY = true;
let scrollCenterX = true;
let scrollCenterY = true;
var offsetParent = element.offsetParent;
const offsetParent = element.offsetParent;
// In Firefox offsetParent.offsetParent is BODY
var isFixed = offsetParent && (!offsetParent.offsetParent || window.getComputedStyle(offsetParent).position === "fixed");
const isFixed = offsetParent && (!offsetParent.offsetParent || window.getComputedStyle(offsetParent).position === "fixed");
// Scroll fixed elements to nearest edge (or do not scroll at all)
if (isFixed) {
scrollCenterX = scrollCenterY = false;
}
var xScroller = getScrollableParent(element, false);
var yScroller = getScrollableParent(element, true);
const xScroller = getScrollableParent(element, false);
const yScroller = getScrollableParent(element, true);
var elementRect = element.getBoundingClientRect();
const elementRect = element.getBoundingClientRect();
var xScrollerData = getScrollerData(xScroller, false);
var yScrollerData = getScrollerData(yScroller, true);
const xScrollerData = getScrollerData(xScroller, false);
const yScrollerData = getScrollerData(yScroller, true);
var xPos = getScrollerChildPos(xScroller, element, false);
var yPos = getScrollerChildPos(yScroller, element, true);
const xPos = getScrollerChildPos(xScroller, element, false);
const yPos = getScrollerChildPos(yScroller, element, true);
var scrollX = calcScroll(xScrollerData, xPos, elementRect.width, scrollCenterX);
var scrollY = calcScroll(yScrollerData, yPos, elementRect.height, scrollCenterY);
const scrollX = calcScroll(xScrollerData, xPos, elementRect.width, scrollCenterX);
let scrollY = calcScroll(yScrollerData, yPos, elementRect.height, scrollCenterY);
// HACK: Scroll to top for top menu because it is hidden
// FIXME: Need a marker to scroll top/bottom
@ -490,9 +544,8 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage
}, {capture: true});
}
return {
export default {
isEnabled: isEnabled,
scrollTo: scrollTo,
scrollToElement: scrollToElement
};
});

View File

@ -10,12 +10,6 @@ define([], function () {
}
},
canExec: false,
exec: function (options) {
// options.path
// options.arguments
return Promise.reject();
},
enableFullscreen: function () {
if (window.NativeShell) {
window.NativeShell.enableFullscreen();

View File

@ -116,8 +116,8 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr
var linkUrl = info.stylesheetPath;
unloadTheme();
var link = document.createElement('link');
var link = document.createElement('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('type', 'text/css');
link.onload = function () {

View File

@ -2,15 +2,11 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi
"use strict";
function populateLanguages(select, languages) {
var html = "";
html += "<option value=''>" + globalize.translate('AnyLanguage') + "</option>";
for (var i = 0, length = languages.length; i < length; i++) {
var culture = languages[i];
html += "<option value='" + culture.ThreeLetterISOLanguageName + "'>" + culture.DisplayName + "</option>";
}
@ -18,7 +14,6 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi
}
function getSubtitleAppearanceObject(context) {
var appearanceSettings = {};
appearanceSettings.textSize = context.querySelector('#selectTextSize').value;
@ -102,14 +97,12 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi
}
function onSubmit(e) {
var self = this;
var apiClient = connectionManager.getApiClient(self.options.serverId);
var userId = self.options.userId;
var userSettings = self.options.userSettings;
userSettings.setUserInfo(userId, apiClient).then(function () {
var enableSaveConfirmation = self.options.enableSaveConfirmation;
save(self, self.options.element, userId, userSettings, apiClient, enableSaveConfirmation);
});
@ -118,6 +111,7 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi
if (e) {
e.preventDefault();
}
return false;
}
@ -197,9 +191,7 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi
var userSettings = self.options.userSettings;
apiClient.getUser(userId).then(function (user) {
userSettings.setUserInfo(userId, apiClient).then(function () {
self.dataLoaded = true;
var appearanceSettings = userSettings.getSubtitleAppearanceSettings(self.options.appearanceKey);
@ -214,7 +206,6 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi
};
SubtitleSettings.prototype.destroy = function () {
this.options = null;
};

View File

@ -1,7 +1,5 @@
<form style="margin:0 auto;">
<div class="verticalSection">
<h2 class="sectionTitle">
${Subtitles}
</h2>
@ -9,6 +7,7 @@
<div class="selectContainer">
<select is="emby-select" id="selectSubtitleLanguage" label="${LabelPreferredSubtitleLanguage}"></select>
</div>
<div class="selectContainer">
<select is="emby-select" id="selectSubtitlePlaybackMode" label="${LabelSubtitlePlaybackMode}">
<option value="Default">${Default}</option>
@ -23,6 +22,7 @@
<div class="fieldDescription subtitlesOnlyForcedHelp subtitlesHelp hide">${OnlyForcedSubtitlesHelp}</div>
<div class="fieldDescription subtitlesNoneHelp subtitlesHelp hide">${NoSubtitlesHelp}</div>
</div>
<div class="selectContainer fldBurnIn hide">
<select is="emby-select" id="selectSubtitleBurnIn" label="${LabelBurnSubtitles}">
<option value="">${Auto}</option>
@ -34,7 +34,6 @@
</div>
<div class="verticalSection subtitleAppearanceSection hide">
<h2 class="sectionTitle">
${HeaderSubtitleAppearance}
</h2>
@ -61,6 +60,7 @@
<option value="extralarge">${ExtraLarge}</option>
</select>
</div>
<div class="selectContainer">
<select is="emby-select" id="selectFont" label="${LabelFont}">
<option value="">${Default}</option>
@ -71,12 +71,15 @@
<option value="smallcaps">${SmallCaps}</option>
</select>
</div>
<div class="inputContainer hide">
<input is="emby-input" id="inputTextBackground" label="${LabelTextBackgroundColor}" type="text" />
</div>
<div class="inputContainer hide">
<input is="emby-input" id="inputTextColor" label="${LabelTextColor}" type="text" />
</div>
<div class="selectContainer">
<select is="emby-select" id="selectDropShadow" label="${LabelDropShadow}">
<option value="none">${None}</option>

View File

@ -1,4 +1,4 @@
define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitlesync'], function (playbackManager, template, css) {
define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', 'css!./subtitlesync'], function (playbackManager, layoutManager, template, css) {
"use strict";
var player;
@ -10,6 +10,7 @@ define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitles
function init(instance) {
var parent = document.createElement('div');
document.body.appendChild(parent);
parent.innerHTML = template;
subtitleSyncSlider = parent.querySelector(".subtitleSyncSlider");
@ -17,6 +18,14 @@ define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitles
subtitleSyncCloseButton = parent.querySelector(".subtitleSync-closeButton");
subtitleSyncContainer = parent.querySelector(".subtitleSyncContainer");
if (layoutManager.tv) {
subtitleSyncSlider.classList.add("focusable");
// HACK: Delay to give time for registered element attach (Firefox)
setTimeout(function () {
subtitleSyncSlider.enableKeyboardDragging();
}, 0);
}
subtitleSyncContainer.classList.add("hide");
subtitleSyncTextField.updateOffset = function(offset) {
@ -87,8 +96,6 @@ define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitles
SubtitleSync.prototype.toggle("forceToHide");
});
document.body.appendChild(parent);
instance.element = parent;
}

View File

@ -264,17 +264,13 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
self.init = function () {
options = options || {};
if (options.showCancelButton) {
page.querySelector(".btnCancel").classList.remove("hide");
} else {
page.querySelector(".btnCancel").classList.add("hide");
}
// 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);
if (options.showSubmitButton) {
page.querySelector(".btnSubmitListings").classList.remove("hide");
} else {
page.querySelector(".btnSubmitListings").classList.add("hide");
}
var hideSubmitButton = options.showSubmitButton === false;
page.querySelector(".btnSubmitListings").classList.toggle("hide", hideSubmitButton);
$(".formLogin", page).on("submit", function () {
submitLoginForm();

View File

@ -163,17 +163,13 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa
self.init = function () {
options = options || {};
if (false !== options.showCancelButton) {
page.querySelector(".btnCancel").classList.remove("hide");
} else {
page.querySelector(".btnCancel").classList.add("hide");
}
// 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);
if (false !== options.showSubmitButton) {
page.querySelector(".btnSubmitListings").classList.remove("hide");
} else {
page.querySelector(".btnSubmitListings").classList.add("hide");
}
var hideSubmitButton = options.showSubmitButton === false;
page.querySelector(".btnSubmitListings").classList.toggle("hide", hideSubmitButton);
$("form", page).on("submit", function () {
submitListingsForm();

3
src/config.example.json Normal file
View File

@ -0,0 +1,3 @@
{
"multiserver": true
}

View File

@ -703,26 +703,9 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
}
}
function renderUserInfo(page, item) {
var lastPlayedElement = page.querySelector(".itemLastPlayed");
if (item.UserData && item.UserData.LastPlayedDate) {
lastPlayedElement.classList.remove("hide");
var datePlayed = datetime.parseISO8601Date(item.UserData.LastPlayedDate);
lastPlayedElement.innerHTML = globalize.translate("DatePlayed") + ": " + datetime.toLocaleDateString(datePlayed) + " " + datetime.getDisplayTime(datePlayed);
} else {
lastPlayedElement.classList.add("hide");
}
}
function renderLinks(linksElem, item) {
var html = [];
if (item.DateCreated && itemHelper.enableDateAddedDisplay(item)) {
var dateCreated = datetime.parseISO8601Date(item.DateCreated);
html.push(globalize.translate("AddedOnValue", datetime.toLocaleDateString(dateCreated) + " " + datetime.getDisplayTime(dateCreated)));
}
var links = [];
if (!layoutManager.tv && item.HomePageUrl) {
@ -736,7 +719,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
}
if (links.length) {
html.push(globalize.translate("LinksValue", links.join(", ")));
html.push(links.join(", "));
}
linksElem.innerHTML = html.join(", ");
@ -1032,13 +1015,17 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
context: context
}) + '">' + p.Name + "</a>";
}).join(", ");
var elem = page.querySelector(".genres");
elem.innerHTML = globalize.translate(genres.length > 1 ? "GenresValue" : "GenreValue", html);
var genresLabel = page.querySelector(".genresLabel");
genresLabel.innerHTML = globalize.translate(genres.length > 1 ? "Genres" : "Genre");
var genresValue = page.querySelector(".genres");
genresValue.innerHTML = html;
var genresGroup = page.querySelector(".genresGroup");
if (genres.length) {
elem.classList.remove("hide");
genresGroup.classList.remove("hide");
} else {
elem.classList.add("hide");
genresGroup.classList.add("hide");
}
}
@ -1056,13 +1043,17 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
context: context
}) + '">' + p.Name + "</a>";
}).join(", ");
var elem = page.querySelector(".directors");
elem.innerHTML = globalize.translate(directors.length > 1 ? "DirectorsValue" : "DirectorValue", html);
var directorsLabel = page.querySelector(".directorsLabel");
directorsLabel.innerHTML = globalize.translate(directors.length > 1 ? "Directors" : "Director");
var directorsValue = page.querySelector(".directors");
directorsValue.innerHTML = html;
var directorsGroup = page.querySelector(".directorsGroup");
if (directors.length) {
elem.classList.remove("hide");
directorsGroup.classList.remove("hide");
} else {
elem.classList.add("hide");
directorsGroup.classList.add("hide");
}
}
@ -1120,7 +1111,6 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
reloadUserDataButtons(page, item);
renderLinks(externalLinksElem, item);
renderUserInfo(page, item);
renderTags(page, item);
renderSeriesAirTime(page, item, isStatic);
}

View File

@ -671,7 +671,8 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med
}
function onTimeUpdate(e) {
if (isEnabled) {
// Test for 'currentItem' is required for Firefox since its player spams 'timeupdate' events even being at breakpoint
if (isEnabled && currentItem) {
var now = new Date().getTime();
if (!(now - lastUpdateTime < 700)) {

View File

@ -1,4 +1,4 @@
define(["apphost", "connectionManager", "listViewStyle", "emby-button"], function(appHost, connectionManager) {
define(["apphost", "connectionManager", "layoutManager", "listViewStyle", "emby-button"], function(appHost, connectionManager, layoutManager) {
"use strict";
return function(view, params) {
@ -10,6 +10,10 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
Dashboard.selectServer();
});
view.querySelector(".clientSettings").addEventListener("click", function () {
window.NativeShell.openClientSettings();
});
view.addEventListener("viewshow", function() {
// this page can also be used by admins to change user preferences from the user edit page
var userId = params.userId || Dashboard.getCurrentUserId();
@ -21,6 +25,12 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
page.querySelector(".lnkPlaybackPreferences").setAttribute("href", "mypreferencesplayback.html?userId=" + userId);
page.querySelector(".lnkSubtitlePreferences").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId);
if (window.NativeShell && window.NativeShell.AppHost.supports("clientsettings")) {
page.querySelector(".clientSettings").classList.remove("hide");
} else {
page.querySelector(".clientSettings").classList.add("hide");
}
if (appHost.supports("multiserver")) {
page.querySelector(".selectServer").classList.remove("hide");
} else {
@ -33,6 +43,12 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
page.querySelector(".adminSection").classList.add("hide");
}
if (layoutManager.mobile) {
page.querySelector(".headerUsername").classList.add("hide");
page.querySelector(".adminSection").classList.add("hide");
page.querySelector(".userSection").classList.add("hide");
}
ApiClient.getUser(userId).then(function(user) {
page.querySelector(".headerUsername").innerHTML = user.Name;
if (!user.Policy.IsAdministrator) {

View File

@ -55,7 +55,7 @@
height: 1.83em;
margin: 0;
overflow: hidden;
border: 2px solid currentcolor;
border: 0.14em solid currentcolor;
border-radius: 0.14em;
z-index: 2;
display: flex;

View File

@ -4,7 +4,6 @@
display: inline-block;
box-sizing: border-box;
margin: 0;
padding-left: 24px;
}
.radio-label-block {
@ -31,67 +30,82 @@
border: none;
}
.mdl-radio__outer-circle {
position: absolute;
top: 4px;
left: 0;
display: inline-block;
box-sizing: border-box;
width: 16px;
height: 16px;
margin: 0;
cursor: pointer;
border: 2px solid currentcolor;
.mdl-radio__circles {
position: relative;
margin-right: 0.54em;
width: 1.08em;
height: 1.08em;
border-radius: 50%;
z-index: 2;
cursor: pointer;
}
.mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle {
border: 2px solid #00a4dc;
.mdl-radio__circles svg {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 1;
overflow: visible;
}
.mdl-radio__button:disabled + .mdl-radio__label + .mdl-radio__outer-circle {
border: 2px solid rgba(0, 0, 0, 0.26);
.mdl-radio__button:disabled + .mdl-radio__circles {
cursor: auto;
}
.mdl-radio__button:disabled + .mdl-radio__circles .mdl-radio__outer-circle {
color: rgba(0, 0, 0, 0.26);
}
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__outer-circle {
color: #00a4dc;
}
.mdl-radio__inner-circle {
position: absolute;
z-index: 1;
margin: 0;
top: 8px;
left: 4px;
box-sizing: border-box;
width: 8px;
height: 8px;
cursor: pointer;
transition-duration: 0.28s;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 0.2s;
transition-property: -webkit-transform;
transition-property: transform;
transition-property: transform, -webkit-transform;
-webkit-transform: scale3d(0, 0, 0);
transform: scale3d(0, 0, 0);
-webkit-transform: scale(0);
transform: scale(0);
transform-origin: 50% 50%;
}
.mdl-radio__button:checked + .mdl-radio__circles .mdl-radio__inner-circle {
-webkit-transform: scale(1);
transform: scale(1);
}
.mdl-radio__button:disabled + .mdl-radio__circles .mdl-radio__inner-circle {
color: rgba(0, 0, 0, 0.26);
}
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__inner-circle {
color: #00a4dc;
}
.mdl-radio__focus-circle {
position: absolute;
top: 0;
left: 0;
box-sizing: border-box;
width: 100%;
height: 100%;
margin: 0;
border-radius: 50%;
background: #00a4dc;
opacity: 0.26;
transition-duration: 0.2s;
transition-property: -webkit-transform;
transition-property: transform;
transition-property: transform, -webkit-transform;
-webkit-transform: scale(0);
transform: scale(0);
}
.mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle {
-webkit-transform: scale3d(1, 1, 1);
transform: scale3d(1, 1, 1);
}
.mdl-radio__button:disabled + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle {
background: rgba(0, 0, 0, 0.26);
cursor: auto;
}
.mdl-radio__button:focus + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle {
box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.76);
}
.mdl-radio__button:checked:focus + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle {
box-shadow: 0 0 0 10px rgba(0, 164, 220, 0.26);
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle {
-webkit-transform: scale(1.75);
transform: scale(1.75);
}
.mdl-radio__label {

View File

@ -1,4 +1,4 @@
define(['css!./emby-radio', 'registerElement'], function () {
define(['layoutManager', 'css!./emby-radio', 'registerElement'], function (layoutManager) {
'use strict';
var EmbyRadioPrototype = Object.create(HTMLInputElement.prototype);
@ -23,6 +23,7 @@ define(['css!./emby-radio', 'registerElement'], function () {
}
EmbyRadioPrototype.attachedCallback = function () {
var showFocus = !layoutManager.mobile;
if (this.getAttribute('data-radio') === 'true') {
return;
@ -37,13 +38,36 @@ define(['css!./emby-radio', 'registerElement'], function () {
labelElement.classList.add('mdl-radio');
labelElement.classList.add('mdl-js-radio');
labelElement.classList.add('mdl-js-ripple-effect');
if (showFocus) {
labelElement.classList.add('show-focus');
}
var labelTextElement = labelElement.querySelector('span');
labelTextElement.classList.add('radioButtonLabel');
labelTextElement.classList.add('mdl-radio__label');
labelElement.insertAdjacentHTML('beforeend', '<span class="mdl-radio__outer-circle"></span><span class="mdl-radio__inner-circle"></span>');
var html = '';
html += '<div class="mdl-radio__circles">';
html += '<svg>';
html += '<defs>';
html += '<clipPath id="cutoff">';
html += '<circle cx="50%" cy="50%" r="50%" />';
html += '</clipPath>';
html += '</defs>';
html += '<circle class="mdl-radio__outer-circle" cx="50%" cy="50%" r="50%" fill="none" stroke="currentcolor" stroke-width="0.26em" clip-path="url(#cutoff)" />';
html += '<circle class="mdl-radio__inner-circle" cx="50%" cy="50%" r="25%" fill="currentcolor" />';
html += '</svg>';
if (showFocus) {
html += '<div class="mdl-radio__focus-circle"></div>';
}
html += '</div>';
this.insertAdjacentHTML('afterend', html);
this.addEventListener('keydown', onKeyDown);
};

View File

@ -109,7 +109,7 @@
}
.selectArrow {
margin-top: 0.35em;
margin-top: 1.2em;
font-size: 1.7em;
}

View File

@ -144,7 +144,7 @@ define(['layoutManager', 'browser', 'actionsheet', 'css!./emby-select', 'registe
this.parentNode.insertBefore(label, this);
if (this.classList.contains('emby-select-withcolor')) {
this.parentNode.insertAdjacentHTML('beforeend', '<div class="selectArrowContainer"><div style="visibility:hidden;">0</div><i class="selectArrow material-icons keyboard_arrow_down"></i></div>');
this.parentNode.insertAdjacentHTML('beforeend', '<div class="selectArrowContainer"><div style="visibility:hidden;display:none;">0</div><i class="selectArrow material-icons keyboard_arrow_down"></i></div>');
}
};

View File

@ -111,22 +111,32 @@
<div class="detailImageContainer padded-left"></div>
<div class="detailPageContent">
<div class="detailPagePrimaryContent padded-left padded-right">
<div class="detailSection" style="margin-bottom: 0;">
<div class="detailSection">
<div class="itemMiscInfo nativeName hide"></div>
<div class="genres hide" style="margin: .7em 0;font-size:92%;"></div>
<div class="directors hide" style="margin: .7em 0;font-size:92%;"></div>
<form class="trackSelections flex align-items-center flex-wrap-wrap hide focuscontainer-x">
<div class="selectContainer selectContainer-inline selectSourceContainer hide trackSelectionFieldContainer flex-shrink-zero">
<div class="itemDetailsGroup">
<div class="detailsGroupItem genresGroup hide">
<div class="genresLabel label"></div>
<div class="genres content"></div>
</div>
<div class="detailsGroupItem directorsGroup hide">
<div class="directorsLabel label"></div>
<div class="directors content"></div>
</div>
</div>
<form class="trackSelections hide focuscontainer-x">
<div class="selectContainer selectSourceContainer hide trackSelectionFieldContainer flex-shrink-zero">
<select is="emby-select" class="selectSource detailTrackSelect" label=""></select>
</div>
<div class="selectContainer selectContainer-inline selectVideoContainer hide trackSelectionFieldContainer flex-shrink-zero">
<div class="selectContainer selectVideoContainer hide trackSelectionFieldContainer flex-shrink-zero">
<select is="emby-select" class="selectVideo detailTrackSelect" label=""></select>
</div>
<div class="selectContainer selectContainer-inline selectAudioContainer hide trackSelectionFieldContainer flex-shrink-zero">
<div class="selectContainer selectAudioContainer hide trackSelectionFieldContainer flex-shrink-zero">
<select is="emby-select" class="selectAudio detailTrackSelect" label=""></select>
</div>
<div class="selectContainer selectContainer-inline selectSubtitlesContainer hide trackSelectionFieldContainer">
<div class="selectContainer selectSubtitlesContainer hide trackSelectionFieldContainer">
<select is="emby-select" class="selectSubtitles detailTrackSelect" label=""></select>
</div>
</form>

View File

@ -47,6 +47,15 @@
</div>
</div>
</a>
<a is="emby-linkbutton" data-ripple="false" href="#" style="display:block;padding:0;margin:0;" class="clientSettings listItem-border">
<div class="listItem">
<i class="material-icons listItemIcon listItemIcon-transparent devices_other"></i>
<div class="listItemBody">
<div class="listItemBodyText">${ClientSettings}</div>
</div>
</div>
</a>
</div>
<div class="adminSection verticalSection verticalSection-extrabottompadding">
<h2 class="sectionTitle" style="padding-left:.25em;">${HeaderAdmin}</h2>

View File

@ -271,6 +271,9 @@ define([], function () {
if (!browser.tizen) {
browser.orsay = userAgent.toLowerCase().indexOf('smarthub') !== -1;
} else {
var v = (navigator.appVersion).match(/Tizen (\d+).(\d+)/);
browser.tizenVersion = parseInt(v[1]);
}
if (browser.edgeUwp) {

View File

@ -214,6 +214,15 @@ define(['browser'], function (browser) {
break;
case 'avi':
supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp;
// New Samsung TV don't support XviD/DivX
// Explicitly add supported codecs to make other codecs be transcoded
if (browser.tizenVersion >= 4) {
videoCodecs.push('h264');
if (canPlayH265(videoTestElement, options)) {
videoCodecs.push('h265');
videoCodecs.push('hevc');
}
}
break;
case 'mpg':
case 'mpeg':
@ -424,13 +433,9 @@ define(['browser'], function (browser) {
var supportsDts = browser.tizen || browser.orsay || browser.web0s || options.supportsDts;
if (self.tizen && self.tizen.systeminfo) {
var v = tizen.systeminfo.getCapability('http://tizen.org/feature/platform.version');
// DTS audio not supported in 2018 models (Tizen 4.0)
if (v && parseFloat(v) >= parseFloat('4.0')) {
supportsDts = false;
}
// DTS audio not supported in 2018 models (Tizen 4.0)
if (browser.tizenVersion >= 4) {
supportsDts = false;
}
if (supportsDts) {
@ -757,6 +762,11 @@ define(['browser'], function (browser) {
maxH264Level = 51;
}
// Support H264 Level 52 (Tizen 5.0) - app only
if (browser.tizenVersion >= 5 && window.NativeShell) {
maxH264Level = 52;
}
if (browser.tizen || browser.orsay ||
videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) {

View File

@ -73,7 +73,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
}
if (user && user.localUser) {
if (headerHomeButton) {
if (headerHomeButton && !layoutManager.mobile) {
headerHomeButton.classList.remove("hide");
}
@ -243,15 +243,20 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" data-itemid="selectserver" href="selectserver.html?showuser=1"><i class="material-icons navMenuOptionIcon">wifi</i><span class="navMenuOptionText">' + globalize.translate("ButtonSelectServer") + "</span></a>";
}
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder btnSettings" data-itemid="settings" href="#"><i class="material-icons navMenuOptionIcon settings"></i><span class="navMenuOptionText">' + globalize.translate("ButtonSettings") + "</span></a>";
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder btnLogout" data-itemid="logout" href="#"><i class="material-icons navMenuOptionIcon exit_to_app"></i><span class="navMenuOptionText">' + globalize.translate("ButtonSignOut") + "</span></a>";
html += "</div>";
}
// add buttons to navigation drawer
navDrawerScrollContainer.innerHTML = html;
// bind logout button click to method
var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout");
var btnSettings = navDrawerScrollContainer.querySelector(".btnSettings");
if (btnSettings) {
btnSettings.addEventListener("click", onSettingsClick);
}
var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout");
if (btnLogout) {
btnLogout.addEventListener("click", onLogoutClick);
}
@ -598,6 +603,10 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
}
}
function onSettingsClick() {
Dashboard.navigate("mypreferencesmenu.html");
}
function onLogoutClick() {
Dashboard.logout();
}
@ -788,7 +797,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
var headerCastButton;
var headerSearchButton;
var headerAudioPlayerButton;
var enableLibraryNavDrawer = !layoutManager.tv;
var enableLibraryNavDrawer = layoutManager.desktop;
var skinHeader = document.querySelector(".skinHeader");
var requiresUserRefresh = true;
var lastOpenTime = new Date().getTime();
@ -863,6 +872,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
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();
@ -874,7 +884,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
refreshDashboardInfoInDrawer(apiClient);
} else {
if (mainDrawerButton) {
if (enableLibraryNavDrawer) {
if (enableLibraryNavDrawer || isHomePage) {
mainDrawerButton.classList.remove("hide");
} else {
mainDrawerButton.classList.add("hide");

View File

@ -20,6 +20,14 @@ define(['appStorage', 'events'], function (appStorage, events) {
return this.get('enableAutoLogin') !== 'false';
};
AppSettings.prototype.enableSystemExternalPlayers = function (val) {
if (val !== null) {
this.set('enableSystemExternalPlayers', val.toString());
}
return this.get('enableSystemExternalPlayers') === 'true';
};
AppSettings.prototype.enableAutomaticBitrateDetection = function (isInNetwork, mediaType, val) {
var key = 'enableautobitratebitrate-' + mediaType + '-' + isInNetwork;
if (val != null) {
@ -123,13 +131,5 @@ define(['appStorage', 'events'], function (appStorage, events) {
return appStorage.getItem(getKey(name, userId));
};
AppSettings.prototype.enableSystemExternalPlayers = function (val) {
if (val != null) {
this.set('enableSystemExternalPlayers', val.toString());
}
return this.get('enableSystemExternalPlayers') === 'true';
};
return new AppSettings();
});

View File

@ -0,0 +1,15 @@
let data;
function getConfig() {
if (data) return Promise.resolve(data);
return fetch("/config.json?nocache=" + new Date().getUTCMilliseconds()).then(function (response) {
data = response.json();
return data;
});
}
export function enableMultiServer() {
return getConfig().then(config => {
return config.multiserver;
});
}

View File

@ -355,39 +355,6 @@ var AppInfo = {};
return headroom;
}
function getCastSenderApiLoader() {
var ccLoaded = false;
return {
load: function () {
if (ccLoaded) {
return Promise.resolve();
}
return new Promise(function (resolve, reject) {
var fileref = document.createElement("script");
fileref.setAttribute("type", "text/javascript");
fileref.onload = function () {
ccLoaded = true;
resolve();
};
fileref.setAttribute("src", "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js");
document.querySelector("head").appendChild(fileref);
});
}
};
}
function getDummyCastSenderApiLoader() {
return {
load: function () {
window.chrome = window.chrome || {};
return Promise.resolve();
}
};
}
function createSharedAppFooter(appFooter) {
return new appFooter({});
}
@ -439,28 +406,16 @@ var AppInfo = {};
defineResizeObserver();
define("dialog", [componentsPath + "/dialog/dialog"], returnFirstDependency);
if (preferNativeAlerts && window.confirm) {
define("confirm", [componentsPath + "/confirm/nativeconfirm"], returnFirstDependency);
} else {
define("confirm", [componentsPath + "/confirm/confirm"], returnFirstDependency);
}
define("confirm", [componentsPath + "/confirm/confirm"], returnFirstDependency);
if ((preferNativeAlerts || browser.xboxOne) && window.confirm) {
define("prompt", [componentsPath + "/prompt/nativeprompt"], returnFirstDependency);
} else {
define("prompt", [componentsPath + "/prompt/prompt"], returnFirstDependency);
}
define("prompt", [componentsPath + "/prompt/prompt"], returnFirstDependency);
define("loading", [componentsPath + "/loading/loading"], returnFirstDependency);
define("multi-download", [componentsPath + "/multidownload"], returnFirstDependency);
define("fileDownloader", [componentsPath + "/filedownloader"], returnFirstDependency);
define("localassetmanager", [bowerPath + "/apiclient/localassetmanager"], returnFirstDependency);
if ("cordova" === self.appMode || "android" === self.appMode) {
define("castSenderApiLoader", [], getDummyCastSenderApiLoader);
} else {
define("castSenderApiLoader", [], getCastSenderApiLoader);
}
define("castSenderApiLoader", [componentsPath + "/castSenderApi"], returnFirstDependency);
define("transfermanager", [bowerPath + "/apiclient/sync/transfermanager"], returnFirstDependency);
define("filerepository", [bowerPath + "/apiclient/sync/filerepository"], returnFirstDependency);
@ -735,7 +690,6 @@ var AppInfo = {};
"swiper",
"queryString",
"sortable",
"libjass",
"webcomponents",
"material-icons",
"jellyfin-noto",
@ -812,6 +766,7 @@ var AppInfo = {};
define("emby-textarea", [elementsPath + "/emby-textarea/emby-textarea"], returnFirstDependency);
define("emby-toggle", [elementsPath + "/emby-toggle/emby-toggle"], returnFirstDependency);
define("webSettings", [scriptsPath + "/settings/webSettings"], returnFirstDependency);
define("appSettings", [scriptsPath + "/settings/appSettings"], returnFirstDependency);
define("userSettingsBuilder", [scriptsPath + "/settings/userSettingsBuilder"], returnFirstDependency);
define("userSettings", ["userSettingsBuilder"], function(userSettingsBuilder) {

View File

@ -918,7 +918,7 @@
"HeaderFavoriteEpisodes": "الحلقات المفضلة",
"HeaderFavoriteArtists": "الفنانون المفضلون",
"Shows": "الحلقات",
"Books": "كتب",
"Books": "الكتب",
"ValueSpecialEpisodeName": "مميز - {0}",
"HeaderFavoriteAlbums": "الألبومات المفضلة",
"HeaderAlbumArtists": "فناني الألبومات",

View File

@ -10,7 +10,7 @@
"All": "Всички",
"AllLibraries": "Всички библиотеки",
"Art": "Картина",
"Artists": "Изпълнители",
"Artists": "Артисти",
"AttributeNew": "Нови",
"Audio": "Звук",
"Auto": "Автоматично",
@ -101,8 +101,7 @@
"Desktop": "Работен плот",
"DeviceAccessHelp": "Това се отнася само за устройства, които могат да бъдат различени и няма да попречи на достъп от мрежов четец. Филтрирането на потребителски устройства ще предотврати използването им докато не бъдат одобрени тук.",
"Director": "Режисьор",
"DirectorValue": "Режисьор: {0}",
"DirectorsValue": "Режисьори: {0}",
"Directors": "Режисьори",
"Disc": "Диск",
"Dislike": "Нехаресване",
"Display": "Показване",
@ -137,9 +136,8 @@
"FormatValue": "Формат: {0}",
"Friday": "Петък",
"Fullscreen": "Цял екран",
"GenreValue": "Жанр: {0}",
"Genre": "Жанр",
"Genres": "Жанрове",
"GenresValue": "Жанрове: {0}",
"GroupVersions": "Групиране на версиите",
"GuestStar": "Гостуваща звезда",
"Guide": "Справочник",
@ -305,9 +303,9 @@
"LabelCriticRating": "Оценка на критиците:",
"LabelCurrentPassword": "Текуща парола:",
"LabelCustomCertificatePath": "Път към потребителския сертификат:",
"LabelCustomCertificatePathHelp": "Път до файл с шифровъчен стандарт №12, съдържащ сертификат и частен ключ за поддръжка на протокол TLS на собствен домейн.",
"LabelCustomCertificatePathHelp": "Път до файл с шифровъчен стандарт №12 (PKCS #12), съдържащ сертификат и частен ключ за поддръжка на протокол TLS на собствен домейн.",
"LabelCustomCss": "CSS по избор:",
"LabelCustomCssHelp": "Използвайте собствен CSS към уеб интерфейса.",
"LabelCustomCssHelp": "Използвайте собствен CSS към мрежовия интерфейс.",
"LabelCustomDeviceDisplayName": "Показвано име:",
"LabelCustomRating": "Оценка по избор:",
"LabelDashboardTheme": "Облик на сървърното табло:",
@ -435,7 +433,7 @@
"LabelStatus": "Състояние:",
"LabelStopWhenPossible": "Спирай, когато е възможно:",
"LabelSubtitlePlaybackMode": "Режим на субтитрите:",
"LabelSubtitles": "Субтитри:",
"LabelSubtitles": "Субтитри",
"LabelSupportedMediaTypes": "Поддържани типове медия:",
"LabelTag": "Етикет:",
"LabelTextColor": "Цвят на текста:",
@ -812,7 +810,7 @@
"MediaInfoLayout": "Подредба",
"MusicVideo": "Музикален клип",
"MediaInfoStreamTypeVideo": "Видео",
"LabelVideo": "Видео:",
"LabelVideo": "Видео",
"HeaderVideoTypes": "Видове видеа",
"HeaderVideoType": "Вид на видеото",
"EnableExternalVideoPlayers": "Външни възпроизводители",
@ -836,5 +834,12 @@
"AllowOnTheFlySubtitleExtraction": "Позволява моментално извличане на поднадписи",
"AllowHWTranscodingHelp": "Позволява на тунера да прекодира моментално. Това може да помогне за редуциране на прекодирането от сървъра.",
"AddItemToCollectionHelp": "Добавяне към колекция чрез търсенето им и използване на дясно-щракване с мишката или контекстното меню.",
"Absolute": "Aбсолютен"
"Absolute": "Aбсолютен",
"LabelLanNetworks": "Локални мрежи:",
"LabelKodiMetadataSaveImagePathsHelp": "Препоръчително е ако имате изображения, пътят към които не е съобразен с изискванията на Коди.",
"LabelKodiMetadataSaveImagePaths": "Записване на пътеките към изображенията в nfo файловете",
"LabelChannels": "Канали:",
"DropShadow": "Сянка",
"Raised": "Повишено",
"OptionResElement": "рес. елемент"
}

View File

@ -14,7 +14,7 @@
"AllEpisodes": "Všechny epizody",
"AllLanguages": "Všechny jazyky",
"AllowHWTranscodingHelp": "Povolit tuneru překódování v reálném čase. Může snížit zátěž překódovávání požadované Jellyfin serverem.",
"AlwaysPlaySubtitles": "Vždy zobrazit titulky",
"AlwaysPlaySubtitles": "Vždy zobrazovat",
"AlwaysPlaySubtitlesHelp": "Titulky odpovídající jazykové předvolbě se načtou bez ohledu na jazyk audia.",
"Anytime": "Kdykoliv",
"AroundTime": "Okolo {0}",
@ -158,7 +158,7 @@
"Display": "Zobrazení",
"DisplayMissingEpisodesWithinSeasons": "Zobrazit chybějící epizody",
"DisplayMissingEpisodesWithinSeasonsHelp": "Toto musí být zapnuto pro knihovny TV v nastavení serveru.",
"DisplayModeHelp": "Zvolte typ obrazovky, na které používáte Jellyfin.",
"DisplayModeHelp": "Vyberte styl rozvržení, který chcete pro rozhraní.",
"DoNotRecord": "Nenahrávat",
"Down": "Dolů",
"Download": "Stáhnout",
@ -461,7 +461,7 @@
"LabelArtist": "Umělec",
"LabelArtists": "Umělci:",
"LabelArtistsHelp": "Odděl pomocí ;",
"LabelAudio": "Zvuk:",
"LabelAudio": "Zvuk",
"LabelAudioLanguagePreference": "Preferovaný jazyk zvuku:",
"LabelBindToLocalNetworkAddress": "Vázat na místní síťovou adresu:",
"LabelBindToLocalNetworkAddressHelp": "Volitelné. Přepsat lokální IP adresu vazanou na http server. Pokud je ponecháno prázdné, server se sváže ke všem dostupným adresám (aplikace bude dostupná na všech síťových zařízení, které server nabízí). Změna této hodnoty vyžaduje restartování Jellyfin Serveru.",
@ -709,7 +709,7 @@
"LabelStopping": "Zastavování",
"LabelSubtitleFormatHelp": "Příklad: srt",
"LabelSubtitlePlaybackMode": "Mód titulků:",
"LabelSubtitles": "Titulky:",
"LabelSubtitles": "Titulky",
"LabelSupportedMediaTypes": "Podporované typy médií:",
"LabelTagline": "Slogan:",
"LabelTextBackgroundColor": "Barva pozadí textu:",
@ -862,14 +862,14 @@
"NoNextUpItemsMessage": "Nic nenalezeno. Začněte sledovat Vaše oblíbené seriály!",
"NoPluginConfigurationMessage": "Tento zásuvný modul nemá žádné nastavení.",
"NoSubtitleSearchResultsFound": "Žádné výsledky.",
"NoSubtitles": "Žádné titulky",
"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í",
"NumLocationsValue": "{0} složky",
"Off": "Vypnuto",
"OneChannel": "Jeden kanál",
"OnlyForcedSubtitles": "Pouze vynucené titulky",
"OnlyForcedSubtitles": "Pouze vynucené",
"OnlyForcedSubtitlesHelp": "Jen vynucené titulky budou nahrány.",
"OptionAdminUsers": "Administrátoři",
"OptionAlbumArtist": "Umělec Alba",
@ -1248,7 +1248,7 @@
"Blacklist": "Černá listina",
"BobAndWeaveWithHelp": "Bob and weave (vyšší kvalita, ale pomalejší)",
"Browse": "Procházet",
"BurnSubtitlesHelp": "Určuje, zda má server vypalovat titulky při převodu videa v závislosti na formátu titulků. Vynechání vypalování titulků zlepší výkon serveru. Chcete-li vypálit grafické formáty (VOBSUB, PGS, SUB / IDX atd.) a některé titulky ASS / SSA, vyberte možnost Auto.",
"BurnSubtitlesHelp": "Určuje, zda má server vypalovat titulky při překódování videa. Vynechání tohoto zlepší výkon serveru. Chcete-li vypálit grafické formáty (VOBSUB, PGS, SUB / IDX atd.) a některé titulky ASS / SSA, vyberte možnost Auto.",
"ButtonInfo": "Info",
"ButtonMenu": "Menu",
"ButtonOk": "Ok",
@ -1276,8 +1276,7 @@
"DetectingDevices": "Hledání zařízení",
"DirectPlayError": "Chyba přímého přehrávání",
"DirectStreamHelp2": "Přímé streamování souboru používá velmi malý výkon bez ztráty kvality videa.",
"DirectorValue": "Režisér: {0}",
"DirectorsValue": "Režiséři: {0}",
"Directors": "Režiséři",
"Disabled": "Vypnuto",
"DisplayInMyMedia": "Zobrazit na domovské obrazovce",
"DisplayInOtherHomeScreenSections": "Zobrazení v sekcích domovské obrazovky, jako jsou nejnovější média, a pokračování ve sledování",
@ -1297,8 +1296,7 @@
"Filters": "Filtry",
"Folders": "Složky",
"General": "Hlavní",
"GenreValue": "Žánr: {0}",
"GenresValue": "Žánry: {0}",
"Genre": "Žánr",
"GroupBySeries": "Seskupit podle série",
"HandledByProxy": "Zpracováno reverzním proxy",
"HeaderAddLocalUser": "Přidat místního uživatele",
@ -1395,7 +1393,7 @@
"LabelUrl": "URL:",
"LabelUserAgent": "User agent:",
"LabelUserRemoteClientBitrateLimitHelp": "Přepíše výchozí globální hodnotu nastavenou v nastavení přehrávání serveru.",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"LabelVideoCodec": "Video kodek:",
"LeaveBlankToNotSetAPassword": "Můžete ponechat prázdné pro nastavení bez hesla.",
"LetterButtonAbbreviation": "A",
@ -1572,5 +1570,19 @@
"NoCreatedLibraries": "Zdá se, že jste dosud nevytvořili žádnou knihovnu. {0}Chtěli byste nějakou vytvořit nyní?{1}",
"AskAdminToCreateLibrary": "Požádejte administrátora o vytvoření knihovny.",
"AllowFfmpegThrottlingHelp": "Když se překódování nebo remux dostane dostatečně daleko dopředu od aktuální pozice přehrávání, pozastaví se proces, aby spotřeboval méně zdrojů. To je nejužitečnější při sledování bez častého vyhledávání. Pokud máte problémy s přehráváním, vypněte tuto funkci.",
"AllowFfmpegThrottling": "Omezit překódování"
"AllowFfmpegThrottling": "Omezit překódování",
"BoxSet": "Sbírka",
"Track": "Stopa",
"Season": "Sezóna",
"ReleaseGroup": "Vydavatel",
"PreferEmbeddedEpisodeInfosOverFileNames": "Preferovat vložené informace o epizodě před názvy souborů",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Používá se informace o epizodě z vložených metadat, pokud jsou k dispozici.",
"Person": "Osoba",
"OtherArtist": "Ostatní interpreti",
"Movie": "Film",
"Episode": "Epizoda",
"ClientSettings": "Nastavení klienta",
"Artist": "Interpret",
"AlbumArtist": "Interpret alba",
"Album": "Album"
}

View File

@ -1166,8 +1166,7 @@
"DirectStreamHelp1": "Medie filen er kompatibel med enheden i forhold til opløsning og medie type (H.264,AC3, etc.), men er i en ikke kompatibel fil container (mkv, avi, wmv, etc). Videoen vil blive genpakket live før den streames til enheden.",
"DirectStreamHelp2": "Direkte Streaming af en fil bruger meget lidt processor kraft uden nogen tab af video kvalitet.",
"DirectStreaming": "Direkte streaming",
"DirectorValue": "Instruktør: {0}",
"DirectorsValue": "Instruktører: {0}",
"Directors": "Instruktører",
"Disc": "Disk",
"Dislike": "Kan ikke lide",
"Display": "Visning",
@ -1207,8 +1206,7 @@
"Features": "Funktioner",
"Filters": "Filtre",
"FormatValue": "Format: {0}",
"GenreValue": "Genre: {0}",
"GenresValue": "Genrer: {0}",
"Genre": "Genre",
"GroupBySeries": "Gruppér efter serie",
"Guide": "Vejledning",
"GuideProviderLogin": "Log Ind",
@ -1270,7 +1268,7 @@
"Label3DFormat": "3D format:",
"LabelAlbum": "Album:",
"LabelArtist": "Kunstner",
"LabelAudio": "Lyd:",
"LabelAudio": "Lyd",
"LabelBitrateMbps": "Bitrate (Mbps):",
"LabelBlockContentWithTags": "Blokér filer med mærkerne:",
"LabelBurnSubtitles": "Brænd undertekster:",
@ -1315,7 +1313,7 @@
"LabelSortOrder": "Sorteringsorden:",
"LabelSoundEffects": "Lydeffekter:",
"LabelStatus": "Status:",
"LabelSubtitles": "Undertekster:",
"LabelSubtitles": "Undertekster",
"LabelSyncNoTargetsHelp": "Det ser ud til at du ikke har nogen apps der understøtter offline hentning.",
"LabelTVHomeScreen": "TV modus hjemmeskærm:",
"LabelTag": "Mærke:",
@ -1329,7 +1327,7 @@
"LabelUrl": "Link:",
"LabelVersion": "Version:",
"LabelVersionNumber": "Version {0}",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"LabelVideoCodec": "Video codec:",
"LabelWindowBackgroundColor": "Tekst baggrundsfarve:",
"LabelXDlnaCap": "X-DLNA begrænsning:",

View File

@ -1,5 +1,5 @@
{
"Absolute": "Gesamt",
"Absolute": "Absolut",
"AccessRestrictedTryAgainLater": "Der Zugriff ist derzeit eingeschränkt. Bitte versuche es später erneut.",
"Actor": "Darsteller(in)",
"Add": "Hinzufügen",
@ -175,8 +175,7 @@
"DirectStreamHelp2": "Direktes Streaming von Dateien benötigt sehr wenig Rechenleistung ohne Verlust der Videoqualität.",
"DirectStreaming": "Direktes Streaming",
"Director": "Regisseur",
"DirectorValue": "Regisseur: {0}",
"DirectorsValue": "Regisseure: {0}",
"Directors": "Regisseure",
"Disabled": "Abgeschaltet",
"Disc": "Disk",
"Disconnect": "Verbindung trennen",
@ -759,7 +758,7 @@
"LabelSubtitleDownloaders": "Untertitel Downloader:",
"LabelSubtitleFormatHelp": "Beispiel: srt",
"LabelSubtitlePlaybackMode": "Untertitelmodus:",
"LabelSubtitles": "Untertitel:",
"LabelSubtitles": "Untertitel",
"LabelSupportedMediaTypes": "Unterstüzte Medientypen:",
"LabelTVHomeScreen": "TV-Mode Startseite:",
"LabelTextBackgroundColor": "Hintergrundfarbe des Textes:",
@ -1069,6 +1068,8 @@
"PluginInstalledMessage": "Das Plugin wurde erfolgreich installiert. Der Jellyfin-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",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Bevorzugt die in den Metadaten eingebetteten Episodeninformationen.",
"PreferredNotRequired": "Bevorzugt, aber nicht benötigt",
"Premieres": "Premieren",
"Previous": "Vorheriges",
@ -1291,9 +1292,8 @@
"Extras": "Extras",
"FolderTypeTvShows": "TV Serien",
"FormatValue": "Format: {0}",
"GenreValue": "Genre: {0}",
"Genre": "Genre",
"Genres": "Genres",
"GenresValue": "Genres: {0}",
"HeaderAdmin": "Admin",
"HeaderApp": "App",
"HeaderGenres": "Genres",
@ -1305,7 +1305,7 @@
"Home": "Startseite",
"Horizontal": "Horizontal",
"LabelAlbum": "Album:",
"LabelAudio": "Audio:",
"LabelAudio": "Audio",
"LabelCache": "Cache:",
"LabelFormat": "Format:",
"LabelH264Crf": "H264 Encodierungs-CRF:",
@ -1324,7 +1324,7 @@
"LabelTypeText": "Text",
"LabelVersion": "Version:",
"LabelVersionNumber": "Version {0}",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"LeaveBlankToNotSetAPassword": "Du kannst dieses Feld frei lassen um kein Passwort zu setzen.",
"LinksValue": "Links: {0}",
"MessageImageFileTypeAllowed": "Nur JPEG- und PNG-Dateien werden unterstützt.",
@ -1401,7 +1401,7 @@
"TitleSupport": "Hilfe",
"Whitelist": "Erlaubt",
"AuthProviderHelp": "Auswählen eines Authentifizierungsanbieter, der zur Authentifizierung des Passworts dieses Benutzes verwendet werden soll.",
"Features": "Features",
"Features": "Funktionen",
"HeaderFavoriteBooks": "Lieblingsbücher",
"HeaderFavoriteMovies": "Lieblingsfilme",
"HeaderFavoriteShows": "Lieblingsserien",
@ -1491,5 +1491,6 @@
"NoCreatedLibraries": "Sieht so aus als hättest du bis jetzt keine Bibliothek erstellt. {0}Möchtest du jetzt eine Bibliothek erstellen?{1}",
"AllowFfmpegThrottling": "Transkodierung drosseln",
"PlaybackErrorNoCompatibleStream": "Es gab ein Problem bei der Erkennung des Wiedergabeprofils des Clients und der Server sendet kein kompatibles Format.",
"AllowFfmpegThrottlingHelp": "Wenn eine Transkodierung oder ein Remux weit genug über die aktuelle Abspielposition fortgeschritten ist, pausiere sie sodass weniger Ressourcen verbraucht werden. Dies ist am nützlichsten, wenn wenig geskippt wird. Bei Wiedergabeproblemen sollte diese Option deaktiviert werden."
"AllowFfmpegThrottlingHelp": "Wenn eine Transkodierung oder ein Remux weit genug über die aktuelle Abspielposition fortgeschritten ist, pausiere sie sodass weniger Ressourcen verbraucht werden. Dies ist am nützlichsten, wenn wenig geskippt wird. Bei Wiedergabeproblemen sollte diese Option deaktiviert werden.",
"ClientSettings": "Client Einstellungen"
}

View File

@ -166,8 +166,7 @@
"DirectStreamHelp2": "Η άμεση ροή ενός αρχείου χρησιμοποιεί ελάχιστη ισχύ επεξεργασίας χωρίς απώλεια της ποιότητας του βίντεο.",
"DirectStreaming": "Απευθείας Αναμετάδοση",
"Director": "Σκηνοθέτης",
"DirectorValue": "Σκηνοθέτης: {0}",
"DirectorsValue": "Σκηνοθέτες: {0}",
"Directors": "Σκηνοθέτες",
"Disabled": "Απενεργοποιημένο",
"Disc": "Δίσκος",
"Disconnect": "Αποσύνδεση",
@ -233,9 +232,8 @@
"Friday": "Παρασκευή",
"Fullscreen": "ΠΛΗΡΗΣ ΟΘΟΝΗ",
"General": "Γενικά",
"GenreValue": "Είδος: {0}",
"Genre": "Είδος",
"Genres": "Είδη",
"GenresValue": "Είδη: {0}",
"GroupBySeries": "Ομαδοποίηση κατά σειρά",
"GroupVersions": "Ομαδικές εκδόσεις",
"GuestStar": "Φιλική Συμμετοχή",
@ -452,7 +450,7 @@
"LabelAppNameExample": "Παράδειγμα: Sickbeard, NzbDrone",
"LabelArtists": "Καλλιτέχνες:",
"LabelArtistsHelp": "Ξεχωρίστε πολλαπλά χρησιμοποιώντας;",
"LabelAudio": "Ήχος:",
"LabelAudio": "Ήχος",
"LabelAudioLanguagePreference": "Προτιμώμενη γλώσσα ήχου:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Αυτόματη ανανέωση μεταδεδομένων από το internet:",
"LabelBirthDate": "Ημερομηνία Γενεθλίων:",
@ -666,7 +664,7 @@
"LabelStopWhenPossible": "Διακοπή όταν είναι δυνατόν:",
"LabelSubtitleFormatHelp": "Παράδειγμα: srt",
"LabelSubtitlePlaybackMode": "Λειτουργία υποτίτλων:",
"LabelSubtitles": "Υπότιτλοι:",
"LabelSubtitles": "Υπότιτλοι",
"LabelSupportedMediaTypes": "Υποστηριζόμενοι τύποι μέσων:",
"LabelTVHomeScreen": "Αρχική οθόνη λειτουργίας τηλεόρασης:",
"LabelTag": "Ετικέτα:",
@ -696,7 +694,7 @@
"LabelVersion": "Έκδοση:",
"LabelVersionInstalled": "{0} εγκαταστήθηκε",
"LabelVersionNumber": "Έκδοση {0}",
"LabelVideo": "Βίντεο:",
"LabelVideo": "Βίντεο",
"LabelXDlnaCapHelp": "Καθορίζει το περιεχόμενο του στοιχείου X_DLNACAP στο urn:schemas-dlna-org:device-1-0 namespace.",
"LabelXDlnaDocHelp": "Καθορίζει το περιεχόμενο του στοιχείου X_DLNACAP στο urn:schemas-dlna-org:device-1-0 namespace.",
"LabelYear": "Έτος:",

View File

@ -223,8 +223,7 @@
"DirectStreamHelp2": "Direct Streaming a file uses very little processing power without any loss in video quality.",
"DirectStreaming": "Direct streaming",
"Director": "Director",
"DirectorValue": "Director: {0}",
"DirectorsValue": "Directors: {0}",
"Directors": "Directors",
"Disabled": "Disabled",
"Disc": "Disc",
"Disconnect": "Disconnect",
@ -299,8 +298,7 @@
"Friday": "Friday",
"Fullscreen": "Full screen",
"General": "General",
"GenreValue": "Genre: {0}",
"GenresValue": "Genres: {0}",
"Genre": "Genre",
"GroupBySeries": "Group by series",
"GroupVersions": "Group versions",
"GuestStar": "Guest star",
@ -808,7 +806,7 @@
"LabelTag": "Tag:",
"LabelTVHomeScreen": "TV mode home screen:",
"LabelSupportedMediaTypes": "Supported Media Types:",
"LabelSubtitles": "Subtitles:",
"LabelSubtitles": "Subtitles",
"LabelSubtitlePlaybackMode": "Subtitle mode:",
"LabelSubtitleFormatHelp": "Example: srt",
"LabelSubtitleDownloaders": "Subtitle downloaders:",
@ -1169,7 +1167,7 @@
"LabelAudioChannels": "Audio channels:",
"LabelAudioBitrate": "Audio bitrate:",
"LabelAudioBitDepth": "Audio bit depth:",
"LabelAudio": "Audio:",
"LabelAudio": "Audio",
"LabelArtistsHelp": "Separate multiple using ;",
"LabelArtists": "Artists:",
"LabelAppName": "App name",
@ -1338,7 +1336,7 @@
"MediaInfoSoftware": "Software",
"ValueOneSeries": "1 series",
"MediaInfoBitrate": "Bitrate",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"LabelPrevious": "Previous",
"LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.",
"LabelKodiMetadataEnableExtraThumbs": "Copy extrafanart to extrathumbs field",

View File

@ -11,11 +11,13 @@
"AdditionalNotificationServices": "Browse the plugin catalog to install additional notification services.",
"AirDate": "Air date",
"Aired": "Aired",
"Album": "Album",
"AlbumArtist": "Album Artist",
"Albums": "Albums",
"Alerts": "Alerts",
"All": "All",
"AllChannels": "All channels",
"AllComplexFormats": "All complex formats (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc.)",
"AllComplexFormats": "All Complex Formats (ASS, SSA, VOBSUB, PGS, SUB, IDX)",
"AllEpisodes": "All episodes",
"AllLanguages": "All languages",
"AllLibraries": "All libraries",
@ -29,12 +31,13 @@
"AllowRemoteAccess": "Allow remote connections to this Jellyfin Server.",
"AllowRemoteAccessHelp": "If unchecked, all remote connections will be blocked.",
"AllowedRemoteAddressesHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be allowed to connect remotely. If left blank, all remote addresses will be allowed.",
"AlwaysPlaySubtitles": "Always play subtitles",
"AlwaysPlaySubtitles": "Always Play",
"AlwaysPlaySubtitlesHelp": "Subtitles matching the language preference will be loaded regardless of the audio language.",
"AnyLanguage": "Any language",
"AnyLanguage": "Any Language",
"Anytime": "Anytime",
"AroundTime": "Around {0}",
"Art": "Art",
"Artist": "Artist",
"Artists": "Artists",
"AsManyAsPossible": "As many as possible",
"Ascending": "Ascending",
@ -55,10 +58,11 @@
"BookLibraryHelp": "Audio and text books are supported. Review the {0}book naming guide{1}.",
"Books": "Books",
"Box": "Box",
"BoxSet": "Box Set",
"BoxRear": "Box (rear)",
"Browse": "Browse",
"BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins.",
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitle format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB/IDX, etc) and certain ASS/SSA subtitles.",
"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",
@ -147,6 +151,7 @@
"ChannelNumber": "Channel number",
"Channels": "Channels",
"CinemaModeConfigurationHelp": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.",
"ClientSettings": "Client Settings",
"Collections": "Collections",
"ColorPrimaries": "Color primaries",
"ColorSpace": "Color space",
@ -191,8 +196,7 @@
"DirectStreamHelp2": "Direct Streaming a file uses very little processing power without any loss in video quality.",
"DirectStreaming": "Direct streaming",
"Director": "Director",
"DirectorValue": "Director: {0}",
"DirectorsValue": "Directors: {0}",
"Directors": "Directors",
"Disabled": "Disabled",
"Disc": "Disc",
"Disconnect": "Disconnect",
@ -202,7 +206,7 @@
"DisplayInOtherHomeScreenSections": "Display in home screen sections such as latest media and continue watching",
"DisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"DisplayMissingEpisodesWithinSeasonsHelp": "This must also be enabled for TV libraries in the server configuration.",
"DisplayModeHelp": "Select the type of screen you're running Jellyfin on.",
"DisplayModeHelp": "Select the layout style you want for the interface.",
"DoNotRecord": "Do not record",
"Down": "Down",
"Download": "Download",
@ -234,6 +238,7 @@
"EnableThemeVideosHelp": "Play theme videos in the background while browsing the library.",
"Ended": "Ended",
"EndsAtValue": "Ends at {0}",
"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.",
@ -271,9 +276,8 @@
"Friday": "Friday",
"Fullscreen": "Full screen",
"General": "General",
"GenreValue": "Genre: {0}",
"Genre": "Genre",
"Genres": "Genres",
"GenresValue": "Genres: {0}",
"GroupBySeries": "Group by series",
"GroupVersions": "Group versions",
"GuestStar": "Guest star",
@ -550,7 +554,7 @@
"LabelAppNameExample": "Example: Sickbeard, Sonarr",
"LabelArtists": "Artists:",
"LabelArtistsHelp": "Separate multiple using ;",
"LabelAudio": "Audio:",
"LabelAudio": "Audio",
"LabelAudioBitDepth": "Audio bit depth:",
"LabelAudioBitrate": "Audio bitrate:",
"LabelAudioChannels": "Audio channels:",
@ -840,7 +844,7 @@
"LabelSubtitleDownloaders": "Subtitle downloaders:",
"LabelSubtitleFormatHelp": "Example: srt",
"LabelSubtitlePlaybackMode": "Subtitle mode:",
"LabelSubtitles": "Subtitles:",
"LabelSubtitles": "Subtitles",
"LabelSupportedMediaTypes": "Supported Media Types:",
"LabelTVHomeScreen": "TV mode home screen:",
"LabelTag": "Tag:",
@ -886,7 +890,7 @@
"DashboardServerName": "Server: {0}",
"DashboardOperatingSystem": "Operating System: {0}",
"DashboardArchitecture": "Architecture: {0}",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"LabelVideoBitrate": "Video bitrate:",
"LabelVideoCodec": "Video codec:",
"LabelVideoResolution": "Video resolution:",
@ -1017,6 +1021,7 @@
"MoveLeft": "Move left",
"MoveRight": "Move right",
"MovieLibraryHelp": "Review the {0}movie naming guide{1}.",
"Movie": "Movie",
"Movies": "Movies",
"MusicAlbum": "Music Album",
"MusicArtist": "Music Artist",
@ -1040,16 +1045,16 @@
"NoNextUpItemsMessage": "None found. Start watching your shows!",
"NoPluginConfigurationMessage": "This plugin has no settings to configure.",
"NoSubtitleSearchResultsFound": "No results found.",
"NoSubtitles": "No subtitles",
"NoSubtitles": "None",
"NoSubtitlesHelp": "Subtitles will not be loaded by default. They can still be turned on manually during playback.",
"None": "None",
"Normal": "Normal",
"NumLocationsValue": "{0} folders",
"Off": "Off",
"OneChannel": "One channel",
"OnlyForcedSubtitles": "Only forced subtitles",
"OnlyForcedSubtitles": "Only Forced",
"OnlyForcedSubtitlesHelp": "Only subtitles marked as forced will be loaded.",
"OnlyImageFormats": "Only image formats (VOBSUB, PGS, SUB, etc)",
"OnlyImageFormats": "Only Image Formats (VOBSUB, PGS, SUB)",
"Option3D": "3D",
"OptionAdminUsers": "Administrators",
"OptionAlbum": "Album",
@ -1203,6 +1208,7 @@
"OptionWeekends": "Weekends",
"OptionWeekly": "Weekly",
"OriginalAirDateValue": "Original air date: {0}",
"OtherArtist": "Other Artist",
"Overview": "Overview",
"PackageInstallCancelled": "{0} installation cancelled.",
"PackageInstallCompleted": "{0} installation completed.",
@ -1216,6 +1222,7 @@
"PasswordSaved": "Password saved.",
"People": "People",
"PerfectMatch": "Perfect match",
"Person": "Person",
"Photos": "Photos",
"PictureInPicture": "Picture in picture",
"PinCodeResetComplete": "The pin code has been reset.",
@ -1239,6 +1246,8 @@
"PluginInstalledMessage": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.",
"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 informations from the embedded metadata if available.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Prefer embedded episode informations over filenames",
"PreferredNotRequired": "Preferred, but not required",
"Premiere": "Premiere",
"Premieres": "Premieres",
@ -1267,6 +1276,7 @@
"RefreshMetadata": "Refresh metadata",
"RefreshQueued": "Refresh queued.",
"ReleaseDate": "Release date",
"ReleaseGroup": "Release Group",
"RememberMe": "Remember me",
"RemoveFromCollection": "Remove from collection",
"RemoveFromPlaylist": "Remove from playlist",
@ -1297,6 +1307,7 @@
"SearchForMissingMetadata": "Search for missing metadata",
"SearchForSubtitles": "Search for Subtitles",
"SearchResults": "Search Results",
"Season": "Season",
"SelectAdminUsername": "Please select a username for the admin account.",
"SendMessage": "Send message",
"Series": "Series",
@ -1412,6 +1423,7 @@
"TitleHardwareAcceleration": "Hardware Acceleration",
"TitleHostingSettings": "Hosting Settings",
"TitlePlayback": "Playback",
"Track": "Track",
"TrackCount": "{0} tracks",
"Trailers": "Trailers",
"Transcoding": "Transcoding",

View File

@ -68,7 +68,7 @@
"AllowMediaConversion": "Permitir conversión de medios",
"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 pueden ser extraídos de videos y entregados a apps de Jellyfin en texto plano para ayudar a prevenir la transcodificación de video. En algunos sistemas esto puede llevar un largo tiempo y causar demoras en la reproducción durante el proceso de extracción. Desactivar esta opción para quemar los subtítulos incrustados en la transcodificación de video cuando no son soportados nativamente por el dispositivo cliente.",
"AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados pueden extraerse de los videos y entregarse a los reproductores 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.",
"AllowRemoteAccess": "Permitir conexiones remotas a este Servidor Jellyfin.",
"AllowRemoteAccessHelp": "Si no está tildado, todas las conexiones remotas serán bloqueadas.",
"AlwaysPlaySubtitles": "Siempre reproducir subtítulos",
@ -81,7 +81,7 @@
"AutoBasedOnLanguageSetting": "Auto (basado en configuración de idioma)",
"AutomaticallyConvertNewContent": "Convertir contenido nuevo automáticamente",
"Backdrop": "Fondo",
"AllowHWTranscodingHelp": "Si se activa, se permitirá al sintonizador transcodificar streams al vuelo. Esto podría ayudar a reducir la transcodificación requerida por el servidor Jellyfin.",
"AllowHWTranscodingHelp": "Permite que el sintonizador transcodifique las 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.",
"AlwaysPlaySubtitlesHelp": "Los subtítulos que concuerden con la preferencia de idioma se cargarán independientemente del idioma del audio.",
"AndroidUnlockRestoreHelp": "Para recuperar tu compra anterior, por favor asegurate que iniciaste sesión en el dispositivo con la misma cuenta de Google (o Amazon) que hizo la compra originalmente. Asegurate de que la tienda de aplicaciones esté habilitada y no posea control parental alguno, y que tiene una conexión a Internet activa. Solo tendrás que hacer esto una sola vez para recuperar tu compra anterior.",
@ -102,12 +102,12 @@
"BirthPlaceValue": "Lugar de nacimiento: {0}",
"Blacklist": "Lista negra",
"BobAndWeaveWithHelp": "Bob and weave (mayor calidad, pero más lento)",
"BookLibraryHelp": "Libros de audio y de texto son soportados. Revise la {0}guía de nombrado de libros de Jellyfin{1}.",
"BookLibraryHelp": "Los libros de texto y audio libros son soportados. Revise la {0}Guía para Nomenclatura de Libros{1}.",
"Box": "Caja",
"BoxRear": "Caja (lado opuesto)",
"Browse": "Explorar",
"BrowsePluginCatalogMessage": "Explore nuestro catálogo de complementos para ver los complementos disponibles.",
"BurnSubtitlesHelp": "Determine si el servidor debería incrustar los subtítulos cuando convierte los videos dependiendo del formato de subtítulo. Evitar incrustar subtitulos mejorará el rendimiento del servidor. Seleccione Auto para incrustar formatos basados en imagen (por ejemplo, VOBSUB, PGS, SUB/IDX, etc.), como así también ciertos subtítulos ASS/SSA",
"BurnSubtitlesHelp": "Determina si el servidor debe grabar subtítulos al convertir videos dependiendo del formato de los subtítulos. Evitar la grabación de subtítulos mejorará el rendimiento del servidor. Seleccione Auto para grabar formatos basados en imágenes (VOBSUB, PGS, SUB/IDX, etc.) y ciertos subtítulos ASS/SSA.",
"ButtonAccept": "Aceptar",
"ButtonAdd": "Agregar",
"ButtonAddMediaLibrary": "Agregar biblioteca de medios",
@ -308,12 +308,11 @@
"DeviceLastUsedByUserName": "Usado ultima vez por {0}",
"DirectPlayError": "Error en la reproducción directa",
"DirectPlaying": "Reproducción directa",
"DirectStreamHelp1": "El medio es compatible con el dispositivo respecto a la resolución y el tipo de medio (H.264, AC3, etc.), pero esta en un contenedor incompatible (.mkv, .avi, .wmv, etc.). El video va a ser re-empaquetado en el momento que sea transmitido al dispositivo.",
"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 sera reempaquetado en el acto antes de transmitirlo al dispositivo.",
"DirectStreamHelp2": "Transmitir directamente un archivo usa muy poco procesamiento, esto sin perdida en la calidad de video.",
"DirectStreaming": "Transmisión en directo",
"Director": "Director",
"DirectorValue": "Director: {0}",
"DirectorsValue": "Directores: {0}",
"Directors": "Directores",
"Disabled": "Deshabilitado",
"Disc": "Disco",
"Disconnect": "Desconectar",
@ -321,7 +320,7 @@
"DisplayInMyMedia": "Mostrar en pantalla principal",
"DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla principal, como últimos medios y continuar viendo",
"DisplayMissingEpisodesWithinSeasons": "Mostrar episodios faltantes entre temporadas",
"DisplayMissingEpisodesWithinSeasonsHelp": "Esto debe ser habilitado en las bibilotecas de TV, en la configuracion del servidor de Jellyfin.",
"DisplayMissingEpisodesWithinSeasonsHelp": "Esto también debe estar habilitado para las bibliotecas de TV en la configuración del servidor.",
"DisplayModeHelp": "Selecciona el tipo de pantalla en el cual estas usando Jellyfin.",
"DoNotRecord": "No grabar",
"Down": "Abajo",
@ -345,7 +344,7 @@
"EnableBackdropsHelp": "Si esta habilitado, los fondos van a ser mostrados en segundo plano de algunas paginas mientras estas en la biblioteca.",
"EnableCinemaMode": "Habilitar modo Cine",
"EnableColorCodedBackgrounds": "Habilitar colores en el fondo del codigo",
"AuthProviderHelp": "Selecciona un Proveedor de Autenticación para autenticar la contraseña de este usuario",
"AuthProviderHelp": "Seleccione un proveedor de autenticación que se utilizará para autenticar la contraseña de este usuario.",
"CriticRating": "Calificación de la crítica",
"DefaultSubtitlesHelp": "Los subtítulos se cargan en base a los indicadores por defecto y los indicadores forzados en los metadatos embebidos. Las preferencias de idioma son consideradas cuando existe más de una opción.",
"Dislike": "No me gusta",
@ -398,8 +397,7 @@
"Friday": "Viernes",
"Fullscreen": "Pantalla Completa",
"General": "General",
"GenreValue": "Género: {0}",
"GenresValue": "Géneros: {0}",
"Genre": "Género",
"GroupBySeries": "Agrupar por Serie",
"GroupVersions": "Agrupar versiones",
"GuestStar": "Estrella invitada",
@ -411,5 +409,13 @@
"HeaderFavoriteEpisodes": "Episodios favoritos",
"HeaderFavoriteArtists": "Artistas favoritos",
"HeaderFavoriteAlbums": "Álbumes favoritos",
"Shows": "Series"
"Shows": "Series",
"CopyStreamURLError": "Hubo un error copiando la URL.",
"CopyStreamURLSuccess": "URL copiada con éxito.",
"CopyStreamURL": "Copiar la URL de la transmisión",
"ButtonSplit": "Dividir",
"ButtonAddImage": "Agregar imagen",
"AskAdminToCreateLibrary": "Pregunte al administrador para crear una biblioteca.",
"AllowFfmpegThrottlingHelp": "Cuando una transcodificación o conversión avanza demasiado con respecto a la posición actual de la reproducción, se pausara el proceso para consumir menos recursos. esto es mas útil cuando no se hacen búsquedas de tiempo a menudo. Desactive esta opción si experimenta problemas en la reproducción.",
"AllowFfmpegThrottling": "Transcodificación Throttle"
}

View File

@ -179,7 +179,7 @@
"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 sera reempaquetado en el acto antes de transmitirlo al dispositivo.",
"DirectStreamHelp2": "La Transmisión Directa de un archivo usa muy poco poder de procesamiento sin ninguna perdida en la calidad de video.",
"DirectStreaming": "Transmisión Directa",
"DirectorsValue": "Directores: {0}",
"Directors": "Directores",
"Disabled": "Desactivado",
"Disc": "DIsco",
"Disconnect": "Desconectar",
@ -195,7 +195,7 @@
"Download": "Descargar",
"DownloadsValue": "{0} descargas",
"DrmChannelsNotImported": "Los canales con DRM no serán importados.",
"DropShadow": "Mostrar sombra",
"DropShadow": "Sombra Paralela",
"EasyPasswordHelp": "Su código PIN fácil se utiliza para el acceso sin conexión en los clientes compatibles y también puede utilizarse para acceder fácilmente cuando se está en la misma red.",
"Edit": "Editar",
"EditImages": "Editar imágenes",
@ -255,9 +255,8 @@
"FormatValue": "Formato: {0}",
"Friday": "Viernes",
"Fullscreen": "Pantalla Completa",
"GenreValue": "Genero: {0}",
"Genre": "Genero",
"Genres": "Géneros",
"GenresValue": "Géneros: {0}",
"GroupBySeries": "Agrupar por series",
"GroupVersions": "Agrupar versiones",
"GuestStar": "Estrella invitada",
@ -782,7 +781,7 @@
"LabelSubtitleDownloaders": "Recolectores de Subtitulos:",
"LabelSubtitleFormatHelp": "Ejemplo: srt",
"LabelSubtitlePlaybackMode": "Modo de subtítulo:",
"LabelSubtitles": "Subtítulos:",
"LabelSubtitles": "Subtítulos",
"LabelSupportedMediaTypes": "Tipos de Medios Soportados:",
"LabelTVHomeScreen": "Modo de pantalla de TV:",
"LabelTag": "Etiqueta:",
@ -1350,7 +1349,6 @@
"ButtonTrailer": "Trailer",
"AuthProviderHelp": "Seleccione un proveedor de autenticación que se utilizará para autenticar la contraseña de este usuario.",
"Director": "Director",
"DirectorValue": "Director: {0}",
"Extras": "Extras",
"General": "General",
"HeaderAdmin": "Administrador",
@ -1367,7 +1365,7 @@
"HeaderRestartingServer": "Reiniciando servidor",
"HeaderVideos": "Videos",
"Horizontal": "Horizontal",
"LabelAudio": "Audio:",
"LabelAudio": "Audio",
"LabelAuthProvider": "Proveedor de autenticación:",
"LabelDynamicExternalId": "{0} Id:",
"LabelPasswordResetProvider": "Proveedor de restablecimiento de contraseña:",
@ -1380,7 +1378,7 @@
"DashboardServerName": "Servidor: {0}",
"DashboardOperatingSystem": "Sistema operativo: {0}",
"DashboardArchitecture": "Arquitectura: {0}",
"LabelVideo": "Video:",
"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.",

View File

@ -5,7 +5,7 @@
"AddToCollection": "Añadir a la colección",
"AddToPlaylist": "Añadir a la lista de reproducción",
"AddedOnValue": "Añadido {0}",
"AdditionalNotificationServices": "Visite el catálogo de complementos para instalar servicios de notificación adicionales.",
"AdditionalNotificationServices": "Visite el catálogo de extensiones para instalar servicios de notificación adicionales.",
"Albums": "Álbumes",
"Alerts": "Alertas",
"All": "Todo",
@ -40,7 +40,7 @@
"Box": "Caja",
"BoxRear": "Caja (trasera)",
"Browse": "Explorar",
"BrowsePluginCatalogMessage": "Navegar el catalogo de complementos para ver los complementos disponibles.",
"BrowsePluginCatalogMessage": "Explore el catálogo de extensiones para ver las extensiones disponibles.",
"ButtonAdd": "Añadir",
"ButtonAddMediaLibrary": "Añadir biblioteca de medios",
"ButtonAddScheduledTaskTrigger": "Agregar Activador",
@ -183,7 +183,7 @@
"ErrorAddingListingsToSchedulesDirect": "Ha habido un error añadiendo la alineación a tu cuenta de Schedules Direct. Schedules Direct solo permite un determinado número de alineaciones por cuenta. Necesitarás iniciar sesión en la web de Schedules Direct y quitar otras listas de tu cuenta antes de proceder.",
"ErrorAddingMediaPathToVirtualFolder": "Ha habido un error añadiendo la ruta de los medios. Por favor, asegúrate de que la ruta es válida y que el proceso del servidor Jellyfin tiene acceso a esa ubicación.",
"ErrorAddingTunerDevice": "Ha habido un error añadiendo el dispositivo sintonizador. Por favor, asegúrate de que es accesible e inténtalo otra vez.",
"ErrorAddingXmlTvFile": "Hubo un un error accediendo el archivo XML. Por favor, asegurese que el archivo existe e inténtalo de nuevo.",
"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.",
"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.",
@ -420,7 +420,7 @@
"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",
"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.",
@ -818,16 +818,16 @@
"MessageItemSaved": "Elemento grabado.",
"MessageItemsAdded": "Ítems añadidos.",
"MessageLeaveEmptyToInherit": "Dejar en blanco para heredar la configuración del elemento padre, o el valor global por defecto.",
"MessageNoAvailablePlugins": "No hay complementos disponibles.",
"MessageNoAvailablePlugins": "No hay extensiones disponibles.",
"MessageNoMovieSuggestionsAvailable": "No hay sugerencias de películas disponibles. Comience ver y calificar sus películas y vuelva para ver las recomendaciones.",
"MessageNoPluginsInstalled": "No tiene complementos instalados.",
"MessageNoPluginsInstalled": "No hay extensiones instaladas.",
"MessageNoTrailersFound": "No se han encontrado tráilers. Instala el canal de tráilers para mejorar su experiencia añadiendo una biblioteca de tráilers por internet.",
"MessageNothingHere": "Nada aquí.",
"MessagePasswordResetForUsers": "Se ha restablecido las contraseñas a los siguientes usuarios. Ahora pueden iniciar sesión con los códigos PIN que usaron para el restablecimiento.",
"MessagePleaseEnsureInternetMetadata": "Asegúrate de que la descarga de etiquetas desde internet está activada.",
"MessagePleaseWait": "Por favor, espere.",
"MessagePluginConfigurationRequiresLocalAccess": "Para configurar este complemento inicia sesión en tu servidor local directamente.",
"MessagePluginInstallDisclaimer": "Los complementos creados por los miembros de la comunidad de Jellyfin son una buena forma de mejorar tu experiencia Jellyfin 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.",
"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:",
@ -1138,7 +1138,7 @@
"TabMovies": "Películas",
"TabMusic": "Música",
"TabMusicVideos": "Videos musicales",
"TabMyPlugins": "Mis complementos",
"TabMyPlugins": "Mis extensiones",
"TabNetworks": "Cadenas",
"TabNfoSettings": "Ajustes de NFO",
"TabNotifications": "Notificaciones",
@ -1248,15 +1248,14 @@
"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.",
"Director": "Dirección de",
"DirectorValue": "Dirección de: {0}",
"DirectorsValue": "Directores: {0}",
"Director": "Dirección",
"Directors": "Directores",
"Display": "Mostrar",
"DisplayInMyMedia": "Mostrar en la pantalla de inicio",
"DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla de inicio al igual que \"últimos\" y \"continuar viendo\"",
"DisplayMissingEpisodesWithinSeasons": "Mostrar episodios ausentes en las temporadas",
"DisplayMissingEpisodesWithinSeasonsHelp": "Esto también debe ser habilitado para la biblioteca de TV en la configuración del servidor.",
"DropShadow": "Sombra",
"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.",
@ -1272,8 +1271,7 @@
"Filters": "Filtros",
"Folders": "Carpetas",
"General": "General",
"GenreValue": "Género: {0}",
"GenresValue": "Géneros: {0}",
"Genre": "Género",
"GroupBySeries": "Agrupar por series",
"GuideProviderLogin": "Credenciales",
"HeaderAlbumArtists": "Artistas del álbum",
@ -1290,7 +1288,7 @@
"HeaderVideoType": "Tipo de vídeo",
"Home": "Inicio",
"Horizontal": "Horizontal",
"LabelAudio": "Audio:",
"LabelAudio": "Audio",
"LabelBurnSubtitles": "Incrustar subtítulos:",
"LabelDashboardTheme": "Tema para la interfaz del servidor:",
"LabelDateTimeLocale": "Fecha y hora local:",
@ -1308,10 +1306,10 @@
"LabelSortBy": "Ordenar por:",
"LabelSortOrder": "Orden:",
"LabelSoundEffects": "Efectos de sonido:",
"LabelSubtitles": "Subtítulos:",
"LabelSubtitles": "Subtítulos",
"LabelTVHomeScreen": "Modo televisión en pantalla de inicio:",
"LabelVersion": "Versión:",
"LabelVideo": "Vídeo:",
"LabelVideo": "Vídeo",
"LabelXDlnaCap": "X-DNLA cap:",
"LabelXDlnaDoc": "X-DLNA doc:",
"LearnHowYouCanContribute": "Descubre cómo puedes contribuir.",
@ -1406,7 +1404,7 @@
"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",
"ShowTitle": "Título del show",
"ShowYear": "Año del show",
"SmallCaps": "Letras minúsculas",
"Smaller": "Más pequeño",
@ -1418,7 +1416,7 @@
"TV": "Televisión",
"TabInfo": "Info",
"TabLogs": "Registros",
"TabPlugins": "Complementos",
"TabPlugins": "Extensiones",
"TabSeries": "Series",
"TabTrailers": "Tráilers",
"TagsValue": "Etiquetas: {0}",
@ -1457,9 +1455,9 @@
"MusicLibraryHelp": "Revisar la {0}guía de nombres de música{1}.",
"FetchingData": "Obteniendo datos adicionales",
"ButtonAddImage": "Añadir imagen",
"HeaderFavoritePeople": "Gente Favorita",
"HeaderFavoritePeople": "Gente favorita",
"OptionRandom": "Aleatorio",
"SelectAdminUsername": "Por favor seleccione un nombre de usuario para la cuenta de administrador.",
"SelectAdminUsername": "Por favor seleccione un nombre de usuario para la cuenta administrador.",
"ButtonSplit": "Dividir",
"HeaderNavigation": "Navegación",
"MessageConfirmAppExit": "¿Quieres salir?",
@ -1476,5 +1474,8 @@
"LabelDroppedFrames": "Frames perdidos:",
"LabelCorruptedFrames": "Frames corruptos:",
"AskAdminToCreateLibrary": "Solo un administrador puede crear librerías.",
"AllowFfmpegThrottling": "Acelerar transcodificación"
"AllowFfmpegThrottling": "Acelerar transcodificación",
"ClientSettings": "Ajustes de cliente",
"PreferEmbeddedEpisodeInfosOverFileNames": "Priorizar la información embebida sobre los nombres de archivos",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Usar la información de episodio de los metadatos embebidos si está disponible."
}

View File

@ -33,9 +33,9 @@
"HeaderFilters": "فیلتر ها",
"HeaderImageOptions": "گزینه های تصویر",
"HeaderInstantMix": "درهم کردن فوری",
"HeaderKodiMetadataHelp": "برای فعال یا غیرفعال سازی متاداده های Nfo ، یک کتابخانه را در صفحه تنظیم کتابخانه Jellyfin ویرایش کرده و قسمت سرورهای متاداده را مسیردهی کنید.",
"HeaderKodiMetadataHelp": "برای فعال یا غیرفعال سازی ابرداده‌های Nfo ، یک کتابخانه را در صفحه تنظیم کتابخانه Jellyfin ویرایش کرده و قسمت سرورهای ابرداده را مسیردهی کنید.",
"HeaderLatestEpisodes": "آخرین قسمت ها",
"HeaderNextUp": "بعدی",
"HeaderNextUp": "قسمت بعدی",
"HeaderPaths": "مسیرها",
"HeaderPlayAll": "پخش همه",
"HeaderPreferredMetadataLanguage": "زبان مدنظر اطلاعات محتوی",
@ -113,31 +113,307 @@
"UserProfilesIntro": "Jellyfin دارای پشتیبانی داخلی از پروفایل کاربران می باشد. با فعال سازی هر کاربر، او می تواند تنظیمات ، وضعیت پخش و کنترل والدین خاص خودش را داشته باشد.",
"WelcomeToProject": "به Jellyfin خوش آمدید!",
"WizardCompleted": "همه چیزی که فعلا می خواهیم همین است.جمع آوری اطلاعات کتابخانه های شما هم اکنون توسط Jellyfin آغاز شده است. اپلیکیشن های ما را امتحان کنید و سپس بر روی <b> پایان </b> کلیک کنید تا <b> پیشخوان سرور </b> را مشاهده نمایید.",
"Albums": "آلبوم ها",
"Albums": "آلبومها",
"Artists": "هنرمندان",
"Books": "کتاب ها",
"Channels": "کانال ها",
"Collections": "کلکسیون ها",
"Favorites": "مورد علاقه ها",
"Folders": "پوشه ها",
"Books": "کتابها",
"Channels": "کانالها",
"Collections": "مجموعه‌ها",
"Favorites": "مورد علاقهها",
"Folders": "پوشهها",
"Genres": "ژانرها",
"HeaderAlbumArtists": "هنرمندان آلبوم",
"HeaderFavoriteShows": "سریال های مورد علاقه",
"HeaderFavoriteEpisodes": "قسمت های مورد علاقه",
"HeaderFavoriteAlbums": "آلبوم های مورد علاقه",
"HeaderFavoriteShows": "سریالهای مورد علاقه",
"HeaderFavoriteEpisodes": "قسمتهای مورد علاقه",
"HeaderFavoriteAlbums": "آلبومهای مورد علاقه",
"HeaderFavoriteArtists": "هنرمندان مورد علاقه",
"HeaderFavoriteSongs": "آهنگ های مورد علاقه",
"HeaderFavoriteSongs": "آهنگهای مورد علاقه",
"HeaderLiveTV": "پخش زنده تلویزیون",
"Movies": "فیلم های سینمایی",
"Photos": "عکس ها",
"Playlists": "لیست های پخش",
"Shows": "سریال ها",
"Songs": "آهنگ ها",
"Sync": "همگامسازی",
"ValueSpecialEpisodeName": "ویژه- {0}",
"Movies": "فیلمها",
"Photos": "عکسها",
"Playlists": "لیستهای پخش",
"Shows": "سریالها",
"Songs": "موسیقی‌ها",
"Sync": "همگامسازی",
"ValueSpecialEpisodeName": "ویژه - {0}",
"AllEpisodes": "تمام قسمت ها",
"AllLanguages": "تمام زبان ها",
"AllLibraries": "تمام کتابخانه ها",
"AllowHWTranscodingHelp": "اگر فعال شود, اجازه میدهید تبدیل ( کم و زیاد کردن کیفیت ) درلحظه و توسط کارت دریافت سیگنال صورت گیرد. این کمک میکند به اینکه سرور جلیفین کمتر عمل تبدیل را انجام دهد.",
"AllowOnTheFlySubtitleExtraction": "اجازه میدهد در لحظه زیرنویس بازشود"
"AllowHWTranscodingHelp": "اگر فعال شود, اجازه می‌دهید تبدیل کیفیت در لحظه انجام شود. این ممکن است به کاهش کدگذاری لازم برای Jellyfin منجر بشود.",
"AllowOnTheFlySubtitleExtraction": "اجازه میدهد در لحظه زیرنویس بازشود",
"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": "لیست سیاه",
"BirthPlaceValue": "محل تولد: {0}",
"BirthLocation": "محل تولد",
"BirthDateValue": "متولد: {0}",
"Banner": "سرصفحه",
"Backdrops": "پس زمینه‌ها",
"Backdrop": "پس زمینه",
"AutoBasedOnLanguageSetting": "خودکار (بر اساس تنظیمات زبانی)",
"Auto": "خودکار",
"Audio": "صدا",
"AttributeNew": "جدید",
"AspectRatio": "نسبت ابعاد",
"AskAdminToCreateLibrary": "از کاربر مدیر بخواهید که یک کتابخانه ایجاد کند.",
"Ascending": "بالا رونده",
"AsManyAsPossible": "تا حدی که ممکن است",
"AroundTime": "حدود {0}",
"Anytime": "هر زمانی",
"AnyLanguage": "هر زبانی",
"AlwaysPlaySubtitles": "همیشه زیرنویس را نمایش بده",
"AllowFfmpegThrottling": "گلوگاه تبدیل کیفیت",
"AllChannels": "همه‌ی کانال‌ها",
"Alerts": "هشدارها",
"Aired": "پخش شده",
"AirDate": "تاریخ پخش",
"AddedOnValue": "{0} افزوده شد",
"AddToPlaylist": "افزودن به لیست پخش",
"AddToPlayQueue": "افزودن به صف پخش",
"AddToCollection": "افزودن به مجموعه",
"ExitFullscreen": "خروج از تمام صفحه",
"EveryNDays": "هر {0} روز",
"ErrorMessageStartHourGreaterThanEnd": "زمان پایان باید پس از زمان شروع باشد.",
"Episodes": "قسمت‌ها",
"EndsAtValue": "تمام شده در {0}",
"Ended": "تمام شده",
"EnableThemeVideos": "تم فیلم‌ها",
"EnableThemeSongs": "آهنگ‌های تم",
"EnableStreamLooping": "چرخش خودکار پخش‌های زنده",
"EnablePhotos": "نمایش عکس‌ها",
"EnableNextVideoInfoOverlay": "نمایش اطلاعات ودیوی بعدی حین پخش ویدیو",
"EnableHardwareEncoding": "فعال سازی رمزگذاری سخت افزاری",
"EnableExternalVideoPlayersHelp": "یک منوی پخش کننده ویدیوی خارجی، زمانی که شروع به پخش ویدیو می‌شود نمایش داده خواهد شد.",
"EnableExternalVideoPlayers": "پخش کننده ویدیوی خارجی",
"EnableDisplayMirroring": "نمایش حالت آینه",
"EnableCinemaMode": "حالت سینما",
"EnableBackdrops": "پشت‌زمینه‌ها",
"EditSubtitles": "ویرایش زیرنویس‌ها",
"EditMetadata": "ویرایش ابرداده",
"EditImages": "ویرایش عکس‌ها",
"Edit": "ویرایش",
"DropShadow": "سایه پشت زمینه",
"DrmChannelsNotImported": "کانال‌ها با DRM وارد نخواند شد.",
"DownloadsValue": "{0} بارگیری‌ها",
"Download": "بارگیری",
"Down": "پایین",
"DoNotRecord": "ضبط نکن",
"DisplayModeHelp": "نوع صفحه نمایشی که Jellyfin را اجرا می‌کنید را انتخاب کنید‌‌.",
"DisplayMissingEpisodesWithinSeasons": "قسمت‌های ناموجود در فصل‌ها را نمایش بده",
"DisplayInMyMedia": "نمایش در صفحه‌ی خانه",
"Display": "نمایش",
"Dislike": "دوست نداشتن",
"Disconnect": "قطع اتصال",
"Disc": "دیسک",
"Directors": "کارگردانان",
"Director": "کارگردان",
"DirectStreaming": "پخش مستقیم",
"DirectStreamHelp2": "پخش مستقیم فایل از قدرت پردازش بسیار کمی بدون از دست دادن کیفیت ویدیو استفاده می‌کند.",
"DirectPlaying": "پخش مستقیم",
"DetectingDevices": "در حال تشخیص دستگاه‌ها",
"Descending": "پایین رونده",
"Depressed": "پژمرده",
"DeleteUserConfirmation": "آیا اطمینان دارید که می‌خواهید این کاربر را حذف کنید؟",
"DeleteUser": "حذف کاربر",
"DeleteImageConfirmation": "آیا اطمینان دارید که می‌خواهید این تصویر را حذف کنید؟",
"DeleteImage": "حذف تصویر",
"DeleteDeviceConfirmation": "آیا از حذف این دستگاه اطمینان دارید؟ هنگامی که یک کاربر دوباره با آن دستگاه وارد شود، دوباره نمایش داده می‌شود.",
"Delete": "حذف",
"DefaultMetadataLangaugeDescription": "این موارد پیشفرض‌های شماست و می‌توانید برای هر کتابخانه آن را شخصی سازی کنید.",
"DefaultErrorMessage": "خطایی در پردازش درخواست رخ داد. لطفا اندکی بعد دوباره تلاش کنید.",
"Default": "پیشفرض",
"DeathDateValue": "تلف شد: {0}",
"DatePlayed": "تاریخ پخش شده",
"DateAdded": "تاریخ اضافه شده",
"CriticRating": "امتیاز منتقدان",
"CopyStreamURLError": "در کپی کردن آدرس خطایی رخ داد.",
"CopyStreamURLSuccess": "آدرس با موفقیت کپی شد.",
"CopyStreamURL": "کپی آدرس پخش",
"Continuing": "ادامه",
"ContinueWatching": "ادامه تماشا",
"Connect": "اتصال",
"ConfirmEndPlayerSession": "آیا می‌خواهید Jellyfin را روی {0} خاموش کنید؟",
"ConfirmDeletion": "تایید حذف",
"ConfirmDeleteImage": "حذف تصویر؟",
"Composer": "آهنگساز",
"CommunityRating": "امتیاز عمومی",
"ColorTransfer": "انتقال رنگ",
"ColorSpace": "فضای رنگی",
"ColorPrimaries": "مقدمات رنگی",
"ClientSettings": "تنظیمات مشتری",
"ChannelNumber": "شماره کانال",
"ChannelNameOnly": "تنها کانال {0}",
"Categories": "دسته‌بندی‌ها",
"CancelSeries": "لغو سریال‌ها",
"CancelRecording": "لغو ضبط",
"ButtonWebsite": "وبسایت",
"ButtonViewWebsite": "بازدید وبسایت",
"ButtonUp": "بالا",
"ButtonUninstall": "حذف نصب",
"ButtonTrailer": "تریلر",
"ButtonSubtitles": "زیرنویس‌ها",
"ButtonSubmit": "تایید",
"ButtonSplit": "جدا کردن",
"ButtonStop": "توقف",
"ButtonStart": "شروع",
"ButtonSignIn": "ورود",
"ButtonShutdown": "خاموش",
"ButtonSelectDirectory": "انتخاب مسیر",
"ButtonEditOtherUserPreferences": "نمایه، تصویر و ترجیحات شخصی این کاربر را ویرایش کنید.",
"BrowsePluginCatalogMessage": "برای مرور کردن افزونه‌های موجود، به فروشگاه افزونه‌های ما سر بزنید.",
"AuthProviderHelp": "ارائه دهنده تأیید اعتبار را انتخاب کنید تا برای تأیید اعتبار گذرواژه این کاربر استفاده شود.",
"HeaderRecordingPostProcessing": "در حال ضبط پس پردازش",
"HeaderRecordingOptions": "گزینه‌های ضبط",
"HeaderRecentlyPlayed": "به تازگی پخش شده",
"HeaderProfileInformation": "اطلاعات نمایه",
"HeaderProfile": "نمایه",
"HeaderPluginInstallation": "نصب افزونه",
"HeaderPleaseSignIn": "لطفا وارد شوید",
"HeaderPlaybackError": "خطای پخش",
"HeaderPlayback": "پخش رسانه",
"HeaderPlayOn": "پخش در",
"HeaderPinCodeReset": "بازنشانی پین کد",
"HeaderPhotoAlbums": "آلبوم‌های عکس",
"HeaderPeople": "افراد",
"HeaderPendingInvitations": "دعوت‌های در انتظار",
"HeaderPasswordReset": "بازنشانی گذرواژه",
"HeaderPassword": "گذرواژه",
"HeaderParentalRatings": "رتبه بندی والدین",
"HeaderOtherItems": "آیتم‌های دیگر",
"HeaderOnNow": "هم اکنون",
"HeaderNextVideoPlayingInValue": "پخش ویدیوی بعد در {0}",
"HeaderNextEpisodePlayingInValue": "پخش قسمت بعدی در {0}",
"HeaderNewDevices": "دستگاه جدید",
"HeaderNewApiKey": "کلید API جدید",
"HeaderMyMediaSmall": "رسانه‌ی من (کوچک)",
"HeaderMyMedia": "رسانه‌ی من",
"HeaderMyDevice": "دستگاه‌های من",
"HeaderMusicVideos": "موزیک ویدیوها",
"HeaderMusicQuality": "کیفیت آهنگ",
"HeaderMovies": "فیلم‌ها",
"HeaderMoreLikeThis": "موارد مشابه با این",
"HeaderMetadataSettings": "تنظیمات ابرداده",
"HeaderMediaInfo": "اطلاعات رسانه",
"HeaderMediaFolders": "پوشه‌های رسانه",
"HeaderMedia": "رسانه",
"HeaderLoginFailure": "ورود ناموفق",
"HeaderLiveTvTunerSetup": "تنظیم تلویزیون زنده",
"HeaderLiveTv": "تلویزیون زنده",
"HeaderLibrarySettings": "تنظیمات کتابخانه",
"HeaderLibraryOrder": "ترتیت کتابخانه",
"HeaderLibraryFolders": "پوشه‌های کتابخانه",
"HeaderLibraryAccess": "دسترسی به کتابخانه",
"HeaderLibraries": "کتابخانه‌ها",
"HeaderLatestRecordings": "آخرین ضبط‌ها",
"HeaderLatestMusic": "آخرین آهنگ‌ها",
"HeaderLatestMovies": "آخرین فیلم‌ها",
"HeaderLatestMedia": "آخرین رسانه‌ها",
"HeaderKeepSeries": "سریال ادامه دهید",
"HeaderKeepRecording": "ضبط را ادامه دهید",
"HeaderItems": "موارد",
"HeaderInstall": "نصب",
"HeaderImageSettings": "تنظیمات عکس",
"HeaderIdentifyItemHelp": "یک یا بیشتر مورد برای جستجو وارد کنید. موارد را حذف کنید تا نتیجه جستجو را افزایش دهید.",
"HeaderIdentificationHeader": "سرفصل تعیین هویت",
"HeaderIdentificationCriteriaHelp": "حداقل یک مورد تعیین هویت وارد کنید.",
"HeaderIdentification": "تعیین هویت",
"HeaderHttpHeaders": "سرفصل‌های HTTP",
"HeaderHome": "خانه",
"HeaderGuideProviders": "ارائه دهنده داده راهنمای تلویزیونی",
"HeaderGenres": "ژانرها",
"HeaderFrequentlyPlayed": "اغلب پخش شده",
"HeaderForgotPassword": "فراموشی گذرواژه",
"HeaderForKids": "برای کودکان",
"HeaderFetchImages": "دریافت عکس‌ها:",
"HeaderFeatures": "برجسته‌ها",
"HeaderFeatureAccess": "دسترسی‌های برجسته",
"HeaderFavoriteVideos": "ویدیو‌های مورد علاقه",
"HeaderFavoritePeople": "افراد مورد علاقه",
"HeaderFavoriteMovies": "فیلم‌های مورد علاقه",
"HeaderFavoriteBooks": "کتاب‌های مورد علاقه",
"HeaderExternalIds": "ID های خارجی:",
"HeaderError": "خطا",
"HeaderEpisodes": "قسمت‌ها",
"HeaderEnabledFieldsHelp": "یک فیلد را برای جلوگیری از تغییر در داده‌ی آن علامت بزنید تا قفل بشود.",
"HeaderEnabledFields": "فیلد‌های فعال شده",
"HeaderEditImages": "ویرایش عکس‌ها",
"HeaderDownloadSync": "بارگیری و همگام‌سازی",
"HeaderDisplay": "نمایش",
"HeaderDirectPlayProfileHelp": "نمایه‌ی پخش مستقیم را اضافه کنید تا مشخص کنید با چه فرمی دستگاه می‌تواند محلی برخورد کند.",
"HeaderDirectPlayProfile": "نمایه‌ی پخش مستقیم",
"HeaderDevices": "دستگاه‌ها",
"HeaderDeveloperInfo": "اطلاعات توسعه دهنده",
"HeaderDetectMyDevices": "تشخیص دستگاه‌های من",
"HeaderDeleteTaskTrigger": "حذف راه انداز وظیفه",
"HeaderDeleteProvider": "حذف ارائه‌دهنده",
"HeaderDeleteItems": "حذف آیتم‌ها",
"HeaderDeleteItem": "حذف آیتم",
"HeaderDeleteDevice": "حذف دستگاه",
"HeaderDefaultRecordingSettings": "تنظمیات پیش‌فرض ضبط",
"HeaderDateIssued": "تاریخ صدور",
"HeaderCodecProfileHelp": "نمایه‌های کدک محدودیت‌های یک دستگاه را هنگام پخش کدک‌های خاص نشان می‌دهد. اگر محدودیتی اعمال شود، رسانه‌ها کد گذاری می‌شوند ، حتی اگر کدک برای پخش مستقیم پیکربندی شده باشد.",
"HeaderCodecProfile": "نمایه کدک",
"HeaderChapterImages": "عکس‌های سکانس",
"HeaderChannels": "کانال‌ها",
"HeaderChannelAccess": "دسترسی به کانال",
"HeaderCastCrew": "بازیگران و کارکنان",
"HeaderCastAndCrew": "بازیگران و کارکنان",
"HeaderCancelSeries": "لغو سریال",
"HeaderCancelRecording": "لغو ضبط",
"HeaderBooks": "کتاب‌ها",
"HeaderBlockItemsWithNoRating": "موارد مسدود شده با نقص یا عدم وجود اطلاعات امتیاز:"
}

View File

@ -240,8 +240,7 @@
"DirectStreamHelp2": "Tiedoston suoraan toistaminen käyttää erittäin vähän prosessorin resursseja ilman laadun heikentämistä.",
"DirectStreaming": "Suora suoratoisto",
"Director": "Ohjaaja",
"DirectorValue": "Ohjaaja: {0}",
"DirectorsValue": "Ohjaajat: {0}",
"Directors": "Ohjaajat",
"Disabled": "Pois päältä kytkettynä",
"Disc": "Levy",
"Disconnect": "Katkaise yhteys",
@ -257,7 +256,7 @@
"DownloadsValue": "{0} latausta",
"DrmChannelsNotImported": "Kanavia joissa on tekijänoikeusesto-ohjelmia, ei ladata.",
"DropShadow": "Tiputa varjo",
"EasyPasswordHelp": "Sinun helppoa PIN-koodia käytetään offline-käytössä tuetuissa Jellyfin-sovelluksissa, ja voidaan myös nopeuttaa verkkoon kirjautumista.",
"EasyPasswordHelp": "Sinun helppoa PIN-koodia käytetään offline-käytössä tuetuissa Jellyfin-sovelluksissa, ja voi myös nopeuttaa lan yhteyden kautta kirjautumista.",
"Edit": "Muokkaa",
"EditImages": "Muokkaa kuvia",
"EditMetadata": "Muokkaa metadataa",
@ -310,5 +309,15 @@
"Depressed": "Painettu",
"CopyStreamURLError": "Verkko-osoitteen kopioinnissa tapahtui virhe.",
"ButtonSplit": "jaa",
"AskAdminToCreateLibrary": "Pyydä järjestelmän ylläpitäjää luomaan kirjasto."
"AskAdminToCreateLibrary": "Pyydä järjestelmän ylläpitäjää luomaan kirjasto.",
"EnableStreamLooping": "Auto-toista suoralähetykset",
"EnableNextVideoInfoOverlayHelp": "Videon lopussa, näytä soittolistassa seuraavaksi toistettavan videon tiedot.",
"ClientSettings": "Pääte-asetukset",
"AllowFfmpegThrottlingHelp": "Kun uudelleenkoodaus tai remux ehtii tarpeeksi toiston edelle, keskeytä laskenta jotta laskentaresursseja kuluu vähemmän. Tämä on hyödyllistä jos katselet hyppimättä eri kohtiin. Älä käytä jos toiston kanssa ilmenee ongelmia.",
"AllowFfmpegThrottling": "Rajoita uudelleenkoodaus",
"ErrorDeletingItem": "Tiedostoa poistaessa Jellyfin Palvelimelta ilmeni virhe. Varmista, että Jellyfin Palvelimella on kirjoitusoikeudet mediakansioon ja kokeile uudestaan.",
"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": "Teeman videot"
}

View File

@ -14,7 +14,7 @@
"Alerts": "Alertes",
"All": "Tout",
"AllChannels": "Toutes les chaînes",
"AllComplexFormats": "Tous les formats complexes (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc…)",
"AllComplexFormats": "Tous les formats complexes (ASS, SSA, VOBSUB, PGS, SUB, IDX, etc…)",
"AllEpisodes": "Tous les épisodes",
"AllLanguages": "Toutes les langues",
"AllLibraries": "Toutes les médiathèques",
@ -51,7 +51,7 @@
"BoxRear": "Dos de boîtier",
"Browse": "Parcourir",
"BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.",
"BurnSubtitlesHelp": "Détermine si le serveur doit incruster les sous-titres lors de la conversion vidéo en fonction du format des sous-titres. Éviter l'incrustation des sous-titres améliorera les performances du serveur. Sélectionnez Auto pour incruster les formats basés sur l'image (VOBSUB, PGS, SUB/IDX etc) et certains sous-titres ASS/SSA.",
"BurnSubtitlesHelp": "Détermine si le serveur doit incruster les sous-titres lors du transcodage de la vidéo. Éviter cela améliorera nettement la performance. Sélectionnez Auto pour incruster les formats basés sur l'image (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",
@ -175,9 +175,8 @@
"DirectStreamHelp1": "Le média est compatible avec l'appareil en ce qui concerne la résolution et le type de média (H.264, AC3, etc), mais se trouve dans un conteneur de fichiers incompatible (mkv, avi, wmv, etc). La vidéo sera rempaquetée à la volée avant d'être diffusée à l'appareil.",
"DirectStreamHelp2": "Le streaming en direct d'un fichier utilise très peu de puissance de traitement sans perte de qualité vidéo.",
"DirectStreaming": "Streaming direct",
"Director": "Réalisation",
"DirectorValue": "Réalisation: {0}",
"DirectorsValue": "Réalisation: {0}",
"Director": "Réalisateur(trice)",
"Directors": "Réalisateurs",
"Disabled": "Désactivé",
"Disc": "Disque",
"Disconnect": "Déconnecter",
@ -187,7 +186,7 @@
"DisplayInOtherHomeScreenSections": "Afficher dans les sections de lécran daccueil comme Ajouts récents et Reprendre",
"DisplayMissingEpisodesWithinSeasons": "Afficher les épisodes manquants dans les saisons",
"DisplayMissingEpisodesWithinSeasonsHelp": "Cette option doit aussi être activée pour les médiathèques TV dans les paramètres du serveur.",
"DisplayModeHelp": "Sélectionner le type d'écran sur lequel vous utilisez Jellyfin.",
"DisplayModeHelp": "Sélectionner l'agencement que vous désirez pour l'interface.",
"DoNotRecord": "Ne pas enregistrer",
"Down": "Bas",
"Download": "Téléchargement",
@ -777,7 +776,7 @@
"LabelSubtitleDownloaders": "Outils de téléchargement de sous-titres :",
"LabelSubtitleFormatHelp": "Exemple : srt",
"LabelSubtitlePlaybackMode": "Mode des sous-titres :",
"LabelSubtitles": "Sous-titres :",
"LabelSubtitles": "Sous-titres",
"LabelSupportedMediaTypes": "Types de médias supportés :",
"LabelTVHomeScreen": "Écran d'accueil du mode TV :",
"LabelTag": "Étiquette :",
@ -814,7 +813,7 @@
"LabelValue": "Valeur :",
"LabelVersion": "Version :",
"LabelVersionInstalled": "{0} installé(s)",
"LabelVideo": "Vidéo :",
"LabelVideo": "Vidéo",
"LabelXDlnaCap": "Cap X-DLNA :",
"LabelXDlnaCapHelp": "Détermine le contenu de l'élément X_DLNACAP dans l'espace de nom urn:schemas-dlna-org:device-1-0.",
"LabelXDlnaDoc": "Doc X-DLNA :",
@ -949,7 +948,7 @@
"OneChannel": "Une chaîne",
"OnlyForcedSubtitles": "Seulement les sous-titres forcés",
"OnlyForcedSubtitlesHelp": "Seuls les sous-titres marqués comme forcés seront chargés.",
"OnlyImageFormats": "Seulement les formats image (VOBSUB, PGS, SUB, etc)",
"OnlyImageFormats": "Seulement les formats image (VOBSUB, PGS, SUB)",
"OptionAdminUsers": "Administrateurs",
"OptionAlbumArtist": "Artiste de l'album",
"OptionAllUsers": "Tous les utilisateurs",
@ -1100,7 +1099,7 @@
"PlayAllFromHere": "Tout lire à partir d'ici",
"PlayCount": "Nombre de lectures",
"PlayFromBeginning": "Lire depuis le début",
"PlayNext": "Lire le suivant",
"PlayNext": "Lire ensuite",
"PlayNextEpisodeAutomatically": "Lancer l'épisode suivant automatiquement",
"Played": "Lu",
"Playlists": "Listes de lecture",
@ -1329,9 +1328,8 @@
"ButtonPause": "Pause",
"Collections": "Collections",
"Extras": "Extras",
"GenreValue": "Genre: {0}",
"Genre": "Genre",
"Genres": "Genres",
"GenresValue": "Genres: {0}",
"Guide": "Guide",
"GuestStar": "Guest star",
"Photos": "Photos",
@ -1341,7 +1339,7 @@
"HeaderTuners": "Égaliseur",
"Horizontal": "Horizontal",
"Images": "Images",
"LabelAudio": "Audio :",
"LabelAudio": "Audio",
"LabelVersionNumber": "Version {0}",
"LeaveBlankToNotSetAPassword": "Laissez vide pour ne pas définir de mot de passe.",
"Logo": "Logo",
@ -1448,7 +1446,7 @@
"LabelAudioChannels": "Canaux audio :",
"HeaderFavoriteBooks": "Livres préférés",
"FetchingData": "Récuperer des données suplémentaires",
"CopyStreamURLSuccess": "URL copiée.",
"CopyStreamURLSuccess": "URL copiée avec succès.",
"CopyStreamURL": "Copier l'URL du flux",
"LabelBaseUrlHelp": "Vous pouvez ajouter un sous-répertoire personalisé ici pour accéder au serveur depuis une URL plus exclusive.",
"HeaderFavoritePeople": "Personnes préférées",
@ -1462,13 +1460,27 @@
"LabelStreamType": "Type de flux :",
"EnableFastImageFadeInHelp": "Activer un transition plus rapide pour images téléchargées",
"EnableFastImageFadeIn": "Transition d'image rapide",
"LabelPlayerDimensions": "Dimension du lecteur:",
"LabelDroppedFrames": "Images perdues:",
"LabelCorruptedFrames": "Images corrompues:",
"LabelPlayerDimensions": "Dimension du lecteur :",
"LabelDroppedFrames": "Images perdues :",
"LabelCorruptedFrames": "Images corrompues:",
"CopyStreamURLError": "Il y a eu une erreur lors de la copie du URL.",
"AskAdminToCreateLibrary": "Demander à un administrateur de créer une médiathèque.",
"AllowFfmpegThrottlingHelp": "Quand le transcodage ou le remultiplexage est suffisamment loin de la position de lecture, le processus se mettra en pause afin déconomiser des ressources. Plus utile lors dune lecture continue. À désactiver en cas de problèmes de lecture.",
"AllowFfmpegThrottling": "Adapter la Vitesse du Transcodage",
"NoCreatedLibraries": "Il semblerait que vous n'ayez créé aucune librairie. {0}Voulez-vous en créer une maintenant ?{1}",
"PlaybackErrorNoCompatibleStream": "Problème de profil client, le serveur na pas pu envoyer un format média compatible."
"PlaybackErrorNoCompatibleStream": "Problème de profil client, le serveur na pas pu envoyer un format média compatible.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Préférer les informations intégrées aux noms de fichiers",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Utilise les informations des métadonnées intégrées, si disponible.",
"ClientSettings": "Paramètres Client",
"Track": "Piste",
"Season": "Saison",
"ReleaseGroup": "Groupe de Parution",
"Person": "Personne",
"OtherArtist": "Autre Artiste",
"Movie": "Film",
"Episode": "Épisode",
"BoxSet": "Coffret",
"Artist": "Artiste",
"AlbumArtist": "Artiste de l'Album",
"Album": "Album"
}

View File

@ -164,5 +164,8 @@
"Songs": "Lieder",
"Sync": "Synchronisation",
"ValueSpecialEpisodeName": "Extra - {0}",
"VersionNumber": "Version {0}"
"VersionNumber": "Version {0}",
"Absolute": "Absolut",
"Actor": "Schauspiler",
"AccessRestrictedTryAgainLater": "Zuegriff isch momentan beschränkt. Probier bitte später nomau. "
}

View File

@ -59,7 +59,6 @@
"DeleteImageConfirmation": "האם אתה בטוח שברצונך למחוק תמונה זו?",
"DeleteMedia": "מחק מדיה",
"DeleteUser": "מחק משתמש",
"Director": "מנהל",
"Dislike": "לא אוהב",
"DoNotRecord": "אל תקליט",
"Download": "הורדה",
@ -557,8 +556,8 @@
"DisplayMissingEpisodesWithinSeasons": "הצג פרקים חסרים בתוך העונות",
"DisplayInMyMedia": "הצג בעמוד הבית",
"Disconnect": "התנתק",
"DirectorsValue": "במאים: {0}",
"DirectorValue": "במאי: {0}",
"Director": "במאי",
"Directors": "במאים",
"Descending": "סדר יורד",
"Default": "ברירת מחדל",
"DeathDateValue": "נפטר: {0}",
@ -667,8 +666,7 @@
"HeaderAddScheduledTaskTrigger": "הוסף טריגר",
"HeaderActivity": "פעילות",
"Guide": "מדריך",
"GenresValue": "ז'אנרים: {0}",
"GenreValue": "ז'אנר: {0}",
"Genre": "ז'אנר",
"General": "כללי",
"Fullscreen": "מסך מלא",
"FolderTypeUnset": "תוכן מעורבב",

View File

@ -87,8 +87,7 @@
"DeleteMedia": "Média törlése",
"Descending": "Csökkenő",
"Director": "Rendező",
"DirectorValue": "Rendező: {0}",
"DirectorsValue": "Rendezők: {0}",
"Directors": "Rendezők",
"Dislike": "Nem tettszik",
"Display": "Megjelenítés",
"DisplayMissingEpisodesWithinSeasons": "Hiányzó évad epizódok megjelenítése",
@ -124,7 +123,6 @@
"Fullscreen": "Teljes képernyő",
"General": "Általános",
"Genres": "Műfajok",
"GenresValue": "Műfajok: {0}",
"HeaderActiveDevices": "Aktív eszközök",
"HeaderAddToCollection": "Hozzáadás gyűjteményhez",
"HeaderAddToPlaylist": "Hozzáadás lejátszási listához",
@ -233,7 +231,7 @@
"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ó:",
"LabelAudio": "Audió",
"LabelAudioLanguagePreference": "Audió nyelvének beállítása:",
"LabelBirthYear": "Születési év:",
"LabelCachePath": "Gyorsítótár útvonal:",
@ -321,7 +319,7 @@
"LabelStopping": "Megállítás",
"LabelSubtitleFormatHelp": "Például: srt",
"LabelSubtitlePlaybackMode": "Felirat mód:",
"LabelSubtitles": "Feliratok:",
"LabelSubtitles": "Feliratok",
"LabelTagline": "Címke:",
"LabelTheme": "Kinézet:",
"LabelTime": "Idő:",
@ -338,7 +336,7 @@
"LabelUsername": "Felhasználónév:",
"LabelVersionInstalled": "{0} telepítve",
"LabelVersionNumber": "Verzió {0}",
"LabelVideo": "Videó:",
"LabelVideo": "Videó",
"LabelYear": "Év:",
"LabelYourFirstName": "Keresztneved:",
"LabelYoureDone": "Készen vagy!",
@ -575,7 +573,7 @@
"Writer": "Író",
"Yesterday": "Tegnap",
"FormatValue": "Formátum: {0}",
"GenreValue": "Műfaj: {0}",
"Genre": "Műfaj",
"HeaderServerSettings": "Szerver beállítások",
"LabelDropImageHere": "Húzz ide egy képet, vagy kattints a böngészéshez.",
"LabelDropShadow": "Árnyék:",
@ -1213,7 +1211,7 @@
"Screenshots": "Képernyőképek",
"SearchForCollectionInternetMetadata": "Keresés az interneten artwork és metaadat után",
"Series": "Sorozatok",
"SeriesCancelled": "A sorozat törölt.",
"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.",
@ -1474,5 +1472,7 @@
"DeviceAccessHelp": "Ez csak azokra az eszközökre alkalmazható, amelyek egyedileg vannak azonosítva és nem gátolják meg a böngészőből való elérést. A felhasználói eszközök kiszűrése meg fogja akadályozni az új eszközök használatát addig, amíg itt nem engedélyezed őket.",
"PlaybackErrorNoCompatibleStream": "Hiba történt a kliens felmérése közben és a szerver nem küld kompatibilis formátumot az eszközre.",
"AllowFfmpegThrottlingHelp": "Ha az átkódolás vagy remux eléggé előtöltődött a jelenlegi lejátszási pozícióhoz képest, ez megállítja a folyamatot, hogy kevesebb erőforrást vegyen igénybe. Ez akkor hasznos, ha ritkán ugrálsz előre a lejátszott videókban. Kapcsold ki, ha lejátszási problémákba ütközöl.",
"AllowFfmpegThrottling": "Átkódolás visszafogása"
"AllowFfmpegThrottling": "Átkódolás visszafogása",
"PreferEmbeddedEpisodeInfosOverFileNames": "Inkább a beágyazott epizódokra vonatkozó információkat részesítse előnyben a fájlnevekkel szemben",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Ez a beágyazott metaadatok epizódinformációit használja, ha rendelkezésre állnak."
}

View File

@ -14,7 +14,7 @@
"Albums": "Album",
"All": "Tutto",
"AllChannels": "Tutti i canali",
"AllComplexFormats": "Tutti i formati complessi (ASS, SSA, VOBSUB, PGS, SUB / IDX, ecc.)",
"AllComplexFormats": "Tutti i formati complessi (ASS, SSA, VOBSUB, PGS, SUB, IDX)",
"AllEpisodes": "Tutti gli episodi",
"AllLanguages": "Tutte le lingue",
"AllLibraries": "Tutte le librerie",
@ -24,7 +24,7 @@
"AllowRemoteAccess": "Abilita connessioni remote a questo Server Jellyfin.",
"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": "Visualizza sempre i sottotitoli",
"AlwaysPlaySubtitles": "Riproduci sempre",
"AlwaysPlaySubtitlesHelp": "I sottotitoli corrispondenti alla lingua preferita saranno caricati a prescindere dalla lingua dell'audio.",
"AnyLanguage": "Qualsiasi lingua",
"Anytime": "In qualsiasi momento",
@ -45,7 +45,7 @@
"BoxRear": "Box (retro)",
"Browse": "Esplora",
"BrowsePluginCatalogMessage": "Sfoglia il catalogo dei Plugins.",
"BurnSubtitlesHelp": "Determina se il server deve applicare i sottotitoli quando si convertono video in base al formato dei sottotitoli. Evitando di applicare i sottotitoli migliorerà le prestazioni del server. Selezionare Auto per applicare formati basati sull'immagine (VOBSUB, PGS, SUB / IDX, ecc.) e alcuni sottotitoli ASS / SSA.",
"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",
@ -165,8 +165,7 @@
"DirectStreamHelp2": "Lo Streaming in Diretta di un file utilizza poco il processore senza alcuna perdita di qualità video.",
"DirectStreaming": "Streaming Diretto",
"Director": "Regista",
"DirectorValue": "Regista: {0}",
"DirectorsValue": "Registi: {0}",
"Directors": "Registi",
"Disabled": "Disabilitato",
"Disc": "Disco",
"Disconnect": "Disconnetti",
@ -176,7 +175,7 @@
"DisplayInOtherHomeScreenSections": "Mostra le sezioni della schermata home come gli ultimi media e continua a guardare",
"DisplayMissingEpisodesWithinSeasons": "Visualizza gli episodi mancanti nelle stagioni",
"DisplayMissingEpisodesWithinSeasonsHelp": "Questo deve anche essere abilitato per le librerie TV nella configurazione del server.",
"DisplayModeHelp": "Scegli il tipo di schermo su cui stai utilizzando Jellyfin.",
"DisplayModeHelp": "Seleziona lo stile del layout che vuoi per l'interfaccia.",
"DoNotRecord": "Non registrare",
"Down": "Giù",
"Download": "Scarica",
@ -240,9 +239,8 @@
"FormatValue": "Formato: {0}",
"Friday": "Venerdì",
"Fullscreen": "Schermo Intero",
"GenreValue": "Genere: {0}",
"Genre": "Genere",
"Genres": "Generi",
"GenresValue": "Generi: {0}",
"GroupBySeries": "Raggruppa per serie",
"GroupVersions": "Raggruppa versioni",
"GuestStar": "Personaggio famoso",
@ -266,7 +264,7 @@
"HeaderAddUser": "Aggiungi utente",
"HeaderAdditionalParts": "Parti addizionali",
"HeaderAdmin": "Admin",
"HeaderAlbumArtists": "Artisti dell' Album",
"HeaderAlbumArtists": "Artisti degli Album",
"HeaderAlbums": "Album",
"HeaderAlert": "Avviso",
"HeaderAllowMediaDeletionFrom": "Abilita Eliminazione Media Da",
@ -574,14 +572,14 @@
"LabelEvent": "Evento:",
"LabelEveryXMinutes": "Tutti:",
"LabelExtractChaptersDuringLibraryScan": "Estrarre immagini capitolo durante la scansione della libreria",
"LabelExtractChaptersDuringLibraryScanHelp": "Genera le immagini del capitolo quando i video vengono importati durante la scansione della libreria. Altrimenti verranno estratti durante l'operazione pianificata di estrazione delle immagini capitolo, permettendo la scansione della libreria più velocemente.",
"LabelExtractChaptersDuringLibraryScanHelp": "Genera le immagini capitolo quando i video vengono importati durante la scansione della libreria. Alternativamente, verranno estratti durante l'operazione pianificata di estrazione delle immagini capitolo, permettendo la scansione della libreria più velocemente.",
"LabelFailed": "Fallito",
"LabelFileOrUrl": "File o URL:",
"LabelFinish": "Finito",
"LabelForgotPasswordUsernameHelp": "Inserisci il tuo nome utente, se te lo ricordi.",
"LabelFormat": "Formato:",
"LabelFriendlyName": "Nome Condiviso:",
"LabelServerNameHelp": "Questo nome è usato per identificare il server e verrà usato di default come nome del pc.",
"LabelServerNameHelp": "Questo nome è usato per identificare il server e avrà come default il nome del pc.",
"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:",
@ -751,7 +749,7 @@
"LabelSubtitleDownloaders": "Downloader sottotitoli:",
"LabelSubtitleFormatHelp": "Esempio: srt",
"LabelSubtitlePlaybackMode": "Modalità Sottotitolo:",
"LabelSubtitles": "Sottotitoli:",
"LabelSubtitles": "Sottotitoli",
"LabelSupportedMediaTypes": "Tipi di media supportati:",
"LabelTVHomeScreen": "Schermata iniziale della modalità TV:",
"LabelTagline": "Slogan:",
@ -903,16 +901,16 @@
"NoNextUpItemsMessage": "Trovato niente. Inizia a guardare i tuoi programmi!",
"NoPluginConfigurationMessage": "Questo Plugin non ha impostazioni da configurare.",
"NoSubtitleSearchResultsFound": "Nessun risultato.",
"NoSubtitles": "Nessun Sottotitolo",
"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",
"OneChannel": "Un canale",
"OnlyForcedSubtitles": "Solo i sottotitoli forzati",
"OnlyForcedSubtitles": "Solo forzati",
"OnlyForcedSubtitlesHelp": "Solo i sottotitoli contrassegnati come forzati saranno caricati.",
"OnlyImageFormats": "Solo formati immagine (VOBSUB, PGS, SUB, ecc)",
"OnlyImageFormats": "Solo formati immagine (VOBSUB, PGS, SUB)",
"OptionAdminUsers": "Amministratori",
"OptionAlbumArtist": "Artista Album",
"OptionAllUsers": "Tutti gli utenti",
@ -949,8 +947,8 @@
"OptionCustomUsers": "Personalizza",
"OptionDaily": "Giornaliero",
"OptionDateAdded": "Aggiunto il",
"OptionDateAddedFileTime": "Utilizzare file di data di creazione",
"OptionDateAddedImportTime": "Utilizza la data scansionato in biblioteca",
"OptionDateAddedFileTime": "Utilizzare la data di creazione del file",
"OptionDateAddedImportTime": "Utilizza la data di scansione nella libreria",
"OptionDatePlayed": "Visto il",
"OptionDescending": "Decrescente",
"OptionDisableUser": "Disabilita questo utente",
@ -1015,7 +1013,7 @@
"OptionReportByteRangeSeekingWhenTranscodingHelp": "Questo è necessario per alcuni dispositivi che non hanno l'avanzamento rapido che funziona bene.",
"OptionRequirePerfectSubtitleMatch": "Scarica solo i sottotitoli che corrispondono perfettamente ai miei file video",
"OptionRequirePerfectSubtitleMatchHelp": "La richiesta di una corrispondenza perfetta filtrerà i sottotitoli per includere solo quelli che sono stati testati e verificati con il file video esatto. Deselezionando questo aumenterà la probabilità che i sottotitoli vengono scaricati, ma aumenteranno le probabilità di testo sottotitolato impreciso o errato.",
"OptionResElement": "elemento res",
"OptionResElement": "res element",
"OptionResumable": "Interrotto",
"OptionRuntime": "Durata",
"OptionSaturday": "Sabato",
@ -1078,7 +1076,7 @@
"Programs": "Programmi",
"Quality": "Qualità",
"QueueAllFromHere": "In coda tutto da qui in poi",
"Raised": "Sospeso",
"Raised": "Rilievo",
"Rate": "Vota",
"RecentlyWatched": "Visti di recente",
"RecommendationBecauseYouLike": "Perché ti piace {0}",
@ -1170,7 +1168,7 @@
"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",
"TabAlbumArtists": "Artisti degli Album",
"TabAlbums": "Album",
"TabArtists": "Artisti",
"TabCatalog": "Catalogo",
@ -1314,12 +1312,12 @@
"HeaderFavoriteArtists": "Artisti Preferiti",
"HeaderFavoriteSongs": "Brani Preferiti",
"HeaderFavoriteVideos": "Video Preferiti",
"HeaderFetcherSettings": "Impostazioni Fetcher",
"HeaderFetcherSettings": "Impostazioni del Fetcher",
"HeaderImageOptions": "Opzioni Immagine",
"HeaderRestartingServer": "Riavvio Server",
"Home": "Home",
"LabelAlbum": "Album:",
"LabelAudio": "Audio:",
"LabelAudio": "Audio",
"LabelCache": "Cache:",
"ButtonAddImage": "Aggiungi Immagine",
"CopyStreamURL": "Copia Indirizzo dello Stream",
@ -1400,7 +1398,7 @@
"LabelTranscodingProgress": "Progresso di trascodifica:",
"DashboardVersionNumber": "Versione: {0}",
"DashboardServerName": "Server: {0}",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"DashboardArchitecture": "Architettura: {0}",
"LabelWeb": "Web:",
"LaunchWebAppOnStartup": "Lancia l'interfaccia web quando viene avviato il server",
@ -1469,5 +1467,8 @@
"LabelCorruptedFrames": "Frame corrotti:",
"AskAdminToCreateLibrary": "Chiedi ad un amministratore di creare una libreria.",
"AllowFfmpegThrottlingHelp": "Quando una transcodifica o un remux sono abbastanza avanti rispetto alla corrente posizione di riproduzione, pausa il processo così da consumare meno risorse. Questo è utile quando si guarda un video senza avanzare spesso durante la riproduzione. Disattiva questa opzione se stai avendo problemi di riproduzione.",
"AllowFfmpegThrottling": "Acceleratore Transcodifica"
"AllowFfmpegThrottling": "Acceleratore Transcodifica",
"PreferEmbeddedEpisodeInfosOverFileNames": "Preferisci le informazioni incorporate nell'episodio rispetto ai nomi dei file",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Questo utilizza le informazioni dell'episodio provenienti dai metadata incorporati, se disponibili.",
"ClientSettings": "Impostazioni del client"
}

View File

@ -176,8 +176,7 @@
"DirectStreamHelp2": "ファイルのダイレクトストリーミングは、ビデオ品質を損なうことなく、Jellyfin Serverにもほとんど負荷がありません。",
"DirectStreaming": "ダイレクトストリーミング",
"Director": "ディレクター",
"DirectorValue": "ディレクター: {0}",
"DirectorsValue": "ディレクターズ: {0}",
"Directors": "ディレクターズ",
"Disabled": "無効",
"Disc": "ディスク",
"Disconnect": "切断",
@ -266,9 +265,8 @@
"Friday": "金曜日",
"Fullscreen": "フルスクリーン",
"General": "全般",
"GenreValue": "ジャンル: {0}",
"Genre": "ジャンル",
"Genres": "ジャンル",
"GenresValue": "ジャンル: {0}",
"GroupBySeries": "シリーズグループ",
"GroupVersions": "グループバージョン",
"GuestStar": "ゲストスター",
@ -560,7 +558,7 @@
"LabelOriginalAspectRatio": "元のアスペクト比:",
"LabelPrevious": "前へ",
"LabelServerName": "サーバー名:",
"LabelSubtitles": "字幕:",
"LabelSubtitles": "字幕",
"LabelSupportedMediaTypes": "サポートされているメディアタイプ:",
"LabelTVHomeScreen": "TVモードホームスクリーン:",
"LabelTextColor": "文字色:",
@ -860,7 +858,7 @@
"LabelAllowedRemoteAddresses": "リモートIPアドレスフィルター:",
"LabelAppNameExample": "例: スケートボード、ソナー",
"LabelArtists": "アーティスト:",
"LabelAudio": "音声:",
"LabelAudio": "音声",
"LabelAudioBitDepth": "音声ビット深度:",
"LabelAudioBitrate": "音声ビットレート:",
"LabelAudioChannels": "音声チャンネル:",
@ -965,7 +963,7 @@
"DashboardVersionNumber": "バージョン: {0}",
"DashboardServerName": "サーバー: {0}",
"DashboardArchitecture": "アーキテクチャ: {0}",
"LabelVideo": "映像:",
"LabelVideo": "映像",
"LabelVideoBitrate": "映像ビットレート:",
"LabelYourFirstName": "名前:",
"Share": "共有",

View File

@ -188,8 +188,7 @@
"DirectStreamHelp2": "Faıldy tikeleı taratý beıne sapasyn joǵaltpaı óte az esepteý qýatyn paıdalanady.",
"DirectStreaming": "Tikeleı tasymaldanýda",
"Director": "Rejısór",
"DirectorValue": "Rejısóri: {0}",
"DirectorsValue": "Rejısórler; {0}",
"Directors": "Rejısórler",
"Disabled": "Ajyratylǵan",
"Disc": "Dıski",
"Disconnect": "Ajyratý",
@ -267,9 +266,8 @@
"Friday": "juma",
"Fullscreen": "Tolyq ekran",
"General": "Jalpy",
"GenreValue": "Janr: {0}",
"Genre": "Janr",
"Genres": "Janrlar",
"GenresValue": "Janrlar: {0}",
"GroupBySeries": "Telehıkaıalar boıynsha toptastyrý",
"GroupVersions": "Nusqalardy toptastyrý",
"GuestStar": "Shaqyrylǵan aktór",
@ -538,7 +536,7 @@
"LabelAppNameExample": "Mysaly: Sickbeard, Sonarr",
"LabelArtists": "Oryndaýshylar:",
"LabelArtistsHelp": "Birneshýin mynaýmen bólińiz ;",
"LabelAudio": "Dybys:",
"LabelAudio": "Dybys",
"LabelAudioLanguagePreference": "Dybys tiliniń teńshelimi:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Metaderekterdi Internetten avtomatty jańartý:",
"LabelBindToLocalNetworkAddress": "Jergilikti jeli mekenjaıyna baılastyrý:",
@ -809,7 +807,7 @@
"LabelSubtitleDownloaders": "Sýbtıtrler júkteýshileri:",
"LabelSubtitleFormatHelp": "Mysal: srt",
"LabelSubtitlePlaybackMode": "Sýbtıtr rejimi:",
"LabelSubtitles": "Sýbtıtrler:",
"LabelSubtitles": "Sýbtıtrler",
"LabelSupportedMediaTypes": "Qoldaýdaǵy tasyǵyshderekter túrleri:",
"LabelTVHomeScreen": "TD rejimindegi basqy ekran:",
"LabelTag": "Teg:",
@ -851,7 +849,7 @@
"LabelVersion": "Nusqa:",
"LabelVersionInstalled": "{0} ornatylǵan",
"LabelVersionNumber": "Nýsqasy: {0}",
"LabelVideo": "Beıne:",
"LabelVideo": "Beıne",
"LabelXDlnaCap": "X-DLNA sıpattary:",
"LabelXDlnaCapHelp": "urn:schemas-dlna-org:device-1-0 ataýlar keńistigindegi X_DLNACAP elementi mazmunyn anyqtaıdy.",
"LabelXDlnaDoc": "X-DLNA tásimi:",

View File

@ -880,7 +880,6 @@
"DoNotRecord": "녹화 안 함",
"Disconnect": "연결 끊기",
"Disabled": "비활성화됨",
"DirectorValue": "감독: {0}",
"DirectPlaying": "다이렉트 재생",
"DirectStreaming": "다이렉트 스트리밍",
"DirectStreamHelp2": "다이렉트 스트리밍은 비디오 퀄리티의 손실없이 매우 적은 처리능력을 사용합니다.",
@ -1026,7 +1025,7 @@
"LabelWeb": "웹:",
"LabelVideoCodec": "비디오 코덱:",
"LabelVideoBitrate": "비디오 비트레이트:",
"LabelVideo": "비디오:",
"LabelVideo": "비디오",
"DashboardArchitecture": "아키텍처: {0}",
"DashboardOperatingSystem": "운영체제: {0}",
"DashboardServerName": "서버: {0}",
@ -1043,7 +1042,7 @@
"LabelTheme": "테마:",
"LabelTextSize": "글자 크기:",
"LabelTextColor": "글자 색:",
"LabelSubtitles": "자막:",
"LabelSubtitles": "자막",
"LabelSubtitleFormatHelp": "예시: srt",
"LabelSubtitleDownloaders": "자막 다운로더:",
"LabelStopping": "중지",
@ -1083,7 +1082,7 @@
"LabelAudioCodec": "오디오 코덱:",
"LabelAudioChannels": "오디오 채널:",
"LabelAudioBitrate": "오디오 비트레이트:",
"LabelAudio": "오디오:",
"LabelAudio": "오디오",
"Items": "항목",
"Kids": "어린이",
"Home": "홈",
@ -1145,8 +1144,7 @@
"HardwareAccelerationWarning": "하드웨어 가속을 활성화하면 일부 환경에서 불안정해질 수 있습니다. 운영체제 및 비디오 드라이버가 최신 상태인지 확인하십시오. 이 기능을 활성화한 후 비디오를 재생하는 데 어려움이 있을 경우 설정을 다시 '사용 안 함'으로 변경하십시오.",
"GuestStar": "게스트 스타",
"GroupBySeries": "시리즈별로 그룹화",
"GenresValue": "장르: {0}",
"GenreValue": "장르: {0}",
"Genre": "장르",
"General": "일반",
"FileReadCancelled": "파일 읽기 작업이 취소되었습니다.",
"FetchingData": "추가 데이터를 가져오는 중",
@ -1284,7 +1282,7 @@
"LabelDiscNumber": "디스크 번호:",
"Identify": "식별자",
"HeaderMoreLikeThis": "비슷한 작품",
"DirectorsValue": "감독: {0}",
"Directors": "감독",
"ButtonSplit": "나누기",
"HeaderContainerProfileHelp": "컨테이너 프로파일은 사용자의 디바이스에서 재생 가능한 파일 형식을 나타냅니다. 다이렉트 플레이가 설정된 경우에도 디바이스에서 지원되지 않는 형식이라면 트랜스코딩이 적용됩니다.",
"HeaderCodecProfileHelp": "코덱 프로파일은 사용자의 디바이스에서 재생 가능한 코덱을 가리킵니다. 다이렉트 플레이가 설정된 경우에도 디바이스에서 지원되지 않는 코덱이라면 트랜스코딩이 적용됩니다.",

View File

@ -624,8 +624,7 @@
"ConfirmEndPlayerSession": "Ar norite išjungti Jellyfin ant {0}?",
"Descending": "Mažėjančia tvarka",
"DetectingDevices": "Ieškomi įrenginiai",
"DirectorValue": "Režisierius: {0}",
"DirectorsValue": "Režisieriai: {0}",
"Directors": "Režisieriai",
"Disabled": "Išjungtas",
"Disc": "Diskas",
"Disconnect": "Atsijungti",
@ -785,7 +784,7 @@
"HeaderLoginFailure": "Prisijungimo klaida",
"Hide": "Paslėpti",
"LabelAll": "Visi",
"LabelAudio": "Garsas:",
"LabelAudio": "Garsas",
"LabelCancelled": "Atšaukta",
"LabelCertificatePassword": "Sertifikato slaptažodis:",
"LabelCertificatePasswordHelp": "Jei sertifikatui reikalingas slaptažodis, jį įveskite čia.",
@ -805,7 +804,7 @@
"ExtraLarge": "Labai didelis",
"Fullscreen": "Viso ekrano režimas",
"General": "Bendri",
"GenreValue": "Žanras: {0}",
"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",
@ -924,7 +923,6 @@
"ErrorAddingXmlTvFile": "Atidarant XMLTV failą įvyko klaida. Įsitikinkite, ar failas egzistuoja, ir bandykite dar kartą.",
"ErrorGettingTvLineups": "Atsisiunčiant TV programas įvyko klaida. Įsitikinkite, kad jūsų informacija teisinga, ir bandykite dar kartą.",
"Features": "Medžiagos",
"GenresValue": "Žanrai: {0}",
"GroupBySeries": "Grupuoti pagal serialus",
"Guide": "Gidas",
"GuideProviderLogin": "Prisijungti",

View File

@ -52,7 +52,7 @@
"LabelVideoResolution": "Video izšķirtspēja:",
"LabelVideoCodec": "Video kodeks:",
"LabelVideoBitrate": "Video bitu-ātrums:",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"DashboardArchitecture": "Arhitektūra: {0}",
"DashboardOperatingSystem": "Operētājsistēma: {0}",
"DashboardServerName": "Serveris: {0}",
@ -85,7 +85,7 @@
"LabelTag": "Tags:",
"LabelTVHomeScreen": "TV režīma mājas ekrāns:",
"LabelSupportedMediaTypes": "Atbalstītie Multivides Veidi:",
"LabelSubtitles": "Subtitri:",
"LabelSubtitles": "Subtitri",
"LabelSubtitlePlaybackMode": "Subtitru veids:",
"LabelSubtitleFormatHelp": "Piemērs: srt",
"LabelSubtitleDownloaders": "Subtitru lejupielādētāji:",
@ -222,7 +222,7 @@
"LabelBirthYear": "Dzimšanas gads:",
"LabelBirthDate": "Dzimšanas datums:",
"LabelAudioLanguagePreference": "Ieteicamā audio valoda:",
"LabelAudio": "Audio:",
"LabelAudio": "Audio",
"LabelArtistsHelp": "Atdali vairākus izmantojot ;",
"LabelArtists": "Izpildītājs:",
"LabelAppNameExample": "Piemēram: Sickbeard, Sonarr",
@ -412,9 +412,8 @@
"GuestStar": "Vieszvaigzne",
"GroupVersions": "Grupēt versijas",
"GroupBySeries": "Grupēt pēc sērijām",
"GenresValue": "Žanri: {0}",
"Genres": "Žanri",
"GenreValue": "Žanrs: {0}",
"Genre": "Žanrs",
"General": "Vispārīgs",
"Fullscreen": "Pilnekrāns",
"Friday": "Piektdiena",
@ -464,8 +463,7 @@
"Dislike": "Nepatīk",
"Disc": "Disks",
"Disabled": "Atspējots",
"DirectorsValue": "Direktori: {0}",
"DirectorValue": "Direktors: {0}",
"Directors": "Direktori",
"Director": "Direktors",
"DirectStreaming": "Tiešā straumēšana",
"DirectPlaying": "Tiešā Atskaņošana",

View File

@ -1159,7 +1159,6 @@
"MediaInfoStreamTypeVideo": "Video",
"OptionDownloadBannerImage": "Banner",
"CopyStreamURLSuccess": "URLen ble kopiert.",
"DirectorValue": "Regissør: {0}",
"OptionThumb": "Miniatyrbilde",
"LabelInternetQuality": "Internettkvalitet:",
"SubtitleAppearanceSettingsDisclaimer": "Disse innstillingene vil ikke påvirke grafiske undertekster (PGS, DVD, osv.) eller ASS/SSA-teksting som inkluderer sin egen formatering.",
@ -1180,7 +1179,7 @@
"MediaInfoSampleRate": "Samplingsfrekvens",
"MediaInfoStreamTypeData": "Data",
"Option3D": "3D",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"OptionAlbum": "Album",
"OptionAlbumArtist": "Albumartist",
"Filters": "Filtre",
@ -1267,7 +1266,7 @@
"LabelMatchType": "Matchtype:",
"OptionPosterCard": "Plakatkort",
"Uniform": "Jevn",
"DirectorsValue": "Regissører: {0}",
"Directors": "Regissører",
"Disabled": "Deaktivert",
"Disc": "Plate",
"Display": "Vis",
@ -1283,8 +1282,7 @@
"FetchingData": "Henter ytterligere data",
"Folders": "Mapper",
"FormatValue": "Format: {0}",
"GenreValue": "Sjanger: {0}",
"GenresValue": "Sjangre: {0}",
"Genre": "Sjanger",
"GroupBySeries": "Grupper etter serie",
"GroupVersions": "Grupper etter versjon",
"Guide": "Guide",
@ -1315,7 +1313,7 @@
"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:",
"LabelAudio": "Lyd",
"LabelAuthProvider": "Autentiserings-metode:",
"LabelBitrate": "Bithastighet:",
"LabelBurnSubtitles": "Brenn inn undertekst:",
@ -1344,7 +1342,7 @@
"LabelSpecialSeasonsDisplayName": "Visningsnavn for spesialsesong:",
"LabelStatus": "Status:",
"LabelSubtitleDownloaders": "Kilder for undertekst:",
"LabelSubtitles": "Undertekster:",
"LabelSubtitles": "Undertekster",
"LabelTVHomeScreen": "Hjemskjerm for TV-modus:",
"LabelTag": "Tagg:",
"LabelTextBackgroundColor": "Tekstbagrunnsfarge:",

View File

@ -168,8 +168,7 @@
"DirectStreamHelp2": "Direct streamen van een bestand gebruikt weinig processor kracht zonder verlies van beeldkwaliteit.",
"DirectStreaming": "Direct streamen",
"Director": "Regiseur",
"DirectorValue": "Regisseur: {0}",
"DirectorsValue": "Regisseurs: {0}",
"Directors": "Regisseurs",
"Disabled": "Uitgeschakeld",
"Disc": "Disk",
"Disconnect": "Loskoppelen",
@ -745,7 +744,7 @@
"LabelSubtitleDownloaders": "Ondertiteldownloaders:",
"LabelSubtitleFormatHelp": "Voorbeeld: srt",
"LabelSubtitlePlaybackMode": "Ondertitel mode:",
"LabelSubtitles": "Ondertitels:",
"LabelSubtitles": "Ondertitels",
"LabelSupportedMediaTypes": "Ondersteunde Media Types:",
"LabelTVHomeScreen": "TV mode begin scherm",
"LabelTextBackgroundColor": "Tekst achtergrond kleur:",
@ -1269,9 +1268,8 @@
"Desktop": "Bureaublad",
"DownloadsValue": "{0} downloads",
"Filters": "Filters",
"GenreValue": "Genre: {0}",
"Genre": "Genre",
"Genres": "Genres",
"GenresValue": "Genres: {0}",
"HeaderAlbums": "Albums",
"HeaderCastAndCrew": "Cast & Crew",
"HeaderCastCrew": "Cast & Crew",
@ -1312,7 +1310,7 @@
"ItemCount": "{0} items",
"Items": "Items",
"LabelAlbum": "Album:",
"LabelAudio": "Audio:",
"LabelAudio": "Audio",
"LabelAuthProvider": "Authenticatie Aanbieder:",
"LabelCache": "Cache:",
"LabelDidlMode": "DIDL mode:",
@ -1431,7 +1429,7 @@
"LabelXDlnaCap": "X-DLNA cap:",
"DashboardVersionNumber": "Versie: {0}",
"DashboardArchitecture": "Architectuur: {0}",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"MediaInfoStreamTypeAudio": "Audio",
"MediaInfoStreamTypeData": "Data",
"MediaInfoStreamTypeSubtitle": "Ondertiteling",

View File

@ -180,8 +180,7 @@
"DirectStreamHelp2": "Transmisja bezpośrednia pliku używa niewiele mocy przetwarzania, bez utraty jakości wideo.",
"DirectStreaming": "Transmisja bezpośrednia",
"Director": "Reżyser",
"DirectorValue": "Reżyser: {0}",
"DirectorsValue": "Reżyserzy: {0}",
"Directors": "Reżyserzy",
"Disabled": "Nieaktywne",
"Disc": "Dysk",
"Disconnect": "Rozłącz",
@ -258,9 +257,8 @@
"Friday": "Piątek",
"Fullscreen": "Pełny ekran",
"General": "Ogólne",
"GenreValue": "Gatunek: {0}",
"Genre": "Gatunek",
"Genres": "Gatunki",
"GenresValue": "Gatunki: {0}",
"GroupBySeries": "Grupuj po serialach",
"GroupVersions": "Wersje grup",
"GuestStar": "Gość specjalny",
@ -525,7 +523,7 @@
"LabelAppNameExample": "Przykład: Sickbeard, Sonarr",
"LabelArtists": "Wykonawcy:",
"LabelArtistsHelp": "Oddzielaj używając ;",
"LabelAudio": "Dźwięk:",
"LabelAudio": "Dźwięk",
"LabelAudioLanguagePreference": "Preferowany język ścieżki dźwiękowej:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Odświeżaj automatycznie metadane z Internetu:",
"LabelBindToLocalNetworkAddress": "Przypisz do lokalnego adresu sieciowego:",
@ -791,7 +789,7 @@
"LabelSubtitleDownloaders": "Dostawcy napisów:",
"LabelSubtitleFormatHelp": "Przykład: srt",
"LabelSubtitlePlaybackMode": "Tryb napisów:",
"LabelSubtitles": "Napisy:",
"LabelSubtitles": "Napisy",
"LabelSupportedMediaTypes": "Obsługiwane typy mediów:",
"LabelTVHomeScreen": "Ekran startowy trybu telewizyjnego:",
"LabelTag": "Znacznik:",
@ -829,7 +827,7 @@
"LabelVersion": "Wersja:",
"LabelVersionInstalled": "Zainstalowano {0}",
"LabelVersionNumber": "Wersja {0}",
"LabelVideo": "Wideo:",
"LabelVideo": "Wideo",
"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:",

View File

@ -172,8 +172,7 @@
"DirectStreamHelp2": "O streaming direto de um arquivo usa baixo processamento sem perda de qualidade de vídeo.",
"DirectStreaming": "Streaming Direto",
"Director": "Diretor",
"DirectorValue": "Diretor: {0}",
"DirectorsValue": "Diretores: {0}",
"Directors": "Diretores",
"Disabled": "Desativado",
"Disc": "Disco",
"Disconnect": "Desconectar",
@ -248,9 +247,8 @@
"Friday": "Sexta-feira",
"Fullscreen": "Tela cheia",
"General": "Geral",
"GenreValue": "Gênero: {0}",
"Genre": "Gênero",
"Genres": "Gêneros",
"GenresValue": "Gêneros: {0}",
"GroupBySeries": "Agrupar por séries",
"GroupVersions": "Agrupar versões",
"GuestStar": "Convidado especial",
@ -508,7 +506,7 @@
"LabelAppNameExample": "Exemplo: Sickbeard, Sonarr",
"LabelArtists": "Artistas:",
"LabelArtistsHelp": "Separa vários usando ;",
"LabelAudio": "Áudio:",
"LabelAudio": "Áudio",
"LabelAudioLanguagePreference": "Idioma preferido de áudio:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Atualizar automaticamente os metadados da internet:",
"LabelBindToLocalNetworkAddress": "Vincular a um endereço de rede local:",
@ -770,7 +768,7 @@
"LabelSubtitleDownloaders": "Downloaders de legendas:",
"LabelSubtitleFormatHelp": "Exemplo: srt",
"LabelSubtitlePlaybackMode": "Modo de legenda:",
"LabelSubtitles": "Legendas:",
"LabelSubtitles": "Legendas",
"LabelSupportedMediaTypes": "Tipos de Mídia Suportados:",
"LabelTVHomeScreen": "Tela inicial do modo TV:",
"LabelTagline": "Slogan:",
@ -806,7 +804,7 @@
"LabelVersion": "Versão:",
"LabelVersionInstalled": "{0} instalado",
"LabelVersionNumber": "Versão {0}",
"LabelVideo": "Vídeo:",
"LabelVideo": "Vídeo",
"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:",
@ -1469,5 +1467,8 @@
"PlaybackErrorNoCompatibleStream": "Houve um erro na criação de perfil do cliente e o servidor não está enviando um formato de mídia compatível.",
"EnableFastImageFadeInHelp": "Habilitar animações rápidas de aparecimento para imagens carregadas",
"LabelDroppedFrames": "Quadros caídos:",
"AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux estiver suficientemente avançada da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais proveitoso para quando não há avanço ou retrocesso do vídeo com frequência. Desative se tiver problemas de reprodução."
"AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux estiver suficientemente avançada da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais proveitoso para quando não há avanço ou retrocesso do vídeo com frequência. Desative se tiver problemas de reprodução.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Preferir as informações incorporadas nos arquivos dos episódios ao invés dos nomes",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Isso utiliza as informações dos episódios incorporadas nos metadados dos arquivos se estiverem disponíveis.",
"ClientSettings": "Configurações do cliente"
}

View File

@ -873,8 +873,7 @@
"GuestStar": "Estrela convidada",
"GroupVersions": "Agrupar versões",
"GroupBySeries": "Agrupar por série",
"GenresValue": "Géneros: {0}",
"GenreValue": "Género: {0}",
"Genre": "Género",
"General": "Geral",
"FormatValue": "Formato: {0}",
"FolderTypeUnset": "Conteúdo Misto",
@ -956,7 +955,7 @@
"LabelBindToLocalNetworkAddress": "Endereço local para colocar o servidor à escuta:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Atualizar metadados automaticamente a partir da Internet:",
"LabelAuthProvider": "Provedor de autenticação:",
"LabelAudio": "Áudio:",
"LabelAudio": "Áudio",
"LabelAllowedRemoteAddressesMode": "Tipo de filtro de IP remoto:",
"LabelAllowedRemoteAddresses": "Filtro de IP remoto:",
"LabelAllowHWTranscoding": "Permitir transcodificação por hardware",
@ -1077,8 +1076,7 @@
"News": "Notícias",
"Programs": "Programas",
"HeaderMovies": "Filmes",
"DirectorsValue": "Realização: {0}",
"DirectorValue": "Realizador: {0}",
"Directors": "Realização",
"ButtonOff": "Desligado",
"ButtonAddImage": "Adicionar Imagem",
"LabelOriginalTitle": "Título original:",
@ -1308,7 +1306,7 @@
"LabelWeb": "Web:",
"LabelVideoCodec": "Codec de vídeo:",
"LabelVideoBitrate": "Taxa de bits de vídeo:",
"LabelVideo": "Vídeo:",
"LabelVideo": "Vídeo",
"DashboardArchitecture": "Arquitetura: {0}",
"DashboardOperatingSystem": "Sistema Operativo: {0}",
"DashboardServerName": "Servidor: {0}",
@ -1322,7 +1320,7 @@
"LabelTextColor": "Côr do texto:",
"LabelTextBackgroundColor": "Côr de fundo do texto:",
"LabelTag": "Etiqueta:",
"LabelSubtitles": "Legendas:",
"LabelSubtitles": "Legendas",
"LabelSportsCategories": "Categorias de Desporto:",
"FetchingData": "A transferir informação adicional",
"List": "lista",

View File

@ -340,7 +340,7 @@
"LabelHttpsPort": "Número da porta HTTPS local:",
"LabelHomeScreenSectionValue": "Secção {0} do Painel Principal:",
"LabelHomeNetworkQuality": "Qualidade da rede interna:",
"LabelHardwareAccelerationTypeHelp": "Esta funcionalidade é experimental e está disponível apenas em sistemas suportados.",
"LabelHardwareAccelerationTypeHelp": "A aceleração de hardware requer configuração adicional.",
"LabelHardwareAccelerationType": "Aceleração por hardware:",
"LabelEncoderPreset": "Predefinição para codificação H264:",
"LabelH264Crf": "CRF para codificação H264:",
@ -377,7 +377,7 @@
"LabelEnableDlnaClientDiscoveryInterval": "Intervalo para descoberta de clientes (segundos)",
"LabelEnableBlastAliveMessagesHelp": "Activar esta opção se o servidor não for convenientemente detectado por outros dispositivos UPnP na rede.",
"LabelEnableBlastAliveMessages": "Enviar mensagens de reconhecimento",
"LabelEnableAutomaticPortMapHelp": "Tenta correponder automaticamente a porta pública para a porta local através de UPnP. Isto poderá não funcionar em alguns modelos de routers.",
"LabelEnableAutomaticPortMapHelp": "Tenta corresponder automaticamente a porta pública para a porta local através de UPnP. Isto poderá não funcionar em alguns modelos de roteadores. As alterações não serão até reinicialização do servidor.",
"LabelEnableAutomaticPortMap": "Activar a correspondência automática de portas",
"LabelEmbedAlbumArtDidlHelp": "Alguns dispositivos preferem este método para obter a capa do álbum. Outros pode não ser capazes de reproduzir com esta opção activada.",
"LabelEmbedAlbumArtDidl": "Incorporar a capa do álbum no DIDL",
@ -450,7 +450,7 @@
"LabelAudioCodec": "Codec de áudio:",
"LabelAudioChannels": "Canais de áudio:",
"LabelAudioBitrate": "Taxa de bits de áudio:",
"LabelAudio": "Áudio:",
"LabelAudio": "Áudio",
"LabelArtistsHelp": "Separe múltiplos com ;",
"LabelArtists": "Artistas:",
"LabelAppNameExample": "Exemplo: Sickbeard, NzbDrone",
@ -906,8 +906,7 @@
"Disconnect": "Desligar",
"Disc": "Disco",
"Disabled": "Desactivado",
"DirectorsValue": "Realização: {0}",
"DirectorValue": "Realizador: {0}",
"Directors": "Realização",
"Director": "Realizador",
"DirectStreaming": "Reprodução directa",
"DirectStreamHelp2": "A reprodução directa de um ficheiro requer pouco processamento e não implica perda de qualidade num vídeo.",
@ -1092,7 +1091,7 @@
"AuthProviderHelp": "Seleccione um mecanismo de autenticação a ser utilizado para validar as credenciais deste utilizador.",
"Audio": "Áudio",
"AttributeNew": "Novo",
"AspectRatio": "Formato",
"AspectRatio": "Proporção da tela",
"Ascending": "Crescente",
"Art": "Capa",
"AroundTime": "Por volta das {0}",
@ -1186,12 +1185,11 @@
"GuestStar": "Estrela convidada",
"GroupVersions": "Agrupar versões",
"GroupBySeries": "Agrupar por série",
"GenresValue": "Géneros: {0}",
"ErrorAddingListingsToSchedulesDirect": "Ocorreu um erro ao adicionar o alinhamento à sua conta Schedules Direct. As contas Schedules Direct permitem apenas um número limitado de alinhamentos. Poderá ser necessário iniciar sessão na sua conta e remover outras listagens antes de prosseguir.",
"Ended": "Terminado",
"DefaultMetadataLangaugeDescription": "Estes são os valores por omissão que podem ser individualizados para cada uma das bibliotecas.",
"Genres": "Géneros",
"GenreValue": "Género: {0}",
"Genre": "Género",
"General": "Geral",
"Fullscreen": "Ecrã inteiro",
"Friday": "Sexta",
@ -1218,5 +1216,115 @@
"LabelUserLoginAttemptsBeforeLockout": "Número de tentativas de login falhadas antes do bloqueio do utilizador:",
"LabelTrackNumber": "Número da faixa:",
"LabelSportsCategories": "Categorias de Desportos:",
"Yesterday": "Ontem"
"Yesterday": "Ontem",
"MusicVideo": "Vídeo de música",
"MusicLibraryHelp": "Reveja o {0} guia de nomes de músicas {1}.",
"MusicArtist": "Artista musical",
"MusicAlbum": "Álbum de música",
"MovieLibraryHelp": "Reveja o {0} guia de nomeação de filmes {1}.",
"MoveRight": "Mover para a direita",
"MoveLeft": "Mova à esquerda",
"MoreMediaInfo": "Informações sobre mídia",
"MoreFromValue": "Mais de {0}",
"MediaInfoRefFrames": "Quadros de referência",
"MediaInfoContainer": "Container",
"MediaInfoAnamorphic": "Anamorphic",
"LabelVideoResolution": "Resolução do vídeo:",
"LabelTypeMetadataDownloaders": "{0} metadata downloaders:",
"LabelTranscodePath": "Caminho da transcodificação:",
"OnlyImageFormats": "Somente formatos de imagem (VOBSUB, PGS, SUB, etc)",
"OnlyForcedSubtitlesHelp": "Apenas as legendas marcadas como forçadas serão carregadas.",
"OnlyForcedSubtitles": "Apenas legendas forçadas",
"Off": "Desligar",
"NumLocationsValue": "{0} pastas",
"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}",
"No": "Não",
"Mobile": "Celular",
"MetadataSettingChangeHelp": "A alteração das configurações de metadados afetará o novo conteúdo adicionado a partir de agora. Para atualizar o conteúdo existente, abra a tela de detalhes e clique no botão Atualizar ou execute atualizações em massa usando o gerenciador de metadados.",
"MetadataManager": "Gestor de metadados",
"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.",
"MessageNoCollectionsAvailable": "As coleções permitem que você desfrute de agrupamentos personalizados de filmes, séries e álbuns. Clique no botão + para começar a criar coleções.",
"MessageConfirmAppExit": "Você quer sair?",
"MediaInfoLayout": "Layout",
"MediaInfoLanguage": "Língua",
"MediaInfoInterlaced": "Entrelaçada",
"MediaInfoFramerate": "Taxa de quadros",
"MediaInfoForced": "Forçar",
"MediaInfoExternal": "Externo",
"MediaInfoDefault": "Padrão",
"MediaInfoCodecTag": "Codec tag",
"MediaInfoCodec": "Codec",
"MediaInfoBitrate": "Taxa de bits",
"MediaInfoBitDepth": "Profundidade de bits",
"MediaInfoAspectRatio": "Proporção da tela",
"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": "Open the web client in your default web browser when the server initially starts. This will not occur when using the restart server function.",
"LaunchWebAppOnStartup": "Inicie a interface da web ao iniciar o servidor",
"Large": "Amplo",
"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": "O caminho para o arquivo do aplicativo ffmpeg ou pasta que contém o ffmpeg.",
"LabelffmpegPath": "FFmpeg caminho:",
"LabelYear": "Ano:",
"LabelXDlnaDoc": "X-DLNA doc:",
"LabelXDlnaCap": "X-DLNA cap:",
"LabelWeb": "Web:",
"LabelVideoCodec": "Vídeo: codec:",
"LabelVideoBitrate": "Vídeo taxa de bits:",
"LabelVideo": "Vídeo:",
"DashboardArchitecture": "Arquitetura: {0}",
"DashboardServerName": "Servidor: {0}",
"DashboardVersionNumber": "Versão: {0}",
"LabelVersion": "Versão:",
"LabelVaapiDeviceHelp": "Este é o nó de renderização usado para aceleração de hardware.",
"LabelVaapiDevice": "VA API Dispositivo:",
"LabelUserAgent": "Agente de usuário",
"LabelTranscodes": "Transcodificação:",
"LabelTranscodingFramerate": "Transcodificação frame por segundo:",
"LabelTranscodingProgress": "Progresso da transcodificação:",
"LabelTitle": "Título:",
"LabelTheme": "Tema:",
"LabelTextColor": "Cor do texto:",
"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 da Ordenação",
"LabelSortBy": "Ordenar por:",
"LabelSkin": "Skin:",
"EnableFastImageFadeInHelp": "Habilite uma animação mais rápida para imagens carregadas",
"EnableFastImageFadeIn": "Efeito de imagem fade-in rápido",
"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:",
"LabelMetadataSavers": "Economizadores de metadados:",
"LabelDroppedFrames": "Quadros caídos:",
"LabelCorruptedFrames": "Quadros corrompidos:",
"LabelAudioBitDepth": "Profundidade do bit de áudio:",
"ClientSettings": "Configurações do Cliente",
"AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux se aproximar da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais útil ao assistir sem procurar com frequência. Desative isso se você tiver problemas de reprodução.",
"MySubtitles": "Minhas legendas",
"Name": "Nome"
}

View File

@ -229,7 +229,7 @@
"AllLibraries": "Toate librăriile",
"AllLanguages": "Toate limbile",
"AllEpisodes": "Toate episoadele",
"AllComplexFormats": "Toate formatele complexe (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc.)",
"AllComplexFormats": "Toate formatele complexe (ASS, SSA, VOBSUB, PGS, SUB, IDX)",
"AllChannels": "Toate canalele",
"Alerts": "Alerte",
"Albums": "Albume",
@ -251,8 +251,8 @@
"Collections": "Colecții",
"AllowRemoteAccess": "Permite conexiuni externe către serverul Jellyfin.",
"AllowRemoteAccessHelp": "Dacă este nebifat, toate conexiunile externe vor fi blocate.",
"AlwaysPlaySubtitles": "Întotdeauna folosește subtitrări",
"AnyLanguage": "Orice limbă",
"AlwaysPlaySubtitles": "Întotdeauna arată",
"AnyLanguage": "Orice Limbă",
"Anytime": "Oricând",
"Art": "Artă",
"AlwaysPlaySubtitlesHelp": "Subtitrările care se potrivesc cu preferințele limbii utilizate vor fi încărcate indiferent de limba audio.",
@ -288,7 +288,7 @@
"Director": "Regizor",
"AllowOnTheFlySubtitleExtractionHelp": "Subtitrările încorporate pot fi extrase din video și transmise către client în mod text pentru a preveni transcodarea videoului. Pe unele sisteme acest lucru poate dura mult timp și poate cauza oprirea redării video în timpul procesului de extragere. Dezactivează opțiunea pentru a avea subtitrările încorporate incluse în videoul transcodat atunci când nu sunt nativ suportate de către dispozitivul client.",
"BirthLocation": "Locul nașterii",
"BurnSubtitlesHelp": "Determină dacă serverul ar trebui să includă subtitrări când face conversia video depinzând de formatul subtitrărilor. Evitând includerea subtitrărilor va îmbunătăți performanța serverului. Selectează Auto pentru includerea formaturilor bazate pe imagini (VOBSUB, PGS, SUB/IDX, etc) și anumitor subtitrări ASS/SSA.",
"BurnSubtitlesHelp": "Determină dacă serverul ar trebui să includă subtitrări când face transcodarea video. Evitând acest lucru va îmbunătăți performanța serverului. Selectează Auto pentru includerea formaturilor bazate pe imagini (VOBSUB, PGS, SUB, IDX) și anumitor subtitrări ASS sau SSA.",
"ButtonPreviousTrack": "Calea anterioară",
"ButtonRevoke": "Revocă",
"ButtonSettings": "Setări",
@ -382,8 +382,7 @@
"ConfirmDeletion": "Confirmă ștergerea",
"DeleteDeviceConfirmation": "Sigur doriți să ștergeți acest dispozitiv? Acesta va reapărea data viitoare când un utilizator se conectează cu acesta.",
"DeleteUser": "Șterge utilizator",
"DirectorValue": "Regizor: {0}",
"DirectorsValue": "Regizori: {0}",
"Directors": "Regizori",
"Disabled": "Dezactivat",
"Disconnect": "Deconectare",
"Dislike": "Neplăcut",
@ -545,8 +544,7 @@
"EveryNDays": "La fiecare {0} zile",
"Extras": "Extra",
"Genres": "Genuri",
"GenreValue": "Gen: {0}",
"GenresValue": "Genuri: {0}",
"Genre": "Gen",
"Guide": "Ghid",
"HeaderCancelRecording": "Anulați înregistrarea",
"HeaderCancelSeries": "Anulați seriile",
@ -590,7 +588,7 @@
"DisplayInOtherHomeScreenSections": "Afișați în secțiuni ecranul principal, cum ar fi cele mai noi suporturi și continuați să vizionați",
"DisplayMissingEpisodesWithinSeasons": "Afișați episoade lipsă din sezoane",
"DisplayMissingEpisodesWithinSeasonsHelp": "Acesta trebuie de asemenea activat pentru bibliotecile TV din configurația serverului.",
"DisplayModeHelp": "Selectați tipul de ecran pe care executați Jellyfin.",
"DisplayModeHelp": "Selectați stilul schemei pe care îl doriți pentru interfață.",
"Download": "Descarcă",
"DrmChannelsNotImported": "Canalele cu DRM nu vor fi importate.",
"DropShadow": "Umbra",
@ -655,7 +653,7 @@
"LabelTag": "Etichetă:",
"LabelTVHomeScreen": "Ecran de pornire în modul TV:",
"LabelSupportedMediaTypes": "Tipuri media suportate:",
"LabelSubtitles": "Subtitrări:",
"LabelSubtitles": "Subtitrări",
"LabelSubtitlePlaybackMode": "Mod subtitrare:",
"LabelSubtitleFormatHelp": "Exemplu: srt",
"LabelSubtitleDownloaders": "Descărcare subtitrări:",
@ -905,7 +903,7 @@
"LabelAudioChannels": "Canale audio:",
"LabelAudioBitrate": "Rata de biți audio:",
"LabelAudioBitDepth": "Adâncimea bitului audio:",
"LabelAudio": "Audio:",
"LabelAudio": "Audio",
"LabelAppNameExample": "Exemplu: Sickbeard, Sonarr",
"LabelAppName": "Nume app",
"LabelAllowedRemoteAddressesMode": "Modul de filtrare a adresei IP de la distanță:",
@ -1002,16 +1000,16 @@
"OptionAlbum": "Album",
"OptionAdminUsers": "Administratorii",
"Option3D": "3D",
"OnlyImageFormats": "Numai formate de imagine (VOBSUB, PGS, SUB, etc)",
"OnlyImageFormats": "Numai formate de imagine (VOBSUB, PGS, SUB)",
"OnlyForcedSubtitlesHelp": "Se vor încărca doar subtitrările marcate drept forțate.",
"OnlyForcedSubtitles": "Numai subtitrări forțate",
"OnlyForcedSubtitles": "Numai forțate",
"OneChannel": "Un canal",
"Off": "Oprit",
"NumLocationsValue": "{0} dosare",
"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ă subtitrare",
"NoSubtitles": "Fără",
"NoSubtitleSearchResultsFound": "Nici un rezultat găsit.",
"NoPluginConfigurationMessage": "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.",
@ -1148,7 +1146,7 @@
"LabelWeb": "Web:",
"LabelVideoCodec": "Codec video:",
"LabelVideoBitrate": "Rata de biți a video-ului:",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"DashboardArchitecture": "Arhitectură: {0}",
"DashboardOperatingSystem": "Sistem de operare: {0}",
"DashboardServerName": "Server: {0}",
@ -1468,5 +1466,19 @@
"AskAdminToCreateLibrary": "Cereți unui administrator să creeze o bibliotecă.",
"PlaybackErrorNoCompatibleStream": "A apărut o problemă cu profilarea clientului, 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 cel mai util când priviți fără a derula des. Dezactivați acestă opțiune dacă întâmpinați probleme de redare.",
"AllowFfmpegThrottling": "Accelerare Transcod-uri"
"AllowFfmpegThrottling": "Accelerare Transcod-uri",
"Track": "Cale",
"Season": "Sezon",
"ReleaseGroup": "Gruparea lansării",
"PreferEmbeddedEpisodeInfosOverFileNames": "Preferați informațiile despre episod încorporate în fișier decât numele fișierelor",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Aceasta folosește informațiile despre episod din metadatele încorporate, dacă sunt disponibile.",
"Person": "Persoană",
"OtherArtist": "Alt artist",
"Movie": "Film",
"Episode": "Episod",
"ClientSettings": "Setări pentru client",
"BoxSet": "Set de colecție",
"Artist": "Artist",
"AlbumArtist": "Artistul albumului",
"Album": "Album"
}

View File

@ -181,8 +181,7 @@
"DirectStreamHelp2": "При прямой трансляции файла расходуется очень мало вычислительной мощности без потери качества видео.",
"DirectStreaming": "Транслируется напрямую",
"Director": "Режиссёр",
"DirectorValue": "Режиссёр: {0}",
"DirectorsValue": "Режиссёры: {0}",
"Directors": "Режиссёры",
"Disabled": "Отключено",
"Disc": "Диск",
"Disconnect": "Разъединиться",
@ -260,9 +259,8 @@
"Friday": "пятница",
"Fullscreen": "Полный экран",
"General": "Общие",
"GenreValue": "Жанр: {0}",
"Genre": "Жанр",
"Genres": "Жанры",
"GenresValue": "Жанры: {0}",
"GroupBySeries": "Группирование по сериалам",
"GroupVersions": "Сгруппировать версии",
"GuestStar": "Пригл. актёр",
@ -527,7 +525,7 @@
"LabelAppNameExample": "Пример: Sickbeard, Sonarr",
"LabelArtists": "Исполнители:",
"LabelArtistsHelp": "Для разделения используйте точку с запятой ;",
"LabelAudio": "Аудио:",
"LabelAudio": "Аудио",
"LabelAudioLanguagePreference": "Выбор языка аудио:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Автоматически обновлять метаданные из Интернета:",
"LabelBindToLocalNetworkAddress": "Привязка к адресу в локальной сети:",
@ -794,7 +792,7 @@
"LabelSubtitleDownloaders": "Загрузчики субтитров:",
"LabelSubtitleFormatHelp": "Пример: srt",
"LabelSubtitlePlaybackMode": "Режим субтитров:",
"LabelSubtitles": "Субтитры:",
"LabelSubtitles": "Субтитры",
"LabelSupportedMediaTypes": "Поддерживаемые типы медиаданных:",
"LabelTVHomeScreen": "Главная страница ТВ-режима:",
"LabelTag": "Тег:",
@ -832,7 +830,7 @@
"LabelVersion": "Версия:",
"LabelVersionInstalled": "Установлена: {0}",
"LabelVersionNumber": "Версия {0}",
"LabelVideo": "Видео:",
"LabelVideo": "Видео",
"LabelXDlnaCap": "Свойства X-Dlna:",
"LabelXDlnaCapHelp": "Определяется содержание из элемента X_DLNACAP во пространстве имён urn:schemas-dlna-org:device-1-0.",
"LabelXDlnaDoc": "Схема X-Dlna:",

View File

@ -123,8 +123,7 @@
"DetectingDevices": "Hľadám zariadenia",
"DeviceAccessHelp": "Táto možnosť sa vzťahuje iba na zariadenia, ktoré môžu byť jedinečne identifikované a nezabráni prístup cez prehliadač. Filtrovaním prístupu používateľských zariadení zabraňuje užívateľom použiť nové zariadenie, pokiaľ neboli tu schválené.",
"Director": "Režisér",
"DirectorValue": "Réžia: {0}",
"DirectorsValue": "Režiséri: {0}",
"Directors": "Režiséri",
"Disc": "Disk",
"Disconnect": "Odpojiť",
"Dislike": "Nepáči sa mi to",
@ -165,9 +164,8 @@
"Friday": "Piatok",
"Fullscreen": "Celá obrazovka",
"General": "Všeobecné",
"GenreValue": "Žáner: {0}",
"Genre": "Žáner",
"Genres": "Žánre",
"GenresValue": "Žánre: {0}",
"GroupBySeries": "Zoskupiť podľa série",
"GuestStar": "Hosťujúca hviezda",
"Guide": "Sprievodca",
@ -473,7 +471,7 @@
"LabelStartWhenPossible": "Spustiť akonáhle je možné:",
"LabelStatus": "Stav:",
"LabelSubtitleFormatHelp": "Príklad: srt",
"LabelSubtitles": "Titulky:",
"LabelSubtitles": "Titulky",
"LabelSupportedMediaTypes": "Podporované typy médií:",
"LabelTextBackgroundColor": "Farba pozadia textu:",
"LabelTextColor": "Farba textu:",
@ -962,7 +960,7 @@
"HeaderVideoType": "Typ videa",
"HeaderVideoTypes": "Typy videí",
"LabelAirsBeforeSeason": "Vysielané pred sériou:",
"LabelAudio": "Zvuk:",
"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é",
@ -1329,7 +1327,7 @@
"LabelXDlnaCap": "X-DLNA cap:",
"LabelVideoCodec": "Video kodek:",
"LabelVideoBitrate": "Dátový tok videa:",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"LabelVaapiDeviceHelp": "Toto je vykreslovací node, ktorý sa používa na hardvérovú akceleráciu.",
"LabelVaapiDevice": "VA API zariadenie:",
"LabelUserRemoteClientBitrateLimitHelp": "Prepíše východzie globálne hodnoty nastavené v nastavení prehrávania servera.",
@ -1470,5 +1468,8 @@
"AskAdminToCreateLibrary": "Pokiaľ chcete vytvoriť knižnicu, musíte sa spýtať administrátora.",
"PlaybackErrorNoCompatibleStream": "Nastal problém s profilom klienta a server preto neposiela kompatibilný mediálny formát.",
"AllowFfmpegThrottlingHelp": "Keď sa transkódovanie alebo remuxovanie dostane do bodu, kedy je dostatočne vopred voči súčasnej polohe prehrávania, pozastaví proces aby spotrebovával menej zdrojov. Toto je najviac užitočné, keď sa pozerá obsah bez pretáčania. Vypnite túto možnosť, pokiaľ má vaše prehrávanie problémy.",
"AllowFfmpegThrottling": "Obmedzenie transkódovania"
"AllowFfmpegThrottling": "Obmedzenie transkódovania",
"PreferEmbeddedEpisodeInfosOverFileNames": "Preferovať vložené informácie o epizóde pred názvom súboru",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Toto využíva informácie o epizóde z vložených metadát, pokiaľ sú dostupne.",
"ClientSettings": "Nastavenie klienta"
}

View File

@ -271,8 +271,7 @@
"Down": "Dol",
"Dislike": "Ni mi všeč",
"Disabled": "Onemogočen",
"DirectorsValue": "Režiserji: {0}",
"DirectorValue": "Režiser: {0}",
"Directors": "Režiserji",
"Director": "Režiser",
"DetectingDevices": "Zaznavanje naprav",
"Desktop": "Namizje",
@ -462,8 +461,7 @@
"GuestStar": "Gostujoči igralec",
"GroupVersions": "Združi različice",
"GroupBySeries": "Združi bo serijah",
"GenresValue": "Zvrsti: {0}",
"GenreValue": "Zvrst: {0}",
"Genre": "Zvrst",
"General": "Splošno",
"Fullscreen": "Celoten zaslon",
"Friday": "Petek",
@ -596,7 +594,7 @@
"LabelAppName": "Ime aplikacije",
"LabelAppNameExample": "Primer: Sickbeard, Sonarr",
"LabelArtistsHelp": "Loči več z ;",
"LabelAudio": "Zvok:",
"LabelAudio": "Zvok",
"LabelAudioBitrate": "Bitna hitrost zvoka:",
"LabelAudioChannels": "Kanali zvoka:",
"LabelAudioCodec": "Zvočni kodek:",
@ -1187,7 +1185,7 @@
"LabelTextBackgroundColor": "Barva ozadja besedila:",
"LabelTag": "Oznaka:",
"LabelSupportedMediaTypes": "Podprti tipi predstavnosti:",
"LabelSubtitles": "Podnapisi:",
"LabelSubtitles": "Podnapisi",
"LabelSubtitlePlaybackMode": "Način podnapisov:",
"LabelSubtitleFormatHelp": "Primer: srt",
"LabelSubtitleDownloaders": "Pridobivanje podnapisov:",

View File

@ -163,8 +163,7 @@
"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",
"DirectorValue": "Regi: {0}",
"DirectorsValue": "Regi: {0}",
"Directors": "Regi",
"Disabled": "Inaktiverad",
"Disc": "Skiva",
"Disconnect": "Koppla bort",
@ -235,7 +234,6 @@
"Friday": "Fredag",
"Fullscreen": "Fullskärm",
"Genres": "Genrer",
"GenresValue": "Genrer: {0}",
"GroupBySeries": "Gruppera efter serie",
"GroupVersions": "Gruppera versioner",
"GuestStar": "Gästmedverkande",
@ -482,7 +480,7 @@
"LabelAppNameExample": "Exempel: Sickbeard, Sonarr",
"LabelArtists": "Artister:",
"LabelArtistsHelp": "Separera med vid flera ;",
"LabelAudio": "Ljud:",
"LabelAudio": "Ljud",
"LabelAudioLanguagePreference": "Önskat ljudspråk:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Uppdatera metadata automatiskt ifrån internet:",
"LabelBindToLocalNetworkAddress": "Knyt till lokal nätverksadress:",
@ -742,7 +740,7 @@
"LabelSubtitleDownloaders": "Undertextskällor:",
"LabelSubtitleFormatHelp": "Exempel: srt",
"LabelSubtitlePlaybackMode": "Undertextläge:",
"LabelSubtitles": "Undertexter:",
"LabelSubtitles": "Undertexter",
"LabelSupportedMediaTypes": "Mediaformat som stöds:",
"LabelTVHomeScreen": "Hemskärm i TV-läge:",
"LabelTag": "Etikett:",
@ -1273,7 +1271,7 @@
"HeaderApp": "Applikation",
"HeaderAdmin": "Administratör",
"Guide": "Guide",
"GenreValue": "Genre: {0}",
"Genre": "Genre",
"General": "Allmänt",
"FastForward": "Snabbspola",
"Extras": "Extramaterial",
@ -1453,7 +1451,7 @@
"LabelVideoResolution": "Video upplösning:",
"LabelVideoCodec": "Video codec:",
"LabelVideoBitrate": "Video bitrate:",
"LabelVideo": "Video:",
"LabelVideo": "Video",
"DashboardArchitecture": "Arkitektur: {0}",
"DashboardOperatingSystem": "Operativsystem: {0}",
"DashboardServerName": "Server: {0}",

View File

@ -314,9 +314,8 @@
"ColorPrimaries": "Renk primerleri",
"DirectStreamHelp2": "Doğrudan Akış, video kalitesinde herhangi bir kayıp olmadan çok az işlem gücü kullanır.",
"DirectStreaming": "Doğrudan akış",
"Director": "yönetmen",
"DirectorValue": "Yönetmen: {0}",
"DirectorsValue": "Yöneticiler: {0}",
"Director": "Yönetmen",
"Directors": "Yöneticiler",
"Disabled": "Deaktif",
"DisplayModeHelp": "Jellyfini çalıştırdığınız ekran türünü seçin.",
"DoNotRecord": "Kaydetme",
@ -521,8 +520,7 @@
"GuestStar": "Konuk sanatçı",
"GroupVersions": "Grup versiyonları",
"GroupBySeries": "Seriye göre gruplandır",
"GenresValue": "Türler: {0}",
"GenreValue": "Tür: {0}",
"Genre": "Tür",
"General": "Genel",
"Fullscreen": "Tam ekran",
"FormatValue": "Biçim: {0}",
@ -651,7 +649,7 @@
"LabelAudioSampleRate": "Ses örnekleme hızı:",
"LabelAudioCodec": "Ses kodeği:",
"LabelAudioChannels": "Ses kanalları:",
"LabelAudio": "Ses:",
"LabelAudio": "Ses",
"LabelAppName": "Uygulama adı",
"LabelAllowHWTranscoding": "Donanım kod dönüştürmesine izin ver",
"LabelAll": "Tümü",

View File

@ -217,7 +217,7 @@
"EveryNDays": "每 {0} 天",
"ExitFullscreen": "退出全屏",
"ExtraLarge": "特大",
"ExtractChapterImagesHelp": "提取章节图像将允许客户端显示一个图像形式的场景选择菜单。这个提取的过程可能会非常缓慢、占用大量 CPU 资源并且可能需要几个GB的硬盘空间。提取将会在视频被发现时启动同时也作为一个夜间计划任务运行。这个任务可以在“计划任务”选项中进行设置。不建议在高峰使用时间运行这个任务。",
"ExtractChapterImagesHelp": "提取剧集图片将允许客户端显示一个图像形式的场景选择菜单。这个提取的过程可能会非常缓慢、占用大量 CPU 资源并且可能需要几个GB的硬盘空间。提取将会在视频被发现时启动同时也作为一个夜间计划任务运行。这个任务可以在“计划任务”选项中进行设置。不建议在高峰使用时间运行这个任务。",
"Extras": "额外",
"FFmpegSavePathNotFound": "我们无法通过你输入的路径定位 FFmpeg。FFprobe 同样也是必要的并且应该被放在同一个文件夹中。他们通常会被打包在一起以供下载。请检查这个路径然后再试一次。",
"FastForward": "快进",
@ -277,7 +277,7 @@
"HeaderCastCrew": "演职人员",
"HeaderChannelAccess": "频道访问",
"HeaderChannels": "频道",
"HeaderChapterImages": "章节图片",
"HeaderChapterImages": "剧集图片",
"HeaderCodecProfile": "编解码器配置",
"HeaderCodecProfileHelp": "编解码器的配置文件标明了设备播放特定编码时的限制。如果在限制之内则媒体将被转码,否则编解码器将被配置为直接播放。",
"HeaderConfigureRemoteAccess": "配置远程访问",
@ -537,8 +537,8 @@
"LabelDisplayName": "显示名称:",
"LabelDisplayOrder": "显示顺序:",
"LabelDisplaySpecialsWithinSeasons": "显示季中所播出的特集",
"LabelDownMixAudioScale": "混音频增强:",
"LabelDownMixAudioScaleHelp": "缩混音频增强。值为A将保留原来的音量。",
"LabelDownMixAudioScale": "混音频增强:",
"LabelDownMixAudioScaleHelp": "降混音时增强音频。值为 1 时将保留原始音量。",
"LabelDownloadLanguages": "下载语言:",
"LabelDropImageHere": "拖拽或点击选择图像于此处。",
"LabelDroppedFrames": "丢弃的帧:",
@ -568,8 +568,8 @@
"LabelEpisodeNumber": "集号:",
"LabelEvent": "事件:",
"LabelEveryXMinutes": "每:",
"LabelExtractChaptersDuringLibraryScan": "媒体库扫描过程中解压章节图像",
"LabelExtractChaptersDuringLibraryScanHelp": "当媒体库导入视频并扫描时,将提取章节图像。否则,章节图像将在之后的计划任务提取,而媒体库会更快完成扫描。",
"LabelExtractChaptersDuringLibraryScan": "媒体库扫描过程中解压剧集图片",
"LabelExtractChaptersDuringLibraryScanHelp": "当媒体库导入视频并扫描时,将提取剧集图片。否则,剧集图片将在之后的计划任务提取,而媒体库会更快完成扫描。",
"LabelFailed": "失败",
"LabelFileOrUrl": "文件或网址:",
"LabelFinish": "完成",
@ -705,7 +705,7 @@
"LabelPublicHttpPortHelp": "映射到本地 HTTP 端口的公开端口号。",
"LabelPublicHttpsPort": "公开 HTTPS 端口号:",
"LabelPublicHttpsPortHelp": "映射到本地 HTTPS 端口的公开端口号。",
"LabelReadHowYouCanContribute": "学习如何构建。",
"LabelReadHowYouCanContribute": "了解如何做出贡献。",
"LabelReasonForTranscoding": "转码原因:",
"LabelRecord": "录制:",
"LabelRecordingPath": "默认录制路径:",
@ -753,7 +753,7 @@
"LabelSubtitleDownloaders": "字幕下载器:",
"LabelSubtitleFormatHelp": "例如SRT",
"LabelSubtitlePlaybackMode": "字幕模式:",
"LabelSubtitles": "字幕",
"LabelSubtitles": "字幕",
"LabelSupportedMediaTypes": "支持的媒体类型:",
"LabelTVHomeScreen": "TV 模式主屏幕:",
"LabelTag": "标签:",
@ -998,7 +998,7 @@
"OptionEstimateContentLength": "转码时,估计内容长度",
"OptionEveryday": "每天",
"OptionExternallyDownloaded": "外部下载",
"OptionExtractChapterImage": "开启章节图像提取",
"OptionExtractChapterImage": "开启剧集图片提取",
"OptionFavorite": "我的最爱",
"OptionFriday": "星期五",
"OptionHasSpecialFeatures": "特殊功能",
@ -1310,16 +1310,14 @@
"BoxRear": "盒子(背面)",
"ChannelNumber": "频道号码",
"ColorSpace": "色彩空间",
"DirectorValue": "导演:{0}",
"DirectorsValue": "导演:{0}",
"Directors": "导演",
"ColorTransfer": "色彩转换",
"ConfirmDeleteItem": "这将同时在磁盘和媒体库中删除这个项目。确认删除?",
"ConfirmDeleteItems": "这将同时在磁盘和媒体库中删除这些项目。确认删除?",
"ConfirmEndPlayerSession": "确认要关闭位于{0}的Jellyfin吗",
"ValueSeconds": "{0}秒",
"Features": "功能",
"GenreValue": "风格:{0}",
"GenresValue": "风格:{0}",
"Genre": "风格",
"Guide": "指南",
"HeaderCancelRecording": "取消录制",
"HeaderFavoriteMovies": "最爱的电影",
@ -1329,7 +1327,7 @@
"HeaderFavoriteVideos": "最爱的视频",
"HeaderVideoType": "视频类型",
"Items": "项目",
"LabelAudio": "音频",
"LabelAudio": "音频",
"LabelServerName": "服务器名称:",
"LabelTranscodePath": "转码路径:",
"LabelTranscodes": "转码:",
@ -1348,7 +1346,7 @@
"HeaderFavoriteArtists": "最爱的艺术家",
"HeaderKeepRecording": "继续录制",
"HeaderKeepSeries": "保持系列",
"HeaderMusicQuality": "音质",
"HeaderMusicQuality": "音",
"HeaderNextEpisodePlayingInValue": "下一集在 {0} 后播放",
"HeaderNextVideoPlayingInValue": "下一部影片在 {0} 后播放",
"HeaderPlayOn": "播放在",
@ -1365,7 +1363,7 @@
"LabelUserLoginAttemptsBeforeLockout": "用户被封禁前可尝试的次数:",
"DashboardVersionNumber": "版本:{0}",
"DashboardServerName": "服务器:{0}",
"LabelVideo": "视频",
"LabelVideo": "视频",
"LabelWeb": "网站:",
"LeaveBlankToNotSetAPassword": "您可以将此字段留空以设置空密码。",
"LinksValue": "链接:{0}",
@ -1474,5 +1472,8 @@
"AskAdminToCreateLibrary": "请联系管理员以创建一个新的资料库。",
"PlaybackErrorNoCompatibleStream": "客户端配置文件存在问题,服务器未发送兼容的媒体格式。",
"AllowFfmpegThrottlingHelp": "当转码或再封装的进度大幅超过当前播放位置时,暂停该进程,以使其消耗更少的资源。在观看时不经常调整播放进度的情况下,这将非常有用。如果遇到播放问题,请关闭此功能。",
"AllowFfmpegThrottling": "限制转码速度"
"AllowFfmpegThrottling": "限制转码速度",
"PreferEmbeddedEpisodeInfosOverFileNames": "优先使用内置的剧集信息而不是文件名",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "这将在内置元数据含剧集信息时使用内置信息。",
"ClientSettings": "客户端设置"
}

View File

@ -328,7 +328,7 @@
"Art": "圖像",
"Artists": "演出者",
"AsManyAsPossible": "越多越好",
"Ascending": "由少到多",
"Ascending": "遞增",
"AspectRatio": "長寬比",
"AttributeNew": "新增",
"Audio": "音訊",
@ -453,8 +453,7 @@
"DirectStreamHelp2": "直接串流檔案會占用非常少的處理效能並且影片的品質不會有任何損失。",
"DirectStreaming": "直接串流",
"Director": "導演",
"DirectorValue": "導演: {0}",
"DirectorsValue": "導演: {0}",
"Directors": "導演",
"Disabled": "已停用",
"Disc": "光碟",
"Disconnect": "斷開連結",
@ -539,9 +538,8 @@
"FreeAppsFeatureDescription": "享受免費的Jellyfin應用程式。",
"Fullscreen": "全螢幕",
"General": "一般",
"GenreValue": "類型 : {0}",
"Genre": "類型",
"Genres": "風格",
"GenresValue": "類型 : {0}",
"GroupBySeries": "按系列分組",
"GroupVersions": "按版本分組",
"GuestStar": "特邀明星",
@ -552,7 +550,7 @@
"EncoderPresetHelp": "速度越慢則會得到更好的壓縮編碼效率。",
"HDPrograms": "HD節目",
"HandledByProxy": "由反向代理處理",
"HardwareAccelerationWarning": "啟動硬體加速可能在某些環境下導致系統不穩定。請確認你的作業系統和影片驅動程式是最新的。如果你在開啟此項後播放影片產生困難,那麼你需要將此選項設回”自動“。",
"HardwareAccelerationWarning": "啟動硬體加速可能在某些環境下導致系統不穩定。請確認你的作業系統和影片驅動程式是最新的。如果你在開啟此項後播放影片產生困難,那麼你需要將此選項設回”“。",
"HeaderAccessSchedule": "存取時程",
"HeaderAccessScheduleHelp": "建立一個存取時程以限制可存取的時段。",
"HeaderActiveDevices": "運行中裝置",
@ -917,7 +915,7 @@
"LabelAppNameExample": "例如: Sickbeard, Sonarr",
"LabelArtists": "藝人:",
"LabelArtistsHelp": "分開多重使用 ;",
"LabelAudio": "音頻",
"LabelAudio": "音頻",
"LabelAuthProvider": "認證提供者:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "從網路自動刷新數據:",
"LabelBindToLocalNetworkAddress": "聯結本地網絡地址:",
@ -1046,7 +1044,7 @@
"LabelExtractChaptersDuringLibraryScan": "於媒體庫掃描時擷取章節圖片",
"LabelHttpsPort": "本地 HTTPS 端口:",
"LabelFailed": "失敗",
"LabelSubtitles": "字幕",
"LabelSubtitles": "字幕",
"LabelSupportedMediaTypes": "支援的媒體類型:",
"LabelTextBackgroundColor": "文字背景顏色:",
"LabelTextColor": "文字顏色:",
@ -1062,7 +1060,7 @@
"LabelTypeText": "文本",
"LabelUsername": "使用者名稱:",
"DashboardOperatingSystem": "作業系統:{0}",
"LabelVideo": "影片",
"LabelVideo": "影片",
"LabelVideoCodec": "影片編碼:",
"LabelYear": "年:",
"LatestFromLibrary": "最新 {0}",
@ -1493,7 +1491,7 @@
"RecordingPathChangeMessage": "更改錄製資料夾不會將現有錄製從舊位置遷移到新的,您需要手動移動它們。",
"RestartPleaseWaitMessage": "Jellyfin 伺服器將重新啟動,這將花費幾分鐘時間。",
"LabelEmbedAlbumArtDidl": "於 Didl 中嵌入專輯封面",
"LabelEnableAutomaticPortMapHelp": "自動嘗試映射公共連接埠到 UPnP 本地連接埠。這可能無法用於某些路由器。",
"LabelEnableAutomaticPortMapHelp": "自動嘗試映射公共連接埠到 UPnP 本地連接埠。這可能無法用於某些路由器。需重新啓動伺服器。",
"LabelEmbedAlbumArtDidlHelp": "有些裝置使用這個方式來取得專輯封面,啟用這個選項可能導致其他設備播放失敗。",
"SettingsWarning": "更改這些值可能會導致不穩定或連線故障。如果您遇到任何問題,建議將它們重新更改為預設值。",
"LabelEnableSingleImageInDidlLimitHelp": "若在 Didl 中嵌入多個圖片,某些裝置可能無法正常顯示。",
@ -1636,10 +1634,18 @@
"LaunchWebAppOnStartupHelp": "伺服器啓動時在默認游覽器中打開網頁端。使用重啓伺服器功能時此項不生效。",
"LabelVideoResolution": "視頻解析度:",
"LabelStreamType": "串流類型:",
"EnableFastImageFadeInHelp": "為已加載的圖片啓用更快的淡入動畫",
"EnableFastImageFadeIn": "快速圖片淡入",
"EnableFastImageFadeInHelp": "對已載入的圖片啟用更快的淡入動畫",
"EnableFastImageFadeIn": "圖片快速淡入效果",
"LabelPlayerDimensions": "播放器尺寸:",
"LabelDroppedFrames": "丟棄的幀:",
"LabelCorruptedFrames": "損壞的幀:",
"ButtonSplit": "拆分"
"ButtonSplit": "分割",
"AskAdminToCreateLibrary": "如要建立資料庫,請求管理員。",
"NoCreatedLibraries": "看來您還未創任何媒體庫。{0}立刻創一個新的嗎?{1}",
"ClientSettings": "用戶設定",
"AllowFfmpegThrottlingHelp": "當轉檔或重組進度大量超前目前播放進度時,將暫停轉檔節省消耗的資源。在不常跳播的時候最有效。如果遇到播放問題,請關閉此功能。",
"AllowFfmpegThrottling": "限制轉檔",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "這將會使用內建劇集資料。",
"PlaybackErrorNoCompatibleStream": "用戶端偵測出了問題,伺服器也未傳送相容的媒體格式。",
"PreferEmbeddedEpisodeInfosOverFileNames": "優先使用內建劇集資訊而不是檔案名稱"
}

View File

@ -382,7 +382,7 @@ a[data-role=button] {
.emby-checkbox:checked + span + .checkboxOutline {
background-color: #030322;
border: 2px solid rgb(72, 195, 200);
border: 0.14em solid rgb(72, 195, 200);
}
.emby-checkbox:checked + span + .checkboxOutline > .checkboxIcon-checked {
@ -394,7 +394,7 @@ a[data-role=button] {
}
.emby-checkbox:focus:not(:checked) + span + .checkboxOutline {
border: 2px solid #ff77f1;
border: 0.14em solid #ff77f1;
}
.itemProgressBarForeground {
@ -438,6 +438,15 @@ a[data-role=button] {
color: #f8f8fe;
}
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__outer-circle,
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__inner-circle {
color: #ff77f1;
}
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle {
background: #00a4dc;
}
.emby-tab-button {
color: #999;
}

View File

@ -6,12 +6,12 @@ const CopyPlugin = require("copy-webpack-plugin");
const Assets = [
"alameda/alameda.js",
"native-promise-only/npo.js",
"libass-wasm/dist/subtitles-octopus-worker.js",
"libass-wasm/dist/subtitles-octopus-worker.data",
"libass-wasm/dist/subtitles-octopus-worker.wasm",
"libass-wasm/dist/subtitles-octopus-worker-legacy.js",
"libass-wasm/dist/subtitles-octopus-worker-legacy.data",
"libass-wasm/dist/subtitles-octopus-worker-legacy.js.mem"
"libass-wasm/dist/js/subtitles-octopus-worker.js",
"libass-wasm/dist/js/subtitles-octopus-worker.data",
"libass-wasm/dist/js/subtitles-octopus-worker.wasm",
"libass-wasm/dist/js/subtitles-octopus-worker-legacy.js",
"libass-wasm/dist/js/subtitles-octopus-worker-legacy.data",
"libass-wasm/dist/js/subtitles-octopus-worker-legacy.js.mem"
];
module.exports = {

1117
yarn.lock

File diff suppressed because it is too large Load Diff