diff --git a/.github/workflows/__codeql.yml b/.github/workflows/__codeql.yml index a6151df9c..c001ec143 100644 --- a/.github/workflows/__codeql.yml +++ b/.github/workflows/__codeql.yml @@ -26,15 +26,15 @@ jobs: show-progress: false - name: Initialize CodeQL 🛠️ - uses: github/codeql-action/init@45775bd8235c68ba998cffa5171334d58593da47 # v3.28.15 + uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 with: queries: security-and-quality languages: ${{ matrix.language }} - name: Autobuild 📦 - uses: github/codeql-action/autobuild@45775bd8235c68ba998cffa5171334d58593da47 # v3.28.15 + uses: github/codeql-action/autobuild@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 - name: Perform CodeQL Analysis 🧪 - uses: github/codeql-action/analyze@45775bd8235c68ba998cffa5171334d58593da47 # v3.28.15 + uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/__deploy.yml b/.github/workflows/__deploy.yml index 655a872d1..82d6cfed0 100644 --- a/.github/workflows/__deploy.yml +++ b/.github/workflows/__deploy.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Download workflow artifact ⬇️ - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: ${{ inputs.artifact_name }} path: dist diff --git a/.github/workflows/__package.yml b/.github/workflows/__package.yml index b3af5861d..3be087499 100644 --- a/.github/workflows/__package.yml +++ b/.github/workflows/__package.yml @@ -19,7 +19,7 @@ jobs: ref: ${{ inputs.commit || github.sha }} - name: Setup node environment - uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 20 cache: npm diff --git a/.github/workflows/__quality_checks.yml b/.github/workflows/__quality_checks.yml index 5bc0c2e1b..42439c66e 100644 --- a/.github/workflows/__quality_checks.yml +++ b/.github/workflows/__quality_checks.yml @@ -20,7 +20,7 @@ jobs: show-progress: false - name: Scan - uses: actions/dependency-review-action@ce3cf9537a52e8119d91fd484ab5b8a807627bf8 # v4.6.0 + uses: actions/dependency-review-action@da24556b548a50705dd671f47852072ea4c105d9 # v4.7.1 with: ## Workaround from https://github.com/actions/dependency-review-action/issues/456 ## TODO: Remove when necessary @@ -48,7 +48,7 @@ jobs: show-progress: false - name: Setup node environment ⚙️ - uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 20 cache: npm diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index fe43dc99f..6a16a0930 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -85,7 +85,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Setup node environment - uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 20 cache: npm @@ -95,6 +95,6 @@ jobs: run: npm ci --no-audit - name: Run eslint - uses: CatChen/eslint-suggestion-action@82d525bf0c6a9ff5bdb6c5c5caee6b25971ac766 # v4.1.16 + uses: CatChen/eslint-suggestion-action@4dda35decf912ab18ea3e071acec2c6c2eda00b6 # v4.1.18 with: github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 0f89f2747..a7b330971 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -97,6 +97,10 @@ - [ItsAllAboutTheCode](https://github.com/ItsAllAboutTheCode) - [Jxiced](https://github.com/Jxiced) - [Derek Huber](https://github.com/Derek4aty1) +- [StableCrimson](https://github.com/StableCrimson) +- [diegoeche](https://github.com/diegoeche) +- [Free O'Toole](https://github.com/freeotoole) +- [TheBosZ](https://github.com/thebosz) ## Emby Contributors diff --git a/README.md b/README.md index f8fee50ee..4d054ac37 100644 --- a/README.md +++ b/README.md @@ -81,28 +81,29 @@ Jellyfin Web is the frontend used for most of the clients available for end user . └── src ├── apps - │   ├── dashboard # Admin dashboard app - │   ├── experimental # New experimental app - │   ├── stable # Classic (stable) app - │   └── wizard # Startup wizard app - ├── assets # Static assets - ├── components # Higher order visual components and React components - ├── constants # Common constant values - ├── controllers # Legacy page views and controllers 🧹 ❌ - ├── elements # Basic webcomponents and React equivalents 🧹 - ├── hooks # Custom React hooks - ├── lib # Reusable libraries - │   ├── globalize # Custom localization library - │   ├── legacy # Polyfills for legacy browsers - │   ├── navdrawer # Navigation drawer library for classic layout - │   └── scroller # Content scrolling library - ├── plugins # Client plugins (features dynamically loaded at runtime) - ├── scripts # Random assortment of visual components and utilities 🐉 ❌ - ├── strings # Translation files (only commit changes to en-us.json) - ├── styles # Common app Sass stylesheets - ├── themes # Sass and MUI themes - ├── types # Common TypeScript interfaces/types - └── utils # Utility functions + │   ├── dashboard # Admin dashboard app + │   ├── experimental # New experimental app + │   ├── stable # Classic (stable) app + │   └── wizard # Startup wizard app + ├── assets # Static assets + ├── components # Higher order visual components and React components + ├── constants # Common constant values + ├── controllers # Legacy page views and controllers 🧹 ❌ + ├── elements # Basic webcomponents and React equivalents 🧹 + ├── hooks # Custom React hooks + ├── lib # Reusable libraries + │   ├── globalize # Custom localization library + │   ├── jellyfin-apiclient # Supporting code for the deprecated apiclient package + │   ├── legacy # Polyfills for legacy browsers + │   ├── navdrawer # Navigation drawer library for classic layout + │   └── scroller # Content scrolling library + ├── plugins # Client plugins (features dynamically loaded at runtime) + ├── scripts # Random assortment of visual components and utilities 🐉 ❌ + ├── strings # Translation files (only commit changes to en-us.json) + ├── styles # Common app Sass stylesheets + ├── themes # Sass and MUI themes + ├── types # Common TypeScript interfaces/types + └── utils # Utility functions ``` - ❌ — Deprecated, do **not** create new files here diff --git a/eslint.config.mjs b/eslint.config.mjs index 9c0ff1326..90e3594c1 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -149,6 +149,11 @@ export default tseslint.config( message: 'Use direct file imports for tree-shaking', allowTypeImports: true }, + { + name: '@mui/icons-material', + message: 'Use direct file imports for tree-shaking', + allowTypeImports: true + }, { name: '@mui/material', message: 'Use direct file imports for tree-shaking', diff --git a/package-lock.json b/package-lock.json index 5ee27ba10..262f9c38f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,35 +11,36 @@ "dependencies": { "@emotion/react": "11.14.0", "@emotion/styled": "11.14.0", - "@fontsource/noto-sans": "5.2.6", - "@fontsource/noto-sans-hk": "5.2.5", - "@fontsource/noto-sans-jp": "5.2.5", - "@fontsource/noto-sans-kr": "5.2.5", - "@fontsource/noto-sans-sc": "5.2.5", - "@fontsource/noto-sans-tc": "5.2.5", + "@fontsource/noto-sans": "5.2.7", + "@fontsource/noto-sans-hk": "5.2.6", + "@fontsource/noto-sans-jp": "5.2.6", + "@fontsource/noto-sans-kr": "5.2.6", + "@fontsource/noto-sans-sc": "5.2.6", + "@fontsource/noto-sans-tc": "5.2.6", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202504130507", + "@jellyfin/sdk": "0.0.0-unstable.202507090504", "@jellyfin/ux-web": "1.0.0", - "@mui/icons-material": "6.4.10", - "@mui/material": "6.4.10", - "@mui/x-date-pickers": "7.28.3", + "@mui/icons-material": "6.4.12", + "@mui/material": "6.4.12", + "@mui/x-date-pickers": "7.29.4", "@react-hook/resize-observer": "2.0.2", - "@tanstack/react-query": "5.71.10", - "@tanstack/react-query-devtools": "5.71.10", + "@tanstack/react-query": "5.80.10", + "@tanstack/react-query-devtools": "5.80.10", "abortcontroller-polyfill": "1.7.8", "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.5.1", - "core-js": "3.41.0", + "core-js": "3.43.0", "date-fns": "2.30.0", "dompurify": "2.5.8", + "element-closest-polyfill": "1.0.7", "epubjs": "0.3.93", "escape-html": "1.0.3", "fast-text-encoding": "1.0.6", "flv.js": "1.6.2", "headroom.js": "0.12.0", "history": "5.3.0", - "hls.js": "1.6.1", + "hls.js": "1.6.5", "intersection-observer": "0.12.2", "jellyfin-apiclient": "1.11.0", "jquery": "3.7.1", @@ -52,40 +53,41 @@ "material-react-table": "3.2.1", "native-promise-only": "0.8.1", "pdfjs-dist": "3.11.174", + "proxy-polyfill": "0.3.2", "react": "18.3.1", "react-blurhash": "0.3.0", "react-dom": "18.3.1", "react-lazy-load-image-component": "1.6.3", - "react-router-dom": "6.30.0", + "react-router-dom": "6.30.1", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.6", - "swiper": "11.2.6", + "swiper": "11.2.8", "usehooks-ts": "3.1.1", "webcomponents.js": "0.7.24", "whatwg-fetch": "3.6.20" }, "devDependencies": { - "@babel/core": "7.26.10", - "@babel/plugin-transform-modules-umd": "7.25.9", - "@babel/preset-env": "7.26.9", - "@babel/preset-react": "7.26.3", - "@eslint-community/eslint-plugin-eslint-comments": "4.4.1", - "@eslint/js": "9.24.0", - "@stylistic/eslint-plugin": "4.2.0", - "@stylistic/stylelint-plugin": "3.1.2", + "@babel/core": "7.27.4", + "@babel/plugin-transform-modules-umd": "7.27.1", + "@babel/preset-env": "7.27.2", + "@babel/preset-react": "7.27.1", + "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", + "@eslint/js": "9.30.1", + "@stylistic/eslint-plugin": "4.4.1", + "@stylistic/stylelint-plugin": "3.1.3", "@types/dompurify": "3.0.5", "@types/escape-html": "1.0.4", "@types/loadable__component": "5.13.9", "@types/lodash-es": "4.17.12", "@types/markdown-it": "14.1.2", - "@types/react": "18.3.20", - "@types/react-dom": "18.3.6", + "@types/react": "18.3.23", + "@types/react-dom": "18.3.7", "@types/react-lazy-load-image-component": "1.6.4", "@types/sortablejs": "1.15.8", - "@typescript-eslint/parser": "8.29.0", + "@typescript-eslint/parser": "8.35.1", "@uupaa/dynamic-import-polyfill": "1.0.2", - "@vitest/coverage-v8": "3.1.1", + "@vitest/coverage-v8": "3.2.4", "autoprefixer": "10.4.21", "babel-loader": "10.0.0", "clean-webpack-plugin": "4.0.0", @@ -93,45 +95,45 @@ "copy-webpack-plugin": "13.0.0", "cross-env": "7.0.3", "css-loader": "7.1.2", - "cssnano": "7.0.6", - "es-check": "8.0.2", - "eslint": "9.24.0", + "cssnano": "7.0.7", + "es-check": "9.1.4", + "eslint": "9.30.1", "eslint-plugin-compat": "6.0.2", - "eslint-plugin-import": "2.31.0", + "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", - "eslint-plugin-sonarjs": "3.0.2", + "eslint-plugin-sonarjs": "3.0.4", "expose-loader": "5.0.1", "fast-glob": "3.3.3", "fork-ts-checker-webpack-plugin": "9.1.0", - "globals": "16.0.0", + "globals": "16.2.0", "html-loader": "5.1.0", "html-webpack-plugin": "5.6.3", - "jsdom": "26.0.0", + "jsdom": "26.1.0", "mini-css-extract-plugin": "2.9.2", - "postcss": "8.5.3", + "postcss": "8.5.6", "postcss-loader": "8.1.1", - "postcss-preset-env": "10.1.5", + "postcss-preset-env": "10.2.3", "postcss-scss": "4.0.9", - "sass": "1.86.3", + "sass": "1.89.2", "sass-loader": "16.0.5", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", "style-loader": "4.0.0", - "stylelint": "16.18.0", + "stylelint": "16.21.0", "stylelint-config-rational-order": "0.1.2", - "stylelint-no-browser-hacks": "1.3.0", - "stylelint-order": "6.0.4", - "stylelint-scss": "6.11.1", + "stylelint-no-browser-hacks": "2.0.0", + "stylelint-order": "7.0.0", + "stylelint-scss": "6.12.1", "ts-loader": "9.5.2", "typescript": "5.8.3", - "typescript-eslint": "8.29.0", - "vitest": "3.1.1", - "webpack": "5.98.0", + "typescript-eslint": "8.35.1", + "vitest": "3.2.4", + "webpack": "5.99.9", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.1", + "webpack-dev-server": "5.2.2", "webpack-merge": "6.0.1", "worker-loader": "3.0.8" }, @@ -141,7 +143,7 @@ "yarn": "YARN NO LONGER USED - use npm instead." }, "optionalDependencies": { - "sass-embedded": "1.86.3" + "sass-embedded": "1.89.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -189,23 +191,23 @@ "license": "ISC" }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "dev": true, "license": "MIT", "engines": { @@ -213,22 +215,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -251,13 +253,13 @@ "license": "MIT" }, "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -267,27 +269,27 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -312,18 +314,18 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", - "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.26.9", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "engines": { @@ -334,13 +336,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, @@ -369,42 +371,42 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -414,22 +416,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -437,15 +439,15 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -455,15 +457,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -473,41 +475,41 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -515,41 +517,41 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -559,14 +561,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -576,13 +578,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -592,13 +594,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -608,15 +610,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -626,14 +628,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -655,13 +657,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -671,13 +673,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -687,13 +689,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -719,13 +721,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -735,15 +737,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", - "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.26.8" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -753,15 +755,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -771,13 +773,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", - "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -787,13 +789,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", + "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -803,14 +805,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -820,14 +822,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -837,17 +839,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", "globals": "^11.1.0" }, "engines": { @@ -867,14 +869,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -884,13 +886,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -900,14 +902,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -917,13 +919,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -933,14 +935,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -950,13 +952,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -966,13 +968,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -982,13 +984,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -998,14 +1000,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", - "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1015,15 +1017,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1033,13 +1035,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1049,13 +1051,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1065,13 +1067,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1081,13 +1083,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1097,14 +1099,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1114,14 +1116,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1131,16 +1133,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1150,14 +1152,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1167,14 +1169,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1184,13 +1186,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1200,13 +1202,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.26.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", - "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1216,13 +1218,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1232,15 +1234,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", + "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.3", + "@babel/plugin-transform-parameters": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1250,14 +1253,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1267,13 +1270,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1283,14 +1286,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1300,13 +1303,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1316,14 +1319,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1333,15 +1336,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1351,13 +1354,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1367,13 +1370,13 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", - "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", + "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1383,17 +1386,17 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1403,13 +1406,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", - "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.9" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1419,14 +1422,14 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", - "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1436,14 +1439,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", + "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1453,14 +1455,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1470,13 +1472,13 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1486,13 +1488,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1502,14 +1504,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1519,13 +1521,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1535,13 +1537,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", - "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1551,13 +1553,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", - "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1567,13 +1569,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1583,14 +1585,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1600,14 +1602,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1617,14 +1619,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1634,75 +1636,75 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", - "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.26.8", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.26.5", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.26.3", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.26.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.26.8", - "@babel/plugin-transform-typeof-symbol": "^7.26.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.11.0", @@ -1732,18 +1734,18 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", - "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-react-display-name": "^7.25.9", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/plugin-transform-react-jsx-development": "^7.25.9", - "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1765,30 +1767,30 @@ } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", - "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1805,13 +1807,13 @@ } }, "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1828,9 +1830,9 @@ } }, "node_modules/@bufbuild/protobuf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.1.0.tgz", - "integrity": "sha512-+2Mx67Y3skJ4NCD/qNSdBJNWtu6x6Qr53jeNg+QcwiL6mt0wK+3jwHH2x1p7xaYH6Ve2JKOVn0OxU35WsmqI9A==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.5.2.tgz", + "integrity": "sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==", "license": "(Apache-2.0 AND BSD-3-Clause)", "optional": true }, @@ -1845,9 +1847,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", - "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", "dev": true, "funding": [ { @@ -1864,8 +1866,8 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/color-helpers": { @@ -1889,9 +1891,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", - "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "dev": true, "funding": [ { @@ -1908,14 +1910,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", - "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", + "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", "dev": true, "funding": [ { @@ -1930,20 +1932,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.2" + "@csstools/css-calc": "^2.1.4" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", - "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, "funding": [ { @@ -1960,13 +1962,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", - "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "dev": true, "funding": [ { @@ -2072,9 +2074,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.8.tgz", - "integrity": "sha512-9dUvP2qpZI6PlGQ/sob+95B3u5u7nkYt9yhZFCC7G9HBRHBxj+QxS/wUlwaMGYW0waf+NIierI8aoDTssEdRYw==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.10.tgz", + "integrity": "sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ==", "dev": true, "funding": [ { @@ -2088,10 +2090,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2102,9 +2104,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.8.tgz", - "integrity": "sha512-yuZpgWUzqZWQhEqfvtJufhl28DgO9sBwSbXbf/59gejNuvZcoUTRGQZhzhwF4ccqb53YAGB+u92z9+eSKoB4YA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.10.tgz", + "integrity": "sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q==", "dev": true, "funding": [ { @@ -2118,10 +2120,40 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.0.tgz", + "integrity": "sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2132,9 +2164,9 @@ } }, "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.4.tgz", - "integrity": "sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.6.tgz", + "integrity": "sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ==", "dev": true, "funding": [ { @@ -2148,9 +2180,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2161,9 +2193,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.7.tgz", - "integrity": "sha512-XTb6Mw0v2qXtQYRW9d9duAjDnoTbBpsngD7sRNLmYDjvwU2ebpIHplyxgOeo6jp/Kr52gkLi5VaK5RDCqzMzZQ==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", "dev": true, "funding": [ { @@ -2177,9 +2209,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -2216,9 +2248,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.8.tgz", - "integrity": "sha512-/K8u9ZyGMGPjmwCSIjgaOLKfic2RIGdFHHes84XW5LnmrvdhOTVxo255NppHi3ROEvoHPW7MplMJgjZK5Q+TxA==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.10.tgz", + "integrity": "sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg==", "dev": true, "funding": [ { @@ -2232,9 +2264,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -2244,9 +2276,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.8.tgz", - "integrity": "sha512-CoHQ/0UXrvxLovu0ZeW6c3/20hjJ/QRg6lyXm3dZLY/JgvRU6bdbQZF/Du30A4TvowfcgvIHQmP1bNXUxgDrAw==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.10.tgz", + "integrity": "sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw==", "dev": true, "funding": [ { @@ -2260,10 +2292,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2274,9 +2306,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.8.tgz", - "integrity": "sha512-LpFKjX6hblpeqyych1cKmk+3FJZ19QmaJtqincySoMkbkG/w2tfbnO5oE6mlnCTXcGUJ0rCEuRHvTqKK0nHYUQ==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.10.tgz", + "integrity": "sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ==", "dev": true, "funding": [ { @@ -2290,10 +2322,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2304,9 +2336,9 @@ } }, "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.0.tgz", - "integrity": "sha512-9QT5TDGgx7wD3EEMN3BSUG6ckb6Eh5gSPT5kZoVtUuAonfPmLDJyPhqR4ntPpMYhUKAMVKAg3I/AgzqHMSeLhA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.2.tgz", + "integrity": "sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA==", "dev": true, "funding": [ { @@ -2320,7 +2352,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -2355,9 +2387,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", - "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", "dev": true, "funding": [ { @@ -2419,9 +2451,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.7.tgz", - "integrity": "sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.9.tgz", + "integrity": "sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ==", "dev": true, "funding": [ { @@ -2435,9 +2467,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2543,9 +2575,9 @@ } }, "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", - "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", "dev": true, "funding": [ { @@ -2559,7 +2591,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-tokenizer": "^3.0.3", + "@csstools/css-tokenizer": "^3.0.4", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2570,9 +2602,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.7.tgz", - "integrity": "sha512-LB6tIP7iBZb5CYv8iRenfBZmbaG3DWNEziOnPjGoQX5P94FBPvvTBy68b/d9NnS5PELKwFmmOYsAEIgEhDPCHA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", "dev": true, "funding": [ { @@ -2586,10 +2618,10 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "engines": { "node": ">=18" @@ -2599,9 +2631,9 @@ } }, "node_modules/@csstools/postcss-media-minmax/node_modules/@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "funding": [ { @@ -2618,14 +2650,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", - "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", "dev": true, "funding": [ { @@ -2639,9 +2671,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "engines": { "node": ">=18" @@ -2651,9 +2683,9 @@ } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values/node_modules/@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "funding": [ { @@ -2670,8 +2702,8 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/postcss-nested-calc": { @@ -2728,9 +2760,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.8.tgz", - "integrity": "sha512-+5aPsNWgxohXoYNS1f+Ys0x3Qnfehgygv3qrPyv+Y25G0yX54/WlVB+IXprqBLOXHM1gsVF+QQSjlArhygna0Q==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz", + "integrity": "sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg==", "dev": true, "funding": [ { @@ -2744,10 +2776,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2758,9 +2790,9 @@ } }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.0.tgz", - "integrity": "sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz", + "integrity": "sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA==", "dev": true, "funding": [ { @@ -2784,9 +2816,9 @@ } }, "node_modules/@csstools/postcss-random-function": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.3.tgz", - "integrity": "sha512-dbNeEEPHxAwfQJ3duRL5IPpuD77QAHtRl4bAHRs0vOVhVbHrsL7mHnwe0irYjbs9kYwhAHZBQTLBgmvufPuRkA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", "dev": true, "funding": [ { @@ -2800,9 +2832,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -2812,9 +2844,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.8.tgz", - "integrity": "sha512-eGE31oLnJDoUysDdjS9MLxNZdtqqSxjDXMdISpLh80QMaYrKs7VINpid34tWQ+iU23Wg5x76qAzf1Q/SLLbZVg==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.10.tgz", + "integrity": "sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g==", "dev": true, "funding": [ { @@ -2828,10 +2860,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2882,9 +2914,9 @@ } }, "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.2.tgz", - "integrity": "sha512-4EcAvXTUPh7n6UoZZkCzgtCf/wPzMlTNuddcKg7HG8ozfQkUcHsJ2faQKeLmjyKdYPyOUn4YA7yDPf8K/jfIxw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", "dev": true, "funding": [ { @@ -2898,9 +2930,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -2910,9 +2942,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.7.tgz", - "integrity": "sha512-rdrRCKRnWtj5FyRin0u/gLla7CIvZRw/zMGI1fVJP0Sg/m1WGicjPVHRANL++3HQtsiXKAbPrcPr+VkyGck0IA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", "dev": true, "funding": [ { @@ -2926,9 +2958,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -2965,9 +2997,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.7.tgz", - "integrity": "sha512-qTrZgLju3AV7Djhzuh2Bq/wjFqbcypnk0FhHjxW8DWJQcZLS1HecIus4X2/RLch1ukX7b+YYCdqbEnpIQO5ccg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", "dev": true, "funding": [ { @@ -2981,9 +3013,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { "node": ">=18" @@ -3652,9 +3684,9 @@ } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.4.1.tgz", - "integrity": "sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.5.0.tgz", + "integrity": "sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==", "dev": true, "license": "MIT", "dependencies": { @@ -3685,16 +3717,20 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } @@ -3710,9 +3746,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3725,9 +3761,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", - "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3735,9 +3771,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3850,13 +3886,16 @@ } }, "node_modules/@eslint/js": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", - "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "version": "9.30.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz", + "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { @@ -3870,13 +3909,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", - "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.12.0", + "@eslint/core": "^0.14.0", "levn": "^0.4.1" }, "engines": { @@ -3884,54 +3923,54 @@ } }, "node_modules/@fontsource/noto-sans": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-5.2.6.tgz", - "integrity": "sha512-46D39T1/QJ16LSbCTaNjjrGS6Y69FMLS9FeHKsrXSQg15Z2MFqmlnNMpURx2l6Sr3x9t9EVdr3CAkHnZyvea+w==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-5.2.7.tgz", + "integrity": "sha512-mTpMSMft6Nb+ZSF4DSiJVYnLzKCRjHNFieZ/swuxSDQK+v1hjUeDTBxLHKUdfmC+ZPg6TUEWw4oRq2ltnDbSjQ==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/noto-sans-hk": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-5.2.5.tgz", - "integrity": "sha512-dQK+2kLRChvlbvsXadnvfjBy1+hQojKu/zobeLiKXquFWJis9CdwNIaxTFa4Khwsq8HzR9JzxGb6L1tSK6JWYw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-5.2.6.tgz", + "integrity": "sha512-EF7rFuy8jPthjDK8ciFRdVseAs01B93zeE74m/O6F71p9UdIlE9AbtPaMfNHzvnTixYcnHbcxQzx72lSpwvrPg==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/noto-sans-jp": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.2.5.tgz", - "integrity": "sha512-ISoJUQlsuSo4y56P+eJD+g022BRAF1BC2uCyEFGRsob0g8VvQAoWNMlWh+P0VQw68QzZHHj41zRzeRFpzAdA7w==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.2.6.tgz", + "integrity": "sha512-BvUHYZKL87yWGRNFqInxDciU/Czp6klOEcB9l/6CnjMN77F5jc21r/A4XkMx46eY8FzVvfjCYTYUB4zExlX2Ww==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/noto-sans-kr": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-5.2.5.tgz", - "integrity": "sha512-9swPyua410J00z+GhemPKK/StWdiW07dchS9JcskesdQrhnPBLD6zVQtQsrj+ZPXTFBftbcrMlWFsWhmFn6S9w==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-5.2.6.tgz", + "integrity": "sha512-8yVWUzOT+El3PAqY8ZKvNatgzL7EgrvLoNp0GjYSLkgDKvvX+xaIZ34W8gfATjeXKmolj9lQN4TqADfPlbmUsg==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/noto-sans-sc": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-5.2.5.tgz", - "integrity": "sha512-rYAl3Alcjo2PnI0sqzRfnA022H8yWePNrjYalApQwYE+fFlaXmD6Mm3E9wmJCpmJM8clwhQWq/E8IlPl1bmZHQ==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-5.2.6.tgz", + "integrity": "sha512-hk0xVQ+mL/W0rXDhBhud2U5te/slsQKcaU+3Ni6ZxeFP1jJmcNmxHEZOG5DjLBOi0L//0R5Nwvn6ebTiZrwVZw==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/noto-sans-tc": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-5.2.5.tgz", - "integrity": "sha512-+qQKW1slXsS5H5AvsiBfNo7krmuxyKkb6vV2l/nE7Uyd5TBpaomub+kuIO3iwgLBtVOesSkl6HwtR4SNxry+FA==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-5.2.6.tgz", + "integrity": "sha512-cXpi78o0adtqz/7/3Onpp2u/O8G2XC4WufuT8EQjEu2Mvdq2WRgLZk/KOrhh7kH/3BSijbKnYUwQ5mTEvaSF5A==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" @@ -4090,9 +4129,9 @@ "license": "LGPL-2.1-or-later AND (FTL OR GPL-2.0-or-later) AND MIT AND MIT-Modern-Variant AND ISC AND NTP AND Zlib AND BSL-1.0" }, "node_modules/@jellyfin/sdk": { - "version": "0.0.0-unstable.202504130507", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202504130507.tgz", - "integrity": "sha512-22acZbqDyAfjIJbKtEwEm+Sc/A1DKpP45tiz+Mx4iHDm4SBGGKRrIbJg2/2WDT7CUYQjoZAFTig7vr9trytPfA==", + "version": "0.0.0-unstable.202507090504", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202507090504.tgz", + "integrity": "sha512-znwTsY9+gyJDPmwFOET+rtZQ1QryziG6LFhGXPXPF1ltJspV4Ixk70ST1t925vvtXdpqoGqMu92OZWOqkiNLbg==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.3.4" @@ -4329,9 +4368,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.10.tgz", - "integrity": "sha512-cblGjlM6+xsptwyaALw8RbRIUoqmKxOqLxlk2LkTDhxqUuql1YSOKKLH3w+Yd2QLz28b7MR65sx1OjsRZUfOSQ==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.12.tgz", + "integrity": "sha512-M7IkG4LqSJfkY+thlQQHNkcS5NdmMDwLq/2RKoW40XR0mv/2BYb6X8fRnyaxP4zGdPD2M4MQdbzKihSVormJ7Q==", "license": "MIT", "funding": { "type": "opencollective", @@ -4339,9 +4378,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.10.tgz", - "integrity": "sha512-c2KdFl4KZ0QYC+JSDTMCNjcuOL2rVSdIx/beo7FwJDh2e9XqC1MoLCjw6L1Jo40zbArkgJyg3oFORbXcRfgZOA==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.12.tgz", + "integrity": "sha512-ILTe3A2te0+Vb9TG4P1AZVmZFOjDDCV/b2nBmV1rNOmSu3Q/xkHghW+yMhMffwHcXklMlcajMlc4iFSkPbrTKw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0" @@ -4354,7 +4393,7 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^6.4.10", + "@mui/material": "^6.4.12", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -4365,14 +4404,14 @@ } }, "node_modules/@mui/material": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.10.tgz", - "integrity": "sha512-L1B0+Vg9NFjo3NcfODH3bohl6fIkzjyDBHBHb3Al4QI7owaJrFm2sSDyfz++iatzICug6U6q5tHLQrCLO71xkg==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.12.tgz", + "integrity": "sha512-VqoLNS5UaNqoS1FybezZR/PaAvzbTmRe0Mx//afXbolIah43eozpX2FckaFffLvMoiSIyxx1+AMHyENTr2Es0Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/core-downloads-tracker": "^6.4.10", - "@mui/system": "^6.4.10", + "@mui/core-downloads-tracker": "^6.4.12", + "@mui/system": "^6.4.12", "@mui/types": "~7.2.24", "@mui/utils": "^6.4.9", "@popperjs/core": "^2.11.8", @@ -4393,7 +4432,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.4.10", + "@mui/material-pigment-css": "^6.4.12", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4447,9 +4486,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.9.tgz", - "integrity": "sha512-qZRWO0cT407NI4ZRjZcH+1SOu8f3JzLHqdMlg52GyEufM9pkSZFnf7xjpwnlvkixcGjco6wLlMD0VB43KRcBuA==", + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.11.tgz", + "integrity": "sha512-74AUmlHXaGNbyUqdK/+NwDJOZqgRQw6BcNvhoWYLq3LGbLTkE+khaJ7soz6cIabE4CPYqO2/QAIU1Z/HEjjpcw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", @@ -4481,14 +4520,14 @@ } }, "node_modules/@mui/system": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.10.tgz", - "integrity": "sha512-RyBGQwP3tgo4JEibK+RwVu1a6nQ6y8urMCNsb2aiN/nvTxxumq6P26aoG4GTUf8L4O1sthC4lMXlP4r8ixDkMg==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.12.tgz", + "integrity": "sha512-fgEfm1qxpKCztndESeL1L0sLwA2c7josZ2w42D8OM3pbLee4bH2twEjoMo6qf7z2rNw1Uc9EU9haXeMoq0oTdQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", "@mui/private-theming": "^6.4.9", - "@mui/styled-engine": "^6.4.9", + "@mui/styled-engine": "^6.4.11", "@mui/types": "~7.2.24", "@mui/utils": "^6.4.9", "clsx": "^2.1.1", @@ -4571,14 +4610,14 @@ "license": "MIT" }, "node_modules/@mui/x-date-pickers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.28.3.tgz", - "integrity": "sha512-5umKB/DIMfDN+FAlzcrocix9PpoJDJ+5hMdlby8spTPObP4wCSN+wkEhk0vFC7qE9FAWXr4wjemaKvsNf41cCw==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.29.4.tgz", + "integrity": "sha512-wJ3tsqk/y6dp+mXGtT9czciAMEO5Zr3IIAHg9x6IL0Eqanqy0N3chbmQQZv3iq0m2qUpQDLvZ4utZBUTJdjNzw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", - "@mui/x-internals": "7.28.0", + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0", + "@mui/x-internals": "7.29.0", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -4594,8 +4633,8 @@ "peerDependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", - "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", + "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0", + "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0", "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0", "dayjs": "^1.10.7", @@ -4637,13 +4676,13 @@ } }, "node_modules/@mui/x-internals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.28.0.tgz", - "integrity": "sha512-p4GEp/09bLDumktdIMiw+OF4p+pJOOjTG0VUvzNxjbHB9GxbBKoMcHrmyrURqoBnQpWIeFnN/QAoLMFSpfwQbw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.29.0.tgz", + "integrity": "sha512-+Gk6VTZIFD70XreWvdXBwKd8GZ2FlSCuecQFzm6znwqXg1ZsndavrhG9tkxpxo2fM1Zf7Tk8+HcOO0hCbhTQFA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta" + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0" }, "engines": { "node": ">=14.0.0" @@ -5057,247 +5096,280 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", + "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", + "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", + "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", + "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", + "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", + "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", + "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", + "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", + "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", + "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", + "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", + "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", + "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", + "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -5311,13 +5383,13 @@ "license": "MIT" }, "node_modules/@stylistic/eslint-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.2.0.tgz", - "integrity": "sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.4.1.tgz", + "integrity": "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.23.0", + "@typescript-eslint/utils": "^8.32.1", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "estraverse": "^5.3.0", @@ -5331,9 +5403,9 @@ } }, "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5367,9 +5439,9 @@ } }, "node_modules/@stylistic/stylelint-plugin": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.2.tgz", - "integrity": "sha512-tylFJGMQo62alGazK74MNxFjMagYOHmBZiePZFOJK2n13JZta0uVkB3Bh5qodUmOLtRH+uxH297EibK14UKm8g==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.3.tgz", + "integrity": "sha512-85fsmzgsIVmyG3/GFrjuYj6Cz8rAM7IZiPiXCMiSMfoDOC1lOrzrXPDk24WqviAghnPqGpx8b0caK2PuewWGFg==", "dev": true, "license": "MIT", "dependencies": { @@ -5377,10 +5449,10 @@ "@csstools/css-tokenizer": "^3.0.1", "@csstools/media-query-list-parser": "^3.0.1", "is-plain-object": "^5.0.0", + "postcss": "^8.4.41", "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0", - "style-search": "^0.1.0", - "stylelint": "^16.8.2" + "style-search": "^0.1.0" }, "engines": { "node": "^18.12 || >=20.9" @@ -5416,9 +5488,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.71.10", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.71.10.tgz", - "integrity": "sha512-/fKEY8fO1nbszfrBatzmhJa1nEwIKn0c6Tv2A1ocSA5OiD2GukOIV8nnBbvJRgZb/VIoBy9/N4PVbABI8YQLow==", + "version": "5.80.10", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.10.tgz", + "integrity": "sha512-mUNQOtzxkjL6jLbyChZoSBP6A5gQDVRUiPvW+/zw/9ftOAz+H754zCj3D8PwnzPKyHzGkQ9JbH48ukhym9LK1Q==", "license": "MIT", "funding": { "type": "github", @@ -5426,9 +5498,9 @@ } }, "node_modules/@tanstack/query-devtools": { - "version": "5.71.5", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.71.5.tgz", - "integrity": "sha512-Fq1JeAp+I52Md/KnyeFxzG7G0RpdHgeOfDNhSPkZQs/JqqXuAfpUf+wFHDz+vP0GZbSnla2JmcLSQebOkIb1yA==", + "version": "5.80.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.80.0.tgz", + "integrity": "sha512-D6gH4asyjaoXrCOt5vG5Og/YSj0D/TxwNQgtLJIgWbhbWCC/emu2E92EFoVHh4ppVWg1qT2gKHvKyQBEFZhCuA==", "license": "MIT", "funding": { "type": "github", @@ -5436,12 +5508,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.71.10", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.71.10.tgz", - "integrity": "sha512-mQYM/ObpL8YMDz8vCoUuHkbe8Yu7NnVRH8aBaBa/3zlufjp1f1VuWjeO3TcumNHfuVMDwEAGinsgwrB7OKADiQ==", + "version": "5.80.10", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.80.10.tgz", + "integrity": "sha512-6zM098J8sLy9oU60XAdzUlAH4wVzoMVsWUWiiE/Iz4fd67PplxeyL4sw/MPcVJJVhbwGGXCsHn9GrQt2mlAzig==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.71.10" + "@tanstack/query-core": "5.80.10" }, "funding": { "type": "github", @@ -5452,19 +5524,19 @@ } }, "node_modules/@tanstack/react-query-devtools": { - "version": "5.71.10", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.71.10.tgz", - "integrity": "sha512-n0xsIzwNvkIoZCmfHww28jFmnVTVzOt5dHj/py3LNFMJHGnJq9o9ttQESzVt2Hr7as00Aqf8ElVwH6na1o6dnw==", + "version": "5.80.10", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.80.10.tgz", + "integrity": "sha512-6JL63fSc7kxyGOLV2w466SxhMn/m7LZk/ximQciy6OpVt+n2A8Mq3S0QwhIzfm4WEwLK/F3OELfzRToQburnYA==", "license": "MIT", "dependencies": { - "@tanstack/query-devtools": "5.71.5" + "@tanstack/query-devtools": "5.80.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.71.10", + "@tanstack/react-query": "^5.80.10", "react": "^18 || ^19" } }, @@ -5558,6 +5630,16 @@ "@types/node": "*" } }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -5578,6 +5660,13 @@ "@types/node": "*" } }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/dompurify": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", @@ -5616,9 +5705,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, "license": "MIT" }, @@ -5744,15 +5833,6 @@ "@types/mdurl": "^2" } }, - "node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2" - } - }, "node_modules/@types/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", @@ -5773,12 +5853,6 @@ "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", "dev": true }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, "node_modules/@types/node": { "version": "20.11.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.4.tgz", @@ -5798,12 +5872,6 @@ "@types/node": "*" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -5828,9 +5896,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.3.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", - "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", + "version": "18.3.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", + "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -5838,9 +5906,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", - "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -5974,21 +6042,21 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz", - "integrity": "sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", + "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.29.0", - "@typescript-eslint/type-utils": "8.29.0", - "@typescript-eslint/utils": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/type-utils": "8.35.1", + "@typescript-eslint/utils": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5998,22 +6066,32 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "@typescript-eslint/parser": "^8.35.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz", - "integrity": "sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", + "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.29.0", - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/typescript-estree": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/typescript-estree": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "debug": "^4.3.4" }, "engines": { @@ -6028,15 +6106,37 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz", - "integrity": "sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", + "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0" + "@typescript-eslint/tsconfig-utils": "^8.35.1", + "@typescript-eslint/types": "^8.35.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", + "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6046,17 +6146,34 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", + "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz", - "integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", + "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.29.0", - "@typescript-eslint/utils": "8.29.0", + "@typescript-eslint/typescript-estree": "8.35.1", + "@typescript-eslint/utils": "8.35.1", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6071,9 +6188,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", - "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", + "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", "dev": true, "license": "MIT", "engines": { @@ -6085,20 +6202,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz", - "integrity": "sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", + "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0", + "@typescript-eslint/project-service": "8.35.1", + "@typescript-eslint/tsconfig-utils": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6112,9 +6231,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6138,9 +6257,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -6151,16 +6270,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz", - "integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", + "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.29.0", - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/typescript-estree": "8.29.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/typescript-estree": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6175,14 +6294,14 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz", - "integrity": "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", + "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.0", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.35.1", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6193,9 +6312,9 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -6212,22 +6331,23 @@ "dev": true }, "node_modules/@vitest/coverage-v8": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.1.tgz", - "integrity": "sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", - "debug": "^4.4.0", + "ast-v8-to-istanbul": "^0.3.3", + "debug": "^4.4.1", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.1.7", "magic-string": "^0.30.17", "magicast": "^0.3.5", - "std-env": "^3.8.1", + "std-env": "^3.9.0", "test-exclude": "^7.0.1", "tinyrainbow": "^2.0.0" }, @@ -6235,8 +6355,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.1.1", - "vitest": "3.1.1" + "@vitest/browser": "3.2.4", + "vitest": "3.2.4" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -6245,14 +6365,15 @@ } }, "node_modules/@vitest/expect": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.1.tgz", - "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -6261,13 +6382,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.1.tgz", - "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.1.1", + "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -6276,7 +6397,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -6288,9 +6409,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", - "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -6301,27 +6422,28 @@ } }, "node_modules/@vitest/runner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.1.tgz", - "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.1.1", - "pathe": "^2.0.3" + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.1.tgz", - "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.1.1", + "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -6330,27 +6452,27 @@ } }, "node_modules/@vitest/spy": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.1.tgz", - "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^3.0.2" + "tinyspy": "^4.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz", - "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.1.1", - "loupe": "^3.1.3", + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" }, "funding": { @@ -6614,9 +6736,9 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { @@ -6859,18 +6981,20 @@ } }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6930,18 +7054,19 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6951,15 +7076,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7069,6 +7195,25 @@ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.3.tgz", + "integrity": "sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -7087,7 +7232,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "peer": true }, "node_modules/atob": { "version": "2.1.2", @@ -7720,9 +7866,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "dev": true, "funding": [ { @@ -7740,10 +7886,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -7858,20 +8004,20 @@ } }, "node_modules/cacheable": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.9.tgz", - "integrity": "sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.0.tgz", + "integrity": "sha512-SSgQTAnhd7WlJXnGlIi4jJJOiHzgnM5wRMEPaXAU4kECTAMpBoYKoZ9i5zHmclIEZbxcu3j7yY/CF8DTmwIsHg==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.7.1", - "keyv": "^5.3.1" + "hookified": "^1.8.2", + "keyv": "^5.3.3" } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.2.tgz", - "integrity": "sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.3.tgz", + "integrity": "sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7989,16 +8135,10 @@ "lodash.uniq": "^4.5.0" } }, - "node_modules/caniuse-db": { - "version": "1.0.30001207", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001207.tgz", - "integrity": "sha512-vt1Y05aLuFE2CStt1+SHmZEJmOtf/Yn14lYhVbTGcqunHoNIspC1g6ybchbh1v6djHwQHzJpuPCsRdjaynLUKw==", - "dev": true - }, "node_modules/caniuse-lite": { - "version": "1.0.30001706", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz", - "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==", + "version": "1.0.30001726", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", "dev": true, "funding": [ { @@ -8254,18 +8394,6 @@ "node": ">=6" } }, - "node_modules/clone-regexp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", - "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", - "dev": true, - "dependencies": { - "is-regexp": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -8376,6 +8504,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "peer": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -8590,9 +8719,9 @@ } }, "node_modules/core-js": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", - "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz", + "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -8927,6 +9056,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -8948,9 +9078,9 @@ } }, "node_modules/cssdb": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.3.tgz", - "integrity": "sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.0.tgz", + "integrity": "sha512-c7bmItIg38DgGjSwDPZOYF/2o0QU/sSgkWOMyl8votOfgFuyiFKWPesmCGEsrGLxEA9uL540cp8LdaGEjUGsZQ==", "dev": true, "funding": [ { @@ -8977,14 +9107,14 @@ } }, "node_modules/cssnano": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", - "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.7.tgz", + "integrity": "sha512-evKu7yiDIF7oS+EIpwFlMF730ijRyLFaM2o5cTxRGJR9OKHKkc+qP443ZEVR9kZG0syaAJJCPJyfv5pbrxlSng==", "dev": true, "license": "MIT", "dependencies": { - "cssnano-preset-default": "^7.0.6", - "lilconfig": "^3.1.2" + "cssnano-preset-default": "^7.0.7", + "lilconfig": "^3.1.3" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -8994,65 +9124,65 @@ "url": "https://opencollective.com/cssnano" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/cssnano-preset-default": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", - "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.7.tgz", + "integrity": "sha512-jW6CG/7PNB6MufOrlovs1TvBTEVmhY45yz+bd0h6nw3h6d+1e+/TX+0fflZ+LzvZombbT5f+KC063w9VoHeHow==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.0", - "postcss-calc": "^10.0.2", - "postcss-colormin": "^7.0.2", - "postcss-convert-values": "^7.0.4", - "postcss-discard-comments": "^7.0.3", - "postcss-discard-duplicates": "^7.0.1", - "postcss-discard-empty": "^7.0.0", - "postcss-discard-overridden": "^7.0.0", - "postcss-merge-longhand": "^7.0.4", - "postcss-merge-rules": "^7.0.4", - "postcss-minify-font-values": "^7.0.0", - "postcss-minify-gradients": "^7.0.0", - "postcss-minify-params": "^7.0.2", - "postcss-minify-selectors": "^7.0.4", - "postcss-normalize-charset": "^7.0.0", - "postcss-normalize-display-values": "^7.0.0", - "postcss-normalize-positions": "^7.0.0", - "postcss-normalize-repeat-style": "^7.0.0", - "postcss-normalize-string": "^7.0.0", - "postcss-normalize-timing-functions": "^7.0.0", - "postcss-normalize-unicode": "^7.0.2", - "postcss-normalize-url": "^7.0.0", - "postcss-normalize-whitespace": "^7.0.0", - "postcss-ordered-values": "^7.0.1", - "postcss-reduce-initial": "^7.0.2", - "postcss-reduce-transforms": "^7.0.0", - "postcss-svgo": "^7.0.1", - "postcss-unique-selectors": "^7.0.3" + "cssnano-utils": "^5.0.1", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^7.0.3", + "postcss-convert-values": "^7.0.5", + "postcss-discard-comments": "^7.0.4", + "postcss-discard-duplicates": "^7.0.2", + "postcss-discard-empty": "^7.0.1", + "postcss-discard-overridden": "^7.0.1", + "postcss-merge-longhand": "^7.0.5", + "postcss-merge-rules": "^7.0.5", + "postcss-minify-font-values": "^7.0.1", + "postcss-minify-gradients": "^7.0.1", + "postcss-minify-params": "^7.0.3", + "postcss-minify-selectors": "^7.0.5", + "postcss-normalize-charset": "^7.0.1", + "postcss-normalize-display-values": "^7.0.1", + "postcss-normalize-positions": "^7.0.1", + "postcss-normalize-repeat-style": "^7.0.1", + "postcss-normalize-string": "^7.0.1", + "postcss-normalize-timing-functions": "^7.0.1", + "postcss-normalize-unicode": "^7.0.3", + "postcss-normalize-url": "^7.0.1", + "postcss-normalize-whitespace": "^7.0.1", + "postcss-ordered-values": "^7.0.2", + "postcss-reduce-initial": "^7.0.3", + "postcss-reduce-transforms": "^7.0.1", + "postcss-svgo": "^7.0.2", + "postcss-unique-selectors": "^7.0.4" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/cssnano-utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", - "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", + "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/csso": { @@ -9226,9 +9356,9 @@ "dev": true }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9274,10 +9404,11 @@ } }, "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "dev": true, + "license": "MIT" }, "node_modules/decode-uri-component": { "version": "0.2.2", @@ -9492,6 +9623,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "peer": true, "engines": { "node": ">=0.4.0" } @@ -9709,12 +9841,17 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.102", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", - "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==", + "version": "1.5.176", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.176.tgz", + "integrity": "sha512-2nDK9orkm7M9ZZkjO3PjbEd3VUulQLyg5T9O3enJdFvUg46Hzd4DUvTvAuEgbdHYXyFsiG4A5sO9IzToMH1cDg==", "dev": true, "license": "ISC" }, + "node_modules/element-closest-polyfill": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/element-closest-polyfill/-/element-closest-polyfill-1.0.7.tgz", + "integrity": "sha512-SX7RrUUEybUllkGjVf5XJR5I0Fl2L0iawK/caX/yJu94xW/WoRRD8Fky65gKpvqhU9PLBKOliIy4Ly2rDRzdUQ==" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9829,9 +9966,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "license": "MIT", "dependencies": { @@ -9839,18 +9976,18 @@ "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -9862,21 +9999,24 @@ "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", + "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", + "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -9885,7 +10025,7 @@ "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -9895,16 +10035,19 @@ } }, "node_modules/es-check": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/es-check/-/es-check-8.0.2.tgz", - "integrity": "sha512-m/8jzwE6rasRx+Lhz7J5OIZzt2LmEC53kBPkUqQHk/6BMjo77HoHsdoQKeps8mgLASlb8nRuKZnuRai/iZHrHg==", + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/es-check/-/es-check-9.1.4.tgz", + "integrity": "sha512-oCElzPyMZTm7IpCbdBslOjPdpI3uoccctPVTJLJyi34k+nXSaqApMAfm0yleEKTyPGXkmtWwPFBSyN22cKUhJw==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "8.14.0", + "acorn": "8.14.1", "acorn-walk": "^8.3.4", - "commander": "13.1.0", + "browserslist": "^4.23.3", + "commander": "14.0.0", "fast-glob": "^3.3.3", + "lilconfig": "^3.1.3", + "source-map": "^0.7.4", "supports-color": "8.1.1", "winston": "3.17.0" }, @@ -9916,13 +10059,13 @@ } }, "node_modules/es-check/node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/es-check/node_modules/has-flag": { @@ -9935,6 +10078,16 @@ "node": ">=8" } }, + "node_modules/es-check/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, "node_modules/es-check/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -9997,9 +10150,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, @@ -10031,12 +10184,16 @@ } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { @@ -10157,20 +10314,20 @@ } }, "node_modules/eslint": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", - "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", + "version": "9.30.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz", + "integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.24.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.30.1", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -10181,9 +10338,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -10255,9 +10412,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { @@ -10396,29 +10553,30 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, + "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { @@ -10550,9 +10708,9 @@ } }, "node_modules/eslint-plugin-sonarjs": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.2.tgz", - "integrity": "sha512-LxjbfwI7ypENeTmGyKmDyNux3COSkMi7H/6Cal5StSLQ6edf0naP45SZR43OclaNR7WfhVTZdhOn63q3/Y6puQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.4.tgz", + "integrity": "sha512-ftQcP811kRJNXapqpQXHErEoVOdTPfYPPYd7n3AExIPwv4qWKKHf4slFvXmodiOnfgy1Tl3waPZZLD7lcvJOtw==", "dev": true, "license": "LGPL-3.0-only", "dependencies": { @@ -10561,19 +10719,20 @@ "bytes": "3.1.2", "functional-red-black-tree": "1.0.1", "jsx-ast-utils": "3.3.5", + "lodash.merge": "4.6.2", "minimatch": "9.0.5", "scslre": "0.3.0", - "semver": "7.7.1", - "typescript": "^5" + "semver": "7.7.2", + "typescript": ">=5" }, "peerDependencies": { "eslint": "^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-sonarjs/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10607,9 +10766,9 @@ } }, "node_modules/eslint-plugin-sonarjs/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -10728,9 +10887,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10745,9 +10904,9 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10767,19 +10926,6 @@ "node": ">=4.0" } }, - "node_modules/eslint/node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -10797,20 +10943,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -10903,15 +11035,15 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10920,10 +11052,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -11049,18 +11194,6 @@ "node": ">=0.8.x" } }, - "node_modules/execall": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", - "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", - "dev": true, - "dependencies": { - "clone-regexp": "^2.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -11465,15 +11598,16 @@ "license": "MIT" }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -11563,32 +11697,17 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/flatted": { @@ -11598,13 +11717,6 @@ "dev": true, "license": "ISC" }, - "node_modules/flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", - "dev": true - }, "node_modules/flv.js": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/flv.js/-/flv.js-1.6.2.tgz", @@ -11640,13 +11752,19 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/for-in": { @@ -11986,6 +12104,7 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "license": "MIT", + "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -12160,12 +12279,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gather-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", - "integrity": "sha1-szmUr0V6gRVwDUEPMXczy+egkEs=", - "dev": true - }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -12234,18 +12347,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -12359,9 +12460,9 @@ } }, "node_modules/globals": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", - "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true, "license": "MIT", "engines": { @@ -12479,36 +12580,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -12705,9 +12776,9 @@ } }, "node_modules/hls.js": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.1.tgz", - "integrity": "sha512-7GOkcqn0Y9EqU2OJZlzkwxj9Uynuln7URvr7dRjgqNJNZ5UbbjL/v1BjAvQogy57Psdd/ek1u2s6IDEFYlabrA==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.5.tgz", + "integrity": "sha512-KMn5n7JBK+olC342740hDPHnGWfE8FiHtGMOdJPfUjRdARTWj9OB+8c13fnsf9sk1VtpuU2fKSgUjHvg4rNbzQ==", "license": "Apache-2.0" }, "node_modules/hoist-non-react-statics": { @@ -12719,9 +12790,9 @@ } }, "node_modules/hookified": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.8.1.tgz", - "integrity": "sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.9.1.tgz", + "integrity": "sha512-u3pxtGhKjcSXnGm1CX6aXS9xew535j3lkOCegbA6jdyh0BaAjTbXI4aslKstCr6zUNtoCxFGFKwjbSHdGrMB8g==", "dev": true, "license": "MIT" }, @@ -13039,9 +13110,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13179,15 +13250,6 @@ "node": ">=4" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -13282,15 +13344,6 @@ "node": ">= 10" } }, - "node_modules/irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -13478,9 +13531,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -13731,6 +13784,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-network-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", @@ -13859,15 +13925,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-regexp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", - "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -13969,24 +14026,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -14001,13 +14040,13 @@ } }, "node_modules/is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -14275,12 +14314,6 @@ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" }, - "node_modules/js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -14300,16 +14333,15 @@ } }, "node_modules/jsdom": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", - "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.1", + "decimal.js": "^10.5.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", @@ -14319,12 +14351,12 @@ "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^5.0.0", + "tough-cookie": "^5.1.1", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.0", + "whatwg-url": "^14.1.1", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, @@ -14467,9 +14499,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", - "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", + "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", "dev": true, "license": "MIT" }, @@ -14554,9 +14586,9 @@ } }, "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { @@ -14667,73 +14699,6 @@ "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", - "dev": true, - "dependencies": { - "chalk": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/log-symbols/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/log-symbols/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/logform": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", @@ -14787,10 +14752,11 @@ } }, "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", + "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", + "dev": true, + "license": "MIT" }, "node_modules/lower-case": { "version": "2.0.2", @@ -14801,18 +14767,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", @@ -14859,18 +14813,6 @@ "node": ">=0.10.0" } }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -15001,56 +14943,12 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/mdurl": { "version": "2.0.0", @@ -15126,26 +15024,6 @@ "node": ">= 0.6" } }, - "node_modules/micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -15207,15 +15085,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/mini-css-extract-plugin": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", @@ -15261,20 +15130,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", @@ -15381,9 +15236,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -15391,6 +15246,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -15729,9 +15585,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -16076,24 +15932,6 @@ "node": ">=6" } }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -16412,18 +16250,6 @@ "node": ">=8" } }, - "node_modules/plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "dependencies": { - "irregular-plurals": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -16444,9 +16270,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -16464,7 +16290,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -16513,13 +16339,13 @@ } }, "node_modules/postcss-calc": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", - "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.1.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -16529,6 +16355,20 @@ "postcss": "^8.4.38" } }, + "node_modules/postcss-calc/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-clamp": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", @@ -16545,9 +16385,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.8.tgz", - "integrity": "sha512-S/TpMKVKofNvsxfau/+bw+IA6cSfB6/kmzFj5szUofHOVnFFMB2WwK+Zu07BeMD8T0n+ZnTO5uXiMvAKe2dPkA==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.10.tgz", + "integrity": "sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA==", "dev": true, "funding": [ { @@ -16561,10 +16401,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -16629,13 +16469,13 @@ } }, "node_modules/postcss-colormin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", - "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.3.tgz", + "integrity": "sha512-xZxQcSyIVZbSsl1vjoqZAcMYYdnJsIyG8OvqShuuqf12S88qQboxxEy0ohNCOLwVPXTU+hFHvJPACRL2B5ohTA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "caniuse-api": "^3.0.0", "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" @@ -16644,30 +16484,30 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-convert-values": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz", - "integrity": "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.5.tgz", + "integrity": "sha512-0VFhH8nElpIs3uXKnVtotDJJNX0OGYSZmdt4XfSfvOMrFw1jKfpwpZxfC4iN73CTM/MWakDEmsHQXkISYj4BXw==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-custom-media": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", - "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", "dev": true, "funding": [ { @@ -16681,10 +16521,10 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2" + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "engines": { "node": ">=18" @@ -16694,9 +16534,9 @@ } }, "node_modules/postcss-custom-media/node_modules/@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "funding": [ { @@ -16713,14 +16553,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/postcss-custom-properties": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", - "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", "dev": true, "funding": [ { @@ -16734,9 +16574,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -16748,9 +16588,9 @@ } }, "node_modules/postcss-custom-selectors": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", - "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", "dev": true, "funding": [ { @@ -16764,9 +16604,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", "postcss-selector-parser": "^7.0.0" }, "engines": { @@ -16831,64 +16671,78 @@ } }, "node_modules/postcss-discard-comments": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz", - "integrity": "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz", + "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.1.2" + "postcss-selector-parser": "^7.1.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-comments/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, "node_modules/postcss-discard-duplicates": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", - "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", + "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-discard-empty": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", - "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", + "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-discard-overridden": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", - "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", + "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-double-position-gradients": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.0.tgz", - "integrity": "sha512-JkIGah3RVbdSEIrcobqj4Gzq0h53GG4uqDPsho88SgY84WnpkTpI0k50MFK/sX7XqVisZ6OqUfFnoUO6m1WWdg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.2.tgz", + "integrity": "sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q==", "dev": true, "funding": [ { @@ -16902,7 +16756,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -17122,9 +16976,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.8.tgz", - "integrity": "sha512-plV21I86Hg9q8omNz13G9fhPtLopIWH06bt/Cb5cs1XnaGU2kUtEitvVd4vtQb/VqCdNUHK5swKn3QFmMRbpDg==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.10.tgz", + "integrity": "sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ==", "dev": true, "funding": [ { @@ -17138,10 +16992,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -17519,108 +17373,136 @@ "dev": true }, "node_modules/postcss-merge-longhand": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz", - "integrity": "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", + "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.4" + "stylehacks": "^7.0.5" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-merge-rules": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", - "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.5.tgz", + "integrity": "sha512-ZonhuSwEaWA3+xYbOdJoEReKIBs5eDiBVLAGpYZpNFPzXZcEE5VKR7/qBEQvTZpiwjqhhqEQ+ax5O3VShBj9Wg==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.0", - "postcss-selector-parser": "^6.1.2" + "cssnano-utils": "^5.0.1", + "postcss-selector-parser": "^7.1.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, - "node_modules/postcss-minify-font-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", - "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", - "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", - "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz", - "integrity": "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==", + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", - "postcss-selector-parser": "^6.1.2" + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", + "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", + "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-params": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.3.tgz", + "integrity": "sha512-vUKV2+f5mtjewYieanLX0xemxIp1t0W0H/D11u+kQV/MWdygOO7xPMkbK+r9P6Lhms8MgzKARF/g5OPXhb8tgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", + "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, "node_modules/postcss-modules-extract-imports": { @@ -17686,9 +17568,9 @@ } }, "node_modules/postcss-nesting": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", - "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", "dev": true, "funding": [ { @@ -17702,7 +17584,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-resolve-nested": "^3.1.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, @@ -17714,9 +17596,9 @@ } }, "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", - "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", "dev": true, "funding": [ { @@ -17774,22 +17656,22 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", - "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", + "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-normalize-display-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", - "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", + "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17799,13 +17681,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-normalize-positions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", - "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", + "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17815,13 +17697,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", - "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", + "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17831,13 +17713,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-normalize-string": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", - "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", + "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17847,13 +17729,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", - "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", + "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", "dev": true, "license": "MIT", "dependencies": { @@ -17863,30 +17745,30 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-normalize-unicode": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", - "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.3.tgz", + "integrity": "sha512-EcoA29LvG3F+EpOh03iqu+tJY3uYYKzArqKJHxDhUYLa2u58aqGq16K6/AOsXD9yqLN8O6y9mmePKN5cx6krOw==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-normalize-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", - "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", + "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17896,13 +17778,13 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-normalize-whitespace": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", - "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", + "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", "dev": true, "license": "MIT", "dependencies": { @@ -17912,7 +17794,7 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-opacity-percentage": { @@ -17939,20 +17821,20 @@ } }, "node_modules/postcss-ordered-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", - "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", + "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", "dev": true, "license": "MIT", "dependencies": { - "cssnano-utils": "^5.0.0", + "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-overflow-shorthand": { @@ -18017,9 +17899,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.5.tgz", - "integrity": "sha512-LQybafF/K7H+6fAs4SIkgzkSCixJy0/h0gubDIAP3Ihz+IQBRwsjyvBnAZ3JUHD+A/ITaxVRPDxn//a3Qy4pDw==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.3.tgz", + "integrity": "sha512-zlQN1yYmA7lFeM1wzQI14z97mKoM8qGng+198w1+h6sCud/XxOjcKtApY9jWr7pXNS3yHDEafPlClSsWnkY8ow==", "dev": true, "funding": [ { @@ -18034,61 +17916,62 @@ "license": "MIT-0", "dependencies": { "@csstools/postcss-cascade-layers": "^5.0.1", - "@csstools/postcss-color-function": "^4.0.8", - "@csstools/postcss-color-mix-function": "^3.0.8", - "@csstools/postcss-content-alt-text": "^2.0.4", - "@csstools/postcss-exponential-functions": "^2.0.7", + "@csstools/postcss-color-function": "^4.0.10", + "@csstools/postcss-color-mix-function": "^3.0.10", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.0", + "@csstools/postcss-content-alt-text": "^2.0.6", + "@csstools/postcss-exponential-functions": "^2.0.9", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.8", - "@csstools/postcss-gradients-interpolation-method": "^5.0.8", - "@csstools/postcss-hwb-function": "^4.0.8", - "@csstools/postcss-ic-unit": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.10", + "@csstools/postcss-gradients-interpolation-method": "^5.0.10", + "@csstools/postcss-hwb-function": "^4.0.10", + "@csstools/postcss-ic-unit": "^4.0.2", "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.1", - "@csstools/postcss-light-dark-function": "^2.0.7", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.9", "@csstools/postcss-logical-float-and-clear": "^3.0.0", "@csstools/postcss-logical-overflow": "^2.0.0", "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.3", - "@csstools/postcss-media-minmax": "^2.0.7", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.8", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", - "@csstools/postcss-random-function": "^1.0.3", - "@csstools/postcss-relative-color-syntax": "^3.0.8", + "@csstools/postcss-oklab-function": "^4.0.10", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.10", "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.2", - "@csstools/postcss-stepped-value-functions": "^4.0.7", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", "@csstools/postcss-text-decoration-shorthand": "^4.0.2", - "@csstools/postcss-trigonometric-functions": "^4.0.7", + "@csstools/postcss-trigonometric-functions": "^4.0.9", "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.19", - "browserslist": "^4.24.4", + "autoprefixer": "^10.4.21", + "browserslist": "^4.25.0", "css-blank-pseudo": "^7.0.1", "css-has-pseudo": "^7.0.2", "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.2.3", + "cssdb": "^8.3.0", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.8", + "postcss-color-functional-notation": "^7.0.10", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.5", - "postcss-custom-properties": "^14.0.4", - "postcss-custom-selectors": "^8.0.4", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.0", + "postcss-double-position-gradients": "^6.0.2", "postcss-focus-visible": "^10.0.1", "postcss-focus-within": "^9.0.1", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.8", + "postcss-lab-function": "^7.0.10", "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.1", + "postcss-nesting": "^13.0.2", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", "postcss-page-break": "^3.0.4", @@ -18145,26 +18028,26 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", - "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.3.tgz", + "integrity": "sha512-RFvkZaqiWtGMlVjlUHpaxGqEL27lgt+Q2Ixjf83CRAzqdo+TsDyGPtJUbPx2MuYIJ+sCQc2TrOvRnhcXQfgIVA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "caniuse-api": "^3.0.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-reduce-transforms": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", - "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", + "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", "dev": true, "license": "MIT", "dependencies": { @@ -18174,7 +18057,7 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-replace-overflow-wrap": { @@ -18310,48 +18193,6 @@ "node": ">=6" } }, - "node_modules/postcss-sass": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", - "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", - "dev": true, - "dependencies": { - "gonzales-pe": "^4.3.0", - "postcss": "^7.0.21" - } - }, - "node_modules/postcss-sass/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/postcss-sass/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-sass/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/postcss-scss": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", @@ -18485,9 +18326,9 @@ } }, "node_modules/postcss-svgo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", - "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.2.tgz", + "integrity": "sha512-5Dzy66JlnRM6pkdOTF8+cGsB1fnERTE8Nc+Eed++fOWo1hdsBptCsbG8UuJkgtZt75bRtMJIrPeZmtfANixdFA==", "dev": true, "license": "MIT", "dependencies": { @@ -18498,7 +18339,7 @@ "node": "^18.12.0 || ^20.9.0 || >= 18" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" } }, "node_modules/postcss-syntax": { @@ -18511,19 +18352,33 @@ } }, "node_modules/postcss-unique-selectors": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz", - "integrity": "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", + "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.1.2" + "postcss-selector-parser": "^7.1.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, "node_modules/postcss-value-parser": { @@ -18623,6 +18478,12 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "peer": true }, + "node_modules/proxy-polyfill": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/proxy-polyfill/-/proxy-polyfill-0.3.2.tgz", + "integrity": "sha512-ENKSXOMCewnQTOyqrQXxEjIhzT6dy572mtehiItbDoIUF5Sv5UkmRUc8kowg2MFvr232Uo8rwRpNg3V5kgTKbA==", + "license": "Apache-2.0" + }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -18827,9 +18688,9 @@ } }, "node_modules/react-router": { - "version": "6.30.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", - "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", "license": "MIT", "dependencies": { "@remix-run/router": "1.23.0" @@ -18842,13 +18703,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.30.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", - "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", "license": "MIT", "dependencies": { "@remix-run/router": "1.23.0", - "react-router": "6.30.0" + "react-router": "6.30.1" }, "engines": { "node": ">=14.0.0" @@ -18873,15 +18734,6 @@ "react-dom": ">=16.6.0" } }, - "node_modules/read-file-stdin": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/read-file-stdin/-/read-file-stdin-0.2.1.tgz", - "integrity": "sha1-JezP86FTtoCa+ssj7hU4fbng7mE=", - "dev": true, - "dependencies": { - "gather-stream": "^1.0.0" - } - }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -18981,15 +18833,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -19085,47 +18928,6 @@ "node": ">= 0.10" } }, - "node_modules/remark": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", - "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", - "dev": true, - "dependencies": { - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.0", - "unified": "^9.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "dev": true, - "dependencies": { - "mdast-util-from-markdown": "^0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "dev": true, - "dependencies": { - "mdast-util-to-markdown": "^0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remove-accents": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", @@ -19281,12 +19083,13 @@ } }, "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -19296,25 +19099,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", "fsevents": "~2.3.2" } }, @@ -19471,9 +19275,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.3.tgz", - "integrity": "sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", + "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", "dev": true, "license": "MIT", "dependencies": { @@ -19492,13 +19296,13 @@ } }, "node_modules/sass-embedded": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.86.3.tgz", - "integrity": "sha512-3pZSp24ibO1hdopj+W9DuiWsZOb2YY6AFRo/jjutKLBkqJGM1nJjXzhAYfzRV+Xn5BX1eTI4bBTE09P0XNHOZg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.89.2.tgz", + "integrity": "sha512-Ack2K8rc57kCFcYlf3HXpZEJFNUX8xd8DILldksREmYXQkRHI879yy8q4mRDJgrojkySMZqmmmW1NxrFxMsYaA==", "license": "MIT", "optional": true, "dependencies": { - "@bufbuild/protobuf": "^2.0.0", + "@bufbuild/protobuf": "^2.5.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", "immutable": "^5.0.2", @@ -19514,32 +19318,28 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.86.3", - "sass-embedded-android-arm64": "1.86.3", - "sass-embedded-android-ia32": "1.86.3", - "sass-embedded-android-riscv64": "1.86.3", - "sass-embedded-android-x64": "1.86.3", - "sass-embedded-darwin-arm64": "1.86.3", - "sass-embedded-darwin-x64": "1.86.3", - "sass-embedded-linux-arm": "1.86.3", - "sass-embedded-linux-arm64": "1.86.3", - "sass-embedded-linux-ia32": "1.86.3", - "sass-embedded-linux-musl-arm": "1.86.3", - "sass-embedded-linux-musl-arm64": "1.86.3", - "sass-embedded-linux-musl-ia32": "1.86.3", - "sass-embedded-linux-musl-riscv64": "1.86.3", - "sass-embedded-linux-musl-x64": "1.86.3", - "sass-embedded-linux-riscv64": "1.86.3", - "sass-embedded-linux-x64": "1.86.3", - "sass-embedded-win32-arm64": "1.86.3", - "sass-embedded-win32-ia32": "1.86.3", - "sass-embedded-win32-x64": "1.86.3" + "sass-embedded-android-arm": "1.89.2", + "sass-embedded-android-arm64": "1.89.2", + "sass-embedded-android-riscv64": "1.89.2", + "sass-embedded-android-x64": "1.89.2", + "sass-embedded-darwin-arm64": "1.89.2", + "sass-embedded-darwin-x64": "1.89.2", + "sass-embedded-linux-arm": "1.89.2", + "sass-embedded-linux-arm64": "1.89.2", + "sass-embedded-linux-musl-arm": "1.89.2", + "sass-embedded-linux-musl-arm64": "1.89.2", + "sass-embedded-linux-musl-riscv64": "1.89.2", + "sass-embedded-linux-musl-x64": "1.89.2", + "sass-embedded-linux-riscv64": "1.89.2", + "sass-embedded-linux-x64": "1.89.2", + "sass-embedded-win32-arm64": "1.89.2", + "sass-embedded-win32-x64": "1.89.2" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.86.3.tgz", - "integrity": "sha512-UyeXrFzZSvrGbvrWUBcspbsbivGgAgebLGJdSqJulgSyGbA6no3DWQ5Qpdd6+OAUC39BlpPu74Wx9s4RrVuaFw==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.89.2.tgz", + "integrity": "sha512-oHAPTboBHRZlDBhyRB6dvDKh4KvFs+DZibDHXbkSI6dBZxMTT+Yb2ivocHnctVGucKTLQeT7+OM5DjWHyynL/A==", "cpu": [ "arm" ], @@ -19553,9 +19353,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.86.3.tgz", - "integrity": "sha512-q+XwFp6WgAv+UgnQhsB8KQ95kppvWAB7DSoJp+8Vino8b9ND+1ai3cUUZPE5u4SnLZrgo5NtrbPvN5KLc4Pfyg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.89.2.tgz", + "integrity": "sha512-+pq7a7AUpItNyPu61sRlP6G2A8pSPpyazASb+8AK2pVlFayCSPAEgpwpCE9A2/Xj86xJZeMizzKUHxM2CBCUxA==", "cpu": [ "arm64" ], @@ -19568,26 +19368,10 @@ "node": ">=14.0.0" } }, - "node_modules/sass-embedded-android-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.86.3.tgz", - "integrity": "sha512-gTJjVh2cRzvGujXj5ApPk/owUTL5SiO7rDtNLrzYAzi1N5HRuLYXqk3h1IQY3+eCOBjGl7mQ9XyySbJs/3hDvg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.86.3.tgz", - "integrity": "sha512-Po3JnyiCS16kd6REo1IMUbFGYtvL9O0rmKaXx5vOuBaJD1LPy2LiSSp7TU7wkJ9IxsTDGzFaSeP1I9qb6D8VVg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.89.2.tgz", + "integrity": "sha512-HfJJWp/S6XSYvlGAqNdakeEMPOdhBkj2s2lN6SHnON54rahKem+z9pUbCriUJfM65Z90lakdGuOfidY61R9TYg==", "cpu": [ "riscv64" ], @@ -19601,9 +19385,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.86.3.tgz", - "integrity": "sha512-+7h3jdDv/0kUFx0BvxYlq2fa7CcHiDPlta6k5OxO5K6jyqJwo9hc0Z052BoYEauWTqZ+vK6bB5rv2BIzq4U9nA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.89.2.tgz", + "integrity": "sha512-BGPzq53VH5z5HN8de6jfMqJjnRe1E6sfnCWFd4pK+CAiuM7iw5Fx6BQZu3ikfI1l2GY0y6pRXzsVLdp/j4EKEA==", "cpu": [ "x64" ], @@ -19617,9 +19401,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.86.3.tgz", - "integrity": "sha512-EgLwV4ORm5Hr0DmIXo0Xw/vlzwLnfAiqD2jDXIglkBsc5czJmo4/IBdGXOP65TRnsgJEqvbU3aQhuawX5++x9A==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.89.2.tgz", + "integrity": "sha512-UCm3RL/tzMpG7DsubARsvGUNXC5pgfQvP+RRFJo9XPIi6elopY5B6H4m9dRYDpHA+scjVthdiDwkPYr9+S/KGw==", "cpu": [ "arm64" ], @@ -19633,9 +19417,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.86.3.tgz", - "integrity": "sha512-dfKhfrGPRNLWLC82vy/vQGmNKmAiKWpdFuWiePRtg/E95pqw+sCu6080Y6oQLfFu37Iq3MpnXiSpDuSo7UnPWA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.89.2.tgz", + "integrity": "sha512-D9WxtDY5VYtMApXRuhQK9VkPHB8R79NIIR6xxVlN2MIdEid/TZWi1MHNweieETXhWGrKhRKglwnHxxyKdJYMnA==", "cpu": [ "x64" ], @@ -19649,9 +19433,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.86.3.tgz", - "integrity": "sha512-+fVCIH+OR0SMHn2NEhb/VfbpHuUxcPtqMS34OCV3Ka99LYZUJZqth4M3lT/ppGl52mwIVLNYzR4iLe6mdZ6mYA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.89.2.tgz", + "integrity": "sha512-leP0t5U4r95dc90o8TCWfxNXwMAsQhpWxTkdtySDpngoqtTy3miMd7EYNYd1znI0FN1CBaUvbdCMbnbPwygDlA==", "cpu": [ "arm" ], @@ -19665,9 +19449,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.86.3.tgz", - "integrity": "sha512-tYq5rywR53Qtc+0KI6pPipOvW7a47ETY69VxfqI9BR2RKw2hBbaz0bIw6OaOgEBv2/XNwcWb7a4sr7TqgkqKAA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.89.2.tgz", + "integrity": "sha512-2N4WW5LLsbtrWUJ7iTpjvhajGIbmDR18ZzYRywHdMLpfdPApuHPMDF5CYzHbS+LLx2UAx7CFKBnj5LLjY6eFgQ==", "cpu": [ "arm64" ], @@ -19680,26 +19464,10 @@ "node": ">=14.0.0" } }, - "node_modules/sass-embedded-linux-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.86.3.tgz", - "integrity": "sha512-CmQ5OkqnaeLdaF+bMqlYGooBuenqm3LvEN9H8BLhjkpWiFW8hnYMetiqMcJjhrXLvDw601KGqA5sr/Rsg5s45g==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.86.3.tgz", - "integrity": "sha512-SEm65SQknI4pl+mH5Xf231hOkHJyrlgh5nj4qDbiBG6gFeutaNkNIeRgKEg3cflXchCr8iV/q/SyPgjhhzQb7w==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.89.2.tgz", + "integrity": "sha512-Z6gG2FiVEEdxYHRi2sS5VIYBmp17351bWtOCUZ/thBM66+e70yiN6Eyqjz80DjL8haRUegNQgy9ZJqsLAAmr9g==", "cpu": [ "arm" ], @@ -19713,9 +19481,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.86.3.tgz", - "integrity": "sha512-4zOr2C/eW89rxb4ozTfn7lBzyyM5ZigA1ZSRTcAR26Qbg/t2UksLdGnVX9/yxga0d6aOi0IvO/7iM2DPPRRotg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.89.2.tgz", + "integrity": "sha512-nTyuaBX6U1A/cG7WJh0pKD1gY8hbg1m2SnzsyoFG+exQ0lBX/lwTLHq3nyhF+0atv7YYhYKbmfz+sjPP8CZ9lw==", "cpu": [ "arm64" ], @@ -19728,26 +19496,10 @@ "node": ">=14.0.0" } }, - "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.86.3.tgz", - "integrity": "sha512-84Tcld32LB1loiqUvczWyVBQRCChm0wNLlkT59qF29nxh8njFIVf9yaPgXcSyyjpPoD9Tu0wnq3dvVzoMCh9AQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.86.3.tgz", - "integrity": "sha512-IxEqoiD7vdNpiOwccybbV93NljBy64wSTkUOknGy21SyV43C8uqESOwTwW9ywa3KufImKm8L3uQAW/B0KhJMWg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.89.2.tgz", + "integrity": "sha512-N6oul+qALO0SwGY8JW7H/Vs0oZIMrRMBM4GqX3AjM/6y8JsJRxkAwnfd0fDyK+aICMFarDqQonQNIx99gdTZqw==", "cpu": [ "riscv64" ], @@ -19761,9 +19513,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.86.3.tgz", - "integrity": "sha512-ePeTPXUxPK6JgHcUfnrkIyDtyt+zlAvF22mVZv6y1g/PZFm1lSfX+Za7TYHg9KaYqaaXDiw6zICX4i44HhR8rA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.89.2.tgz", + "integrity": "sha512-K+FmWcdj/uyP8GiG9foxOCPfb5OAZG0uSVq80DKgVSC0U44AdGjvAvVZkrgFEcZ6cCqlNC2JfYmslB5iqdL7tg==", "cpu": [ "x64" ], @@ -19777,9 +19529,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.86.3.tgz", - "integrity": "sha512-NuXQ72dwfNLe35E+RaXJ4Noq4EkFwM65eWwCwxEWyJO9qxOx1EXiCAJii6x8kkOh5daWuMU0VAI1B9RsJaqqQQ==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.89.2.tgz", + "integrity": "sha512-g9nTbnD/3yhOaskeqeBQETbtfDQWRgsjHok6bn7DdAuwBsyrR3JlSFyqKc46pn9Xxd9SQQZU8AzM4IR+sY0A0w==", "cpu": [ "riscv64" ], @@ -19793,9 +19545,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.86.3.tgz", - "integrity": "sha512-t8be9zJ5B82+og9bQmIQ83yMGYZMTMrlGA+uGWtYacmwg6w3093dk91Fx0YzNSZBp3Tk60qVYjCZnEIwy60x0g==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.89.2.tgz", + "integrity": "sha512-Ax7dKvzncyQzIl4r7012KCMBvJzOz4uwSNoyoM5IV6y5I1f5hEwI25+U4WfuTqdkv42taCMgpjZbh9ERr6JVMQ==", "cpu": [ "x64" ], @@ -19809,9 +19561,9 @@ } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.86.3.tgz", - "integrity": "sha512-4ghuAzjX4q8Nksm0aifRz8hgXMMxS0SuymrFfkfJlrSx68pIgvAge6AOw0edoZoe0Tf5ZbsWUWamhkNyNxkTvw==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.89.2.tgz", + "integrity": "sha512-j96iJni50ZUsfD6tRxDQE2QSYQ2WrfHxeiyAXf41Kw0V4w5KYR/Sf6rCZQLMTUOHnD16qTMVpQi20LQSqf4WGg==", "cpu": [ "arm64" ], @@ -19824,26 +19576,10 @@ "node": ">=14.0.0" } }, - "node_modules/sass-embedded-win32-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.86.3.tgz", - "integrity": "sha512-tCaK4zIRq9mLRPxLzBAdYlfCuS/xLNpmjunYxeWkIwlJo+k53h1udyXH/FInnQ2GgEz0xMXyvH3buuPgzwWYsw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/sass-embedded-win32-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.86.3.tgz", - "integrity": "sha512-zS+YNKfTF4SnOfpC77VTb0qNZyTXrxnAezSoRV0xnw6HlY+1WawMSSB6PbWtmbvyfXNgpmJUttoTtsvJjRCucg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.89.2.tgz", + "integrity": "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng==", "cpu": [ "x64" ], @@ -19974,9 +19710,9 @@ } }, "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21087,6 +20823,20 @@ "dev": true, "license": "MIT" }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -21297,6 +21047,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/style-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", @@ -21321,26 +21091,40 @@ "dev": true }, "node_modules/stylehacks": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", - "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.5.tgz", + "integrity": "sha512-5kNb7V37BNf0Q3w+1pxfa+oiNPS++/b4Jil9e/kPDgrk1zjEd6uR7SZeJiYaLYH6RRSC1XX2/37OTeU/4FvuIA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "postcss-selector-parser": "^6.1.2" + "browserslist": "^4.24.5", + "postcss-selector-parser": "^7.1.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4.32" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, "node_modules/stylelint": { - "version": "16.18.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.18.0.tgz", - "integrity": "sha512-OXb68qzesv7J70BSbFwfK3yTVLEVXiQ/ro6wUE4UrSbKCMjLLA02S8Qq3LC01DxKyVjk7z8xh35aB4JzO3/sNA==", + "version": "16.21.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.0.tgz", + "integrity": "sha512-ki3PpJGG7xhm3WtINoWGnlvqAmbqSexoRMbEMJzlwewSIOqPRKPlq452c22xAdEJISVi80r+I7KL9GPUiwFgbg==", "dev": true, "funding": [ { @@ -21354,9 +21138,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", @@ -21364,24 +21148,24 @@ "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.3", "css-tree": "^3.1.0", - "debug": "^4.3.7", + "debug": "^4.4.1", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.0.7", + "file-entry-cache": "^10.1.1", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^7.0.3", + "ignore": "^7.0.5", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.35.0", + "known-css-properties": "^0.37.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.3", + "postcss": "^8.5.5", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.0", @@ -22362,895 +22146,55 @@ } }, "node_modules/stylelint-no-browser-hacks": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/stylelint-no-browser-hacks/-/stylelint-no-browser-hacks-1.3.0.tgz", - "integrity": "sha512-aeNEFlP/AIQ3FEgU6HxUOY5Xb2M1vimNWNUcQkaFou/rb0roQH75GM4v6Vf5MB+eEmLckz7dXzveTYnG3SBedw==", - "dev": true, - "dependencies": { - "stylehacks": "^2.3.2", - "stylelint": "^13.13.1" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dev": true, - "dependencies": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/autoprefixer/node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/autoprefixer/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/autoprefixer/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/balanced-match": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "node_modules/stylelint-no-browser-hacks/node_modules/browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw==", - "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "resolved": "https://registry.npmjs.org/stylelint-no-browser-hacks/-/stylelint-no-browser-hacks-2.0.0.tgz", + "integrity": "sha512-+m/2MYCNMYFoMgsxq/Wk5YpQlGJo+PlIcYMdPA9j6s2lYc3t4FumlHHeXySM4qsj5tDdT75AbK5b2g3yKIhyVg==", "dev": true, + "license": "MIT", "dependencies": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - }, - "bin": { - "browserslist": "cli.js" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/chalk/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/stylelint-no-browser-hacks/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/known-css-properties": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", - "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", - "dev": true - }, - "node_modules/stylelint-no-browser-hacks/node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/stylelint-no-browser-hacks/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/postcss-reporter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", - "integrity": "sha512-h9yLwoenfn2GZFINc42nCJInko4rZom3Ud0aEQhOQLa3PlgOUbfQH7/yEwVQLUqX84BwX3ekcwUDic/mpNTx9w==", - "dev": true, - "dependencies": { - "chalk": "^1.0.0", - "lodash": "^4.1.0", - "log-symbols": "^1.0.2", - "postcss": "^5.0.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/postcss-scss": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", - "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/postcss-scss/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/postcss-scss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/postcss/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/stylelint-no-browser-hacks/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylehacks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-2.3.2.tgz", - "integrity": "sha512-cWtUu/KdmyR0J37V4wjD7x2DyMJykPYhRuv72WiV4n5GkDjbhSml/rqOqLqXVAVWiKZh0XbMO47sLdNJvBzKQQ==", - "dev": true, - "dependencies": { - "browserslist": "^1.1.3", - "chalk": "^1.1.1", - "log-symbols": "^1.0.2", - "minimist": "^1.2.0", - "plur": "^2.1.2", - "postcss": "^5.0.18", - "postcss-reporter": "^1.3.3", - "postcss-selector-parser": "^2.0.0", - "read-file-stdin": "^0.2.1", - "text-table": "^0.2.0", - "write-file-stdout": "0.0.2" - }, - "bin": { - "stylehacks": "dist/cli.js" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylehacks/node_modules/postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA==", - "dev": true, - "dependencies": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylelint": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", - "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", - "dev": true, - "dependencies": { - "@stylelint/postcss-css-in-js": "^0.37.2", - "@stylelint/postcss-markdown": "^0.36.2", - "autoprefixer": "^9.8.6", - "balanced-match": "^2.0.0", - "chalk": "^4.1.1", - "cosmiconfig": "^7.0.0", - "debug": "^4.3.1", - "execall": "^2.0.0", - "fast-glob": "^3.2.5", - "fastest-levenshtein": "^1.0.12", - "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", - "global-modules": "^2.0.0", - "globby": "^11.0.3", - "globjoin": "^0.1.4", - "html-tags": "^3.1.0", - "ignore": "^5.1.8", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.21.0", - "lodash": "^4.17.21", - "log-symbols": "^4.1.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.4", - "normalize-selector": "^0.2.0", - "postcss": "^7.0.35", - "postcss-html": "^0.36.0", - "postcss-less": "^3.1.4", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^4.0.2", - "postcss-sass": "^0.4.4", - "postcss-scss": "^2.1.1", - "postcss-selector-parser": "^6.0.5", - "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^4.1.0", - "resolve-from": "^5.0.0", - "slash": "^3.0.0", - "specificity": "^0.4.1", - "string-width": "^4.2.2", - "strip-ansi": "^6.0.0", - "style-search": "^0.1.0", - "sugarss": "^2.0.0", - "svg-tags": "^1.0.0", - "table": "^6.6.0", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^3.0.3" - }, - "bin": { - "stylelint": "bin/stylelint.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylelint/node_modules/@stylelint/postcss-css-in-js": { - "version": "0.37.3", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.3.tgz", - "integrity": "sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@babel/core": "^7.17.9" - }, - "peerDependencies": { - "postcss": ">=7.0.0", - "postcss-syntax": ">=0.36.2" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylelint/node_modules/@stylelint/postcss-markdown": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", - "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", - "deprecated": "Use the original unforked package instead: postcss-markdown", - "dev": true, - "dependencies": { - "remark": "^13.0.0", - "unist-util-find-all-after": "^3.0.2" - }, - "peerDependencies": { - "postcss": ">=7.0.0", - "postcss-syntax": ">=0.36.2" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylelint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylelint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylelint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylelint/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylelint/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylelint/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/stylelint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/stylelint-no-browser-hacks/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" + "postcss": "^8.5.3", + "stylehacks": "^7.0.4", + "stylelint": "^16.18.0" } }, "node_modules/stylelint-order": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", - "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-7.0.0.tgz", + "integrity": "sha512-rSWxx0KscYfxU02wEskKXES9lkRzuuONMMNkZ7SUc6uiF3tDKm7e+sE0Ax/SBlG4TUf1sp1R6f3/SlsPGmzthg==", "dev": true, + "license": "MIT", "dependencies": { - "postcss": "^8.4.32", - "postcss-sorting": "^8.0.2" + "postcss": "^8.5.3", + "postcss-sorting": "^9.1.0" + }, + "engines": { + "node": ">=20.19.0" }, "peerDependencies": { - "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" + "stylelint": "^16.18.0" } }, "node_modules/stylelint-order/node_modules/postcss-sorting": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz", - "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-9.1.0.tgz", + "integrity": "sha512-Mn8KJ45HNNG6JBpBizXcyf6LqY/qyqetGcou/nprDnFwBFBLGj0j/sNKV2lj2KMOVOwdXu14aEzqJv8CIV6e8g==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8.4.20" } }, "node_modules/stylelint-scss": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.11.1.tgz", - "integrity": "sha512-e4rYo0UY+BIMtGeGanghrvHTjcryxgZbyFxUedp8dLFqC4P70aawNdYjRrQxbnKhu3BNr4+lt5e/53tcKXiwFA==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz", + "integrity": "sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==", "dev": true, "license": "MIT", "dependencies": { "css-tree": "^3.0.1", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.35.0", - "mdn-data": "^2.15.0", + "known-css-properties": "^0.36.0", + "mdn-data": "^2.21.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", "postcss-selector-parser": "^7.1.0", @@ -23295,9 +22239,9 @@ } }, "node_modules/stylelint-scss/node_modules/mdn-data": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.18.0.tgz", - "integrity": "sha512-gtCy1yim/vpHF/tq3B4Z43x3zKWpYeb4IM3d/Mf4oMYcNuoXOYEaqtoFlLHw9zd7+WNN3jNh6/WXyUrD3OIiwQ==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.22.0.tgz", + "integrity": "sha512-IwcXqjPl4kgZbQH1WLb97/Pjt7XwPDSHnXsjENPhwx68bBf/Dw1/PwM8paXnFq974V1d8qP4o9ViVQqZuPAlCw==", "dev": true, "license": "CC0-1.0" }, @@ -23316,9 +22260,9 @@ } }, "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "funding": [ { @@ -23335,8 +22279,8 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/stylelint/node_modules/@csstools/selector-specificity": { @@ -23428,25 +22372,25 @@ } }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.8.tgz", - "integrity": "sha512-FGXHpfmI4XyzbLd3HQ8cbUcsFGohJpZtmQRHr8z8FxxtCe2PcpgIlVLwIgunqjvRmXypBETvwhV4ptJizA+Y1Q==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.1.tgz", + "integrity": "sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.8" + "flat-cache": "^6.1.10" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.8.tgz", - "integrity": "sha512-R6MaD3nrJAtO7C3QOuS79ficm2pEAy++TgEUD8ii1LVlbcgZ9DtASLkt9B+RZSFCzm7QHDMlXPsqqB6W2Pfr1Q==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.10.tgz", + "integrity": "sha512-B6/v1f0NwjxzmeOhzfXPGWpKBVA207LS7lehaVKQnFrVktcFRfkzjZZ2gwj2i1TkEUMQht7ZMJbABUT5N+V1Nw==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^1.8.9", + "cacheable": "^1.10.0", "flatted": "^3.3.3", - "hookified": "^1.8.1" + "hookified": "^1.9.1" } }, "node_modules/stylelint/node_modules/globby": { @@ -23481,9 +22425,9 @@ } }, "node_modules/stylelint/node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -23540,6 +22484,13 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/stylelint/node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, "node_modules/stylelint/node_modules/mdn-data": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", @@ -23841,9 +22792,9 @@ } }, "node_modules/svgo/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -23869,9 +22820,9 @@ } }, "node_modules/swiper": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.2.6.tgz", - "integrity": "sha512-8aXpYKtjy3DjcbzZfz+/OX/GhcU5h+looA6PbAzHMZT6ESSycSp9nAjPCenczgJyslV+rUGse64LMGpWE3PX9Q==", + "version": "11.2.8", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.2.8.tgz", + "integrity": "sha512-S5FVf6zWynPWooi7pJ7lZhSUe2snTzqLuUzbd5h5PHUOhzgvW0bLKBd2wv0ixn6/5o9vwc/IkQT74CRcLJQzeg==", "funding": [ { "type": "patreon", @@ -23961,9 +22912,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", - "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", "dev": true, "license": "MIT", "optional": true, @@ -24188,12 +23139,6 @@ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "dev": true }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -24226,13 +23171,13 @@ "dev": true }, "node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.3", + "fdir": "^6.4.4", "picomatch": "^4.0.2" }, "engines": { @@ -24243,9 +23188,9 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -24271,10 +23216,11 @@ } }, "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" } @@ -24289,9 +23235,9 @@ } }, "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", "dev": true, "license": "MIT", "engines": { @@ -24396,9 +23342,9 @@ } }, "node_modules/tough-cookie": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", - "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -24474,10 +23420,11 @@ } }, "node_modules/ts-api-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", - "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.12" }, @@ -24759,15 +23706,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -24783,15 +23721,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.0.tgz", - "integrity": "sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.1.tgz", + "integrity": "sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.29.0", - "@typescript-eslint/parser": "8.29.0", - "@typescript-eslint/utils": "8.29.0" + "@typescript-eslint/eslint-plugin": "8.35.1", + "@typescript-eslint/parser": "8.35.1", + "@typescript-eslint/utils": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24893,33 +23831,6 @@ "node": ">=4" } }, - "node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dev": true, - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unified/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -24941,29 +23852,6 @@ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, - "node_modules/unist-util-find-all-after": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", - "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", - "dev": true, - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-remove-position": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", @@ -25082,9 +23970,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -25181,12 +24069,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -25213,22 +24095,6 @@ "node": ">= 0.8" } }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vfile-location": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", @@ -25254,15 +24120,18 @@ } }, "node_modules/vite": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", - "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" @@ -25326,17 +24195,17 @@ } }, "node_modules/vite-node": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.1.tgz", - "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" @@ -25348,32 +24217,63 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vitest": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", - "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.1.1", - "@vitest/mocker": "3.1.1", - "@vitest/pretty-format": "^3.1.1", - "@vitest/runner": "3.1.1", - "@vitest/snapshot": "3.1.1", - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", - "std-env": "^3.8.1", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.1.1", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "bin": { @@ -25389,8 +24289,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.1.1", - "@vitest/ui": "3.1.1", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, @@ -25418,6 +24318,19 @@ } } }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -25473,14 +24386,15 @@ } }, "node_modules/webpack": { - "version": "5.98.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", - "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "version": "5.99.9", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", + "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", @@ -25497,7 +24411,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", @@ -25707,9 +24621,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.1.tgz", - "integrity": "sha512-ml/0HIj9NLpVKOMq+SuBPLHcmbG+TGIjXRHsYfZwocUBIqEvws8NnS/V9AFQ5FKP+tgn5adwVwRrTEpGL33QFQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "dev": true, "license": "MIT", "dependencies": { @@ -25729,7 +24643,7 @@ "connect-history-api-fallback": "^2.0.0", "express": "^4.21.2", "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.7", + "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", @@ -25960,16 +24874,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, @@ -26332,12 +25247,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/write-file-stdout": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/write-file-stdout/-/write-file-stdout-0.0.2.tgz", - "integrity": "sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE=", - "dev": true - }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -26393,16 +25302,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } + "optional": true }, "node_modules/yocto-queue": { "version": "0.1.0", @@ -26415,16 +25315,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } }, "dependencies": { @@ -26466,37 +25356,37 @@ } }, "@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "requires": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" } }, "@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "dev": true }, "@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -26513,34 +25403,34 @@ } }, "@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "requires": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "requires": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" } }, "@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -26564,27 +25454,27 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", - "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.26.9", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", "semver": "^6.3.1" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" } @@ -26603,174 +25493,174 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, "requires": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "requires": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" } }, "@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "requires": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" } }, "@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, "requires": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" }, "@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" }, "@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "dev": true, "requires": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "requires": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" } }, "@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "requires": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.27.3" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" } }, "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/plugin-proposal-private-property-in-object": { @@ -26781,30 +25671,30 @@ "requires": {} }, "@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-syntax-unicode-sets-regex": { @@ -26818,85 +25708,85 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", - "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.26.8" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", - "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", + "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", "globals": "^11.1.0" }, "dependencies": { @@ -26909,519 +25799,519 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" } }, "@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-for-of": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", - "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" } }, "@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.26.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", - "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", + "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.3", + "@babel/plugin-transform-parameters": "^7.27.1" } }, "@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", - "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", + "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", - "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "dev": true, "requires": { - "@babel/plugin-transform-react-jsx": "^7.25.9" + "@babel/plugin-transform-react-jsx": "^7.27.1" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", - "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", + "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-template-literals": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", - "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", - "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/preset-env": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", - "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.26.8", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.26.5", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.26.3", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.26.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.26.8", - "@babel/plugin-transform-typeof-symbol": "^7.26.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.11.0", @@ -27442,17 +26332,17 @@ } }, "@babel/preset-react": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", - "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-react-display-name": "^7.25.9", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/plugin-transform-react-jsx-development": "^7.25.9", - "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" } }, "@babel/runtime": { @@ -27464,25 +26354,25 @@ } }, "@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "requires": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" } }, "@babel/traverse": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", - "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "requires": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -27495,12 +26385,12 @@ } }, "@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "requires": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" } }, "@bcoe/v8-coverage": { @@ -27510,9 +26400,9 @@ "dev": true }, "@bufbuild/protobuf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.1.0.tgz", - "integrity": "sha512-+2Mx67Y3skJ4NCD/qNSdBJNWtu6x6Qr53jeNg+QcwiL6mt0wK+3jwHH2x1p7xaYH6Ve2JKOVn0OxU35WsmqI9A==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.5.2.tgz", + "integrity": "sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==", "optional": true }, "@colors/colors": { @@ -27522,9 +26412,9 @@ "dev": true }, "@csstools/cascade-layer-name-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", - "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", "dev": true, "requires": {} }, @@ -27535,33 +26425,33 @@ "dev": true }, "@csstools/css-calc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", - "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", - "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", + "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", "dev": true, "requires": { "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.2" + "@csstools/css-calc": "^2.1.4" } }, "@csstools/css-parser-algorithms": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", - "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", - "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "dev": true }, "@csstools/media-query-list-parser": { @@ -27601,52 +26491,65 @@ } }, "@csstools/postcss-color-function": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.8.tgz", - "integrity": "sha512-9dUvP2qpZI6PlGQ/sob+95B3u5u7nkYt9yhZFCC7G9HBRHBxj+QxS/wUlwaMGYW0waf+NIierI8aoDTssEdRYw==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.10.tgz", + "integrity": "sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" } }, "@csstools/postcss-color-mix-function": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.8.tgz", - "integrity": "sha512-yuZpgWUzqZWQhEqfvtJufhl28DgO9sBwSbXbf/59gejNuvZcoUTRGQZhzhwF4ccqb53YAGB+u92z9+eSKoB4YA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.10.tgz", + "integrity": "sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + } + }, + "@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.0.tgz", + "integrity": "sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ==", + "dev": true, + "requires": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" } }, "@csstools/postcss-content-alt-text": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.4.tgz", - "integrity": "sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.6.tgz", + "integrity": "sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" } }, "@csstools/postcss-exponential-functions": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.7.tgz", - "integrity": "sha512-XTb6Mw0v2qXtQYRW9d9duAjDnoTbBpsngD7sRNLmYDjvwU2ebpIHplyxgOeo6jp/Kr52gkLi5VaK5RDCqzMzZQ==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "@csstools/postcss-font-format-keywords": { @@ -27660,49 +26563,49 @@ } }, "@csstools/postcss-gamut-mapping": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.8.tgz", - "integrity": "sha512-/K8u9ZyGMGPjmwCSIjgaOLKfic2RIGdFHHes84XW5LnmrvdhOTVxo255NppHi3ROEvoHPW7MplMJgjZK5Q+TxA==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.10.tgz", + "integrity": "sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.8.tgz", - "integrity": "sha512-CoHQ/0UXrvxLovu0ZeW6c3/20hjJ/QRg6lyXm3dZLY/JgvRU6bdbQZF/Du30A4TvowfcgvIHQmP1bNXUxgDrAw==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.10.tgz", + "integrity": "sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" } }, "@csstools/postcss-hwb-function": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.8.tgz", - "integrity": "sha512-LpFKjX6hblpeqyych1cKmk+3FJZ19QmaJtqincySoMkbkG/w2tfbnO5oE6mlnCTXcGUJ0rCEuRHvTqKK0nHYUQ==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.10.tgz", + "integrity": "sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" } }, "@csstools/postcss-ic-unit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.0.tgz", - "integrity": "sha512-9QT5TDGgx7wD3EEMN3BSUG6ckb6Eh5gSPT5kZoVtUuAonfPmLDJyPhqR4ntPpMYhUKAMVKAg3I/AgzqHMSeLhA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.2.tgz", + "integrity": "sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA==", "dev": true, "requires": { - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" } @@ -27715,9 +26618,9 @@ "requires": {} }, "@csstools/postcss-is-pseudo-class": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", - "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", "dev": true, "requires": { "@csstools/selector-specificity": "^5.0.0", @@ -27744,14 +26647,14 @@ } }, "@csstools/postcss-light-dark-function": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.7.tgz", - "integrity": "sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.9.tgz", + "integrity": "sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" } }, @@ -27786,51 +26689,51 @@ } }, "@csstools/postcss-logical-viewport-units": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", - "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", "dev": true, "requires": { - "@csstools/css-tokenizer": "^3.0.3", + "@csstools/css-tokenizer": "^3.0.4", "@csstools/utilities": "^2.0.0" } }, "@csstools/postcss-media-minmax": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.7.tgz", - "integrity": "sha512-LB6tIP7iBZb5CYv8iRenfBZmbaG3DWNEziOnPjGoQX5P94FBPvvTBy68b/d9NnS5PELKwFmmOYsAEIgEhDPCHA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "dependencies": { "@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "requires": {} } } }, "@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", - "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "dependencies": { "@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "requires": {} } @@ -27856,48 +26759,48 @@ } }, "@csstools/postcss-oklab-function": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.8.tgz", - "integrity": "sha512-+5aPsNWgxohXoYNS1f+Ys0x3Qnfehgygv3qrPyv+Y25G0yX54/WlVB+IXprqBLOXHM1gsVF+QQSjlArhygna0Q==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz", + "integrity": "sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" } }, "@csstools/postcss-progressive-custom-properties": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.0.tgz", - "integrity": "sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz", + "integrity": "sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "@csstools/postcss-random-function": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.3.tgz", - "integrity": "sha512-dbNeEEPHxAwfQJ3duRL5IPpuD77QAHtRl4bAHRs0vOVhVbHrsL7mHnwe0irYjbs9kYwhAHZBQTLBgmvufPuRkA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "@csstools/postcss-relative-color-syntax": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.8.tgz", - "integrity": "sha512-eGE31oLnJDoUysDdjS9MLxNZdtqqSxjDXMdISpLh80QMaYrKs7VINpid34tWQ+iU23Wg5x76qAzf1Q/SLLbZVg==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.10.tgz", + "integrity": "sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" } }, @@ -27923,25 +26826,25 @@ } }, "@csstools/postcss-sign-functions": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.2.tgz", - "integrity": "sha512-4EcAvXTUPh7n6UoZZkCzgtCf/wPzMlTNuddcKg7HG8ozfQkUcHsJ2faQKeLmjyKdYPyOUn4YA7yDPf8K/jfIxw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "@csstools/postcss-stepped-value-functions": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.7.tgz", - "integrity": "sha512-rdrRCKRnWtj5FyRin0u/gLla7CIvZRw/zMGI1fVJP0Sg/m1WGicjPVHRANL++3HQtsiXKAbPrcPr+VkyGck0IA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "@csstools/postcss-text-decoration-shorthand": { @@ -27955,14 +26858,14 @@ } }, "@csstools/postcss-trigonometric-functions": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.7.tgz", - "integrity": "sha512-qTrZgLju3AV7Djhzuh2Bq/wjFqbcypnk0FhHjxW8DWJQcZLS1HecIus4X2/RLch1ukX7b+YYCdqbEnpIQO5ccg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "@csstools/postcss-unset-value": { @@ -28299,9 +27202,9 @@ "optional": true }, "@eslint-community/eslint-plugin-eslint-comments": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.4.1.tgz", - "integrity": "sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.5.0.tgz", + "integrity": "sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==", "dev": true, "requires": { "escape-string-regexp": "^4.0.0", @@ -28317,12 +27220,12 @@ } }, "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "requires": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" } }, "@eslint-community/regexpp": { @@ -28332,9 +27235,9 @@ "dev": true }, "@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "requires": { "@eslint/object-schema": "^2.1.6", @@ -28343,15 +27246,15 @@ } }, "@eslint/config-helpers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", - "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", "dev": true }, "@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "requires": { "@types/json-schema": "^7.0.15" @@ -28432,9 +27335,9 @@ } }, "@eslint/js": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", - "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "version": "9.30.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz", + "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==", "dev": true }, "@eslint/object-schema": { @@ -28444,44 +27347,44 @@ "dev": true }, "@eslint/plugin-kit": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", - "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, "requires": { - "@eslint/core": "^0.12.0", + "@eslint/core": "^0.14.0", "levn": "^0.4.1" } }, "@fontsource/noto-sans": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-5.2.6.tgz", - "integrity": "sha512-46D39T1/QJ16LSbCTaNjjrGS6Y69FMLS9FeHKsrXSQg15Z2MFqmlnNMpURx2l6Sr3x9t9EVdr3CAkHnZyvea+w==" + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-5.2.7.tgz", + "integrity": "sha512-mTpMSMft6Nb+ZSF4DSiJVYnLzKCRjHNFieZ/swuxSDQK+v1hjUeDTBxLHKUdfmC+ZPg6TUEWw4oRq2ltnDbSjQ==" }, "@fontsource/noto-sans-hk": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-5.2.5.tgz", - "integrity": "sha512-dQK+2kLRChvlbvsXadnvfjBy1+hQojKu/zobeLiKXquFWJis9CdwNIaxTFa4Khwsq8HzR9JzxGb6L1tSK6JWYw==" + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-5.2.6.tgz", + "integrity": "sha512-EF7rFuy8jPthjDK8ciFRdVseAs01B93zeE74m/O6F71p9UdIlE9AbtPaMfNHzvnTixYcnHbcxQzx72lSpwvrPg==" }, "@fontsource/noto-sans-jp": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.2.5.tgz", - "integrity": "sha512-ISoJUQlsuSo4y56P+eJD+g022BRAF1BC2uCyEFGRsob0g8VvQAoWNMlWh+P0VQw68QzZHHj41zRzeRFpzAdA7w==" + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.2.6.tgz", + "integrity": "sha512-BvUHYZKL87yWGRNFqInxDciU/Czp6klOEcB9l/6CnjMN77F5jc21r/A4XkMx46eY8FzVvfjCYTYUB4zExlX2Ww==" }, "@fontsource/noto-sans-kr": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-5.2.5.tgz", - "integrity": "sha512-9swPyua410J00z+GhemPKK/StWdiW07dchS9JcskesdQrhnPBLD6zVQtQsrj+ZPXTFBftbcrMlWFsWhmFn6S9w==" + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-5.2.6.tgz", + "integrity": "sha512-8yVWUzOT+El3PAqY8ZKvNatgzL7EgrvLoNp0GjYSLkgDKvvX+xaIZ34W8gfATjeXKmolj9lQN4TqADfPlbmUsg==" }, "@fontsource/noto-sans-sc": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-5.2.5.tgz", - "integrity": "sha512-rYAl3Alcjo2PnI0sqzRfnA022H8yWePNrjYalApQwYE+fFlaXmD6Mm3E9wmJCpmJM8clwhQWq/E8IlPl1bmZHQ==" + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-5.2.6.tgz", + "integrity": "sha512-hk0xVQ+mL/W0rXDhBhud2U5te/slsQKcaU+3Ni6ZxeFP1jJmcNmxHEZOG5DjLBOi0L//0R5Nwvn6ebTiZrwVZw==" }, "@fontsource/noto-sans-tc": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-5.2.5.tgz", - "integrity": "sha512-+qQKW1slXsS5H5AvsiBfNo7krmuxyKkb6vV2l/nE7Uyd5TBpaomub+kuIO3iwgLBtVOesSkl6HwtR4SNxry+FA==" + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-5.2.6.tgz", + "integrity": "sha512-cXpi78o0adtqz/7/3Onpp2u/O8G2XC4WufuT8EQjEu2Mvdq2WRgLZk/KOrhh7kH/3BSijbKnYUwQ5mTEvaSF5A==" }, "@humanfs/core": { "version": "0.19.1", @@ -28579,9 +27482,9 @@ "integrity": "sha512-C0OlBxIr9NdeFESMTA/OVDqNSWtog6Mi7wwzwH12xbZpxsMD0RgCupUcIP7zZgcpTNecW3fZq5d6xVo7Q8HEJw==" }, "@jellyfin/sdk": { - "version": "0.0.0-unstable.202504130507", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202504130507.tgz", - "integrity": "sha512-22acZbqDyAfjIJbKtEwEm+Sc/A1DKpP45tiz+Mx4iHDm4SBGGKRrIbJg2/2WDT7CUYQjoZAFTig7vr9trytPfA==", + "version": "0.0.0-unstable.202507090504", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202507090504.tgz", + "integrity": "sha512-znwTsY9+gyJDPmwFOET+rtZQ1QryziG6LFhGXPXPF1ltJspV4Ixk70ST1t925vvtXdpqoGqMu92OZWOqkiNLbg==", "requires": {} }, "@jellyfin/ux-web": { @@ -28744,26 +27647,26 @@ } }, "@mui/core-downloads-tracker": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.10.tgz", - "integrity": "sha512-cblGjlM6+xsptwyaALw8RbRIUoqmKxOqLxlk2LkTDhxqUuql1YSOKKLH3w+Yd2QLz28b7MR65sx1OjsRZUfOSQ==" + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.12.tgz", + "integrity": "sha512-M7IkG4LqSJfkY+thlQQHNkcS5NdmMDwLq/2RKoW40XR0mv/2BYb6X8fRnyaxP4zGdPD2M4MQdbzKihSVormJ7Q==" }, "@mui/icons-material": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.10.tgz", - "integrity": "sha512-c2KdFl4KZ0QYC+JSDTMCNjcuOL2rVSdIx/beo7FwJDh2e9XqC1MoLCjw6L1Jo40zbArkgJyg3oFORbXcRfgZOA==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.12.tgz", + "integrity": "sha512-ILTe3A2te0+Vb9TG4P1AZVmZFOjDDCV/b2nBmV1rNOmSu3Q/xkHghW+yMhMffwHcXklMlcajMlc4iFSkPbrTKw==", "requires": { "@babel/runtime": "^7.26.0" } }, "@mui/material": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.10.tgz", - "integrity": "sha512-L1B0+Vg9NFjo3NcfODH3bohl6fIkzjyDBHBHb3Al4QI7owaJrFm2sSDyfz++iatzICug6U6q5tHLQrCLO71xkg==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.12.tgz", + "integrity": "sha512-VqoLNS5UaNqoS1FybezZR/PaAvzbTmRe0Mx//afXbolIah43eozpX2FckaFffLvMoiSIyxx1+AMHyENTr2Es0Q==", "requires": { "@babel/runtime": "^7.26.0", - "@mui/core-downloads-tracker": "^6.4.10", - "@mui/system": "^6.4.10", + "@mui/core-downloads-tracker": "^6.4.12", + "@mui/system": "^6.4.12", "@mui/types": "~7.2.24", "@mui/utils": "^6.4.9", "@popperjs/core": "^2.11.8", @@ -28793,9 +27696,9 @@ } }, "@mui/styled-engine": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.9.tgz", - "integrity": "sha512-qZRWO0cT407NI4ZRjZcH+1SOu8f3JzLHqdMlg52GyEufM9pkSZFnf7xjpwnlvkixcGjco6wLlMD0VB43KRcBuA==", + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.11.tgz", + "integrity": "sha512-74AUmlHXaGNbyUqdK/+NwDJOZqgRQw6BcNvhoWYLq3LGbLTkE+khaJ7soz6cIabE4CPYqO2/QAIU1Z/HEjjpcw==", "requires": { "@babel/runtime": "^7.26.0", "@emotion/cache": "^11.13.5", @@ -28806,13 +27709,13 @@ } }, "@mui/system": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.10.tgz", - "integrity": "sha512-RyBGQwP3tgo4JEibK+RwVu1a6nQ6y8urMCNsb2aiN/nvTxxumq6P26aoG4GTUf8L4O1sthC4lMXlP4r8ixDkMg==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.12.tgz", + "integrity": "sha512-fgEfm1qxpKCztndESeL1L0sLwA2c7josZ2w42D8OM3pbLee4bH2twEjoMo6qf7z2rNw1Uc9EU9haXeMoq0oTdQ==", "requires": { "@babel/runtime": "^7.26.0", "@mui/private-theming": "^6.4.9", - "@mui/styled-engine": "^6.4.9", + "@mui/styled-engine": "^6.4.11", "@mui/types": "~7.2.24", "@mui/utils": "^6.4.9", "clsx": "^2.1.1", @@ -28847,13 +27750,13 @@ } }, "@mui/x-date-pickers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.28.3.tgz", - "integrity": "sha512-5umKB/DIMfDN+FAlzcrocix9PpoJDJ+5hMdlby8spTPObP4wCSN+wkEhk0vFC7qE9FAWXr4wjemaKvsNf41cCw==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.29.4.tgz", + "integrity": "sha512-wJ3tsqk/y6dp+mXGtT9czciAMEO5Zr3IIAHg9x6IL0Eqanqy0N3chbmQQZv3iq0m2qUpQDLvZ4utZBUTJdjNzw==", "requires": { "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", - "@mui/x-internals": "7.28.0", + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0", + "@mui/x-internals": "7.29.0", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -28861,12 +27764,12 @@ } }, "@mui/x-internals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.28.0.tgz", - "integrity": "sha512-p4GEp/09bLDumktdIMiw+OF4p+pJOOjTG0VUvzNxjbHB9GxbBKoMcHrmyrURqoBnQpWIeFnN/QAoLMFSpfwQbw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.29.0.tgz", + "integrity": "sha512-+Gk6VTZIFD70XreWvdXBwKd8GZ2FlSCuecQFzm6znwqXg1ZsndavrhG9tkxpxo2fM1Zf7Tk8+HcOO0hCbhTQFA==", "requires": { "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta" + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0" } }, "@nodelib/fs.scandir": { @@ -29058,135 +27961,142 @@ "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==" }, "@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", + "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", "dev": true, "optional": true }, "@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", + "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", "dev": true, "optional": true }, "@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", + "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", "dev": true, "optional": true }, "@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", "dev": true, "optional": true }, "@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", + "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", "dev": true, "optional": true }, "@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", + "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", + "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", + "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", "dev": true, "optional": true }, "@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", + "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", "dev": true, "optional": true }, "@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", + "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", + "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", + "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", "dev": true, "optional": true }, "@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", + "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", "dev": true, "optional": true }, "@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", + "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", "dev": true, "optional": true }, "@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", + "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", "dev": true, "optional": true }, @@ -29197,12 +28107,12 @@ "dev": true }, "@stylistic/eslint-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.2.0.tgz", - "integrity": "sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.4.1.tgz", + "integrity": "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==", "dev": true, "requires": { - "@typescript-eslint/utils": "^8.23.0", + "@typescript-eslint/utils": "^8.32.1", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "estraverse": "^5.3.0", @@ -29210,9 +28120,9 @@ }, "dependencies": { "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true }, "estraverse": { @@ -29230,19 +28140,19 @@ } }, "@stylistic/stylelint-plugin": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.2.tgz", - "integrity": "sha512-tylFJGMQo62alGazK74MNxFjMagYOHmBZiePZFOJK2n13JZta0uVkB3Bh5qodUmOLtRH+uxH297EibK14UKm8g==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.3.tgz", + "integrity": "sha512-85fsmzgsIVmyG3/GFrjuYj6Cz8rAM7IZiPiXCMiSMfoDOC1lOrzrXPDk24WqviAghnPqGpx8b0caK2PuewWGFg==", "dev": true, "requires": { "@csstools/css-parser-algorithms": "^3.0.1", "@csstools/css-tokenizer": "^3.0.1", "@csstools/media-query-list-parser": "^3.0.1", "is-plain-object": "^5.0.0", + "postcss": "^8.4.41", "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0", - "style-search": "^0.1.0", - "stylelint": "^16.8.2" + "style-search": "^0.1.0" }, "dependencies": { "is-plain-object": { @@ -29262,29 +28172,29 @@ } }, "@tanstack/query-core": { - "version": "5.71.10", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.71.10.tgz", - "integrity": "sha512-/fKEY8fO1nbszfrBatzmhJa1nEwIKn0c6Tv2A1ocSA5OiD2GukOIV8nnBbvJRgZb/VIoBy9/N4PVbABI8YQLow==" + "version": "5.80.10", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.10.tgz", + "integrity": "sha512-mUNQOtzxkjL6jLbyChZoSBP6A5gQDVRUiPvW+/zw/9ftOAz+H754zCj3D8PwnzPKyHzGkQ9JbH48ukhym9LK1Q==" }, "@tanstack/query-devtools": { - "version": "5.71.5", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.71.5.tgz", - "integrity": "sha512-Fq1JeAp+I52Md/KnyeFxzG7G0RpdHgeOfDNhSPkZQs/JqqXuAfpUf+wFHDz+vP0GZbSnla2JmcLSQebOkIb1yA==" + "version": "5.80.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.80.0.tgz", + "integrity": "sha512-D6gH4asyjaoXrCOt5vG5Og/YSj0D/TxwNQgtLJIgWbhbWCC/emu2E92EFoVHh4ppVWg1qT2gKHvKyQBEFZhCuA==" }, "@tanstack/react-query": { - "version": "5.71.10", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.71.10.tgz", - "integrity": "sha512-mQYM/ObpL8YMDz8vCoUuHkbe8Yu7NnVRH8aBaBa/3zlufjp1f1VuWjeO3TcumNHfuVMDwEAGinsgwrB7OKADiQ==", + "version": "5.80.10", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.80.10.tgz", + "integrity": "sha512-6zM098J8sLy9oU60XAdzUlAH4wVzoMVsWUWiiE/Iz4fd67PplxeyL4sw/MPcVJJVhbwGGXCsHn9GrQt2mlAzig==", "requires": { - "@tanstack/query-core": "5.71.10" + "@tanstack/query-core": "5.80.10" } }, "@tanstack/react-query-devtools": { - "version": "5.71.10", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.71.10.tgz", - "integrity": "sha512-n0xsIzwNvkIoZCmfHww28jFmnVTVzOt5dHj/py3LNFMJHGnJq9o9ttQESzVt2Hr7as00Aqf8ElVwH6na1o6dnw==", + "version": "5.80.10", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.80.10.tgz", + "integrity": "sha512-6JL63fSc7kxyGOLV2w466SxhMn/m7LZk/ximQciy6OpVt+n2A8Mq3S0QwhIzfm4WEwLK/F3OELfzRToQburnYA==", "requires": { - "@tanstack/query-devtools": "5.71.5" + "@tanstack/query-devtools": "5.80.0" } }, "@tanstack/react-table": { @@ -29338,6 +28248,15 @@ "@types/node": "*" } }, + "@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "requires": { + "@types/deep-eql": "*" + } + }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -29357,6 +28276,12 @@ "@types/node": "*" } }, + "@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true + }, "@types/dompurify": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", @@ -29393,9 +28318,9 @@ } }, "@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true }, "@types/express": { @@ -29513,15 +28438,6 @@ "@types/mdurl": "^2" } }, - "@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, - "requires": { - "@types/unist": "^2" - } - }, "@types/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", @@ -29540,12 +28456,6 @@ "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", "dev": true }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, "@types/node": { "version": "20.11.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.4.tgz", @@ -29564,12 +28474,6 @@ "@types/node": "*" } }, - "@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -29593,18 +28497,18 @@ "dev": true }, "@types/react": { - "version": "18.3.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", - "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", + "version": "18.3.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", + "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "@types/react-dom": { - "version": "18.3.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", - "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "requires": {} }, @@ -29723,83 +28627,111 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz", - "integrity": "sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", + "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.29.0", - "@typescript-eslint/type-utils": "8.29.0", - "@typescript-eslint/utils": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/type-utils": "8.35.1", + "@typescript-eslint/utils": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" + }, + "dependencies": { + "ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true + } } }, "@typescript-eslint/parser": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz", - "integrity": "sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", + "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.29.0", - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/typescript-estree": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/typescript-estree": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/project-service": { + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", + "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", + "dev": true, + "requires": { + "@typescript-eslint/tsconfig-utils": "^8.35.1", + "@typescript-eslint/types": "^8.35.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz", - "integrity": "sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", + "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", "dev": true, "requires": { - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0" + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1" } }, + "@typescript-eslint/tsconfig-utils": { + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", + "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", + "dev": true, + "requires": {} + }, "@typescript-eslint/type-utils": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz", - "integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", + "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "8.29.0", - "@typescript-eslint/utils": "8.29.0", + "@typescript-eslint/typescript-estree": "8.35.1", + "@typescript-eslint/utils": "8.35.1", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" } }, "@typescript-eslint/types": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", - "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", + "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz", - "integrity": "sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", + "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", "dev": true, "requires": { - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0", + "@typescript-eslint/project-service": "8.35.1", + "@typescript-eslint/tsconfig-utils": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "dependencies": { "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -29815,39 +28747,39 @@ } }, "semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true } } }, "@typescript-eslint/utils": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz", - "integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", + "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.29.0", - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/typescript-estree": "8.29.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/typescript-estree": "8.35.1" } }, "@typescript-eslint/visitor-keys": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz", - "integrity": "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", + "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", "dev": true, "requires": { - "@typescript-eslint/types": "8.29.0", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.35.1", + "eslint-visitor-keys": "^4.2.1" }, "dependencies": { "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true } } @@ -29859,95 +28791,98 @@ "dev": true }, "@vitest/coverage-v8": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.1.tgz", - "integrity": "sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", - "debug": "^4.4.0", + "ast-v8-to-istanbul": "^0.3.3", + "debug": "^4.4.1", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.1.7", "magic-string": "^0.30.17", "magicast": "^0.3.5", - "std-env": "^3.8.1", + "std-env": "^3.9.0", "test-exclude": "^7.0.1", "tinyrainbow": "^2.0.0" } }, "@vitest/expect": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.1.tgz", - "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "requires": { - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "@vitest/mocker": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.1.tgz", - "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "requires": { - "@vitest/spy": "3.1.1", + "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" } }, "@vitest/pretty-format": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", - "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "requires": { "tinyrainbow": "^2.0.0" } }, "@vitest/runner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.1.tgz", - "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "requires": { - "@vitest/utils": "3.1.1", - "pathe": "^2.0.3" + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" } }, "@vitest/snapshot": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.1.tgz", - "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "requires": { - "@vitest/pretty-format": "3.1.1", + "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "@vitest/spy": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.1.tgz", - "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "requires": { - "tinyspy": "^3.0.2" + "tinyspy": "^4.0.3" } }, "@vitest/utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz", - "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "requires": { - "@vitest/pretty-format": "3.1.1", - "loupe": "^3.1.3", + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, @@ -30157,9 +29092,9 @@ } }, "acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true }, "acorn-jsx": { @@ -30324,17 +29259,19 @@ "dev": true }, "array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "requires": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" } }, "array-union": { @@ -30373,29 +29310,30 @@ } }, "array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "requires": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" } }, "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" } }, "array.prototype.flatmap": { @@ -30471,6 +29409,25 @@ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, + "ast-v8-to-istanbul": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.3.tgz", + "integrity": "sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.25", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" + }, + "dependencies": { + "js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true + } + } + }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -30486,7 +29443,8 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "peer": true }, "atob": { "version": "2.1.2", @@ -30923,15 +29881,15 @@ } }, "browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" } }, "buffer": { @@ -31001,19 +29959,19 @@ } }, "cacheable": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.9.tgz", - "integrity": "sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.0.tgz", + "integrity": "sha512-SSgQTAnhd7WlJXnGlIi4jJJOiHzgnM5wRMEPaXAU4kECTAMpBoYKoZ9i5zHmclIEZbxcu3j7yY/CF8DTmwIsHg==", "dev": true, "requires": { - "hookified": "^1.7.1", - "keyv": "^5.3.1" + "hookified": "^1.8.2", + "keyv": "^5.3.3" }, "dependencies": { "keyv": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.2.tgz", - "integrity": "sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.3.tgz", + "integrity": "sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==", "dev": true, "requires": { "@keyv/serialize": "^1.0.3" @@ -31104,16 +30062,10 @@ "lodash.uniq": "^4.5.0" } }, - "caniuse-db": { - "version": "1.0.30001207", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001207.tgz", - "integrity": "sha512-vt1Y05aLuFE2CStt1+SHmZEJmOtf/Yn14lYhVbTGcqunHoNIspC1g6ybchbh1v6djHwQHzJpuPCsRdjaynLUKw==", - "dev": true - }, "caniuse-lite": { - "version": "1.0.30001706", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz", - "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==", + "version": "1.0.30001726", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", "dev": true }, "canvas": { @@ -31287,15 +30239,6 @@ "shallow-clone": "^3.0.0" } }, - "clone-regexp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", - "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", - "dev": true, - "requires": { - "is-regexp": "^2.0.0" - } - }, "clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -31390,6 +30333,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "peer": true, "requires": { "delayed-stream": "~1.0.0" } @@ -31550,9 +30494,9 @@ } }, "core-js": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", - "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==" + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz", + "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==" }, "core-js-compat": { "version": "3.40.0", @@ -31755,9 +30699,9 @@ "dev": true }, "cssdb": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.3.tgz", - "integrity": "sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.0.tgz", + "integrity": "sha512-c7bmItIg38DgGjSwDPZOYF/2o0QU/sSgkWOMyl8votOfgFuyiFKWPesmCGEsrGLxEA9uL540cp8LdaGEjUGsZQ==", "dev": true }, "cssesc": { @@ -31767,57 +30711,57 @@ "dev": true }, "cssnano": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", - "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.7.tgz", + "integrity": "sha512-evKu7yiDIF7oS+EIpwFlMF730ijRyLFaM2o5cTxRGJR9OKHKkc+qP443ZEVR9kZG0syaAJJCPJyfv5pbrxlSng==", "dev": true, "requires": { - "cssnano-preset-default": "^7.0.6", - "lilconfig": "^3.1.2" + "cssnano-preset-default": "^7.0.7", + "lilconfig": "^3.1.3" } }, "cssnano-preset-default": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", - "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.7.tgz", + "integrity": "sha512-jW6CG/7PNB6MufOrlovs1TvBTEVmhY45yz+bd0h6nw3h6d+1e+/TX+0fflZ+LzvZombbT5f+KC063w9VoHeHow==", "dev": true, "requires": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.0", - "postcss-calc": "^10.0.2", - "postcss-colormin": "^7.0.2", - "postcss-convert-values": "^7.0.4", - "postcss-discard-comments": "^7.0.3", - "postcss-discard-duplicates": "^7.0.1", - "postcss-discard-empty": "^7.0.0", - "postcss-discard-overridden": "^7.0.0", - "postcss-merge-longhand": "^7.0.4", - "postcss-merge-rules": "^7.0.4", - "postcss-minify-font-values": "^7.0.0", - "postcss-minify-gradients": "^7.0.0", - "postcss-minify-params": "^7.0.2", - "postcss-minify-selectors": "^7.0.4", - "postcss-normalize-charset": "^7.0.0", - "postcss-normalize-display-values": "^7.0.0", - "postcss-normalize-positions": "^7.0.0", - "postcss-normalize-repeat-style": "^7.0.0", - "postcss-normalize-string": "^7.0.0", - "postcss-normalize-timing-functions": "^7.0.0", - "postcss-normalize-unicode": "^7.0.2", - "postcss-normalize-url": "^7.0.0", - "postcss-normalize-whitespace": "^7.0.0", - "postcss-ordered-values": "^7.0.1", - "postcss-reduce-initial": "^7.0.2", - "postcss-reduce-transforms": "^7.0.0", - "postcss-svgo": "^7.0.1", - "postcss-unique-selectors": "^7.0.3" + "cssnano-utils": "^5.0.1", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^7.0.3", + "postcss-convert-values": "^7.0.5", + "postcss-discard-comments": "^7.0.4", + "postcss-discard-duplicates": "^7.0.2", + "postcss-discard-empty": "^7.0.1", + "postcss-discard-overridden": "^7.0.1", + "postcss-merge-longhand": "^7.0.5", + "postcss-merge-rules": "^7.0.5", + "postcss-minify-font-values": "^7.0.1", + "postcss-minify-gradients": "^7.0.1", + "postcss-minify-params": "^7.0.3", + "postcss-minify-selectors": "^7.0.5", + "postcss-normalize-charset": "^7.0.1", + "postcss-normalize-display-values": "^7.0.1", + "postcss-normalize-positions": "^7.0.1", + "postcss-normalize-repeat-style": "^7.0.1", + "postcss-normalize-string": "^7.0.1", + "postcss-normalize-timing-functions": "^7.0.1", + "postcss-normalize-unicode": "^7.0.3", + "postcss-normalize-url": "^7.0.1", + "postcss-normalize-whitespace": "^7.0.1", + "postcss-ordered-values": "^7.0.2", + "postcss-reduce-initial": "^7.0.3", + "postcss-reduce-transforms": "^7.0.1", + "postcss-svgo": "^7.0.2", + "postcss-unique-selectors": "^7.0.4" } }, "cssnano-utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", - "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", + "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", "dev": true, "requires": {} }, @@ -31945,9 +30889,9 @@ "dev": true }, "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "requires": { "ms": "^2.1.3" } @@ -31977,9 +30921,9 @@ } }, "decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", "dev": true }, "decode-uri-component": { @@ -32128,7 +31072,8 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "peer": true }, "delegates": { "version": "1.0.0", @@ -32300,11 +31245,16 @@ "dev": true }, "electron-to-chromium": { - "version": "1.5.102", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", - "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==", + "version": "1.5.176", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.176.tgz", + "integrity": "sha512-2nDK9orkm7M9ZZkjO3PjbEd3VUulQLyg5T9O3enJdFvUg46Hzd4DUvTvAuEgbdHYXyFsiG4A5sO9IzToMH1cDg==", "dev": true }, + "element-closest-polyfill": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/element-closest-polyfill/-/element-closest-polyfill-1.0.7.tgz", + "integrity": "sha512-SX7RrUUEybUllkGjVf5XJR5I0Fl2L0iawK/caX/yJu94xW/WoRRD8Fky65gKpvqhU9PLBKOliIy4Ly2rDRzdUQ==" + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -32393,27 +31343,27 @@ } }, "es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -32425,21 +31375,24 @@ "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", + "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", + "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -32448,27 +31401,30 @@ "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" + "which-typed-array": "^1.1.19" } }, "es-check": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/es-check/-/es-check-8.0.2.tgz", - "integrity": "sha512-m/8jzwE6rasRx+Lhz7J5OIZzt2LmEC53kBPkUqQHk/6BMjo77HoHsdoQKeps8mgLASlb8nRuKZnuRai/iZHrHg==", + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/es-check/-/es-check-9.1.4.tgz", + "integrity": "sha512-oCElzPyMZTm7IpCbdBslOjPdpI3uoccctPVTJLJyi34k+nXSaqApMAfm0yleEKTyPGXkmtWwPFBSyN22cKUhJw==", "dev": true, "requires": { - "acorn": "8.14.0", + "acorn": "8.14.1", "acorn-walk": "^8.3.4", - "commander": "13.1.0", + "browserslist": "^4.23.3", + "commander": "14.0.0", "fast-glob": "^3.3.3", + "lilconfig": "^3.1.3", + "source-map": "^0.7.4", "supports-color": "8.1.1", "winston": "3.17.0" }, "dependencies": { "commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", "dev": true }, "has-flag": { @@ -32477,6 +31433,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -32523,9 +31485,9 @@ } }, "es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true }, "es-object-atoms": { @@ -32548,12 +31510,12 @@ } }, "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "requires": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" } }, "es-to-primitive": { @@ -32652,19 +31614,19 @@ "dev": true }, "eslint": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", - "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", + "version": "9.30.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz", + "integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.24.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.30.1", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -32675,9 +31637,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -32747,9 +31709,9 @@ "dev": true }, "eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -32757,9 +31719,9 @@ } }, "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true }, "estraverse": { @@ -32768,15 +31730,6 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, - "file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "requires": { - "flat-cache": "^4.0.0" - } - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -32787,16 +31740,6 @@ "path-exists": "^4.0.0" } }, - "flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - } - }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -32890,9 +31833,9 @@ } }, "eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "requires": { "debug": "^3.2.7" @@ -32977,29 +31920,29 @@ } }, "eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "requires": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "dependencies": { @@ -33098,9 +32041,9 @@ "requires": {} }, "eslint-plugin-sonarjs": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.2.tgz", - "integrity": "sha512-LxjbfwI7ypENeTmGyKmDyNux3COSkMi7H/6Cal5StSLQ6edf0naP45SZR43OclaNR7WfhVTZdhOn63q3/Y6puQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.4.tgz", + "integrity": "sha512-ftQcP811kRJNXapqpQXHErEoVOdTPfYPPYd7n3AExIPwv4qWKKHf4slFvXmodiOnfgy1Tl3waPZZLD7lcvJOtw==", "dev": true, "requires": { "@eslint-community/regexpp": "4.12.1", @@ -33108,16 +32051,17 @@ "bytes": "3.1.2", "functional-red-black-tree": "1.0.1", "jsx-ast-utils": "3.3.5", + "lodash.merge": "4.6.2", "minimatch": "9.0.5", "scslre": "0.3.0", - "semver": "7.7.1", - "typescript": "^5" + "semver": "7.7.2", + "typescript": ">=5" }, "dependencies": { "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -33139,9 +32083,9 @@ } }, "semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true } } @@ -33163,20 +32107,26 @@ "dev": true }, "espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "requires": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "dependencies": { + "acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true + }, "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true } } @@ -33269,15 +32219,6 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "execall": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", - "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", - "dev": true, - "requires": { - "clone-regexp": "^2.1.0" - } - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -33603,12 +32544,12 @@ "dev": true }, "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "requires": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" } }, "fill-range": { @@ -33680,25 +32621,13 @@ "dev": true }, "flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "requires": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "keyv": "^4.5.4" } }, "flatted": { @@ -33707,12 +32636,6 @@ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, "flv.js": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/flv.js/-/flv.js-1.6.2.tgz", @@ -33734,12 +32657,12 @@ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "requires": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" } }, "for-in": { @@ -33953,6 +32876,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "peer": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -34076,12 +33000,6 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, - "gather-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", - "integrity": "sha1-szmUr0V6gRVwDUEPMXczy+egkEs=", - "dev": true - }, "gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -34131,12 +33049,6 @@ "es-object-atoms": "^1.0.0" } }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true - }, "get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -34223,9 +33135,9 @@ } }, "globals": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", - "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true }, "globalthis": { @@ -34306,29 +33218,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - } - } - }, "has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -34469,9 +33358,9 @@ } }, "hls.js": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.1.tgz", - "integrity": "sha512-7GOkcqn0Y9EqU2OJZlzkwxj9Uynuln7URvr7dRjgqNJNZ5UbbjL/v1BjAvQogy57Psdd/ek1u2s6IDEFYlabrA==" + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.5.tgz", + "integrity": "sha512-KMn5n7JBK+olC342740hDPHnGWfE8FiHtGMOdJPfUjRdARTWj9OB+8c13fnsf9sk1VtpuU2fKSgUjHvg4rNbzQ==" }, "hoist-non-react-statics": { "version": "3.3.2", @@ -34482,9 +33371,9 @@ } }, "hookified": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.8.1.tgz", - "integrity": "sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.9.1.tgz", + "integrity": "sha512-u3pxtGhKjcSXnGm1CX6aXS9xew535j3lkOCegbA6jdyh0BaAjTbXI4aslKstCr6zUNtoCxFGFKwjbSHdGrMB8g==", "dev": true }, "hosted-git-info": { @@ -34704,9 +33593,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, "requires": { "@types/http-proxy": "^1.17.8", @@ -34789,12 +33678,6 @@ "resolve-from": "^3.0.0" } }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -34866,12 +33749,6 @@ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -34989,9 +33866,9 @@ "dev": true }, "is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "requires": { "hasown": "^2.0.2" } @@ -35149,6 +34026,12 @@ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, "is-network-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", @@ -35234,12 +34117,6 @@ "hasown": "^2.0.2" } }, - "is-regexp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", - "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", - "dev": true - }, "is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -35297,18 +34174,6 @@ "which-typed-array": "^1.1.16" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, "is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -35316,12 +34181,12 @@ "dev": true }, "is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "requires": { - "call-bound": "^1.0.2" + "call-bound": "^1.0.3" } }, "is-weakset": { @@ -35506,12 +34371,6 @@ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -35528,15 +34387,14 @@ } }, "jsdom": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", - "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "requires": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.1", + "decimal.js": "^10.5.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", @@ -35546,12 +34404,12 @@ "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^5.0.0", + "tough-cookie": "^5.1.1", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.0", + "whatwg-url": "^14.1.1", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" } @@ -35663,9 +34521,9 @@ "dev": true }, "known-css-properties": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", - "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", + "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", "dev": true }, "kuler": { @@ -35737,9 +34595,9 @@ } }, "lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true }, "lines-and-columns": { @@ -35833,57 +34691,6 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", - "dev": true, - "requires": { - "chalk": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - } - } - }, "logform": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", @@ -35923,9 +34730,9 @@ } }, "loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", + "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", "dev": true }, "lower-case": { @@ -35937,15 +34744,6 @@ "tslib": "^2.0.3" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", @@ -35981,12 +34779,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -36074,39 +34866,6 @@ "unist-util-visit": "^1.1.0" } }, - "mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - } - }, - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "dev": true - }, "mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -36163,16 +34922,6 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, - "micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "dev": true, - "requires": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, "micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -36210,12 +34959,6 @@ "optional": true, "peer": true }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, "mini-css-extract-plugin": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", @@ -36247,17 +34990,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, "minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", @@ -36341,9 +35073,9 @@ "optional": true }, "nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true }, "nanomatch": { @@ -36613,9 +35345,9 @@ } }, "object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true }, "object-keys": { @@ -36862,20 +35594,6 @@ } } }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -37107,15 +35825,6 @@ "find-up": "^4.0.0" } }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "requires": { - "irregular-plurals": "^1.0.0" - } - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -37129,12 +35838,12 @@ "dev": true }, "postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "requires": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } @@ -37161,13 +35870,25 @@ } }, "postcss-calc": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", - "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", "dev": true, "requires": { - "postcss-selector-parser": "^6.1.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-clamp": { @@ -37180,15 +35901,15 @@ } }, "postcss-color-functional-notation": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.8.tgz", - "integrity": "sha512-S/TpMKVKofNvsxfau/+bw+IA6cSfB6/kmzFj5szUofHOVnFFMB2WwK+Zu07BeMD8T0n+ZnTO5uXiMvAKe2dPkA==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.10.tgz", + "integrity": "sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" } }, @@ -37213,70 +35934,70 @@ } }, "postcss-colormin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", - "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.3.tgz", + "integrity": "sha512-xZxQcSyIVZbSsl1vjoqZAcMYYdnJsIyG8OvqShuuqf12S88qQboxxEy0ohNCOLwVPXTU+hFHvJPACRL2B5ohTA==", "dev": true, "requires": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "caniuse-api": "^3.0.0", "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" } }, "postcss-convert-values": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz", - "integrity": "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.5.tgz", + "integrity": "sha512-0VFhH8nElpIs3uXKnVtotDJJNX0OGYSZmdt4XfSfvOMrFw1jKfpwpZxfC4iN73CTM/MWakDEmsHQXkISYj4BXw==", "dev": true, "requires": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "postcss-value-parser": "^4.2.0" } }, "postcss-custom-media": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", - "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", "dev": true, "requires": { - "@csstools/cascade-layer-name-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2" + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "dependencies": { "@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "requires": {} } } }, "postcss-custom-properties": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", - "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", "dev": true, "requires": { - "@csstools/cascade-layer-name-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" } }, "postcss-custom-selectors": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", - "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", "dev": true, "requires": { - "@csstools/cascade-layer-name-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", "postcss-selector-parser": "^7.0.0" }, "dependencies": { @@ -37314,42 +36035,54 @@ } }, "postcss-discard-comments": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz", - "integrity": "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz", + "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==", "dev": true, "requires": { - "postcss-selector-parser": "^6.1.2" + "postcss-selector-parser": "^7.1.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-discard-duplicates": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", - "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", + "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", "dev": true, "requires": {} }, "postcss-discard-empty": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", - "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", + "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", "dev": true, "requires": {} }, "postcss-discard-overridden": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", - "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", + "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", "dev": true, "requires": {} }, "postcss-double-position-gradients": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.0.tgz", - "integrity": "sha512-JkIGah3RVbdSEIrcobqj4Gzq0h53GG4uqDPsho88SgY84WnpkTpI0k50MFK/sX7XqVisZ6OqUfFnoUO6m1WWdg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.2.tgz", + "integrity": "sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q==", "dev": true, "requires": { - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" } @@ -37481,15 +36214,15 @@ } }, "postcss-lab-function": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.8.tgz", - "integrity": "sha512-plV21I86Hg9q8omNz13G9fhPtLopIWH06bt/Cb5cs1XnaGU2kUtEitvVd4vtQb/VqCdNUHK5swKn3QFmMRbpDg==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.10.tgz", + "integrity": "sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.8", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" } }, @@ -37760,66 +36493,90 @@ "dev": true }, "postcss-merge-longhand": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz", - "integrity": "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", + "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.4" + "stylehacks": "^7.0.5" } }, "postcss-merge-rules": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", - "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.5.tgz", + "integrity": "sha512-ZonhuSwEaWA3+xYbOdJoEReKIBs5eDiBVLAGpYZpNFPzXZcEE5VKR7/qBEQvTZpiwjqhhqEQ+ax5O3VShBj9Wg==", "dev": true, "requires": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.0", - "postcss-selector-parser": "^6.1.2" + "cssnano-utils": "^5.0.1", + "postcss-selector-parser": "^7.1.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-minify-font-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", - "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", + "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", - "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", + "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", "dev": true, "requires": { "colord": "^2.9.3", - "cssnano-utils": "^5.0.0", + "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-params": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", - "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.3.tgz", + "integrity": "sha512-vUKV2+f5mtjewYieanLX0xemxIp1t0W0H/D11u+kQV/MWdygOO7xPMkbK+r9P6Lhms8MgzKARF/g5OPXhb8tgg==", "dev": true, "requires": { - "browserslist": "^4.23.3", - "cssnano-utils": "^5.0.0", + "browserslist": "^4.24.5", + "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz", - "integrity": "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", + "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", "dev": true, "requires": { "cssesc": "^3.0.0", - "postcss-selector-parser": "^6.1.2" + "postcss-selector-parser": "^7.1.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-modules-extract-imports": { @@ -37859,20 +36616,20 @@ } }, "postcss-nesting": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", - "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", "dev": true, "requires": { - "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-resolve-nested": "^3.1.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, "dependencies": { "@csstools/selector-resolve-nested": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", - "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", "dev": true, "requires": {} }, @@ -37896,80 +36653,80 @@ } }, "postcss-normalize-charset": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", - "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", + "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", "dev": true, "requires": {} }, "postcss-normalize-display-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", - "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", + "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-positions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", - "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", + "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", - "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", + "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", - "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", + "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-timing-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", - "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", + "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-unicode": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", - "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.3.tgz", + "integrity": "sha512-EcoA29LvG3F+EpOh03iqu+tJY3uYYKzArqKJHxDhUYLa2u58aqGq16K6/AOsXD9yqLN8O6y9mmePKN5cx6krOw==", "dev": true, "requires": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", - "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", + "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-whitespace": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", - "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", + "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -37983,12 +36740,12 @@ "requires": {} }, "postcss-ordered-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", - "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", + "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", "dev": true, "requires": { - "cssnano-utils": "^5.0.0", + "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -38018,67 +36775,68 @@ } }, "postcss-preset-env": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.5.tgz", - "integrity": "sha512-LQybafF/K7H+6fAs4SIkgzkSCixJy0/h0gubDIAP3Ihz+IQBRwsjyvBnAZ3JUHD+A/ITaxVRPDxn//a3Qy4pDw==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.3.tgz", + "integrity": "sha512-zlQN1yYmA7lFeM1wzQI14z97mKoM8qGng+198w1+h6sCud/XxOjcKtApY9jWr7pXNS3yHDEafPlClSsWnkY8ow==", "dev": true, "requires": { "@csstools/postcss-cascade-layers": "^5.0.1", - "@csstools/postcss-color-function": "^4.0.8", - "@csstools/postcss-color-mix-function": "^3.0.8", - "@csstools/postcss-content-alt-text": "^2.0.4", - "@csstools/postcss-exponential-functions": "^2.0.7", + "@csstools/postcss-color-function": "^4.0.10", + "@csstools/postcss-color-mix-function": "^3.0.10", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.0", + "@csstools/postcss-content-alt-text": "^2.0.6", + "@csstools/postcss-exponential-functions": "^2.0.9", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.8", - "@csstools/postcss-gradients-interpolation-method": "^5.0.8", - "@csstools/postcss-hwb-function": "^4.0.8", - "@csstools/postcss-ic-unit": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.10", + "@csstools/postcss-gradients-interpolation-method": "^5.0.10", + "@csstools/postcss-hwb-function": "^4.0.10", + "@csstools/postcss-ic-unit": "^4.0.2", "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.1", - "@csstools/postcss-light-dark-function": "^2.0.7", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.9", "@csstools/postcss-logical-float-and-clear": "^3.0.0", "@csstools/postcss-logical-overflow": "^2.0.0", "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.3", - "@csstools/postcss-media-minmax": "^2.0.7", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.8", - "@csstools/postcss-progressive-custom-properties": "^4.0.0", - "@csstools/postcss-random-function": "^1.0.3", - "@csstools/postcss-relative-color-syntax": "^3.0.8", + "@csstools/postcss-oklab-function": "^4.0.10", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.10", "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.2", - "@csstools/postcss-stepped-value-functions": "^4.0.7", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", "@csstools/postcss-text-decoration-shorthand": "^4.0.2", - "@csstools/postcss-trigonometric-functions": "^4.0.7", + "@csstools/postcss-trigonometric-functions": "^4.0.9", "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.19", - "browserslist": "^4.24.4", + "autoprefixer": "^10.4.21", + "browserslist": "^4.25.0", "css-blank-pseudo": "^7.0.1", "css-has-pseudo": "^7.0.2", "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.2.3", + "cssdb": "^8.3.0", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.8", + "postcss-color-functional-notation": "^7.0.10", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.5", - "postcss-custom-properties": "^14.0.4", - "postcss-custom-selectors": "^8.0.4", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.0", + "postcss-double-position-gradients": "^6.0.2", "postcss-focus-visible": "^10.0.1", "postcss-focus-within": "^9.0.1", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.8", + "postcss-lab-function": "^7.0.10", "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.1", + "postcss-nesting": "^13.0.2", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", "postcss-page-break": "^3.0.4", @@ -38110,19 +36868,19 @@ } }, "postcss-reduce-initial": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", - "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.3.tgz", + "integrity": "sha512-RFvkZaqiWtGMlVjlUHpaxGqEL27lgt+Q2Ixjf83CRAzqdo+TsDyGPtJUbPx2MuYIJ+sCQc2TrOvRnhcXQfgIVA==", "dev": true, "requires": { - "browserslist": "^4.23.3", + "browserslist": "^4.24.5", "caniuse-api": "^3.0.0" } }, "postcss-reduce-transforms": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", - "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", + "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -38227,40 +36985,6 @@ } } }, - "postcss-sass": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", - "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", - "dev": true, - "requires": { - "gonzales-pe": "^4.3.0", - "postcss": "^7.0.21" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "postcss-scss": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", @@ -38338,9 +37062,9 @@ } }, "postcss-svgo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", - "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.2.tgz", + "integrity": "sha512-5Dzy66JlnRM6pkdOTF8+cGsB1fnERTE8Nc+Eed++fOWo1hdsBptCsbG8UuJkgtZt75bRtMJIrPeZmtfANixdFA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", @@ -38355,12 +37079,24 @@ "requires": {} }, "postcss-unique-selectors": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz", - "integrity": "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", + "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", "dev": true, "requires": { - "postcss-selector-parser": "^6.1.2" + "postcss-selector-parser": "^7.1.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-value-parser": { @@ -38446,6 +37182,11 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "peer": true }, + "proxy-polyfill": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/proxy-polyfill/-/proxy-polyfill-0.3.2.tgz", + "integrity": "sha512-ENKSXOMCewnQTOyqrQXxEjIhzT6dy572mtehiItbDoIUF5Sv5UkmRUc8kowg2MFvr232Uo8rwRpNg3V5kgTKbA==" + }, "pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -38590,20 +37331,20 @@ } }, "react-router": { - "version": "6.30.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", - "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", "requires": { "@remix-run/router": "1.23.0" } }, "react-router-dom": { - "version": "6.30.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", - "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", "requires": { "@remix-run/router": "1.23.0", - "react-router": "6.30.0" + "react-router": "6.30.1" } }, "react-transition-group": { @@ -38617,15 +37358,6 @@ "prop-types": "^15.6.2" } }, - "read-file-stdin": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/read-file-stdin/-/read-file-stdin-0.2.1.tgz", - "integrity": "sha1-JezP86FTtoCa+ssj7hU4fbng7mE=", - "dev": true, - "requires": { - "gather-stream": "^1.0.0" - } - }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -38703,15 +37435,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -38781,35 +37504,6 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, - "remark": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", - "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", - "dev": true, - "requires": { - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.0", - "unified": "^9.1.0" - } - }, - "remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "dev": true, - "requires": { - "mdast-util-from-markdown": "^0.8.0" - } - }, - "remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "dev": true, - "requires": { - "mdast-util-to-markdown": "^0.6.0" - } - }, "remove-accents": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", @@ -38929,31 +37623,32 @@ } }, "rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", "dev": true, "requires": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", - "@types/estree": "1.0.6", + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", + "@types/estree": "1.0.7", "fsevents": "~2.3.2" } }, @@ -39064,9 +37759,9 @@ "dev": true }, "sass": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.3.tgz", - "integrity": "sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", + "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", "dev": true, "requires": { "@parcel/watcher": "^2.4.1", @@ -39093,36 +37788,32 @@ } }, "sass-embedded": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.86.3.tgz", - "integrity": "sha512-3pZSp24ibO1hdopj+W9DuiWsZOb2YY6AFRo/jjutKLBkqJGM1nJjXzhAYfzRV+Xn5BX1eTI4bBTE09P0XNHOZg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.89.2.tgz", + "integrity": "sha512-Ack2K8rc57kCFcYlf3HXpZEJFNUX8xd8DILldksREmYXQkRHI879yy8q4mRDJgrojkySMZqmmmW1NxrFxMsYaA==", "optional": true, "requires": { - "@bufbuild/protobuf": "^2.0.0", + "@bufbuild/protobuf": "^2.5.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", "immutable": "^5.0.2", "rxjs": "^7.4.0", - "sass-embedded-android-arm": "1.86.3", - "sass-embedded-android-arm64": "1.86.3", - "sass-embedded-android-ia32": "1.86.3", - "sass-embedded-android-riscv64": "1.86.3", - "sass-embedded-android-x64": "1.86.3", - "sass-embedded-darwin-arm64": "1.86.3", - "sass-embedded-darwin-x64": "1.86.3", - "sass-embedded-linux-arm": "1.86.3", - "sass-embedded-linux-arm64": "1.86.3", - "sass-embedded-linux-ia32": "1.86.3", - "sass-embedded-linux-musl-arm": "1.86.3", - "sass-embedded-linux-musl-arm64": "1.86.3", - "sass-embedded-linux-musl-ia32": "1.86.3", - "sass-embedded-linux-musl-riscv64": "1.86.3", - "sass-embedded-linux-musl-x64": "1.86.3", - "sass-embedded-linux-riscv64": "1.86.3", - "sass-embedded-linux-x64": "1.86.3", - "sass-embedded-win32-arm64": "1.86.3", - "sass-embedded-win32-ia32": "1.86.3", - "sass-embedded-win32-x64": "1.86.3", + "sass-embedded-android-arm": "1.89.2", + "sass-embedded-android-arm64": "1.89.2", + "sass-embedded-android-riscv64": "1.89.2", + "sass-embedded-android-x64": "1.89.2", + "sass-embedded-darwin-arm64": "1.89.2", + "sass-embedded-darwin-x64": "1.89.2", + "sass-embedded-linux-arm": "1.89.2", + "sass-embedded-linux-arm64": "1.89.2", + "sass-embedded-linux-musl-arm": "1.89.2", + "sass-embedded-linux-musl-arm64": "1.89.2", + "sass-embedded-linux-musl-riscv64": "1.89.2", + "sass-embedded-linux-musl-x64": "1.89.2", + "sass-embedded-linux-riscv64": "1.89.2", + "sass-embedded-linux-x64": "1.89.2", + "sass-embedded-win32-arm64": "1.89.2", + "sass-embedded-win32-x64": "1.89.2", "supports-color": "^8.1.1", "sync-child-process": "^1.0.2", "varint": "^6.0.0" @@ -39146,123 +37837,99 @@ } }, "sass-embedded-android-arm": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.86.3.tgz", - "integrity": "sha512-UyeXrFzZSvrGbvrWUBcspbsbivGgAgebLGJdSqJulgSyGbA6no3DWQ5Qpdd6+OAUC39BlpPu74Wx9s4RrVuaFw==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.89.2.tgz", + "integrity": "sha512-oHAPTboBHRZlDBhyRB6dvDKh4KvFs+DZibDHXbkSI6dBZxMTT+Yb2ivocHnctVGucKTLQeT7+OM5DjWHyynL/A==", "optional": true }, "sass-embedded-android-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.86.3.tgz", - "integrity": "sha512-q+XwFp6WgAv+UgnQhsB8KQ95kppvWAB7DSoJp+8Vino8b9ND+1ai3cUUZPE5u4SnLZrgo5NtrbPvN5KLc4Pfyg==", - "optional": true - }, - "sass-embedded-android-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.86.3.tgz", - "integrity": "sha512-gTJjVh2cRzvGujXj5ApPk/owUTL5SiO7rDtNLrzYAzi1N5HRuLYXqk3h1IQY3+eCOBjGl7mQ9XyySbJs/3hDvg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.89.2.tgz", + "integrity": "sha512-+pq7a7AUpItNyPu61sRlP6G2A8pSPpyazASb+8AK2pVlFayCSPAEgpwpCE9A2/Xj86xJZeMizzKUHxM2CBCUxA==", "optional": true }, "sass-embedded-android-riscv64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.86.3.tgz", - "integrity": "sha512-Po3JnyiCS16kd6REo1IMUbFGYtvL9O0rmKaXx5vOuBaJD1LPy2LiSSp7TU7wkJ9IxsTDGzFaSeP1I9qb6D8VVg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.89.2.tgz", + "integrity": "sha512-HfJJWp/S6XSYvlGAqNdakeEMPOdhBkj2s2lN6SHnON54rahKem+z9pUbCriUJfM65Z90lakdGuOfidY61R9TYg==", "optional": true }, "sass-embedded-android-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.86.3.tgz", - "integrity": "sha512-+7h3jdDv/0kUFx0BvxYlq2fa7CcHiDPlta6k5OxO5K6jyqJwo9hc0Z052BoYEauWTqZ+vK6bB5rv2BIzq4U9nA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.89.2.tgz", + "integrity": "sha512-BGPzq53VH5z5HN8de6jfMqJjnRe1E6sfnCWFd4pK+CAiuM7iw5Fx6BQZu3ikfI1l2GY0y6pRXzsVLdp/j4EKEA==", "optional": true }, "sass-embedded-darwin-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.86.3.tgz", - "integrity": "sha512-EgLwV4ORm5Hr0DmIXo0Xw/vlzwLnfAiqD2jDXIglkBsc5czJmo4/IBdGXOP65TRnsgJEqvbU3aQhuawX5++x9A==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.89.2.tgz", + "integrity": "sha512-UCm3RL/tzMpG7DsubARsvGUNXC5pgfQvP+RRFJo9XPIi6elopY5B6H4m9dRYDpHA+scjVthdiDwkPYr9+S/KGw==", "optional": true }, "sass-embedded-darwin-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.86.3.tgz", - "integrity": "sha512-dfKhfrGPRNLWLC82vy/vQGmNKmAiKWpdFuWiePRtg/E95pqw+sCu6080Y6oQLfFu37Iq3MpnXiSpDuSo7UnPWA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.89.2.tgz", + "integrity": "sha512-D9WxtDY5VYtMApXRuhQK9VkPHB8R79NIIR6xxVlN2MIdEid/TZWi1MHNweieETXhWGrKhRKglwnHxxyKdJYMnA==", "optional": true }, "sass-embedded-linux-arm": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.86.3.tgz", - "integrity": "sha512-+fVCIH+OR0SMHn2NEhb/VfbpHuUxcPtqMS34OCV3Ka99LYZUJZqth4M3lT/ppGl52mwIVLNYzR4iLe6mdZ6mYA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.89.2.tgz", + "integrity": "sha512-leP0t5U4r95dc90o8TCWfxNXwMAsQhpWxTkdtySDpngoqtTy3miMd7EYNYd1znI0FN1CBaUvbdCMbnbPwygDlA==", "optional": true }, "sass-embedded-linux-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.86.3.tgz", - "integrity": "sha512-tYq5rywR53Qtc+0KI6pPipOvW7a47ETY69VxfqI9BR2RKw2hBbaz0bIw6OaOgEBv2/XNwcWb7a4sr7TqgkqKAA==", - "optional": true - }, - "sass-embedded-linux-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.86.3.tgz", - "integrity": "sha512-CmQ5OkqnaeLdaF+bMqlYGooBuenqm3LvEN9H8BLhjkpWiFW8hnYMetiqMcJjhrXLvDw601KGqA5sr/Rsg5s45g==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.89.2.tgz", + "integrity": "sha512-2N4WW5LLsbtrWUJ7iTpjvhajGIbmDR18ZzYRywHdMLpfdPApuHPMDF5CYzHbS+LLx2UAx7CFKBnj5LLjY6eFgQ==", "optional": true }, "sass-embedded-linux-musl-arm": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.86.3.tgz", - "integrity": "sha512-SEm65SQknI4pl+mH5Xf231hOkHJyrlgh5nj4qDbiBG6gFeutaNkNIeRgKEg3cflXchCr8iV/q/SyPgjhhzQb7w==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.89.2.tgz", + "integrity": "sha512-Z6gG2FiVEEdxYHRi2sS5VIYBmp17351bWtOCUZ/thBM66+e70yiN6Eyqjz80DjL8haRUegNQgy9ZJqsLAAmr9g==", "optional": true }, "sass-embedded-linux-musl-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.86.3.tgz", - "integrity": "sha512-4zOr2C/eW89rxb4ozTfn7lBzyyM5ZigA1ZSRTcAR26Qbg/t2UksLdGnVX9/yxga0d6aOi0IvO/7iM2DPPRRotg==", - "optional": true - }, - "sass-embedded-linux-musl-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.86.3.tgz", - "integrity": "sha512-84Tcld32LB1loiqUvczWyVBQRCChm0wNLlkT59qF29nxh8njFIVf9yaPgXcSyyjpPoD9Tu0wnq3dvVzoMCh9AQ==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.89.2.tgz", + "integrity": "sha512-nTyuaBX6U1A/cG7WJh0pKD1gY8hbg1m2SnzsyoFG+exQ0lBX/lwTLHq3nyhF+0atv7YYhYKbmfz+sjPP8CZ9lw==", "optional": true }, "sass-embedded-linux-musl-riscv64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.86.3.tgz", - "integrity": "sha512-IxEqoiD7vdNpiOwccybbV93NljBy64wSTkUOknGy21SyV43C8uqESOwTwW9ywa3KufImKm8L3uQAW/B0KhJMWg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.89.2.tgz", + "integrity": "sha512-N6oul+qALO0SwGY8JW7H/Vs0oZIMrRMBM4GqX3AjM/6y8JsJRxkAwnfd0fDyK+aICMFarDqQonQNIx99gdTZqw==", "optional": true }, "sass-embedded-linux-musl-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.86.3.tgz", - "integrity": "sha512-ePeTPXUxPK6JgHcUfnrkIyDtyt+zlAvF22mVZv6y1g/PZFm1lSfX+Za7TYHg9KaYqaaXDiw6zICX4i44HhR8rA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.89.2.tgz", + "integrity": "sha512-K+FmWcdj/uyP8GiG9foxOCPfb5OAZG0uSVq80DKgVSC0U44AdGjvAvVZkrgFEcZ6cCqlNC2JfYmslB5iqdL7tg==", "optional": true }, "sass-embedded-linux-riscv64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.86.3.tgz", - "integrity": "sha512-NuXQ72dwfNLe35E+RaXJ4Noq4EkFwM65eWwCwxEWyJO9qxOx1EXiCAJii6x8kkOh5daWuMU0VAI1B9RsJaqqQQ==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.89.2.tgz", + "integrity": "sha512-g9nTbnD/3yhOaskeqeBQETbtfDQWRgsjHok6bn7DdAuwBsyrR3JlSFyqKc46pn9Xxd9SQQZU8AzM4IR+sY0A0w==", "optional": true }, "sass-embedded-linux-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.86.3.tgz", - "integrity": "sha512-t8be9zJ5B82+og9bQmIQ83yMGYZMTMrlGA+uGWtYacmwg6w3093dk91Fx0YzNSZBp3Tk60qVYjCZnEIwy60x0g==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.89.2.tgz", + "integrity": "sha512-Ax7dKvzncyQzIl4r7012KCMBvJzOz4uwSNoyoM5IV6y5I1f5hEwI25+U4WfuTqdkv42taCMgpjZbh9ERr6JVMQ==", "optional": true }, "sass-embedded-win32-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.86.3.tgz", - "integrity": "sha512-4ghuAzjX4q8Nksm0aifRz8hgXMMxS0SuymrFfkfJlrSx68pIgvAge6AOw0edoZoe0Tf5ZbsWUWamhkNyNxkTvw==", - "optional": true - }, - "sass-embedded-win32-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.86.3.tgz", - "integrity": "sha512-tCaK4zIRq9mLRPxLzBAdYlfCuS/xLNpmjunYxeWkIwlJo+k53h1udyXH/FInnQ2GgEz0xMXyvH3buuPgzwWYsw==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.89.2.tgz", + "integrity": "sha512-j96iJni50ZUsfD6tRxDQE2QSYQ2WrfHxeiyAXf41Kw0V4w5KYR/Sf6rCZQLMTUOHnD16qTMVpQi20LQSqf4WGg==", "optional": true }, "sass-embedded-win32-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.86.3.tgz", - "integrity": "sha512-zS+YNKfTF4SnOfpC77VTb0qNZyTXrxnAezSoRV0xnw6HlY+1WawMSSB6PbWtmbvyfXNgpmJUttoTtsvJjRCucg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.89.2.tgz", + "integrity": "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng==", "optional": true }, "sass-loader": { @@ -39292,9 +37959,9 @@ } }, "schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", @@ -40148,6 +38815,16 @@ "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true }, + "stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -40300,6 +38977,23 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dev": true, + "requires": { + "js-tokens": "^9.0.1" + }, + "dependencies": { + "js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true + } + } + }, "style-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", @@ -40314,24 +39008,36 @@ "dev": true }, "stylehacks": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", - "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.5.tgz", + "integrity": "sha512-5kNb7V37BNf0Q3w+1pxfa+oiNPS++/b4Jil9e/kPDgrk1zjEd6uR7SZeJiYaLYH6RRSC1XX2/37OTeU/4FvuIA==", "dev": true, "requires": { - "browserslist": "^4.23.3", - "postcss-selector-parser": "^6.1.2" + "browserslist": "^4.24.5", + "postcss-selector-parser": "^7.1.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "stylelint": { - "version": "16.18.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.18.0.tgz", - "integrity": "sha512-OXb68qzesv7J70BSbFwfK3yTVLEVXiQ/ro6wUE4UrSbKCMjLLA02S8Qq3LC01DxKyVjk7z8xh35aB4JzO3/sNA==", + "version": "16.21.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.0.tgz", + "integrity": "sha512-ki3PpJGG7xhm3WtINoWGnlvqAmbqSexoRMbEMJzlwewSIOqPRKPlq452c22xAdEJISVi80r+I7KL9GPUiwFgbg==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", @@ -40339,24 +39045,24 @@ "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.3", "css-tree": "^3.1.0", - "debug": "^4.3.7", + "debug": "^4.4.1", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.0.7", + "file-entry-cache": "^10.1.1", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^7.0.3", + "ignore": "^7.0.5", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.35.0", + "known-css-properties": "^0.37.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.3", + "postcss": "^8.5.5", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.0", @@ -40370,9 +39076,9 @@ }, "dependencies": { "@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "requires": {} }, @@ -40424,23 +39130,23 @@ } }, "file-entry-cache": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.8.tgz", - "integrity": "sha512-FGXHpfmI4XyzbLd3HQ8cbUcsFGohJpZtmQRHr8z8FxxtCe2PcpgIlVLwIgunqjvRmXypBETvwhV4ptJizA+Y1Q==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.1.tgz", + "integrity": "sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==", "dev": true, "requires": { - "flat-cache": "^6.1.8" + "flat-cache": "^6.1.10" } }, "flat-cache": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.8.tgz", - "integrity": "sha512-R6MaD3nrJAtO7C3QOuS79ficm2pEAy++TgEUD8ii1LVlbcgZ9DtASLkt9B+RZSFCzm7QHDMlXPsqqB6W2Pfr1Q==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.10.tgz", + "integrity": "sha512-B6/v1f0NwjxzmeOhzfXPGWpKBVA207LS7lehaVKQnFrVktcFRfkzjZZ2gwj2i1TkEUMQht7ZMJbABUT5N+V1Nw==", "dev": true, "requires": { - "cacheable": "^1.8.9", + "cacheable": "^1.10.0", "flatted": "^3.3.3", - "hookified": "^1.8.1" + "hookified": "^1.9.1" } }, "globby": { @@ -40466,9 +39172,9 @@ } }, "ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true }, "import-fresh": { @@ -40504,6 +39210,12 @@ "argparse": "^2.0.1" } }, + "known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true + }, "mdn-data": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", @@ -41312,673 +40024,45 @@ } }, "stylelint-no-browser-hacks": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/stylelint-no-browser-hacks/-/stylelint-no-browser-hacks-1.3.0.tgz", - "integrity": "sha512-aeNEFlP/AIQ3FEgU6HxUOY5Xb2M1vimNWNUcQkaFou/rb0roQH75GM4v6Vf5MB+eEmLckz7dXzveTYnG3SBedw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stylelint-no-browser-hacks/-/stylelint-no-browser-hacks-2.0.0.tgz", + "integrity": "sha512-+m/2MYCNMYFoMgsxq/Wk5YpQlGJo+PlIcYMdPA9j6s2lYc3t4FumlHHeXySM4qsj5tDdT75AbK5b2g3yKIhyVg==", "dev": true, "requires": { - "stylehacks": "^2.3.2", - "stylelint": "^13.13.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw==", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "dev": true - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "known-css-properties": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", - "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", - "dev": true - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reporter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", - "integrity": "sha512-h9yLwoenfn2GZFINc42nCJInko4rZom3Ud0aEQhOQLa3PlgOUbfQH7/yEwVQLUqX84BwX3ekcwUDic/mpNTx9w==", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "lodash": "^4.1.0", - "log-symbols": "^1.0.2", - "postcss": "^5.0.0" - } - }, - "postcss-scss": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", - "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", - "dev": true, - "requires": { - "postcss": "^7.0.6" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "stylehacks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-2.3.2.tgz", - "integrity": "sha512-cWtUu/KdmyR0J37V4wjD7x2DyMJykPYhRuv72WiV4n5GkDjbhSml/rqOqLqXVAVWiKZh0XbMO47sLdNJvBzKQQ==", - "dev": true, - "requires": { - "browserslist": "^1.1.3", - "chalk": "^1.1.1", - "log-symbols": "^1.0.2", - "minimist": "^1.2.0", - "plur": "^2.1.2", - "postcss": "^5.0.18", - "postcss-reporter": "^1.3.3", - "postcss-selector-parser": "^2.0.0", - "read-file-stdin": "^0.2.1", - "text-table": "^0.2.0", - "write-file-stdout": "0.0.2" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "stylelint": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", - "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", - "dev": true, - "requires": { - "@stylelint/postcss-css-in-js": "^0.37.2", - "@stylelint/postcss-markdown": "^0.36.2", - "autoprefixer": "^9.8.6", - "balanced-match": "^2.0.0", - "chalk": "^4.1.1", - "cosmiconfig": "^7.0.0", - "debug": "^4.3.1", - "execall": "^2.0.0", - "fast-glob": "^3.2.5", - "fastest-levenshtein": "^1.0.12", - "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", - "global-modules": "^2.0.0", - "globby": "^11.0.3", - "globjoin": "^0.1.4", - "html-tags": "^3.1.0", - "ignore": "^5.1.8", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.21.0", - "lodash": "^4.17.21", - "log-symbols": "^4.1.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.4", - "normalize-selector": "^0.2.0", - "postcss": "^7.0.35", - "postcss-html": "^0.36.0", - "postcss-less": "^3.1.4", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^4.0.2", - "postcss-sass": "^0.4.4", - "postcss-scss": "^2.1.1", - "postcss-selector-parser": "^6.0.5", - "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^4.1.0", - "resolve-from": "^5.0.0", - "slash": "^3.0.0", - "specificity": "^0.4.1", - "string-width": "^4.2.2", - "strip-ansi": "^6.0.0", - "style-search": "^0.1.0", - "sugarss": "^2.0.0", - "svg-tags": "^1.0.0", - "table": "^6.6.0", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^3.0.3" - }, - "dependencies": { - "@stylelint/postcss-css-in-js": { - "version": "0.37.3", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.3.tgz", - "integrity": "sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==", - "dev": true, - "requires": { - "@babel/core": "^7.17.9" - } - }, - "@stylelint/postcss-markdown": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", - "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", - "dev": true, - "requires": { - "remark": "^13.0.0", - "unist-util-find-all-after": "^3.0.2" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - } + "postcss": "^8.5.3", + "stylehacks": "^7.0.4", + "stylelint": "^16.18.0" } }, "stylelint-order": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", - "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-7.0.0.tgz", + "integrity": "sha512-rSWxx0KscYfxU02wEskKXES9lkRzuuONMMNkZ7SUc6uiF3tDKm7e+sE0Ax/SBlG4TUf1sp1R6f3/SlsPGmzthg==", "dev": true, "requires": { - "postcss": "^8.4.32", - "postcss-sorting": "^8.0.2" + "postcss": "^8.5.3", + "postcss-sorting": "^9.1.0" }, "dependencies": { "postcss-sorting": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz", - "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-9.1.0.tgz", + "integrity": "sha512-Mn8KJ45HNNG6JBpBizXcyf6LqY/qyqetGcou/nprDnFwBFBLGj0j/sNKV2lj2KMOVOwdXu14aEzqJv8CIV6e8g==", "dev": true, "requires": {} } } }, "stylelint-scss": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.11.1.tgz", - "integrity": "sha512-e4rYo0UY+BIMtGeGanghrvHTjcryxgZbyFxUedp8dLFqC4P70aawNdYjRrQxbnKhu3BNr4+lt5e/53tcKXiwFA==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz", + "integrity": "sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==", "dev": true, "requires": { "css-tree": "^3.0.1", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.35.0", - "mdn-data": "^2.15.0", + "known-css-properties": "^0.36.0", + "mdn-data": "^2.21.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", "postcss-selector-parser": "^7.1.0", @@ -42010,9 +40094,9 @@ "dev": true }, "mdn-data": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.18.0.tgz", - "integrity": "sha512-gtCy1yim/vpHF/tq3B4Z43x3zKWpYeb4IM3d/Mf4oMYcNuoXOYEaqtoFlLHw9zd7+WNN3jNh6/WXyUrD3OIiwQ==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.22.0.tgz", + "integrity": "sha512-IwcXqjPl4kgZbQH1WLb97/Pjt7XwPDSHnXsjENPhwx68bBf/Dw1/PwM8paXnFq974V1d8qP4o9ViVQqZuPAlCw==", "dev": true }, "postcss-selector-parser": { @@ -42178,9 +40262,9 @@ } }, "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "requires": { "dom-serializer": "^2.0.0", @@ -42197,9 +40281,9 @@ } }, "swiper": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.2.6.tgz", - "integrity": "sha512-8aXpYKtjy3DjcbzZfz+/OX/GhcU5h+looA6PbAzHMZT6ESSycSp9nAjPCenczgJyslV+rUGse64LMGpWE3PX9Q==" + "version": "11.2.8", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.2.8.tgz", + "integrity": "sha512-S5FVf6zWynPWooi7pJ7lZhSUe2snTzqLuUzbd5h5PHUOhzgvW0bLKBd2wv0ixn6/5o9vwc/IkQT74CRcLJQzeg==" }, "symbol-tree": { "version": "3.2.4", @@ -42270,9 +40354,9 @@ } }, "tar-fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", - "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", "dev": true, "optional": true, "peer": true, @@ -42413,12 +40497,6 @@ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "dev": true }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, "thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -42445,19 +40523,19 @@ "dev": true }, "tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "dev": true, "requires": { - "fdir": "^6.4.3", + "fdir": "^6.4.4", "picomatch": "^4.0.2" }, "dependencies": { "fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "dev": true, "requires": {} }, @@ -42470,9 +40548,9 @@ } }, "tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true }, "tinyrainbow": { @@ -42482,9 +40560,9 @@ "dev": true }, "tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", "dev": true }, "tldts": { @@ -42562,9 +40640,9 @@ "dev": true }, "tough-cookie": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", - "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, "requires": { "tldts": "^6.1.32" @@ -42611,9 +40689,9 @@ "dev": true }, "ts-api-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", - "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "requires": {} }, @@ -42810,15 +40888,6 @@ "reflect.getprototypeof": "^1.0.6" } }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, "typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -42826,14 +40895,14 @@ "dev": true }, "typescript-eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.0.tgz", - "integrity": "sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.1.tgz", + "integrity": "sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "8.29.0", - "@typescript-eslint/parser": "8.29.0", - "@typescript-eslint/utils": "8.29.0" + "@typescript-eslint/eslint-plugin": "8.35.1", + "@typescript-eslint/parser": "8.35.1", + "@typescript-eslint/utils": "8.35.1" } }, "uc.micro": { @@ -42897,28 +40966,6 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, - "unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dev": true, - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - } - } - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -42937,21 +40984,6 @@ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, - "unist-util-find-all-after": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", - "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", - "dev": true, - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true - }, "unist-util-remove-position": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", @@ -43049,9 +41081,9 @@ } }, "update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "requires": { "escalade": "^3.2.0", @@ -43110,12 +41142,6 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, - "v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -43138,18 +41164,6 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - } - }, "vfile-location": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", @@ -43167,56 +41181,85 @@ } }, "vite": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", - "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "requires": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", "fsevents": "~2.3.3", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "dependencies": { + "fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } } }, "vite-node": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.1.tgz", - "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "requires": { "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" } }, "vitest": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", - "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "requires": { - "@vitest/expect": "3.1.1", - "@vitest/mocker": "3.1.1", - "@vitest/pretty-format": "^3.1.1", - "@vitest/runner": "3.1.1", - "@vitest/snapshot": "3.1.1", - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", - "std-env": "^3.8.1", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.1.1", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" + }, + "dependencies": { + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } } }, "w3c-xmlserializer": { @@ -43267,13 +41310,14 @@ "dev": true }, "webpack": { - "version": "5.98.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", - "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "version": "5.99.9", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", + "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", @@ -43290,7 +41334,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", @@ -43416,9 +41460,9 @@ } }, "webpack-dev-server": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.1.tgz", - "integrity": "sha512-ml/0HIj9NLpVKOMq+SuBPLHcmbG+TGIjXRHsYfZwocUBIqEvws8NnS/V9AFQ5FKP+tgn5adwVwRrTEpGL33QFQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "dev": true, "requires": { "@types/bonjour": "^3.5.13", @@ -43437,7 +41481,7 @@ "connect-history-api-fallback": "^2.0.0", "express": "^4.21.2", "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.7", + "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", @@ -43592,15 +41636,16 @@ } }, "which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "requires": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } @@ -43855,12 +41900,6 @@ } } }, - "write-file-stdout": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/write-file-stdout/-/write-file-stdout-0.0.2.tgz", - "integrity": "sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE=", - "dev": true - }, "ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -43896,25 +41935,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "optional": true }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true - }, - "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "dev": true } } } diff --git a/package.json b/package.json index 1abe958ea..83884c9df 100644 --- a/package.json +++ b/package.json @@ -5,26 +5,26 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "7.26.10", - "@babel/plugin-transform-modules-umd": "7.25.9", - "@babel/preset-env": "7.26.9", - "@babel/preset-react": "7.26.3", - "@eslint-community/eslint-plugin-eslint-comments": "4.4.1", - "@eslint/js": "9.24.0", - "@stylistic/eslint-plugin": "4.2.0", - "@stylistic/stylelint-plugin": "3.1.2", + "@babel/core": "7.27.4", + "@babel/plugin-transform-modules-umd": "7.27.1", + "@babel/preset-env": "7.27.2", + "@babel/preset-react": "7.27.1", + "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", + "@eslint/js": "9.30.1", + "@stylistic/eslint-plugin": "4.4.1", + "@stylistic/stylelint-plugin": "3.1.3", "@types/dompurify": "3.0.5", "@types/escape-html": "1.0.4", "@types/loadable__component": "5.13.9", "@types/lodash-es": "4.17.12", "@types/markdown-it": "14.1.2", - "@types/react": "18.3.20", - "@types/react-dom": "18.3.6", + "@types/react": "18.3.23", + "@types/react-dom": "18.3.7", "@types/react-lazy-load-image-component": "1.6.4", "@types/sortablejs": "1.15.8", - "@typescript-eslint/parser": "8.29.0", + "@typescript-eslint/parser": "8.35.1", "@uupaa/dynamic-import-polyfill": "1.0.2", - "@vitest/coverage-v8": "3.1.1", + "@vitest/coverage-v8": "3.2.4", "autoprefixer": "10.4.21", "babel-loader": "10.0.0", "clean-webpack-plugin": "4.0.0", @@ -32,80 +32,81 @@ "copy-webpack-plugin": "13.0.0", "cross-env": "7.0.3", "css-loader": "7.1.2", - "cssnano": "7.0.6", - "es-check": "8.0.2", - "eslint": "9.24.0", + "cssnano": "7.0.7", + "es-check": "9.1.4", + "eslint": "9.30.1", "eslint-plugin-compat": "6.0.2", - "eslint-plugin-import": "2.31.0", + "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", - "eslint-plugin-sonarjs": "3.0.2", + "eslint-plugin-sonarjs": "3.0.4", "expose-loader": "5.0.1", "fast-glob": "3.3.3", "fork-ts-checker-webpack-plugin": "9.1.0", - "globals": "16.0.0", + "globals": "16.2.0", "html-loader": "5.1.0", "html-webpack-plugin": "5.6.3", - "jsdom": "26.0.0", + "jsdom": "26.1.0", "mini-css-extract-plugin": "2.9.2", - "postcss": "8.5.3", + "postcss": "8.5.6", "postcss-loader": "8.1.1", - "postcss-preset-env": "10.1.5", + "postcss-preset-env": "10.2.3", "postcss-scss": "4.0.9", - "sass": "1.86.3", + "sass": "1.89.2", "sass-loader": "16.0.5", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", "style-loader": "4.0.0", - "stylelint": "16.18.0", + "stylelint": "16.21.0", "stylelint-config-rational-order": "0.1.2", - "stylelint-no-browser-hacks": "1.3.0", - "stylelint-order": "6.0.4", - "stylelint-scss": "6.11.1", + "stylelint-no-browser-hacks": "2.0.0", + "stylelint-order": "7.0.0", + "stylelint-scss": "6.12.1", "ts-loader": "9.5.2", "typescript": "5.8.3", - "typescript-eslint": "8.29.0", - "vitest": "3.1.1", - "webpack": "5.98.0", + "typescript-eslint": "8.35.1", + "vitest": "3.2.4", + "webpack": "5.99.9", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.1", + "webpack-dev-server": "5.2.2", "webpack-merge": "6.0.1", "worker-loader": "3.0.8" }, "dependencies": { "@emotion/react": "11.14.0", "@emotion/styled": "11.14.0", - "@fontsource/noto-sans": "5.2.6", - "@fontsource/noto-sans-hk": "5.2.5", - "@fontsource/noto-sans-jp": "5.2.5", - "@fontsource/noto-sans-kr": "5.2.5", - "@fontsource/noto-sans-sc": "5.2.5", - "@fontsource/noto-sans-tc": "5.2.5", + "@fontsource/noto-sans": "5.2.7", + "@fontsource/noto-sans-hk": "5.2.6", + "@fontsource/noto-sans-jp": "5.2.6", + "@fontsource/noto-sans-kr": "5.2.6", + "@fontsource/noto-sans-sc": "5.2.6", + "@fontsource/noto-sans-tc": "5.2.6", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202504130507", + "@jellyfin/sdk": "0.0.0-unstable.202507090504", "@jellyfin/ux-web": "1.0.0", - "@mui/icons-material": "6.4.10", - "@mui/material": "6.4.10", - "@mui/x-date-pickers": "7.28.3", + "@mui/icons-material": "6.4.12", + "@mui/material": "6.4.12", + "@mui/x-date-pickers": "7.29.4", "@react-hook/resize-observer": "2.0.2", - "@tanstack/react-query": "5.71.10", - "@tanstack/react-query-devtools": "5.71.10", + "@tanstack/react-query": "5.80.10", + "@tanstack/react-query-devtools": "5.80.10", "abortcontroller-polyfill": "1.7.8", "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.5.1", - "core-js": "3.41.0", + "core-js": "3.43.0", "date-fns": "2.30.0", "dompurify": "2.5.8", + "element-closest-polyfill": "1.0.7", "epubjs": "0.3.93", "escape-html": "1.0.3", "fast-text-encoding": "1.0.6", "flv.js": "1.6.2", "headroom.js": "0.12.0", "history": "5.3.0", - "hls.js": "1.6.1", + "hls.js": "1.6.5", "intersection-observer": "0.12.2", "jellyfin-apiclient": "1.11.0", "jquery": "3.7.1", @@ -118,21 +119,22 @@ "material-react-table": "3.2.1", "native-promise-only": "0.8.1", "pdfjs-dist": "3.11.174", + "proxy-polyfill": "0.3.2", "react": "18.3.1", "react-blurhash": "0.3.0", "react-dom": "18.3.1", "react-lazy-load-image-component": "1.6.3", - "react-router-dom": "6.30.0", + "react-router-dom": "6.30.1", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.6", - "swiper": "11.2.6", + "swiper": "11.2.8", "usehooks-ts": "3.1.1", "webcomponents.js": "0.7.24", "whatwg-fetch": "3.6.20" }, "optionalDependencies": { - "sass-embedded": "1.86.3" + "sass-embedded": "1.89.2" }, "browserslist": [ "last 2 Firefox versions", diff --git a/src/apiclient.d.ts b/src/apiclient.d.ts index c2bc4a051..fcb949fd2 100644 --- a/src/apiclient.d.ts +++ b/src/apiclient.d.ts @@ -1,4 +1,3 @@ -// TODO: Move to jellyfin-apiclient /* eslint-disable @typescript-eslint/no-explicit-any */ declare module 'jellyfin-apiclient' { import type { @@ -68,7 +67,7 @@ declare module 'jellyfin-apiclient' { UtcTimeResponse, VirtualFolderInfo } from '@jellyfin/sdk/lib/generated-client'; - import { ConnectionState } from './utils/jellyfin-apiclient/ConnectionState'; + import type { ConnectionState } from 'lib/jellyfin-apiclient'; class ApiClient { constructor(serverAddress: string, appName: string, appVersion: string, deviceName: string, deviceId: string); @@ -337,6 +336,7 @@ declare module 'jellyfin-apiclient' { handleMessageReceived(msg: any): void; logout(): Promise; minServerVersion(val?: string): string; + updateSavedServerId(server: any): Promise; user(apiClient: ApiClient): Promise; } diff --git a/src/apps/dashboard/components/BaseCard.tsx b/src/apps/dashboard/components/BaseCard.tsx new file mode 100644 index 000000000..8209ec3f0 --- /dev/null +++ b/src/apps/dashboard/components/BaseCard.tsx @@ -0,0 +1,93 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import CardHeader from '@mui/material/CardHeader'; +import CardMedia from '@mui/material/CardMedia'; +import IconButton from '@mui/material/IconButton'; +import Typography from '@mui/material/Typography'; +import MoreVertIcon from '@mui/icons-material/MoreVert'; +import { getDefaultBackgroundClass } from 'components/cardbuilder/cardBuilderUtils'; +import CardActionArea from '@mui/material/CardActionArea'; +import Stack from '@mui/material/Stack'; +import { Link, To } from 'react-router-dom'; + +interface IProps { + title?: string; + secondaryTitle?: string; + text?: string; + image?: string | null; + icon?: React.ReactNode; + to?: To; + onClick?: () => void; + action?: boolean; + actionRef?: React.MutableRefObject; + onActionClick?: () => void; +}; + +const BaseCard = ({ title, secondaryTitle, text, image, icon, to, onClick, action, actionRef, onActionClick }: IProps) => { + return ( + + + {image ? ( + + ) : ( + + {icon} + + )} + + + + {title} + + {secondaryTitle && ( + {secondaryTitle} + )} + + } + subheader={text} + action={ + action ? ( + + + + ) : null + } + /> + + ); +}; + +export default BaseCard; diff --git a/src/apps/dashboard/components/drawer/sections/AdvancedDrawerSection.tsx b/src/apps/dashboard/components/drawer/sections/AdvancedDrawerSection.tsx index 97d8f2671..940520528 100644 --- a/src/apps/dashboard/components/drawer/sections/AdvancedDrawerSection.tsx +++ b/src/apps/dashboard/components/drawer/sections/AdvancedDrawerSection.tsx @@ -1,4 +1,5 @@ import Article from '@mui/icons-material/Article'; +import Backup from '@mui/icons-material/Backup'; import Lan from '@mui/icons-material/Lan'; import Schedule from '@mui/icons-material/Schedule'; import VpnKey from '@mui/icons-material/VpnKey'; @@ -38,6 +39,14 @@ const AdvancedDrawerSection = () => { + + + + + + + + diff --git a/src/apps/dashboard/components/drawer/sections/DevicesDrawerSection.tsx b/src/apps/dashboard/components/drawer/sections/DevicesDrawerSection.tsx index 18fcb010e..7d462a1b0 100644 --- a/src/apps/dashboard/components/drawer/sections/DevicesDrawerSection.tsx +++ b/src/apps/dashboard/components/drawer/sections/DevicesDrawerSection.tsx @@ -1,4 +1,5 @@ -import { Devices, Analytics } from '@mui/icons-material'; +import Analytics from '@mui/icons-material/Analytics'; +import Devices from '@mui/icons-material/Devices'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemIcon from '@mui/material/ListItemIcon'; diff --git a/src/apps/dashboard/components/drawer/sections/LiveTvDrawerSection.tsx b/src/apps/dashboard/components/drawer/sections/LiveTvDrawerSection.tsx index 55a14d329..bde1c91b5 100644 --- a/src/apps/dashboard/components/drawer/sections/LiveTvDrawerSection.tsx +++ b/src/apps/dashboard/components/drawer/sections/LiveTvDrawerSection.tsx @@ -1,4 +1,5 @@ -import { Dvr, LiveTv } from '@mui/icons-material'; +import Dvr from '@mui/icons-material/Dvr'; +import LiveTv from '@mui/icons-material/LiveTv'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemIcon from '@mui/material/ListItemIcon'; @@ -28,7 +29,7 @@ const LiveTvDrawerSection = () => { - + diff --git a/src/apps/dashboard/components/drawer/sections/ServerDrawerSection.tsx b/src/apps/dashboard/components/drawer/sections/ServerDrawerSection.tsx index 1c95db984..bdd24c728 100644 --- a/src/apps/dashboard/components/drawer/sections/ServerDrawerSection.tsx +++ b/src/apps/dashboard/components/drawer/sections/ServerDrawerSection.tsx @@ -1,5 +1,11 @@ -import { Dashboard, ExpandLess, ExpandMore, LibraryAdd, People, PlayCircle, Settings } from '@mui/icons-material'; +import Dashboard from '@mui/icons-material/Dashboard'; +import ExpandLess from '@mui/icons-material/ExpandLess'; +import ExpandMore from '@mui/icons-material/ExpandMore'; +import LibraryAdd from '@mui/icons-material/LibraryAdd'; import Palette from '@mui/icons-material/Palette'; +import People from '@mui/icons-material/People'; +import PlayCircle from '@mui/icons-material/PlayCircle'; +import Settings from '@mui/icons-material/Settings'; import Collapse from '@mui/material/Collapse'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; diff --git a/src/apps/dashboard/components/table/TablePage.tsx b/src/apps/dashboard/components/table/TablePage.tsx index d9724c9d1..3b68ab851 100644 --- a/src/apps/dashboard/components/table/TablePage.tsx +++ b/src/apps/dashboard/components/table/TablePage.tsx @@ -53,7 +53,7 @@ const TablePage = ({ marginBottom: 1 }} > - + {title} {subtitle && ( diff --git a/src/apps/dashboard/components/widgets/ItemCountsWidget.tsx b/src/apps/dashboard/components/widgets/ItemCountsWidget.tsx new file mode 100644 index 000000000..1488b5ebf --- /dev/null +++ b/src/apps/dashboard/components/widgets/ItemCountsWidget.tsx @@ -0,0 +1,98 @@ +import type { ItemCounts } from '@jellyfin/sdk/lib/generated-client/models/item-counts'; +import Book from '@mui/icons-material/Book'; +import Movie from '@mui/icons-material/Movie'; +import MusicNote from '@mui/icons-material/MusicNote'; +import MusicVideo from '@mui/icons-material/MusicVideo'; +import Tv from '@mui/icons-material/Tv'; +import VideoLibrary from '@mui/icons-material/VideoLibrary'; +import Grid from '@mui/material/Grid2'; +import SvgIcon from '@mui/material/SvgIcon'; +import React, { useMemo } from 'react'; + +import { useItemCounts } from 'apps/dashboard/features/metrics/api/useItemCounts'; +import MetricCard, { type MetricCardProps } from 'apps/dashboard/features/metrics/components/MetricCard'; +import globalize from 'lib/globalize'; + +interface MetricDefinition { + key: keyof ItemCounts + i18n: string +} + +interface CardDefinition { + Icon: typeof SvgIcon + metrics: MetricDefinition[] +} + +const CARD_DEFINITIONS: CardDefinition[] = [ + { + Icon: Movie, + metrics: [{ key: 'MovieCount', i18n: 'Movies' }] + }, { + Icon: Tv, + metrics: [ + { key: 'SeriesCount', i18n: 'Series' }, + { key: 'EpisodeCount', i18n: 'Episodes' } + ] + }, { + Icon: MusicNote, + metrics: [ + { key: 'AlbumCount', i18n: 'Albums' }, + { key: 'SongCount', i18n: 'Songs' } + ] + }, { + Icon: MusicVideo, + metrics: [{ key: 'MusicVideoCount', i18n: 'MusicVideos' }] + }, { + Icon: Book, + metrics: [{ key: 'BookCount', i18n: 'Books' }] + }, { + Icon: VideoLibrary, + metrics: [{ key: 'BoxSetCount', i18n: 'Collections' }] + } +]; + +const ItemCountsWidget = () => { + const { + data: counts, + isPending + } = useItemCounts(); + + const cards: MetricCardProps[] = useMemo(() => { + return CARD_DEFINITIONS + .filter(def => ( + // Include all cards while the request is pending + isPending + // Check if the metrics are present in counts + || def.metrics.some(({ key }) => counts?.[key]) + )) + .map(({ Icon, metrics }) => ({ + Icon, + metrics: metrics.map(({ i18n, key }) => ({ + label: globalize.translate(i18n), + value: counts?.[key] + })) + })); + }, [ counts, isPending ]); + + return ( + + {cards.map(card => ( + metric.label).join('-')} + size={{ xs: 12, sm: 6, lg: 4 }} + > + + + ))} + + ); +}; + +export default ItemCountsWidget; diff --git a/src/apps/dashboard/components/widgets/ServerPathWidget.tsx b/src/apps/dashboard/components/widgets/ServerPathWidget.tsx new file mode 100644 index 000000000..98fe4be57 --- /dev/null +++ b/src/apps/dashboard/components/widgets/ServerPathWidget.tsx @@ -0,0 +1,67 @@ +import ChevronRight from '@mui/icons-material/ChevronRight'; +import Button from '@mui/material/Button'; +import List from '@mui/material/List'; +import Typography from '@mui/material/Typography'; +import React from 'react'; + +import { useSystemStorage } from 'apps/dashboard/features/storage/api/useSystemStorage'; +import StorageListItem from 'apps/dashboard/features/storage/components/StorageListItem'; +import globalize from 'lib/globalize'; + +const ServerPathWidget = () => { + const { data: systemStorage } = useSystemStorage(); + + return ( + <> + + + + + + + + + + + + + ); +}; + +export default ServerPathWidget; diff --git a/src/apps/dashboard/controllers/dashboard.html b/src/apps/dashboard/controllers/dashboard.html index 5c449c5e9..e0656d1cc 100644 --- a/src/apps/dashboard/controllers/dashboard.html +++ b/src/apps/dashboard/controllers/dashboard.html @@ -20,13 +20,13 @@
- - -
@@ -36,6 +36,8 @@
+ +
@@ -75,44 +77,7 @@
-
- -

${HeaderPaths}

- -
-
-
-
-
${LabelCache}
-
-
-
-
-
-
${LabelLogs}
-
-
-
-
-
-
${LabelMetadata}
-
-
-
-
-
-
${LabelTranscodes}
-
-
-
-
-
-
${LabelWeb}
-
-
-
-
-
+
diff --git a/src/apps/dashboard/controllers/dashboard.js b/src/apps/dashboard/controllers/dashboard.js index 334fb7e3e..c9dd75b97 100644 --- a/src/apps/dashboard/controllers/dashboard.js +++ b/src/apps/dashboard/controllers/dashboard.js @@ -1,30 +1,31 @@ import escapeHtml from 'escape-html'; -import datetime from 'scripts/datetime'; -import Events from 'utils/events.ts'; +import ServerPathWidget from 'apps/dashboard/components/widgets/ServerPathWidget'; +import ActivityLog from 'components/activitylog'; +import alert from 'components/alert'; +import cardBuilder from 'components/cardbuilder/cardBuilder'; +import { getDefaultBackgroundClass } from 'components/cardbuilder/cardBuilderUtils'; +import confirm from 'components/confirm/confirm'; +import imageLoader from 'components/images/imageLoader'; +import indicators from 'components/indicators/indicators'; import itemHelper from 'components/itemHelper'; -import serverNotifications from 'scripts/serverNotifications'; -import dom from 'scripts/dom'; -import globalize from 'lib/globalize'; -import { formatDistanceToNow } from 'date-fns'; -import { getLocaleWithSuffix } from 'utils/dateFnsLocale.ts'; import loading from 'components/loading/loading'; import playMethodHelper from 'components/playback/playmethodhelper'; -import cardBuilder from 'components/cardbuilder/cardBuilder'; -import imageLoader from 'components/images/imageLoader'; -import ActivityLog from 'components/activitylog'; -import imageHelper from 'utils/image'; -import indicators from 'components/indicators/indicators'; +import { formatDistanceToNow } from 'date-fns'; +import { getSystemInfoQuery } from 'hooks/useSystemInfo'; +import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import datetime from 'scripts/datetime'; +import dom from 'scripts/dom'; +import serverNotifications from 'scripts/serverNotifications'; import taskButton from 'scripts/taskbutton'; import Dashboard from 'utils/dashboard'; -import ServerConnections from 'components/ServerConnections'; -import alert from 'components/alert'; -import confirm from 'components/confirm/confirm'; -import { getDefaultBackgroundClass } from 'components/cardbuilder/cardBuilderUtils'; - -import { getSystemInfoQuery } from 'hooks/useSystemInfo'; +import { getLocaleWithSuffix } from 'utils/dateFnsLocale.ts'; +import Events from 'utils/events.ts'; +import imageHelper from 'utils/image'; import { toApi } from 'utils/jellyfin-apiclient/compat'; import { queryClient } from 'utils/query/queryClient'; +import { renderComponent } from 'utils/reactUtils'; import 'elements/emby-button/emby-button'; import 'elements/emby-itemscontainer/emby-itemscontainer'; @@ -32,6 +33,7 @@ import 'elements/emby-itemscontainer/emby-itemscontainer'; import 'components/listview/listview.scss'; import 'styles/flexstyles.scss'; import './dashboard.scss'; +import ItemCountsWidget from '../components/widgets/ItemCountsWidget'; function showPlaybackInfo(btn, session) { let title; @@ -220,12 +222,6 @@ function reloadSystemInfo(view, apiClient) { .then(systemInfo => { view.querySelector('#serverName').innerText = systemInfo.ServerName; view.querySelector('#versionNumber').innerText = systemInfo.Version; - - view.querySelector('#cachePath').innerText = systemInfo.CachePath; - view.querySelector('#logPath').innerText = systemInfo.LogPath; - view.querySelector('#transcodePath').innerText = systemInfo.TranscodingTempPath; - view.querySelector('#metadataPath').innerText = systemInfo.InternalMetadataPath; - view.querySelector('#webPath').innerText = systemInfo.WebPath; }); } @@ -752,6 +748,9 @@ const DashboardPage = { }; export default function (view) { + const serverId = ApiClient.serverId(); + let unmountWidgetFns = []; + function onRestartRequired(evt, apiClient) { console.debug('onRestartRequired not implemented', evt, apiClient); } @@ -783,7 +782,6 @@ export default function (view) { } } - const serverId = ApiClient.serverId(); view.querySelector('.activeDevices').addEventListener('click', onActiveDevicesClick); view.addEventListener('viewshow', function () { const page = this; @@ -827,6 +825,9 @@ export default function (view) { button: page.querySelector('.btnRefresh') }); + unmountWidgetFns.push(renderComponent(ItemCountsWidget, {}, page.querySelector('#itemCounts'))); + unmountWidgetFns.push(renderComponent(ServerPathWidget, {}, page.querySelector('#serverPaths'))); + page.querySelector('#btnRestartServer').addEventListener('click', DashboardPage.restart); page.querySelector('#btnShutdown').addEventListener('click', DashboardPage.shutdown); }); @@ -853,6 +854,11 @@ export default function (view) { button: page.querySelector('.btnRefresh') }); + unmountWidgetFns.forEach(unmount => { + unmount(); + }); + unmountWidgetFns = []; + page.querySelector('#btnRestartServer').removeEventListener('click', DashboardPage.restart); page.querySelector('#btnShutdown').removeEventListener('click', DashboardPage.shutdown); }); diff --git a/src/apps/dashboard/controllers/encodingsettings.html b/src/apps/dashboard/controllers/encodingsettings.html deleted file mode 100644 index af84cd0ef..000000000 --- a/src/apps/dashboard/controllers/encodingsettings.html +++ /dev/null @@ -1,407 +0,0 @@ -
-
-
-
-
-
-

${Transcoding}

-
-
- -
- - -
- -
- -
${LabelVaapiDeviceHelp}
-
- -
- -
${LabelQsvDeviceHelp}
-
- -
-
-

${LabelEnableHardwareDecodingFor}

-
- - - - - - - - - -
-
- - -
-
- - -
-
- -
- -
${EnableEnhancedNvdecDecoderHelp}
-
- -
- -
- -
-

${LabelHardwareEncodingOptions}

-
- -
-
- - - -
-
-
- -
-

${LabelEncodingFormatOptions}

-
${EncodingFormatHelp}
-
- -
-
- -
-
- -
-
- -
${AllowVppTonemappingHelp}
-
-
- -
${LabelVppTonemappingBrightnessHelp}
-
-
- -
${LabelVppTonemappingContrastHelp}
-
-
- -
-
- -
${AllowVideoToolboxTonemappingHelp}
-
-
- -
-
- -
${AllowTonemappingHelp}
-
${AllowTonemappingSoftwareHelp}
-
-
- - -
-
- -
${TonemappingModeHelp}
-
-
- -
${TonemappingRangeHelp}
-
-
- -
${LabelTonemappingDesatHelp}
-
-
- -
${LabelTonemappingPeakHelp}
-
-
- -
${LabelTonemappingParamHelp}
-
-
- -
- -
${LabelTranscodingThreadCountHelp}
-
- -
-
-
- -
-
-
-
${LabelffmpegPathHelp}
-
-
-
-
-
- -
- -
-
${LabelTranscodingTempPathHelp}
-
-
-
-
- -
- -
- -
-
- -
${EnableFallbackFontHelp}
-
-
- -
${LabelEnableAudioVbrHelp}
-
-
- -
${LabelDownMixAudioScaleHelp}
-
-
- -
${StereoDownmixAlgorithmHelp}
-
-
- -
${LabelMaxMuxingQueueSizeHelp}
-
- -
- -
${EncoderPresetHelp}
-
-
- -
-
- -
${H264CrfHelp}
-
-
- -
${DeinterlaceMethodHelp}
-
- -
- -
${UseDoubleRateDeinterlacingHelp}
-
- -
- -
${AllowOnTheFlySubtitleExtractionHelp}
-
- -
- -
${AllowFfmpegThrottlingHelp}
-
- -
- -
${AllowSegmentDeletionHelp}
-
- -
- -
${LabelThrottleDelaySecondsHelp}
-
- -
- -
${LabelSegmentKeepSecondsHelp}
-
- -
- -
-
-
-
-
diff --git a/src/apps/dashboard/controllers/encodingsettings.js b/src/apps/dashboard/controllers/encodingsettings.js deleted file mode 100644 index 6ae4fdbb2..000000000 --- a/src/apps/dashboard/controllers/encodingsettings.js +++ /dev/null @@ -1,309 +0,0 @@ -import 'jquery'; -import loading from 'components/loading/loading'; -import globalize from 'lib/globalize'; -import dom from 'scripts/dom'; -import Dashboard from 'utils/dashboard'; -import alert from 'components/alert'; - -function loadPage(page, config, systemInfo) { - Array.prototype.forEach.call(page.querySelectorAll('.chkDecodeCodec'), function (c) { - c.checked = (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute('data-codec')) !== -1; - }); - page.querySelector('#chkDecodingColorDepth10Hevc').checked = config.EnableDecodingColorDepth10Hevc; - page.querySelector('#chkDecodingColorDepth10Vp9').checked = config.EnableDecodingColorDepth10Vp9; - page.querySelector('#chkDecodingColorDepth10HevcRext').checked = config.EnableDecodingColorDepth10HevcRext; - page.querySelector('#chkDecodingColorDepth12HevcRext').checked = config.EnableDecodingColorDepth12HevcRext; - page.querySelector('#chkEnhancedNvdecDecoder').checked = config.EnableEnhancedNvdecDecoder; - page.querySelector('#chkSystemNativeHwDecoder').checked = config.PreferSystemNativeHwDecoder; - page.querySelector('#chkIntelLpH264HwEncoder').checked = config.EnableIntelLowPowerH264HwEncoder; - page.querySelector('#chkIntelLpHevcHwEncoder').checked = config.EnableIntelLowPowerHevcHwEncoder; - page.querySelector('#chkHardwareEncoding').checked = config.EnableHardwareEncoding; - page.querySelector('#chkAllowHevcEncoding').checked = config.AllowHevcEncoding; - page.querySelector('#chkAllowAv1Encoding').checked = config.AllowAv1Encoding; - page.querySelector('#selectVideoDecoder').value = config.HardwareAccelerationType || 'none'; - page.querySelector('#selectThreadCount').value = config.EncodingThreadCount; - page.querySelector('#chkEnableAudioVbr').checked = config.EnableAudioVbr; - page.querySelector('#txtDownMixAudioBoost').value = config.DownMixAudioBoost; - page.querySelector('#selectStereoDownmixAlgorithm').value = config.DownMixStereoAlgorithm || 'None'; - page.querySelector('#txtMaxMuxingQueueSize').value = config.MaxMuxingQueueSize || ''; - page.querySelector('.txtEncoderPath').value = config.EncoderAppPathDisplay || ''; - page.querySelector('#txtTranscodingTempPath').value = systemInfo.TranscodingTempPath || ''; - page.querySelector('#txtFallbackFontPath').value = config.FallbackFontPath || ''; - page.querySelector('#chkEnableFallbackFont').checked = config.EnableFallbackFont; - page.querySelector('#txtVaapiDevice').value = config.VaapiDevice || ''; - page.querySelector('#txtQsvDevice').value = config.QsvDevice || ''; - page.querySelector('#chkTonemapping').checked = config.EnableTonemapping; - page.querySelector('#chkVppTonemapping').checked = config.EnableVppTonemapping; - page.querySelector('#chkVideoToolboxTonemapping').checked = config.EnableVideoToolboxTonemapping; - page.querySelector('#selectTonemappingAlgorithm').value = config.TonemappingAlgorithm || 'none'; - page.querySelector('#selectTonemappingMode').value = config.TonemappingMode || 'auto'; - page.querySelector('#selectTonemappingRange').value = config.TonemappingRange || 'auto'; - page.querySelector('#txtTonemappingDesat').value = config.TonemappingDesat; - page.querySelector('#txtTonemappingPeak').value = config.TonemappingPeak; - page.querySelector('#txtTonemappingParam').value = config.TonemappingParam || ''; - page.querySelector('#txtVppTonemappingBrightness').value = config.VppTonemappingBrightness; - page.querySelector('#txtVppTonemappingContrast').value = config.VppTonemappingContrast; - page.querySelector('#selectEncoderPreset').value = config.EncoderPreset || 'auto'; - page.querySelector('#txtH264Crf').value = config.H264Crf || ''; - page.querySelector('#txtH265Crf').value = config.H265Crf || ''; - page.querySelector('#selectDeinterlaceMethod').value = config.DeinterlaceMethod || 'yadif'; - page.querySelector('#chkDoubleRateDeinterlacing').checked = config.DeinterlaceDoubleRate; - page.querySelector('#chkEnableSubtitleExtraction').checked = config.EnableSubtitleExtraction || false; - page.querySelector('#chkEnableThrottling').checked = config.EnableThrottling || false; - page.querySelector('#chkEnableSegmentDeletion').checked = config.EnableSegmentDeletion || false; - page.querySelector('#txtThrottleDelaySeconds').value = config.ThrottleDelaySeconds || ''; - page.querySelector('#txtSegmentKeepSeconds').value = config.SegmentKeepSeconds || ''; - page.querySelector('#selectVideoDecoder').dispatchEvent(new CustomEvent('change', { - bubbles: true - })); - loading.hide(); -} - -function onSaveEncodingPathFailure() { - loading.hide(); - alert(globalize.translate('FFmpegSavePathNotFound')); -} - -function updateEncoder(form) { - return ApiClient.getSystemInfo().then(function () { - return ApiClient.ajax({ - url: ApiClient.getUrl('System/MediaEncoder/Path'), - type: 'POST', - data: JSON.stringify({ - Path: form.querySelector('.txtEncoderPath').value, - PathType: 'Custom' - }), - contentType: 'application/json' - }).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure); - }); -} - -function onSubmit() { - const form = this; - - const onDecoderConfirmed = function () { - loading.show(); - ApiClient.getNamedConfiguration('encoding').then(function (config) { - config.EnableAudioVbr = form.querySelector('#chkEnableAudioVbr').checked; - config.DownMixAudioBoost = form.querySelector('#txtDownMixAudioBoost').value; - config.DownMixStereoAlgorithm = form.querySelector('#selectStereoDownmixAlgorithm').value || 'None'; - config.MaxMuxingQueueSize = form.querySelector('#txtMaxMuxingQueueSize').value; - config.TranscodingTempPath = form.querySelector('#txtTranscodingTempPath').value; - config.FallbackFontPath = form.querySelector('#txtFallbackFontPath').value; - config.EnableFallbackFont = form.querySelector('#txtFallbackFontPath').value ? form.querySelector('#chkEnableFallbackFont').checked : false; - config.EncodingThreadCount = form.querySelector('#selectThreadCount').value; - config.HardwareAccelerationType = form.querySelector('#selectVideoDecoder').value; - config.VaapiDevice = form.querySelector('#txtVaapiDevice').value; - config.QsvDevice = form.querySelector('#txtQsvDevice').value; - config.EnableTonemapping = form.querySelector('#chkTonemapping').checked; - config.EnableVppTonemapping = form.querySelector('#chkVppTonemapping').checked; - config.EnableVideoToolboxTonemapping = form.querySelector('#chkVideoToolboxTonemapping').checked; - config.TonemappingAlgorithm = form.querySelector('#selectTonemappingAlgorithm').value; - config.TonemappingMode = form.querySelector('#selectTonemappingMode').value; - config.TonemappingRange = form.querySelector('#selectTonemappingRange').value; - config.TonemappingDesat = form.querySelector('#txtTonemappingDesat').value; - config.TonemappingPeak = form.querySelector('#txtTonemappingPeak').value; - config.TonemappingParam = form.querySelector('#txtTonemappingParam').value || '0'; - config.VppTonemappingBrightness = form.querySelector('#txtVppTonemappingBrightness').value; - config.VppTonemappingContrast = form.querySelector('#txtVppTonemappingContrast').value; - config.EncoderPreset = form.querySelector('#selectEncoderPreset').value; - config.H264Crf = parseInt(form.querySelector('#txtH264Crf').value || '0', 10); - config.H265Crf = parseInt(form.querySelector('#txtH265Crf').value || '0', 10); - config.DeinterlaceMethod = form.querySelector('#selectDeinterlaceMethod').value; - config.DeinterlaceDoubleRate = form.querySelector('#chkDoubleRateDeinterlacing').checked; - config.EnableSubtitleExtraction = form.querySelector('#chkEnableSubtitleExtraction').checked; - config.EnableThrottling = form.querySelector('#chkEnableThrottling').checked; - config.EnableSegmentDeletion = form.querySelector('#chkEnableSegmentDeletion').checked; - config.ThrottleDelaySeconds = parseInt(form.querySelector('#txtThrottleDelaySeconds').value || '0', 10); - config.SegmentKeepSeconds = parseInt(form.querySelector('#txtSegmentKeepSeconds').value || '0', 10); - config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll('.chkDecodeCodec'), function (c) { - return c.checked; - }), function (c) { - return c.getAttribute('data-codec'); - }); - config.EnableDecodingColorDepth10Hevc = form.querySelector('#chkDecodingColorDepth10Hevc').checked; - config.EnableDecodingColorDepth10Vp9 = form.querySelector('#chkDecodingColorDepth10Vp9').checked; - config.EnableDecodingColorDepth10HevcRext = form.querySelector('#chkDecodingColorDepth10HevcRext').checked; - config.EnableDecodingColorDepth12HevcRext = form.querySelector('#chkDecodingColorDepth12HevcRext').checked; - config.EnableEnhancedNvdecDecoder = form.querySelector('#chkEnhancedNvdecDecoder').checked; - config.PreferSystemNativeHwDecoder = form.querySelector('#chkSystemNativeHwDecoder').checked; - config.EnableIntelLowPowerH264HwEncoder = form.querySelector('#chkIntelLpH264HwEncoder').checked; - config.EnableIntelLowPowerHevcHwEncoder = form.querySelector('#chkIntelLpHevcHwEncoder').checked; - config.EnableHardwareEncoding = form.querySelector('#chkHardwareEncoding').checked; - config.AllowHevcEncoding = form.querySelector('#chkAllowHevcEncoding').checked; - config.AllowAv1Encoding = form.querySelector('#chkAllowAv1Encoding').checked; - ApiClient.updateNamedConfiguration('encoding', config).then(function () { - updateEncoder(form); - }, function () { - alert(globalize.translate('ErrorDefault')); - Dashboard.processServerConfigurationUpdateResult(); - }); - }); - }; - - if (form.querySelector('#selectVideoDecoder').value !== 'none') { - alert({ - title: globalize.translate('TitleHardwareAcceleration'), - text: globalize.translate('HardwareAccelerationWarning') - }).then(onDecoderConfirmed); - } else { - onDecoderConfirmed(); - } - - return false; -} - -function setDecodingCodecsVisible(context, value) { - value = value || ''; - let any; - Array.prototype.forEach.call(context.querySelectorAll('.chkDecodeCodec'), function (c) { - if (c.getAttribute('data-types').split(',').indexOf(value) === -1) { - dom.parentWithTag(c, 'LABEL').classList.add('hide'); - } else { - dom.parentWithTag(c, 'LABEL').classList.remove('hide'); - any = true; - } - }); - - if (any) { - context.querySelector('.decodingCodecsList').classList.remove('hide'); - } else { - context.querySelector('.decodingCodecsList').classList.add('hide'); - } -} - -let systemInfo; -function getSystemInfo() { - return systemInfo ? Promise.resolve(systemInfo) : ApiClient.getPublicSystemInfo().then( - info => { - systemInfo = info; - return info; - } - ); -} - -$(document).on('pageinit', '#encodingSettingsPage', function () { - const page = this; - getSystemInfo(); - page.querySelector('#selectVideoDecoder').addEventListener('change', function () { - if (this.value == 'vaapi') { - page.querySelector('.fldVaapiDevice').classList.remove('hide'); - page.querySelector('#txtVaapiDevice').setAttribute('required', 'required'); - } else { - page.querySelector('.fldVaapiDevice').classList.add('hide'); - page.querySelector('#txtVaapiDevice').removeAttribute('required'); - } - - if (this.value == 'amf' || this.value == 'nvenc' || this.value == 'qsv' || this.value == 'vaapi' || this.value == 'rkmpp') { - page.querySelector('.fld10bitHevcVp9HwDecoding').classList.remove('hide'); - } else { - page.querySelector('.fld10bitHevcVp9HwDecoding').classList.add('hide'); - } - - if (this.value == 'nvenc' || this.value == 'qsv' || this.value == 'vaapi') { - page.querySelector('.fldHevcRextHwDecoding').classList.remove('hide'); - } else { - page.querySelector('.fldHevcRextHwDecoding').classList.add('hide'); - } - - const isHwaSelected = [ 'amf', 'nvenc', 'qsv', 'vaapi', 'rkmpp', 'videotoolbox' ].includes(this.value); - if (this.value === 'none') { - page.querySelector('.tonemappingOptions').classList.remove('hide'); - page.querySelector('.fldTonemapCheckbox').classList.add('hide'); - } else if (isHwaSelected) { - page.querySelector('.tonemappingOptions').classList.remove('hide'); - page.querySelector('.fldTonemapCheckbox').classList.remove('hide'); - } else { - page.querySelector('.tonemappingOptions').classList.add('hide'); - page.querySelector('.fldTonemapCheckbox').classList.add('hide'); - } - - page.querySelector('.tonemappingModeOptions').classList.toggle('hide', !isHwaSelected); - page.querySelector('.allowTonemappingHardwareHelp').classList.toggle('hide', !isHwaSelected); - page.querySelector('.allowTonemappingSoftwareHelp').classList.toggle('hide', isHwaSelected); - - if (this.value == 'qsv' || this.value == 'vaapi') { - page.querySelector('.fldIntelLp').classList.remove('hide'); - } else { - page.querySelector('.fldIntelLp').classList.add('hide'); - } - - if (this.value === 'videotoolbox') { - page.querySelector('.videoToolboxTonemappingOptions').classList.remove('hide'); - } else { - page.querySelector('.videoToolboxTonemappingOptions').classList.add('hide'); - } - - if (this.value == 'qsv' || this.value == 'vaapi') { - page.querySelector('.vppTonemappingOptions').classList.remove('hide'); - } else { - page.querySelector('.vppTonemappingOptions').classList.add('hide'); - } - - if (this.value == 'qsv') { - page.querySelector('.fldSysNativeHwDecoder').classList.remove('hide'); - page.querySelector('.fldQsvDevice').classList.remove('hide'); - } else { - page.querySelector('.fldSysNativeHwDecoder').classList.add('hide'); - page.querySelector('.fldQsvDevice').classList.add('hide'); - } - - if (this.value == 'nvenc') { - page.querySelector('.fldEnhancedNvdec').classList.remove('hide'); - } else { - page.querySelector('.fldEnhancedNvdec').classList.add('hide'); - } - - if (this.value !== 'none') { - page.querySelector('.hardwareAccelerationOptions').classList.remove('hide'); - } else { - page.querySelector('.hardwareAccelerationOptions').classList.add('hide'); - } - - setDecodingCodecsVisible(page, this.value); - }); - $('#btnSelectTranscodingTempPath', page).on('click.selectDirectory', function () { - import('components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { - const picker = new DirectoryBrowser(); - picker.show({ - callback: function (path) { - if (path) { - page.querySelector('#txtTranscodingTempPath').value = path; - } - - picker.close(); - }, - validateWriteable: true, - header: globalize.translate('HeaderSelectTranscodingPath'), - instruction: globalize.translate('HeaderSelectTranscodingPathHelp') - }); - }); - }); - $('#btnSelectFallbackFontPath', page).on('click.selectDirectory', function () { - import('components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { - const picker = new DirectoryBrowser(); - picker.show({ - includeDirectories: true, - callback: function (path) { - if (path) { - page.querySelector('#txtFallbackFontPath').value = path; - } - - picker.close(); - }, - header: globalize.translate('HeaderSelectFallbackFontPath'), - instruction: globalize.translate('HeaderSelectFallbackFontPathHelp') - }); - }); - }); - $('.encodingSettingsForm').off('submit', onSubmit).on('submit', onSubmit); -}).on('pageshow', '#encodingSettingsPage', function () { - loading.show(); - const page = this; - ApiClient.getNamedConfiguration('encoding').then(function (config) { - ApiClient.getSystemInfo().then(function (fetchedSystemInfo) { - loadPage(page, config, fetchedSystemInfo); - }); - }); -}); - diff --git a/src/apps/dashboard/controllers/livetvsettings.html b/src/apps/dashboard/controllers/livetvsettings.html deleted file mode 100644 index 78e70fa8f..000000000 --- a/src/apps/dashboard/controllers/livetvsettings.html +++ /dev/null @@ -1,120 +0,0 @@ -
-
-
-
-
-

${HeaderDVR}

-
-
- -
-
- -
${LabelNumberOfGuideDaysHelp}
-
-
-
-
- -
- -
-
${LabelRecordingPathHelp}
-
-
-
-
- -
- -
-
-
-
-
- -
- -
-
-
-

${HeaderDefaultRecordingSettings}

-
-
-
- -
-
- ${MinutesBefore} -
-
-
-
-
-
- -
-
- ${MinutesAfter} -
-
-
-
-
-

${HeaderRecordingPostProcessing}

-
-
-
- -
- -
-
-
- -
${LabelPostProcessorArgumentsHelp}
-
-
-
-

${HeaderRecordingMetadataSaving}

- -
- -
${SaveRecordingNFOHelp}
-
- -
- -
${SaveRecordingImagesHelp}
-
-
-
-
- -
-
-
-
-
diff --git a/src/apps/dashboard/controllers/livetvsettings.js b/src/apps/dashboard/controllers/livetvsettings.js deleted file mode 100644 index 0fd30ee5b..000000000 --- a/src/apps/dashboard/controllers/livetvsettings.js +++ /dev/null @@ -1,133 +0,0 @@ -import 'jquery'; - -import loading from 'components/loading/loading'; -import globalize from 'lib/globalize'; -import 'elements/emby-button/emby-button'; -import Dashboard from 'utils/dashboard'; -import alert from 'components/alert'; - -function loadPage(page, config) { - page.querySelector('.liveTvSettingsForm').classList.remove('hide'); - page.querySelector('.noLiveTvServices')?.classList.add('hide'); - page.querySelector('#selectGuideDays').value = config.GuideDays || ''; - page.querySelector('#txtPrePaddingMinutes').value = config.PrePaddingSeconds / 60; - page.querySelector('#txtPostPaddingMinutes').value = config.PostPaddingSeconds / 60; - page.querySelector('#txtRecordingPath').value = config.RecordingPath || ''; - page.querySelector('#txtMovieRecordingPath').value = config.MovieRecordingPath || ''; - page.querySelector('#txtSeriesRecordingPath').value = config.SeriesRecordingPath || ''; - page.querySelector('#txtPostProcessor').value = config.RecordingPostProcessor || ''; - page.querySelector('#txtPostProcessorArguments').value = config.RecordingPostProcessorArguments || ''; - page.querySelector('#chkSaveRecordingNFO').checked = config.SaveRecordingNFO; - page.querySelector('#chkSaveRecordingImages').checked = config.SaveRecordingImages; - loading.hide(); -} - -function onSubmit() { - loading.show(); - const form = this; - ApiClient.getNamedConfiguration('livetv').then(function (config) { - config.GuideDays = form.querySelector('#selectGuideDays').value || null; - const recordingPath = form.querySelector('#txtRecordingPath').value || null; - const movieRecordingPath = form.querySelector('#txtMovieRecordingPath').value || null; - const seriesRecordingPath = form.querySelector('#txtSeriesRecordingPath').value || null; - const recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath; - config.RecordingPath = recordingPath; - config.MovieRecordingPath = movieRecordingPath; - config.SeriesRecordingPath = seriesRecordingPath; - config.RecordingEncodingFormat = 'mkv'; - config.PrePaddingSeconds = 60 * form.querySelector('#txtPrePaddingMinutes').value; - config.PostPaddingSeconds = 60 * form.querySelector('#txtPostPaddingMinutes').value; - config.RecordingPostProcessor = form.querySelector('#txtPostProcessor').value; - config.RecordingPostProcessorArguments = form.querySelector('#txtPostProcessorArguments').value; - config.SaveRecordingNFO = form.querySelector('#chkSaveRecordingNFO').checked; - config.SaveRecordingImages = form.querySelector('#chkSaveRecordingImages').checked; - ApiClient.updateNamedConfiguration('livetv', config).then(function () { - Dashboard.processServerConfigurationUpdateResult(); - showSaveMessage(recordingPathChanged); - }); - }); - return false; -} - -function showSaveMessage(recordingPathChanged) { - let msg = ''; - - if (recordingPathChanged) { - msg += globalize.translate('MessageChangeRecordingPath'); - } - - if (msg) { - alert(msg); - } -} - -$(document).on('pageinit', '#liveTvSettingsPage', function () { - const page = this; - $('.liveTvSettingsForm').off('submit', onSubmit).on('submit', onSubmit); - $('#btnSelectRecordingPath', page).on('click.selectDirectory', function () { - import('components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { - const picker = new DirectoryBrowser(); - picker.show({ - callback: function (path) { - if (path) { - page.querySelector('#txtRecordingPath').value = path; - } - - picker.close(); - }, - validateWriteable: true - }); - }); - }); - $('#btnSelectMovieRecordingPath', page).on('click.selectDirectory', function () { - import('components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { - const picker = new DirectoryBrowser(); - picker.show({ - callback: function (path) { - if (path) { - page.querySelector('#txtMovieRecordingPath').value = path; - } - - picker.close(); - }, - validateWriteable: true - }); - }); - }); - $('#btnSelectSeriesRecordingPath', page).on('click.selectDirectory', function () { - import('components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { - const picker = new DirectoryBrowser(); - picker.show({ - callback: function (path) { - if (path) { - page.querySelector('#txtSeriesRecordingPath').value = path; - } - - picker.close(); - }, - validateWriteable: true - }); - }); - }); - $('#btnSelectPostProcessorPath', page).on('click.selectDirectory', function () { - import('components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { - const picker = new DirectoryBrowser(); - picker.show({ - includeFiles: true, - callback: function (path) { - if (path) { - page.querySelector('#txtPostProcessor').value = path; - } - - picker.close(); - } - }); - }); - }); -}).on('pageshow', '#liveTvSettingsPage', function () { - loading.show(); - const page = this; - ApiClient.getNamedConfiguration('livetv').then(function (config) { - loadPage(page, config); - }); -}); diff --git a/src/apps/dashboard/controllers/plugins/available/index.html b/src/apps/dashboard/controllers/plugins/available/index.html deleted file mode 100644 index 951e74fb9..000000000 --- a/src/apps/dashboard/controllers/plugins/available/index.html +++ /dev/null @@ -1,17 +0,0 @@ -
-
-
-
-

${TabCatalog}

- - - -
-
- -
-
${MessageNoAvailablePlugins}
-
-
-
-
diff --git a/src/apps/dashboard/controllers/plugins/available/index.js b/src/apps/dashboard/controllers/plugins/available/index.js deleted file mode 100644 index f8b05197b..000000000 --- a/src/apps/dashboard/controllers/plugins/available/index.js +++ /dev/null @@ -1,163 +0,0 @@ -import escapeHTML from 'escape-html'; - -import { CATEGORY_LABELS } from 'apps/dashboard/features/plugins/constants/categoryLabels'; -import { getDefaultBackgroundClass } from 'components/cardbuilder/cardBuilderUtils'; -import loading from 'components/loading/loading'; -import globalize from 'lib/globalize'; - -import 'components/cardbuilder/card.scss'; -import 'elements/emby-button/emby-button'; -import 'elements/emby-checkbox/emby-checkbox'; -import 'elements/emby-select/emby-select'; - -function reloadList(page) { - loading.show(); - const promise1 = ApiClient.getAvailablePlugins(); - const promise2 = ApiClient.getInstalledPlugins(); - Promise.all([promise1, promise2]).then(function (responses) { - populateList({ - catalogElement: page.querySelector('#pluginTiles'), - noItemsElement: page.querySelector('#noPlugins'), - availablePlugins: responses[0], - installedPlugins: responses[1] - }); - }); -} - -function getHeaderText(category) { - const categoryKey = category.replaceAll(' ', ''); - - if (CATEGORY_LABELS[categoryKey]) { - return globalize.translate(CATEGORY_LABELS[categoryKey]); - } - - console.warn('[AvailablePlugins] unmapped category label', category); - return category; -} - -function populateList(options) { - const availablePlugins = options.availablePlugins; - const installedPlugins = options.installedPlugins; - - availablePlugins.forEach(function (plugin, index, array) { - plugin.category = plugin.category || 'Other'; - plugin.categoryDisplayName = getHeaderText(plugin.category); - array[index] = plugin; - }); - - availablePlugins.sort(function (a, b) { - if (a.category > b.category) { - return 1; - } else if (b.category > a.category) { - return -1; - } - if (a.name > b.name) { - return 1; - } else if (b.name > a.name) { - return -1; - } - return 0; - }); - - let currentCategory = null; - let html = ''; - - for (const plugin of availablePlugins) { - const category = plugin.categoryDisplayName; - if (category != currentCategory) { - if (currentCategory) { - html += ''; - html += ''; - } - html += '
'; - html += '

' + escapeHTML(category) + '

'; - html += '
'; - currentCategory = category; - } - html += getPluginHtml(plugin, options, installedPlugins); - } - html += '
'; - html += '
'; - - if (!availablePlugins.length && options.noItemsElement) { - options.noItemsElement.classList.remove('hide'); - } - - const searchBar = document.getElementById('txtSearchPlugins'); - if (searchBar) { - searchBar.addEventListener('input', () => onSearchBarType(searchBar)); - } - - options.catalogElement.innerHTML = html; - loading.hide(); -} - -function onSearchBarType(searchBar) { - const filter = searchBar.value.toLowerCase(); - for (const header of document.querySelectorAll('div .verticalSection')) { - // keep track of shown cards after each search - let shown = 0; - for (const card of header.querySelectorAll('div .card')) { - if (filter && filter != '' && !card.textContent.toLowerCase().includes(filter)) { - card.style.display = 'none'; - } else { - card.style.display = 'unset'; - shown++; - } - } - // hide title if no cards are shown - if (shown <= 0) { - header.style.display = 'none'; - } else { - header.style.display = 'unset'; - } - } -} - -function getPluginHtml(plugin, options, installedPlugins) { - let html = ''; - let href = plugin.externalUrl ? plugin.externalUrl : - `#/dashboard/plugins/${plugin.guid}?name=${encodeURIComponent(plugin.name)}`; - - if (options.context) { - href += '&context=' + options.context; - } - - const target = plugin.externalUrl ? ' target="_blank"' : ''; - html += "
"; - html += '
'; - html += ''; - html += '
'; - html += "
"; - html += escapeHTML(plugin.name); - html += '
'; - const installedPlugin = installedPlugins.find(installed => installed.Id === plugin.guid); - html += "
"; - html += installedPlugin ? globalize.translate('LabelVersionInstalled', installedPlugin.Version) : ' '; - html += '
'; - html += '
'; - html += '
'; - html += '
'; - return html; -} - -export default function (view) { - view.addEventListener('viewshow', function () { - reloadList(this); - }); -} diff --git a/src/apps/dashboard/controllers/plugins/installed/index.html b/src/apps/dashboard/controllers/plugins/installed/index.html deleted file mode 100644 index b29fd6eee..000000000 --- a/src/apps/dashboard/controllers/plugins/installed/index.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
-
-
-

${TabMyPlugins}

-
-
- -
-
-
-
-
diff --git a/src/apps/dashboard/controllers/plugins/installed/index.js b/src/apps/dashboard/controllers/plugins/installed/index.js deleted file mode 100644 index b3971ecf1..000000000 --- a/src/apps/dashboard/controllers/plugins/installed/index.js +++ /dev/null @@ -1,251 +0,0 @@ -import loading from 'components/loading/loading'; -import dom from 'scripts/dom'; -import globalize from 'lib/globalize'; -import 'components/cardbuilder/card.scss'; -import 'elements/emby-button/emby-button'; -import Dashboard, { pageIdOn } from 'utils/dashboard'; -import confirm from 'components/confirm/confirm'; -import { getDefaultBackgroundClass } from 'components/cardbuilder/cardBuilderUtils'; - -function deletePlugin(page, uniqueid, version, name) { - const msg = globalize.translate('UninstallPluginConfirmation', name); - - confirm({ - title: globalize.translate('HeaderUninstallPlugin'), - text: msg, - primary: 'delete', - confirmText: globalize.translate('HeaderUninstallPlugin') - }).then(function () { - loading.show(); - ApiClient.uninstallPluginByVersion(uniqueid, version).then(function () { - reloadList(page); - }); - }); -} - -function enablePlugin(page, uniqueid, version) { - loading.show(); - ApiClient.enablePlugin(uniqueid, version).then(function () { - reloadList(page); - }); -} - -function disablePlugin(page, uniqueid, version) { - loading.show(); - ApiClient.disablePlugin(uniqueid, version).then(function () { - reloadList(page); - }); -} - -function showNoConfigurationMessage() { - Dashboard.alert({ - message: globalize.translate('MessageNoPluginConfiguration') - }); -} - -function showConnectMessage() { - Dashboard.alert({ - message: globalize.translate('MessagePluginConfigurationRequiresLocalAccess') - }); -} - -function getPluginCardHtml(plugin, pluginConfigurationPages) { - const configPage = pluginConfigurationPages.filter(function (pluginConfigurationPage) { - return pluginConfigurationPage.PluginId == plugin.Id; - })[0]; - - const configPageUrl = configPage ? Dashboard.getPluginUrl(configPage.Name) : null; - let html = ''; - - html += `
`; - html += '
'; - html += ''; - html += '
'; - - if (configPage || plugin.CanUninstall) { - if (globalize.getIsRTL()) { - html += '
'; - } else { - html += '
'; - } - html += ''; - html += '
'; - } - - html += '
'; - html += `${plugin.Name}${plugin.Version}`; - html += '
'; - html += `
${globalize.translate('LabelStatus')} ${plugin.Status}
`; - html += '
'; - html += '
'; - html += '
'; - return html; -} - -function renderPlugins(page, plugins) { - ApiClient.getJSON(ApiClient.getUrl('web/configurationpages') + '?pageType=PluginConfiguration').then(function (configPages) { - populateList(page, plugins, configPages); - }); -} - -function populateList(page, plugins, pluginConfigurationPages) { - plugins = plugins.sort(function (plugin1, plugin2) { - if (plugin1.Name > plugin2.Name) { - return 1; - } - return -1; - }); - - let html = plugins.map(function (p) { - return getPluginCardHtml(p, pluginConfigurationPages); - }).join(''); - - const installedPluginsElement = page.querySelector('.installedPlugins'); - installedPluginsElement.removeEventListener('click', onInstalledPluginsClick); - installedPluginsElement.addEventListener('click', onInstalledPluginsClick); - - if (plugins.length) { - installedPluginsElement.classList.add('itemsContainer'); - installedPluginsElement.classList.add('vertical-wrap'); - } else { - html += '
'; - html += '

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

'; - html += '

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

'; - html += '
'; - } - - // add search box listener - const searchBar = page.querySelector('#txtSearchPlugins'); - if (searchBar) { - searchBar.addEventListener('input', () => onFilterType(page, searchBar)); - } - - installedPluginsElement.innerHTML = html; - loading.hide(); -} - -function showPluginMenu(page, elem) { - const card = dom.parentWithClass(elem, 'card'); - const id = card.getAttribute('data-id'); - const name = card.getAttribute('data-name'); - const removable = card.getAttribute('data-removable'); - const configHref = card.querySelector('.cardImageContainer').getAttribute('href'); - const status = card.getAttribute('data-status'); - const version = card.getAttribute('data-version'); - const menuItems = []; - - if (configHref) { - menuItems.push({ - name: globalize.translate('Settings'), - id: 'open', - icon: 'mode_edit' - }); - } - - if (removable === 'true') { - if (status === 'Disabled') { - menuItems.push({ - name: globalize.translate('EnablePlugin'), - id: 'enable', - icon: 'check_circle_outline' - }); - } - - if (status === 'Active') { - menuItems.push({ - name: globalize.translate('DisablePlugin'), - id: 'disable', - icon: 'do_not_disturb' - }); - } - - menuItems.push({ - name: globalize.translate('ButtonUninstall'), - id: 'delete', - icon: 'delete' - }); - } - - import('components/actionSheet/actionSheet').then((actionsheet) => { - actionsheet.show({ - items: menuItems, - positionTo: elem, - callback: function (resultId) { - switch (resultId) { - case 'open': - Dashboard.navigate(configHref); - break; - case 'delete': - deletePlugin(page, id, version, name); - break; - case 'enable': - enablePlugin(page, id, version); - break; - case 'disable': - disablePlugin(page, id, version); - break; - } - } - }); - }); -} - -function reloadList(page) { - loading.show(); - ApiClient.getInstalledPlugins().then(function (plugins) { - renderPlugins(page, plugins); - }); -} - -function onInstalledPluginsClick(e) { - if (dom.parentWithClass(e.target, 'noConfigPluginCard')) { - showNoConfigurationMessage(); - } else if (dom.parentWithClass(e.target, 'connectModePluginCard')) { - showConnectMessage(); - } else { - const btnCardMenu = dom.parentWithClass(e.target, 'btnCardMenu'); - if (btnCardMenu) { - showPluginMenu(dom.parentWithClass(btnCardMenu, 'page'), btnCardMenu); - } - } -} - -function onFilterType(page, searchBar) { - const filter = searchBar.value.toLowerCase(); - for (const card of page.querySelectorAll('.card')) { - if (filter && filter != '' && !card.textContent.toLowerCase().includes(filter)) { - card.style.display = 'none'; - } else { - card.style.display = 'unset'; - } - } -} - -pageIdOn('pageshow', 'pluginsPage', function () { - reloadList(this); -}); - -window.PluginsPage = { - renderPlugins: renderPlugins -}; diff --git a/src/apps/dashboard/controllers/plugins/repositories/index.html b/src/apps/dashboard/controllers/plugins/repositories/index.html deleted file mode 100644 index a775da4b4..000000000 --- a/src/apps/dashboard/controllers/plugins/repositories/index.html +++ /dev/null @@ -1,19 +0,0 @@ -
-
-
-
-

${TabRepositories}

- -
- -
- -
-

${MessageNoRepositories}

-

${MessageAddRepository}

-
-
-
-
diff --git a/src/apps/dashboard/controllers/plugins/repositories/index.js b/src/apps/dashboard/controllers/plugins/repositories/index.js deleted file mode 100644 index 8eb0265f7..000000000 --- a/src/apps/dashboard/controllers/plugins/repositories/index.js +++ /dev/null @@ -1,190 +0,0 @@ -import loading from 'components/loading/loading'; -import globalize from 'lib/globalize'; -import dialogHelper from 'components/dialogHelper/dialogHelper'; -import confirm from 'components/confirm/confirm'; - -import 'elements/emby-button/emby-button'; -import 'elements/emby-checkbox/emby-checkbox'; -import 'elements/emby-select/emby-select'; - -import 'components/formdialog.scss'; -import 'components/listview/listview.scss'; - -let repositories = []; - -function reloadList(page) { - loading.show(); - ApiClient.getJSON(ApiClient.getUrl('Repositories')).then(list => { - repositories = list; - populateList({ - listElement: page.querySelector('#repositories'), - noneElement: page.querySelector('#none'), - repositories: repositories - }); - }).catch(e => { - console.error('error loading repositories', e); - page.querySelector('#none').classList.remove('hide'); - loading.hide(); - }); -} - -function saveList(page) { - loading.show(); - ApiClient.ajax({ - type: 'POST', - url: ApiClient.getUrl('Repositories'), - data: JSON.stringify(repositories), - contentType: 'application/json' - }).then(() => { - reloadList(page); - }).catch(e => { - console.error('error saving repositories', e); - loading.hide(); - }); -} - -function populateList(options) { - const paperList = document.createElement('div'); - paperList.className = 'paperList'; - - options.repositories.forEach(repo => { - paperList.appendChild(getRepositoryElement(repo)); - }); - - if (!options.repositories.length) { - options.noneElement.classList.remove('hide'); - } else { - options.noneElement.classList.add('hide'); - } - - options.listElement.innerHTML = ''; - options.listElement.appendChild(paperList); - loading.hide(); -} - -function getRepositoryElement(repository) { - const listItem = document.createElement('div'); - listItem.className = 'listItem listItem-border'; - - const repoLink = document.createElement('a', 'emby-linkbutton'); - repoLink.classList.add('clearLink', 'listItemIconContainer'); - repoLink.style.margin = '0'; - repoLink.style.padding = '0'; - repoLink.rel = 'noopener noreferrer'; - repoLink.target = '_blank'; - repoLink.href = repository.Url; - repoLink.innerHTML = ''; - listItem.appendChild(repoLink); - - const body = document.createElement('div'); - body.className = 'listItemBody two-line'; - - const name = document.createElement('h3'); - name.className = 'listItemBodyText'; - name.innerText = repository.Name; - body.appendChild(name); - - const url = document.createElement('div'); - url.className = 'listItemBodyText secondary'; - url.innerText = repository.Url; - body.appendChild(url); - - listItem.appendChild(body); - - const button = document.createElement('button', 'paper-icon-button-light'); - button.type = 'button'; - button.classList.add('btnDelete'); - button.id = repository.Url; - button.title = globalize.translate('Delete'); - button.innerHTML = ''; - listItem.appendChild(button); - - return listItem; -} - -export default function(view) { - view.addEventListener('viewshow', function () { - reloadList(this); - - const save = this; - $('#repositories', view).on('click', '.btnDelete', function() { - const button = this; - repositories = repositories.filter(function (r) { - return r.Url !== button.id; - }); - - saveList(save); - }); - }); - - view.querySelector('.btnNewRepository').addEventListener('click', () => { - const dialog = dialogHelper.createDialog({ - scrollY: false, - size: 'large', - modal: false, - removeOnClose: true - }); - - let html = ''; - - html += '
'; - html += ``; - html += `

${globalize.translate('HeaderNewRepository')}

`; - html += '
'; - html += '
'; - html += '
'; - html += ``; - html += `
${globalize.translate('LabelRepositoryNameHelp')}
`; - html += '
'; - html += '
'; - html += ``; - html += `
${globalize.translate('LabelRepositoryUrlHelp')}
`; - html += '
'; - html += ``; - html += '
'; - html += ''; - - dialog.innerHTML = html; - dialog.querySelector('.btnCancel').addEventListener('click', () => { - dialogHelper.close(dialog); - }); - - dialog.querySelector('.newPluginForm').addEventListener('submit', e => { - e.preventDefault(); - - const repositoryUrl = dialog.querySelector('#txtRepositoryUrl').value.toLowerCase(); - - const alertCallback = function () { - repositories.push({ - Name: dialog.querySelector('#txtRepositoryName').value, - Url: dialog.querySelector('#txtRepositoryUrl').value, - Enabled: true - }); - saveList(view); - dialogHelper.close(dialog); - }; - - // Check the repository URL for the official Jellyfin repository domain, or - // present the warning for 3rd party plugins. - if (!repositoryUrl.startsWith('https://repo.jellyfin.org/')) { - let msg = globalize.translate('MessageRepositoryInstallDisclaimer'); - msg += '
'; - msg += '
'; - msg += globalize.translate('PleaseConfirmRepositoryInstallation'); - - confirm(msg, globalize.translate('HeaderConfirmRepositoryInstallation')).then(function () { - alertCallback(); - }).catch(() => { - console.debug('repository not installed'); - dialogHelper.close(dialog); - }); - } else { - alertCallback(); - } - - return false; - }); - - dialogHelper.open(dialog); - }); -} diff --git a/src/apps/dashboard/features/backups/api/useBackups.ts b/src/apps/dashboard/features/backups/api/useBackups.ts new file mode 100644 index 000000000..842879b4e --- /dev/null +++ b/src/apps/dashboard/features/backups/api/useBackups.ts @@ -0,0 +1,37 @@ +import { Api } from '@jellyfin/sdk'; +import { BackupApi } from '@jellyfin/sdk/lib/generated-client/api/backup-api'; +import { useQuery } from '@tanstack/react-query'; +import type { AxiosRequestConfig } from 'axios'; +import { useApi } from 'hooks/useApi'; + +export const QUERY_KEY = 'Backups'; + +const fetchBackups = async (api: Api, options?: AxiosRequestConfig) => { + // FIXME: Replace with getBackupApi when available in SDK + const backupApi = new BackupApi(api.configuration, undefined, api.axiosInstance); + + const response = await backupApi.listBackups(options); + + const backups = response.data; + + backups.sort((a, b) => { + if (a.DateCreated && b.DateCreated) { + return new Date(b.DateCreated).getTime() - new Date(a.DateCreated).getTime(); + } else { + return 0; + } + }); + + return backups; +}; + +export const useBackups = () => { + const { api } = useApi(); + + return useQuery({ + queryKey: [ QUERY_KEY ], + queryFn: ({ signal }) => + fetchBackups(api!, { signal }), + enabled: !!api + }); +}; diff --git a/src/apps/dashboard/features/backups/api/useCreateBackup.ts b/src/apps/dashboard/features/backups/api/useCreateBackup.ts new file mode 100644 index 000000000..19861d096 --- /dev/null +++ b/src/apps/dashboard/features/backups/api/useCreateBackup.ts @@ -0,0 +1,25 @@ +import type { BackupOptionsDto } from '@jellyfin/sdk/lib/generated-client/models/backup-options-dto'; +import { BackupApi } from '@jellyfin/sdk/lib/generated-client/api/backup-api'; +import { useMutation } from '@tanstack/react-query'; +import { useApi } from 'hooks/useApi'; +import { QUERY_KEY } from './useBackups'; +import { queryClient } from 'utils/query/queryClient'; + +export const useCreateBackup = () => { + const { api } = useApi(); + // FIXME: Replace with getBackupApi when available in SDK + const backupApi = new BackupApi(api?.configuration, undefined, api?.axiosInstance); + + return useMutation({ + mutationFn: (backupOptions: BackupOptionsDto) => ( + backupApi.createBackup({ + backupOptionsDto: backupOptions + }) + ), + onSuccess: () => { + void queryClient.invalidateQueries({ + queryKey: [ QUERY_KEY ] + }); + } + }); +}; diff --git a/src/apps/dashboard/features/backups/api/useRestoreBackup.ts b/src/apps/dashboard/features/backups/api/useRestoreBackup.ts new file mode 100644 index 000000000..0ecafbfb5 --- /dev/null +++ b/src/apps/dashboard/features/backups/api/useRestoreBackup.ts @@ -0,0 +1,19 @@ +import { BackupApi } from '@jellyfin/sdk/lib/generated-client/api/backup-api'; +import { useMutation } from '@tanstack/react-query'; +import { useApi } from 'hooks/useApi'; + +export const useRestoreBackup = () => { + const { api } = useApi(); + // FIXME: Replace with getBackupApi when available in SDK + const backupApi = new BackupApi(api?.configuration, undefined, api?.axiosInstance); + + return useMutation({ + mutationFn: (fileName: string) => ( + backupApi.startRestoreBackup({ + backupRestoreRequestDto: { + ArchiveFileName: fileName + } + }) + ) + }); +}; diff --git a/src/apps/dashboard/features/backups/components/Backup.tsx b/src/apps/dashboard/features/backups/components/Backup.tsx new file mode 100644 index 000000000..e7c622d3b --- /dev/null +++ b/src/apps/dashboard/features/backups/components/Backup.tsx @@ -0,0 +1,68 @@ +import React, { FunctionComponent, useCallback, useState } from 'react'; +import type { BackupManifestDto } from '@jellyfin/sdk/lib/generated-client/models/backup-manifest-dto'; +import IconButton from '@mui/material/IconButton'; +import ListItem from '@mui/material/ListItem'; +import Restore from '@mui/icons-material/Restore'; +import ListItemButton from '@mui/material/ListItemButton'; +import ListItemText from '@mui/material/ListItemText'; +import Tooltip from '@mui/material/Tooltip'; +import globalize from 'lib/globalize'; +import BackupInfoDialog from './BackupInfoDialog'; + +type BackupProps = { + backup: BackupManifestDto; + onRestore: (backup: BackupManifestDto) => void; +}; + +const Backup: FunctionComponent = ({ backup, onRestore }) => { + const [ isInfoDialogOpen, setIsInfoDialogOpen ] = useState(false); + + const onDialogClose = useCallback(() => { + setIsInfoDialogOpen(false); + }, []); + + const openDialog = useCallback(() => { + setIsInfoDialogOpen(true); + }, []); + + const restore = useCallback(() => { + onRestore(backup); + }, [ backup, onRestore ]); + + return ( + <> + + + + + + + } + > + + + + + + ); +}; + +export default Backup; diff --git a/src/apps/dashboard/features/backups/components/BackupInfoDialog.tsx b/src/apps/dashboard/features/backups/components/BackupInfoDialog.tsx new file mode 100644 index 000000000..d83a768fb --- /dev/null +++ b/src/apps/dashboard/features/backups/components/BackupInfoDialog.tsx @@ -0,0 +1,135 @@ +import type { BackupManifestDto } from '@jellyfin/sdk/lib/generated-client/models/backup-manifest-dto'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogTitle from '@mui/material/DialogTitle'; +import Box from '@mui/material/Box'; +import globalize from 'lib/globalize'; +import React, { FunctionComponent, useCallback } from 'react'; +import Stack from '@mui/material/Stack'; +import FormGroup from '@mui/material/FormGroup'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Checkbox from '@mui/material/Checkbox'; +import ContentCopy from '@mui/icons-material/ContentCopy'; +import IconButton from '@mui/material/IconButton'; +import { copy } from 'scripts/clipboard'; +import toast from 'components/toast/toast'; + +type IProps = { + backup: BackupManifestDto; + open: boolean; + onClose: () => void; +}; + +const BackupInfoDialog: FunctionComponent = ({ backup, open, onClose }: IProps) => { + const copyPath = useCallback(async () => { + if (backup.Path) { + await copy(backup.Path); + toast({ text: globalize.translate('Copied') }); + } + }, [ backup.Path ]); + + return ( + + + {backup.DateCreated} + + + + + + + {globalize.translate('LabelPath')} + + {backup.Path} + + + + + + + {globalize.translate('LabelVersion')} + {backup.ServerVersion} + + + + + + + } + label={globalize.translate('LabelDatabase')} + /> + + + + + } + label={globalize.translate('LabelMetadata')} + /> + + + + + } + label={globalize.translate('Subtitles')} + /> + + + + + } + label={globalize.translate('Trickplay')} + /> + + + + + + + + + + ); +}; + +export default BackupInfoDialog; diff --git a/src/apps/dashboard/features/backups/components/BackupProgressDialog.tsx b/src/apps/dashboard/features/backups/components/BackupProgressDialog.tsx new file mode 100644 index 000000000..bcf158d2a --- /dev/null +++ b/src/apps/dashboard/features/backups/components/BackupProgressDialog.tsx @@ -0,0 +1,27 @@ +import React, { FunctionComponent } from 'react'; +import Dialog from '@mui/material/Dialog'; +import DialogContent from '@mui/material/DialogContent'; +import DialogTitle from '@mui/material/DialogTitle'; +import LinearProgress from '@mui/material/LinearProgress'; +import globalize from 'lib/globalize'; + +type IProps = { + open: boolean +}; + +const BackupProgressDialog: FunctionComponent = ({ open }) => { + return ( + + {globalize.translate('MessageBackupInProgress')} + + + + + ); +}; + +export default BackupProgressDialog; diff --git a/src/apps/dashboard/features/backups/components/CreateBackupForm.tsx b/src/apps/dashboard/features/backups/components/CreateBackupForm.tsx new file mode 100644 index 000000000..000af98a1 --- /dev/null +++ b/src/apps/dashboard/features/backups/components/CreateBackupForm.tsx @@ -0,0 +1,123 @@ +import React, { FunctionComponent, useCallback } from 'react'; +import globalize from 'lib/globalize'; +import type { BackupOptionsDto } from '@jellyfin/sdk/lib/generated-client/models/backup-options-dto'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import Stack from '@mui/material/Stack'; +import DialogActions from '@mui/material/DialogActions'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Checkbox from '@mui/material/Checkbox'; +import FormGroup from '@mui/material/FormGroup'; +import DialogContentText from '@mui/material/DialogContentText'; + +type IProps = { + open: boolean, + onClose?: () => void, + onCreate: (backupOptions: BackupOptionsDto) => void +}; + +const CreateBackupForm: FunctionComponent = ({ open, onClose, onCreate }) => { + const onSubmit = useCallback((e: React.FormEvent) => { + e.preventDefault(); + + const formData = new FormData(e.currentTarget); + + const data = Object.fromEntries(formData.entries()); + + const backupOptions: BackupOptionsDto = { + 'Metadata': data.Metadata?.toString() === 'on', + 'Trickplay': data.Trickplay?.toString() === 'on', + 'Subtitles': data.Subtitles?.toString() === 'on' + }; + + onCreate(backupOptions); + }, [ onCreate ]); + + return ( + + {globalize.translate('ButtonCreateBackup')} + + + + + {globalize.translate('MessageBackupDisclaimer')} + + + + + } + label={globalize.translate('LabelDatabase')} + /> + + + + + } + label={globalize.translate('LabelMetadata')} + /> + + + + + } + label={globalize.translate('Subtitles')} + /> + + + + + } + label={globalize.translate('Trickplay')} + /> + + + + + + + + + + + ); +}; + +export default CreateBackupForm; diff --git a/src/apps/dashboard/features/backups/components/RestoreConfirmationDialog.tsx b/src/apps/dashboard/features/backups/components/RestoreConfirmationDialog.tsx new file mode 100644 index 000000000..3b51204b6 --- /dev/null +++ b/src/apps/dashboard/features/backups/components/RestoreConfirmationDialog.tsx @@ -0,0 +1,46 @@ +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import DialogTitle from '@mui/material/DialogTitle'; +import globalize from 'lib/globalize'; +import React, { FunctionComponent } from 'react'; + +type IProps = { + open: boolean; + onClose: () => void; + onConfirm: () => void; +}; + +const RestoreConfirmationDialog: FunctionComponent = ({ open, onClose, onConfirm }: IProps) => { + return ( + + + {globalize.translate('LabelRestore')} + + + + + {globalize.translate('MessageRestoreDisclaimer')} + + + + + + + + + ); +}; + +export default RestoreConfirmationDialog; diff --git a/src/apps/dashboard/features/backups/components/RestoreProgressDialog.tsx b/src/apps/dashboard/features/backups/components/RestoreProgressDialog.tsx new file mode 100644 index 000000000..937aaafba --- /dev/null +++ b/src/apps/dashboard/features/backups/components/RestoreProgressDialog.tsx @@ -0,0 +1,32 @@ +import React, { FunctionComponent } from 'react'; +import Dialog from '@mui/material/Dialog'; +import DialogContent from '@mui/material/DialogContent'; +import DialogTitle from '@mui/material/DialogTitle'; +import LinearProgress from '@mui/material/LinearProgress'; +import DialogContentText from '@mui/material/DialogContentText'; +import Stack from '@mui/material/Stack'; +import globalize from 'lib/globalize'; + +type IProps = { + open: boolean +}; + +const RestoreProgressDialog: FunctionComponent = ({ open }) => { + return ( + + {globalize.translate('MessageRestoreInProgress')} + + + {globalize.translate('MessageWaitingForServer')} + + + + + ); +}; + +export default RestoreProgressDialog; diff --git a/src/apps/dashboard/features/metrics/api/useItemCounts.ts b/src/apps/dashboard/features/metrics/api/useItemCounts.ts new file mode 100644 index 000000000..ee2ef772d --- /dev/null +++ b/src/apps/dashboard/features/metrics/api/useItemCounts.ts @@ -0,0 +1,33 @@ +import type { Api } from '@jellyfin/sdk'; +import type { LibraryApiGetItemCountsRequest } from '@jellyfin/sdk/lib/generated-client/api/library-api'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; +import { queryOptions, useQuery } from '@tanstack/react-query'; +import type { AxiosRequestConfig } from 'axios'; + +import { useApi } from 'hooks/useApi'; + +const fetchItemCounts = async ( + api: Api, + params?: LibraryApiGetItemCountsRequest, + options?: AxiosRequestConfig +) => { + const response = await getLibraryApi(api) + .getItemCounts(params, options); + return response.data; +}; + +const getItemCountsQuery = ( + api?: Api, + params?: LibraryApiGetItemCountsRequest +) => queryOptions({ + queryKey: [ 'ItemCounts', params ], + queryFn: ({ signal }) => fetchItemCounts(api!, params, { signal }), + enabled: !!api +}); + +export const useItemCounts = ( + params?: LibraryApiGetItemCountsRequest +) => { + const { api } = useApi(); + return useQuery(getItemCountsQuery(api, params)); +}; diff --git a/src/apps/dashboard/features/metrics/components/MetricCard.tsx b/src/apps/dashboard/features/metrics/components/MetricCard.tsx new file mode 100644 index 000000000..f251d7aab --- /dev/null +++ b/src/apps/dashboard/features/metrics/components/MetricCard.tsx @@ -0,0 +1,71 @@ +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import Skeleton from '@mui/material/Skeleton'; +import Stack from '@mui/material/Stack'; +import SvgIcon from '@mui/material/SvgIcon'; +import Typography from '@mui/material/Typography'; +import React, { type FC } from 'react'; + +import { useLocale } from 'hooks/useLocale'; +import { toDecimalString } from 'utils/number'; + +interface Metric { + label: string + value?: number +} + +export interface MetricCardProps { + metrics: Metric[] + Icon: typeof SvgIcon +} + +const MetricCard: FC = ({ + metrics, + Icon +}) => { + const { dateTimeLocale } = useLocale(); + + return ( + + + {metrics.map(({ label, value }) => ( + + + {label} + + + {typeof value !== 'undefined' ? ( + toDecimalString(value, dateTimeLocale) + ) : ( + + )} + + + ))} + + + + ); +}; + +export default MetricCard; diff --git a/src/apps/dashboard/features/playback/constants/codecs.ts b/src/apps/dashboard/features/playback/constants/codecs.ts new file mode 100644 index 000000000..98b3e5fad --- /dev/null +++ b/src/apps/dashboard/features/playback/constants/codecs.ts @@ -0,0 +1,113 @@ +/** List of codecs and their supported hardware acceleration types */ +export const CODECS = [ + { + name: 'H264', + codec: 'h264', + types: [ + 'amf', + 'nvenc', + 'qsv', + 'vaapi', + 'rkmpp', + 'videotoolbox', + 'v4l2m2m' + ] + }, + { + name: 'HEVC', + codec: 'hevc', + types: [ + 'amf', + 'nvenc', + 'qsv', + 'vaapi', + 'rkmpp', + 'videotoolbox' + ] + }, + { + name: 'MPEG1', + codec: 'mpeg1video', + types: [ 'rkmpp' ] + }, + { + name: 'MPEG2', + codec: 'mpeg2video', + types: [ + 'amf', + 'nvenc', + 'qsv', + 'vaapi', + 'rkmpp' + ] + }, + { + name: 'MPEG4', + codec: 'mpeg4', + types: [ + 'nvenc', + 'rkmpp' + ] + }, + { + name: 'VC1', + codec: 'vc1', + types: [ + 'amf', + 'nvenc', + 'qsv', + 'vaapi' + ] + }, + { + name: 'VP8', + codec: 'vp8', + types: [ + 'nvenc', + 'qsv', + 'vaapi', + 'rkmpp', + 'videotoolbox' + ] + }, + { + name: 'VP9', + codec: 'vp9', + types: [ + 'amf', + 'nvenc', + 'qsv', + 'vaapi', + 'rkmpp', + 'videotoolbox' + ] + }, + { + name: 'AV1', + codec: 'av1', + types: [ + 'amf', + 'nvenc', + 'qsv', + 'vaapi', + 'rkmpp', + 'videotoolbox' + ] + } +]; + +/** Hardware decoders which support 10-bit HEVC & VP9 */ +export const HEVC_VP9_HW_DECODING_TYPES = [ + 'amf', + 'nvenc', + 'qsv', + 'vaapi', + 'rkmpp' +]; + +/** Hardware decoders which support HEVC RExt */ +export const HEVC_REXT_DECODING_TYPES = [ + 'nvenc', + 'qsv', + 'vaapi' +]; diff --git a/src/apps/dashboard/features/plugins/api/queryKey.ts b/src/apps/dashboard/features/plugins/api/queryKey.ts index 72b5d8fc3..f63c94987 100644 --- a/src/apps/dashboard/features/plugins/api/queryKey.ts +++ b/src/apps/dashboard/features/plugins/api/queryKey.ts @@ -1,5 +1,6 @@ export enum QueryKey { ConfigurationPages = 'ConfigurationPages', - PackageInfo = 'PackageInfo', - Plugins = 'Plugins' + Packages = 'Packages', + Plugins = 'Plugins', + Repositories = 'Repositories' } diff --git a/src/apps/dashboard/features/plugins/api/usePackageInfo.ts b/src/apps/dashboard/features/plugins/api/usePackageInfo.ts index e98ac50d3..43ef3f937 100644 --- a/src/apps/dashboard/features/plugins/api/usePackageInfo.ts +++ b/src/apps/dashboard/features/plugins/api/usePackageInfo.ts @@ -7,12 +7,24 @@ import type { AxiosRequestConfig } from 'axios'; import { useApi } from 'hooks/useApi'; import { QueryKey } from './queryKey'; +import { queryClient } from 'utils/query/queryClient'; +import type { PackageInfo } from '@jellyfin/sdk/lib/generated-client/models/package-info'; const fetchPackageInfo = async ( api: Api, params: PackageApiGetPackageInfoRequest, options?: AxiosRequestConfig ) => { + const packagesData = queryClient.getQueryData([ QueryKey.Packages ]) as PackageInfo[]; + if (packagesData && params.assemblyGuid) { + // Use cached query to avoid re-fetching + const pkg = packagesData.find(v => v.guid === params.assemblyGuid); + + if (pkg) { + return pkg; + } + } + const response = await getPackageApi(api) .getPackageInfo(params, options); return response.data; @@ -24,7 +36,7 @@ const getPackageInfoQuery = ( ) => queryOptions({ // Don't retry since requests for plugins not available in repos fail retry: false, - queryKey: [ QueryKey.PackageInfo, params?.name, params?.assemblyGuid ], + queryKey: [ QueryKey.Packages, params?.name, params?.assemblyGuid ], queryFn: ({ signal }) => fetchPackageInfo(api!, params!, { signal }), enabled: !!params && !!api && !!params.name }); diff --git a/src/apps/dashboard/features/plugins/api/usePackages.ts b/src/apps/dashboard/features/plugins/api/usePackages.ts new file mode 100644 index 000000000..45fe3e76e --- /dev/null +++ b/src/apps/dashboard/features/plugins/api/usePackages.ts @@ -0,0 +1,32 @@ +import type { Api } from '@jellyfin/sdk'; +import { getPackageApi } from '@jellyfin/sdk/lib/utils/api/package-api'; +import { queryOptions, useQuery } from '@tanstack/react-query'; +import type { AxiosRequestConfig } from 'axios'; + +import { useApi } from 'hooks/useApi'; + +import { QueryKey } from './queryKey'; + +const fetchPackages = async ( + api: Api, + options?: AxiosRequestConfig +) => { + const response = await getPackageApi(api) + .getPackages(options); + return response.data; +}; + +const getPackagesQuery = ( + api?: Api +) => queryOptions({ + queryKey: [ QueryKey.Packages ], + queryFn: ({ signal }) => fetchPackages(api!, { signal }), + enabled: !!api, + staleTime: 15 * 60 * 1000 // 15 minutes +}); + +export const usePackages = () => { + const { api } = useApi(); + return useQuery(getPackagesQuery(api)); +}; + diff --git a/src/apps/dashboard/features/plugins/api/useRepositories.ts b/src/apps/dashboard/features/plugins/api/useRepositories.ts new file mode 100644 index 000000000..27c5ef1fe --- /dev/null +++ b/src/apps/dashboard/features/plugins/api/useRepositories.ts @@ -0,0 +1,29 @@ +import type { Api } from '@jellyfin/sdk'; +import { queryOptions, useQuery } from '@tanstack/react-query'; +import type { AxiosRequestConfig } from 'axios'; +import { useApi } from 'hooks/useApi'; +import { QueryKey } from './queryKey'; +import { getPackageApi } from '@jellyfin/sdk/lib/utils/api/package-api'; + +const fetchRepositories = async ( + api: Api, + options?: AxiosRequestConfig +) => { + const response = await getPackageApi(api) + .getRepositories(options); + return response.data; +}; + +const getRepositoriesQuery = ( + api?: Api +) => queryOptions({ + queryKey: [ QueryKey.Repositories ], + queryFn: ({ signal }) => fetchRepositories(api!, { signal }), + enabled: !!api +}); + +export const useRepositories = () => { + const { api } = useApi(); + return useQuery(getRepositoriesQuery(api)); +}; + diff --git a/src/apps/dashboard/features/plugins/api/useSetRepositories.ts b/src/apps/dashboard/features/plugins/api/useSetRepositories.ts new file mode 100644 index 000000000..62f958975 --- /dev/null +++ b/src/apps/dashboard/features/plugins/api/useSetRepositories.ts @@ -0,0 +1,21 @@ +import { useMutation } from '@tanstack/react-query'; +import { useApi } from 'hooks/useApi'; +import { queryClient } from 'utils/query/queryClient'; +import { QueryKey } from './queryKey'; +import { getPackageApi } from '@jellyfin/sdk/lib/utils/api/package-api'; +import { PackageApiSetRepositoriesRequest } from '@jellyfin/sdk/lib/generated-client/api/package-api'; + +export const useSetRepositories = () => { + const { api } = useApi(); + return useMutation({ + mutationFn: (params: PackageApiSetRepositoriesRequest) => ( + getPackageApi(api!) + .setRepositories(params) + ), + onSuccess: () => { + void queryClient.invalidateQueries({ + queryKey: [ QueryKey.Repositories ] + }); + } + }); +}; diff --git a/src/apps/dashboard/features/plugins/components/NewRepositoryForm.tsx b/src/apps/dashboard/features/plugins/components/NewRepositoryForm.tsx new file mode 100644 index 000000000..122d2c231 --- /dev/null +++ b/src/apps/dashboard/features/plugins/components/NewRepositoryForm.tsx @@ -0,0 +1,82 @@ +import React, { useCallback } from 'react'; +import type { RepositoryInfo } from '@jellyfin/sdk/lib/generated-client/models/repository-info'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import globalize from 'lib/globalize'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import TextField from '@mui/material/TextField'; + +type IProps = { + open: boolean; + onClose: () => void; + onAdd: (repository: RepositoryInfo) => void; +}; + +const NewRepositoryForm = ({ open, onClose, onAdd }: IProps) => { + const onSubmit = useCallback((e: React.FormEvent) => { + e.preventDefault(); + + const formData = new FormData(e.currentTarget); + const data = Object.fromEntries(formData.entries()); + + const repository: RepositoryInfo = { + Name: data.Name?.toString(), + Url: data.Url?.toString(), + Enabled: true + }; + + onAdd(repository); + }, [ onAdd ]); + + return ( + + {globalize.translate('HeaderNewRepository')} + + + + + + + + + + + + + + + ); +}; + +export default NewRepositoryForm; diff --git a/src/apps/dashboard/features/plugins/components/PackageCard.tsx b/src/apps/dashboard/features/plugins/components/PackageCard.tsx new file mode 100644 index 000000000..0145a2eac --- /dev/null +++ b/src/apps/dashboard/features/plugins/components/PackageCard.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import type { PackageInfo } from '@jellyfin/sdk/lib/generated-client/models/package-info'; +import ExtensionIcon from '@mui/icons-material/Extension'; +import BaseCard from 'apps/dashboard/components/BaseCard'; +import { useLocation } from 'react-router-dom'; + +type IProps = { + pkg: PackageInfo; +}; + +const PackageCard = ({ pkg }: IProps) => { + const location = useLocation(); + + return ( + } + to={{ + pathname: `/dashboard/plugins/${pkg.guid}`, + search: `?name=${encodeURIComponent(pkg.name || '')}`, + hash: location.hash + }} + /> + ); +}; + +export default PackageCard; diff --git a/src/apps/dashboard/features/plugins/components/PluginCard.tsx b/src/apps/dashboard/features/plugins/components/PluginCard.tsx new file mode 100644 index 000000000..3c9d26bca --- /dev/null +++ b/src/apps/dashboard/features/plugins/components/PluginCard.tsx @@ -0,0 +1,172 @@ +import React, { useCallback, useMemo, useRef, useState } from 'react'; +import { useLocation, useNavigate } from 'react-router-dom'; +import { useApi } from 'hooks/useApi'; +import type { PluginInfo } from '@jellyfin/sdk/lib/generated-client/models/plugin-info'; +import globalize from 'lib/globalize'; +import BaseCard from 'apps/dashboard/components/BaseCard'; +import Menu from '@mui/material/Menu'; +import MenuItem from '@mui/material/MenuItem'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import Settings from '@mui/icons-material/Settings'; +import Delete from '@mui/icons-material/Delete'; +import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; +import BlockIcon from '@mui/icons-material/Block'; +import ExtensionIcon from '@mui/icons-material/Extension'; +import ListItemText from '@mui/material/ListItemText'; +import { PluginStatus } from '@jellyfin/sdk/lib/generated-client/models/plugin-status'; +import type { ConfigurationPageInfo } from '@jellyfin/sdk/lib/generated-client/models/configuration-page-info'; +import { useEnablePlugin } from '../api/useEnablePlugin'; +import { useDisablePlugin } from '../api/useDisablePlugin'; +import { useUninstallPlugin } from '../api/useUninstallPlugin'; +import ConfirmDialog from 'components/ConfirmDialog'; + +interface IProps { + plugin: PluginInfo; + configurationPage?: ConfigurationPageInfo; +}; + +const PluginCard = ({ plugin, configurationPage }: IProps) => { + const location = useLocation(); + const navigate = useNavigate(); + const actionRef = useRef(null); + const enablePlugin = useEnablePlugin(); + const disablePlugin = useDisablePlugin(); + const uninstallPlugin = useUninstallPlugin(); + const [ anchorEl, setAnchorEl ] = useState(null); + const [ isMenuOpen, setIsMenuOpen ] = useState(false); + const [ isUninstallConfirmOpen, setIsUninstallConfirmOpen ] = useState(false); + const { api } = useApi(); + + const pluginPage = useMemo(() => ( + { + pathname: '/configurationpage', + search: `?name=${encodeURIComponent(configurationPage?.Name || '')}`, + hash: location.hash + } + ), [ location, configurationPage ]); + + const navigateToPluginSettings = useCallback(() => { + navigate(pluginPage); + }, [ navigate, pluginPage ]); + + const onEnablePlugin = useCallback(() => { + if (plugin.Id && plugin.Version) { + enablePlugin.mutate({ + pluginId: plugin.Id, + version: plugin.Version + }); + setAnchorEl(null); + setIsMenuOpen(false); + } + }, [ plugin, enablePlugin ]); + + const onDisablePlugin = useCallback(() => { + if (plugin.Id && plugin.Version) { + disablePlugin.mutate({ + pluginId: plugin.Id, + version: plugin.Version + }); + setAnchorEl(null); + setIsMenuOpen(false); + } + }, [ plugin, disablePlugin ]); + + const onCloseUninstallConfirmDialog = useCallback(() => { + setIsUninstallConfirmOpen(false); + }, []); + + const showUninstallConfirmDialog = useCallback(() => { + setIsUninstallConfirmOpen(true); + setAnchorEl(null); + setIsMenuOpen(false); + }, []); + + const onUninstall = useCallback(() => { + if (plugin.Id && plugin.Version) { + uninstallPlugin.mutate({ + pluginId: plugin.Id, + version: plugin.Version + }); + setAnchorEl(null); + setIsMenuOpen(false); + } + }, [ plugin, uninstallPlugin ]); + + const onMenuClose = useCallback(() => { + setAnchorEl(null); + setIsMenuOpen(false); + }, []); + + const onActionClick = useCallback(() => { + setAnchorEl(actionRef.current); + setIsMenuOpen(true); + }, []); + + return ( + <> + } + action={true} + actionRef={actionRef} + onActionClick={onActionClick} + /> + + {configurationPage && ( + + + + + {globalize.translate('Settings')} + + )} + + {(plugin.CanUninstall && plugin.Status === PluginStatus.Active) && ( + + + + + {globalize.translate('DisablePlugin')} + + )} + + {(plugin.CanUninstall && plugin.Status === PluginStatus.Disabled) && ( + + + + + {globalize.translate('EnablePlugin')} + + )} + + {plugin.CanUninstall && ( + + + + + {globalize.translate('ButtonUninstall')} + + )} + + + + ); +}; + +export default PluginCard; diff --git a/src/apps/dashboard/features/plugins/components/RepositoryListItem.tsx b/src/apps/dashboard/features/plugins/components/RepositoryListItem.tsx new file mode 100644 index 000000000..c6d59f6ba --- /dev/null +++ b/src/apps/dashboard/features/plugins/components/RepositoryListItem.tsx @@ -0,0 +1,84 @@ +import React, { useCallback, useState } from 'react'; +import type { RepositoryInfo } from '@jellyfin/sdk/lib/generated-client/models/repository-info'; +import ListItem from '@mui/material/ListItem'; +import Tooltip from '@mui/material/Tooltip'; +import Delete from '@mui/icons-material/Delete'; +import globalize from 'lib/globalize'; +import IconButton from '@mui/material/IconButton'; +import ListItemText from '@mui/material/ListItemText'; +import ListItemAvatar from '@mui/material/ListItemAvatar'; +import OpenInNew from '@mui/icons-material/OpenInNew'; +import Avatar from '@mui/material/Avatar'; +import ListItemButton from '@mui/material/ListItemButton'; +import Link from '@mui/material/Link'; +import ConfirmDialog from 'components/ConfirmDialog'; + +type IProps = { + repository: RepositoryInfo; + onDelete: (repository: RepositoryInfo) => void; +}; + +const RepositoryListItem = ({ repository, onDelete }: IProps) => { + const [ isConfirmDeleteOpen, setIsConfirmDeleteOpen ] = useState(false); + + const confirmDeletePrompt = useCallback(() => { + setIsConfirmDeleteOpen(true); + }, []); + + const onCancel = useCallback(() => { + setIsConfirmDeleteOpen(false); + }, []); + + const onConfirmDelete = useCallback(() => { + onDelete(repository); + setIsConfirmDeleteOpen(false); + }, [ onDelete, repository ]); + + return ( + <> + + + + + + + } + > + + + + + + + + + + + + + ); +}; + +export default RepositoryListItem; diff --git a/src/apps/dashboard/features/plugins/constants/categoryLabels.ts b/src/apps/dashboard/features/plugins/constants/categoryLabels.ts index 52be2cef7..3cf460403 100644 --- a/src/apps/dashboard/features/plugins/constants/categoryLabels.ts +++ b/src/apps/dashboard/features/plugins/constants/categoryLabels.ts @@ -1,5 +1,5 @@ /** A mapping of category names used by the plugin repository to translation keys. */ -export const CATEGORY_LABELS = { +export const CATEGORY_LABELS: Record = { Administration: 'HeaderAdmin', Anime: 'Anime', Authentication: 'LabelAuthProvider', // Legacy diff --git a/src/apps/dashboard/features/plugins/utils/getPackageCategories.ts b/src/apps/dashboard/features/plugins/utils/getPackageCategories.ts new file mode 100644 index 000000000..74a9932be --- /dev/null +++ b/src/apps/dashboard/features/plugins/utils/getPackageCategories.ts @@ -0,0 +1,17 @@ +import type { PackageInfo } from '@jellyfin/sdk/lib/generated-client/models/package-info'; + +const getPackageCategories = (packages?: PackageInfo[]) => { + if (!packages) return []; + + const categories: string[] = []; + + for (const pkg of packages) { + if (pkg.category && !categories.includes(pkg.category)) { + categories.push(pkg.category); + } + } + + return categories.sort((a, b) => a.localeCompare(b)); +}; + +export default getPackageCategories; diff --git a/src/apps/dashboard/features/plugins/utils/getPackagesByCategory.ts b/src/apps/dashboard/features/plugins/utils/getPackagesByCategory.ts new file mode 100644 index 000000000..fcaa21ad4 --- /dev/null +++ b/src/apps/dashboard/features/plugins/utils/getPackagesByCategory.ts @@ -0,0 +1,17 @@ +import type { PackageInfo } from '@jellyfin/sdk/lib/generated-client/models/package-info'; + +const getPackagesByCategory = (packages: PackageInfo[] | undefined, category: string) => { + if (!packages) return []; + + return packages + .filter(pkg => pkg.category === category) + .sort((a, b) => { + if (a.name && b.name) { + return a.name.localeCompare(b.name); + } else { + return 0; + } + }); +}; + +export default getPackagesByCategory; diff --git a/src/apps/dashboard/features/storage/api/useSystemStorage.ts b/src/apps/dashboard/features/storage/api/useSystemStorage.ts new file mode 100644 index 000000000..12db4a171 --- /dev/null +++ b/src/apps/dashboard/features/storage/api/useSystemStorage.ts @@ -0,0 +1,28 @@ +import type { Api } from '@jellyfin/sdk'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; +import { queryOptions, useQuery } from '@tanstack/react-query'; +import type { AxiosRequestConfig } from 'axios'; + +import { useApi } from 'hooks/useApi'; + +const fetchSystemStorage = async ( + api: Api, + options?: AxiosRequestConfig +) => { + const response = await getSystemApi(api) + .getSystemStorage(options); + return response.data; +}; + +const getSystemStorageQuery = ( + api?: Api +) => queryOptions({ + queryKey: [ 'SystemStorage' ], + queryFn: ({ signal }) => fetchSystemStorage(api!, { signal }), + enabled: !!api +}); + +export const useSystemStorage = () => { + const { api } = useApi(); + return useQuery(getSystemStorageQuery(api)); +}; diff --git a/src/apps/dashboard/features/storage/components/StorageListItem.tsx b/src/apps/dashboard/features/storage/components/StorageListItem.tsx new file mode 100644 index 000000000..cf8226235 --- /dev/null +++ b/src/apps/dashboard/features/storage/components/StorageListItem.tsx @@ -0,0 +1,100 @@ +import type { FolderStorageDto } from '@jellyfin/sdk/lib/generated-client'; +import LinearProgress from '@mui/material/LinearProgress'; +import ListItem from '@mui/material/ListItem'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import Skeleton from '@mui/material/Skeleton'; +import Typography from '@mui/material/Typography'; +import React, { type FC } from 'react'; + +import globalize from 'lib/globalize'; +import { getReadableSize } from 'utils/file'; + +import { StorageType } from '../constants/StorageType'; +import { calculateTotal, calculateUsedPercentage } from '../utils/space'; + +import StorageTypeIcon from './StorageTypeIcon'; + +interface StorageListItemProps { + label: string + folder?: FolderStorageDto +} + +const getStatusColor = (percent: number) => { + if (percent >= 90) return 'error'; + if (percent >= 80) return 'warning'; + return 'success'; +}; + +const getStorageTypeText = (type?: string | null) => { + if (!type) return undefined; + + if (Object.keys(StorageType).includes(type)) { + return globalize.translate(`StorageType.${type}`); + } + + return type; +}; + +const StorageListItem: FC = ({ + label, + folder +}) => { + const readableUsedSpace = (typeof folder?.UsedSpace === 'undefined' || folder.UsedSpace < 0) ? + '?' : getReadableSize(folder.UsedSpace); + const totalSpace = calculateTotal(folder); + const readableTotalSpace = (totalSpace < 0) ? '?' : getReadableSize(totalSpace); + const usedPercentage = calculateUsedPercentage(folder); + const statusColor = folder ? getStatusColor(usedPercentage) : 'primary'; + + return ( + + + + + + {label} +
+ } + secondary={ + <> + + {folder ? folder.Path : ( + + )} + + + + {`${readableUsedSpace} / ${readableTotalSpace}`} + + + } + slots={{ + secondary: 'div' + }} + /> +
+ ); +}; + +export default StorageListItem; diff --git a/src/apps/dashboard/features/storage/components/StorageTypeIcon.tsx b/src/apps/dashboard/features/storage/components/StorageTypeIcon.tsx new file mode 100644 index 000000000..4b62d455e --- /dev/null +++ b/src/apps/dashboard/features/storage/components/StorageTypeIcon.tsx @@ -0,0 +1,31 @@ +import Album from '@mui/icons-material/Album'; +import Lan from '@mui/icons-material/Lan'; +import Memory from '@mui/icons-material/Memory'; +import Storage from '@mui/icons-material/Storage'; +import Usb from '@mui/icons-material/Usb'; +import React, { type FC } from 'react'; + +import { StorageType } from '../constants/StorageType'; + +interface StorageTypeIconProps { + type?: string | null +} + +const StorageTypeIcon: FC = ({ + type +}) => { + switch (type) { + case StorageType.CDRom: + return ; + case StorageType.Network: + return ; + case StorageType.Ram: + return ; + case StorageType.Removable: + return ; + default: + return ; + } +}; + +export default StorageTypeIcon; diff --git a/src/apps/dashboard/features/storage/constants/StorageType.ts b/src/apps/dashboard/features/storage/constants/StorageType.ts new file mode 100644 index 000000000..2a0a4d83d --- /dev/null +++ b/src/apps/dashboard/features/storage/constants/StorageType.ts @@ -0,0 +1,13 @@ +/** + * Common storage type values returned by the API. + * NOTE: This list is not comprehensive as .NET might return any string. + */ +export enum StorageType { + CDRom = 'CDRom', + Fixed = 'Fixed', + Network = 'Network', + NoRootDirectory = 'NoRootDirectory', + Ram = 'Ram', + Removable = 'Removable', + Unknown = 'Unknown' +}; diff --git a/src/apps/dashboard/features/storage/utils/space.test.ts b/src/apps/dashboard/features/storage/utils/space.test.ts new file mode 100644 index 000000000..f234a9fd0 --- /dev/null +++ b/src/apps/dashboard/features/storage/utils/space.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, it } from 'vitest'; + +import { calculateUsedPercentage, calculateTotal } from './space'; + +describe('calculateTotal()', () => { + it('should return the total', () => { + expect(calculateTotal({ FreeSpace: 1, UsedSpace: 2 })).toBe(3); + }); + + it('should return -1 for invalid used space values', () => { + expect(calculateTotal({ FreeSpace: 1 })).toBe(-1); + expect(calculateTotal({ FreeSpace: 1, UsedSpace: -1 })).toBe(-1); + }); + + it('should treat invalid free space values as 0', () => { + expect(calculateTotal({ UsedSpace: 1 })).toBe(1); + expect(calculateTotal({ FreeSpace: -1, UsedSpace: 1 })).toBe(1); + }); +}); + +describe('calculateUsedPercentage', () => { + it('should return the percentage used', () => { + expect(calculateUsedPercentage({ FreeSpace: 1, UsedSpace: 3 })).toBe(75); + }); + + it('should return 0 for invalid used space values', () => { + expect(calculateUsedPercentage({ FreeSpace: 1 })).toBe(0); + expect(calculateUsedPercentage({ FreeSpace: 1, UsedSpace: -1 })).toBe(0); + }); + + it('should return 100 for invalid free space values', () => { + expect(calculateUsedPercentage({ UsedSpace: 1 })).toBe(100); + expect(calculateUsedPercentage({ FreeSpace: -1, UsedSpace: 1 })).toBe(100); + }); +}); diff --git a/src/apps/dashboard/features/storage/utils/space.ts b/src/apps/dashboard/features/storage/utils/space.ts new file mode 100644 index 000000000..d18e447ae --- /dev/null +++ b/src/apps/dashboard/features/storage/utils/space.ts @@ -0,0 +1,20 @@ +import type { FolderStorageDto } from '@jellyfin/sdk/lib/generated-client/models/folder-storage-dto'; + +export const calculateTotal = (folder?: FolderStorageDto) => { + if (typeof folder?.UsedSpace === 'undefined' || folder.UsedSpace < 0) { + return -1; + } + + const freeSpace = Math.max(0, folder.FreeSpace || 0); + const usedSpace = Math.max(0, folder.UsedSpace); + return freeSpace + usedSpace; +}; + +export const calculateUsedPercentage = (folder?: FolderStorageDto) => { + const totalSpace = calculateTotal(folder); + if (totalSpace <= 0) return 0; + + const usedSpace = folder?.UsedSpace || 0; + + return Math.min(100, (usedSpace / totalSpace) * 100); +}; diff --git a/src/apps/dashboard/routes/_asyncRoutes.ts b/src/apps/dashboard/routes/_asyncRoutes.ts index 2ab21c5d4..7e52f99aa 100644 --- a/src/apps/dashboard/routes/_asyncRoutes.ts +++ b/src/apps/dashboard/routes/_asyncRoutes.ts @@ -3,6 +3,7 @@ import { AppType } from 'constants/appType'; export const ASYNC_ADMIN_ROUTES: AsyncRoute[] = [ { path: 'activity', type: AppType.Dashboard }, + { path: 'backups', type: AppType.Dashboard }, { path: 'branding', type: AppType.Dashboard }, { path: 'devices', type: AppType.Dashboard }, { path: 'settings', type: AppType.Dashboard }, @@ -10,12 +11,17 @@ export const ASYNC_ADMIN_ROUTES: AsyncRoute[] = [ { path: 'libraries/display', type: AppType.Dashboard }, { path: 'libraries/metadata', type: AppType.Dashboard }, { path: 'libraries/nfo', type: AppType.Dashboard }, + { path: 'livetv/recordings', type: AppType.Dashboard }, { path: 'logs', type: AppType.Dashboard }, { path: 'logs/:file', page: 'logs/file', type: AppType.Dashboard }, { path: 'playback/resume', type: AppType.Dashboard }, { path: 'playback/streaming', type: AppType.Dashboard }, + { path: 'playback/transcoding', type: AppType.Dashboard }, { path: 'playback/trickplay', type: AppType.Dashboard }, + { path: 'plugins', type: AppType.Dashboard }, { path: 'plugins/:pluginId', page: 'plugins/plugin', type: AppType.Dashboard }, + { path: 'plugins/catalog', type: AppType.Dashboard }, + { path: 'plugins/repositories', type: AppType.Dashboard }, { path: 'tasks', type: AppType.Dashboard }, { path: 'tasks/:id', page: 'tasks/task', type: AppType.Dashboard }, { path: 'users', type: AppType.Dashboard }, diff --git a/src/apps/dashboard/routes/_legacyRoutes.ts b/src/apps/dashboard/routes/_legacyRoutes.ts index ceedb7265..bf292f818 100644 --- a/src/apps/dashboard/routes/_legacyRoutes.ts +++ b/src/apps/dashboard/routes/_legacyRoutes.ts @@ -23,27 +23,6 @@ export const LEGACY_ADMIN_ROUTES: LegacyRoute[] = [ controller: 'library', view: 'library.html' } - }, { - path: 'playback/transcoding', - pageProps: { - appType: AppType.Dashboard, - controller: 'encodingsettings', - view: 'encodingsettings.html' - } - }, { - path: 'plugins/catalog', - pageProps: { - appType: AppType.Dashboard, - controller: 'plugins/available/index', - view: 'plugins/available/index.html' - } - }, { - path: 'plugins/repositories', - pageProps: { - appType: AppType.Dashboard, - controller: 'plugins/repositories/index', - view: 'plugins/repositories/index.html' - } }, { path: 'livetv/guide', pageProps: { @@ -51,13 +30,6 @@ export const LEGACY_ADMIN_ROUTES: LegacyRoute[] = [ controller: 'livetvguideprovider', view: 'livetvguideprovider.html' } - }, { - path: 'recordings', - pageProps: { - appType: AppType.Dashboard, - controller: 'livetvsettings', - view: 'livetvsettings.html' - } }, { path: 'livetv', pageProps: { @@ -72,12 +44,5 @@ export const LEGACY_ADMIN_ROUTES: LegacyRoute[] = [ controller: 'livetvtuner', view: 'livetvtuner.html' } - }, { - path: 'plugins', - pageProps: { - appType: AppType.Dashboard, - controller: 'plugins/installed/index', - view: 'plugins/installed/index.html' - } } ]; diff --git a/src/apps/dashboard/routes/backups/index.tsx b/src/apps/dashboard/routes/backups/index.tsx new file mode 100644 index 000000000..047e6fef8 --- /dev/null +++ b/src/apps/dashboard/routes/backups/index.tsx @@ -0,0 +1,184 @@ +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import AddIcon from '@mui/icons-material/Add'; +import { useBackups } from 'apps/dashboard/features/backups/api/useBackups'; +import Page from 'components/Page'; +import globalize from 'lib/globalize'; +import React, { useCallback, useEffect, useState } from 'react'; +import Loading from 'components/loading/LoadingComponent'; +import Alert from '@mui/material/Alert'; +import List from '@mui/material/List'; +import CreateBackupForm from 'apps/dashboard/features/backups/components/CreateBackupForm'; +import type { BackupOptionsDto } from '@jellyfin/sdk/lib/generated-client/models/backup-options-dto'; +import type { BackupManifestDto } from '@jellyfin/sdk/lib/generated-client/models/backup-manifest-dto'; +import { useCreateBackup } from 'apps/dashboard/features/backups/api/useCreateBackup'; +import BackupProgressDialog from 'apps/dashboard/features/backups/components/BackupProgressDialog'; +import Backup from 'apps/dashboard/features/backups/components/Backup'; +import SimpleAlert from 'components/SimpleAlert'; +import RestoreConfirmationDialog from 'apps/dashboard/features/backups/components/RestoreConfirmationDialog'; +import { useRestoreBackup } from 'apps/dashboard/features/backups/api/useRestoreBackup'; +import RestoreProgressDialog from 'apps/dashboard/features/backups/components/RestoreProgressDialog'; +import { useApi } from 'hooks/useApi'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; + +export const Component = () => { + const { api } = useApi(); + const { data: backups, isPending, isError } = useBackups(); + const [ isCreateFormOpen, setIsCreateFormOpen ] = useState(false); + const [ backupInProgress, setBackupInProgress ] = useState(false); + const [ restoreInProgress, setRestoreInProgress ] = useState(false); + const [ isRestoreSuccess, setIsRestoreSuccess ] = useState(false); + const [ isErrorOccurred, setIsErrorOccurred ] = useState(false); + const [ isRestoreDialogOpen, setIsRestoreDialogOpen ] = useState(false); + const [ backupToRestore, setBackupToRestore ] = useState(null); + const createBackup = useCreateBackup(); + const restoreBackup = useRestoreBackup(); + + const onCreateClick = useCallback(() => { + setIsCreateFormOpen(true); + }, []); + + const onCreateFormClose = useCallback(() => { + setIsCreateFormOpen(false); + }, []); + + const onRestoreDialogClose = useCallback(() => { + setIsRestoreDialogOpen(false); + }, []); + + const onErrorAlertClose = useCallback(() => { + setIsErrorOccurred(false); + }, []); + + const onRestoreSuccessAlertClose = useCallback(() => { + setIsRestoreSuccess(false); + }, []); + + const onBackupCreate = useCallback((backupOptions: BackupOptionsDto) => { + setBackupInProgress(true); + setIsCreateFormOpen(false); + createBackup.mutate(backupOptions, { + onError: () => { + setIsErrorOccurred(true); + }, + onSettled: () => { + setBackupInProgress(false); + } + }); + }, [ createBackup ]); + + const promptRestore = useCallback((backup: BackupManifestDto) => { + setIsRestoreDialogOpen(true); + setBackupToRestore(backup); + }, []); + + const onRestoreConfirm = useCallback(() => { + if (backupToRestore?.Path) { + restoreBackup.mutate(backupToRestore?.Path, { + onSuccess: () => { + setRestoreInProgress(true); + }, + onError: () => { + setIsErrorOccurred(true); + }, + onSettled: () => { + setIsRestoreDialogOpen(false); + } + }); + } + }, [backupToRestore, restoreBackup]); + + useEffect(() => { + if (restoreInProgress) { + const serverCheckInterval = setInterval(() => { + void getSystemApi(api!) + .getPublicSystemInfo() + .then(() => { + setRestoreInProgress(false); + setIsRestoreSuccess(true); + clearInterval(serverCheckInterval); + }).catch(() => { + // Server is still down + }); + }, 5000); + + return () => { + clearInterval(serverCheckInterval); + }; + } + }, [api, restoreInProgress]); + + if (isPending) { + return ; + } + + return ( + + + + + + + + + {isError ? ( + {globalize.translate('BackupsPageLoadError')} + ) : ( + + + {globalize.translate('HeaderBackups')} + + + {globalize.translate('HeaderBackupsHelp')} + + + + + + {backups.length > 0 && ( + + {backups.map(backup => { + return ; + })} + + )} + + + )} + + + ); +}; diff --git a/src/apps/dashboard/routes/branding/index.tsx b/src/apps/dashboard/routes/branding/index.tsx index d69222bb1..26595a50d 100644 --- a/src/apps/dashboard/routes/branding/index.tsx +++ b/src/apps/dashboard/routes/branding/index.tsx @@ -18,14 +18,14 @@ import { getBrandingOptionsQuery, QUERY_KEY, useBrandingOptions } from 'apps/das import Loading from 'components/loading/LoadingComponent'; import Image from 'components/Image'; import Page from 'components/Page'; -import ServerConnections from 'components/ServerConnections'; +import { SPLASHSCREEN_URL } from 'constants/branding'; import { useApi } from 'hooks/useApi'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { queryClient } from 'utils/query/queryClient'; import { ActionData } from 'types/actionData'; const BRANDING_CONFIG_KEY = 'branding'; -const SPLASHSCREEN_URL = '/Branding/Splashscreen'; const BrandingOption = { CustomCss: 'CustomCss', LoginDisclaimer: 'LoginDisclaimer', diff --git a/src/apps/dashboard/routes/libraries/display.tsx b/src/apps/dashboard/routes/libraries/display.tsx index d83f8d588..ad8667726 100644 --- a/src/apps/dashboard/routes/libraries/display.tsx +++ b/src/apps/dashboard/routes/libraries/display.tsx @@ -12,14 +12,15 @@ import TextField from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; import Loading from 'components/loading/LoadingComponent'; import Page from 'components/Page'; -import ServerConnections from 'components/ServerConnections'; import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; import { QUERY_KEY as CONFIG_QUERY_KEY, useConfiguration } from 'hooks/useConfiguration'; -import { QUERY_KEY as NAMED_CONFIG_QUERY_KEY, NamedConfiguration, useNamedConfiguration } from 'hooks/useNamedConfiguration'; +import { QUERY_KEY as NAMED_CONFIG_QUERY_KEY, useNamedConfiguration } from 'hooks/useNamedConfiguration'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { type ActionFunctionArgs, Form, useActionData, useNavigation } from 'react-router-dom'; import { ActionData } from 'types/actionData'; import { queryClient } from 'utils/query/queryClient'; +import type { MetadataConfiguration } from '@jellyfin/sdk/lib/generated-client/models/metadata-configuration'; const CONFIG_KEY = 'metadata'; @@ -32,7 +33,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { const { data: config } = await getConfigurationApi(api).getConfiguration(); - const metadataConfig: NamedConfiguration = { + const metadataConfig: MetadataConfiguration = { UseFileCreationTimeForDateAdded: data.DateAddedBehavior.toString() === '1' }; @@ -70,7 +71,7 @@ export const Component = () => { data: namedConfig, isPending: isNamedConfigPending, isError: isNamedConfigError - } = useNamedConfiguration(CONFIG_KEY); + } = useNamedConfiguration(CONFIG_KEY); const navigation = useNavigation(); const actionData = useActionData() as ActionData | undefined; @@ -97,7 +98,7 @@ export const Component = () => { {globalize.translate('SettingsSaved')} )} - {globalize.translate('Display')} + {globalize.translate('Display')} { const api = ServerConnections.getCurrentApi(); if (!api) throw new Error('No Api instance available'); @@ -39,7 +32,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { const formData = await request.formData(); const data = Object.fromEntries(formData); - const newConfig: NFOSettingsConfig = { + const newConfig: XbmcMetadataOptions = { UserId: data.UserId?.toString(), ReleaseDateFormat: 'yyyy-MM-dd', SaveImagePathsInNfo: data.SaveImagePathsInNfo?.toString() === 'on', @@ -64,7 +57,7 @@ export const Component = () => { data: config, isPending: isConfigPending, isError: isConfigError - } = useNamedConfiguration(CONFIG_KEY); + } = useNamedConfiguration(CONFIG_KEY); const { data: users, isPending: isUsersPending, @@ -75,8 +68,6 @@ export const Component = () => { const isSubmitting = navigation.state === 'submitting'; const [isAlertOpen, setIsAlertOpen] = useState(false); - const nfoConfig = config as NFOSettingsConfig; - const onAlertClose = useCallback(() => { setIsAlertOpen(false); }, []); @@ -111,13 +102,13 @@ export const Component = () => { {globalize.translate('SettingsSaved')} )} - {globalize.translate('TabNfoSettings')} + {globalize.translate('TabNfoSettings')} {globalize.translate('HeaderKodiMetadataHelp')} { control={ } label={globalize.translate('LabelKodiMetadataSaveImagePaths')} @@ -154,7 +145,7 @@ export const Component = () => { control={ } label={globalize.translate('LabelKodiMetadataEnablePathSubstitution')} @@ -167,7 +158,7 @@ export const Component = () => { control={ } label={globalize.translate('LabelKodiMetadataEnableExtraThumbs')} diff --git a/src/apps/dashboard/routes/livetv/recordings.tsx b/src/apps/dashboard/routes/livetv/recordings.tsx new file mode 100644 index 000000000..3307c1c54 --- /dev/null +++ b/src/apps/dashboard/routes/livetv/recordings.tsx @@ -0,0 +1,414 @@ +import React, { useCallback, useEffect, useState } from 'react'; +import Box from '@mui/material/Box'; +import MenuItem from '@mui/material/MenuItem'; +import Stack from '@mui/material/Stack'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; +import Page from 'components/Page'; +import { QUERY_KEY, useNamedConfiguration } from 'hooks/useNamedConfiguration'; +import globalize from 'lib/globalize'; +import { ActionFunctionArgs, Form, useActionData, useNavigation, useSubmit } from 'react-router-dom'; +import type { LiveTvOptions } from '@jellyfin/sdk/lib/generated-client/models/live-tv-options'; +import Loading from 'components/loading/LoadingComponent'; +import Alert from '@mui/material/Alert'; +import InputAdornment from '@mui/material/InputAdornment'; +import IconButton from '@mui/material/IconButton'; +import SearchIcon from '@mui/icons-material/Search'; +import DirectoryBrowser from 'components/directorybrowser/directorybrowser'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Checkbox from '@mui/material/Checkbox'; +import FormHelperText from '@mui/material/FormHelperText'; +import Button from '@mui/material/Button'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { queryClient } from 'utils/query/queryClient'; +import { ActionData } from 'types/actionData'; + +const CONFIG_KEY = 'livetv'; + +export const action = async ({ request }: ActionFunctionArgs) => { + const api = ServerConnections.getCurrentApi(); + if (!api) throw new Error('No Api instance available'); + + const data = await request.json() as LiveTvOptions; + + await getConfigurationApi(api) + .updateNamedConfiguration({ key: CONFIG_KEY, body: data }); + + void queryClient.invalidateQueries({ + queryKey: [ QUERY_KEY, CONFIG_KEY ] + }); + + return { + isSaved: true + }; +}; + +export const Component = () => { + const navigation = useNavigation(); + const actionData = useActionData() as ActionData | undefined; + const { data: initialConfig, isPending, isError } = useNamedConfiguration(CONFIG_KEY); + const [ config, setConfig ] = useState(null); + const [ prePaddingMinutes, setPrePaddingMinutes ] = useState(''); + const [ postPaddingMinutes, setPostPaddingMinutes ] = useState(''); + const isSubmitting = navigation.state === 'submitting'; + const submit = useSubmit(); + + useEffect(() => { + if (initialConfig && config == null) { + setConfig(initialConfig); + if (initialConfig.PrePaddingSeconds) { + setPrePaddingMinutes((initialConfig.PrePaddingSeconds / 60).toString()); + } + if (initialConfig.PostPaddingSeconds) { + setPostPaddingMinutes((initialConfig.PostPaddingSeconds / 60).toString()); + } + } + }, [ initialConfig, config ]); + + const onPrePaddingMinutesChange = useCallback((e: React.ChangeEvent) => { + setPrePaddingMinutes(e.target.value); + setConfig({ + ...config, + PrePaddingSeconds: parseInt(e.target.value, 10) * 60 + }); + }, [ config ]); + + const onPostPaddingMinutesChange = useCallback((e: React.ChangeEvent) => { + setPostPaddingMinutes(e.target.value); + setConfig({ + ...config, + PostPaddingSeconds: parseInt(e.target.value, 10) * 60 + }); + }, [ config ]); + + const onChange = useCallback((e: React.ChangeEvent) => { + setConfig({ + ...config, + [e.target.name]: e.target.value + }); + }, [ config ]); + + const onCheckboxChange = useCallback((e: React.ChangeEvent) => { + setConfig({ + ...config, + [e.target.name]: e.target.checked + }); + }, [ config ]); + + const showRecordingPathPicker = useCallback(() => { + const picker = new DirectoryBrowser(); + + picker.show({ + callback: (path: string) => { + if (path) { + setConfig({ + ...config, + RecordingPath: path + }); + } + + picker.close(); + }, + validateWriteable: true + }); + }, [ config ]); + + const showMovieRecordingPathPicker = useCallback(() => { + const picker = new DirectoryBrowser(); + + picker.show({ + callback: (path: string) => { + if (path) { + setConfig({ + ...config, + MovieRecordingPath: path + }); + } + + picker.close(); + }, + validateWriteable: true + }); + }, [ config ]); + + const showSeriesRecordingPathPicker = useCallback(() => { + const picker = new DirectoryBrowser(); + + picker.show({ + callback: (path: string) => { + if (path) { + setConfig({ + ...config, + SeriesRecordingPath: path + }); + } + + picker.close(); + }, + validateWriteable: true + }); + }, [ config ]); + + const showPostProcessorPicker = useCallback(() => { + const picker = new DirectoryBrowser(); + + picker.show({ + callback: (path: string) => { + if (path) { + setConfig({ + ...config, + RecordingPostProcessor: path + }); + } + + picker.close(); + }, + validateWriteable: true + }); + }, [ config ]); + + const onSubmit = useCallback((e: React.FormEvent) => { + e.preventDefault(); + if (config) { + submit( + JSON.stringify(config), + { method: 'post', encType: 'application/json' } + ); + } + }, [ config, submit ]); + + if (isPending || !config) { + return ; + } + + return ( + + + {isError ? ( + {globalize.translate('LiveTVPageLoadError')} + ) : ( +
+ + {globalize.translate('HeaderDVR')} + + {(!isSubmitting && actionData?.isSaved) && ( + + {globalize.translate('SettingsSaved')} + + )} + + + {globalize.translate('Auto')} + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + + + + + + ) + }, + + inputLabel: { + shrink: !!config.RecordingPath + } + }} + /> + + + + + + + ) + }, + + inputLabel: { + shrink: !!config.MovieRecordingPath + } + }} + /> + + + + + + + ) + }, + + inputLabel: { + shrink: !!config.SeriesRecordingPath + } + }} + /> + + {globalize.translate('HeaderDefaultRecordingSettings')} + + + {globalize.translate('MinutesBefore')} + + ) + } + }} + /> + + + {globalize.translate('MinutesAfter')} + + ) + } + }} + /> + + {globalize.translate('HeaderRecordingPostProcessing')} + + + + + + + ) + }, + + inputLabel: { + shrink: !!config.RecordingPostProcessor + } + }} + /> + + + + {globalize.translate('HeaderRecordingMetadataSaving')} + + + + } + label={globalize.translate('SaveRecordingNFO')} + /> + {globalize.translate('SaveRecordingNFOHelp')} + + + + + } + label={globalize.translate('SaveRecordingImages')} + /> + {globalize.translate('SaveRecordingImagesHelp')} + + + + +
+ )} +
+
+ ); +}; + +Component.displayName = 'LiveTvRecordingsPage'; diff --git a/src/apps/dashboard/routes/logs/file.tsx b/src/apps/dashboard/routes/logs/file.tsx index 019e8447c..76dff514f 100644 --- a/src/apps/dashboard/routes/logs/file.tsx +++ b/src/apps/dashboard/routes/logs/file.tsx @@ -10,7 +10,8 @@ import ButtonGroup from '@mui/material/ButtonGroup'; import Container from '@mui/material/Container'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; -import { ContentCopy, FileDownload } from '@mui/icons-material'; +import ContentCopy from '@mui/icons-material/ContentCopy'; +import FileDownload from '@mui/icons-material/FileDownload'; import globalize from 'lib/globalize'; import toast from 'components/toast/toast'; import { copy } from 'scripts/clipboard'; diff --git a/src/apps/dashboard/routes/logs/index.tsx b/src/apps/dashboard/routes/logs/index.tsx index 84af1b244..b5d8b0967 100644 --- a/src/apps/dashboard/routes/logs/index.tsx +++ b/src/apps/dashboard/routes/logs/index.tsx @@ -3,6 +3,7 @@ import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-a import Loading from 'components/loading/LoadingComponent'; import Page from 'components/Page'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Alert from '@mui/material/Alert'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -12,7 +13,6 @@ import Checkbox from '@mui/material/Checkbox'; import TextField from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; import { type ActionFunctionArgs, Form, useActionData, useNavigation } from 'react-router-dom'; -import ServerConnections from 'components/ServerConnections'; import { useServerLogs } from 'apps/dashboard/features/logs/api/useServerLogs'; import { useConfiguration } from 'hooks/useConfiguration'; import type { ServerConfiguration } from '@jellyfin/sdk/lib/generated-client/models/server-configuration'; diff --git a/src/apps/dashboard/routes/playback/resume.tsx b/src/apps/dashboard/routes/playback/resume.tsx index f711ac82d..76e5fce9e 100644 --- a/src/apps/dashboard/routes/playback/resume.tsx +++ b/src/apps/dashboard/routes/playback/resume.tsx @@ -1,6 +1,7 @@ import React from 'react'; import Page from 'components/Page'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Alert from '@mui/material/Alert'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -11,7 +12,6 @@ import { type ActionFunctionArgs, Form, useActionData, useNavigation } from 'rea import { ActionData } from 'types/actionData'; import { QUERY_KEY, useConfiguration } from 'hooks/useConfiguration'; import Loading from 'components/loading/LoadingComponent'; -import ServerConnections from 'components/ServerConnections'; import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; import { queryClient } from 'utils/query/queryClient'; @@ -66,7 +66,7 @@ export const Component = () => {
- + {globalize.translate('ButtonResume')} diff --git a/src/apps/dashboard/routes/playback/streaming.tsx b/src/apps/dashboard/routes/playback/streaming.tsx index fdb75b834..51c6962a4 100644 --- a/src/apps/dashboard/routes/playback/streaming.tsx +++ b/src/apps/dashboard/routes/playback/streaming.tsx @@ -1,6 +1,7 @@ import React from 'react'; import Page from 'components/Page'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Alert from '@mui/material/Alert'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -8,7 +9,6 @@ import Stack from '@mui/material/Stack'; import TextField from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; import { type ActionFunctionArgs, Form, useActionData, useNavigation } from 'react-router-dom'; -import ServerConnections from 'components/ServerConnections'; import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; import { QUERY_KEY, useConfiguration } from 'hooks/useConfiguration'; import Loading from 'components/loading/LoadingComponent'; @@ -57,7 +57,7 @@ export const Component = () => { - + {globalize.translate('TabStreaming')} diff --git a/src/apps/dashboard/routes/playback/transcoding.tsx b/src/apps/dashboard/routes/playback/transcoding.tsx new file mode 100644 index 000000000..4781f33db --- /dev/null +++ b/src/apps/dashboard/routes/playback/transcoding.tsx @@ -0,0 +1,896 @@ +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import Box from '@mui/material/Box'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; +import Link from '@mui/material/Link'; +import Page from 'components/Page'; +import globalize from 'lib/globalize'; +import Stack from '@mui/material/Stack'; +import Loading from 'components/loading/LoadingComponent'; +import MenuItem from '@mui/material/MenuItem'; +import FormGroup from '@mui/material/FormGroup'; +import Checkbox from '@mui/material/Checkbox'; +import FormHelperText from '@mui/material/FormHelperText'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import DirectoryBrowser from 'components/directorybrowser/directorybrowser'; +import InputAdornment from '@mui/material/InputAdornment'; +import IconButton from '@mui/material/IconButton'; +import SearchIcon from '@mui/icons-material/Search'; +import Alert from '@mui/material/Alert'; +import Button from '@mui/material/Button'; +import { type ActionFunctionArgs, Form, useActionData, useNavigation, useSubmit } from 'react-router-dom'; +import { QUERY_KEY, useNamedConfiguration } from 'hooks/useNamedConfiguration'; +import type { EncodingOptions } from '@jellyfin/sdk/lib/generated-client/models/encoding-options'; +import { HardwareAccelerationType } from '@jellyfin/sdk/lib/generated-client/models/hardware-acceleration-type'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { queryClient } from 'utils/query/queryClient'; +import { ActionData } from 'types/actionData'; +import { CODECS, HEVC_REXT_DECODING_TYPES, HEVC_VP9_HW_DECODING_TYPES } from 'apps/dashboard/features/playback/constants/codecs'; +import SimpleAlert from 'components/SimpleAlert'; + +const CONFIG_KEY = 'encoding'; + +export const action = async ({ request }: ActionFunctionArgs) => { + const api = ServerConnections.getCurrentApi(); + if (!api) throw new Error('No Api instance available'); + + const data = await request.json() as EncodingOptions; + + await getConfigurationApi(api) + .updateNamedConfiguration({ key: CONFIG_KEY, body: data }); + + void queryClient.invalidateQueries({ + queryKey: [QUERY_KEY, CONFIG_KEY] + }); + + return { + isSaved: true + }; +}; + +export const Component = () => { + const { data: initialConfig, isPending, isError } = useNamedConfiguration(CONFIG_KEY); + const [ config, setConfig ] = useState(null); + const navigation = useNavigation(); + const actionData = useActionData() as ActionData | undefined; + const submit = useSubmit(); + const isSubmitting = navigation.state === 'submitting'; + const [ isAlertOpen, setIsAlertOpen ] = useState(false); + + useEffect(() => { + if (initialConfig && config == null) { + setConfig(initialConfig); + } + }, [ initialConfig, config ]); + + const onConfigChange = useCallback((e: React.ChangeEvent) => { + setConfig({ + ...config, + [e.target.name]: e.target.value + }); + }, [ config ]); + + const onCheckboxChange = useCallback((e: React.ChangeEvent) => { + setConfig({ + ...config, + [e.target.name]: e.target.checked + }); + }, [ config ]); + + const onCodecChange = useCallback((e: React.ChangeEvent) => { + if (config?.HardwareDecodingCodecs) { + if (e.target.checked) { + setConfig({ + ...config, + HardwareDecodingCodecs: [ + ...config.HardwareDecodingCodecs, + e.target.name + ] + }); + } else { + setConfig({ + ...config, + HardwareDecodingCodecs: config.HardwareDecodingCodecs.filter(v => v !== e.target.name) + }); + } + } + }, [ config ]); + + const onAlertClose = useCallback(() => { + setIsAlertOpen(false); + }, []); + + const onSubmit = useCallback((e: React.FormEvent) => { + e.preventDefault(); + if (config) { + setIsAlertOpen(true); + submit( + { ...config }, + { method: 'post', encType: 'application/json' } + ); + } + }, [ config, submit ]); + + const showTranscodingPathPicker = useCallback(() => { + const picker = new DirectoryBrowser(); + + picker.show({ + callback: (path: string) => { + setConfig({ + ...config, + TranscodingTempPath: path + }); + + picker.close(); + }, + validateWriteable: true, + header: globalize.translate('HeaderSelectTranscodingPath'), + instruction: globalize.translate('HeaderSelectTranscodingPathHelp') + }); + }, [ config ]); + + const showFallbackFontPathPicker = useCallback(() => { + const picker = new DirectoryBrowser(); + + picker.show({ + callback: (path: string) => { + setConfig({ + ...config, + FallbackFontPath: path + }); + + picker.close(); + }, + header: globalize.translate('HeaderSelectFallbackFontPath'), + instruction: globalize.translate('HeaderSelectFallbackFontPathHelp') + }); + }, [ config ]); + + const hardwareAccelType = config?.HardwareAccelerationType || HardwareAccelerationType.None; + const isHwaSelected = [ 'amf', 'nvenc', 'qsv', 'vaapi', 'rkmpp', 'videotoolbox' ].includes(hardwareAccelType); + + const availableCodecs = useMemo(() => ( + CODECS.filter(codec => codec.types.includes(hardwareAccelType)) + ), [hardwareAccelType]); + + if (isPending || !config) return ; + + return ( + + + + {isError ? ( + {globalize.translate('TranscodingLoadError')} + ) : ( + + + {globalize.translate('Transcoding')} + + {!isSubmitting && actionData?.isSaved && ( + + {globalize.translate('SettingsSaved')} + + )} + + + {globalize.translate('LabelHardwareAccelerationTypeHelp')} + + )} + > + {globalize.translate('None')} + AMD AMF + Nvidia NVENC + Intel Quicksync (QSV) + Video Acceleration API (VAAPI) + Rockchip MPP (RKMPP) + Apple VideoToolBox + Video4Linux2 (V4L2) + + + {hardwareAccelType === 'vaapi' && ( + + )} + + {hardwareAccelType === 'qsv' && ( + + )} + + {hardwareAccelType !== 'none' && ( + <> + {globalize.translate('LabelEnableHardwareDecodingFor')} + + {availableCodecs.map(codec => ( + + } + /> + ))} + + {HEVC_VP9_HW_DECODING_TYPES.includes(hardwareAccelType) && ( + + } + /> + )} + + {HEVC_VP9_HW_DECODING_TYPES.includes(hardwareAccelType) && ( + + } + /> + )} + + {HEVC_REXT_DECODING_TYPES.includes(hardwareAccelType) && ( + + } + /> + )} + + {HEVC_REXT_DECODING_TYPES.includes(hardwareAccelType) && ( + + } + /> + )} + + + )} + + {hardwareAccelType === 'nvenc' && ( + + + } + /> + {globalize.translate('EnableEnhancedNvdecDecoderHelp')} + + )} + + {hardwareAccelType === 'qsv' && ( + + + } + /> + + )} + + {hardwareAccelType !== 'none' && ( + + {globalize.translate('LabelHardwareEncodingOptions')} + + + } + /> + {(hardwareAccelType === 'qsv' || hardwareAccelType === 'vaapi') && ( + <> + + } + /> + + } + /> + + + {globalize.translate('IntelLowPowerEncHelp')} + + + + )} + + + )} + + + {globalize.translate('LabelEncodingFormatOptions')} + {globalize.translate('EncodingFormatHelp')} + + + } + /> + + } + /> + + + + {(hardwareAccelType === 'qsv' || hardwareAccelType === 'vaapi') && ( + <> + + + } + /> + {globalize.translate('AllowVppTonemappingHelp')} + + + + + + + )} + + {hardwareAccelType === 'videotoolbox' && ( + + + } + /> + {globalize.translate('AllowVideoToolboxTonemappingHelp')} + + )} + + {(hardwareAccelType === 'none' || isHwaSelected) && ( + <> + + + } + /> + {globalize.translate(isHwaSelected ? 'AllowTonemappingHelp' : 'AllowTonemappingSoftwareHelp')} + + + + {globalize.translate('TonemappingAlgorithmHelp')} + + )} + > + {globalize.translate('None')} + Clip + Linear + Gamma + Reinhard + Hable + Mobius + BT.2390 + + + {isHwaSelected && ( + + {globalize.translate('Auto')} + MAX + RGB + LUM + ITP + + )} + + + {globalize.translate('Auto')} + TV + PC + + + + + + + + + )} + + + {globalize.translate('Auto')} + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + {globalize.translate('OptionMax')} + + + + + + + + + + ) + } + }} + /> + + + {globalize.translate('LabelFallbackFontPathHelp')} + + } + slotProps={{ + input: { + endAdornment: ( + + + + + + ) + } + }} + /> + + + + } + /> + {globalize.translate('EnableFallbackFontHelp')} + + + + + } + /> + {globalize.translate('LabelEnableAudioVbrHelp')} + + + + + + {globalize.translate('None')} + Dave750 + NightmodeDialogue + RFC7845 + AC-4 + + + + + + {globalize.translate('Auto')} + veryslow + slower + slow + medium + fast + faster + veryfast + superfast + ultrafast + + + + + + + + {globalize.translate('Yadif')} + {globalize.translate('Bwdif')} + + + + + } + /> + {globalize.translate('UseDoubleRateDeinterlacingHelp')} + + + + + } + /> + {globalize.translate('AllowOnTheFlySubtitleExtractionHelp')} + + + + + } + /> + {globalize.translate('AllowFfmpegThrottlingHelp')} + + + + + } + /> + {globalize.translate('AllowSegmentDeletionHelp')} + + + + + + + + + + )} + + + ); +}; + +Component.displayName = 'TranscodingPage'; diff --git a/src/apps/dashboard/routes/playback/trickplay.tsx b/src/apps/dashboard/routes/playback/trickplay.tsx index 02591d216..d44814771 100644 --- a/src/apps/dashboard/routes/playback/trickplay.tsx +++ b/src/apps/dashboard/routes/playback/trickplay.tsx @@ -1,6 +1,7 @@ import React from 'react'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { type ActionFunctionArgs, Form, useActionData, useNavigation } from 'react-router-dom'; import { QUERY_KEY, useConfiguration } from 'hooks/useConfiguration'; import Page from 'components/Page'; @@ -16,7 +17,6 @@ import MenuItem from '@mui/material/MenuItem'; import TextField from '@mui/material/TextField'; import Button from '@mui/material/Button'; import Alert from '@mui/material/Alert'; -import ServerConnections from 'components/ServerConnections'; import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; import { TrickplayScanBehavior } from '@jellyfin/sdk/lib/generated-client/models/trickplay-scan-behavior'; import { ProcessPriorityClass } from '@jellyfin/sdk/lib/generated-client/models/process-priority-class'; diff --git a/src/apps/dashboard/routes/plugins/catalog.tsx b/src/apps/dashboard/routes/plugins/catalog.tsx new file mode 100644 index 000000000..e55096338 --- /dev/null +++ b/src/apps/dashboard/routes/plugins/catalog.tsx @@ -0,0 +1,96 @@ +import React, { useCallback, useMemo, useState } from 'react'; +import Page from 'components/Page'; +import globalize from 'lib/globalize'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import { usePackages } from 'apps/dashboard/features/plugins/api/usePackages'; +import Loading from 'components/loading/LoadingComponent'; +import getPackageCategories from 'apps/dashboard/features/plugins/utils/getPackageCategories'; +import Stack from '@mui/material/Stack'; +import getPackagesByCategory from 'apps/dashboard/features/plugins/utils/getPackagesByCategory'; +import PackageCard from 'apps/dashboard/features/plugins/components/PackageCard'; +import Grid from '@mui/material/Grid2'; +import TextField from '@mui/material/TextField'; +import IconButton from '@mui/material/IconButton'; +import Settings from '@mui/icons-material/Settings'; +import { Link } from 'react-router-dom'; +import { CATEGORY_LABELS } from 'apps/dashboard/features/plugins/constants/categoryLabels'; + +export const Component = () => { + const { data: packages, isPending: isPackagesPending } = usePackages(); + const [ searchQuery, setSearchQuery ] = useState(''); + + const filteredPackages = useMemo(() => { + return packages?.filter(i => i.name?.toLocaleLowerCase().includes(searchQuery.toLocaleLowerCase())); + }, [ packages, searchQuery ]); + + const packageCategories = getPackageCategories(filteredPackages); + + const updateSearchQuery = useCallback((e: React.ChangeEvent) => { + setSearchQuery(e.target.value); + }, []); + + const getCategoryLabel = (category: string) => { + const categoryKey = category.replace(/\s/g, ''); + + if (CATEGORY_LABELS[categoryKey]) { + return globalize.translate(CATEGORY_LABELS[categoryKey]); + } + + console.warn('[AvailablePlugins] unmapped category label', category); + return category; + }; + + if (isPackagesPending) { + return ; + } + + return ( + + + + + {globalize.translate('TabCatalog')} + + + + + + + + {packageCategories.map(category => ( + + {getCategoryLabel(category)} + + + {getPackagesByCategory(filteredPackages, category).map(pkg => ( + + + + ))} + + + ))} + + + + ); +}; + +Component.displayName = 'PluginsCatalogPage'; diff --git a/src/apps/dashboard/routes/plugins/index.tsx b/src/apps/dashboard/routes/plugins/index.tsx new file mode 100644 index 000000000..aacdd06ce --- /dev/null +++ b/src/apps/dashboard/routes/plugins/index.tsx @@ -0,0 +1,85 @@ +import React, { useCallback, useMemo, useState } from 'react'; +import Box from '@mui/material/Box'; +import Page from 'components/Page'; +import globalize from 'lib/globalize'; +import Typography from '@mui/material/Typography'; +import TextField from '@mui/material/TextField'; +import Stack from '@mui/material/Stack'; +import { usePlugins } from 'apps/dashboard/features/plugins/api/usePlugins'; +import Loading from 'components/loading/LoadingComponent'; +import Alert from '@mui/material/Alert'; +import Grid from '@mui/material/Grid2'; +import PluginCard from 'apps/dashboard/features/plugins/components/PluginCard'; +import { useConfigurationPages } from 'apps/dashboard/features/plugins/api/useConfigurationPages'; +import { findBestConfigurationPage } from 'apps/dashboard/features/plugins/api/configurationPage'; + +export const Component = () => { + const { + data: plugins, + isPending, + isError + } = usePlugins(); + const { + data: configurationPages, + isError: isConfigurationPagesError, + isPending: isConfigurationPagesPending + } = useConfigurationPages(); + const [ searchQuery, setSearchQuery ] = useState(''); + + const onSearchChange = useCallback((event: React.ChangeEvent) => { + setSearchQuery(event.target.value); + }, []); + + const filteredPlugins = useMemo(() => { + if (plugins) { + return plugins.filter(i => i.Name?.toLocaleLowerCase().includes(searchQuery.toLocaleLowerCase())); + } else { + return []; + } + }, [ plugins, searchQuery ]); + + if (isPending || isConfigurationPagesPending) { + return ; + } + + return ( + + + {isError || isConfigurationPagesError ? ( + {globalize.translate('PluginsLoadError')} + ) : ( + + + {globalize.translate('TabMyPlugins')} + + + + + + + {filteredPlugins.map(plugin => ( + + + + ))} + + + + )} + + + ); +}; + +Component.displayName = 'InstalledPlugins'; diff --git a/src/apps/dashboard/routes/plugins/plugin.tsx b/src/apps/dashboard/routes/plugins/plugin.tsx index 9da0a8a9c..e847b9385 100644 --- a/src/apps/dashboard/routes/plugins/plugin.tsx +++ b/src/apps/dashboard/routes/plugins/plugin.tsx @@ -64,13 +64,13 @@ const PluginPage: FC = () => { const { data: configurationPages, isError: isConfigurationPagesError, - isLoading: isConfigurationPagesLoading + isPending: isConfigurationPagesLoading } = useConfigurationPages(); const { data: packageInfo, isError: isPackageInfoError, - isLoading: isPackageInfoLoading + isPending: isPackageInfoLoading } = usePackageInfo(pluginName ? { name: pluginName, assemblyGuid: pluginId @@ -78,8 +78,8 @@ const PluginPage: FC = () => { const { data: plugins, - isLoading: isPluginsLoading, - isError: isPluginsError + isError: isPluginsError, + isPending: isPluginsLoading } = usePlugins(); const isLoading = diff --git a/src/apps/dashboard/routes/plugins/repositories.tsx b/src/apps/dashboard/routes/plugins/repositories.tsx new file mode 100644 index 000000000..3ce8579e2 --- /dev/null +++ b/src/apps/dashboard/routes/plugins/repositories.tsx @@ -0,0 +1,107 @@ +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import AddIcon from '@mui/icons-material/Add'; +import Page from 'components/Page'; +import globalize from 'lib/globalize'; +import React, { useCallback, useState } from 'react'; +import Stack from '@mui/material/Stack'; +import { useRepositories } from 'apps/dashboard/features/plugins/api/useRepositories'; +import Loading from 'components/loading/LoadingComponent'; +import Alert from '@mui/material/Alert'; +import List from '@mui/material/List'; +import RepositoryListItem from 'apps/dashboard/features/plugins/components/RepositoryListItem'; +import type { RepositoryInfo } from '@jellyfin/sdk/lib/generated-client/models/repository-info'; +import { useSetRepositories } from 'apps/dashboard/features/plugins/api/useSetRepositories'; +import NewRepositoryForm from 'apps/dashboard/features/plugins/components/NewRepositoryForm'; + +export const Component = () => { + const { data: repositories, isPending, isError } = useRepositories(); + const [ isRepositoryFormOpen, setIsRepositoryFormOpen ] = useState(false); + const setRepositories = useSetRepositories(); + + const onDelete = useCallback((repository: RepositoryInfo) => { + if (repositories) { + setRepositories.mutate({ + repositoryInfo: repositories.filter(currentRepo => currentRepo.Url !== repository.Url) + }); + } + }, [ repositories, setRepositories ]); + + const onRepositoryAdd = useCallback((repository: RepositoryInfo) => { + if (repositories) { + setRepositories.mutate({ + repositoryInfo: [ + ...repositories, + repository + ] + }, { + onSettled: () => { + setIsRepositoryFormOpen(false); + } + }); + } + }, [ repositories, setRepositories ]); + + const openRepositoryForm = useCallback(() => { + setIsRepositoryFormOpen(true); + }, []); + + const onRepositoryFormClose = useCallback(() => { + setIsRepositoryFormOpen(false); + }, []); + + if (isPending) { + return ; + } + + return ( + + + + {isError ? ( + {globalize.translate('RepositoriesPageLoadError')} + ) : ( + + {globalize.translate('TabRepositories')} + + + + {repositories.length > 0 ? ( + + {repositories.map(repository => { + return ; + })} + + ) : ( + + {globalize.translate('MessageNoRepositories')} + {globalize.translate('MessageAddRepository')} + + )} + + )} + + + ); +}; + +Component.displayName = 'PluginRepositoriesPage'; diff --git a/src/apps/dashboard/routes/settings/index.tsx b/src/apps/dashboard/routes/settings/index.tsx index 2e4a31d0f..9726190ea 100644 --- a/src/apps/dashboard/routes/settings/index.tsx +++ b/src/apps/dashboard/routes/settings/index.tsx @@ -9,8 +9,8 @@ import { useLocalizationOptions } from 'apps/dashboard/features/settings/api/use import Loading from 'components/loading/LoadingComponent'; import Page from 'components/Page'; import { QUERY_KEY, useConfiguration } from 'hooks/useConfiguration'; -import { useSystemInfo } from 'hooks/useSystemInfo'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import React, { useCallback, useEffect, useState } from 'react'; import { type ActionFunctionArgs, Form, useActionData, useNavigation } from 'react-router-dom'; import SearchIcon from '@mui/icons-material/Search'; @@ -21,7 +21,6 @@ import Checkbox from '@mui/material/Checkbox'; import Button from '@mui/material/Button'; import Link from '@mui/material/Link'; import DirectoryBrowser from 'components/directorybrowser/directorybrowser'; -import ServerConnections from 'components/ServerConnections'; import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; import { queryClient } from 'utils/query/queryClient'; import { ActionData } from 'types/actionData'; @@ -64,11 +63,6 @@ export const Component = () => { isPending: isLocalizationOptionsPending, isError: isLocalizationOptionsError } = useLocalizationOptions(); - const { - data: systemInfo, - isPending: isSystemInfoPending, - isError: isSystemInfoError - } = useSystemInfo(); const navigation = useNavigation(); const actionData = useActionData() as ActionData | undefined; @@ -120,13 +114,13 @@ export const Component = () => { }, [metadataPath]); useEffect(() => { - if (!isSystemInfoPending && !isSystemInfoError) { - setCachePath(systemInfo.CachePath); - setMetadataPath(systemInfo.InternalMetadataPath); + if (!isConfigPending && !isConfigError) { + setCachePath(config.CachePath); + setMetadataPath(config.MetadataPath); } - }, [systemInfo, isSystemInfoPending, isSystemInfoError]); + }, [config, isConfigPending, isConfigError]); - if (isConfigPending || isLocalizationOptionsPending || isSystemInfoPending) { + if (isConfigPending || isLocalizationOptionsPending) { return ; } @@ -137,7 +131,7 @@ export const Component = () => { className='type-interior mainAnimatedPage' > - {isConfigError || isLocalizationOptionsError || isSystemInfoError ? ( + {isConfigError || isLocalizationOptionsError ? ( {globalize.translate('SettingsPageLoadError')} ) : (
@@ -154,7 +148,7 @@ export const Component = () => { name='ServerName' label={globalize.translate('LabelServerName')} helperText={globalize.translate('LabelServerNameHelp')} - defaultValue={systemInfo.ServerName} + defaultValue={config.ServerName} /> { helperText={( <> {globalize.translate('LabelDisplayLanguageHelp')} - + {globalize.translate('LearnHowYouCanContribute')} diff --git a/src/apps/dashboard/routes/users/parentalcontrol.tsx b/src/apps/dashboard/routes/users/parentalcontrol.tsx index 2e4954259..c171719b0 100644 --- a/src/apps/dashboard/routes/users/parentalcontrol.tsx +++ b/src/apps/dashboard/routes/users/parentalcontrol.tsx @@ -17,7 +17,7 @@ import CheckBoxElement from '../../../../elements/CheckBoxElement'; import SelectElement from '../../../../elements/SelectElement'; import Page from '../../../../components/Page'; import prompt from '../../../../components/prompt/prompt'; -import ServerConnections from 'components/ServerConnections'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; type NamedItem = { name: string; diff --git a/src/apps/experimental/components/library/GridListViewButton.tsx b/src/apps/experimental/components/library/GridListViewButton.tsx deleted file mode 100644 index bf6f48391..000000000 --- a/src/apps/experimental/components/library/GridListViewButton.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import React, { FC, useCallback } from 'react'; -import ButtonGroup from '@mui/material/ButtonGroup/ButtonGroup'; -import IconButton from '@mui/material/IconButton'; -import ViewModuleIcon from '@mui/icons-material/ViewModule'; -import ViewListIcon from '@mui/icons-material/ViewList'; - -import globalize from 'lib/globalize'; -import { LibraryViewSettings, ViewMode } from 'types/library'; -import { LibraryTab } from 'types/libraryTab'; -import ViewSettingsButton from './ViewSettingsButton'; - -interface GridListViewButtonProps { - viewType: LibraryTab; - libraryViewSettings: LibraryViewSettings; - setLibraryViewSettings: React.Dispatch>; -} - -const GridListViewButton: FC = ({ - viewType, - libraryViewSettings, - setLibraryViewSettings -}) => { - const handleToggleCurrentView = useCallback(() => { - setLibraryViewSettings((prevState) => ({ - ...prevState, - ViewMode: - prevState.ViewMode === ViewMode.ListView ? ViewMode.GridView : ViewMode.ListView - })); - }, [setLibraryViewSettings]); - - const isGridView = libraryViewSettings.ViewMode === ViewMode.GridView; - - return ( - - {isGridView ? ( - - ) : ( - - - - )} - - - - - - ); -}; - -export default GridListViewButton; diff --git a/src/apps/experimental/components/library/ItemsView.tsx b/src/apps/experimental/components/library/ItemsView.tsx index aa6e8f881..ae985b22e 100644 --- a/src/apps/experimental/components/library/ItemsView.tsx +++ b/src/apps/experimental/components/library/ItemsView.tsx @@ -2,9 +2,12 @@ import type { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/bas import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; import { ImageType } from '@jellyfin/sdk/lib/generated-client/models/image-type'; import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client/models/item-sort-by'; -import React, { type FC, useCallback } from 'react'; import Box from '@mui/material/Box'; +import ButtonGroup from '@mui/material/ButtonGroup'; +import type { Theme } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import classNames from 'classnames'; +import React, { type FC, useCallback } from 'react'; import { useApi } from 'hooks/useApi'; import { useLocalStorage } from 'hooks/useLocalStorage'; @@ -31,8 +34,8 @@ import PlayAllButton from './PlayAllButton'; import QueueButton from './QueueButton'; import ShuffleButton from './ShuffleButton'; import SortButton from './SortButton'; -import GridListViewButton from './GridListViewButton'; import LibraryViewMenu from './LibraryViewMenu'; +import ViewSettingsButton from './ViewSettingsButton'; interface ItemsViewProps { viewType: LibraryTab; @@ -72,10 +75,11 @@ const ItemsView: FC = ({ getSettingsKey(viewType, parentId), getDefaultLibraryViewSettings(viewType) ); + const isSmallScreen = useMediaQuery((t: Theme) => t.breakpoints.up('sm')); const { __legacyApiClient__ } = useApi(); const { - isLoading, + isPending, data: itemsResult, isPlaceholderData, refetch @@ -229,90 +233,142 @@ const ItemsView: FC = ({ ); return ( - + + + + - - - {isBtnPlayAllEnabled && ( - - )} - {isBtnShuffleEnabled && totalRecordCount > 1 && ( - - )} - {isBtnQueueEnabled - && item - && playbackManager.canQueue(item) && ( - - )} - {isBtnSortEnabled && ( - - )} - {isBtnFilterEnabled && ( - - )} - {isBtnNewCollectionEnabled && } - {isBtnGridListEnabled && ( - - )} - - {isPaginationEnabled && ( - + + {isBtnFilterEnabled && ( + + )} + + {isBtnSortEnabled && ( + + )} + + {isBtnGridListEnabled && ( + + )} + + + + + {!isPending && ( + <> + + {isBtnPlayAllEnabled && ( + + )} + + {isBtnShuffleEnabled && totalRecordCount > 1 && ( + + )} + + {isBtnQueueEnabled && item && playbackManager.canQueue(item) && ( + + )} + + + {isBtnNewCollectionEnabled && } + + )} + + + + {!isPending && isPaginationEnabled && ( - - )} + )} + {isAlphabetPickerEnabled && hasSortName && ( @@ -322,7 +378,7 @@ const ItemsView: FC = ({ /> )} - {isLoading ? ( + {isPending ? ( ) : ( = ({ )} - {isPaginationEnabled && ( + {!isPending && isPaginationEnabled && ( { +interface NewCollectionButtonProps { + isTextVisible: boolean +} + +const NewCollectionButton: FC = ({ + isTextVisible +}) => { const showCollectionEditor = useCallback(() => { import('components/collectionEditor/collectionEditor').then( ({ default: CollectionEditor }) => { @@ -21,13 +28,17 @@ const NewCollectionButton: FC = () => { }, []); return ( - : undefined} onClick={showCollectionEditor} > - - + {isTextVisible ? ( + globalize.translate('NewCollection') + ) : ( + + )} + ); }; diff --git a/src/apps/experimental/components/library/Pagination.tsx b/src/apps/experimental/components/library/Pagination.tsx index 477a98231..d803ded46 100644 --- a/src/apps/experimental/components/library/Pagination.tsx +++ b/src/apps/experimental/components/library/Pagination.tsx @@ -2,8 +2,12 @@ import React, { FC, useCallback } from 'react'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import ArrowForwardIcon from '@mui/icons-material/ArrowForward'; import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; import ButtonGroup from '@mui/material/ButtonGroup'; -import IconButton from '@mui/material/IconButton'; +import Stack from '@mui/material/Stack'; +import type { Theme } from '@mui/material/styles'; +import Typography from '@mui/material/Typography'; +import useMediaQuery from '@mui/material/useMediaQuery'; import globalize from 'lib/globalize'; import * as userSettings from 'scripts/settings/userSettings'; @@ -22,6 +26,8 @@ const Pagination: FC = ({ totalRecordCount, isPlaceholderData }) => { + const isSmallScreen = useMediaQuery((t: Theme) => t.breakpoints.up('sm')); + const limit = userSettings.libraryPageSize(undefined); const startIndex = libraryViewSettings.StartIndex ?? 0; const recordsStart = totalRecordCount ? startIndex + 1 : 0; @@ -47,47 +53,88 @@ const Pagination: FC = ({ }, [limit, setLibraryViewSettings, startIndex]); return ( - + {!isSmallScreen && ( + + )} + - + {globalize.translate( 'ListPaging', recordsStart, recordsEnd, totalRecordCount )} - - {showControls && ( - - - - - - = totalRecordCount || isPlaceholderData } - onClick={onNextPageClick} - > - - - - )} + - + + {isSmallScreen && ( + + + + + + )} + + {!isSmallScreen && ( + + )} + ); }; diff --git a/src/apps/experimental/components/library/PlayAllButton.tsx b/src/apps/experimental/components/library/PlayAllButton.tsx index 16cef318a..d02fcea5e 100644 --- a/src/apps/experimental/components/library/PlayAllButton.tsx +++ b/src/apps/experimental/components/library/PlayAllButton.tsx @@ -1,6 +1,6 @@ import React, { FC, useCallback } from 'react'; -import IconButton from '@mui/material/IconButton'; -import PlayArrowIcon from '@mui/icons-material/PlayArrow'; +import Button from '@mui/material/Button'; +import PlayArrow from '@mui/icons-material/PlayArrow'; import { playbackManager } from 'components/playback/playbackmanager'; import globalize from 'lib/globalize'; @@ -10,14 +10,22 @@ import { LibraryTab } from 'types/libraryTab'; import type { ItemDto } from 'types/base/models/item-dto'; interface PlayAllButtonProps { - item: ItemDto | undefined; - items: ItemDto[]; - viewType: LibraryTab; - hasFilters: boolean; + item: ItemDto | undefined + items: ItemDto[] + viewType: LibraryTab + hasFilters: boolean + isTextVisible: boolean libraryViewSettings: LibraryViewSettings } -const PlayAllButton: FC = ({ item, items, viewType, hasFilters, libraryViewSettings }) => { +const PlayAllButton: FC = ({ + item, + items, + viewType, + hasFilters, + isTextVisible, + libraryViewSettings +}) => { const play = useCallback(() => { if (item && !hasFilters) { playbackManager.play({ @@ -47,19 +55,17 @@ const PlayAllButton: FC = ({ item, items, viewType, hasFilte }, [hasFilters, item, items, libraryViewSettings, viewType]); return ( - : undefined} onClick={play} - sx={{ - order: { - xs: 1, - sm: 'unset' - } - }} > - - + {isTextVisible ? ( + globalize.translate('HeaderPlayAll') + ) : ( + + )} + ); }; diff --git a/src/apps/experimental/components/library/QueueButton.tsx b/src/apps/experimental/components/library/QueueButton.tsx index c656e2b56..aa925e228 100644 --- a/src/apps/experimental/components/library/QueueButton.tsx +++ b/src/apps/experimental/components/library/QueueButton.tsx @@ -1,6 +1,6 @@ import React, { FC, useCallback } from 'react'; -import IconButton from '@mui/material/IconButton'; -import QueueIcon from '@mui/icons-material/Queue'; +import Button from '@mui/material/Button'; +import Queue from '@mui/icons-material/Queue'; import { playbackManager } from 'components/playback/playbackmanager'; import globalize from 'lib/globalize'; @@ -8,11 +8,17 @@ import type { ItemDto } from 'types/base/models/item-dto'; interface QueueButtonProps { item: ItemDto | undefined - items: ItemDto[]; - hasFilters: boolean; + items: ItemDto[] + hasFilters: boolean + isTextVisible: boolean } -const QueueButton: FC = ({ item, items, hasFilters }) => { +const QueueButton: FC = ({ + item, + items, + hasFilters, + isTextVisible +}) => { const queue = useCallback(() => { if (item && !hasFilters) { playbackManager.queue({ @@ -30,19 +36,17 @@ const QueueButton: FC = ({ item, items, hasFilters }) => { }, [hasFilters, item, items]); return ( - : undefined} onClick={queue} - sx={{ - order: { - xs: 3, - sm: 'unset' - } - }} > - - + {isTextVisible ? ( + globalize.translate('AddToPlayQueue') + ) : ( + + )} + ); }; diff --git a/src/apps/experimental/components/library/ShuffleButton.tsx b/src/apps/experimental/components/library/ShuffleButton.tsx index 44acdbc54..7f240df44 100644 --- a/src/apps/experimental/components/library/ShuffleButton.tsx +++ b/src/apps/experimental/components/library/ShuffleButton.tsx @@ -1,7 +1,7 @@ import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client/models/item-sort-by'; import React, { FC, useCallback } from 'react'; -import IconButton from '@mui/material/IconButton'; -import ShuffleIcon from '@mui/icons-material/Shuffle'; +import Shuffle from '@mui/icons-material/Shuffle'; +import Button from '@mui/material/Button'; import { playbackManager } from 'components/playback/playbackmanager'; import globalize from 'lib/globalize'; @@ -11,14 +11,22 @@ import { LibraryTab } from 'types/libraryTab'; import type { ItemDto } from 'types/base/models/item-dto'; interface ShuffleButtonProps { - item: ItemDto | undefined; - items: ItemDto[]; + item: ItemDto | undefined + items: ItemDto[] viewType: LibraryTab - hasFilters: boolean; + hasFilters: boolean + isTextVisible: boolean libraryViewSettings: LibraryViewSettings } -const ShuffleButton: FC = ({ item, items, viewType, hasFilters, libraryViewSettings }) => { +const ShuffleButton: FC = ({ + item, + items, + viewType, + hasFilters, + isTextVisible, + libraryViewSettings +}) => { const shuffle = useCallback(() => { if (item && !hasFilters) { playbackManager.shuffle(item); @@ -38,19 +46,17 @@ const ShuffleButton: FC = ({ item, items, viewType, hasFilte }, [hasFilters, item, items, libraryViewSettings, viewType]); return ( - : undefined} onClick={shuffle} - sx={{ - order: { - xs: 2, - sm: 'unset' - } - }} > - - + {isTextVisible ? ( + globalize.translate('Shuffle') + ) : ( + + )} + ); }; diff --git a/src/apps/experimental/components/library/SortButton.tsx b/src/apps/experimental/components/library/SortButton.tsx index 25f290b25..6e8acf8b9 100644 --- a/src/apps/experimental/components/library/SortButton.tsx +++ b/src/apps/experimental/components/library/SortButton.tsx @@ -1,12 +1,11 @@ import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client/models/item-sort-by'; import { SortOrder } from '@jellyfin/sdk/lib/generated-client/models/sort-order'; import React, { FC, useCallback } from 'react'; -import IconButton from '@mui/material/IconButton'; +import Button from '@mui/material/Button'; import MenuItem from '@mui/material/MenuItem'; import Popover from '@mui/material/Popover'; import Typography from '@mui/material/Typography'; import Divider from '@mui/material/Divider'; -import Box from '@mui/material/Box'; import InputLabel from '@mui/material/InputLabel'; import FormControl from '@mui/material/FormControl'; import Select, { SelectChangeEvent } from '@mui/material/Select'; @@ -149,16 +148,14 @@ const SortButton: FC = ({ const sortMenuOptions = getSortMenuOptions(viewType); return ( - - + = ({ - + ); }; diff --git a/src/apps/experimental/components/library/ViewSettingsButton.tsx b/src/apps/experimental/components/library/ViewSettingsButton.tsx index 2ee46b6f1..b61a41db6 100644 --- a/src/apps/experimental/components/library/ViewSettingsButton.tsx +++ b/src/apps/experimental/components/library/ViewSettingsButton.tsx @@ -1,25 +1,28 @@ import { ImageType } from '@jellyfin/sdk/lib/generated-client/models/image-type'; import React, { FC, useCallback } from 'react'; -import IconButton from '@mui/material/IconButton'; -import MenuItem from '@mui/material/MenuItem'; +import Check from '@mui/icons-material/Check'; +import MoreVert from '@mui/icons-material/MoreVert'; +import Button from '@mui/material/Button'; import Checkbox from '@mui/material/Checkbox'; -import Typography from '@mui/material/Typography'; import Divider from '@mui/material/Divider'; -import Box from '@mui/material/Box'; -import InputLabel from '@mui/material/InputLabel'; import FormControl from '@mui/material/FormControl'; import FormControlLabel from '@mui/material/FormControlLabel'; import FormGroup from '@mui/material/FormGroup'; -import Select, { SelectChangeEvent } from '@mui/material/Select'; +import InputLabel from '@mui/material/InputLabel'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import MenuItem from '@mui/material/MenuItem'; +import MenuList from '@mui/material/MenuList'; import Popover from '@mui/material/Popover'; -import ViewComfyIcon from '@mui/icons-material/ViewComfy'; +import Select, { SelectChangeEvent } from '@mui/material/Select'; +import Typography from '@mui/material/Typography'; import globalize from 'lib/globalize'; -import { LibraryViewSettings } from 'types/library'; +import { LibraryViewSettings, ViewMode } from 'types/library'; import { LibraryTab } from 'types/libraryTab'; -const excludedViewType = [ +const IMAGE_TYPE_EXCLUDED_VIEWS = [ LibraryTab.Episodes, LibraryTab.Artists, LibraryTab.AlbumArtists, @@ -71,6 +74,20 @@ const ViewSettingsButton: FC = ({ [setLibraryViewSettings] ); + const onGridViewClick = useCallback(() => { + setLibraryViewSettings(prevState => ({ + ...prevState, + ViewMode: ViewMode.GridView + })); + }, [ setLibraryViewSettings ]); + + const onListViewClick = useCallback(() => { + setLibraryViewSettings(prevState => ({ + ...prevState, + ViewMode: ViewMode.ListView + })); + }, [ setLibraryViewSettings ]); + const onSelectChange = useCallback( (event: SelectChangeEvent) => { setLibraryViewSettings((prevState) => ({ @@ -81,19 +98,18 @@ const ViewSettingsButton: FC = ({ [setLibraryViewSettings] ); - const isVisible = !excludedViewType.includes(viewType); + const isGridView = libraryViewSettings.ViewMode === ViewMode.GridView; + const isImageTypeVisible = !IMAGE_TYPE_EXCLUDED_VIEWS.includes(viewType); return ( - - + = ({ '& .MuiFormControl-root': { m: 1, width: 220 } }} > - {isVisible && ( - - - - {globalize.translate('LabelImageType')} - - - - - )} - - - - - } - label={globalize.translate('ShowTitle')} - /> - {isVisible && ( - - } - label={globalize.translate('ShowYear')} - /> + + + + {isGridView && ( + )} - - } - label={globalize.translate('EnableCardLayout')} - /> - - + + {globalize.translate('GridView')} + + + + {!isGridView && ( + + )} + + {globalize.translate('ListView')} + + + + {isGridView && ( + <> + + {isImageTypeVisible && ( + <> + + + + {globalize.translate('LabelImageType')} + + + + + + + )} + + + + } + label={globalize.translate('ShowTitle')} + /> + {isImageTypeVisible && ( + + } + label={globalize.translate('ShowYear')} + /> + )} + + } + label={globalize.translate('EnableCardLayout')} + /> + + + + )} + - + ); }; diff --git a/src/apps/experimental/components/library/filter/FilterButton.tsx b/src/apps/experimental/components/library/filter/FilterButton.tsx index 9442d8361..aed9d360b 100644 --- a/src/apps/experimental/components/library/filter/FilterButton.tsx +++ b/src/apps/experimental/components/library/filter/FilterButton.tsx @@ -1,8 +1,8 @@ import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; import React, { FC, useCallback } from 'react'; import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp'; -import Box from '@mui/material/Box'; -import FilterListIcon from '@mui/icons-material/FilterList'; +import FilterAlt from '@mui/icons-material/FilterAlt'; +import Button from '@mui/material/Button'; import Popover from '@mui/material/Popover'; import MuiAccordion, { AccordionProps } from '@mui/material/Accordion'; import MuiAccordionDetails from '@mui/material/AccordionDetails'; @@ -10,7 +10,6 @@ import MuiAccordionSummary, { AccordionSummaryProps } from '@mui/material/AccordionSummary'; import Badge from '@mui/material/Badge'; -import IconButton from '@mui/material/IconButton'; import { styled } from '@mui/material/styles'; import Typography from '@mui/material/Typography'; @@ -158,18 +157,16 @@ const FilterButton: FC = ({ }; return ( - - + = ({ )} - + ); }; diff --git a/src/apps/experimental/features/preferences/components/DisplayPreferences.tsx b/src/apps/experimental/features/preferences/components/DisplayPreferences.tsx index 6977459c6..e5e940b7a 100644 --- a/src/apps/experimental/features/preferences/components/DisplayPreferences.tsx +++ b/src/apps/experimental/features/preferences/components/DisplayPreferences.tsx @@ -11,6 +11,7 @@ import Typography from '@mui/material/Typography'; import React, { Fragment } from 'react'; import { appHost } from 'components/apphost'; +import { AppFeature } from 'constants/appFeature'; import { useApi } from 'hooks/useApi'; import { useThemes } from 'hooks/useThemes'; import globalize from 'lib/globalize'; @@ -32,7 +33,7 @@ export function DisplayPreferences({ onChange, values }: Readonly {globalize.translate('Display')} - { appHost.supports('displaymode') && ( + { appHost.supports(AppFeature.DisplayMode) && ( {globalize.translate('LabelDisplayMode')} {globalize.translate('LabelDisplayLanguageHelp')} - { appHost.supports('externallinks') && ( + { appHost.supports(AppFeature.ExternalLinks) && ( , children: [ + ...ASYNC_PUBLIC_ROUTES.map(toAsyncPageRoute), ...LEGACY_PUBLIC_ROUTES.map(toViewManagerPageRoute), /* Fallback route for invalid paths */ { diff --git a/src/apps/stable/routes/session/forgotPassword/index.tsx b/src/apps/stable/routes/session/forgotPassword/index.tsx new file mode 100644 index 000000000..ed8942547 --- /dev/null +++ b/src/apps/stable/routes/session/forgotPassword/index.tsx @@ -0,0 +1,129 @@ +import { ForgotPasswordAction } from '@jellyfin/sdk/lib/generated-client/models/forgot-password-action'; +import { getUserApi } from '@jellyfin/sdk/lib/utils/api/user-api'; +import { useMutation } from '@tanstack/react-query'; +import React, { useCallback, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; + +import alert from 'components/alert'; +import Page from 'components/Page'; +import Button from 'elements/emby-button/Button'; +import Input from 'elements/emby-input/Input'; +import globalize from 'lib/globalize'; +import ServerConnections from 'lib/jellyfin-apiclient/ServerConnections'; + +export const ForgotPasswordPage = () => { + const navigate = useNavigate(); + const [username, setUsername] = useState(''); + + const forgotPasswordMutation = useMutation({ + mutationFn: async (enteredUsername: string) => { + const currentApi = ServerConnections.getCurrentApi(); + if (!currentApi) { + throw new Error('API not available'); + } + const response = await getUserApi(currentApi).forgotPassword({ + forgotPasswordDto: { + EnteredUsername: enteredUsername + } + }); + + return response.data; + }, + onSuccess: (result) => { + let msg = ''; + let callback: () => void | undefined = () => undefined; + + switch (result.Action) { + case ForgotPasswordAction.ContactAdmin: + msg = globalize.translate('MessageContactAdminToResetPassword'); + break; + case ForgotPasswordAction.InNetworkRequired: + msg = globalize.translate('MessageForgotPasswordInNetworkRequired'); + break; + case ForgotPasswordAction.PinCode: + msg = globalize.translate('MessageForgotPasswordFileCreated'); + msg += '

'; + msg += globalize.translate('MessageForgotPasswordPinReset'); + msg += '

'; + msg += result.PinFile; + msg += '
'; + callback = () => navigate('/forgotpasswordpin'); + break; + default: + return; + } + + return alert({ + text: msg, + title: globalize.translate('ButtonForgotPassword') + }).then(() => { + if (callback) callback(); + }); + } + }); + + const handleCancel = useCallback(() => { + navigate(-1); + }, [navigate]); + + const handleSubmit = useCallback(async (e: React.FormEvent) => { + e.preventDefault(); + forgotPasswordMutation.mutate(username); + }, [username, forgotPasswordMutation]); + + const handleUsernameChange = useCallback((e: React.ChangeEvent) => { + setUsername(e.target.value); + }, []); + + return ( + +
+ +
+

{globalize.translate('ButtonForgotPassword')}

+ +
+ +
+ {globalize.translate('LabelForgotPasswordUsernameHelp')} +
+
+ +
+
+
+ +
+
+ ); +}; + +export default ForgotPasswordPage; diff --git a/src/apps/stable/routes/user/settings/index.tsx b/src/apps/stable/routes/user/settings/index.tsx index 8f8f2ad2e..393ba7d02 100644 --- a/src/apps/stable/routes/user/settings/index.tsx +++ b/src/apps/stable/routes/user/settings/index.tsx @@ -6,6 +6,7 @@ import { appHost } from 'components/apphost'; import layoutManager from 'components/layoutManager'; import Loading from 'components/loading/LoadingComponent'; import Page from 'components/Page'; +import { AppFeature } from 'constants/appFeature'; import LinkButton from 'elements/emby-button/LinkButton'; import { useApi } from 'hooks/useApi'; import { useQuickConnectEnabled } from 'hooks/useQuickConnect'; @@ -185,7 +186,28 @@ const UserSettingsPage: FC = () => { - {appHost.supports('clientsettings') && ( + {appHost.supports(AppFeature.DownloadManagement) && ( + +
+
+
+ )} + + {appHost.supports(AppFeature.ClientSettings) && ( { {globalize.translate('HeaderUser')} - {appHost.supports('multiserver') && ( + {appHost.supports(AppFeature.MultiServer) && ( { - {appHost.supports('exitmenu') && ( + {appHost.supports(AppFeature.ExitMenu) && ( { const [ searchParams ] = useSearchParams(); @@ -61,7 +62,7 @@ const UserProfile: FunctionComponent = () => { if (user.PrimaryImageTag) { (page.querySelector('#btnAddImage') as HTMLButtonElement).classList.add('hide'); (page.querySelector('#btnDeleteImage') as HTMLButtonElement).classList.remove('hide'); - } else if (appHost.supports('fileinput') && (loggedInUser?.Policy?.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { + } else if (appHost.supports(AppFeature.FileInput) && (loggedInUser?.Policy?.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { (page.querySelector('#btnDeleteImage') as HTMLButtonElement).classList.add('hide'); (page.querySelector('#btnAddImage') as HTMLButtonElement).classList.remove('hide'); } diff --git a/src/apps/wizard/controllers/finish/index.js b/src/apps/wizard/controllers/finish/index.js index 4408da2dd..bea7e28e7 100644 --- a/src/apps/wizard/controllers/finish/index.js +++ b/src/apps/wizard/controllers/finish/index.js @@ -1,5 +1,5 @@ import loading from 'components/loading/loading'; -import ServerConnections from 'components/ServerConnections'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; function onFinish() { loading.show(); diff --git a/src/apps/wizard/controllers/library.js b/src/apps/wizard/controllers/library.js index ccdc42b13..dfa0f17e4 100644 --- a/src/apps/wizard/controllers/library.js +++ b/src/apps/wizard/controllers/library.js @@ -3,8 +3,8 @@ import escapeHtml from 'escape-html'; import { getDefaultBackgroundClass } from 'components/cardbuilder/cardBuilderUtils'; import confirm from 'components/confirm/confirm'; import loading from 'components/loading/loading'; -import ServerConnections from 'components/ServerConnections'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import dom from 'scripts/dom'; import taskButton from 'scripts/taskbutton'; import Dashboard, { pageClassOn, pageIdOn } from 'utils/dashboard'; diff --git a/src/apps/wizard/controllers/remote/index.js b/src/apps/wizard/controllers/remote/index.js index f836f1fa9..7b35e2cb6 100644 --- a/src/apps/wizard/controllers/remote/index.js +++ b/src/apps/wizard/controllers/remote/index.js @@ -1,5 +1,5 @@ import loading from 'components/loading/loading'; -import ServerConnections from 'components/ServerConnections'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Dashboard from 'utils/dashboard'; import 'elements/emby-checkbox/emby-checkbox'; diff --git a/src/apps/wizard/controllers/settings/index.js b/src/apps/wizard/controllers/settings/index.js index f118d83ce..765530a2b 100644 --- a/src/apps/wizard/controllers/settings/index.js +++ b/src/apps/wizard/controllers/settings/index.js @@ -1,5 +1,5 @@ import loading from 'components/loading/loading'; -import ServerConnections from 'components/ServerConnections'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Dashboard from 'utils/dashboard'; import 'elements/emby-button/emby-button'; diff --git a/src/apps/wizard/controllers/start/index.html b/src/apps/wizard/controllers/start/index.html index 394959349..9ec77613b 100644 --- a/src/apps/wizard/controllers/start/index.html +++ b/src/apps/wizard/controllers/start/index.html @@ -1,10 +1,10 @@ -
+

${WelcomeToProject}

- + ${ButtonQuickStartGuide}
@@ -12,6 +12,10 @@

${ThisWizardWillGuideYou}


+
+ +
${LabelServerNameHelp}
+
diff --git a/src/apps/wizard/controllers/start/index.js b/src/apps/wizard/controllers/start/index.js index abbe00327..9081a6c52 100644 --- a/src/apps/wizard/controllers/start/index.js +++ b/src/apps/wizard/controllers/start/index.js @@ -1,17 +1,21 @@ import loading from 'components/loading/loading'; -import ServerConnections from 'components/ServerConnections'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Dashboard from 'utils/dashboard'; import dom from 'scripts/dom'; import 'elements/emby-button/emby-button'; import 'elements/emby-select/emby-select'; -function loadPage(page, config, languageOptions) { - const elem = page.querySelector('#selectLocalizationLanguage'); - elem.innerHTML = languageOptions.map(function (l) { +function loadPage(page, systemInfo, config, languageOptions) { + const serverNameElem = page.querySelector('#txtServerName'); + serverNameElem.value = config.ServerName || systemInfo.ServerName; + + const languageElem = page.querySelector('#selectLocalizationLanguage'); + languageElem.innerHTML = languageOptions.map(function (l) { return ''; }).join(''); - elem.value = config.UICulture; + languageElem.value = config.UICulture; + loading.hide(); } @@ -19,7 +23,9 @@ function save(page) { loading.show(); const apiClient = ServerConnections.currentApiClient(); apiClient.getJSON(apiClient.getUrl('Startup/Configuration')).then(function (config) { + config.ServerName = page.querySelector('#txtServerName').value; config.UICulture = page.querySelector('#selectLocalizationLanguage').value; + apiClient.ajax({ type: 'POST', data: JSON.stringify(config), @@ -38,17 +44,22 @@ function onSubmit(e) { export default function (view) { view.querySelector('.wizardStartForm').addEventListener('submit', onSubmit); + view.addEventListener('viewshow', function () { document.querySelector('.skinHeader').classList.add('noHomeButtonHeader'); loading.show(); const page = this; const apiClient = ServerConnections.currentApiClient(); - const promise1 = apiClient.getJSON(apiClient.getUrl('Startup/Configuration')); - const promise2 = apiClient.getJSON(apiClient.getUrl('Localization/Options')); - Promise.all([promise1, promise2]).then(function (responses) { - loadPage(page, responses[0], responses[1]); + + Promise.all([ + apiClient.getPublicSystemInfo(), + apiClient.getJSON(apiClient.getUrl('Startup/Configuration')), + apiClient.getJSON(apiClient.getUrl('Localization/Options')) + ]).then(([ systemInfo, config, languageOptions ]) => { + loadPage(page, systemInfo, config, languageOptions); }); }); + view.addEventListener('viewhide', function () { document.querySelector('.skinHeader').classList.remove('noHomeButtonHeader'); }); diff --git a/src/apps/wizard/controllers/user/index.js b/src/apps/wizard/controllers/user/index.js index 1a13a790b..a9255754f 100644 --- a/src/apps/wizard/controllers/user/index.js +++ b/src/apps/wizard/controllers/user/index.js @@ -1,7 +1,7 @@ import loading from 'components/loading/loading'; -import ServerConnections from 'components/ServerConnections'; import toast from 'components/toast/toast'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Dashboard from 'utils/dashboard'; import 'styles/dashboard.scss'; diff --git a/src/components/Backdrop.tsx b/src/components/Backdrop.tsx index 52b6bdcc9..4a6b793fa 100644 --- a/src/components/Backdrop.tsx +++ b/src/components/Backdrop.tsx @@ -1,15 +1,5 @@ -import Box from '@mui/material/Box'; import React, { useEffect } from 'react'; -import layoutManager from './layoutManager'; -import { DRAWER_WIDTH } from './ResponsiveDrawer'; - -const styles = layoutManager.experimental ? { - left: { - md: DRAWER_WIDTH - } -} : {}; - const Backdrop = () => { useEffect(() => { // Initialize the UI components after first render @@ -18,10 +8,7 @@ const Backdrop = () => { return ( <> - +
); diff --git a/src/components/ConnectionErrorPage.tsx b/src/components/ConnectionErrorPage.tsx new file mode 100644 index 000000000..db74acdc5 --- /dev/null +++ b/src/components/ConnectionErrorPage.tsx @@ -0,0 +1,104 @@ +import DOMPurify from 'dompurify'; +import React, { FC, useCallback, useEffect, useState } from 'react'; + +import { appHost } from 'components/apphost'; +import Page from 'components/Page'; +import toast from 'components/toast/toast'; +import { AppFeature } from 'constants/appFeature'; +import LinkButton from 'elements/emby-button/LinkButton'; +import globalize from 'lib/globalize'; +import { ConnectionState, ServerConnections } from 'lib/jellyfin-apiclient'; + +interface ConnectionErrorPageProps { + state: ConnectionState +} + +const ConnectionErrorPage: FC = ({ + state +}) => { + const [ title, setTitle ] = useState(); + const [ htmlMessage, setHtmlMessage ] = useState(); + const [ message, setMessage ] = useState(); + const [ isConnectDisabled, setIsConnectDisabled ] = useState(false); + + const onForceConnect = useCallback(async () => { + setIsConnectDisabled(true); + + try { + const server = ServerConnections.getLastUsedServer(); + await ServerConnections.updateSavedServerId(server); + window.location.reload(); + } catch (err) { + console.error('[ConnectionErrorPage] Failed to force connect to server', err); + toast(globalize.translate('HeaderConnectionFailure')); + setIsConnectDisabled(false); + } + }, []); + + useEffect(() => { + switch (state) { + case ConnectionState.ServerMismatch: + setTitle(globalize.translate('HeaderServerMismatch')); + setHtmlMessage(undefined); + setMessage(globalize.translate('MessageServerMismatch')); + return; + case ConnectionState.ServerUpdateNeeded: + setTitle(globalize.translate('HeaderUpdateRequired')); + setHtmlMessage(globalize.translate( + 'ServerUpdateNeeded', + 'jellyfin.org/downloads/server' + )); + setMessage(undefined); + return; + case ConnectionState.Unavailable: + setTitle(globalize.translate('HeaderServerUnavailable')); + setHtmlMessage(undefined); + setMessage(globalize.translate('MessageUnableToConnectToServer')); + } + }, [ state ]); + + if (!title) return; + + return ( + +
+

{title}

+ {htmlMessage && ( +

+ )} + {message && ( +

+ {message} +

+ )} + + {appHost.supports(AppFeature.MultiServer) && ( + + {globalize.translate('ButtonChangeServer')} + + )} + + {state === ConnectionState.ServerMismatch && ( + + {globalize.translate('ConnectAnyway')} + + )} +
+
+ ); +}; + +export default ConnectionErrorPage; diff --git a/src/components/ConnectionRequired.tsx b/src/components/ConnectionRequired.tsx index 61c7cbcd8..5f69a10f6 100644 --- a/src/components/ConnectionRequired.tsx +++ b/src/components/ConnectionRequired.tsx @@ -2,12 +2,10 @@ import React, { FunctionComponent, useCallback, useEffect, useState } from 'reac import { Outlet, useLocation, useNavigate } from 'react-router-dom'; import type { ApiClient, ConnectResponse } from 'jellyfin-apiclient'; -import globalize from 'lib/globalize'; -import { ConnectionState } from 'utils/jellyfin-apiclient/ConnectionState'; +import { ConnectionState, ServerConnections } from 'lib/jellyfin-apiclient'; -import alert from './alert'; +import ConnectionErrorPage from './ConnectionErrorPage'; import Loading from './loading/LoadingComponent'; -import ServerConnections from './ServerConnections'; enum AccessLevel { /** Requires a user with administrator access */ @@ -33,6 +31,12 @@ type ConnectionRequiredProps = { level?: AccessLevelValue }; +const ERROR_STATES = [ + ConnectionState.ServerMismatch, + ConnectionState.ServerUpdateNeeded, + ConnectionState.Unavailable +]; + const fetchPublicSystemInfo = async (apiClient: ApiClient) => { const infoResponse = await fetch( `${apiClient.serverAddress()}/System/Info/Public`, @@ -57,8 +61,16 @@ const ConnectionRequired: FunctionComponent = ({ const navigate = useNavigate(); const location = useLocation(); + const [ errorState, setErrorState ] = useState(); const [ isLoading, setIsLoading ] = useState(true); + const navigateIfNotThere = useCallback((route: BounceRoutes) => { + // If we try to navigate to the current route, just set isLoading = false + if (location.pathname === route) setIsLoading(false); + // Otherwise navigate to the route + else navigate(route); + }, [ location.pathname, navigate ]); + const bounce = useCallback(async (connectionResponse: ConnectResponse) => { switch (connectionResponse.State) { case ConnectionState.SignedIn: @@ -78,31 +90,14 @@ const ConnectionRequired: FunctionComponent = ({ return; case ConnectionState.ServerSelection: // Bounce to select server page - if (location.pathname === BounceRoutes.SelectServer) { - setIsLoading(false); - } else { - console.debug('[ConnectionRequired] redirecting to select server page'); - navigate(BounceRoutes.SelectServer); - } - return; - case ConnectionState.ServerUpdateNeeded: - // Show update needed message and bounce to select server page - try { - await alert({ - text: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'), - html: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin') - }); - } catch (ex) { - console.warn('[ConnectionRequired] failed to show alert', ex); - } - console.debug('[ConnectionRequired] server update required, redirecting to select server page'); - navigate(BounceRoutes.SelectServer); + console.debug('[ConnectionRequired] redirecting to select server page'); + navigateIfNotThere(BounceRoutes.SelectServer); return; } console.warn('[ConnectionRequired] unhandled connection state', connectionResponse.State); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [location.pathname, navigate]); + }, [ navigateIfNotThere, location.pathname, navigate ]); const handleWizard = useCallback(async (firstConnection: ConnectResponse | null) => { const apiClient = firstConnection?.ApiClient || ServerConnections.currentApiClient(); @@ -195,7 +190,9 @@ const ConnectionRequired: FunctionComponent = ({ console.debug('[ConnectionRequired] connection state', firstConnection?.State); ServerConnections.firstConnection = true; - if (level === AccessLevel.Wizard) { + if (ERROR_STATES.includes(firstConnection?.State)) { + setErrorState(firstConnection.State); + } else if (level === AccessLevel.Wizard) { handleWizard(firstConnection) .catch(err => { console.error('[ConnectionRequired] could not validate wizard status', err); @@ -218,6 +215,10 @@ const ConnectionRequired: FunctionComponent = ({ }); }, [handleIncompleteWizard, handleWizard, level, validateUserAccess]); + if (errorState) { + return ; + } + if (isLoading) { return ; } diff --git a/src/components/ElevationScroll.tsx b/src/components/ElevationScroll.tsx index acbc07bae..920140c42 100644 --- a/src/components/ElevationScroll.tsx +++ b/src/components/ElevationScroll.tsx @@ -13,7 +13,7 @@ const ElevationScroll = ({ children, elevate = false }: { children: ReactElement const isElevated = elevate || trigger; return React.cloneElement(children, { - color: isElevated ? 'primary' : 'transparent', + color: isElevated ? 'default' : 'transparent', elevation: isElevated ? 4 : 0 }); }; diff --git a/src/components/Image.tsx b/src/components/Image.tsx index 84f792722..7ab0effe9 100644 --- a/src/components/Image.tsx +++ b/src/components/Image.tsx @@ -2,9 +2,10 @@ import type { SvgIconComponent } from '@mui/icons-material'; import ImageNotSupported from '@mui/icons-material/ImageNotSupported'; import Box from '@mui/material/Box/Box'; import Paper from '@mui/material/Paper/Paper'; -import Skeleton from '@mui/material/Skeleton/Skeleton'; import React, { type FC } from 'react'; +import { LoadingSkeleton } from './LoadingSkeleton'; + interface ImageProps { isLoading: boolean alt?: string @@ -30,36 +31,36 @@ const Image: FC = ({ overflow: 'hidden' }} > - {isLoading && ( - - )} - {url ? ( - {alt} - ) : ( - - + {url ? ( + {alt} - - )} + ) : ( + + + + )} + ); diff --git a/src/components/LoadingSkeleton.tsx b/src/components/LoadingSkeleton.tsx new file mode 100644 index 000000000..d49735dd1 --- /dev/null +++ b/src/components/LoadingSkeleton.tsx @@ -0,0 +1,18 @@ +import Skeleton, { type SkeletonProps } from '@mui/material/Skeleton/Skeleton'; +import React, { FC } from 'react'; + +interface LoadingSkeletonProps extends SkeletonProps { + isLoading: boolean +} + +export const LoadingSkeleton: FC = ({ + children, + isLoading, + ...props +}) => ( + isLoading ? ( + + ) : ( + children + ) +); diff --git a/src/components/ServerContentPage.tsx b/src/components/ServerContentPage.tsx index 2880e9a30..2400e4fd1 100644 --- a/src/components/ServerContentPage.tsx +++ b/src/components/ServerContentPage.tsx @@ -1,10 +1,10 @@ import { FunctionComponent, useEffect } from 'react'; import { useLocation } from 'react-router-dom'; -import ServerConnections from './ServerConnections'; import viewManager from './viewManager/viewManager'; -import globalize from '../lib/globalize'; -import type { RestoreViewFailResponse } from '../types/viewManager'; +import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import type { RestoreViewFailResponse } from 'types/viewManager'; interface ServerContentPageProps { view: string diff --git a/src/components/activitylog.js b/src/components/activitylog.js index 36f17c880..cde6c81da 100644 --- a/src/components/activitylog.js +++ b/src/components/activitylog.js @@ -1,12 +1,12 @@ import escapeHtml from 'escape-html'; import Events from '../utils/events.ts'; import globalize from '../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import dom from '../scripts/dom'; import { formatRelative } from 'date-fns'; import serverNotifications from '../scripts/serverNotifications'; import '../elements/emby-button/emby-button'; import './listview/listview.scss'; -import ServerConnections from './ServerConnections'; import alert from './alert'; import { getLocale } from '../utils/dateFnsLocale.ts'; import { toBoolean } from '../utils/string.ts'; diff --git a/src/components/apphost.js b/src/components/apphost.js index 7d4908856..addc352c1 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -5,6 +5,7 @@ import * as htmlMediaHelper from '../components/htmlMediaHelper'; import * as webSettings from '../scripts/settings/webSettings'; import globalize from '../lib/globalize'; import profileBuilder from '../scripts/browserDeviceProfile'; +import { AppFeature } from 'constants/appFeature'; const appName = 'Jellyfin Web'; @@ -169,14 +170,6 @@ function getDeviceName() { return deviceName; } -function supportsVoiceInput() { - if (!browser.tv) { - return window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.oSpeechRecognition || window.msSpeechRecognition; - } - - return false; -} - function supportsFullscreen() { if (browser.tv) { return false; @@ -235,77 +228,65 @@ const supportedFeatures = function () { const features = []; if (navigator.share) { - features.push('sharing'); + features.push(AppFeature.Sharing); } if (!browser.edgeUwp && !browser.tv && !browser.xboxOne && !browser.ps4) { - features.push('filedownload'); + features.push(AppFeature.FileDownload); } if (browser.operaTv || browser.tizen || browser.orsay || browser.web0s) { - features.push('exit'); - } else { - features.push('plugins'); + features.push(AppFeature.Exit); } if (!browser.operaTv && !browser.tizen && !browser.orsay && !browser.web0s && !browser.ps4) { - features.push('externallinks'); - features.push('externalpremium'); - } - - if (!browser.operaTv) { - features.push('externallinkdisplay'); - } - - if (supportsVoiceInput()) { - features.push('voiceinput'); + features.push(AppFeature.ExternalLinks); } if (supportsHtmlMediaAutoplay()) { - features.push('htmlaudioautoplay'); - features.push('htmlvideoautoplay'); + features.push(AppFeature.HtmlAudioAutoplay); + features.push(AppFeature.HtmlVideoAutoplay); } if (supportsFullscreen()) { - features.push('fullscreenchange'); + features.push(AppFeature.Fullscreen); } if (browser.tv || browser.xboxOne || browser.ps4 || browser.mobile || browser.ipad) { - features.push('physicalvolumecontrol'); + features.push(AppFeature.PhysicalVolumeControl); } if (!browser.tv && !browser.xboxOne && !browser.ps4) { - features.push('remotecontrol'); + features.push(AppFeature.RemoteControl); } if (!browser.operaTv && !browser.tizen && !browser.orsay && !browser.web0s && !browser.edgeUwp) { - features.push('remotevideo'); + features.push(AppFeature.RemoteVideo); } - features.push('displaylanguage'); - features.push('otherapppromotions'); - features.push('displaymode'); - features.push('targetblank'); - features.push('screensaver'); + features.push(AppFeature.DisplayLanguage); + features.push(AppFeature.DisplayMode); + features.push(AppFeature.TargetBlank); + features.push(AppFeature.Screensaver); webSettings.getMultiServer().then(enabled => { - if (enabled) features.push('multiserver'); + if (enabled) features.push(AppFeature.MultiServer); }); if (!browser.orsay && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) { - features.push('subtitleappearancesettings'); + features.push(AppFeature.SubtitleAppearance); } if (!browser.orsay) { - features.push('subtitleburnsettings'); + features.push(AppFeature.SubtitleBurnIn); } if (!browser.tv && !browser.ps4 && !browser.xboxOne) { - features.push('fileinput'); + features.push(AppFeature.FileInput); } if (browser.chrome || browser.edgeChromium) { - features.push('chromecast'); + features.push(AppFeature.Chromecast); } return features; diff --git a/src/components/backdrop/backdrop.js b/src/components/backdrop/backdrop.js index 4c64ea818..cc7346d5f 100644 --- a/src/components/backdrop/backdrop.js +++ b/src/components/backdrop/backdrop.js @@ -1,9 +1,9 @@ import isEqual from 'lodash-es/isEqual'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import browser from '../../scripts/browser'; import { playbackManager } from '../playback/playbackmanager'; import dom from '../../scripts/dom'; import * as userSettings from '../../scripts/settings/userSettings'; -import ServerConnections from '../ServerConnections'; import './backdrop.scss'; @@ -213,19 +213,19 @@ function enabled() { let rotationInterval; let currentRotatingImages = []; let currentRotationIndex = -1; -export function setBackdrops(items, imageOptions, enableImageRotation, isEnabled = false) { +export function setBackdrops(items, imageOptions, isEnabled = false) { if (isEnabled || enabled()) { const images = getImageUrls(items, imageOptions); if (images.length) { - startRotation(images, enableImageRotation); + setBackdropImages(images); } else { clearBackdrop(); } } } -function startRotation(images, enableImageRotation) { +export function setBackdropImages(images) { if (isEqual(images, currentRotatingImages)) { return; } @@ -235,7 +235,7 @@ function startRotation(images, enableImageRotation) { currentRotatingImages = images; currentRotationIndex = -1; - if (images.length > 1 && enableImageRotation !== false && enableRotation()) { + if (images.length > 1 && enableRotation()) { rotationInterval = setInterval(onRotationInterval, 24000); } diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 1f7da1655..ce408991f 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -12,6 +12,7 @@ import browser from 'scripts/browser'; import datetime from 'scripts/datetime'; import dom from 'scripts/dom'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { getBackdropShape, getPortraitShape, getSquareShape } from 'utils/card'; import { getItemTypeIcon, getLibraryIcon } from 'utils/image'; @@ -22,7 +23,6 @@ import itemHelper from '../itemHelper'; import layoutManager from '../layoutManager'; import { playbackManager } from '../playback/playbackmanager'; import { appRouter } from '../router/appRouter'; -import ServerConnections from '../ServerConnections'; import itemShortcuts from '../shortcuts'; import 'elements/emby-button/paper-icon-button-light'; @@ -1333,6 +1333,7 @@ function updateUserData(card, userData) { innerCardFooter.appendChild(itemProgressBar); } + card.setAttribute('data-positionticks', userData.PlaybackPositionTicks); itemProgressBar.innerHTML = progressHtml; } else { itemProgressBar = card.querySelector('.itemProgressBar'); diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index 21535adc8..f8fa94e6a 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -5,11 +5,12 @@ */ import escapeHtml from 'escape-html'; + +import { ServerConnections } from 'lib/jellyfin-apiclient'; import datetime from '../../scripts/datetime'; import imageLoader from '../images/imageLoader'; import layoutManager from '../layoutManager'; import browser from '../../scripts/browser'; -import ServerConnections from '../ServerConnections'; const enableFocusTransform = !browser.slow && !browser.edge; diff --git a/src/components/channelMapper/channelMapper.js b/src/components/channelMapper/channelMapper.js index 762ca0b75..91caf81c9 100644 --- a/src/components/channelMapper/channelMapper.js +++ b/src/components/channelMapper/channelMapper.js @@ -3,6 +3,7 @@ import dom from '../../scripts/dom'; import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import actionsheet from '../actionSheet/actionSheet'; import '../../elements/emby-input/emby-input'; import '../../elements/emby-button/paper-icon-button-light'; @@ -10,7 +11,6 @@ import '../../elements/emby-button/emby-button'; import '../listview/listview.scss'; import 'material-design-icons-iconfont'; import '../formdialog.scss'; -import ServerConnections from '../ServerConnections'; export default class ChannelMapper { constructor(options) { diff --git a/src/components/collectionEditor/collectionEditor.js b/src/components/collectionEditor/collectionEditor.js index 703c60df7..a8981f2b3 100644 --- a/src/components/collectionEditor/collectionEditor.js +++ b/src/components/collectionEditor/collectionEditor.js @@ -5,6 +5,7 @@ import loading from '../loading/loading'; import layoutManager from '../layoutManager'; import { appRouter } from '../router/appRouter'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-checkbox/emby-checkbox'; @@ -13,7 +14,6 @@ import '../../elements/emby-select/emby-select'; import 'material-design-icons-iconfont'; import '../formdialog.scss'; import '../../styles/flexstyles.scss'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; let currentServerId; diff --git a/src/components/confirm/confirm.js b/src/components/confirm/confirm.js deleted file mode 100644 index ed3562eaf..000000000 --- a/src/components/confirm/confirm.js +++ /dev/null @@ -1,74 +0,0 @@ -import { appRouter } from '../router/appRouter'; -import browser from '../../scripts/browser'; -import dialog from '../dialog/dialog'; -import globalize from '../../lib/globalize'; - -function useNativeConfirm() { - // webOS seems to block modals - // Tizen 2.x seems to block modals - return !browser.web0s - && !(browser.tizenVersion && (browser.tizenVersion < 3 || browser.tizenVersion >= 8)) - && browser.tv - && window.confirm; -} - -async function nativeConfirm(options) { - if (typeof options === 'string') { - options = { - title: '', - text: options - }; - } - - const text = (options.text || '').replaceAll('
', '\n'); - await appRouter.ready(); - const result = window.confirm(text); - - if (result) { - return Promise.resolve(); - } else { - return Promise.reject(); - } -} - -async function customConfirm(text, title) { - let options; - if (typeof text === 'string') { - options = { - title: title, - text: text - }; - } else { - options = text; - } - - const 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; - - await appRouter.ready(); - - return dialog.show(options).then(result => { - if (result === 'ok') { - return Promise.resolve(); - } - - return Promise.reject(); - }); -} - -const confirm = useNativeConfirm() ? nativeConfirm : customConfirm; - -export default confirm; diff --git a/src/components/confirm/confirm.ts b/src/components/confirm/confirm.ts new file mode 100644 index 000000000..3b40a8f2b --- /dev/null +++ b/src/components/confirm/confirm.ts @@ -0,0 +1,85 @@ +import dialog from 'components/dialog/dialog'; +import { appRouter } from 'components/router/appRouter'; +import globalize from 'lib/globalize'; +import browser from 'scripts/browser'; + +interface OptionItem { + id: string, + name: string, + type: 'cancel' | 'delete' | 'submit' +} + +interface ConfirmOptions { + title?: string, + text: string + cancelText?: string, + confirmText?: string, + primary?: string + buttons?: OptionItem[] +} + +function shouldUseNativeConfirm() { + // webOS seems to block modals + // Tizen 2.x seems to block modals + return !browser.web0s + && !(browser.tizenVersion && (browser.tizenVersion < 3 || browser.tizenVersion >= 8)) + && browser.tv + && !!window.confirm; +} + +async function nativeConfirm(options: string | ConfirmOptions) { + if (typeof options === 'string') { + options = { + text: options + } as ConfirmOptions; + } + + const text = (options.text || '').replace(//g, '\n'); + await appRouter.ready(); + const result = window.confirm(text); + + if (result) { + return Promise.resolve(); + } else { + return Promise.reject(new Error('Confirm dialog rejected')); + } +} + +async function customConfirm(options: string | ConfirmOptions, title: string = '') { + if (typeof options === 'string') { + options = { + title, + text: options + }; + } + + const items: OptionItem[] = []; + + 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; + + await appRouter.ready(); + + return dialog.show(options).then(result => { + if (result === 'ok') { + return Promise.resolve(); + } + + return Promise.reject(new Error('Confirm dialog rejected')); + }); +} + +const confirm = shouldUseNativeConfirm() ? nativeConfirm : customConfirm; + +export default confirm; diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index 56f338ca6..e8cc85609 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -3,6 +3,7 @@ import browser from '../../scripts/browser'; import layoutManager from '../layoutManager'; import inputManager from '../../scripts/inputManager'; import { toBoolean } from '../../utils/string.ts'; +import { hide } from '../loading/loading.ts'; import dom from '../../scripts/dom'; import { history } from 'RootAppRouter'; @@ -99,6 +100,8 @@ function DialogHashHandler(dlg, hash, resolve) { } removeBackdrop(dlg); + hide(); + dlg.classList.remove('opened'); if (removeScrollLockOnClose) { diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index a652e6ae4..133c66380 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -212,7 +212,9 @@ function initEditor(content, options, fileOptions) { let networkSharePath = this.querySelector('#txtNetworkPath'); networkSharePath = networkSharePath ? networkSharePath.value : null; const path = this.querySelector('#txtDirectoryPickerPath').value; - validatePath(path, options.validateWriteable, ApiClient).then(options.callback(path, networkSharePath)); + validatePath(path, options.validateWriteable, ApiClient).then( + options.callback(path, networkSharePath) + ).catch(() => { /* no-op */ }); } e.preventDefault(); e.stopPropagation(); diff --git a/src/components/displaySettings/displaySettings.js b/src/components/displaySettings/displaySettings.js index 354ef54d0..7ca0e11b6 100644 --- a/src/components/displaySettings/displaySettings.js +++ b/src/components/displaySettings/displaySettings.js @@ -1,4 +1,6 @@ import escapeHtml from 'escape-html'; + +import { AppFeature } from 'constants/appFeature'; import browser from '../../scripts/browser'; import layoutManager from '../layoutManager'; import { pluginManager } from '../pluginManager'; @@ -6,6 +8,7 @@ import { appHost } from '../apphost'; import focusManager from '../focusManager'; import datetime from '../../scripts/datetime'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import loading from '../loading/loading'; import skinManager from '../../scripts/themeManager'; import { PluginType } from '../../types/plugin.ts'; @@ -14,7 +17,6 @@ import '../../elements/emby-select/emby-select'; import '../../elements/emby-checkbox/emby-checkbox'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-textarea/emby-textarea'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import template from './displaySettings.template.html'; @@ -68,19 +70,19 @@ function showOrHideMissingEpisodesField(context) { } function loadForm(context, user, userSettings) { - if (appHost.supports('displaylanguage')) { + if (appHost.supports(AppFeature.DisplayLanguage)) { context.querySelector('.languageSection').classList.remove('hide'); } else { context.querySelector('.languageSection').classList.add('hide'); } - if (appHost.supports('displaymode')) { + if (appHost.supports(AppFeature.DisplayMode)) { context.querySelector('.fldDisplayMode').classList.remove('hide'); } else { context.querySelector('.fldDisplayMode').classList.add('hide'); } - if (appHost.supports('externallinks')) { + if (appHost.supports(AppFeature.ExternalLinks)) { context.querySelector('.learnHowToContributeContainer').classList.remove('hide'); } else { context.querySelector('.learnHowToContributeContainer').classList.add('hide'); @@ -88,7 +90,7 @@ function loadForm(context, user, userSettings) { context.querySelector('.selectDashboardThemeContainer').classList.toggle('hide', !user.Policy.IsAdministrator); - if (appHost.supports('screensaver')) { + if (appHost.supports(AppFeature.Screensaver)) { context.querySelector('.selectScreensaverContainer').classList.remove('hide'); context.querySelector('.txtBackdropScreensaverIntervalContainer').classList.remove('hide'); context.querySelector('.txtScreensaverTimeContainer').classList.remove('hide'); @@ -143,7 +145,7 @@ function loadForm(context, user, userSettings) { function saveUser(context, user, userSettingsInstance, apiClient) { user.Configuration.DisplayMissingEpisodes = context.querySelector('.chkDisplayMissingEpisodes').checked; - if (appHost.supports('displaylanguage')) { + if (appHost.supports(AppFeature.DisplayLanguage)) { userSettingsInstance.language(context.querySelector('#selectLanguage').value); } diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index e52dcebc9..1e192372f 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -1,12 +1,12 @@ import dom from '../../scripts/dom'; import dialogHelper from '../dialogHelper/dialogHelper'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import union from 'lodash-es/union'; import Events from '../../utils/events.ts'; import '../../elements/emby-checkbox/emby-checkbox'; import '../../elements/emby-collapse/emby-collapse'; import './style.scss'; -import ServerConnections from '../ServerConnections'; import template from './filterdialog.template.html'; import { stopMultiSelect } from '../../components/multiSelect/multiSelect'; diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index 5d7609f9f..a77e7d110 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -5,6 +5,7 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import inputManager from '../../scripts/inputManager'; import layoutManager from '../layoutManager'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import * as userSettings from '../../scripts/settings/userSettings'; import '../../elements/emby-checkbox/emby-checkbox'; import '../../elements/emby-input/emby-input'; @@ -14,7 +15,6 @@ import '../../elements/emby-select/emby-select'; import 'material-design-icons-iconfont'; import '../formdialog.scss'; import '../../styles/flexstyles.scss'; -import ServerConnections from '../ServerConnections'; import template from './filtermenu.template.html'; function onSubmit(e) { diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js index 9167dc3ec..1756280ed 100644 --- a/src/components/groupedcards.js +++ b/src/components/groupedcards.js @@ -1,7 +1,7 @@ +import { ServerConnections } from 'lib/jellyfin-apiclient'; import dom from '../scripts/dom'; import { appRouter } from './router/appRouter'; import Dashboard from '../utils/dashboard'; -import ServerConnections from './ServerConnections'; function onGroupedCardClick(e, card) { const itemId = card.getAttribute('data-id'); diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index 0b72fc023..20795ea2d 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -2,6 +2,7 @@ import escapeHtml from 'escape-html'; import inputManager from '../../scripts/inputManager'; import browser from '../../scripts/browser'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Events from '../../utils/events.ts'; import scrollHelper from '../../scripts/scrollHelper'; import serverNotifications from '../../scripts/serverNotifications'; @@ -25,7 +26,6 @@ import '../../elements/emby-tabs/emby-tabs'; import '../../elements/emby-scroller/emby-scroller'; import '../../styles/flexstyles.scss'; import 'webcomponents.js/webcomponents-lite'; -import ServerConnections from '../ServerConnections'; import template from './tvguide.template.html'; function showViewSettings(instance) { diff --git a/src/components/homeScreenSettings/homeScreenSettings.js b/src/components/homeScreenSettings/homeScreenSettings.js index 74b5c82ce..d330c8f22 100644 --- a/src/components/homeScreenSettings/homeScreenSettings.js +++ b/src/components/homeScreenSettings/homeScreenSettings.js @@ -2,6 +2,7 @@ import escapeHtml from 'escape-html'; import { getUserViewsQuery } from 'hooks/useUserViews'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { toApi } from 'utils/jellyfin-apiclient/compat'; import { queryClient } from 'utils/query/queryClient'; @@ -15,7 +16,6 @@ import dom from '../../scripts/dom'; import '../listview/listview.scss'; import '../../elements/emby-select/emby-select'; import '../../elements/emby-checkbox/emby-checkbox'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import template from './homeScreenSettings.template.html'; import { LibraryTab } from '../../types/libraryTab.ts'; diff --git a/src/components/homesections/sections/activeRecordings.ts b/src/components/homesections/sections/activeRecordings.ts index 45989f298..72ab3dfe6 100644 --- a/src/components/homesections/sections/activeRecordings.ts +++ b/src/components/homesections/sections/activeRecordings.ts @@ -1,9 +1,9 @@ import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; import type { ApiClient } from 'jellyfin-apiclient'; -import ServerConnections from 'components/ServerConnections'; import cardBuilder from 'components/cardbuilder/cardBuilder'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import type { SectionContainerElement, SectionOptions } from './section'; diff --git a/src/components/homesections/sections/liveTv.ts b/src/components/homesections/sections/liveTv.ts index e09f812fd..4b8b17cbd 100644 --- a/src/components/homesections/sections/liveTv.ts +++ b/src/components/homesections/sections/liveTv.ts @@ -5,8 +5,8 @@ import type { ApiClient } from 'jellyfin-apiclient'; import { appRouter } from 'components/router/appRouter'; import cardBuilder from 'components/cardbuilder/cardBuilder'; import layoutManager from 'components/layoutManager'; -import ServerConnections from 'components/ServerConnections'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { getBackdropShape } from 'utils/card'; import type { SectionContainerElement, SectionOptions } from './section'; diff --git a/src/components/homesections/sections/nextUp.ts b/src/components/homesections/sections/nextUp.ts index fbf1443e2..539472bbf 100644 --- a/src/components/homesections/sections/nextUp.ts +++ b/src/components/homesections/sections/nextUp.ts @@ -4,8 +4,8 @@ import type { ApiClient } from 'jellyfin-apiclient'; import cardBuilder from 'components/cardbuilder/cardBuilder'; import layoutManager from 'components/layoutManager'; import { appRouter } from 'components/router/appRouter'; -import ServerConnections from 'components/ServerConnections'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import type { UserSettings } from 'scripts/settings/userSettings'; import { getBackdropShape } from 'utils/card'; diff --git a/src/components/homesections/sections/recentlyAdded.ts b/src/components/homesections/sections/recentlyAdded.ts index 27d16d161..5f35ba303 100644 --- a/src/components/homesections/sections/recentlyAdded.ts +++ b/src/components/homesections/sections/recentlyAdded.ts @@ -5,11 +5,11 @@ import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collec import escapeHtml from 'escape-html'; import type { ApiClient } from 'jellyfin-apiclient'; +import cardBuilder from 'components/cardbuilder/cardBuilder'; import layoutManager from 'components/layoutManager'; import { appRouter } from 'components/router/appRouter'; import globalize from 'lib/globalize'; -import ServerConnections from 'components/ServerConnections'; -import cardBuilder from 'components/cardbuilder/cardBuilder'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { getBackdropShape, getPortraitShape, getSquareShape } from 'utils/card'; import type { SectionContainerElement, SectionOptions } from './section'; diff --git a/src/components/homesections/sections/resume.ts b/src/components/homesections/sections/resume.ts index 249cad2d0..bb9215b2b 100644 --- a/src/components/homesections/sections/resume.ts +++ b/src/components/homesections/sections/resume.ts @@ -2,9 +2,9 @@ import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base import type { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; import type { ApiClient } from 'jellyfin-apiclient'; -import ServerConnections from 'components/ServerConnections'; import cardBuilder from 'components/cardbuilder/cardBuilder'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import type { UserSettings } from 'scripts/settings/userSettings'; import { getBackdropShape, getPortraitShape } from 'utils/card'; diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index f876568ce..b2453c358 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -48,6 +48,12 @@ export function enableHlsJsPlayer(runTimeTicks, mediaType) { return false; } + // Native HLS support in WebOS only plays stereo sound. hls.js works better, but works only on WebOS 4 or newer. + // Using hls.js also seems to fix fast forward issues that native HLS has. + if (browser.web0sVersion >= 4) { + return true; + } + // The native players on these devices support seeking live streams, no need to use hls.js here if (browser.tizen || browser.web0s) { return false; diff --git a/src/components/imageDownloader/imageDownloader.js b/src/components/imageDownloader/imageDownloader.js index cd05ec57e..77d9f1706 100644 --- a/src/components/imageDownloader/imageDownloader.js +++ b/src/components/imageDownloader/imageDownloader.js @@ -1,3 +1,4 @@ +import { AppFeature } from 'constants/appFeature'; import dom from '../../scripts/dom'; import loading from '../loading/loading'; import { appHost } from '../apphost'; @@ -7,12 +8,12 @@ import browser from '../../scripts/browser'; import layoutManager from '../layoutManager'; import scrollHelper from '../../scripts/scrollHelper'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import '../../elements/emby-checkbox/emby-checkbox'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-button/emby-button'; import '../formdialog.scss'; import '../cardbuilder/card.scss'; -import ServerConnections from '../ServerConnections'; import template from './imageDownloader.template.html'; const enableFocusTransform = !browser.slow && !browser.edge; @@ -205,7 +206,7 @@ function getRemoteImageHtml(image, imageType) { html += '
'; html += '
'; - if (layoutManager.tv || !appHost.supports('externallinks')) { + if (layoutManager.tv || !appHost.supports(AppFeature.ExternalLinks)) { html += '
'; } else { html += ''; diff --git a/src/components/imageUploader/imageUploader.js b/src/components/imageUploader/imageUploader.js index cc211fde9..1f26dbff3 100644 --- a/src/components/imageUploader/imageUploader.js +++ b/src/components/imageUploader/imageUploader.js @@ -10,11 +10,12 @@ import loading from '../loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; import layoutManager from '../layoutManager'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; + import '../../elements/emby-button/emby-button'; import '../../elements/emby-select/emby-select'; import '../formdialog.scss'; import './style.scss'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import template from './imageUploader.template.html'; diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js index c975cdd7d..28716bfa3 100644 --- a/src/components/imageeditor/imageeditor.js +++ b/src/components/imageeditor/imageeditor.js @@ -1,9 +1,11 @@ +import { AppFeature } from 'constants/appFeature'; import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; import dom from '../../scripts/dom'; import layoutManager from '../layoutManager'; import focusManager from '../focusManager'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import scrollHelper from '../../scripts/scrollHelper'; import imageLoader from '../images/imageLoader'; import browser from '../../scripts/browser'; @@ -13,7 +15,6 @@ import '../formdialog.scss'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import './imageeditor.scss'; -import ServerConnections from '../ServerConnections'; import alert from '../alert'; import confirm from '../confirm/confirm'; import template from './imageeditor.template.html'; @@ -339,7 +340,7 @@ function showActionSheet(context, imageCard) { function initEditor(context, options) { const uploadButtons = context.querySelectorAll('.btnOpenUploadMenu'); - const isFileInputSupported = appHost.supports('fileinput'); + const isFileInputSupported = appHost.supports(AppFeature.FileInput); for (let i = 0, length = uploadButtons.length; i < length; i++) { if (isFileInputSupported) { uploadButtons[i].classList.remove('hide'); diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index adba9ab0e..172e77e5e 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -2,15 +2,16 @@ import browser from '../scripts/browser'; import { copy } from '../scripts/clipboard'; import dom from '../scripts/dom'; import globalize from '../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import actionsheet from './actionSheet/actionSheet'; import { appHost } from './apphost'; import { appRouter } from './router/appRouter'; import itemHelper, { canEditPlaylist } from './itemHelper'; import { playbackManager } from './playback/playbackmanager'; -import ServerConnections from './ServerConnections'; import toast from './toast/toast'; import * as userSettings from '../scripts/settings/userSettings'; import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; +import { AppFeature } from 'constants/appFeature'; function getDeleteLabel(type) { switch (type) { @@ -169,7 +170,7 @@ export async function getCommands(options) { }); } - if (appHost.supports('filedownload')) { + if (appHost.supports(AppFeature.FileDownload)) { // CanDownload should probably be updated to return true for these items? if (user.Policy.EnableContentDownloading && (item.Type === 'Season' || item.Type == 'Series')) { commands.push({ diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js index 2a93c36e7..f21ce6e06 100644 --- a/src/components/itemHelper.js +++ b/src/components/itemHelper.js @@ -6,8 +6,9 @@ import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type' import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api'; import { appHost } from './apphost'; +import { AppFeature } from 'constants/appFeature'; import globalize from 'lib/globalize'; -import ServerConnections from './ServerConnections'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { toApi } from 'utils/jellyfin-apiclient/compat'; export function getDisplayName(item, options = {}) { @@ -238,7 +239,7 @@ export function canShare (item, user) { if (isLocalItem(item)) { return false; } - return user.Policy.EnablePublicSharing && appHost.supports('sharing'); + return user.Policy.EnablePublicSharing && appHost.supports(AppFeature.Sharing); } export function enableDateAddedDisplay (item) { diff --git a/src/components/itemMediaInfo/itemMediaInfo.js b/src/components/itemMediaInfo/itemMediaInfo.js index f77395abf..7ebe7464a 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.js +++ b/src/components/itemMediaInfo/itemMediaInfo.js @@ -5,22 +5,27 @@ */ import escapeHtml from 'escape-html'; -import dialogHelper from '../dialogHelper/dialogHelper'; -import layoutManager from '../layoutManager'; -import toast from '../toast/toast'; -import { copy } from '../../scripts/clipboard'; -import dom from '../../scripts/dom'; -import globalize from '../../lib/globalize'; -import itemHelper from '../../components/itemHelper'; -import loading from '../loading/loading'; -import '../../elements/emby-select/emby-select'; -import '../listview/listview.scss'; -import '../../elements/emby-button/emby-button'; -import '../../elements/emby-button/paper-icon-button-light'; -import '../formdialog.scss'; + +import dialogHelper from 'components/dialogHelper/dialogHelper'; +import itemHelper from 'components/itemHelper'; +import layoutManager from 'components/layoutManager'; +import loading from 'components/loading/loading'; +import toast from 'components/toast/toast'; +import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import { copy } from 'scripts/clipboard'; +import dom from 'scripts/dom'; +import { getReadableSize } from 'utils/file'; + +import 'components/formdialog.scss'; +import 'components/listview/listview.scss'; +import 'elements/emby-button/emby-button'; +import 'elements/emby-button/paper-icon-button-light'; +import 'elements/emby-select/emby-select'; import 'material-design-icons-iconfont'; -import '../../styles/flexstyles.scss'; -import ServerConnections from '../ServerConnections'; + +import 'styles/flexstyles.scss'; + import template from './itemMediaInfo.template.html'; // Do not add extra spaces between tags - they will be copied into the result @@ -68,7 +73,7 @@ function getMediaSourceHtml(user, item, version) { html += `${createAttribute(globalize.translate('MediaInfoPath'), version.Path, true)}
`; } if (version.Size) { - const size = `${(version.Size / (1024 * 1024)).toFixed(0)} MB`; + const size = getReadableSize(version.Size); html += `${createAttribute(globalize.translate('MediaInfoSize'), size)}
`; } version.MediaStreams.sort(itemHelper.sortTracks); diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index 506c1c284..b374e47da 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -8,6 +8,7 @@ import escapeHtml from 'escape-html'; import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import scrollHelper from '../../scripts/scrollHelper'; import layoutManager from '../layoutManager'; import focusManager from '../focusManager'; @@ -18,7 +19,6 @@ import '../../elements/emby-button/paper-icon-button-light'; import '../formdialog.scss'; import 'material-design-icons-iconfont'; import '../cardbuilder/card.scss'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import template from './itemidentifier.template.html'; import datetime from '../../scripts/datetime'; diff --git a/src/components/lazyLoader/lazyLoaderIntersectionObserver.js b/src/components/lazyLoader/lazyLoaderIntersectionObserver.js index 81378710f..8a3835d89 100644 --- a/src/components/lazyLoader/lazyLoaderIntersectionObserver.js +++ b/src/components/lazyLoader/lazyLoaderIntersectionObserver.js @@ -7,10 +7,10 @@ export class LazyLoader { createObserver() { const callback = this.options.callback; - const observer = new IntersectionObserver( - (entries) => { + const newObserver = new IntersectionObserver( + (entries, observer) => { entries.forEach(entry => { - callback(entry); + callback(entry, observer); }); }, { @@ -18,7 +18,7 @@ export class LazyLoader { threshold: 0 }); - this.observer = observer; + this.observer = newObserver; } addElements(elements) { diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js index 916b9a44a..5b6c54c2b 100644 --- a/src/components/listview/listview.js +++ b/src/components/listview/listview.js @@ -10,12 +10,12 @@ import mediaInfo from '../mediainfo/mediainfo'; import indicators from '../indicators/indicators'; import layoutManager from '../layoutManager'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import datetime from '../../scripts/datetime'; import cardBuilder from '../cardbuilder/cardBuilder'; import './listview.scss'; import '../../elements/emby-ratingbutton/emby-ratingbutton'; import '../../elements/emby-playstatebutton/emby-playstatebutton'; -import ServerConnections from '../ServerConnections'; import { getDefaultBackgroundClass } from '../cardbuilder/cardBuilderUtils'; import markdownIt from 'markdown-it'; import DOMPurify from 'dompurify'; diff --git a/src/components/lyricseditor/lyricseditor.js b/src/components/lyricseditor/lyricseditor.js index f2e37175f..bb393ea48 100644 --- a/src/components/lyricseditor/lyricseditor.js +++ b/src/components/lyricseditor/lyricseditor.js @@ -5,6 +5,7 @@ import { toApi } from 'utils/jellyfin-apiclient/compat'; import dialogHelper from '../dialogHelper/dialogHelper'; import layoutManager from '../layoutManager'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import loading from '../loading/loading'; import focusManager from '../focusManager'; import dom from '../../scripts/dom'; @@ -16,7 +17,6 @@ import 'material-design-icons-iconfont'; import './lyricseditor.scss'; import '../../elements/emby-button/emby-button'; import '../../styles/flexstyles.scss'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import template from './lyricseditor.template.html'; import templatePreview from './lyricspreview.template.html'; diff --git a/src/components/lyricsuploader/lyricsuploader.js b/src/components/lyricsuploader/lyricsuploader.js index 6d6030a7b..6755e4fc0 100644 --- a/src/components/lyricsuploader/lyricsuploader.js +++ b/src/components/lyricsuploader/lyricsuploader.js @@ -3,12 +3,12 @@ import escapeHtml from 'escape-html'; import { getLyricsApi } from '@jellyfin/sdk/lib/utils/api/lyrics-api'; import { toApi } from 'utils/jellyfin-apiclient/compat'; import dialogHelper from '../../components/dialogHelper/dialogHelper'; -import ServerConnections from '../ServerConnections'; import dom from '../../scripts/dom'; import loading from '../../components/loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; import layoutManager from '../layoutManager'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import template from './lyricsuploader.template.html'; import toast from '../toast/toast'; import '../../elements/emby-button/emby-button'; diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index 4dea1b00d..6dc155a84 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -6,6 +6,8 @@ import datetime from '../../scripts/datetime'; import loading from '../loading/loading'; import focusManager from '../focusManager'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; + import '../../elements/emby-checkbox/emby-checkbox'; import '../../elements/emby-input/emby-input'; import '../../elements/emby-select/emby-select'; @@ -17,7 +19,6 @@ import '../formdialog.scss'; import '../../styles/clearbutton.scss'; import '../../styles/flexstyles.scss'; import './style.scss'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import { appRouter } from '../router/appRouter'; import template from './metadataEditor.template.html'; diff --git a/src/components/metadataEditor/personEditor.js b/src/components/metadataEditor/personEditor.js index ff0ea5845..5120a2b8c 100644 --- a/src/components/metadataEditor/personEditor.js +++ b/src/components/metadataEditor/personEditor.js @@ -67,16 +67,15 @@ function show(person) { if (type === PersonKind.Unknown) { continue; } - selectPersonTypeOptions += ``; + const selected = person.Type === type ? 'selected' : ''; + selectPersonTypeOptions += ``; } dlg.querySelector('.selectPersonType').innerHTML = globalize.translateHtml(selectPersonTypeOptions); dlg.querySelector('.selectPersonType').addEventListener('change', function () { - if (this.value === 'Actor') { - dlg.querySelector('.fldRole').classList.remove('hide'); - } else { - dlg.querySelector('.fldRole').classList.add('hide'); - } + dlg.querySelector('.fldRole').classList.toggle( + 'hide', + ![ PersonKind.Actor, PersonKind.GuestStar ].includes(this.value)); }); dlg.querySelector('.btnCancel').addEventListener('click', function () { diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js index efcb17265..d6ad634cf 100644 --- a/src/components/multiSelect/multiSelect.js +++ b/src/components/multiSelect/multiSelect.js @@ -1,10 +1,11 @@ +import { AppFeature } from 'constants/appFeature'; import browser from '../../scripts/browser'; import { appHost } from '../apphost'; import loading from '../loading/loading'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import dom from '../../scripts/dom'; import './multiSelect.scss'; -import ServerConnections from '../ServerConnections'; import alert from '../alert'; import confirm from '../confirm/confirm'; import itemHelper from '../itemHelper'; @@ -198,7 +199,7 @@ function showMenuForSelectedItems(e) { }); } - if (user.Policy.EnableContentDownloading && appHost.supports('filedownload')) { + if (user.Policy.EnableContentDownloading && appHost.supports(AppFeature.FileDownload)) { // Disabled because there is no callback for this item } diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index 9c8982b51..9edd0ec18 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -2,8 +2,8 @@ import serverNotifications from '../../scripts/serverNotifications'; import { playbackManager } from '../playback/playbackmanager'; import Events from '../../utils/events.ts'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { getItems } from '../../utils/jellyfin-apiclient/getItems.ts'; -import ServerConnections from '../../components/ServerConnections'; import NotificationIcon from './notificationicon.png'; diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index c16b167d0..9dd5d0952 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -1,6 +1,8 @@ import { getImageUrl } from 'apps/stable/features/playback/utils/image'; import { getItemTextLines } from 'apps/stable/features/playback/utils/itemText'; import { appRouter, isLyricsPage } from 'components/router/appRouter'; +import { AppFeature } from 'constants/appFeature'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import datetime from '../../scripts/datetime'; import Events from '../../utils/events.ts'; @@ -14,7 +16,6 @@ import globalize from 'lib/globalize'; import itemContextMenu from '../itemContextMenu'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-ratingbutton/emby-ratingbutton'; -import ServerConnections from '../ServerConnections'; import appFooter from '../appFooter/appFooter'; import itemShortcuts from '../shortcuts'; import './nowPlayingBar.scss'; @@ -244,7 +245,7 @@ function bindEvents(elem) { toggleRepeatButtonIcon = toggleRepeatButton.querySelector('.material-icons'); - volumeSliderContainer.classList.toggle('hide', appHost.supports('physicalvolumecontrol')); + volumeSliderContainer.classList.toggle('hide', appHost.supports(AppFeature.PhysicalVolumeControl)); volumeSlider.addEventListener('input', (e) => { if (currentPlayer) { @@ -441,7 +442,7 @@ function updatePlayerVolumeState(isMuted, volumeLevel) { showVolumeSlider = false; } - if (currentPlayer.isLocalPlayer && appHost.supports('physicalvolumecontrol')) { + if (currentPlayer.isLocalPlayer && appHost.supports(AppFeature.PhysicalVolumeControl)) { showMuteButton = false; showVolumeSlider = false; } diff --git a/src/components/playback/displayMirrorManager.ts b/src/components/playback/displayMirrorManager.ts index 00856421f..63d7059f8 100644 --- a/src/components/playback/displayMirrorManager.ts +++ b/src/components/playback/displayMirrorManager.ts @@ -1,5 +1,5 @@ -import ServerConnections from 'components/ServerConnections'; import { getItemQuery } from 'hooks/useItem'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { toApi } from 'utils/jellyfin-apiclient/compat'; import { queryClient } from 'utils/query/queryClient'; diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 1b7f91ef6..2aad90186 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1,3 +1,4 @@ +import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind.js'; import { PlaybackErrorCode } from '@jellyfin/sdk/lib/generated-client/models/playback-error-code.js'; import { getMediaInfoApi } from '@jellyfin/sdk/lib/utils/api/media-info-api'; import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type'; @@ -14,7 +15,6 @@ import * as userSettings from '../../scripts/settings/userSettings'; import globalize from '../../lib/globalize'; import loading from '../loading/loading'; import { appHost } from '../apphost'; -import ServerConnections from '../ServerConnections'; import alert from '../alert'; import { PluginType } from '../../types/plugin.ts'; import { includesAny } from '../../utils/container.ts'; @@ -24,10 +24,11 @@ import { getItemBackdropImageUrl } from '../../utils/jellyfin-apiclient/backdrop import { PlayerEvent } from 'apps/stable/features/playback/constants/playerEvent'; import { bindMediaSegmentManager } from 'apps/stable/features/playback/utils/mediaSegmentManager'; import { bindMediaSessionSubscriber } from 'apps/stable/features/playback/utils/mediaSessionSubscriber'; +import { AppFeature } from 'constants/appFeature'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { MediaError } from 'types/mediaError'; import { getMediaError } from 'utils/mediaError'; import { toApi } from 'utils/jellyfin-apiclient/compat'; -import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind.js'; import { bindSkipSegment } from './skipsegment.ts'; const UNLIMITED_ITEMS = -1; @@ -41,7 +42,7 @@ function enableLocalPlaylistManagement(player) { } function supportsPhysicalVolumeControl(player) { - return player.isLocalPlayer && appHost.supports('physicalvolumecontrol'); + return player.isLocalPlayer && appHost.supports(AppFeature.PhysicalVolumeControl); } function bindToFullscreenChange(player) { @@ -317,7 +318,7 @@ function getAudioStreamUrl(item, transcodingProfile, directPlayContainers, apiCl PlaySessionId: startingPlaySession, StartTimeTicks: startPosition || 0, EnableRedirection: true, - EnableRemoteMedia: appHost.supports('remoteaudio'), + EnableRemoteMedia: appHost.supports(AppFeature.RemoteAudio), EnableAudioVbrEncoding: transcodingProfile.EnableAudioVbrEncoding }); } @@ -598,7 +599,7 @@ function supportsDirectPlay(apiClient, item, mediaSource) { const isFolderRip = mediaSource.VideoType === 'BluRay' || mediaSource.VideoType === 'Dvd' || mediaSource.VideoType === 'HdDvd'; if (mediaSource.SupportsDirectPlay || isFolderRip) { - if (mediaSource.IsRemote && !appHost.supports('remotevideo')) { + if (mediaSource.IsRemote && !appHost.supports(AppFeature.RemoteVideo)) { return Promise.resolve(false); } @@ -1842,7 +1843,7 @@ export class PlaybackManager { ArtistIds: firstItem.Id, Filters: 'IsNotFolder', Recursive: true, - SortBy: options.shuffle ? 'Random' : 'SortName', + SortBy: options.shuffle ? 'Random' : 'Album,ParentIndexNumber,IndexNumber,SortName', MediaTypes: 'Audio' }, queryOptions)); case 'PhotoAlbum': @@ -1873,6 +1874,14 @@ export class PlaybackManager { SortBy: options.shuffle ? 'Random' : 'SortName', MediaTypes: 'Video' }, queryOptions)); + case 'Studio': + return getItemsForPlayback(serverId, mergePlaybackQueries({ + StudioIds: firstItem.Id, + Filters: 'IsNotFolder', + Recursive: true, + SortBy: options.shuffle ? 'Random' : 'SortName', + MediaTypes: 'Video' + }, queryOptions)); case 'Series': case 'Season': return getSeriesOrSeasonPlaybackPromise(firstItem, options, items); @@ -1923,7 +1932,11 @@ export class PlaybackManager { if (options.shuffle) { sortBy = 'Random'; } else if (firstItem.Type !== 'BoxSet') { - sortBy = 'SortName'; + if (firstItem.CollectionType === 'music' || firstItem.MediaType === 'Audio') { + sortBy = 'Album,ParentIndexNumber,IndexNumber,SortName'; + } else { + sortBy = 'SortName'; + } } return getItemsForPlayback(serverId, mergePlaybackQueries({ @@ -3698,7 +3711,7 @@ export class PlaybackManager { return streamInfo ? streamInfo.playbackStartTimeTicks : null; }; - if (appHost.supports('remotecontrol')) { + if (appHost.supports(AppFeature.RemoteControl)) { import('../../scripts/serverNotifications').then(({ default: serverNotifications }) => { Events.on(serverNotifications, 'ServerShuttingDown', self.setDefaultPlayerActive.bind(self)); Events.on(serverNotifications, 'ServerRestarting', self.setDefaultPlayerActive.bind(self)); @@ -4069,7 +4082,7 @@ export class PlaybackManager { 'PlayTrailers' ]; - if (appHost.supports('fullscreenchange')) { + if (appHost.supports(AppFeature.Fullscreen)) { list.push('ToggleFullscreen'); } diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index 36de970a8..9aedf8217 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -1,3 +1,4 @@ +import { AppFeature } from 'constants/appFeature'; import Events from '../../utils/events.ts'; import browser from '../../scripts/browser'; import loading from '../loading/loading'; @@ -96,7 +97,7 @@ export function show(button) { // Unfortunately we can't allow the url to change or chromecast will throw a security error // Might be able to solve this in the future by moving the dialogs to hashbangs - if (!(!browser.chrome && !browser.edgeChromium || appHost.supports('castmenuhashchange'))) { + if (!(!browser.chrome && !browser.edgeChromium || appHost.supports(AppFeature.CastMenuHashChange))) { menuOptions.enableHistory = false; } diff --git a/src/components/playback/playersettingsmenu.js b/src/components/playback/playersettingsmenu.js index dc92de54d..5b0aca301 100644 --- a/src/components/playback/playersettingsmenu.js +++ b/src/components/playback/playersettingsmenu.js @@ -1,8 +1,8 @@ import actionsheet from '../actionSheet/actionSheet'; import { playbackManager } from '../playback/playbackmanager'; -import globalize from '../../lib/globalize'; +import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import qualityoptions from '../qualityOptions'; -import ServerConnections from '../ServerConnections'; function showQualityMenu(player, btn) { const videoStream = playbackManager.currentMediaSource(player).MediaStreams.filter(function (stream) { diff --git a/src/components/playback/skipbutton.scss b/src/components/playback/skipbutton.scss index 63eb13b9c..86540c684 100644 --- a/src/components/playback/skipbutton.scss +++ b/src/components/playback/skipbutton.scss @@ -2,7 +2,7 @@ position: fixed; left: 0; right: 0; - bottom: 18%; + bottom: 8rem; pointer-events: none; z-index: 10000; } @@ -11,26 +11,21 @@ display: flex; align-items: center; margin-left: auto; - margin-right: 16%; + margin-right: 6rem; + z-index: 10000; padding: 12px 20px; - color: black; + background-color: #303030; + color: rgba(255, 255, 255, 0.87); border: none; - border-radius: 100px; + border-radius: 0.2em; font-weight: bold; font-size: 1.2em; transition: opacity 200ms ease-out; gap: 3px; - box-shadow: 7px 6px 15px -14px rgba(0, 0, 0, 0.65); cursor: pointer; pointer-events: auto; } -@media (orientation: landscape) and (max-height: 500px) { - .skip-button { - bottom: 27%; - } -} - .no-transition { transition: none; } diff --git a/src/components/playbackSettings/playbackSettings.js b/src/components/playbackSettings/playbackSettings.js index f15627a3e..a98b3ab3f 100644 --- a/src/components/playbackSettings/playbackSettings.js +++ b/src/components/playbackSettings/playbackSettings.js @@ -3,6 +3,8 @@ import escapeHTML from 'escape-html'; import { MediaSegmentAction } from 'apps/stable/features/playback/constants/mediaSegmentAction'; import { getId, getMediaSegmentAction } from 'apps/stable/features/playback/utils/mediaSegmentSettings'; +import { AppFeature } from 'constants/appFeature'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import appSettings from '../../scripts/settings/appSettings'; import { appHost } from '../apphost'; @@ -12,7 +14,6 @@ import qualityoptions from '../qualityOptions'; import globalize from '../../lib/globalize'; import loading from '../loading/loading'; import Events from '../../utils/events.ts'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import template from './playbackSettings.template.html'; @@ -147,7 +148,7 @@ function showHideQualityFields(context, user, apiClient) { context.querySelector('.videoQualitySection').classList.add('hide'); } - if (appHost.supports('multiserver')) { + if (appHost.supports(AppFeature.MultiServer)) { context.querySelector('.fldVideoInNetworkQuality').classList.remove('hide'); context.querySelector('.fldVideoInternetQuality').classList.remove('hide'); @@ -204,7 +205,7 @@ function loadForm(context, user, userSettings, systemInfo, apiClient) { context.querySelector('.chkEpisodeAutoPlay').checked = user.Configuration.EnableNextEpisodeAutoPlay || false; }); - if (appHost.supports('externalplayerintent') && userId === loggedInUserId) { + if (appHost.supports(AppFeature.ExternalPlayerIntent) && userId === loggedInUserId) { context.querySelector('.fldExternalPlayer').classList.remove('hide'); } else { context.querySelector('.fldExternalPlayer').classList.add('hide'); @@ -213,7 +214,7 @@ function loadForm(context, user, userSettings, systemInfo, apiClient) { if (userId === loggedInUserId && (user.Policy.EnableVideoPlaybackTranscoding || user.Policy.EnableAudioPlaybackTranscoding)) { context.querySelector('.qualitySections').classList.remove('hide'); - if (appHost.supports('chromecast') && user.Policy.EnableVideoPlaybackTranscoding) { + if (appHost.supports(AppFeature.Chromecast) && user.Policy.EnableVideoPlaybackTranscoding) { context.querySelector('.fldChromecastQuality').classList.remove('hide'); } else { context.querySelector('.fldChromecastQuality').classList.add('hide'); diff --git a/src/components/playerstats/playerstats.js b/src/components/playerstats/playerstats.js index 663c1932e..804c97e9c 100644 --- a/src/components/playerstats/playerstats.js +++ b/src/components/playerstats/playerstats.js @@ -1,13 +1,17 @@ -import '../../elements/emby-button/paper-icon-button-light'; -import globalize from '../../lib/globalize'; -import Events from '../../utils/events.ts'; +import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import { PluginType } from 'types/plugin'; +import Events from 'utils/events'; +import { getReadableSize } from 'utils/file'; + import layoutManager from '../layoutManager'; import { playbackManager } from '../playback/playbackmanager'; import playMethodHelper from '../playback/playmethodhelper'; import { pluginManager } from '../pluginManager'; -import { PluginType } from '../../types/plugin.ts'; + +import 'elements/emby-button/paper-icon-button-light'; + import './playerstats.scss'; -import ServerConnections from '../ServerConnections'; function init(instance) { const parent = document.createElement('div'); @@ -210,16 +214,6 @@ function getDisplayTranscodeFps(session, player) { return `${transcodeFramerate} fps (${(transcodeFramerate / originalFramerate).toFixed(2)}x)`; } -function getReadableSize(size) { - if (size >= 1073741824) { - return parseFloat((size / 1073741824).toFixed(1)) + ' GiB'; - } else if (size >= 1048576) { - return parseFloat((size / 1048576).toFixed(1)) + ' MiB'; - } else { - return Math.floor(size / 1024) + ' KiB'; - } -} - function getMediaSourceStats(session, player) { const sessionStats = []; diff --git a/src/components/playlisteditor/playlisteditor.ts b/src/components/playlisteditor/playlisteditor.ts index 629790695..c9d9ac5af 100644 --- a/src/components/playlisteditor/playlisteditor.ts +++ b/src/components/playlisteditor/playlisteditor.ts @@ -8,6 +8,7 @@ import escapeHtml from 'escape-html'; import toast from 'components/toast/toast'; import dom from 'scripts/dom'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { currentSettings as userSettings } from 'scripts/settings/userSettings'; import { PluginType } from 'types/plugin'; import { toApi } from 'utils/jellyfin-apiclient/compat'; @@ -19,7 +20,6 @@ import layoutManager from '../layoutManager'; import { playbackManager } from '../playback/playbackmanager'; import { pluginManager } from '../pluginManager'; import { appRouter } from '../router/appRouter'; -import ServerConnections from '../ServerConnections'; import 'elements/emby-button/emby-button'; import 'elements/emby-input/emby-input'; diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index ce42c806d..7f9d57dd1 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -8,8 +8,8 @@ import { appRouter } from './router/appRouter'; import * as inputManager from '../scripts/inputManager'; import toast from '../components/toast/toast'; import confirm from '../components/confirm/confirm'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import * as dashboard from '../utils/dashboard'; -import ServerConnections from '../components/ServerConnections'; // TODO: replace with each plugin version const cacheParam = new Date().getTime(); diff --git a/src/components/recordingcreator/recordingbutton.js b/src/components/recordingcreator/recordingbutton.js index f2d5376ea..90e266f7e 100644 --- a/src/components/recordingcreator/recordingbutton.js +++ b/src/components/recordingcreator/recordingbutton.js @@ -1,9 +1,10 @@ +import { ServerConnections } from 'lib/jellyfin-apiclient'; import dom from '../../scripts/dom'; import recordingHelper from './recordinghelper'; + import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-button/emby-button'; import './recordingfields.scss'; -import ServerConnections from '../ServerConnections'; function onRecordingButtonClick() { const item = this.item; diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js index d69043f60..14a4c6d0d 100644 --- a/src/components/recordingcreator/recordingcreator.js +++ b/src/components/recordingcreator/recordingcreator.js @@ -1,5 +1,6 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import layoutManager from '../layoutManager'; import mediaInfo from '../mediainfo/mediainfo'; import loading from '../loading/loading'; @@ -8,6 +9,7 @@ import datetime from '../../scripts/datetime'; import imageLoader from '../images/imageLoader'; import RecordingFields from './recordingfields'; import Events from '../../utils/events.ts'; + import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-checkbox/emby-checkbox'; @@ -16,7 +18,6 @@ import '../../elements/emby-input/emby-input'; import '../formdialog.scss'; import './recordingcreator.scss'; import 'material-design-icons-iconfont'; -import ServerConnections from '../ServerConnections'; import { playbackManager } from '../playback/playbackmanager'; import template from './recordingcreator.template.html'; diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js index 442fe8663..e35d98024 100644 --- a/src/components/recordingcreator/recordingeditor.js +++ b/src/components/recordingcreator/recordingeditor.js @@ -1,9 +1,11 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import layoutManager from '../layoutManager'; import loading from '../loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; + import '../../styles/scrollstyles.scss'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-collapse/emby-collapse'; @@ -13,7 +15,6 @@ import '../formdialog.scss'; import './recordingcreator.scss'; import 'material-design-icons-iconfont'; import '../../styles/flexstyles.scss'; -import ServerConnections from '../ServerConnections'; import template from './recordingeditor.template.html'; let currentDialog; diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js index 19249218b..a1d3103c8 100644 --- a/src/components/recordingcreator/recordingfields.js +++ b/src/components/recordingcreator/recordingfields.js @@ -1,14 +1,15 @@ import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Events from '../../utils/events.ts'; import serverNotifications from '../../scripts/serverNotifications'; import loading from '../loading/loading'; import dom from '../../scripts/dom'; import recordingHelper from './recordinghelper'; + import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import './recordingfields.scss'; import '../../styles/flexstyles.scss'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import template from './recordingfields.template.html'; diff --git a/src/components/recordingcreator/recordinghelper.js b/src/components/recordingcreator/recordinghelper.js index 3c593a18a..a251590a3 100644 --- a/src/components/recordingcreator/recordinghelper.js +++ b/src/components/recordingcreator/recordinghelper.js @@ -1,6 +1,6 @@ -import globalize from '../../lib/globalize'; +import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import loading from '../loading/loading'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import confirm from '../confirm/confirm'; import dialog from '../dialog/dialog'; diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js index 30c8e3936..6580b03af 100644 --- a/src/components/recordingcreator/seriesrecordingeditor.js +++ b/src/components/recordingcreator/seriesrecordingeditor.js @@ -1,9 +1,11 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import layoutManager from '../layoutManager'; import loading from '../loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; import datetime from '../../scripts/datetime'; + import '../../styles/scrollstyles.scss'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-checkbox/emby-checkbox'; @@ -14,7 +16,6 @@ import '../formdialog.scss'; import './recordingcreator.scss'; import 'material-design-icons-iconfont'; import '../../styles/flexstyles.scss'; -import ServerConnections from '../ServerConnections'; import template from './seriesrecordingeditor.template.html'; let currentDialog; diff --git a/src/components/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js index 65997a31a..721ba36e6 100644 --- a/src/components/refreshdialog/refreshdialog.js +++ b/src/components/refreshdialog/refreshdialog.js @@ -3,6 +3,8 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; import layoutManager from '../layoutManager'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; + import '../../elements/emby-input/emby-input'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; @@ -10,7 +12,6 @@ import '../../elements/emby-checkbox/emby-checkbox'; import '../../elements/emby-select/emby-select'; import 'material-design-icons-iconfont'; import '../formdialog.scss'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; function getEditorHtml() { diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index b4344b5f1..bbef1931b 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -2,6 +2,7 @@ import escapeHtml from 'escape-html'; import { getImageUrl } from 'apps/stable/features/playback/utils/image'; import { getItemTextLines } from 'apps/stable/features/playback/utils/itemText'; +import { AppFeature } from 'constants/appFeature'; import datetime from '../../scripts/datetime'; import { clearBackdrop, setBackdrops } from '../backdrop/backdrop'; @@ -11,9 +12,11 @@ import { playbackManager } from '../playback/playbackmanager'; import Events from '../../utils/events.ts'; import { appHost } from '../apphost'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import layoutManager from '../layoutManager'; import * as userSettings from '../../scripts/settings/userSettings'; import itemContextMenu from '../itemContextMenu'; + import '../cardbuilder/card.scss'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; @@ -21,7 +24,6 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer'; import './remotecontrol.scss'; import '../../elements/emby-ratingbutton/emby-ratingbutton'; import '../../elements/emby-slider/emby-slider'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import { appRouter } from '../router/appRouter'; import { getDefaultBackgroundClass } from '../cardbuilder/cardBuilderUtils'; @@ -370,7 +372,7 @@ export default function () { showVolumeSlider = false; } - if (currentPlayer.isLocalPlayer && appHost.supports('physicalvolumecontrol')) { + if (currentPlayer.isLocalPlayer && appHost.supports(AppFeature.PhysicalVolumeControl)) { showMuteButton = false; showVolumeSlider = false; } diff --git a/src/components/router/appRouter.js b/src/components/router/appRouter.js index 29f3cf4f4..032ddfaf1 100644 --- a/src/components/router/appRouter.js +++ b/src/components/router/appRouter.js @@ -4,12 +4,12 @@ import { setBackdropTransparency } from '../backdrop/backdrop'; import globalize from '../../lib/globalize'; import itemHelper from '../itemHelper'; import loading from '../loading/loading'; -import ServerConnections from '../ServerConnections'; import alert from '../alert'; -import { queryClient } from 'utils/query/queryClient'; import { getItemQuery } from 'hooks/useItem'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { toApi } from 'utils/jellyfin-apiclient/compat'; +import { queryClient } from 'utils/query/queryClient'; import { history } from 'RootAppRouter'; /** Pages of "no return" (when "Go back" should behave differently, probably quitting the application). */ diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index d76fa0c81..1ff18ef23 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -8,9 +8,9 @@ import { playbackManager } from './playback/playbackmanager'; import inputManager from '../scripts/inputManager'; import { appRouter } from './router/appRouter'; import globalize from '../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import dom from '../scripts/dom'; import recordingHelper from './recordingcreator/recordinghelper'; -import ServerConnections from './ServerConnections'; import toast from './toast/toast'; import * as userSettings from '../scripts/settings/userSettings'; import { toApi } from 'utils/jellyfin-apiclient/compat'; diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 522a6f738..04f728c37 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -2,17 +2,19 @@ * Image viewer component * @module components/slideshow/slideshow */ +import { AppFeature } from 'constants/appFeature'; import dialogHelper from '../dialogHelper/dialogHelper'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import inputManager from '../../scripts/inputManager'; import layoutManager from '../layoutManager'; import focusManager from '../focusManager'; import browser from '../../scripts/browser'; import { appHost } from '../apphost'; import dom from '../../scripts/dom'; + import './style.scss'; import 'material-design-icons-iconfont'; import '../../elements/emby-button/paper-icon-button-light'; -import ServerConnections from '../ServerConnections'; import screenfull from 'screenfull'; import { randomInt } from '../../utils/number.ts'; @@ -171,10 +173,10 @@ export default function (options) { if (actionButtonsOnTop) { html += getIcon('play_arrow', 'btnSlideshowPause slideshowButton', true); - if (appHost.supports('filedownload') && slideshowOptions.user?.Policy.EnableContentDownloading) { + if (appHost.supports(AppFeature.FileDownload) && slideshowOptions.user?.Policy.EnableContentDownloading) { html += getIcon('file_download', 'btnDownload slideshowButton', true); } - if (appHost.supports('sharing')) { + if (appHost.supports(AppFeature.Sharing)) { html += getIcon('share', 'btnShare slideshowButton', true); } if (screenfull.isEnabled) { @@ -189,10 +191,10 @@ export default function (options) { html += '
'; html += getIcon('play_arrow', 'btnSlideshowPause slideshowButton', true, true); - if (appHost.supports('filedownload') && slideshowOptions?.user.Policy.EnableContentDownloading) { + if (appHost.supports(AppFeature.FileDownload) && slideshowOptions?.user.Policy.EnableContentDownloading) { html += getIcon('file_download', 'btnDownload slideshowButton', true); } - if (appHost.supports('sharing')) { + if (appHost.supports(AppFeature.Sharing)) { html += getIcon('share', 'btnShare slideshowButton', true); } if (screenfull.isEnabled) { diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 106ef0b56..9a110c206 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -1,12 +1,16 @@ import escapeHtml from 'escape-html'; + +import { AppFeature } from 'constants/appFeature'; import { appHost } from '../apphost'; import dialogHelper from '../dialogHelper/dialogHelper'; import layoutManager from '../layoutManager'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import * as userSettings from '../../scripts/settings/userSettings'; import loading from '../loading/loading'; import focusManager from '../focusManager'; import dom from '../../scripts/dom'; + import '../../elements/emby-select/emby-select'; import '../listview/listview.scss'; import '../../elements/emby-button/paper-icon-button-light'; @@ -15,7 +19,6 @@ import 'material-design-icons-iconfont'; import './subtitleeditor.scss'; import '../../elements/emby-button/emby-button'; import '../../styles/flexstyles.scss'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import confirm from '../confirm/confirm'; import template from './subtitleeditor.template.html'; @@ -439,7 +442,7 @@ function showEditorInternal(itemId, serverId) { } // Don't allow redirection to other websites from the TV layout - if (layoutManager.tv || !appHost.supports('externallinks')) { + if (layoutManager.tv || !appHost.supports(AppFeature.ExternalLinks)) { dlg.querySelector('.btnHelp').remove(); } diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index 5f146056e..cfc0437b7 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -101,13 +101,14 @@ function getTextStyles(settings, preview) { if (!preview) { const pos = parseInt(settings.verticalPosition, 10); const lineHeight = 1.35; // FIXME: It is better to read this value from element - const line = Math.abs(pos * lineHeight); if (pos < 0) { - list.push({ name: 'min-height', value: `${line}em` }); + const margin = Math.abs(pos + 1) * lineHeight; + list.push({ name: 'margin-bottom', value: `${margin}em` }); list.push({ name: 'margin-top', value: '' }); } else { - list.push({ name: 'min-height', value: '' }); - list.push({ name: 'margin-top', value: `${line}em` }); + const margin = pos * lineHeight; + list.push({ name: 'margin-bottom', value: '' }); + list.push({ name: 'margin-top', value: `${margin}em` }); } } diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 0ae3d6e9d..d16662943 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -1,4 +1,6 @@ +import { AppFeature } from 'constants/appFeature'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { appHost } from '../apphost'; import appSettings from '../../scripts/settings/appSettings'; import focusManager from '../focusManager'; @@ -8,6 +10,7 @@ import subtitleAppearanceHelper from './subtitleappearancehelper'; import settingsHelper from '../settingshelper'; import dom from '../../scripts/dom'; import Events from '../../utils/events.ts'; + import '../listview/listview.scss'; import '../../elements/emby-select/emby-select'; import '../../elements/emby-slider/emby-slider'; @@ -15,7 +18,6 @@ import '../../elements/emby-input/emby-input'; import '../../elements/emby-checkbox/emby-checkbox'; import '../../styles/flexstyles.scss'; import './subtitlesettings.scss'; -import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; import template from './subtitlesettings.template.html'; @@ -39,7 +41,7 @@ function getSubtitleAppearanceObject(context) { function loadForm(context, user, userSettings, appearanceSettings, apiClient) { apiClient.getCultures().then(function (allCultures) { - if (appHost.supports('subtitleburnsettings') && user.Policy.EnableVideoPlaybackTranscoding) { + if (appHost.supports(AppFeature.SubtitleBurnIn) && user.Policy.EnableVideoPlaybackTranscoding) { context.querySelector('.fldBurnIn').classList.remove('hide'); } @@ -207,7 +209,7 @@ function embed(options, self) { options.element.querySelector('.btnSave').classList.remove('hide'); } - if (appHost.supports('subtitleappearancesettings')) { + if (appHost.supports(AppFeature.SubtitleAppearance)) { options.element.querySelector('.subtitleAppearanceSection').classList.remove('hide'); self._fullPreview = options.element.querySelector('.subtitleappearance-fullpreview'); diff --git a/src/components/subtitleuploader/subtitleuploader.js b/src/components/subtitleuploader/subtitleuploader.js index dc13ada07..f70726577 100644 --- a/src/components/subtitleuploader/subtitleuploader.js +++ b/src/components/subtitleuploader/subtitleuploader.js @@ -3,14 +3,15 @@ import escapeHtml from 'escape-html'; import { getSubtitleApi } from '@jellyfin/sdk/lib/utils/api/subtitle-api'; import { toApi } from 'utils/jellyfin-apiclient/compat'; import dialogHelper from '../../components/dialogHelper/dialogHelper'; -import ServerConnections from '../ServerConnections'; import dom from '../../scripts/dom'; import loading from '../../components/loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; import layoutManager from '../layoutManager'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import template from './subtitleuploader.template.html'; import toast from '../toast/toast'; + import '../../elements/emby-button/emby-button'; import '../../elements/emby-select/emby-select'; import '../formdialog.scss'; diff --git a/src/components/themeMediaPlayer.js b/src/components/themeMediaPlayer.js index fe25704ce..c8c267532 100644 --- a/src/components/themeMediaPlayer.js +++ b/src/components/themeMediaPlayer.js @@ -3,6 +3,7 @@ import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type' import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; import { getItemQuery } from 'hooks/useItem'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { currentSettings as userSettings } from 'scripts/settings/userSettings'; import { ItemKind } from 'types/base/models/item-kind'; import Events from 'utils/events.ts'; @@ -10,7 +11,6 @@ import { toApi } from 'utils/jellyfin-apiclient/compat'; import { queryClient } from 'utils/query/queryClient'; import { playbackManager } from './playback/playbackmanager'; -import ServerConnections from './ServerConnections'; let currentOwnerId; let currentThemeIds = []; diff --git a/src/components/toast/toast.js b/src/components/toast/toast.ts similarity index 74% rename from src/components/toast/toast.js rename to src/components/toast/toast.ts index e29cb16bc..7f85757fa 100644 --- a/src/components/toast/toast.js +++ b/src/components/toast/toast.ts @@ -1,6 +1,10 @@ import './toast.scss'; -let toastContainer; +interface Toast { + text: string +} + +let toastContainer: HTMLDivElement; function getToastContainer() { if (!toastContainer) { @@ -12,24 +16,24 @@ function getToastContainer() { return toastContainer; } -function remove(elem) { +function remove(elem: HTMLElement) { setTimeout(function () { - elem.parentNode.removeChild(elem); + elem.parentNode?.removeChild(elem); }, 300); } -function animateRemove(elem) { +function animateRemove(elem: HTMLElement) { setTimeout(function () { elem.classList.add('toastHide'); remove(elem); }, 3300); } -export default function (options) { +export default function (options: string | Toast) { if (typeof options === 'string') { options = { text: options - }; + } as Toast; } const elem = document.createElement('div'); diff --git a/src/components/toolbar/AppUserMenu.tsx b/src/components/toolbar/AppUserMenu.tsx index 69a0ad7f8..58b9d4d56 100644 --- a/src/components/toolbar/AppUserMenu.tsx +++ b/src/components/toolbar/AppUserMenu.tsx @@ -2,6 +2,7 @@ import AccountCircle from '@mui/icons-material/AccountCircle'; import AppSettingsAlt from '@mui/icons-material/AppSettingsAlt'; import Close from '@mui/icons-material/Close'; import DashboardIcon from '@mui/icons-material/Dashboard'; +import Download from '@mui/icons-material/Download'; import Edit from '@mui/icons-material/Edit'; import Logout from '@mui/icons-material/Logout'; import PhonelinkLock from '@mui/icons-material/PhonelinkLock'; @@ -16,6 +17,7 @@ import React, { FC, useCallback } from 'react'; import { Link } from 'react-router-dom'; import { appHost } from 'components/apphost'; +import { AppFeature } from 'constants/appFeature'; import { useApi } from 'hooks/useApi'; import { useQuickConnectEnabled } from 'hooks/useQuickConnect'; import globalize from 'lib/globalize'; @@ -36,6 +38,11 @@ const AppUserMenu: FC = ({ const { user } = useApi(); const { data: isQuickConnectEnabled } = useQuickConnectEnabled(); + const onDownloadManagerClick = useCallback(() => { + shell.openDownloadManager(); + onMenuClose(); + }, [ onMenuClose ]); + const onClientSettingsClick = useCallback(() => { shell.openClientSettings(); onMenuClose(); @@ -97,10 +104,25 @@ const AppUserMenu: FC = ({ - {appHost.supports('clientsettings') && ([ - , + {(appHost.supports(AppFeature.DownloadManagement) || appHost.supports(AppFeature.ClientSettings)) && ( + + )} + + {appHost.supports(AppFeature.DownloadManagement) && ( + + + + + + {globalize.translate('DownloadManager')} + + + )} + + {appHost.supports(AppFeature.ClientSettings) && ( @@ -110,7 +132,7 @@ const AppUserMenu: FC = ({ {globalize.translate('ClientSettings')} - ])} + )} {/* ADMIN LINKS */} {user?.Policy?.IsAdministrator && ([ @@ -156,7 +178,7 @@ const AppUserMenu: FC = ({ )} - {appHost.supports('multiserver') && ( + {appHost.supports(AppFeature.MultiServer) && ( @@ -180,7 +202,7 @@ const AppUserMenu: FC = ({ - {appHost.supports('exitmenu') && ([ + {appHost.supports(AppFeature.ExitMenu) && ([ , ${escapeHtml(location)}`; } else { location = escapeHtml(location); @@ -650,7 +651,7 @@ function reloadFromItem(instance, page, params, item, user) { setPeopleHeader(page, item); loading.hide(); - if (item.Type === 'Book' && item.CanDownload && appHost.supports('filedownload')) { + if (item.Type === 'Book' && item.CanDownload && appHost.supports(AppFeature.FileDownload)) { hideAll(page, 'btnDownload', true); } @@ -1083,7 +1084,7 @@ function renderDetails(page, item, apiClient, context) { renderLyricsContainer(page, item, apiClient); // Don't allow redirection to other websites from the TV layout - if (!layoutManager.tv && appHost.supports('externallinks')) { + if (!layoutManager.tv && appHost.supports(AppFeature.ExternalLinks)) { renderLinks(page, item); } @@ -1379,7 +1380,6 @@ function renderChildren(page, item) { if (item.Type == 'MusicAlbum') { let showArtist = false; for (const track of result.Items) { - // eslint-disable-next-line sonarjs/no-alphabetical-sort if (!isEqual(track.ArtistItems.map(x => x.Id).sort(), track.AlbumArtists.map(x => x.Id).sort())) { showArtist = true; break; diff --git a/src/controllers/list.html b/src/controllers/list.html index a755ad1c9..9546b035d 100644 --- a/src/controllers/list.html +++ b/src/controllers/list.html @@ -34,13 +34,13 @@ +
diff --git a/src/controllers/lyrics.html b/src/controllers/lyrics.html index d1e7b662c..79b923678 100644 --- a/src/controllers/lyrics.html +++ b/src/controllers/lyrics.html @@ -1,6 +1,6 @@
-
+
diff --git a/src/controllers/lyrics.js b/src/controllers/lyrics.js index 6272f7fcc..74f674140 100644 --- a/src/controllers/lyrics.js +++ b/src/controllers/lyrics.js @@ -1,20 +1,21 @@ +import { getLyricsApi } from '@jellyfin/sdk/lib/utils/api/lyrics-api'; import escapeHtml from 'escape-html'; +import { AutoScroll } from 'apps/stable/features/lyrics/constants/autoScroll'; import autoFocuser from 'components/autoFocuser'; -import { appRouter } from '../components/router/appRouter'; +import { appRouter } from 'components/router/appRouter'; import layoutManager from 'components/layoutManager'; -import { playbackManager } from '../components/playback/playbackmanager'; -import ServerConnections from '../components/ServerConnections'; +import { playbackManager } from 'components/playback/playbackmanager'; import scrollManager from 'components/scrollManager'; import focusManager from 'components/focusManager'; - -import keyboardNavigation from 'scripts/keyboardNavigation'; import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import keyboardNavigation from 'scripts/keyboardNavigation'; import LibraryMenu from 'scripts/libraryMenu'; import Events from 'utils/events'; +import { toApi } from 'utils/jellyfin-apiclient/compat'; import '../styles/lyrics.scss'; -import { AutoScroll } from './lyrics.types'; let currentPlayer; let currentItem; @@ -23,21 +24,17 @@ let savedLyrics; let isDynamicLyric = false; let autoScroll = AutoScroll.Instant; -function dynamicLyricHtmlReducer(htmlAccumulator, lyric, index) { - if (layoutManager.tv) { - htmlAccumulator += ``; - } else { - htmlAccumulator += `
${escapeHtml(lyric.Text)}
`; - } - return htmlAccumulator; -} +function lyricHtmlReducer(htmlAccumulator, lyric, index) { + const elem = layoutManager.tv ? 'button' : 'div'; + const classes = []; + if (isDynamicLyric) classes.push('dynamicLyric'); + if (layoutManager.tv) classes.push('listItem', 'show-focus'); + const lyricTime = typeof lyric.Start !== 'undefined' ? `data-lyrictime="${lyric.Start}"` : ''; + + htmlAccumulator += `<${elem} class="lyricsLine ${classes.join(' ')}" id="lyricPosition${index}" ${lyricTime}> + ${escapeHtml(lyric.Text)} +`; -function staticLyricHtmlReducer(htmlAccumulator, lyric, index) { - if (layoutManager.tv) { - htmlAccumulator += ``; - } else { - htmlAccumulator += `
${escapeHtml(lyric.Text)}
`; - } return htmlAccumulator; } @@ -96,37 +93,31 @@ export default function (view) { } function renderNoLyricMessage() { - const itemsContainer = view.querySelector('.dynamicLyricsContainer'); + const itemsContainer = view.querySelector('.lyricsContainer'); if (itemsContainer) { - const html = `

${globalize.translate('HeaderNoLyrics')}

`; + const html = `

${globalize.translate('HeaderNoLyrics')}

`; itemsContainer.innerHTML = html; } autoFocuser.autoFocus(); } - function renderDynamicLyrics(lyrics) { - const itemsContainer = view.querySelector('.dynamicLyricsContainer'); + function renderLyrics(lyrics) { + const itemsContainer = view.querySelector('.lyricsContainer'); if (itemsContainer) { - const html = lyrics.reduce(dynamicLyricHtmlReducer, ''); + const html = lyrics.reduce(lyricHtmlReducer, ''); itemsContainer.innerHTML = html; } - const lyricLineArray = itemsContainer.querySelectorAll('.lyricsLine'); + if (isDynamicLyric) { + const lyricLineArray = itemsContainer.querySelectorAll('.lyricsLine'); - // attaches click event listener to change playtime to lyric start - lyricLineArray.forEach(element => { - element.addEventListener('click', () => onLyricClick(element.getAttribute('data-lyrictime'))); - }); + // attaches click event listener to change playtime to lyric start + lyricLineArray.forEach(element => { + element.addEventListener('click', () => onLyricClick(element.getAttribute('data-lyrictime'))); + }); - const currentIndex = getLyricIndex(getCurrentPlayTime(), lyrics); - updateAllLyricLines(currentIndex, savedLyrics); - } - - function renderStaticLyrics(lyrics) { - const itemsContainer = view.querySelector('.dynamicLyricsContainer'); - if (itemsContainer) { - const html = lyrics.reduce(staticLyricHtmlReducer, ''); - itemsContainer.innerHTML = html; + const currentIndex = getLyricIndex(getCurrentPlayTime(), lyrics); + updateAllLyricLines(currentIndex, savedLyrics); } } @@ -135,28 +126,22 @@ export default function (view) { isDynamicLyric = Object.prototype.hasOwnProperty.call(lyrics[0], 'Start'); - if (isDynamicLyric) { - renderDynamicLyrics(savedLyrics); - } else { - renderStaticLyrics(savedLyrics); - } + renderLyrics(savedLyrics); autoFocuser.autoFocus(view); } function getLyrics(serverId, itemId) { const apiClient = ServerConnections.getApiClient(serverId); + const lyricsApi = getLyricsApi(toApi(apiClient)); - return apiClient.ajax({ - url: apiClient.getUrl('Audio/' + itemId + '/Lyrics'), - type: 'GET', - dataType: 'json' - }).then((response) => { - if (!response.Lyrics) { - throw new Error(); - } - return response.Lyrics; - }); + return lyricsApi.getLyrics({ itemId }) + .then(({ data }) => { + if (!data.Lyrics?.length) { + throw new Error('No lyrics returned'); + } + return data.Lyrics; + }); } function bindToPlayer(player) { diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index 9a45f59e0..b9fa8bc50 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -52,8 +52,14 @@ export default function (view, params, tabContent) { return !layoutManager.desktop; } - const fillItemsContainer = (entry) => { + const fillItemsContainer = (entry, observer) => { + if (!entry.isIntersecting) { + return; + } + const elem = entry.target; + observer.unobserve(elem); + const id = elem.getAttribute('data-id'); const viewStyle = this.getCurrentViewStyle(); let limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9; diff --git a/src/controllers/movies/movies.html b/src/controllers/movies/movies.html index 31927613a..5791ddf8d 100644 --- a/src/controllers/movies/movies.html +++ b/src/controllers/movies/movies.html @@ -7,7 +7,7 @@
- +
diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 80d3f1d37..e8c37f7f9 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -33,7 +33,7 @@ export default function (view, params, tabContent, options) { function shuffle() { isLoading = true; loading.show(); - const newQuery = { ...query, SortBy: 'Random', StartIndex: 0, Limit: 300 }; + const newQuery = { ...query, SortBy: 'Random', StartIndex: 0, Limit: 300, Fields: 'PrimaryImageAspectRatio,MediaSourceCount,Chapters,Trickplay' }; return ApiClient.getItems(ApiClient.getCurrentUserId(), newQuery).then(({ Items }) => { playbackManager.play({ items: Items, @@ -277,7 +277,7 @@ export default function (view, params, tabContent, options) { SortOrder: 'Ascending', IncludeItemTypes: 'Movie', Recursive: true, - Fields: 'PrimaryImageAspectRatio,MediaSourceCount,Chapters,Trickplay', + Fields: 'PrimaryImageAspectRatio,MediaSourceCount', ImageTypeLimit: 1, EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0, diff --git a/src/controllers/music/music.html b/src/controllers/music/music.html index 5ba1c72d1..f16987c8b 100644 --- a/src/controllers/music/music.html +++ b/src/controllers/music/music.html @@ -16,7 +16,7 @@
- +
@@ -60,7 +60,7 @@
- +
@@ -78,7 +78,7 @@
- +
@@ -101,7 +101,7 @@
- +
diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index b143df9d4..c0be4c579 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1,4 +1,10 @@ import escapeHtml from 'escape-html'; + +import { PlayerEvent } from 'apps/stable/features/playback/constants/playerEvent'; +import { AppFeature } from 'constants/appFeature'; +import { TICKS_PER_MINUTE, TICKS_PER_SECOND } from 'constants/time'; +import { EventType } from 'types/eventType'; + import { playbackManager } from '../../../components/playback/playbackmanager'; import browser from '../../../scripts/browser'; import dom from '../../../scripts/dom'; @@ -19,17 +25,14 @@ import '../../../elements/emby-slider/emby-slider'; import '../../../elements/emby-button/paper-icon-button-light'; import '../../../elements/emby-ratingbutton/emby-ratingbutton'; import '../../../styles/videoosd.scss'; -import ServerConnections from '../../../components/ServerConnections'; import shell from '../../../scripts/shell'; import SubtitleSync from '../../../components/subtitlesync/subtitlesync'; import { appRouter } from '../../../components/router/appRouter'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import LibraryMenu from '../../../scripts/libraryMenu'; import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components/backdrop/backdrop'; import { pluginManager } from '../../../components/pluginManager'; import { PluginType } from '../../../types/plugin.ts'; -import { EventType } from 'types/eventType'; -import { TICKS_PER_MINUTE, TICKS_PER_SECOND } from 'constants/time'; -import { PlayerEvent } from 'apps/stable/features/playback/constants/playerEvent'; function getOpenedDialog() { return document.querySelector('.dialogContainer .dialog.opened'); @@ -872,7 +875,7 @@ export default function (view) { showVolumeSlider = false; } - if (player.isLocalPlayer && appHost.supports('physicalvolumecontrol')) { + if (player.isLocalPlayer && appHost.supports(AppFeature.PhysicalVolumeControl)) { showMuteButton = false; showVolumeSlider = false; } diff --git a/src/controllers/session/addServer/index.js b/src/controllers/session/addServer/index.js index 3e10dd629..68b14e890 100644 --- a/src/controllers/session/addServer/index.js +++ b/src/controllers/session/addServer/index.js @@ -1,10 +1,10 @@ -import appSettings from '../../../scripts/settings/appSettings'; -import loading from '../../../components/loading/loading'; -import globalize from '../../../lib/globalize'; -import '../../../elements/emby-button/emby-button'; -import Dashboard from '../../../utils/dashboard'; -import ServerConnections from '../../../components/ServerConnections'; -import { ConnectionState } from '../../../utils/jellyfin-apiclient/ConnectionState.ts'; +import loading from 'components/loading/loading'; +import globalize from 'lib/globalize'; +import { ConnectionState, ServerConnections } from 'lib/jellyfin-apiclient'; +import appSettings from 'scripts/settings/appSettings'; +import Dashboard from 'utils/dashboard'; + +import 'elements/emby-button/emby-button'; function handleConnectionResult(page, result) { loading.hide(); diff --git a/src/controllers/session/forgotPassword/index.html b/src/controllers/session/forgotPassword/index.html deleted file mode 100644 index 31e92c2c5..000000000 --- a/src/controllers/session/forgotPassword/index.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
- -
-

${ButtonForgotPassword}

- -
- -
${LabelForgotPasswordUsernameHelp}
-
- -
- - - -
-
- -
-
diff --git a/src/controllers/session/forgotPassword/index.js b/src/controllers/session/forgotPassword/index.js deleted file mode 100644 index d94dac455..000000000 --- a/src/controllers/session/forgotPassword/index.js +++ /dev/null @@ -1,56 +0,0 @@ -import globalize from 'lib/globalize'; -import Dashboard from 'utils/dashboard'; - -function processForgotPasswordResult(result) { - if (result.Action == 'ContactAdmin') { - Dashboard.alert({ - message: globalize.translate('MessageContactAdminToResetPassword'), - title: globalize.translate('ButtonForgotPassword') - }); - return; - } - - if (result.Action == 'InNetworkRequired') { - Dashboard.alert({ - message: globalize.translate('MessageForgotPasswordInNetworkRequired'), - title: globalize.translate('ButtonForgotPassword') - }); - return; - } - - if (result.Action == 'PinCode') { - let msg = globalize.translate('MessageForgotPasswordFileCreated'); - msg += '
'; - msg += '
'; - msg += 'Enter PIN here to finish Password Reset
'; - msg += '
'; - msg += result.PinFile; - msg += '
'; - Dashboard.alert({ - message: msg, - title: globalize.translate('ButtonForgotPassword'), - callback: function () { - Dashboard.navigate('forgotpasswordpin'); - } - }); - } -} - -export default function (view) { - function onSubmit(e) { - ApiClient.ajax({ - type: 'POST', - url: ApiClient.getUrl('Users/ForgotPassword'), - dataType: 'json', - contentType: 'application/json', - data: JSON.stringify({ - EnteredUsername: view.querySelector('#txtName').value - }) - }).then(processForgotPasswordResult); - e.preventDefault(); - return false; - } - - view.querySelector('form').addEventListener('submit', onSubmit); -} - diff --git a/src/controllers/session/login/index.html b/src/controllers/session/login/index.html index f24bc0d3e..63096a3d7 100644 --- a/src/controllers/session/login/index.html +++ b/src/controllers/session/login/index.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/controllers/session/login/index.js b/src/controllers/session/login/index.js index 4c241389a..2ba0ad6e3 100644 --- a/src/controllers/session/login/index.js +++ b/src/controllers/session/login/index.js @@ -1,5 +1,9 @@ import DOMPurify from 'dompurify'; import markdownIt from 'markdown-it'; + +import { AppFeature } from 'constants/appFeature'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; + import { appHost } from '../../../components/apphost'; import appSettings from '../../../scripts/settings/appSettings'; import dom from '../../../scripts/dom'; @@ -11,13 +15,13 @@ import globalize from '../../../lib/globalize'; import '../../../components/cardbuilder/card.scss'; import '../../../elements/emby-checkbox/emby-checkbox'; import Dashboard from '../../../utils/dashboard'; -import ServerConnections from '../../../components/ServerConnections'; import toast from '../../../components/toast/toast'; import dialogHelper from '../../../components/dialogHelper/dialogHelper'; import baseAlert from '../../../components/alert'; -import './login.scss'; import { getDefaultBackgroundClass } from '../../../components/cardbuilder/cardBuilderUtils'; +import './login.scss'; + const enableFocusTransform = !browser.slow && !browser.edge; function authenticateUserByName(page, apiClient, url, username, password) { @@ -262,7 +266,7 @@ export default function (view, params) { loading.show(); libraryMenu.setTransparentMenu(true); - if (!appHost.supports('multiserver')) { + if (!appHost.supports(AppFeature.MultiServer)) { view.querySelector('.btnSelectServer').classList.add('hide'); } diff --git a/src/controllers/session/selectServer/index.js b/src/controllers/session/selectServer/index.js index 577c897ba..3b2efb082 100644 --- a/src/controllers/session/selectServer/index.js +++ b/src/controllers/session/selectServer/index.js @@ -17,10 +17,9 @@ import '../../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../../components/cardbuilder/card.scss'; import '../../../elements/emby-button/emby-button'; import Dashboard from '../../../utils/dashboard'; -import ServerConnections from '../../../components/ServerConnections'; import alert from '../../../components/alert'; -import { ConnectionState } from '../../../utils/jellyfin-apiclient/ConnectionState.ts'; import { getDefaultBackgroundClass } from '../../../components/cardbuilder/cardBuilderUtils'; +import { ConnectionState, ServerConnections } from 'lib/jellyfin-apiclient'; const enableFocusTransform = !browser.slow && !browser.edge; @@ -176,8 +175,9 @@ export default function (view, params) { case 'delete': deleteServer(server); + break; } - }); + }).catch(() => { /* no-op */ }); } function onServersRetrieved(result) { @@ -222,4 +222,3 @@ export default function (view, params) { } }); } - diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js index c1c360a83..6c5982627 100644 --- a/src/controllers/shows/tvgenres.js +++ b/src/controllers/shows/tvgenres.js @@ -52,8 +52,14 @@ export default function (view, params, tabContent) { return !layoutManager.desktop; } - function fillItemsContainer(entry) { + function fillItemsContainer(entry, observer) { + if (!entry.isIntersecting) { + return; + } + const elem = entry.target; + observer.unobserve(elem); + const id = elem.getAttribute('data-id'); const viewStyle = self.getCurrentViewStyle(); let limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9; diff --git a/src/controllers/shows/tvrecommended.html b/src/controllers/shows/tvrecommended.html index 3b0e18255..26bfcedf8 100644 --- a/src/controllers/shows/tvrecommended.html +++ b/src/controllers/shows/tvrecommended.html @@ -6,7 +6,7 @@
- +
@@ -62,7 +62,7 @@
- +
diff --git a/src/controllers/shows/tvupcoming.js b/src/controllers/shows/tvupcoming.js index 65db7731e..53d9aaf5a 100644 --- a/src/controllers/shows/tvupcoming.js +++ b/src/controllers/shows/tvupcoming.js @@ -45,7 +45,7 @@ function enableScrollX() { function renderUpcoming(elem, items) { const groups = []; - let currentGroupName = ''; + let currentGroupName; let currentGroup = []; for (let i = 0, length = items.length; i < length; i++) { @@ -66,15 +66,13 @@ function renderUpcoming(elem, items) { } if (dateText != currentGroupName) { - if (currentGroup.length) { - groups.push({ - name: currentGroupName, - items: currentGroup - }); - } - currentGroupName = dateText; currentGroup = [item]; + + groups.push({ + name: currentGroupName, + items: currentGroup + }); } else { currentGroup.push(item); } diff --git a/src/elements/emby-button/LinkButton.tsx b/src/elements/emby-button/LinkButton.tsx index 359bc0d6b..713aa0cb3 100644 --- a/src/elements/emby-button/LinkButton.tsx +++ b/src/elements/emby-button/LinkButton.tsx @@ -1,9 +1,12 @@ -import React, { AnchorHTMLAttributes, DetailedHTMLProps, MouseEvent, useCallback } from 'react'; import classNames from 'classnames'; -import layoutManager from '../../components/layoutManager'; -import shell from '../../scripts/shell'; -import { appRouter } from '../../components/router/appRouter'; -import { appHost } from '../../components/apphost'; +import React, { AnchorHTMLAttributes, DetailedHTMLProps, MouseEvent, useCallback } from 'react'; + +import { appHost } from 'components/apphost'; +import layoutManager from 'components/layoutManager'; +import { appRouter } from 'components/router/appRouter'; +import { AppFeature } from 'constants/appFeature'; +import shell from 'scripts/shell'; + import './emby-button.scss'; interface LinkButtonProps extends DetailedHTMLProps, @@ -28,7 +31,7 @@ const LinkButton: React.FC = ({ const url = href || ''; if (url !== '#') { if (target) { - if (!appHost.supports('targetblank')) { + if (!appHost.supports(AppFeature.TargetBlank)) { e.preventDefault(); shell.openUrl(url); } @@ -45,7 +48,7 @@ const LinkButton: React.FC = ({ onClick?.(e); }, [ href, target, onClick ]); - if (isAutoHideEnabled === true && !appHost.supports('externallinks')) { + if (isAutoHideEnabled === true && !appHost.supports(AppFeature.ExternalLinks)) { return null; } diff --git a/src/elements/emby-button/emby-button.js b/src/elements/emby-button/emby-button.js index 0349bd38a..d41474c36 100644 --- a/src/elements/emby-button/emby-button.js +++ b/src/elements/emby-button/emby-button.js @@ -1,9 +1,12 @@ import 'webcomponents.js/webcomponents-lite'; -import { removeEventListener, addEventListener } from '../../scripts/dom'; -import layoutManager from '../../components/layoutManager'; -import shell from '../../scripts/shell'; -import { appRouter } from '../../components/router/appRouter'; -import { appHost } from '../../components/apphost'; + +import { appHost } from 'components/apphost'; +import layoutManager from 'components/layoutManager'; +import { appRouter } from 'components/router/appRouter'; +import { AppFeature } from 'constants/appFeature'; +import { removeEventListener, addEventListener } from 'scripts/dom'; +import shell from 'scripts/shell'; + import './emby-button.scss'; const EmbyButtonPrototype = Object.create(HTMLButtonElement.prototype); @@ -13,7 +16,7 @@ function onAnchorClick(e) { const href = this.getAttribute('href') || ''; if (href !== '#') { if (this.getAttribute('target')) { - if (!appHost.supports('targetblank')) { + if (!appHost.supports(AppFeature.TargetBlank)) { e.preventDefault(); shell.openUrl(href); } @@ -46,7 +49,7 @@ EmbyButtonPrototype.attachedCallback = function () { addEventListener(this, 'click', onAnchorClick, {}); if (this.getAttribute('data-autohide') === 'true') { - if (appHost.supports('externallinks')) { + if (appHost.supports(AppFeature.ExternalLinks)) { this.classList.remove('hide'); } else { this.classList.add('hide'); diff --git a/src/elements/emby-itemrefreshindicator/RefreshIndicator.tsx b/src/elements/emby-itemrefreshindicator/RefreshIndicator.tsx index 79f6a8cf3..edd834a9e 100644 --- a/src/elements/emby-itemrefreshindicator/RefreshIndicator.tsx +++ b/src/elements/emby-itemrefreshindicator/RefreshIndicator.tsx @@ -9,7 +9,7 @@ import CircularProgress, { } from '@mui/material/CircularProgress'; import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; -import { toPercent } from 'utils/number'; +import { toPercentString } from 'utils/number'; import { getCurrentDateTimeLocale } from 'lib/globalize'; import type { ItemDto } from 'types/base/models/item-dto'; @@ -36,7 +36,7 @@ function CircularProgressWithLabel( component='div' color='text.secondary' > - {toPercent(props.value / 100, getCurrentDateTimeLocale())} + {toPercentString(props.value / 100, getCurrentDateTimeLocale())} diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js index dd40a8053..e1657d095 100644 --- a/src/elements/emby-itemscontainer/emby-itemscontainer.js +++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js @@ -1,3 +1,6 @@ +import 'webcomponents.js/webcomponents-lite'; +import Sortable from 'sortablejs'; + import itemShortcuts from '../../components/shortcuts'; import inputManager from '../../scripts/inputManager'; import { playbackManager } from '../../components/playback/playbackmanager'; @@ -7,11 +10,9 @@ import browser from '../../scripts/browser'; import dom from '../../scripts/dom'; import loading from '../../components/loading/loading'; import focusManager from '../../components/focusManager'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import serverNotifications from '../../scripts/serverNotifications'; import Events from '../../utils/events.ts'; -import 'webcomponents.js/webcomponents-lite'; -import ServerConnections from '../../components/ServerConnections'; -import Sortable from 'sortablejs'; const ItemsContainerPrototype = Object.create(HTMLDivElement.prototype); diff --git a/src/elements/emby-playstatebutton/emby-playstatebutton.js b/src/elements/emby-playstatebutton/emby-playstatebutton.js index 1e83bb055..f41a14352 100644 --- a/src/elements/emby-playstatebutton/emby-playstatebutton.js +++ b/src/elements/emby-playstatebutton/emby-playstatebutton.js @@ -1,8 +1,8 @@ import serverNotifications from '../../scripts/serverNotifications'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Events from '../../utils/events.ts'; import EmbyButtonPrototype from '../../elements/emby-button/emby-button'; -import ServerConnections from '../../components/ServerConnections'; function addNotificationEvent(instance, name, handler) { const localHandler = handler.bind(instance); diff --git a/src/elements/emby-progressring/emby-progressring.js b/src/elements/emby-progressring/emby-progressring.js index fee77e5ec..ce4b061bd 100644 --- a/src/elements/emby-progressring/emby-progressring.js +++ b/src/elements/emby-progressring/emby-progressring.js @@ -2,7 +2,7 @@ import './emby-progressring.scss'; import 'webcomponents.js/webcomponents-lite'; import template from './emby-progressring.template.html'; import { getCurrentDateTimeLocale } from '../../lib/globalize'; -import { toPercent } from '../../utils/number.ts'; +import { toPercentString } from '../../utils/number.ts'; const EmbyProgressRing = Object.create(HTMLDivElement.prototype); @@ -71,7 +71,7 @@ EmbyProgressRing.setProgress = function (progress) { this.querySelector('.animate-75-100-b').style.transform = 'rotate(' + angle + 'deg)'; } - this.querySelector('.progressring-text').innerHTML = toPercent(progress / 100, getCurrentDateTimeLocale()); + this.querySelector('.progressring-text').innerHTML = toPercentString(progress / 100, getCurrentDateTimeLocale()); }; EmbyProgressRing.attachedCallback = function () { diff --git a/src/elements/emby-ratingbutton/emby-ratingbutton.js b/src/elements/emby-ratingbutton/emby-ratingbutton.js index a0621afea..40b581c7b 100644 --- a/src/elements/emby-ratingbutton/emby-ratingbutton.js +++ b/src/elements/emby-ratingbutton/emby-ratingbutton.js @@ -1,8 +1,8 @@ import serverNotifications from '../../scripts/serverNotifications'; import globalize from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import Events from '../../utils/events.ts'; import EmbyButtonPrototype from '../emby-button/emby-button'; -import ServerConnections from '../../components/ServerConnections'; function addNotificationEvent(instance, name, handler) { const localHandler = handler.bind(instance); diff --git a/src/elements/emby-scrollbuttons/utils.ts b/src/elements/emby-scrollbuttons/utils.ts index 0d925957a..d21a81004 100644 --- a/src/elements/emby-scrollbuttons/utils.ts +++ b/src/elements/emby-scrollbuttons/utils.ts @@ -76,7 +76,7 @@ function scrollToWindow({ let scrollToPosition: number; if (direction === ScrollDirection.RIGHT) { - const nextItem = items[lastVisibleIndex]; + const nextItem = items[lastVisibleIndex] || items[lastVisibleIndex - 1]; // This will be the position to anchor the item at `lastVisibleIndex` to the start of the view window. const nextItemScrollOffset = lastVisibleIndex * nextItem.offsetWidth; diff --git a/src/hooks/useApi.tsx b/src/hooks/useApi.tsx index 20614091b..b8bd88b42 100644 --- a/src/hooks/useApi.tsx +++ b/src/hooks/useApi.tsx @@ -3,9 +3,9 @@ import type { UserDto } from '@jellyfin/sdk/lib/generated-client'; import type { ApiClient, Event } from 'jellyfin-apiclient'; import React, { type FC, type PropsWithChildren, createContext, useContext, useEffect, useMemo, useState } from 'react'; -import ServerConnections from '../components/ServerConnections'; -import events from '../utils/events'; -import { toApi } from '../utils/jellyfin-apiclient/compat'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import events from 'utils/events'; +import { toApi } from 'utils/jellyfin-apiclient/compat'; export interface JellyfinApiContext { __legacyApiClient__?: ApiClient diff --git a/src/hooks/useLocale.tsx b/src/hooks/useLocale.tsx index a7b8bc625..63bbb5818 100644 --- a/src/hooks/useLocale.tsx +++ b/src/hooks/useLocale.tsx @@ -11,11 +11,11 @@ export function useLocale() { const { dateTimeLocale: dateTimeSetting, language } = useUserSettings(); const [ dateFnsLocale, setDateFnsLocale ] = useState(enUS); - const locale = useMemo(() => ( + const locale: string = useMemo(() => ( normalizeLocaleName(language || getDefaultLanguage()) ), [ language ]); - const dateTimeLocale = useMemo(() => ( + const dateTimeLocale: string = useMemo(() => ( dateTimeSetting ? normalizeLocaleName(dateTimeSetting) : locale ), [ dateTimeSetting, locale ]); diff --git a/src/hooks/useNamedConfiguration.ts b/src/hooks/useNamedConfiguration.ts index 138355b60..c789a5091 100644 --- a/src/hooks/useNamedConfiguration.ts +++ b/src/hooks/useNamedConfiguration.ts @@ -13,15 +13,15 @@ export interface NamedConfiguration { const fetchNamedConfiguration = async (api: Api, key: string, options?: AxiosRequestConfig) => { const response = await getConfigurationApi(api).getNamedConfiguration({ key }, options); - return response.data as unknown as NamedConfiguration; + return response.data; }; -export const useNamedConfiguration = (key: string) => { +export const useNamedConfiguration = (key: string) => { const { api } = useApi(); return useQuery({ queryKey: [ QUERY_KEY, key ], - queryFn: ({ signal }) => fetchNamedConfiguration(api!, key, { signal }), + queryFn: ({ signal }) => fetchNamedConfiguration(api!, key, { signal }) as ConfigType, enabled: !!api }); }; diff --git a/src/hooks/useUserTheme.ts b/src/hooks/useUserTheme.ts index 29593ddca..2d60c173c 100644 --- a/src/hooks/useUserTheme.ts +++ b/src/hooks/useUserTheme.ts @@ -1,12 +1,14 @@ import { useThemes } from './useThemes'; import { useUserSettings } from './useUserSettings'; +const FALLBACK_THEME_ID = 'dark'; + export function useUserTheme() { const { theme, dashboardTheme } = useUserSettings(); const { defaultTheme } = useThemes(); return { - theme: theme || defaultTheme?.id, - dashboardTheme: dashboardTheme || defaultTheme?.id + theme: theme || defaultTheme?.id || FALLBACK_THEME_ID, + dashboardTheme: dashboardTheme || defaultTheme?.id || FALLBACK_THEME_ID }; } diff --git a/src/index.jsx b/src/index.jsx index 66df6e33e..30e8b8aa6 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -5,13 +5,14 @@ import React from 'react'; import { createRoot } from 'react-dom/client'; // NOTE: We need to import this first to initialize the connection -import ServerConnections from './components/ServerConnections'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { appHost } from './components/apphost'; import autoFocuser from './components/autoFocuser'; import loading from 'components/loading/loading'; import { pluginManager } from './components/pluginManager'; import { appRouter } from './components/router/appRouter'; +import { AppFeature } from 'constants/appFeature'; import globalize from './lib/globalize'; import { loadCoreDictionary } from 'lib/globalize/loader'; import { initialize as initializeAutoCast } from 'scripts/autocast'; @@ -23,7 +24,6 @@ import { pageClassOn, serverAddress } from './utils/dashboard'; import Events from './utils/events'; import RootApp from './RootApp'; -import { history } from 'RootAppRouter'; // Import the button webcomponent for use throughout the site // NOTE: This is a bit of a hack, files should ensure the component is imported before use @@ -137,7 +137,7 @@ async function loadPlugins() { console.dir(pluginManager); let list = await getPlugins(); - if (!appHost.supports('remotecontrol')) { + if (!appHost.supports(AppFeature.RemoteControl)) { // Disable remote player plugins if not supported list = list.filter(plugin => !plugin.startsWith('sessionPlayer') && !plugin.startsWith('chromecastPlayer')); @@ -166,12 +166,12 @@ function loadPlatformFeatures() { import('./components/nowPlayingBar/nowPlayingBar'); } - if (appHost.supports('remotecontrol')) { + if (appHost.supports(AppFeature.RemoteControl)) { import('./components/playback/playerSelectionMenu'); import('./components/playback/remotecontrolautoplay'); } - if (!appHost.supports('physicalvolumecontrol') || browser.touch) { + if (!appHost.supports(AppFeature.PhysicalVolumeControl) || browser.touch) { import('./components/playback/volumeosd'); } @@ -206,7 +206,7 @@ async function renderApp() { const root = createRoot(container); root.render( - + ); } diff --git a/src/components/ServerConnections.js b/src/lib/jellyfin-apiclient/ServerConnections.js similarity index 89% rename from src/components/ServerConnections.js rename to src/lib/jellyfin-apiclient/ServerConnections.js index 38692998f..bae007970 100644 --- a/src/components/ServerConnections.js +++ b/src/lib/jellyfin-apiclient/ServerConnections.js @@ -1,16 +1,17 @@ // NOTE: This is used for jsdoc return type // eslint-disable-next-line @typescript-eslint/no-unused-vars import { Api } from '@jellyfin/sdk'; -import { MINIMUM_VERSION } from '@jellyfin/sdk/lib/versions'; -import { ConnectionManager, Credentials, ApiClient } from 'jellyfin-apiclient'; +import { Credentials, ApiClient } from 'jellyfin-apiclient'; -import { appHost } from './apphost'; -import Dashboard from '../utils/dashboard'; -import Events from '../utils/events.ts'; -import { setUserInfo } from '../scripts/settings/userSettings'; -import appSettings from '../scripts/settings/appSettings'; +import { appHost } from 'components/apphost'; +import appSettings from 'scripts/settings/appSettings'; +import { setUserInfo } from 'scripts/settings/userSettings'; +import Dashboard from 'utils/dashboard'; +import Events from 'utils/events.ts'; import { toApi } from 'utils/jellyfin-apiclient/compat'; +import ConnectionManager from './connectionManager'; + const normalizeImageOptions = options => { if (!options.quality && (options.maxWidth || options.width || options.maxHeight || options.height || options.fillWidth || options.fillHeight)) { options.quality = 90; @@ -37,9 +38,6 @@ class ServerConnections extends ConnectionManager { this.localApiClient = null; this.firstConnection = null; - // Set the apiclient minimum version to match the SDK - this._minServerVersion = MINIMUM_VERSION; - Events.on(this, 'localusersignedout', (_e, logoutInfo) => { setUserInfo(null, null); // Ensure the updated credentials are persisted to storage diff --git a/src/lib/jellyfin-apiclient/connectionManager.js b/src/lib/jellyfin-apiclient/connectionManager.js new file mode 100644 index 000000000..898844b6f --- /dev/null +++ b/src/lib/jellyfin-apiclient/connectionManager.js @@ -0,0 +1,785 @@ +import { AUTHORIZATION_HEADER } from '@jellyfin/sdk/lib/api'; +import { getAuthorizationHeader } from '@jellyfin/sdk/lib/utils'; +import { MINIMUM_VERSION } from '@jellyfin/sdk/lib/versions'; +import { ApiClient } from 'jellyfin-apiclient'; + +import events from 'utils/events'; +import { ajax } from 'utils/fetch'; +import { equalsIgnoreCase } from 'utils/string'; + +import { ConnectionMode } from './connectionMode'; +import { ConnectionState } from './connectionState'; +import { compareVersions } from './utils/compareVersions'; + +const DEFAULT_CONNECTION_TIMEOUT = 20000; + +function getServerAddress(server, mode) { + switch (mode) { + case ConnectionMode.Local: + return server.LocalAddress; + case ConnectionMode.Manual: + return server.ManualAddress; + case ConnectionMode.Remote: + return server.RemoteAddress; + default: + return server.ManualAddress || server.LocalAddress || server.RemoteAddress; + } +} + +function updateServerInfo(server, systemInfo) { + server.Name = systemInfo.ServerName; + + if (systemInfo.Id) { + server.Id = systemInfo.Id; + } + + if (systemInfo.LocalAddress) { + server.LocalAddress = systemInfo.LocalAddress; + } +} + +function normalizeAddress(address) { + // Attempt to correct bad input + address = address.trim(); + + // Seeing failures in iOS when protocol isn't lowercase + address = address.replace('Http:', 'http:'); + address = address.replace('Https:', 'https:'); + + return address; +} + +function sortByAccess(a, b) { + return (b.DateLastAccessed || 0) - (a.DateLastAccessed || 0); +} + +export default class ConnectionManager { + constructor(credentialProvider, appName, appVersion, deviceName, deviceId, capabilities) { + console.log('Begin ConnectionManager constructor'); + + const self = this; + this._apiClients = []; + + // Set the minimum version to match the SDK + self._minServerVersion = MINIMUM_VERSION; + + self.appVersion = () => appVersion; + + self.appName = () => appName; + + self.capabilities = () => capabilities; + + self.deviceId = () => deviceId; + + self.credentialProvider = () => credentialProvider; + + self.getServerInfo = (id) => { + const servers = credentialProvider.credentials().Servers; + + return servers.filter((s) => s.Id === id)[0]; + }; + + self.getLastUsedServer = () => { + const servers = credentialProvider.credentials().Servers; + + servers.sort(sortByAccess); + + if (!servers.length) { + return null; + } + + return servers[0]; + }; + + self.addApiClient = (apiClient) => { + self._apiClients.push(apiClient); + + const existingServers = credentialProvider + .credentials() + .Servers.filter( + (s) => + equalsIgnoreCase(s.ManualAddress, apiClient.serverAddress()) + || equalsIgnoreCase(s.LocalAddress, apiClient.serverAddress()) + || equalsIgnoreCase(s.RemoteAddress, apiClient.serverAddress()) + ); + + const existingServer = existingServers.length ? existingServers[0] : apiClient.serverInfo(); + existingServer.DateLastAccessed = new Date().getTime(); + existingServer.LastConnectionMode = ConnectionMode.Manual; + existingServer.ManualAddress = apiClient.serverAddress(); + + if (apiClient.manualAddressOnly) { + existingServer.manualAddressOnly = true; + } + + apiClient.serverInfo(existingServer); + + apiClient.onAuthenticated = (instance, result) => onAuthenticated(instance, result, {}, true); + + if (!existingServers.length) { + const credentials = credentialProvider.credentials(); + credentials.Servers = [existingServer]; + credentialProvider.credentials(credentials); + } + + events.trigger(self, 'apiclientcreated', [apiClient]); + }; + + self.clearData = () => { + console.log('connection manager clearing data'); + + const credentials = credentialProvider.credentials(); + credentials.Servers = []; + credentialProvider.credentials(credentials); + }; + + self._getOrAddApiClient = (server, serverUrl) => { + let apiClient = self.getApiClient(server.Id); + + if (!apiClient) { + apiClient = new ApiClient(serverUrl, appName, appVersion, deviceName, deviceId); + + self._apiClients.push(apiClient); + + apiClient.serverInfo(server); + + apiClient.onAuthenticated = (instance, result) => { + return onAuthenticated(instance, result, {}, true); + }; + + events.trigger(self, 'apiclientcreated', [apiClient]); + } + + console.log('returning instance from getOrAddApiClient'); + return apiClient; + }; + + self.getOrCreateApiClient = (serverId) => { + const credentials = credentialProvider.credentials(); + const servers = credentials.Servers.filter((s) => equalsIgnoreCase(s.Id, serverId)); + + if (!servers.length) { + throw new Error(`Server not found: ${serverId}`); + } + + const server = servers[0]; + + return self._getOrAddApiClient(server, getServerAddress(server, server.LastConnectionMode)); + }; + + function onAuthenticated(apiClient, result, options, saveCredentials) { + const credentials = credentialProvider.credentials(); + const servers = credentials.Servers.filter((s) => s.Id === result.ServerId); + + const server = servers.length ? servers[0] : apiClient.serverInfo(); + + if (options.updateDateLastAccessed !== false) { + server.DateLastAccessed = new Date().getTime(); + } + server.Id = result.ServerId; + + if (saveCredentials) { + server.UserId = result.User.Id; + server.AccessToken = result.AccessToken; + } else { + server.UserId = null; + server.AccessToken = null; + } + + credentialProvider.addOrUpdateServer(credentials.Servers, server); + credentialProvider.credentials(credentials); + + // set this now before updating server info, otherwise it won't be set in time + apiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection; + + apiClient.serverInfo(server); + apiClient.setAuthenticationInfo(result.AccessToken, result.User.Id); + afterConnected(apiClient, options); + + return onLocalUserSignIn(server, apiClient.serverAddress(), result.User); + } + + function afterConnected(apiClient, options = {}) { + if (options.reportCapabilities !== false) { + apiClient.reportCapabilities(capabilities); + } + apiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection; + + if (options.enableWebSocket !== false) { + console.log('calling apiClient.ensureWebSocket'); + + apiClient.ensureWebSocket(); + } + } + + function onLocalUserSignIn(server, serverUrl, user) { + // Ensure this is created so that listeners of the event can get the apiClient instance + self._getOrAddApiClient(server, serverUrl); + + // This allows the app to have a single hook that fires before any other + const promise = self.onLocalUserSignedIn ? self.onLocalUserSignedIn.call(self, user) : Promise.resolve(); + + return promise.then(() => { + events.trigger(self, 'localusersignedin', [user]); + }); + } + + function validateAuthentication(server, serverUrl) { + return ajax({ + type: 'GET', + url: `${serverUrl}/System/Info`, + dataType: 'json', + headers: { + [AUTHORIZATION_HEADER]: getAuthorizationHeader( + { + name: appName, + version: appVersion + }, + { + id: deviceId, + name: deviceName + }, + server.AccessToken + ) + } + }).then( + (systemInfo) => { + updateServerInfo(server, systemInfo); + return Promise.resolve(); + }, + () => { + server.UserId = null; + server.AccessToken = null; + return Promise.resolve(); + } + ); + } + + function getImageUrl(localUser) { + if (localUser && localUser.PrimaryImageTag) { + const apiClient = self.getApiClient(localUser); + + const url = apiClient.getUserImageUrl(localUser.Id, { + tag: localUser.PrimaryImageTag, + type: 'Primary' + }); + + return { + url, + supportsParams: true + }; + } + + return { + url: null, + supportsParams: false + }; + } + + self.user = (apiClient) => + new Promise((resolve) => { + let localUser; + + function onLocalUserDone() { + if (apiClient && apiClient.getCurrentUserId()) { + apiClient.getCurrentUser().then((u) => { + localUser = u; + const image = getImageUrl(localUser); + + resolve({ + localUser, + name: localUser ? localUser.Name : null, + imageUrl: image.url, + supportsImageParams: image.supportsParams + }); + }); + } + } + + if (apiClient && apiClient.getCurrentUserId()) { + onLocalUserDone(); + } + }); + + self.logout = () => { + const promises = []; + + for (let i = 0, length = self._apiClients.length; i < length; i++) { + const apiClient = self._apiClients[i]; + + if (apiClient.accessToken()) { + promises.push(logoutOfServer(apiClient)); + } + } + + return Promise.all(promises).then(() => { + const credentials = credentialProvider.credentials(); + + const servers = credentials.Servers.filter((u) => u.UserLinkType !== 'Guest'); + + for (let j = 0, numServers = servers.length; j < numServers; j++) { + const server = servers[j]; + + server.UserId = null; + server.AccessToken = null; + server.ExchangeToken = null; + } + }); + }; + + function logoutOfServer(apiClient) { + const serverInfo = apiClient.serverInfo() || {}; + + const logoutInfo = { + serverId: serverInfo.Id + }; + + return apiClient.logout().then( + () => { + events.trigger(self, 'localusersignedout', [logoutInfo]); + }, + () => { + events.trigger(self, 'localusersignedout', [logoutInfo]); + } + ); + } + + self.getSavedServers = () => { + const credentials = credentialProvider.credentials(); + + const servers = credentials.Servers.slice(0); + + servers.sort(sortByAccess); + + return servers; + }; + + self.getAvailableServers = () => { + console.debug('[ConnectionManager] Begin getAvailableServers'); + + // Clone the array + const credentials = credentialProvider.credentials(); + + return findServers().then(foundServers => { + const servers = credentials.Servers.slice(0); + foundServers.forEach(server => { + credentialProvider.addOrUpdateServer(servers, server); + }); + + servers.sort(sortByAccess); + credentials.Servers = servers; + credentialProvider.credentials(credentials); + + return servers; + }); + }; + + function findServers() { + return new Promise((resolve) => { + const onFinish = function (foundServers) { + const servers = foundServers.map((foundServer) => { + const info = { + Id: foundServer.Id, + LocalAddress: convertEndpointAddressToManualAddress(foundServer) || foundServer.Address, + Name: foundServer.Name + }; + info.LastConnectionMode = info.ManualAddress ? ConnectionMode.Manual : ConnectionMode.Local; + return info; + }); + resolve(servers); + }; + + if (window && window.NativeShell && typeof window.NativeShell.findServers === 'function') { + window.NativeShell.findServers(1e3).then(onFinish, function () { + onFinish([]); + }); + } else { + resolve([]); + } + }); + } + + function convertEndpointAddressToManualAddress(info) { + if (info.Address && info.EndpointAddress) { + let address = info.EndpointAddress.split(':')[0]; + + // Determine the port, if any + const parts = info.Address.split(':'); + if (parts.length > 1) { + const portString = parts[parts.length - 1]; + + if (!isNaN(parseInt(portString, 10))) { + address += `:${portString}`; + } + } + + return normalizeAddress(address); + } + + return null; + } + + self.connectToServers = (servers, options) => { + console.log(`Begin connectToServers, with ${servers.length} servers`); + + const firstServer = servers.length ? servers[0] : null; + // See if we have any saved credentials and can auto sign in + if (firstServer) { + return self.connectToServer(firstServer, options).then((result) => { + console.log('resolving connectToServers with result.State: ' + result.State); + return result; + }); + } + + return Promise.resolve({ + Servers: servers, + State: ConnectionState.ServerSelection + }); + }; + + function getTryConnectPromise(url, connectionMode, state, resolve, reject) { + console.log('getTryConnectPromise ' + url); + + ajax({ + url: `${url}/System/Info/Public`, + timeout: DEFAULT_CONNECTION_TIMEOUT, + type: 'GET', + dataType: 'json' + }).then( + (result) => { + if (!state.resolved) { + state.resolved = true; + + console.log('Reconnect succeeded to ' + url); + resolve({ + url: url, + connectionMode: connectionMode, + data: result + }); + } + }, + () => { + console.log('Reconnect failed to ' + url); + + if (!state.resolved) { + state.rejects++; + if (state.rejects >= state.numAddresses) { + reject(); + } + } + } + ); + } + + function tryReconnect(serverInfo) { + const addresses = []; + const addressesStrings = []; + + // the timeouts are a small hack to try and ensure the remote address doesn't resolve first + + // manualAddressOnly is used for the local web app that always connects to a fixed address + if ( + !serverInfo.manualAddressOnly + && serverInfo.LocalAddress + && addressesStrings.indexOf(serverInfo.LocalAddress) === -1 + ) { + addresses.push({ + url: serverInfo.LocalAddress, + mode: ConnectionMode.Local, + timeout: 0 + }); + addressesStrings.push(addresses[addresses.length - 1].url); + } + if (serverInfo.ManualAddress && addressesStrings.indexOf(serverInfo.ManualAddress) === -1) { + addresses.push({ + url: serverInfo.ManualAddress, + mode: ConnectionMode.Manual, + timeout: 100 + }); + addressesStrings.push(addresses[addresses.length - 1].url); + } + if ( + !serverInfo.manualAddressOnly + && serverInfo.RemoteAddress + && addressesStrings.indexOf(serverInfo.RemoteAddress) === -1 + ) { + addresses.push({ + url: serverInfo.RemoteAddress, + mode: ConnectionMode.Remote, + timeout: 200 + }); + addressesStrings.push(addresses[addresses.length - 1].url); + } + + console.info('[ConnectionManager] tryReconnect addresses', addressesStrings); + + return new Promise((resolve, reject) => { + const state = {}; + state.numAddresses = addresses.length; + state.rejects = 0; + + addresses.forEach((url) => { + setTimeout(() => { + if (!state.resolved) { + getTryConnectPromise(url.url, url.mode, state, resolve, reject); + } + }, url.timeout); + }); + }); + }; + + self.connectToServer = (server, options) => { + console.debug('[ConnectionManager] begin connectToServer'); + + return new Promise((resolve) => { + options = options || {}; + + tryReconnect(server).then( + (result) => { + const serverUrl = result.url; + const connectionMode = result.connectionMode; + result = result.data; + + if (compareVersions(self.minServerVersion(), result.Version) === 1) { + console.warn('[ConnectionManager] minServerVersion requirement not met. Server version:', result.Version); + resolve({ + State: ConnectionState.ServerUpdateNeeded, + Servers: [server] + }); + } else if (server.Id && result.Id !== server.Id) { + console.warn( + '[ConnectionManager] http request succeeded, but found a different server Id than what was expected' + ); + resolve({ + State: ConnectionState.ServerMismatch + }); + } else { + onSuccessfulConnection(server, result, connectionMode, serverUrl, true, resolve, options); + } + }, + () => { + resolve({ + State: ConnectionState.Unavailable + }); + } + ); + }); + }; + + function onSuccessfulConnection(server, systemInfo, connectionMode, serverUrl, verifyLocalAuthentication, resolve, options = {}) { + const credentials = credentialProvider.credentials(); + + if (options.enableAutoLogin === false) { + server.UserId = null; + server.AccessToken = null; + } else if (server.AccessToken && verifyLocalAuthentication) { + void validateAuthentication(server, serverUrl).then(function () { + onSuccessfulConnection(server, systemInfo, connectionMode, serverUrl, false, resolve, options); + }); + return; + } + + updateServerInfo(server, systemInfo); + + server.LastConnectionMode = connectionMode; + + if (options.updateDateLastAccessed !== false) { + server.DateLastAccessed = new Date().getTime(); + } + credentialProvider.addOrUpdateServer(credentials.Servers, server); + credentialProvider.credentials(credentials); + + const result = { + Servers: [] + }; + + result.ApiClient = self._getOrAddApiClient(server, serverUrl); + + result.ApiClient.setSystemInfo(systemInfo); + result.SystemInfo = systemInfo; + + result.State = server.AccessToken && options.enableAutoLogin !== false ? ConnectionState.SignedIn : ConnectionState.ServerSignIn; + + result.Servers.push(server); + + // set this now before updating server info, otherwise it won't be set in time + result.ApiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection; + + result.ApiClient.updateServerInfo(server, serverUrl); + result.ApiClient.setAuthenticationInfo(server.AccessToken, server.UserId); + + const resolveActions = function () { + resolve(result); + + events.trigger(self, 'connected', [result]); + }; + + if (result.State === ConnectionState.SignedIn) { + afterConnected(result.ApiClient, options); + + result.ApiClient.getCurrentUser().then((user) => { + onLocalUserSignIn(server, serverUrl, user).then(resolveActions, resolveActions); + }, resolveActions); + } else { + resolveActions(); + } + } + + self.updateSavedServerId = async (server) => { + const { data: serverResponse } = await tryReconnect(server); + // Update the server ID to match the new value + server.Id = serverResponse.Id; + // Force the user to login again + server.AccessToken = null; + server.UserId = null; + + // Save the updated server in the credential provider + const credentials = credentialProvider.credentials(); + credentialProvider.addOrUpdateServer(credentials.Servers, server); + credentialProvider.credentials(credentials); + }; + + function tryConnectToAddress(address, options) { + const server = { + ManualAddress: address, + LastConnectionMode: ConnectionMode.Manual + }; + + return self.connectToServer(server, options).then((result) => { + // connectToServer never rejects, but resolves with State=ConnectionState.Unavailable + if (result.State === ConnectionState.Unavailable) { + return Promise.reject(); + } + return result; + }); + } + + self.connectToAddress = function (address, options) { + if (!address) { + return Promise.reject(); + } + + address = normalizeAddress(address); + + const urls = []; + + if (/^[^:]+:\/\//.test(address)) { + // Protocol specified - connect as is + urls.push(address); + } else { + urls.push(`https://${address}`); + urls.push(`http://${address}`); + } + + let i = 0; + + function onFail() { + console.log(`connectToAddress ${urls[i]} failed`); + + if (++i < urls.length) { + return tryConnectToAddress(urls[i], options).catch(onFail); + } + + return Promise.resolve({ + State: ConnectionState.Unavailable + }); + } + + return tryConnectToAddress(urls[i], options).catch(onFail); + }; + + self.deleteServer = (serverId) => { + if (!serverId) { + throw new Error('null serverId'); + } + + let server = credentialProvider.credentials().Servers.filter((s) => s.Id === serverId); + server = server.length ? server[0] : null; + + return new Promise((resolve) => { + function onDone() { + const credentials = credentialProvider.credentials(); + + credentials.Servers = credentials.Servers.filter((s) => s.Id !== serverId); + + credentialProvider.credentials(credentials); + resolve(); + } + + if (!server.ConnectServerId) { + onDone(); + } + }); + }; + } + + connect(options) { + console.log('Begin connect'); + + return this.getAvailableServers().then((servers) => { + return this.connectToServers(servers, options); + }); + } + + handleMessageReceived(msg) { + const serverId = msg.ServerId; + if (serverId) { + const apiClient = this.getApiClient(serverId); + if (apiClient) { + if (typeof msg.Data === 'string') { + try { + msg.Data = JSON.parse(msg.Data); + } catch (err) { + console.log('unable to parse json content: ' + err); + } + } + + apiClient.handleMessageReceived(msg); + } + } + } + + getApiClients() { + const servers = this.getSavedServers(); + + for (let i = 0, length = servers.length; i < length; i++) { + const server = servers[i]; + if (server.Id) { + this._getOrAddApiClient(server, getServerAddress(server, server.LastConnectionMode)); + } + } + + return this._apiClients; + } + + /** + * Gets the ApiClient for a given BaseItem or ServerId. + * @param {import('@jellyfin/sdk/lib/generated-client').BaseItemDto | string | undefined} item + * @returns {ApiClient} + */ + getApiClient(item) { + if (!item) { + throw new Error('item or serverId cannot be null'); + } + + // Accept string + object + if (item.ServerId) { + item = item.ServerId; + } + + return this._apiClients.filter((a) => { + const serverInfo = a.serverInfo(); + + // We have to keep this hack in here because of the addApiClient method + return !serverInfo || serverInfo.Id === item; + })[0]; + } + + minServerVersion(val) { + if (val) { + this._minServerVersion = val; + } + + return this._minServerVersion; + } +} diff --git a/src/lib/jellyfin-apiclient/connectionMode.ts b/src/lib/jellyfin-apiclient/connectionMode.ts new file mode 100644 index 000000000..d915ed5d4 --- /dev/null +++ b/src/lib/jellyfin-apiclient/connectionMode.ts @@ -0,0 +1,6 @@ +/** The mode used to connect to a server. */ +export const enum ConnectionMode { + Local = 0, + Remote = 1, + Manual = 2 +} diff --git a/src/utils/jellyfin-apiclient/ConnectionState.ts b/src/lib/jellyfin-apiclient/connectionState.ts similarity index 78% rename from src/utils/jellyfin-apiclient/ConnectionState.ts rename to src/lib/jellyfin-apiclient/connectionState.ts index 134a7ffce..b47d6909c 100644 --- a/src/utils/jellyfin-apiclient/ConnectionState.ts +++ b/src/lib/jellyfin-apiclient/connectionState.ts @@ -1,8 +1,9 @@ /** * Server state values for a connected server used by jellyfin-apiclient. */ -export enum ConnectionState { +export const enum ConnectionState { SignedIn = 'SignedIn', + ServerMismatch = 'ServerMismatch', ServerSignIn = 'ServerSignIn', ServerSelection = 'ServerSelection', ServerUpdateNeeded = 'ServerUpdateNeeded', diff --git a/src/lib/jellyfin-apiclient/index.ts b/src/lib/jellyfin-apiclient/index.ts new file mode 100644 index 000000000..ce919d85f --- /dev/null +++ b/src/lib/jellyfin-apiclient/index.ts @@ -0,0 +1,3 @@ +export { ConnectionMode } from './connectionMode'; +export { ConnectionState } from './connectionState'; +export { default as ServerConnections } from './ServerConnections'; diff --git a/src/lib/jellyfin-apiclient/utils/compareVersions.ts b/src/lib/jellyfin-apiclient/utils/compareVersions.ts new file mode 100644 index 000000000..82b8ee00f --- /dev/null +++ b/src/lib/jellyfin-apiclient/utils/compareVersions.ts @@ -0,0 +1,22 @@ +export function compareVersions(a: string = '', b: string = '') { + // -1 a is smaller + // 1 a is larger + // 0 equal + const aParts = a.split('.'); + const bParts = b.split('.'); + + for (let i = 0, length = Math.max(aParts.length, bParts.length); i < length; i++) { + const aVal = parseInt(aParts[i] || '0', 10); + const bVal = parseInt(bParts[i] || '0', 10); + + if (aVal < bVal) { + return -1; + } + + if (aVal > bVal) { + return 1; + } + } + + return 0; +} diff --git a/src/lib/legacy/elementAppendPrepend.js b/src/lib/legacy/elementAppendPrepend.js new file mode 100644 index 000000000..53039f451 --- /dev/null +++ b/src/lib/legacy/elementAppendPrepend.js @@ -0,0 +1,75 @@ +/** + * MIT License + * + * Copyright (c) 2016-2025, jszhou + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +// From https://gist.github.com/jickoo/7b4122829240cc415c098aab89d6f49d + +// Source: https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/append()/append().md +(function (arr) { + arr.forEach(function (item) { + if (Object.prototype.hasOwnProperty.call(item, 'append')) { + return; + } + Object.defineProperty(item, 'append', { + configurable: true, + enumerable: true, + writable: true, + value: function append() { + const argArr = Array.prototype.slice.call(arguments); + const docFrag = document.createDocumentFragment(); + + argArr.forEach(function (argItem) { + const isNode = argItem instanceof Node; + docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem))); + }); + + this.appendChild(docFrag); + } + }); + }); +})([Element.prototype, Document.prototype, DocumentFragment.prototype]); + +// Source: https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/prepend()/prepend().md +(function (arr) { + arr.forEach(function (item) { + if (Object.prototype.hasOwnProperty.call(item, 'prepend')) { + return; + } + Object.defineProperty(item, 'prepend', { + configurable: true, + enumerable: true, + writable: true, + value: function prepend() { + const argArr = Array.prototype.slice.call(arguments); + const docFrag = document.createDocumentFragment(); + + argArr.forEach(function (argItem) { + const isNode = argItem instanceof Node; + docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem))); + }); + + this.insertBefore(docFrag, this.firstChild); + } + }); + }); +})([Element.prototype, Document.prototype, DocumentFragment.prototype]); diff --git a/src/lib/legacy/index.ts b/src/lib/legacy/index.ts index 9a836578e..fadde20eb 100644 --- a/src/lib/legacy/index.ts +++ b/src/lib/legacy/index.ts @@ -1,14 +1,17 @@ import 'core-js/stable'; import 'regenerator-runtime/runtime'; import 'jquery'; +import 'element-closest-polyfill'; import 'fast-text-encoding'; import 'intersection-observer'; import 'classlist.js'; import 'whatwg-fetch'; import 'abortcontroller-polyfill'; // requires fetch import 'resize-observer-polyfill'; +import 'proxy-polyfill'; import './domParserTextHtml'; +import './elementAppendPrepend'; import './focusPreventScroll'; import './htmlMediaElement'; import './keyboardEvent'; diff --git a/src/plugins/backdropScreensaver/plugin.js b/src/plugins/backdropScreensaver/plugin.js index 1058be5be..fc22fbb4b 100644 --- a/src/plugins/backdropScreensaver/plugin.js +++ b/src/plugins/backdropScreensaver/plugin.js @@ -1,7 +1,7 @@ -import ServerConnections from '../../components/ServerConnections'; -import { PluginType } from '../../types/plugin.ts'; -import * as userSettings from '../../scripts/settings/userSettings'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import * as userSettings from 'scripts/settings/userSettings'; +import { PluginType } from 'types/plugin.ts'; class BackdropScreensaver { constructor() { diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js index 733519cb3..1e0ad2a00 100644 --- a/src/plugins/bookPlayer/plugin.js +++ b/src/plugins/bookPlayer/plugin.js @@ -3,10 +3,10 @@ import 'material-design-icons-iconfont'; import loading from '../../components/loading/loading'; import keyboardnavigation from '../../scripts/keyboardNavigation'; import dialogHelper from '../../components/dialogHelper/dialogHelper'; -import ServerConnections from '../../components/ServerConnections'; import Screenfull from 'screenfull'; import TableOfContents from './tableOfContents'; import { translateHtml } from '../../lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import browser from 'scripts/browser'; import * as userSettings from '../../scripts/settings/userSettings'; import TouchHelper from 'scripts/touchHelper'; diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index 868f02691..a7c149ac4 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -3,8 +3,8 @@ import * as userSettings from '../../scripts/settings/userSettings'; import { playbackManager } from '../../components/playback/playbackmanager'; import globalize from '../../lib/globalize'; import CastSenderApi from './castSenderApi'; -import ServerConnections from '../../components/ServerConnections'; import alert from '../../components/alert'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; import { getItems } from '../../utils/jellyfin-apiclient/getItems.ts'; diff --git a/src/plugins/comicsPlayer/plugin.js b/src/plugins/comicsPlayer/plugin.js index 0e8f599a1..24d12f0c0 100644 --- a/src/plugins/comicsPlayer/plugin.js +++ b/src/plugins/comicsPlayer/plugin.js @@ -3,7 +3,7 @@ import loading from '../../components/loading/loading'; import dialogHelper from '../../components/dialogHelper/dialogHelper'; import keyboardnavigation from '../../scripts/keyboardNavigation'; import { appRouter } from '../../components/router/appRouter'; -import ServerConnections from '../../components/ServerConnections'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import * as userSettings from '../../scripts/settings/userSettings'; import { PluginType } from '../../types/plugin.ts'; diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js index 029cdeca8..07f7e2d2f 100644 --- a/src/plugins/htmlAudioPlayer/plugin.js +++ b/src/plugins/htmlAudioPlayer/plugin.js @@ -1,3 +1,6 @@ +import { AppFeature } from 'constants/appFeature'; +import { MediaError } from 'types/mediaError'; + import browser from '../../scripts/browser'; import { appHost } from '../../components/apphost'; import * as htmlMediaHelper from '../../components/htmlMediaHelper'; @@ -5,7 +8,6 @@ import profileBuilder from '../../scripts/browserDeviceProfile'; import { getIncludeCorsCredentials } from '../../scripts/settings/webSettings'; import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; -import { MediaError } from 'types/mediaError'; function getDefaultProfile() { return profileBuilder({}); @@ -69,7 +71,7 @@ function enableHlsPlayer(url, item, mediaSource, mediaType) { // issue head request to get content type return new Promise(function (resolve, reject) { - import('../../components/fetchhelper').then((fetchHelper) => { + import('../../utils/fetch').then((fetchHelper) => { fetchHelper.ajax({ url: url, type: 'HEAD' @@ -278,7 +280,7 @@ class HtmlAudioPlayer { } // TODO: Move volume control to PlaybackManager. Player should just be a wrapper that translates commands into API calls. - if (!appHost.supports('physicalvolumecontrol')) { + if (!appHost.supports(AppFeature.PhysicalVolumeControl)) { elem.volume = htmlMediaHelper.getSavedVolume(); } diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 5afc9d182..b647c5dcb 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1,4 +1,10 @@ import DOMPurify from 'dompurify'; +import debounce from 'lodash-es/debounce'; +import Screenfull from 'screenfull'; + +import { AppFeature } from 'constants/appFeature'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import { MediaError } from 'types/mediaError'; import browser from '../../scripts/browser'; import appSettings from '../../scripts/settings/appSettings'; @@ -27,9 +33,7 @@ import { getBufferedRanges } from '../../components/htmlMediaHelper'; import itemHelper from '../../components/itemHelper'; -import Screenfull from 'screenfull'; import globalize from '../../lib/globalize'; -import ServerConnections from '../../components/ServerConnections'; import profileBuilder, { canPlaySecondaryAudio } from '../../scripts/browserDeviceProfile'; import { getIncludeCorsCredentials } from '../../scripts/settings/webSettings'; import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../components/backdrop/backdrop'; @@ -37,8 +41,6 @@ import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; import { includesAny } from '../../utils/container.ts'; import { isHls } from '../../utils/mediaSource.ts'; -import debounce from 'lodash-es/debounce'; -import { MediaError } from 'types/mediaError'; /** * Returns resolved URL. @@ -451,6 +453,7 @@ export class HtmlVideoPlayer { startPosition: options.playerStartPositionTicks / 10000000, manifestLoadingTimeOut: 20000, maxBufferLength: maxBufferLength, + maxMaxBufferLength: maxBufferLength, videoPreference: { preferHDR: true }, xhrSetup(xhr) { xhr.withCredentials = includeCorsCredentials; @@ -1532,10 +1535,16 @@ export class HtmlVideoPlayer { // in safari, the cues need to be added before setting the track mode to showing for (const trackEvent of data.TrackEvents) { const TrackCue = window.VTTCue || window.TextTrackCue; - const cue = new TrackCue(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text, false)); + const text = normalizeTrackEventText(trackEvent.Text, false); + const cue = new TrackCue(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, text); if (cue.line === 'auto') { - cue.line = cueLine; + if (cueLine < 0) { + const lineCount = (text.match(/\n/g) || []).length; + cue.line = cueLine - lineCount; + } else { + cue.line = cueLine; + } } trackElement.addCue(cue); @@ -1661,7 +1670,7 @@ export class HtmlVideoPlayer { const cssClass = 'htmlvideoplayer'; // Can't autoplay in these browsers so we need to use the full controls, at least until playback starts - if (!appHost.supports('htmlvideoautoplay')) { + if (!appHost.supports(AppFeature.HtmlVideoAutoplay)) { html += '
'; diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index fe93f8bd7..e4ddf726b 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -4,7 +4,10 @@ import Headroom from 'headroom.js'; // eslint-disable-next-line @typescript-eslint/no-unused-vars import { ApiClient } from 'jellyfin-apiclient'; +import { AppFeature } from 'constants/appFeature'; import { getUserViewsQuery } from 'hooks/useUserViews'; +import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { EventType } from 'types/eventType'; import { toApi } from 'utils/jellyfin-apiclient/compat'; import { queryClient } from 'utils/query/queryClient'; @@ -19,11 +22,9 @@ import { playbackManager } from '../components/playback/playbackmanager'; import { pluginManager } from '../components/pluginManager'; import groupSelectionMenu from '../plugins/syncPlay/ui/groupSelectionMenu'; import browser from './browser'; -import globalize from 'lib/globalize'; import imageHelper from '../utils/image'; import { getMenuLinks } from '../scripts/settings/webSettings'; import Dashboard, { pageClassOn } from '../utils/dashboard'; -import ServerConnections from '../components/ServerConnections'; import { PluginType } from '../types/plugin.ts'; import Events from '../utils/events.ts'; import { getParameterByName } from '../utils/url.ts'; @@ -348,14 +349,14 @@ function refreshLibraryInfoInDrawer(user) { html += globalize.translate('HeaderUser'); html += ''; - if (appHost.supports('multiserver')) { + if (appHost.supports(AppFeature.MultiServer)) { html += `${globalize.translate('SelectServer')}`; } html += `${globalize.translate('Settings')}`; html += `${globalize.translate('ButtonSignOut')}`; - if (appHost.supports('exitmenu')) { + if (appHost.supports(AppFeature.ExitMenu)) { html += `${globalize.translate('ButtonExitApp')}`; } diff --git a/src/scripts/playlistViewer.js b/src/scripts/playlistViewer.js index 524086312..2bb15930d 100644 --- a/src/scripts/playlistViewer.js +++ b/src/scripts/playlistViewer.js @@ -1,7 +1,7 @@ import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api'; -import ServerConnections from 'components/ServerConnections'; import listView from 'components/listview/listview'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; import { toApi } from 'utils/jellyfin-apiclient/compat'; function getFetchPlaylistItemsFn(apiClient, itemId) { diff --git a/src/scripts/screensavermanager.js b/src/scripts/screensavermanager.js index fccc2751a..d0b5ef1b9 100644 --- a/src/scripts/screensavermanager.js +++ b/src/scripts/screensavermanager.js @@ -1,10 +1,11 @@ -import { playbackManager } from '../components/playback/playbackmanager'; -import { pluginManager } from '../components/pluginManager'; +import { playbackManager } from 'components/playback/playbackmanager'; +import { pluginManager } from 'components/pluginManager'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import { PluginType } from 'types/plugin.ts'; +import Events from 'utils/events.ts'; + import inputManager from './inputManager'; import * as userSettings from './settings/userSettings'; -import ServerConnections from '../components/ServerConnections'; -import { PluginType } from '../types/plugin.ts'; -import Events from '../utils/events.ts'; import './screensavermanager.scss'; diff --git a/src/scripts/serverNotifications.js b/src/scripts/serverNotifications.js index 00088ef29..0f9353dcf 100644 --- a/src/scripts/serverNotifications.js +++ b/src/scripts/serverNotifications.js @@ -1,13 +1,13 @@ -import { playbackManager } from '../components/playback/playbackmanager'; -import { pluginManager } from '../components/pluginManager'; -import inputManager from '../scripts/inputManager'; -import focusManager from '../components/focusManager'; -import { appRouter } from '../components/router/appRouter'; -import ServerConnections from '../components/ServerConnections'; -import toast from '../components/toast/toast'; -import alert from '../components/alert'; -import Events from '../utils/events.ts'; -import { PluginType } from '../types/plugin.ts'; +import alert from 'components/alert'; +import focusManager from 'components/focusManager'; +import { playbackManager } from 'components/playback/playbackmanager'; +import { pluginManager } from 'components/pluginManager'; +import { appRouter } from 'components/router/appRouter'; +import toast from 'components/toast/toast'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import inputManager from 'scripts/inputManager'; +import Events from 'utils/events.ts'; +import { PluginType } from 'types/plugin.ts'; const serverNotifications = {}; diff --git a/src/scripts/shell.js b/src/scripts/shell.js index 979db02c8..0f8ecb17e 100644 --- a/src/scripts/shell.js +++ b/src/scripts/shell.js @@ -15,6 +15,11 @@ export default { window.NativeShell.openClientSettings(); } }, + openDownloadManager: () => { + if (window.NativeShell?.openDownloadManager) { + window.NativeShell.openDownloadManager(); + } + }, openUrl: function(url, target) { if (window.NativeShell?.openUrl) { window.NativeShell.openUrl(url, target); diff --git a/src/scripts/taskbutton.js b/src/scripts/taskbutton.js index 0bc9c0ab8..8a4979b60 100644 --- a/src/scripts/taskbutton.js +++ b/src/scripts/taskbutton.js @@ -1,10 +1,10 @@ -import serverNotifications from '../scripts/serverNotifications'; -import globalize from '../lib/globalize'; -import ServerConnections from '../components/ServerConnections'; -import Events from '../utils/events.ts'; +import globalize from 'lib/globalize'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; +import serverNotifications from 'scripts/serverNotifications'; +import Events from 'utils/events.ts'; -import '../elements/emby-button/emby-button'; +import 'elements/emby-button/emby-button'; function taskbutton(options) { function pollTasks() { diff --git a/src/strings/ar.json b/src/strings/ar.json index 3608e3499..c58f0f05d 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -10,7 +10,7 @@ "BirthDateValue": "وُلد: {0}", "BirthPlaceValue": "مكان الميلاد: {0}", "Browse": "تصفح", - "MessageBrowsePluginCatalog": "تصفح قائمتنا للملحق لترى المتوفر من الملاحق.", + "MessageBrowsePluginCatalog": "تصفح قائمتنا للاضافات لترى المتوفر .", "ButtonAddMediaLibrary": "إضافة مكتبة وسائط", "ButtonAddScheduledTaskTrigger": "إضافة معيار", "ButtonAddServer": "إضافة خادم", @@ -500,13 +500,13 @@ "MessageAlreadyInstalled": "هذا الإصدار تم تثبيته مسبقاً.", "MessageAreYouSureYouWishToRemoveMediaFolder": "هل أنت متأكد أنك تريد إزالة مجلد الوسائط هذا؟", "MessageConfirmDeleteGuideProvider": "هل أنت متأكد أنك ترغب في حذف مزود الدليل هذا؟", - "MessageConfirmDeleteTunerDevice": "هل أنت متأكد أنك تريد حذف هذا المولف؟", + "MessageConfirmDeleteTunerDevice": "هل أنت متأكد أنك تريد حذف هذا الجهاز؟", "MessageConfirmProfileDeletion": "هل أنت متأكد أنك تريد حذف هذه العريضة؟", - "MessageConfirmRemoveMediaLocation": "هل أنت متأكد أنك تريد حذف هذا المكان؟", - "MessageConfirmRestart": "هل أنت متأكد أنك تريد أن تعيد تشغيل خادم Jellyfin؟", + "MessageConfirmRemoveMediaLocation": "هل أنت متأكد أنك تريد حذف هذا الموقع؟", + "MessageConfirmRestart": "هل أنت متأكد أنك تريد أن تعيد تشغيل سيرفر Jellyfin؟", "MessageConfirmRevokeApiKey": "هل أنت متأكد من رغبتك في إبطال مفتاح واجهة برمجة التطبيقات هذا؟ سيتم إنهاء اتصال التطبيق بهذا الخادم بشكل مفاجئ.", - "MessageConfirmShutdown": "هل أنت متأكد أنك تريد أن تنهي تشغيل الخادم؟", - "MessageContactAdminToResetPassword": "الرجاء التواصل مع مدير النظام لإعادة أعداد كملة سرّك.", + "MessageConfirmShutdown": "هل أنت متأكد أنك تريد ايقاف السيرفر؟", + "MessageContactAdminToResetPassword": "الرجاء التواصل مع مدير النظام لإعادة أعداد كلمة السر.", "MessageCreateAccountAt": "أنشئ حساب في {0}", "MessageDeleteTaskTrigger": "هل أنت متأكد أنك تريد حذف زناد المهمة؟", "MessageDirectoryPickerBSDInstruction": "بالنسبة إلى BSD ، قد تحتاج إلى إعداد التخزين داخل \"FreeNAS Jail\" حتى يتمكن Jellyfin من الوصول إلى الوسائط الخاصة بك.", @@ -645,7 +645,7 @@ "RecommendationBecauseYouWatched": "لأنك شاهدت {0}", "RecommendationDirectedBy": "إخراج {0}", "RecommendationStarring": "بطولة {0}", - "MessageChangeRecordingPath": "إن تغيير مجلد التسجيل لم يهجّر التسجيلات الموجودة من الموقع القديم إلى الموقع الجديد. سيتعين عليك أن تنقلهم بنفسك لو شئت.", + "MessageChangeRecordingPath": "إن تغيير مجلد التسجيل لن ينقل التسجيلات الموجودة من الموقع القديم إلى الموقع الجديد. سيتعين عليك أن تنقلهم بنفسك .", "RememberMe": "تذكرنى", "Rewind": "الترجيع", "Saturday": "السبت", @@ -686,7 +686,7 @@ "TabStreaming": "التشغيل التدفقي", "TabUpcoming": "القادم", "TellUsAboutYourself": "اخبرنا عن نفسك", - "ThisWizardWillGuideYou": "مرشد الاعدادات سيساعدك خلال خطوات عملية الاعدادات. للبدء، الرجاء اختيار لغتك المفضلة.", + "ThisWizardWillGuideYou": "سيساعدك هذا المعالج في إرشادك خلال عملية الإعداد. للبدء، يرجى إدخال اسم الخادم وتحديد لغتك المفضلة.", "Thursday": "الخميس", "TitleHardwareAcceleration": "تسريع بعتاد الحاسوب", "TitleHostingSettings": "إعدادات الاستضافة", @@ -814,7 +814,7 @@ "MessageImageTypeNotSelected": "الرجاء اختيار نوع الصورة من القائمة المنسدلة.", "MessageImageFileTypeAllowed": "ملفات JPEG و PNG مدعومون فقط.", "MessageDownloadQueued": "تمت إضافة التحميل إلى قائمة الانتظار.", - "MessageConfirmRecordingCancellation": "الغاء التسجيل؟", + "MessageConfirmRecordingCancellation": "هل تريد الغاء التسجيل؟", "MessageAreYouSureDeleteSubtitles": "هل انت متأكد انك تريد حذف ملف الترجمة هذا؟", "Menu": "القائمة", "MediaIsBeingConverted": "يتم تحويل الوسط الى صيغة متوافقة مع الحهاز الذي يشغل الوسط.", @@ -1129,7 +1129,7 @@ "PackageInstallFailed": "{0} (الإصدار {1}) فشل تثبيت.", "PackageInstallCompleted": "اكتمل تثبيت {0} (الإصدار {1}).", "PackageInstallCancelled": "تم إلغاء تثبيت {0} (الإصدار {1}).", - "Overview": "ملخص", + "Overview": "نظرة عامة", "OptionRequirePerfectSubtitleMatchHelp": "سيؤدي طلب التطابق التام إلى تصفية الترجمات المصاحبة لتشمل فقط تلك التي تم اختبارها والتحقق منها بملف الفيديو الخاص بك بالضبط. سيؤدي إلغاء تحديد هذا إلى زيادة احتمالية تنزيل الترجمات المصاحبة ، لكنني سأزيد من فرص نص الترجمة الخاطئ أو غير الصحيح.", "OptionRegex": "ريجكس", "OptionRandom": "عشوائي", @@ -1310,10 +1310,10 @@ "LabelAudioInfo": "معلومات الصوت", "LabelPlaybackInfo": "معلومات التشغيل", "RemuxHelp1": "الوسائط موجودة في حاوية ملف غير متوافقة (MKV ، AVI ، WMV ، إلخ) ولكن كل من دفق الفيديو ودفق الصوت متوافقان مع الجهاز. سيتم إعادة تجميع الوسائط بدون فقدان بيانات بسرعة قبل إرسالها إلى الجهاز.", - "AspectRatioFill": "أملئ", + "AspectRatioFill": "التمدد", "EnableFallbackFontHelp": "تفعيل الخطوط البديلة المخصصة. يمكن أن يؤدي ذلك إلى تجنب مشكلة العرض غير الصحيح للترجمة.", "EnableFallbackFont": "تفعيل الخطوط الاحتياطية", - "LabelFallbackFontPathHelp": "هذه الخطوط تستخدم من قبل بعض برامج العرض لعرض الترجمات. يرجى الرجوع إلى الوثائق لمزيد من المعلومات.", + "LabelFallbackFontPathHelp": "يتم استخدام هذه الخطوط من قبل بعض العملاء لعرض الترجمات. يرجى الرجوع إلى الوثائق لمزيد من المعلومات.", "LabelFallbackFontPath": "مسار مجلد الخط الاحتياطي", "HeaderSelectFallbackFontPathHelp": "تصفح أو أدخل مسار مجلد الخط الاحتياطي لاستخدامه في عرض ترجمات ASS / SSA.", "HeaderSelectFallbackFontPath": "حدد مسار مجلد الخط الاحتياطي", @@ -1378,7 +1378,7 @@ "Share": "شارك", "SetUsingLastTracksHelp": "حاول ضبط العنوان الفرعي / المسار الصوتي على أقرب تطابق للفيديو الأخير.", "SetUsingLastTracks": "تعيين الترجمة / المسارات الصوتية مع العنصر السابق", - "ServerRestartNeededAfterPluginInstall": "سيحتاج Jellyfin إلى إعادة التشغيل بعد تثبيت البرنامج المساعد.", + "ServerRestartNeededAfterPluginInstall": "سيحتاج چيليفين إلى إعادة التشغيل بعد تثبيت البرنامج المساعد.", "ServerNameIsShuttingDown": "يتم إيقاف تشغيل الخادم في {0}.", "ServerNameIsRestarting": "يقوم الخادم في {0} بإعادة التشغيل.", "SeriesYearToPresent": "{0} - الحاضر", @@ -1433,7 +1433,7 @@ "LabelPersonRoleHelp": "مثال: سائق شاحنة الآيس كريم", "LabelPersonRole": "دور", "LabelPasswordResetProvider": "مزود إعادة تعيين كلمة المرور", - "LabelOverview": "ملخص", + "LabelOverview": "نظرة عامة", "LabelOriginalTitle": "العنوان الأصلي", "LabelOriginalName": "الاسم الاصلي", "LabelOriginalAspectRatio": "النسبة البعدينية الأصلية", @@ -1555,7 +1555,7 @@ "HeaderNewRepository": "مستودع جديد", "DirectPlayHelp": "الملف المصدر متوافق تمامًا مع هذا العميل والجلسة تستقبل الملف بدون تعديلات.", "LabelDashboardTheme": "قالب لوحة تحكم الخادم", - "LabelTonemappingParamHelp": "ضبط خوارزمية تعيين النغمة.‌ القيم الموصى بها والافتراضية هي NaN. اتركه فارغًا بشكل عام.", + "LabelTonemappingParamHelp": "اضبط خوارزمية تعيين النغمة. عادةً ما يُترك هذا الحقل فارغًا.", "LabelTonemappingParam": "معلمة تعيين النغمة", "LabelTonemappingDesat": "مُعدل تعيين النغمة", "LabelTonemappingAlgorithm": "حدد خوارزمية تعيين النغمة لاستخدامها", @@ -1571,7 +1571,7 @@ "AllowVppTonemappingHelp": "تعين النغمة الكامل للأجهزة باستخدام Intel. يعمل حاليًا فقط على أجهزة معينة مع مقاطع فيديو HDR10. هذا له أولوية أعلى مقارنة بتطبيق OpenCL آخر.", "EnableVppTonemapping": "تفعيل تعيين نغمة VPP", "Remuxing": "إعادة", - "AspectRatioCover": "غلاف", + "AspectRatioCover": "تكبير", "Typewriter": "آلة كاتبة", "TypeOptionPluralVideo": "فيديوهات", "TypeOptionPluralSeries": "مسلسلات", @@ -1596,7 +1596,7 @@ "LabelTonemappingThresholdHelp": "يتم ضبط معلمات خوارزمية تعيين النغمة لكل مشهد. ويتم استخدام عتبة لاكتشاف ما إذا كان المشهد قد تغير أم لا. إذا تجاوزت المسافة بين متوسط سطوع الإطار الحالي ومتوسط التشغيل الحالي قيمة عتبة ، فسنقوم بإعادة حساب متوسط سطوع المشهد وذروة السطوع. القيم الموصي بها والافتراضية هي 0.8 و 0.2.", "LabelTonemappingThreshold": "حد تعيين النغمة", "LabelTonemappingRange": "نطاق تعيين النغمة", - "LabelTonemappingPeakHelp": "تجاوز الإشارة / الذروة الاسمية / المرجعية بهذه القيمة. يكون مفيدًا عندما تكون معلومات الذروة المضمنة في البيانات الوصفية للعرض غير موثوقة أو عند تعيين درجة اللون من نطاق أقل إلى نطاق أعلى. القيم الموصي بها والافتراضية هي 100 و 0.", + "LabelTonemappingPeakHelp": "تجاوز قيمة البيانات الوصفية المضمنة لإشارة الإدخال بقيمة الذروة هذه بدلاً من ذلك. القيمة الافتراضية هي 100 (1000nit).", "LabelTonemappingPeak": "ذروة رسم الخرائط", "Cursive": "متّصل", "LabelHardwareEncodingOptions": "خيارات ترميز الأجهزة", @@ -1650,7 +1650,7 @@ "Bold": "عريض", "LabelTextWeight": "سمك الخط", "HomeVideosPhotos": "مقاطع الفيديو والصور", - "EnableSplashScreen": "قم بتفعيل شاشة البداية", + "EnableSplashScreen": "تمكين صورة شاشة البداية", "MediaInfoDvBlSignalCompatibilityId": "معرف توافق إشارة DV bl", "MediaInfoBlPresentFlag": "علامة الضبط المسبق لـ DV bl", "MediaInfoElPresentFlag": "DV el علم مسبق الضبط", @@ -1858,5 +1858,195 @@ "LabelLevel": "المستوى", "LabelDropLyricsHere": "ضع الكلمات هنا, أو إضغط على تفصح.", "LabelInstalled": "مثبت", - "LabelQsvDevice": "جهاز QSV" + "LabelQsvDevice": "جهاز QSV", + "CustomSplashScreenSize": "يجب أن تكون الصور المخصصة بنسبة عرض إلى ارتفاع 16 × 9 بحجم لا يقل عن 1920 × 1080.", + "ImageUploadFailed": "فشل تحميل الصورة", + "LabelDelimiterWhitelistHelp": "العناصر التي سيتم استبعادها من تقسيم العلامات. عنصر واحد لكل سطر.", + "LabelFallbackMaxStreamingBitrate": "معدل البت الأقصى للبث الاحتياطي (ميغابت في الثانية)", + "LabelMediaSegmentProviders": "مزودو مقاطع الوسائط", + "LabelMediaSegmentsType": "{0} مقطع/مقاطع", + "LabelParallelImageEncodingLimitHelp": "الحد الأقصى لعدد ترميزات الصور المسموح بتشغيلها بالتوازي. سيؤدي ترك هذا فارغًا إلى اختيار حد يستند إلى عدد النواة الأساسية لأنظمتك.", + "LabelQsvDeviceHelp": "حدد الجهاز الخاص ب Intel QSV على نظام متعدد وحدات معالجة الرسومات. في نظام Linux، هذا هو عقدة التصيير، على سبيل المثال، /dev/dri/renderD128. في نظام ويندوز، هذا هو فهرس الجهاز بدءًا من 0. اتركه فارغًا إلا إذا كنت تعرف ما تفعله.", + "LabelScreensaverTime": "مهلة شاشة التوقف", + "LabelSaveTrickplayLocally": "حفظ صور المعاينة السريعة بجوار الوسائط", + "PlaylistError.CreateFailed": "خطأ في إنشاء قائمة التشغيل", + "PlaylistError.UpdateFailed": "خطأ أثناء تحديث قائمة التشغيل", + "LabelScreensaverTimeHelp": "مقدار الوقت بالثواني من عدم النشاط المطلوب لبدء تشغيل شاشة التوقف.", + "LogLevel.Debug": "تنقيح", + "LibraryScanFanoutConcurrencyHelp": "الحد الأقصى لعدد المهام المتوازية أثناء عمليات مسح المكتبة. سيؤدي ترك هذا الرقم فارغاً إلى اختيار حد استناداً إلى عدد النواة في أنظمتك. تحذير: قد يتسبب تعيين هذا الرقم عالٍ جداً في حدوث مشاكل مع أنظمة ملفات الشبكة؛ إذا واجهت مشاكل قم بتخفيض هذا الرقم.", + "LimitSegmentLengthHelp": "قد يساعد تمكين هذا الخيار في منع تعليق مشغل HLS أثناء البحث على أجهزة معينة، مثل أجهزة تلفاز webOS.", + "PlaybackError.ASS_RENDER_ERROR": "تمت مواجهة خطأ في عارض الترجمة ASS/SSA.", + "LimitSupportedVideoResolution": "تحديد الحد الأقصى لدقة الفيديو المدعومة", + "SelectPreferredTranscodeVideoCodecHelp": "حدد برنامج ترميز الفيديو المفضل لتحويل الترميز إليه. إذا كان برنامج الترميز المفضل غير مدعوم، سيستخدم الخادم أفضل برنامج ترميز متاح تالياً.", + "ListView": "عرض القائمة", + "NativeSubtitleStylingHelp": "لن يعمل تصميم الترجمة على بعض الأجهزة. ومع ذلك، فإنه لا يترافق معه أي عبء على الأداء.", + "PasswordMissingSaveError": "لا يمكن أن تكون كلمة المرور الجديدة فارغة.", + "PlaylistPublicDescription": "السماح بعرض قائمة التشغيل هذه من قبل أي مستخدم قام بتسجيل الدخول.", + "PleaseConfirmRepositoryInstallation": "يُرجى النقر فوق موافق لتأكيد أنك قرأت ما ورد أعلاه وترغب في متابعة تثبيت المكونات الإضافات.", + "PluginLoadConfigError": "حدث خطأ أثناء الحصول على صفحات تكوين المكون الإضافي.", + "PreferEmbeddedExtrasTitlesOverFileNames": "تفضيل العناوين المضمنة على أسماء الملفات للإضافات", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "غالبًا ما يكون للإضافات نفس الاسم المضمن مثل الأصل، تحقق من ذلك لاستخدام العناوين المضمنة لها على أي حال.", + "PreviewLyrics": "معاينة كلمات الأغاني", + "ReadInputAtNativeFramerate": "قراءة المدخلات بمعدل الإطارات الأصلي", + "RenderPgsSubtitleHelp": "تحديد ما إذا كان يجب على العميل عرض ترجمات PGS بدلاً من استخدام الترجمات المنسوخة في الترجمة. يمكن أن يؤدي ذلك إلى تجنب تحويل الترميز من جانب الخادم مقابل أداء العرض من جانب العميل.", + "SaveRecordingNFOHelp": "حفظ البيانات الوصفية من مزود قوائم EPG إلى جانب الوسائط.", + "SaveLyricsIntoMediaFolders": "حفظ كلمات الأغاني في مجلدات الوسائط", + "SaveLyricsIntoMediaFoldersHelp": "سيسمح تخزين كلمات الأغاني بجوار الملفات الصوتية بإدارتها بسهولة أكبر.", + "SaveRecordingNFO": "حفظ البيانات الوصفية لتسجيل EPG في ملف NFO", + "NonBlockingScan": "عدم الحجب - التوليد في قائمة الانتظار، ثم الإرجاع", + "LabelScanBehaviorHelp": "السلوك الافتراضي هو عدم الحجب، والذي سيضيف الوسائط إلى المكتبة قبل أن يتم إنشاء صور المعاينة السريعة. سيضمن الحظر إنشاء صور المعاينة السريعة قبل إضافة الوسائط إلى المكتبة، ولكنه سيجعل عمليات المسح أطول بكثير.", + "LabelProcessPriorityHelp": "سيحدد ضبط هذا الأمر على مستوى أقل أو أعلى كيفية إعطاء وحدة المعالجة المركزية الأولوية لعملية توليد صور المعاينة السريعة ffmpeg بالنسبة للعمليات الأخرى. إذا لاحظتَ تباطؤًا أثناء توليد صور المعاينة السريعة ولكنك لا تريد إيقاف توليدها بالكامل، حاول خفض هذا الأمر وكذلك عدد خيوط وحدة المعالجة المركزية.", + "LabelImageIntervalHelp": "الفاصل الزمني (مللي ثانية) بين كل صور معاينة سريعة جديدة.", + "LabelWidthResolutionsHelp": "قائمة مفصولة بفاصلة للعرض (بكسل) التي سيتم إنشاء صور المعاينة السريعة بها. يجب أن يتم توليد جميع الصور بشكل متناسب مع المصدر، لذا فإن عرض 320 على فيديو 16:9 ينتهي بعرض 320 × 180 تقريبًا.", + "LabelTileHeight": "ارتفاع القالب", + "LabelTrickplayThreads": "خيوط FFmpeg", + "LabelTrickplayThreadsHelp": "عدد الخيوط التي يجب تمريرها إلى وسيطة ”threads-“ في ffmpeg.", + "OptionExtractTrickplayImage": "تمكين استخراج صور المعاينة السريعة", + "LabelGroupShowsIntoCollectionsHelp": "سيتم عرض العروض التليفزيونية كعنصر واحد مجمّع عند عرض قوائم العروض.", + "LabelGroupShowsIntoCollections": "تجميع البرامج التلفزيونية في مجموعات", + "LabelCustomTagDelimitersHelp": "الأحرف التي سيتم التعامل معها كمحددات لفصل العلامات.", + "LabelDelimiterWhitelist": "القائمة البيضاء للمحددات", + "LabelRepository": "مستودع", + "LabelSubtitleStyling": "تنسيق الترجمة النصية", + "MoveToBottom": "انتقل إلى الأسفل", + "ReplaceTrickplayImages": "استبدال صور المعاينة السريعة الموجودة", + "RetryWithGlobalSearch": "إعادة المحاولة باستخدام بحث شامل", + "Reset": "إعادة تعيين", + "SearchForLyrics": "البحث عن كلمات الأغاني", + "LabelSelectPreferredTranscodeVideoCodec": "برنامج ترميز الفيديو المفضل لتحويل الترميز", + "Letterer": "حرفي", + "LimitSupportedVideoResolutionHelp": "استخدم ”الدقة القصوى المسموح بها لتحويل ترميز الفيديو“ كحد أقصى لدقة الفيديو المدعومة.", + "LogLevel.Trace": "تتبع", + "MediaSegmentProvidersHelp": "قم بتمكين وترتيب موفري قطاع الوسائط المفضلين لديك حسب الأولوية.", + "MessageCancelSeriesTimerError": "حدث خطأ أثناء إلغاء المؤقت المتسلسل", + "MessageCancelTimerError": "حدث خطأ أثناء إلغاء المؤقت", + "MetadataNfoLoadError": "فشل في تحميل إعدادات NFO للبيانات الوصفية", + "MoveToTop": "انتقل إلى الأعلى", + "PageNotFound": "هذه ليست الصفحة التي تبحث عنها.", + "MediaSegmentAction.AskToSkip": "اطلب التخطي", + "ResolutionMatchSource": "تطابق المصدر", + "BlockingScan": "الحجب - إنشاء قوائم الانتظار، وحجب الفحص حتى اكتماله", + "LabelWidthResolutions": "دقة العرض", + "LabelQscale": "مقياس الجودة", + "LabelQscaleHelp": "مقياس جودة الصور التي يُخرجها ffmpeg، حيث يمثل الرقم 2 أعلى جودة والرقم 31 أدنى جودة.", + "SaveRecordingImagesHelp": "حفظ الصور من مزود قوائم EPG إلى جانب الوسائط.", + "LabelParallelImageEncodingLimit": "حد ترميز الصور المتوازية", + "LastActive": "آخر نشاط", + "LyricDownloadersHelp": "قم بتمكين وترتيب أدوات تنزيل الأغاني المفضلة لديك حسب الأولوية.", + "MediaSegmentSkipPrompt": "تخطي {0}", + "MediaSegmentType.Intro": "مقدمة", + "MessageRepositoryInstallDisclaimer": "تحذير: تنطوي عملية تثبيت مستودع ملحقات الطرف الثالث على مخاطر. قد تحتوي على تعليمات برمجية غير مستقرة أو ضارة، وقد تتغير في أي وقت. قم فقط بتثبيت المستودعات من المطورين الذين تثق بهم.", + "PlaybackError.MEDIA_DECODE_ERROR": "فشل التشغيل بسبب خطأ في فك تشفير الوسائط.", + "PlaybackError.FATAL_HLS_ERROR": "حدث خطأ فادح في دفق HLS.", + "PlaybackError.RateLimitExceeded": "لا يمكن تشغيل هذه الوسائط في الوقت الحالي بسبب حدود المعدل.", + "PlaylistError.AddFailed": "خطأ أثناء الإضافة إلى قائمة التشغيل", + "PluginUninstallError": "حدث خطأ أثناء إلغاء تثبيت المكون الاضافي.", + "PreferNonstandardArtistsTag": "يفضل علامة الفنانين إذا كانت متوفرة", + "SaveRecordingImages": "حفظ تسجيل صور EPG", + "LabelSaveTrickplayLocallyHelp": "إن حفظ صور المعاينة السريعة في مجلدات الوسائط سيضعها بجوار وسائطك، مما يسهل عملية النقل والوصول إليها.", + "LibraryScanFanoutConcurrency": "حد مهام مسح المكتبة الموازية", + "LimitSegmentLength": "استخدام مقاطع HLS أقصر", + "Lyrics": "كلمات", + "MediaSegmentType.Outro": "الخاتمة", + "MediaSegmentType.Preview": "معاينة", + "MediaSegmentType.Recap": "ملخص", + "MessageSplitVersionsError": "حدث خطأ أثناء تقسيم الإصدارات", + "MoviesAndShows": "الأفلام و المسلسلات التلفزيونية", + "Native": "اصلي", + "PluginLoadRepoError": "حدث خطأ أثناء الحصول على تفاصيل المكون الإضافي من المستودع.", + "ReadInputAtNativeFramerateHelp": "قد يؤدي تمكين هذا الخيار إلى حل بعض المشكلات، مثل توقف البث المباشر قبل الأوان.", + "Regional": "إقليمي", + "LabelImageInterval": "الفاصل الزمني للصور", + "LabelTileHeightHelp": "الحد الأقصى لعدد الصور لكل لوحة في اتجاه المحور العمودي/الرأسي.", + "LibraryInvalidItemIdError": "المكتبة في حالة غير صالحة ولا يمكن تحريرها. من المحتمل أنك تواجه خطأ: المسار في قاعدة البيانات ليس هو المسار الصحيح على نظام الملفات.", + "PluginEnableError": "حدث خطأ أثناء تمكين المكون الإضافي.", + "LabelTileWidthHelp": "العدد الأقصى للصور لكل بلاطة في اتجاه المحور الأفقي.", + "RenderPgsSubtitle": "عرض ترجمة PGS التجريبي", + "MediaInfoRotation": "الدوران", + "DeleteCustomImage": "حذف الصورة المخصصة", + "ImageDeleteFailed": "فشل حذف الصورة", + "ImageUploadCancelled": "تم إلغاء تحميل الصور", + "PluginDisableError": "حدث خطأ أثناء تعطيل المكون الإضافي.", + "PreferNonstandardArtistsTagHelp": "استخدم علامة الفنانين غير القياسية بدلاً من علامة الفنان عند توفرها.", + "PlaylistPublic": "السماح بالوصول العام", + "Lyric": "كلمات غنائية", + "MetadataImagesLoadError": "فشل تحميل إعدادات البيانات الوصفية", + "LabelTileWidth": "عرض القالب", + "LabelJpegQualityHelp": "جودة ضغط JPEG لصور المعاينة السريعة.", + "MediaSegmentAction.Skip": "تخطي", + "MediaSegmentType.Commercial": "تجاري", + "MediaSegmentAction.None": "لا يوجد شيء", + "NoLyricsSearchResultsFound": "لم يتم العثور على كلمات الأغنية.", + "LibraryNameInvalid": "لا يمكن أن يكون اسم المكتبة فارغاً.", + "ExtractTrickplayImagesHelp": "تتشابه صور المعاينة السريعة مع صور الفصول، باستثناء أنها تمتد على طول المحتوى بالكامل وتستخدم لإظهار معاينة عند التنظيف من خلال مقاطع الفيديو.", + "LabelExtractTrickplayDuringLibraryScanHelp": "إنشاء صور المعاينة السريعة عندما يتم استيراد مقاطع الفيديو أثناء فحص المكتبة. خلاف ذلك، سيتم استخراجها أثناء المهمة المجدولة لصور المعاينة السريعة. إذا تم تعيين الإنشاء على عدم الحظر، فلن يؤثر ذلك على الوقت الذي يستغرقه فحص المكتبة حتى يكتمل.", + "LogLoadFailure": "فشل تحميل ملف السجل. قد لا يزال من يتم الكتابة إليه بشكل نشط.", + "LabelExtractTrickplayDuringLibraryScan": "استخراج صور المعاينة السريعة أثناء فحص المكتبة", + "ViewSettings": "عرض الإعدادات", + "EnableVideoToolboxTonemapping": "تمكين تخطيط الألوان لصندوق أدوات الفيديو", + "AllowAv1Encoding": "السماح بالترميز بتنسيق AV1", + "LabelTrickplayKeyFrameOnlyExtraction": "إنشاء الصور من الإطارات الرئيسية فقط", + "LabelEncodingFormatOptions": "خيارات تنسيق الترميز", + "VideoCodecTagNotSupported": "علامة ترميز الفيديو غير مدعومة", + "Trickplay": "صور المعاينة السريعة", + "MachineTranslated": "الترجمة الآلية", + "LabelTrickplayAccelEncodingHelp": "متوفر حاليًا فقط على QSV و VA-API, صندوق أدوات الفيديو و RKMPP، ليس لهذا الخيار أي تأثير على طرق تسريع الأجهزة الأخرى.", + "HeaderServerUnavailable": "الخادم غير متوفر", + "SelectPreferredTranscodeVideoAudioCodecHelp": "حدد برنامج ترميز الصوت المفضل لتحويل الترميز إلى محتوى الفيديو. إذا كان برنامج الترميز المفضل غير مدعوم، سيستخدم الخادم أفضل برنامج ترميز متاح تالياً.", + "SettingsPageLoadError": "فشل تحميل صفحة الإعدادات", + "Featurette": "فيلم وثائقي", + "StereoDownmixAlgorithmHelp": "خوارزمية تُستخدم لخفض مزج الصوت متعدد القنوات إلى ستيريو.", + "UseCustomTagDelimiters": "استخدام محدد العلامات المخصص", + "StreamCountExceedsLimit": "تجاوز عدد التدفقات الحد المسموح به", + "UseCustomTagDelimitersHelp": "تقسيم علامات الفنان/النوع مع أحرف مخصصة.", + "Translator": "مترجم", + "LabelTrackGain": "كسب المسار", + "AllowVideoToolboxTonemappingHelp": "تخطيط الألوان المسرع للأجهزة مقدم من Video Toolbox. وهو يعمل مع معظم تنسيقات HDR، بما في ذلك HDR10 وHDR10+ وHLG، ولكنه لا يعمل مع Dolby Vision Profile 5. هذا له أولوية أعلى مقارنةً بتطبيق معدني آخر.", + "EncodingFormatHelp": "حدد ترميز الفيديو الذي يجب أن يقوم جيليفين بتحويل الترميز إليه. سيستخدم جيليفين ترميز البرامج في حالة عدم توفر ترميز البرامج عند عدم توفر تسريع الأجهزة للتنسيق المحدد. سيتم تمكين ترميز H264 دائمًا.", + "LabelTonemappingMode": "وضع تخطيط الألوان", + "TonemappingModeHelp": "حدد وضع تخطيط الألوان. إذا واجهت إضاءات غير واضحة فحاول التبديل إلى وضع RGB.", + "ForeignPartsOnly": "الأجزاء القسرية/الأجنبية فقط", + "HearingImpairedShort": "HI/SDH", + "LabelTrickplayAccel": "تمكين فك ترميز الأجهزة", + "LabelTrickplayAccelEncoding": "تمكين ترميز MJPEG المسرع للأجهزة", + "LabelIsHearingImpaired": "لضعاف السمع (SDH)", + "LabelTrickplayKeyFrameOnlyExtractionHelp": "استخراج الإطارات الرئيسية فقط لمعالجة أسرع بكثير مع توقيت أقل دقة. إذا كانت وحدة فك ترميز الأجهزة المكوّنة لا تدعم هذا الوضع، ستستخدم وحدة فك ترميز البرامج بدلاً من ذلك.", + "ViewLyrics": "عرض كلمات الأغاني", + "UploadCustomImage": "تحميل صورة مخصصة", + "Penciller": "القلم", + "HeaderUpdateRequired": "مطلوب تحديث", + "SubtitleCyan": "سماوي", + "SubtitleMagenta": "أرجواني", + "DownloadManager": "التنزيلات", + "MessageForgotPasswordPinReset": "اكتب رمز قفل البرنامج لانهاء عملية تغيير كلمة المرور", + "TranscodingLoadError": "فشل تحميل إعدادات ترميز الفيديوهات", + "BackupsPageLoadError": "فشل تحميل صفحة النسخ الاحتياطية", + "ButtonCreateBackup": "أنشئ نسخة احتياطية", + "MessageRestoreDisclaimer": "تحذير: أنت على وشك استعادة نسخة احتياطية سابقة. سيصبح خادمك غير صالح للاستخدام أثناء العملية، وستفقد أي بيانات جديدة أُنشِأت منذ النسخ الاحتياطي.", + "MessageWaitingForServer": "في انتظار الخادم...", + "ButtonLearnMore": "تعرف المزيد", + "Create": "انشئ", + "HeaderBackupsHelp": "إنشاء واستعادة لقطات من خادمكَ والتي تتضمن قاعدة البيانات والبيانات الوصفية والترجمات والمعاينة السريعة.", + "LabelBackupsUnavailable": "لا توجد اي نسخ احتياطية متاحة", + "LabelDatabase": "قاعدة البيانات", + "LabelProgramData": "بيانات البرنامج", + "MessageBackupDisclaimer": "اعتمادًا على حجم مكتبتك، قد تستغرق عملية النسخ الاحتياطي بعض الوقت.", + "MessageBackupInProgress": "جارٍ النسخ الاحتياطي", + "MessageRestoreInProgress": "جارٍ الاستعادة", + "MessageRestoreSuccess": "تمت الاستعادة بنجاح", + "StorageType.CDRom": "قرص مضغوط", + "StorageType.Removable": "قابلة للإزالة", + "StorageType.Unknown": "مجهول", + "Success": "نجاح", + "HeaderBackups": "النسخ الاحتياطية", + "ConfirmDeleteRepository": "حذف المستودع؟", + "DeleteRepositoryConfirmation": "هل أنت متأكد من هذا المستودع؟", + "LabelRestore": "استعادة", + "PluginsLoadError": "حدث خطأ أثناء تحميل الإضافات.", + "RepositoriesPageLoadError": "فشل تحميل المستودعات", + "StorageType.Fixed": "مُثَبَّت", + "StorageType.Network": "شبكة", + "StorageType.NoRootDirectory": "لا يوجد دليل الجذر (No Root Directory)", + "StorageType.Ram": "ذاكرة الوصول العشوائي (RAM)", + "LabelImageCache": "ذاكرة التخزين المؤقت للصور" } diff --git a/src/strings/be-by.json b/src/strings/be-by.json index ae23eb2ac..aea8cf3af 100644 --- a/src/strings/be-by.json +++ b/src/strings/be-by.json @@ -1,7 +1,7 @@ { "ButtonCancel": "Адмяніць", "ButtonOk": "ОК", - "ButtonQuickStartGuide": "Даведнік па пачатку працы", + "ButtonQuickStartGuide": "Кіраўніцтва па наладзе", "ButtonSignOut": "Выйсці", "HeaderEasyPinCode": "Easy PIN-код", "HeaderPaths": "Шляхі", @@ -1992,5 +1992,6 @@ "MoviesAndShows": "Фільмы і Cерыялы", "PreviewLyrics": "Прадпрагляд тэксту песні", "ReadInputAtNativeFramerate": "Чытаць уваходныя дадзеныя пры зыходнай частаце кадраў", - "ReadInputAtNativeFramerateHelp": "Уключэнне гэтай опцыі можа вырашыць некаторыя праблемы, напрыклад, заўчаснае спыненне прамых трансляцый." + "ReadInputAtNativeFramerateHelp": "Уключэнне гэтай опцыі можа вырашыць некаторыя праблемы, напрыклад, заўчаснае спыненне прамых трансляцый.", + "Retry": "Паўтарыць" } diff --git a/src/strings/ca.json b/src/strings/ca.json index ffdcc8d58..2448bf84d 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -1,67 +1,67 @@ { - "AccessRestrictedTryAgainLater": "L'accés està restringit actualment. Intenta-ho de nou més tard si us plau.", + "AccessRestrictedTryAgainLater": "L'accés està restringit actualment. Intenteu-ho més tard.", "Add": "Afegeix", - "AddToCollection": "Afegeix a una col·lecció", + "AddToCollection": "Agrega a una col·lecció", "AddToPlayQueue": "Afegeix a la cua de reproducció", - "AddToPlaylist": "Afegeix a una llista de reproducció", + "AddToPlaylist": "Agrega a una llista de reproducció", "All": "Tot", "AllChannels": "Tots els canals", "AllEpisodes": "Tots els episodis", "AlwaysPlaySubtitles": "Reprodueix sempre", - "AroundTime": "Al voltant {0}", + "AroundTime": "Al voltant de {0}", "Artists": "Artistes", "AsManyAsPossible": "Tants com sigui possible", "AspectRatio": "Relació d'aspecte", "Audio": "Àudio", "MessageBrowsePluginCatalog": "Consulteu el nostre catàleg per veure els complements disponibles.", - "ButtonAddMediaLibrary": "Afegir biblioteca de mitjans", - "ButtonAddScheduledTaskTrigger": "Afegir Disparador", - "ButtonAddServer": "Afegeix Servidor", - "ButtonAddUser": "Afegir usuari", + "ButtonAddMediaLibrary": "Afegiu-hi una mediateca", + "ButtonAddScheduledTaskTrigger": "Afegeix un detonador", + "ButtonAddServer": "Afegeix un servidor", + "ButtonAddUser": "Afegeix un usuari", "ButtonArrowLeft": "Esquerra", "ButtonArrowRight": "Dreta", - "ButtonBack": "Darrera", - "ButtonCancel": "Cancel·lar", - "ButtonChangeServer": "Canviar de Servidor", - "ButtonEditOtherUserPreferences": "Editar el perfil, la imatge i les preferències d'aquest usuari.", + "ButtonBack": "Enrere", + "ButtonCancel": "Cancel·la", + "ButtonChangeServer": "Canvia de servidor", + "ButtonEditOtherUserPreferences": "Edita el perfil, la imatge i les preferències d'aquest usuari.", "ButtonForgotPassword": "He oblidat la contrasenya", "ButtonGotIt": "Entesos", - "ButtonLibraryAccess": "Accés a la biblioteca", - "ButtonManualLogin": "Inici de sessió manual", + "ButtonLibraryAccess": "Accés a la mediateca", + "ButtonManualLogin": "Inici manual de sessió", "ButtonMore": "Més", "ButtonNextTrack": "Pista següent", "ButtonOk": "D'acord", "ButtonOpen": "Obre", "ButtonParentalControl": "Control parental", - "ButtonPause": "Pausa", + "ButtonPause": "Atura", "ButtonPreviousTrack": "Pista anterior", - "ButtonQuickStartGuide": "Guia d'inici ràpid", + "ButtonQuickStartGuide": "Guia de configuració", "ButtonRefreshGuideData": "Actualitza les dades de la guia", "ButtonRemove": "Elimina", "ButtonResetEasyPassword": "Restabliu el codi Easy PIN", - "ButtonResume": "Reprèn", - "ButtonSelectDirectory": "Selecciona el directori", + "ButtonResume": "Continuació", + "ButtonSelectDirectory": "Seleccioneu el directori", "ButtonSend": "Envia", - "ButtonShutdown": "Atura", - "ButtonSignIn": "Iniciar sessió", - "ButtonSignOut": "Tancar sessió", + "ButtonShutdown": "Apaga", + "ButtonSignIn": "Inicia la sessió", + "ButtonSignOut": "Tanca la sessió", "ButtonStop": "Atura", "ButtonSubmit": "Envia", "ButtonTrailer": "Tràiler", - "CancelRecording": "Cancel·la enregistrament", - "CancelSeries": "Cancel·la sèrie", - "ChannelAccessHelp": "Selecciona els canals a compartir amb aquest usuari. Els administradors podran editar tots els canals emprant el gestor de metadades.", + "CancelRecording": "Cancel·la l'enregistrament", + "CancelSeries": "Cancel·la la sèrie", + "ChannelAccessHelp": "Trieu els canals a compartir amb aquest usuari. Els administradors podran editar tots els canals emprant el gestor de metadades.", "Composer": "Compositor", - "ConfirmDeleteImage": "Esborrar imatge?", + "ConfirmDeleteImage": "Desitgeu eliminar la imatge?", "ConfirmDeletion": "Confirma supressió", "Connect": "Connecta", - "Continuing": "Continuant", - "ErrorDefault": "Hi ha hagut un error processant la petició. Intenteu-ho més tard.", - "Delete": "Esborra", - "DeleteImage": "Esborra Imatge", - "DeleteImageConfirmation": "Esteu segur que voleu suprimir aquesta imatge?", - "DeleteMedia": "Esborra", - "DeleteUser": "Esborrar usuari", + "Continuing": "En curs", + "ErrorDefault": "S'ha produït un error en processar la petició. Intenteu-ho més tard.", + "Delete": "Elimina", + "DeleteImage": "Elimina la imatge", + "DeleteImageConfirmation": "N'esteu segur, que voleu suprimir aquesta imatge?", + "DeleteMedia": "Elimina el contingut", + "DeleteUser": "Esborra l'usuari", "Desktop": "Escriptori", "DeviceAccessHelp": "Això només s'aplica a dispositius que poden ser identificats i no previndrà l'accés des del navegador. Filtrant l'accés de dispositius a l'usuari previndrà l'ús de nous dispositius fins que hagin estat aprovats aquí.", "Disconnect": "Desconnecta", @@ -70,19 +70,19 @@ "DoNotRecord": "No enregistris", "Down": "Avall", "Download": "Descarrega", - "Edit": "Edita", - "EditImages": "Edita les imatges", - "EditSubtitles": "Edita els subtítols", - "EnableCinemaMode": "Mode cinema", + "Edit": "Edició", + "EditImages": "Edició d'imatges", + "EditSubtitles": "Edició dels subtítols", + "EnableCinemaMode": "Mode de cinema", "EnableDisplayMirroring": "Duplicació de pantalla", "Ended": "Acabades", "EndsAtValue": "Acabaria a les {0}", "Episodes": "Episodis", - "ExitFullscreen": "Surt de pantalla completa", - "Favorite": "Favorit", + "ExitFullscreen": "Surt de la pantalla completa", + "Favorite": "Preferit", "File": "Fitxer", - "FileNotFound": "Arxiu no trobat.", - "FileReadCancelled": "La lectura de l'arxiu ha estat cancel·lada.", + "FileNotFound": "No s'ha trobat el fitxer.", + "FileReadCancelled": "La lectura del fitxer ha estat cancel·lada.", "FileReadError": "S'ha produït un error en llegir el fitxer.", "Friday": "Divendres", "Fullscreen": "Pantalla completa", @@ -93,77 +93,77 @@ "HeaderActiveDevices": "Dispositius actius", "HeaderActiveRecordings": "Enregistraments actius", "HeaderActivity": "Activitat", - "HeaderAddToCollection": "Afegir a una col·lecció", - "HeaderAddToPlaylist": "Afegir a una llista de reproducció", - "HeaderAddUpdateImage": "Afegir o actualitzar la imatge", + "HeaderAddToCollection": "Agregació a una col·lecció", + "HeaderAddToPlaylist": "Agregació a llista de reproducció", + "HeaderAddUpdateImage": "Afegeix o actualitza la imatge", "HeaderAdditionalParts": "Parts addicionals", "HeaderApiKey": "Clau API", "HeaderApiKeys": "Claus API", "HeaderApiKeysHelp": "Cal que les aplicacions externes tinguin una clau API per comunicar-se amb el servidor. Les claus s’emeten iniciant la sessió amb un compte d’usuari normal o concedint manualment una clau a l’aplicació.", - "HeaderAudioSettings": "Preferències d'àudio", + "HeaderAudioSettings": "Configuració d'àudio", "HeaderBranding": "Aparença", - "HeaderCancelRecording": "Cancel·lar l'enregistrament", - "HeaderCancelSeries": "Cancel·lar la sèrie", + "HeaderCancelRecording": "Cancel·la l'enregistrament", + "HeaderCancelSeries": "Cancel·la la sèrie", "HeaderCastAndCrew": "Repartiment i equip", "HeaderCodecProfile": "Perfil del còdec", "HeaderConfirmProfileDeletion": "Confirmar l'esborrament del perfil", - "HeaderConnectToServer": "Connectar al servidor", + "HeaderConnectToServer": "Connecta al servidor", "HeaderContainerProfile": "Perfil del contenidor", "HeaderContainerProfileHelp": "Els perfils del contenidor indiquen limitacions d'un dispositiu en reproduir formats específics. Si la limitació és aplicable, llavors els mitjans es transcodificaran fins i tot si el format ha estat configurat per a reproducció directa.", - "HeaderContinueListening": "Continuar escoltant", - "HeaderContinueWatching": "Continua veient", + "HeaderContinueListening": "Continueu escoltant", + "HeaderContinueWatching": "Continueu mirant", "HeaderCustomDlnaProfiles": "Perfils personalitzats", "HeaderDateIssued": "Data d'emissió", - "HeaderDefaultRecordingSettings": "Preferències d'enregistrament per defecte", - "HeaderDeleteDevice": "Eliminar dispositiu", - "HeaderDeleteItem": "Esborrar l'ítem", + "HeaderDefaultRecordingSettings": "Configuració per defecte de l'enregistrament", + "HeaderDeleteDevice": "Elimina el dispositiu", + "HeaderDeleteItem": "Elimina l'element", "HeaderDeveloperInfo": "Informació del desenvolupador", "HeaderDeviceAccess": "Accés al dispositiu", "HeaderDevices": "Dispositius", "HeaderDirectPlayProfile": "Perfil de reproducció directa", "HeaderEasyPinCode": "Codi PIN Senzill", - "HeaderEditImages": "Edita les imatges", + "HeaderEditImages": "Edició d'imatges", "HeaderEnabledFields": "Camps habilitats", - "HeaderExternalIds": "IDs externs", + "HeaderExternalIds": "ID externs", "HeaderFeatureAccess": "Accés a funcions", - "HeaderFetchImages": "Obtenir imatges", + "HeaderFetchImages": "Explora imatges", "HeaderFrequentlyPlayed": "Reproduït freqüentment", "HeaderHttpHeaders": "Capçaleres HTTP", "HeaderIdentification": "Identificació", "HeaderIdentificationCriteriaHelp": "Insereix al menys un criteri d'identificació.", "HeaderIdentificationHeader": "Capçalera d'identificació", "HeaderImageSettings": "Preferències de la imatge", - "HeaderInstall": "Instal·lar", + "HeaderInstall": "Instal·la", "HeaderInstantMix": "Mescla instantània", - "HeaderKeepRecording": "Continuar enregistrant", - "HeaderKeepSeries": "Mantenir la sèrie", + "HeaderKeepRecording": "Continueu enregistrant", + "HeaderKeepSeries": "Mantén la sèrie", "HeaderLatestEpisodes": "Episodis afegits darrerament", - "HeaderLatestMedia": "Mitjans afegits darrerament", + "HeaderLatestMedia": "Contingut multimèdia afegit darrerament", "HeaderLatestMovies": "Pel·lícules afegides darrerament", "HeaderLatestMusic": "Música afegida darrerament", "HeaderLatestRecordings": "Enregistraments afegits darrerament", - "HeaderLibraries": "Llibreries", - "HeaderLibraryAccess": "Accés a la llibreria", - "HeaderLibraryFolders": "Carpetes de la llibreria", - "HeaderLibraryOrder": "Ordre de la llibreria", - "HeaderLibrarySettings": "Preferències de la llibreria", - "HeaderMediaFolders": "Carpetes multimèdia", - "HeaderMetadataSettings": "Preferències de les metadades", + "HeaderLibraries": "Mediateques", + "HeaderLibraryAccess": "Accés a la mediateca", + "HeaderLibraryFolders": "Directoris de la mediateca", + "HeaderLibraryOrder": "Ordre de la mediateca", + "HeaderLibrarySettings": "Configuració de la mediateca", + "HeaderMediaFolders": "Directoris multimèdia", + "HeaderMetadataSettings": "Configuració de les metadades", "HeaderMyDevice": "El meu dispositiu", - "HeaderMyMedia": "Els meus mitjans", - "HeaderMyMediaSmall": "Els meus mitjans (petit)", - "HeaderNewApiKey": "Nova clau API", - "HeaderNextEpisodePlayingInValue": "El pròxim episodi es reproduirà en {0}", - "HeaderNextVideoPlayingInValue": "El pròxim vídeo es reproduirà en {0}", - "HeaderOnNow": "Transmetent ara", + "HeaderMyMedia": "Els meus continguts multimèdia", + "HeaderMyMediaSmall": "Els meus continguts multimèdia (petit)", + "HeaderNewApiKey": "Clau API nova", + "HeaderNextEpisodePlayingInValue": "L'episodi següent es reproduirà en {0}", + "HeaderNextVideoPlayingInValue": "El vídeo següent es reproduirà en {0}", + "HeaderOnNow": "En curs", "HeaderParentalRatings": "Classificacions parentals", "HeaderPassword": "Contrasenya", - "HeaderPasswordReset": "Restablir contrasenya", + "HeaderPasswordReset": "Restableix la contrasenya", "HeaderPaths": "Directoris", - "HeaderPlayAll": "Reproduir-ho tot", + "HeaderPlayAll": "Reprodueix-los tots", "HeaderPlaybackError": "Error de reproducció", "HeaderPleaseSignIn": "Inicieu sessió", - "HeaderPreferredMetadataLanguage": "Idioma de les metadades preferit", + "HeaderPreferredMetadataLanguage": "Idioma preferit de les metadades", "HeaderProfileInformation": "Informació del perfil", "HeaderProfileServerSettingsHelp": "Aquests valors controlen com el servidor es presentarà als clients.", "HeaderRecentlyPlayed": "Reproduït recentment", @@ -173,21 +173,21 @@ "HeaderScenes": "Escenes", "HeaderSeasons": "Temporades", "HeaderSecondsValue": "{0} segons", - "HeaderSendMessage": "Enviar missatge", + "HeaderSendMessage": "Envia missatge", "HeaderSeriesOptions": "Opcions de la sèrie", "HeaderServerSettings": "Preferències del servidor", - "HeaderSetupLibrary": "Configureu les vostres biblioteques multimèdia", - "HeaderSortBy": "Ordenar per", + "HeaderSetupLibrary": "Configureu les vostres mediateques", + "HeaderSortBy": "Ordena per", "HeaderSortOrder": "Ordre", - "HeaderStartNow": "Començar ara", + "HeaderStartNow": "Comença ara", "HeaderStatus": "Estat", "HeaderSubtitleAppearance": "Aparença dels subtítols", "HeaderSystemDlnaProfiles": "Perfils del sistema", - "HeaderTaskTriggers": "Disparadors de tasques", + "HeaderTaskTriggers": "Detonadors de tasques", "HeaderTranscodingProfile": "Perfil de transcodificació", "HeaderTypeText": "Introduïu text", "HeaderUpcomingOnTV": "Properes emissions", - "HeaderUploadImage": "Pujar imatge", + "HeaderUploadImage": "Pujada d'imatges", "HeaderUser": "Usuari", "HeaderUsers": "Usuaris", "HeaderVideoTypes": "Tipus de vídeo", @@ -197,16 +197,16 @@ "HeaderYears": "Anys", "Help": "Ajuda", "Hide": "Amaga", - "Identify": "Identifica", + "Identify": "Identificació", "Images": "Imatges", - "InstallingPackage": "Instal·lant {0} (versió {1})", + "InstallingPackage": "S'està instal·lant {0} (versió {1})", "InstantMix": "Mescla instantània", - "ItemCount": "{0} ítems", + "ItemCount": "{0} elements", "LabelAccessDay": "Dia de la setmana", - "LabelAccessEnd": "Hora de fi", + "LabelAccessEnd": "Hora final", "LabelAccessStart": "Hora d'inici", "LabelAirDays": "Dies en directe", - "LabelAirTime": "Horari en directe", + "LabelAirTime": "Horari d'emissió", "LabelAlbum": "Àlbum", "LabelAlbumArtMaxHeight": "Alçada màxima de l'art de l'àlbum", "LabelAlbumArtMaxWidth": "Amplada màxima de l'art de l'àlbum", @@ -216,18 +216,18 @@ "LabelBirthDate": "Data de naixement", "LabelBirthYear": "Any de naixement", "LabelCache": "Memòria cau", - "LabelCachePath": "Dir. de memòria cau", - "LabelCachePathHelp": "Especifiqueu una ubicació personalitzada per als fitxers cau del servidor, com ara les imatges. Deixeu-ho en blanc per utilitzar l'ubicació per defecte del servidor.", + "LabelCachePath": "Ruta de la memòria cau", + "LabelCachePathHelp": "Especifiqueu una ubicació personalitzada per als fitxers cau del servidor, com ara les imatges. Deixeu-ho en blanc per utilitzar la ubicació per defecte del servidor.", "LabelCancelled": "Cancel·lat", "LabelChannels": "Canals", "LabelCollection": "Col·lecció", "LabelCommunityRating": "Valoració de la comunitat", "LabelContentType": "Tipus de contingut", "LabelCountry": "País/Regió", - "LabelCriticRating": "Valoració dels сrítics", + "LabelCriticRating": "Valoració de la crítica", "LabelCurrentPassword": "Contrasenya actual", "LabelCustomCss": "Codi CSS propi", - "LabelCustomCssHelp": "Apliqueu els vostres propis estils personalitzats a la interfície web.", + "LabelCustomCssHelp": "Apliqueu el vostre propi codi CSS personalitzat per al tema/marca a la interfície web.", "LabelDashboardTheme": "Tema del tauler de control del servidor", "LabelDateAdded": "Data afegit", "LabelDay": "Dia de la setmana", @@ -235,13 +235,13 @@ "LabelDefaultUser": "Usuari per defecte", "LabelDefaultUserHelp": "Determina quina biblioteca d'usuari s'hauria de mostrar als dispositius connectats. Es pot anul·lar per a cada dispositiu emprant perfils.", "LabelDeviceDescription": "Descripció del dispositiu", - "LabelDiscNumber": "Disc", + "LabelDiscNumber": "Número de disc", "LabelDisplayLanguage": "Idioma de visualització", "LabelDisplayName": "Nom a mostrar", "LabelDisplayOrder": "Ordre de visualització", - "LabelDisplaySpecialsWithinSeasons": "Mostra els especials dins les temporades en que van ser emesos", + "LabelDisplaySpecialsWithinSeasons": "Mostra els especials a les temporades on van ser emesos", "LabelDownloadLanguages": "Descarrega idiomes", - "LabelDropImageHere": "Deixa anar la imatge aquí.", + "LabelDropImageHere": "Deixeu anar la imatge aquí.", "LabelDynamicExternalId": "Identificador {0}", "LabelEasyPinCode": "Codi PIN senzill", "LabelEnableAutomaticPortMap": "Habilita l'auto-mapatge de ports", @@ -249,102 +249,102 @@ "LabelEnableDlnaPlayToHelp": "Detecteu dispositius de la vostra xarxa i ofereu la possibilitat de controlar-los de forma remota.", "LabelEnableDlnaServer": "Habilita servidor DLNA", "LabelEnableDlnaServerHelp": "Permetre als dispositius UPnP de la vostra xarxa navegar i reproduir contingut.", - "LabelEnableRealtimeMonitor": "Habilitar el monitoratge a temps real", + "LabelEnableRealtimeMonitor": "Habilita el monitoratge a temps real", "LabelEnableRealtimeMonitorHelp": "Els canvis als fitxers es processaran immediatament als sistemes de fitxers compatibles.", "LabelEndDate": "Data de finalització", - "LabelEpisodeNumber": "Episodi", + "LabelEpisodeNumber": "Episodi número", "LabelEvent": "Esdeveniment", "LabelEveryXMinutes": "Cada", - "LabelExtractChaptersDuringLibraryScan": "Extrau imatges dels episodis durant l'escaneig de la biblioteca", + "LabelExtractChaptersDuringLibraryScan": "Extreu imatges dels episodis durant l'escaneig de la mediateca", "LabelFailed": "Fallit", - "LabelFinish": "Finalitzar", + "LabelFinish": "Finalitza", "LabelFriendlyName": "Nom amistós", "LabelServerNameHelp": "Aquest nom s'utilitzarà per identificar el servidor i es convertirà per defecte en el nom d'amfitrió del servidor.", - "LabelGroupMoviesIntoCollections": "Agrupa pel·lícules a col·leccions", + "LabelGroupMoviesIntoCollections": "Agrupa pel·lícules en col·leccions", "LabelHomeScreenSectionValue": "Secció {0} de la pantalla d'inici", - "LabelHttpsPort": "Port local HTTPS", + "LabelHttpsPort": "Número del port local HTTPS", "LabelIconMaxHeight": "Alçada màxima de la icona", "LabelIconMaxWidth": "Amplada màxima de la icona", "LabelImageType": "Tipus d'imatge", "LabelKeepUpTo": "Mantingues fins a", "LabelKodiMetadataDateFormat": "Format de la data d'estrena", - "LabelKodiMetadataEnablePathSubstitution": "Habilita la substitució de directoris", - "LabelKodiMetadataEnablePathSubstitutionHelp": "Habilitar la substitució de directoris emprant les opcions de substitució de directoris del servidor.", - "LabelKodiMetadataSaveImagePaths": "Desar els directoris de les imatges als fitxers NFO", + "LabelKodiMetadataEnablePathSubstitution": "Habilita la substitució de rutes", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Habilita la substitució de rutes d'imatges, fent servir la configuració de rutes de substitució del servidor.", + "LabelKodiMetadataSaveImagePaths": "Desa les rutes de les imatges als fitxers NFO", "LabelLanguage": "Idioma", "LabelLocalHttpServerPortNumber": "Port local HTTP", - "LabelLockItemToPreventChanges": "Bloca aquest ítem per evitar canvis futurs en les metadades", + "LabelLockItemToPreventChanges": "Bloca aquest element per a evitar canvis futurs en les metadades", "LabelLoginDisclaimerHelp": "El missatge es mostrarà a la part inferior de la pàgina d'inici de sessió.", "LabelLogs": "Registres", "LabelManufacturer": "Fabricant", "LabelManufacturerUrl": "URL del fabricant", - "LabelMaxBackdropsPerItem": "Nombre màxim d'imatges de fons per ítem", - "LabelMaxParentalRating": "Qualificació de control parental màxima permesa", - "LabelMaxResumePercentage": "Percentatge màxim per resumir", + "LabelMaxBackdropsPerItem": "Nombre màxim d'imatges de fons per element", + "LabelMaxParentalRating": "Classificació màxima permesa de control parental", + "LabelMaxResumePercentage": "Percentatge màxim per a reprendre", "LabelMaxResumePercentageHelp": "Es considerarà que s'ha reproduït del tot si s'atura després d'aquest temps.", "LabelMaxScreenshotsPerItem": "Nombre màxim de captures de pantalla per ítem:", "LabelMaxStreamingBitrateHelp": "Especifica un bitrate màxim quan es faci streaming.", "LabelMessageText": "Text del missatge", "LabelMessageTitle": "Títol del missatge", - "LabelMetadata": "Metadada", + "LabelMetadata": "Metadades", "LabelMetadataDownloadLanguage": "Idioma preferit de descàrrega", - "LabelMetadataPath": "Directori de metadades", - "LabelMetadataPathHelp": "Especifiqueu un directori personalitzat per a l'artwork i les metadades descarregats.", + "LabelMetadataPath": "Ruta de metadades", + "LabelMetadataPathHelp": "Especifiqueu un directori personalitzat per a les imatges i metadades descarregades.", "LabelMethod": "Mètode", "LabelMinBackdropDownloadWidth": "Amplada mínima de descàrrega de la imatge de fons", - "LabelMinResumeDuration": "Durada mínima per resumir", - "LabelMinResumeDurationHelp": "La durada del vídeo més curta en segons que permetrà desar la ubicació de la reproducció i permetre reprendre-la.", - "LabelMinResumePercentage": "Percentatge mínim per resumir", + "LabelMinResumeDuration": "Durada mínima per a reprendre", + "LabelMinResumeDurationHelp": "La durada del vídeo mínima en segons que permetrà desar la ubicació de la reproducció i permetre reprendre-la.", + "LabelMinResumePercentage": "Percentatge mínim per a reprendre", "LabelMinResumePercentageHelp": "Es considerarà que no s'ha reproduït si s'atura abans d'aquest temps.", "LabelMinScreenshotDownloadWidth": "Amplada mínima de descàrrega de la captura de pantalla:", "LabelModelDescription": "Descripció del model", "LabelModelName": "Nom del model", "LabelModelNumber": "Nombre de model", "LabelMonitorUsers": "Supervisar l'activitat de", - "LabelMovieRecordingPath": "Directori de gravació de pel·lícules", + "LabelMovieRecordingPath": "Ruta d'enregistrament de pel·lícules", "LabelName": "Nom", - "LabelNewName": "Nou nom", - "LabelNewPassword": "Nova contrasenya", - "LabelNewPasswordConfirm": "Confirma la nova contrasenya", + "LabelNewName": "Nom nou", + "LabelNewPassword": "Contrasenya nova", + "LabelNewPasswordConfirm": "Confirmeu la contrasenya nova", "LabelNotificationEnabled": "Habilita aquesta notificació", "LabelNumber": "Nombre", - "LabelNumberOfGuideDays": "Nombre de dies de dades de la guia a descarregar", + "LabelNumberOfGuideDays": "Nombre de dies a descarregar-ne les dades de la programació", "LabelOriginalAspectRatio": "Relació d'aspecte original", "LabelOriginalTitle": "Títol original", "LabelOverview": "Sinopsi", "LabelPassword": "Contrasenya", "LabelPasswordRecoveryPinCode": "Codi PIN", - "LabelPath": "Directori", - "LabelPersonRole": "Rol", + "LabelPath": "Ruta", + "LabelPersonRole": "Paper", "LabelPersonRoleHelp": "Exemple: Conductor de camió de gelats", "LabelPlaceOfBirth": "Lloc de naixement", - "LabelPlayDefaultAudioTrack": "Reprodueix la pista d'àudio per defecte independentment de l'idioma", + "LabelPlayDefaultAudioTrack": "Reprodueix la pista d'àudio per defecte, independentment de l'idioma", "LabelPlaylist": "Llista de reproducció", - "LabelPreferredDisplayLanguage": "Idioma de visualització preferit", - "LabelPreferredSubtitleLanguage": "Idioma preferit de subtítols", + "LabelPreferredDisplayLanguage": "Idioma preferit de visualització", + "LabelPreferredSubtitleLanguage": "Idioma preferit dels subtítols", "LabelProfileAudioCodecs": "Còdecs d'àudio", "LabelProfileCodecs": "Còdecs", "LabelProfileContainer": "Contenidor", "LabelProfileVideoCodecs": "Còdecs de vídeo", "LabelProtocolInfo": "Informació del protocol", - "LabelPublicHttpPort": "Port HTTP públic", - "LabelPublicHttpsPort": "Port HTTPS públic", + "LabelPublicHttpPort": "Número del port públic HTTP", + "LabelPublicHttpsPort": "Número del port HTTPS públic", "LabelRecord": "Enregistra", - "LabelRecordingPath": "Directori de gravació per defecte", - "LabelRefreshMode": "Mode de refresc", - "LabelReleaseDate": "Estrena", - "LabelSaveLocalMetadata": "Desa l'artwork i les metadades als directoris dels multimèdia", - "LabelSaveLocalMetadataHelp": "Desar l'artwork i les metadades directament als directoris dels multimèdia els posarà tots en llocs on podran ser editats fàcilment.", + "LabelRecordingPath": "Ruta d'enregistrament per defecte", + "LabelRefreshMode": "Mode d'actualització", + "LabelReleaseDate": "Data de llançament", + "LabelSaveLocalMetadata": "Desa les imatges als directoris multimèdia", + "LabelSaveLocalMetadataHelp": "Desar les imatges als directoris multimèdia les ubicarà a un lloc on podran ser editades fàcilment.", "LabelScreensaver": "Estalvi de pantalla", "LabelSeasonNumber": "Temporada", - "LabelSelectFolderGroups": "Agrupa automàticament el contingut de les següents carpetes en col·leccions com 'Pel·lícules', 'Música' i 'TV'", - "LabelSelectFolderGroupsHelp": "Les carpetes desmarcades serán mostrades individualment en la seva pròpia vista.", + "LabelSelectFolderGroups": "Agrupa automàticament el contingut dels següents directoris en vistes com 'Pel·lícules', 'Música' i 'Televisió'", + "LabelSelectFolderGroupsHelp": "Els directoris desmarcats seran mostrats individualment en la seva pròpia vista.", "LabelSelectUsers": "Selecciona usuaris", - "LabelSelectVersionToInstall": "Seleccioni la versió a instal·lar", + "LabelSelectVersionToInstall": "Seleccioneu la versió a instal·lar", "LabelSendNotificationToUsers": "Envia la notificació a", "LabelSerialNumber": "Nombre de sèrie", - "LabelSeriesRecordingPath": "Directori de gravació de sèries", - "LabelSortTitle": "Títol d'endreçat", + "LabelSeriesRecordingPath": "Ruta de l'enregistrament de sèries", + "LabelSortTitle": "Ordena per títols", "LabelSource": "Font", "LabelStartWhenPossible": "Inicia quan sigui possible", "LabelStatus": "Estat", @@ -356,8 +356,8 @@ "LabelTimeLimitHours": "Temps límit (en hores)", "LabelTitle": "Títol", "LabelTrackNumber": "Pista", - "LabelTranscodingTempPathHelp": "Especifiqueu una ruta d'accés personalitzat per als fitxers de transcodificació servits als clients. Deixeu-ho en blanc per utilitzar el servidor per defecte.", - "LabelTriggerType": "Tipus de Disparador", + "LabelTranscodingTempPathHelp": "Especifiqueu una ruta personalitzada d'accés per als fitxers de transcodificació servits als clients. Deixeu-ho en blanc per a utilitzar el servidor per defecte.", + "LabelTriggerType": "Tipus de detonador", "LabelType": "Tipus", "LabelUseNotificationServices": "Empra els següents serveis", "LabelUser": "Usuari", @@ -367,11 +367,11 @@ "LabelYear": "Any", "LabelYoureDone": "Ja està!", "LatestFromLibrary": "Novetats a {0}", - "LibraryAccessHelp": "Seleccioneu les biblioteques que voleu compartir amb aquest usuari. Els administradors podran editar totes les carpetes mitjançant el gestor de metadades.", + "LibraryAccessHelp": "Trieu les mediateques que voleu compartir amb aquest usuari. Els administradors podran editar totes les carpetes mitjançant el gestor de metadades.", "Live": "Directe", "MarkPlayed": "Marca com a reproduït", "MarkUnplayed": "Marca com a no reproduït", - "MaxParentalRatingHelp": "El contingut amb una classificació superior no serà mostrat a l'usuari.", + "MaxParentalRatingHelp": "El contingut amb una classificació superior s'amagarà a aquest usuari.", "MediaInfoAspectRatio": "Relació d'aspecte", "MediaInfoChannels": "Canals", "MediaInfoDefault": "Per defecte", @@ -380,40 +380,40 @@ "MediaInfoPixelFormat": "Format de píxel", "MediaInfoProfile": "Perfil", "MediaInfoResolution": "Resolució", - "MessageAreYouSureDeleteSubtitles": "Estàs segur que vols eliminar aquest fitxer de subtítols?", + "MessageAreYouSureDeleteSubtitles": "N'esteu segur, que voleu eliminar aquest fitxer de subtítols?", "MessageConfirmProfileDeletion": "N'estàs segur d'eliminar aquest perfil?", - "MessageConfirmRecordingCancellation": "Estàs segur que vols cancel·lar aquest enregistrament?", - "MessageConfirmRestart": "Esteu segur que voleu reiniciar Jellyfin?", - "MessageContactAdminToResetPassword": "Contacti amb l'administrador per restablir la contrasenya.", - "MessageDownloadQueued": "Descàrrega encuada.", - "MessageEnablingOptionLongerScans": "Habilitar aquesta opció pot resultar en escanejos de la llibreria significativament més lents.", - "MessageItemSaved": "Ítem desat.", - "MessageItemsAdded": "Ítems afegits.", + "MessageConfirmRecordingCancellation": "N'esteu segur, que voleu cancel·lar l'enregistrament?", + "MessageConfirmRestart": "N'esteu segur, que voleu reiniciar Jellyfin?", + "MessageContactAdminToResetPassword": "Si us plau, contacta amb l'administrador del sistema per a reestablir la contrasenya.", + "MessageDownloadQueued": "Descàrrega posada a la cua.", + "MessageEnablingOptionLongerScans": "Habilitar aquesta opció pot resultar en escanejos significativament més lents de la mediateca.", + "MessageItemSaved": "Element desat.", + "MessageItemsAdded": "Elements afegits.", "MessageNoAvailablePlugins": "No hi ha complements disponibles.", - "MessageNoMovieSuggestionsAvailable": "Per ara no hi ha suggerències de pel·lícules. Comenceu a veure i valorar les pel·lícules i torneu aquí per veure les recomanacions.", + "MessageNoMovieSuggestionsAvailable": "Per ara no hi ha suggeriments de pel·lícules. Comenceu a veure i valorar les pel·lícules i torneu aquí per veure les recomanacions.", "MessageNoPluginsInstalled": "No té cap complement instal·lat.", "MessageNoTrailersFound": "Instal·leu el canal de tràilers per millorar la vostra experiència de pel·lícula afegint una biblioteca de tràilers d'internet.", "MessageNothingHere": "Res per aquí.", - "MessagePleaseEnsureInternetMetadata": "Assegureu-vos que la descàrrega de metadades d'internet està habilitada.", + "MessagePleaseEnsureInternetMetadata": "Assegureu-vos que està habilitada la descàrrega de metadades d'internet.", "MessageYouHaveVersionInstalled": "Actualment teniu la versió {0} instal·lada.", - "MetadataManager": "Gestor de Metadades", + "MetadataManager": "Gestor de metadades", "MinutesAfter": "minuts després", "MinutesBefore": "minuts abans", "Mobile": "Mòbil", "Monday": "Dilluns", "MoreFromValue": "Més de {0}", - "MoreUsersCanBeAddedLater": "Es poden afegir més usuaris des del Tauler de control.", - "MoveLeft": "Moure a l'esquerra", - "MoveRight": "Moure a la dreta", + "MoreUsersCanBeAddedLater": "Es poden afegir més usuaris des del tauler de control.", + "MoveLeft": "Mou a l'esquerra", + "MoveRight": "Mou a la dreta", "Mute": "Silencia", "MySubtitles": "Els meus subtítols", "Name": "Nom", - "NewCollection": "Nova Col·lecció", - "NewCollectionHelp": "Les col·leccions et permeten crear agrupacions personalitzades de pel·lícules i altres continguts.", - "NewCollectionNameExample": "Exemple: Col·leció Star Wars", - "NewEpisodes": "Nous episodis", - "NewEpisodesOnly": "Només nous episodis", - "MessageNoNextUpItems": "Cap trobat. Comença a mirar els teus programes!", + "NewCollection": "Col·lecció nova", + "NewCollectionHelp": "Les col·leccions us permeten crear agrupacions personalitzades de pel·lícules i altres continguts.", + "NewCollectionNameExample": "Exemple: Star Wars - Col·leció", + "NewEpisodes": "Episodis nous", + "NewEpisodesOnly": "Només episodis nous", + "MessageNoNextUpItems": "No s'ha trobat cap. Comenceu a mirar les vostres sèries!", "MessageNoPluginConfiguration": "Aquest complement no té opcions de configuració.", "NoSubtitleSearchResultsFound": "No s'han trobat resultats.", "None": "Cap", @@ -422,114 +422,114 @@ "OnlyForcedSubtitlesHelp": "Només es carregaran aquells subtítols marcats com a forçats.", "OptionAdminUsers": "Administradors", "OptionAllUsers": "Tots els usuaris", - "OptionAllowBrowsingLiveTv": "Permetre accés a TV en directe", + "OptionAllowBrowsingLiveTv": "Permet l'accés a la televisió en directe", "OptionAllowContentDownloading": "Permetre descàrrega de mitjans", - "OptionAllowLinkSharing": "Permetre compartir els mitjans a les xarxes socials", - "OptionAllowLinkSharingHelp": "Només les pàgines web contenint informació multimèdia seran compartides. En cap cas es comparteixen fitxers públicament. Les comparticions estan limitades per temps i expiraran després de {0} dies.", - "OptionAllowManageLiveTv": "Permetre gestionar l'enregistrament de TV en directe", - "OptionAllowMediaPlayback": "Permetre reproducció multimèdia", - "OptionAllowRemoteControlOthers": "Permetre el control remot d'altres usuaris", - "OptionAllowRemoteSharedDevices": "Permetre el control remot dels dispositius compartits", - "OptionAllowRemoteSharedDevicesHelp": "Els dispositius DLNA es consideren compartits fins que un usuari comença a controlar-los.", - "OptionAllowUserToManageServer": "Permet a aquest usuari gestionar el servidor", - "OptionCommunityRating": "Valoració de la Comunitat", - "OptionCriticRating": "Valoració dels Crítics", + "OptionAllowLinkSharing": "Permet compartir a les xarxes socials", + "OptionAllowLinkSharingHelp": "Només es compartiran les pàgines web contenint informació multimèdia. En cap cas es comparteixen fitxers públicament. Les comparticions estan limitades per temps i expiraran després de {0} dies.", + "OptionAllowManageLiveTv": "Permet gestionar l'enregistrament de la televisió en directe", + "OptionAllowMediaPlayback": "Permet la reproducció multimèdia", + "OptionAllowRemoteControlOthers": "Permet el control remot d'altres usuaris", + "OptionAllowRemoteSharedDevices": "Permet el control remot dels dispositius compartits", + "OptionAllowRemoteSharedDevicesHelp": "Els dispositius DLNA es consideren compartits fins que un usuari comenci a controlar-los.", + "OptionAllowUserToManageServer": "Permet gestionar el servidor a aquest usuari", + "OptionCommunityRating": "Valoració de la comunitat", + "OptionCriticRating": "Valoració de la crítica", "OptionDaily": "Diari", - "OptionDateAdded": "Data Afegida", - "OptionDateAddedImportTime": "Empra la data d'escaneig", - "OptionDatePlayed": "Data de Reproducció", - "OptionDisableUser": "Desactiva aquest usuari", + "OptionDateAdded": "Afegit el", + "OptionDateAddedImportTime": "Fes servir la data d'escaneig", + "OptionDatePlayed": "Data de reproducció", + "OptionDisableUser": "Habilita aquest usuari", "OptionDisableUserHelp": "El servidor no permetrà cap connexió d’aquest usuari. Les connexions existents es tancaran immediatament.", "OptionDislikes": "No m'agrada", "OptionEmbedSubtitles": "Incrusta dins el contenidor", "OptionEnableAccessFromAllDevices": "Habilita l'accés des de tots els dispositius", "OptionEnableAccessToAllChannels": "Habilita l'accés a tots els canals", - "OptionEnableAccessToAllLibraries": "Habilita l'accés a totes les biblioteques", - "OptionEnableExternalContentInSuggestionsHelp": "Permet incloure tràilers d'internet i programes de TV en directe amb el continguts suggerits.", + "OptionEnableAccessToAllLibraries": "Habilita l'accés a totes les mediateques", + "OptionEnableExternalContentInSuggestionsHelp": "Permet incloure tràilers d'internet i programes de televisió en directe entre el contingut suggerit.", "OptionEquals": "Equival", "OptionEveryday": "Cada dia", "OptionExternallyDownloaded": "Descàrrega externa", - "OptionHasThemeSong": "Cançó Temàtica", - "OptionHasThemeVideo": "Vídeo Temàtic", + "OptionHasThemeSong": "Sintonia", + "OptionHasThemeVideo": "Vídeo temàtic", "OptionHideUser": "Oculta aquest usuari de les pantalles d'inici de sessió", "OptionHideUserFromLoginHelp": "Pràctic per a comptes d'administrador ocults o privats. L'usuari necessitarà accedir manualment introduint el seu nom d'usuari i contrasenya.", "OptionImdbRating": "Qualificació IMDb", "OptionLikes": "M'agrada", - "OptionMissingEpisode": "Episodis Perduts", + "OptionMissingEpisode": "Episodis perduts", "OptionNew": "Nou…", "OptionOnInterval": "En un interval", "OptionParentalRating": "Classificació parental", - "OptionPlayCount": "Nombre de Reproduccions", + "OptionPlayCount": "Nombre de reproduccions", "OptionReleaseDate": "Data d'estrena", - "OptionResumable": "Continuable", + "OptionResumable": "Es pot reprendre", "OptionSaveMetadataAsHidden": "Desa les metadades i les imatges com a fitxers ocults", "OptionSpecialEpisode": "Especials", "OptionSubstring": "Subcadena", "OptionTvdbRating": "Valoració de TVDB", - "OptionUnairedEpisode": "Episodis No Emesos", - "OptionWakeFromSleep": "Despertar", + "OptionUnairedEpisode": "Episodis no emesos", + "OptionWakeFromSleep": "Desperta de la hibernació", "OptionWeekdays": "Entre setmana", - "OptionWeekends": "Cap de setmana", - "OptionWeekly": "Setmanal", + "OptionWeekends": "Caps de setmana", + "OptionWeekly": "Setmanalment", "OriginalAirDateValue": "Data original d'emissió: {0}", - "PackageInstallCancelled": "Instal·lació de {0} (versió {1}) cancel·lada.", - "ParentalRating": "Valoració Parental", - "PasswordMatchError": "La confirmació de la contrasenya i la contrasenya han de coincidir.", - "PasswordResetComplete": "La contrasenya s'ha restablert.", - "PasswordResetConfirmation": "Estàs segur que vols restablir la contrasenya?", - "PasswordSaved": "Contrasenya desada.", + "PackageInstallCancelled": "S'ha cancel·lat la instal·lació de {0} (versió {1}).", + "ParentalRating": "Valoració parental", + "PasswordMatchError": "La contrasenya i la confirmació de la contrasenya han de ser iguals.", + "PasswordResetComplete": "S'ha restablert la contrasenya.", + "PasswordResetConfirmation": "N'esteu segur, que voleu restablir la contrasenya?", + "PasswordSaved": "S'ha desat la contrasenya.", "People": "Repartiment i equip", "Play": "Reprodueix", - "PlayAllFromHere": "Reprodueix tots des d'aquí", + "PlayAllFromHere": "Reprodueix-los tots des d'aquí", "PlayFromBeginning": "Reprodueix des de l'inici", "Played": "Reproduït", "Playlists": "Llistes de reproducció", "PleaseRestartServerName": "Reinicieu el Jellyfin a {0}.", - "Premiere": "Première", + "Premiere": "Estrena", "Producer": "Productor", "Programs": "Programes", "Quality": "Qualitat", "RecentlyWatched": "Reproduït recentment", - "RecommendationBecauseYouWatched": "Ja que has vist {0}", - "Record": "Grava", + "RecommendationBecauseYouWatched": "Perquè heu vist {0}", + "Record": "Enregistra", "RecordSeries": "Enregistra la sèrie", "RecordingCancelled": "Enregistrament cancel·lat.", "RecordingScheduled": "Enregistrament programat.", "Refresh": "Actualitza", - "RefreshMetadata": "Actualitza les metadades", - "RefreshQueued": "Actualització encuada.", - "ReleaseDate": "Estrena", - "RememberMe": "Recorda'm", + "RefreshMetadata": "Actualització de les metadades", + "RefreshQueued": "Actualització posada a la cua.", + "ReleaseDate": "Data d'estrena", + "RememberMe": "Recorda-m'ho", "RemoveFromCollection": "Elimina de la col·lecció", "RemoveFromPlaylist": "Esborra de la llista de reproducció", "Repeat": "Repeteix", - "RepeatEpisodes": "Repetir episodis", - "ReplaceAllMetadata": "Reemplaça totes les metadades", - "ReplaceExistingImages": "Reemplaça imatges existents", + "RepeatEpisodes": "Repeteix els episodis", + "ReplaceAllMetadata": "Substitució de totes les metadades", + "ReplaceExistingImages": "Substitueix les imatges existents", "ResumeAt": "Reprodueix des de {0}", "Saturday": "Dissabte", "Save": "Desa", "Screenshots": "Captures de pantalla", "Search": "Cerca", - "SearchForCollectionInternetMetadata": "Cerca a internet artwork i metadades", - "SearchForMissingMetadata": "Cerca metadades perdudes", - "SearchForSubtitles": "Cerca Subtítols", - "SendMessage": "Envia missatge", + "SearchForCollectionInternetMetadata": "Cerca imatges i metadades a Internet", + "SearchForMissingMetadata": "Cerca de metadades perdudes", + "SearchForSubtitles": "Cerca subtítols", + "SendMessage": "Envia un missatge", "SeriesCancelled": "Sèrie cancel·lada.", - "SeriesRecordingScheduled": "Enregistrament de la sèrie programat.", - "SeriesSettings": "Preferències de la sèrie", - "ServerUpdateNeeded": "El servidor necessita ser actualitzat. Per descarregar la darrera versió, visiteu {0}", - "Settings": "Preferències", - "SettingsSaved": "Preferències desades.", + "SeriesRecordingScheduled": "Enregistrament programat de la sèrie.", + "SeriesSettings": "Configuració de les sèries", + "ServerUpdateNeeded": "El servidor necessita ser actualitzat. Per a descarregar la darrera versió, visiteu {0}", + "Settings": "Configuració", + "SettingsSaved": "Configuració desada.", "Share": "Comparteix", "ShowIndicatorsFor": "Mostra indicadors per a", "Shuffle": "Aleatori", - "SkipEpisodesAlreadyInMyLibrary": "No enregistris episodis que ja estan a la meva biblioteca", - "SkipEpisodesAlreadyInMyLibraryHelp": "Els episodis es compararan emprant la temporada i el nombre d'episodi quan siguin disponibles.", - "SortName": "Nom per endreçar", + "SkipEpisodesAlreadyInMyLibrary": "No enregistris episodis que ja són a la mediateca", + "SkipEpisodesAlreadyInMyLibraryHelp": "Els episodis es compararan emprant la temporada i el nombre d'episodi quan estiguin disponibles.", + "SortName": "Nom d'ordenació", "Studios": "Estudis", "Subtitles": "Subtítols", - "Suggestions": "Suggerències", + "Suggestions": "Suggeriments", "Sunday": "Diumenge", "Sync": "Sincronitzar", "TabAccess": "Accés", @@ -542,48 +542,48 @@ "TabLatest": "Novetats", "TabMusic": "Música", "TabMyPlugins": "Els meus complements", - "TabNetworks": "Cadenes de TV", - "TabNfoSettings": "Preferències NFO", + "TabNetworks": "Cadenes de televisió", + "TabNfoSettings": "Configuració de NFO", "TabNotifications": "Notificacions", "TabOther": "Altres", "TabParentalControl": "Control parental", "TabPlugins": "Complements", "TabProfiles": "Perfils", "TabResponses": "Respostes", - "TabScheduledTasks": "Tasques Programades", + "TabScheduledTasks": "Tasques programades", "TabServer": "Servidor", "TabUpcoming": "Properament", "Tags": "Etiquetes", - "TellUsAboutYourself": "Explica'ns sobre tu", - "TheseSettingsAffectSubtitlesOnThisDevice": "Aquestes preferències afecten els subtítols d'aquest dispositiu", - "ThisWizardWillGuideYou": "Aquest assistent us guiarà durant el procés d'instal·lació. Per començar, seleccioneu el vostre idioma preferit.", + "TellUsAboutYourself": "Expliqueu-nos com sou", + "TheseSettingsAffectSubtitlesOnThisDevice": "Aquestes configuracions afecten els subtítols d'aquest dispositiu", + "ThisWizardWillGuideYou": "Aquest assistent us guiarà durant el procés d'instal·lació. Per començar, entreu el nom del servidor i seleccioneu el vostre idioma preferit.", "Thursday": "Dijous", "TitlePlayback": "Reproducció", "TrackCount": "{0} pistes", "Tuesday": "Dimarts", - "UninstallPluginConfirmation": "Està segur que vol desinstal·lar {0}?", - "HeaderUninstallPlugin": "Desinstal·lar complement", + "UninstallPluginConfirmation": "N'esteu segur, que voleu desinstal·lar {0}?", + "HeaderUninstallPlugin": "Desinstal·la complement", "Unmute": "De-silencia", "Unrated": "Sense valorar", "Up": "Amunt", - "UserProfilesIntro": "El Jellyfin inclou suport per a perfils d'usuari amb configuració de pantalla granular, estat de reproducció i controls parentals.", + "UserProfilesIntro": "Jellyfin inclou suport per a perfils d'usuari amb configuració de pantalla granular, estat de reproducció i controls parentals.", "ValueEpisodeCount": "{0} episodis", - "ValueMusicVideoCount": "{0} vídeos musicals", - "ValueOneMusicVideo": "1 vídeo musical", + "ValueMusicVideoCount": "{0} videoclips", + "ValueOneMusicVideo": "1 videoclip", "ValueSpecialEpisodeName": "Especial - {0}", - "ViewAlbum": "Veure àlbum", - "ViewPlaybackInfo": "Veure informació de reproducció", - "Watched": "Vists", + "ViewAlbum": "Mostra'n l'àlbum", + "ViewPlaybackInfo": "Mostra la informació de reproducció", + "Watched": "Vist", "Wednesday": "Dimecres", - "WelcomeToProject": "Benvingut a Jellyfin!", - "WizardCompleted": "Això és tot el que necessitem per ara. Jellyfin ha començat a recollir informació de la vostra biblioteca multimèdia. Mireu-vos alguna de les nostres apps i llavors feu clic a Finalitzar per veure el Tauler de control.", + "WelcomeToProject": "Us donem la benvinguda a Jellyfin!", + "WizardCompleted": "Això és tot el que necessitem per ara. Jellyfin ha començat a recollir informació de la vostra mediateca. Mireu-vos alguna de les nostres apps i llavors feu clic a Finalitza per veure el Tauler de control.", "Writer": "Escriptor", "XmlTvKidsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes infantils. Separa'n varis emprant '|'.", "XmlTvMovieCategoriesHelp": "Els programes amb aquestes categories es mostraran com a pel·lícules. Separa'n varis emprant '|'.", "XmlTvNewsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes de notícies. Separa'n varis emprant '|'.", "XmlTvSportsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes esportius. Separa'n varis emprant '|'.", "Books": "Llibres", - "Folders": "Carpetes", + "Folders": "Directoris", "Photos": "Fotos", "Shows": "Sèries", "Songs": "Cançons", @@ -596,98 +596,98 @@ "ChannelNumber": "Número de canal", "Categories": "Categories", "ButtonWebsite": "Lloc web", - "ButtonUninstall": "Desinstal·lar", - "ButtonSplit": "Dividir", - "ButtonStart": "Començar", - "ButtonSelectView": "Selecciona la vista", - "ButtonScanAllLibraries": "Escanejar totes les biblioteques", - "ButtonRevoke": "Revocar", - "ButtonRename": "Canviar el nom", + "ButtonUninstall": "Desinstal·la", + "ButtonSplit": "Divideix", + "ButtonStart": "Comença", + "ButtonSelectView": "Seleccioneu la vista", + "ButtonScanAllLibraries": "Escaneja totes les mediateques", + "ButtonRevoke": "Revoca", + "ButtonRename": "Canvia el nom", "ButtonNetwork": "Xarxa", "ButtonInfo": "Informació", "ButtonFullscreen": "Pantalla completa", "ButtonAudioTracks": "Pistes d'àudio", - "ButtonAddImage": "Afegir imatge", + "ButtonAddImage": "Afegiu-hi una imatge", "Blacklist": "Llista negra", "BirthPlaceValue": "Lloc de naixement: {0}", "BirthLocation": "Lloc de naixement", "BirthDateValue": "Nascut: {0}", "Banner": "Pancarta", - "Auto": "Auto", - "AuthProviderHelp": "Selecciona un proveïdor d'autenticació per utilitzar per autenticar la contrasenya d'aquest usuari.", - "AskAdminToCreateLibrary": "Demanar a un administrador que creï una biblioteca.", + "Auto": "Automàtic", + "AuthProviderHelp": "Trieu un proveïdor d'autenticació que s'usarà per a autenticar la contrasenya d'aquest usuari.", + "AskAdminToCreateLibrary": "Demana a un administrador que creï una mediateca.", "Ascending": "Ascendent", - "Art": "Clearart", + "Art": "Imatge transparent", "Anytime": "En qualsevol moment", "AnyLanguage": "Qualsevol idioma", "AlwaysPlaySubtitlesHelp": "Es carregaran els subtítols que coincideixin amb la preferència d’idioma independentment de l'idioma de l’àudio.", "AllowRemoteAccessHelp": "Si no es marca, totes les connexions remotes es bloquejaran.", - "AllowRemoteAccess": "Permetre connexions remotes a aquest servidor", - "AllowOnTheFlySubtitleExtraction": "Permetre extreure subtítols sobre la marxa", - "AllowMediaConversionHelp": "Concedir o denegar l’accés a la funció de mitjans de conversió.", - "AllowMediaConversion": "Permetre la conversió de mitjans", - "AllowHWTranscodingHelp": "Permet al sintonitzador transcodifique els fluxos sobre la marxa.", - "AllLibraries": "Totes les biblioteques", + "AllowRemoteAccess": "Permet connexions remotes a aquest servidor", + "AllowOnTheFlySubtitleExtraction": "Permet extreure subtítols sobre la marxa", + "AllowMediaConversionHelp": "Concedeix o denega l’accés a la funció de conversió de contingut multimèdia.", + "AllowMediaConversion": "Permet la conversió de continguts multimèdia", + "AllowHWTranscodingHelp": "Permet al sintonitzador que transcodifiqui els fluxos sobre la marxa. Això pot ajudar a reduir els requisits de transcodificació del servidor.", + "AllLibraries": "Totes les mediateques", "AllLanguages": "Tots els idiomes", "AllComplexFormats": "Tots els formats complexos (ASS, SSA, VobSub, PGS, SUB / IDX, etc.)", "Alerts": "Alertes", - "Aired": "Airejat", + "Aired": "Emissió", "AirDate": "Data d'emissió", "AdditionalNotificationServices": "Examineu el catàleg de complements per instal·lar serveis de notificació addicionals.", "AddedOnValue": "Afegit {0}", "Actor": "Actor", "Absolute": "Absolut", "ClientSettings": "Configuració del client", - "CinemaModeConfigurationHelp": "El mode Cinema aporta l'experiència del teatre directament a la sala d'estar amb la possibilitat de jugar a tràilers i presentacions personalitzades abans de la funció principal.", + "CinemaModeConfigurationHelp": "El mode de cinema proporciona l'experiència d'aquest a la sala d'estar, amb la possibilitat de reproduir tràilers i presentacions personalitzades abans del títol principal.", "ChannelNameOnly": "Només el canal {0}", - "ChangingMetadataImageSettingsNewContent": "Els canvis als paràmetres de descàrrega de metadades o d'imatge només s'apliquen al contingut nou afegit a la biblioteca. Per aplicar els canvis als títols existents, haureu d'actualitzar les metadades manualment.", + "ChangingMetadataImageSettingsNewContent": "Els canvis als paràmetres de descàrrega de metadades o imatges només s'apliquen al contingut nou afegit a la mediateca. Per a aplicar els canvis als títols existents, haureu d'actualitzar les metadades manualment.", "ButtonTogglePlaylist": "Llista de reproducció", - "BurnSubtitlesHelp": "Determina si el servidor hauria de gravar els subtítols. Evitant això millorarà molt el rendiment. Selecciona Auto per gravar formats basats en imatges (VobSub, PGS, SUB, IDX) i certs subtítols ASS o SSA.", + "BurnSubtitlesHelp": "Determina si el servidor hauria de gravar els subtítols. Evitant això millorarà molt el rendiment. Selecciona Automàtic per gravar formats basats en imatges (VobSub, PGS, SUB, IDX) i certs subtítols ASS o SSA.", "Browse": "Navega", - "BoxRear": "Caixa (posterior)", - "BoxSet": "Col·leció", - "Box": "Caixa", - "BookLibraryHelp": "Àudiollibres i llibres de text son compatibles. Reviseu la {0} guia de denominació de llibres {1}.", + "BoxRear": "Capsa (darrere)", + "BoxSet": "Cofre", + "Box": "Capsa", + "BookLibraryHelp": "Els àudiollibres i llibres de text funcionen. Reviseu la {0} guia de denominació de llibres {1}.", "Backdrops": "Fons", "Backdrop": "Fons", "Artist": "Artista", "AllowedRemoteAddressesHelp": "Llista d’adreces IP o d’entrades IP/netmask separades per comes per a xarxes que podran connectar-se de forma remota. Si es deixa en blanc, es permetran totes les adreces remotes.", - "AllowFfmpegThrottlingHelp": "Quan una transcodificació o un remux estigui prou lluny de la posició de reproducció actual, fer una pausa en el procés de manera que consumeixi menys recursos. Especialment útil si es visualitza sense tirar endavant o endarrere sovint. Desactiveu-la si teniu problemes de reproducció.", - "AllowFfmpegThrottling": "Regular les transcodificacions", + "AllowFfmpegThrottlingHelp": "Quan una transcodificació o un remux s'avança prou de la posició de reproducció actual, atura el procés per a què consumeixi menys recursos. És especialment útil si no es fan gaire cerques mentre es reprodueix el contingut. Desactiveu-ho si dona problemes de reproducció o si canvieu sovint de posició mentre reproduïu continguts.", + "AllowFfmpegThrottling": "Regula les transcodificacions", "AllowOnTheFlySubtitleExtractionHelp": "Els subtítols incrustats es poden extreure de vídeos i lliurar-los als clients en text pla, per tal d’evitar la transcodificació de vídeos. En alguns sistemes, això pot trigar molt de temps i fer que la reproducció de vídeo s'aturi durant el procés d’extracció. Desactiveu aquesta opció perquè els subtítols incrustats es gravin amb la transcodificació de vídeo quan el dispositiu client no els admeti de forma nativa.", "AlbumArtist": "Artista de l'àlbum", "Album": "Àlbum", "ButtonSyncPlay": "Reproducció sincronitzada", - "CriticRating": "Valoració dels сrítics", + "CriticRating": "Valoració de les crítiques", "CopyStreamURLSuccess": "L'URL s'ha copiat correctament.", "CopyStreamURL": "Copia l'URL de reproducció", - "ContinueWatching": "Continuar mirant", - "ConfirmEndPlayerSession": "Vols tancar Jellyfin a {0}?", - "ConfirmDeleteItems": "L'esborrat d'aquests elements els eliminarà del sistema de fitxers i de la biblioteca de mitjans. Esteu segurs que voleu continuar?", - "ConfirmDeleteItem": "L'esborrat d'aquest element l'eliminarà del sistema de fitxers i de la biblioteca multimèdia. Esteu segurs que voleu continuar?", - "ConfigureDateAdded": "Configureu com es determinen les metadades de la \"Data d'afegit\" al Tauler > Biblioteques > Visualització", - "CommunityRating": "Ràting comunitari", + "ContinueWatching": "Continueu mirant-ho", + "ConfirmEndPlayerSession": "Desitgeu tancar Jellyfin a {0}?", + "ConfirmDeleteItems": "L'eliminació d'aquests elements els suprimirà del sistema de fitxers i de la mediateca. N'esteu segur, que desitgeu continuar?", + "ConfirmDeleteItem": "Eliminar aquest element l'eliminarà del sistema de fitxers i de la mediateca. N'esteu segur, que desitgeu continuar?", + "ConfigureDateAdded": "Configureu com es determinen les metadades de la \"Data d'afegit\" al Tauler > Mediateques > Visualització", + "CommunityRating": "Valoració de la comunitat", "ColorTransfer": "Transferència de color", "ColorSpace": "Espai de color", "ColorPrimaries": "Colors primaris", - "DefaultMetadataLangaugeDescription": "Aquests son els vostres valors per defecte i poden ser personalitzats per a cada biblioteca.", + "DefaultMetadataLangaugeDescription": "Aquests són els vostres valors per defecte i poden ser personalitzats per a cada mediateca.", "Default": "Per defecte", - "DatePlayed": "Data reproduït", + "DatePlayed": "Data de reproducció", "DateAdded": "Data d'addició", "CustomDlnaProfilesHelp": "Crear un perfil personalitzat per a un nou dispositiu o substituir un perfil de sistema.", "HeaderAdmin": "Administració", "HeaderAccessScheduleHelp": "Creeu un horari d'accés per limitar l'accés a determinades hores.", "HardwareAccelerationWarning": "Habilitar l'acceleració del maquinari pot causar inestabilitat en alguns entorns. Assegureu-vos que el sistema operatiu i els controladors de vídeo estiguin totalment actualitzats. Si teniu dificultats per reproduir el vídeo després d’activar-lo, haureu de tornar a canviar la configuració a Cap.", - "EncoderPresetHelp": "Triar un valor més ràpid per millorar el rendiment o un valor més lent per millorar la qualitat.", - "GuideProviderLogin": "Iniciar sessió", + "EncoderPresetHelp": "Tria un valor més ràpid per millorar el rendiment o un valor més lent per millorar la qualitat.", + "GuideProviderLogin": "Inicieu la sessió", "Guide": "Guia", - "GroupBySeries": "Agrupar per sèries", + "GroupBySeries": "Agrupa per sèries", "Other": "Altres", "Genre": "Gènere", "General": "General", "FormatValue": "Format: {0}", "Filters": "Filtres", - "FetchingData": "Obtenint dades addicionals", + "FetchingData": "S'estan obtenint dades addicionals", "Features": "Característiques", "FastForward": "Avanç ràpid", "Extras": "Extres", @@ -695,96 +695,96 @@ "EveryNDays": "Cada {0} dies", "ErrorSavingTvProvider": "S'ha produït un error en desar el proveïdor de televisió. Assegureu-vos que sigui accessible i torneu-ho a provar.", "ErrorStartHourGreaterThanEnd": "L'hora de finalització ha de ser superior a l'hora d'inici.", - "ErrorGettingTvLineups": "S'ha produït un error al baixar les programacions de TV. Comproveu que la vostra informació sigui correcta i torneu-ho a provar.", - "ErrorDeletingItem": "S'ha produït un error al suprimir l'element del servidor. Comproveu que Jellyfin tingui accés d’escriptura a la carpeta multimèdia i torneu-ho a provar.", + "ErrorGettingTvLineups": "S'ha produït un error en descarregar les programacions de televisió. Comproveu que la vostra informació sigui correcta i torneu-ho a provar.", + "ErrorDeletingItem": "S'ha produït un error en suprimir l'element del servidor. Comproveu que Jellyfin tingui accés d’escriptura a la carpeta multimèdia i torneu-ho a provar.", "ErrorAddingXmlTvFile": "S'ha produït un error en accedir al fitxer XMLTV. Assegureu-vos que el fitxer existeix i torneu-ho a provar.", "ErrorAddingTunerDevice": "S'ha produït un error en afegir el dispositiu sintonitzador. Assegureu-vos que sigui accessible i torneu-ho a provar.", "ErrorAddingMediaPathToVirtualFolder": "S'ha produït un error en afegir la ruta multimèdia. Assegureu-vos que la ruta sigui vàlida i que Jellyfin tingui accés a aquesta ubicació.", "Episode": "Episodi", - "EnableThemeSongsHelp": "Reprodueix sintonies en segon pla mentre navegues per la biblioteca.", - "EnableStreamLooping": "Bucle automàtic en emisions en directe", - "EnableQuickConnect": "Activar Quick Connect en aquest servidor", + "EnableThemeSongsHelp": "Reprodueix sintonies en segon pla mentre es navega per la mediateca.", + "EnableStreamLooping": "Bucle automàtic en emissions en directe", + "EnableQuickConnect": "Habilita Quick Connect (connexió ràpida) en aquest servidor", "EnablePhotosHelp": "Les imatges es detectaran i es mostraran al costat d'altres fitxers multimèdia.", - "EnablePhotos": "Mostrar fotos", - "EnableNextVideoInfoOverlayHelp": "Al final d'un vídeo, mostreu informació sobre el següent vídeo que apareix a la llista de reproducció actual.", + "EnablePhotos": "Mostra les fotos", + "EnableNextVideoInfoOverlayHelp": "Al final d'un vídeo, mostreu informació sobre el següent vídeo que aparegui a la llista de reproducció actual.", "EnableNextVideoInfoOverlay": "Mostra la informació del següent vídeo durant la reproducció", "EnableHardwareEncoding": "Activa la codificació de maquinari", "EnableExternalVideoPlayersHelp": "Es mostrarà un menú de reproductor extern en iniciar la reproducció de vídeo.", - "EnableExternalVideoPlayers": "Reproductors de vídeo externs", - "EnableDecodingColorDepth10Vp9": "Activar la descodificació de maquinari de 10 bits per a VP9", - "EnableDecodingColorDepth10Hevc": "Activar la descodificació de maquinari de 10 bits per a HEVC", - "EnableBackdropsHelp": "Mostra imatges al fons d'algunes pàgines mentre navegueu per la biblioteca.", - "EnableAutoCast": "Establir com a per defecte", - "EditMetadata": "Edita les metadades", + "EnableExternalVideoPlayers": "Reproductors externs de vídeo", + "EnableDecodingColorDepth10Vp9": "Deshabilita la descodificació de maquinari de 10 bits per a VP9", + "EnableDecodingColorDepth10Hevc": "Habilita la descodificació de maquinari de 10 bits per a HEVC", + "EnableBackdropsHelp": "Mostra imatges al fons d'algunes pàgines mentre es navega per la mediateca.", + "EnableAutoCast": "Estableix com a per defecte", + "EditMetadata": "Edició de metadades", "EasyPasswordHelp": "El vostre codi Easy PIN s'utilitza per accedir fora de línia als clients compatibles i també es pot utilitzar per iniciar la sessió a la xarxa fàcilment.", "DrmChannelsNotImported": "Els canals amb DRM no s’importaran.", "DownloadsValue": "{0} descàrregues", - "DisplayMissingEpisodesWithinSeasonsHelp": "Això també s'ha d'activar per a les biblioteques de TV a la configuració del servidor.", - "DisplayInOtherHomeScreenSections": "Mostra a les seccions de la pantalla d'inici, com ara 'Mitjans afegits darrerament' i 'Continua mirant-ho'", - "DisplayInMyMedia": "Mostra a la pantalla inicial", - "Display": "Mostra", + "DisplayMissingEpisodesWithinSeasonsHelp": "Això també s'ha d'activar per a les mediateques de televisió a la configuració del servidor.", + "DisplayInOtherHomeScreenSections": "Mostra a les seccions de la pantalla d'inici, com ara a 'Contingut multimèdia afegit darrerament' i 'Continueu mirant-ho'", + "DisplayInMyMedia": "Mostra a la pantalla principal", + "Display": "Pantalla", "Disc": "Disc", "Directors": "Directors", "Director": "Director", "DirectStreaming": "Transmissió directa", "DirectStreamHelp2": "La potència consumida per la transmissió directa normalment depèn del perfil d'àudio. Només el flux de vídeo no té pèrdues.", "DirectPlaying": "Reproducció directe", - "DetectingDevices": "Detectant dispositius", + "DetectingDevices": "S'estan detectant dispositius", "Descending": "Descendent", - "DeleteUserConfirmation": "Esteu segurs que voleu eliminar aquest usuari?", - "DeleteDeviceConfirmation": "Esteu segurs que voleu suprimir aquest dispositiu? Tornarà a aparèixer la propera vegada que un usuari iniciï la sessió amb ell.", + "DeleteUserConfirmation": "N'esteu segur, que voleu eliminar aquest usuari?", + "DeleteDeviceConfirmation": "N'esteu segur, que voleu suprimir aquest dispositiu? Tornarà a aparèixer la pròxima vegada que un usuari iniciï la sessió amb aquest.", "Data": "Dades", - "ButtonUseQuickConnect": "Utilitzar Quick Connect", - "ButtonActivate": "Activar", - "Authorize": "Autoritzar", + "ButtonUseQuickConnect": "Fes servir Quick Connect (connexió ràpida)", + "ButtonActivate": "Activa", + "Authorize": "Autoritza", "LabelServerName": "Nom del servidor", - "MessageChromecastConnectionError": "El seu receptor de Google Cast no pot contactar amb el servidor de Jellyfin. Comproveu la connexió i torneu-ho a provar.", - "MessagePlaybackError": "Hi ha hagut un problema reproduïnt aquest arxiu al teu receptor de Google Cast.", - "EnableEnhancedNvdecDecoder": "Activa el decodificador NVDEC millorat", + "MessageChromecastConnectionError": "El receptor de Google Cast no pot contactar amb el servidor de Jellyfin. Comproveu la connexió i torneu-ho a provar.", + "MessagePlaybackError": "S'ha produït un error en reproduir aquest fitxer en el receptor de Google Cast.", + "EnableEnhancedNvdecDecoder": "Habilita el descodificador NVDEC millorat", "DefaultSubtitlesHelp": "Els subtítols es carreguen en funció de les marques forçades i per defecte de les metadades incrustades. Les preferències d'idioma es consideren quan hi ha diverses opcions disponibles.", "DeathDateValue": "Mort: {0}", "DashboardVersionNumber": "Versió: {0}", "DashboardServerName": "Servidor: {0}", "DashboardOperatingSystem": "Sistema Operatiu: {0}", "DashboardArchitecture": "Arquitectura: {0}", - "DailyAt": "Diariament a {0}", + "DailyAt": "Diàriament a les {0}", "ClearQueue": "Esborra la cua", - "Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)", + "Bwdif": "Filtre de desentrellat de Bob Weaver", "ButtonPlayer": "Reproductor", - "ButtonCast": "Transmetre a dispositiu", + "ButtonCast": "Transmet al dispositiu", "ApiKeysCaption": "Llista de les claus API activades actualment", - "AllowTonemappingHelp": "El mapeig de tons pot transformar el rang dinàmic d'un vídeo d'HDR a SDR mantenint els detalls i els colors de la imatge, que són informació molt important per representar l'escena original. Actualment només funciona amb vídeos 10 bit HDR10, HLG o DoVi. Això requereix el temps d'execució GPGPU corresponent.", - "ErrorPleaseSelectLineup": "Seleccioneu una alineació i torneu-ho a provar. Si no hi ha cap formació disponible, comproveu que el vostre nom d’usuari, contrasenya i codi postal siguin correctes.", - "ErrorAddingListingsToSchedulesDirect": "S'ha produït un error en afegir la programació al vostre compte de Schedules Direct. Schedules Direct només permet un nombre limitat de programacions per compte. És possible que hagueu d’iniciar sessió al lloc web de Schedules Direct i eliminar altres llistats del vostre compte abans de continuar.", - "EnableThemeVideosHelp": "Reproduir vídeos temàtics en segon pla mentre navegues per la biblioteca.", + "AllowTonemappingHelp": "El mapatge de tons pot transformar el rang dinàmic d'un vídeo d'HDR a SDR mantenint els detalls i els colors de la imatge, que són informació molt important per representar l'escena original. Actualment només funciona amb vídeos 10 bit HDR10, HLG o DoVi. Això requereix el temps d'execució GPGPU corresponent.", + "ErrorPleaseSelectLineup": "Trieu una alineació i torneu-ho a provar. Si no hi ha cap formació disponible, comproveu que el vostre nom d’usuari, contrasenya i codi postal siguin correctes.", + "ErrorAddingListingsToSchedulesDirect": "S'ha produït un error en afegir la programació al vostre compte de Schedules Direct. Schedules Direct només permet un nombre limitat de programacions per compte. És possible que hàgiu d’iniciar sessió al lloc web de Schedules Direct i eliminar altres llistats del vostre compte abans de continuar.", + "EnableThemeVideosHelp": "Reprodueix vídeos temàtics en segon pla mentre es navega per la mediateca.", "EnableStreamLoopingHelp": "Activeu aquesta opció si les transmissions en directe només contenen uns segons de dades i cal sol·licitar-les contínuament. Habilitar-ho quan no sigui necessari pot causar problemes.", "EnableFasterAnimationsHelp": "Utilitzeu animacions i transicions més ràpides.", "EnableFasterAnimations": "Animacions més ràpides", - "EnableDetailsBannerHelp": "Mostra una imatge de bàner a la part superior de la pàgina de detalls de l'article.", - "EnableDetailsBanner": "Bàner de detalls", + "EnableDetailsBannerHelp": "Mostra una pancarta al cim de la pàgina de detalls de l'element.", + "EnableDetailsBanner": "Pancarta de detalls", "EnableColorCodedBackgrounds": "Fons codificats per colors", - "EnableBlurHashHelp": "Les imatges que encara s'estan carregant es mostraran amb un marcador de posició únic.", - "EnableBlurHash": "Habilitar marcadors de posició borrosos per a imatges", - "DropShadow": "Projectar ombra", - "DisablePlugin": "Desactivar", - "EnablePlugin": "Activar", + "EnableBlurHashHelp": "Les imatges que encara s'estan carregant es mostraran amb un marcador únic de posició.", + "EnableBlurHash": "Habilita marcadors de posició borrosos per a imatges", + "DropShadow": "Projecció d'ombra", + "DisablePlugin": "Deshabilita", + "EnablePlugin": "Habilita", "DirectStreamHelp1": "El flux de vídeo és compatible amb el dispositiu, però té un format d'àudio incompatible (DTS, Dolby TrueHD, etc.) o un nombre de canals d'àudio. El flux de vídeo es tornarà a empaquetar sense pèrdues sobre la marxa abans d'enviar-lo al dispositiu. Només es transcodificarà el flux d'àudio.", "DirectPlayHelp": "El fitxer font és totalment compatible amb aquest client i la sessió rep el fitxer sense modificacions.", - "DeleteDevicesConfirmation": "Esteu segurs que voleu suprimir tots els dispositius? Es tancaran la sessió de la resta de sessions. Els dispositius tornaran a aparèixer la pròxima vegada que un usuari iniciï la sessió.", - "DeleteAll": "Eliminar tots", + "DeleteDevicesConfirmation": "N'esteu segur, que voleu suprimir tots els dispositius? Totes les altres sessions es tancaran. Els dispositius reapareixeran la pròxima vegada que un usuari iniciï la sessió.", + "DeleteAll": "Elimina-ho tot", "DeinterlaceMethodHelp": "Seleccioneu el mètode de desentrellaçat que voleu utilitzar quan transcodifiqueu el programari de contingut entrellaçat. Quan està activada l'acceleració de maquinari que admet el desentrellaçat de maquinari, s'utilitzarà el desentrellaçador de maquinari en lloc d'aquesta configuració.", "HeaderDirectPlayProfileHelp": "Afegiu perfils de reproducció directa per indicar quins formats pot gestionar el dispositiu de forma nativa.", - "HeaderDetectMyDevices": "Detectar els meus dispositius", - "HeaderDeleteTaskTrigger": "Esborrar el disparador de tasques", - "HeaderDeleteProvider": "Esborrar el proveïdor", - "HeaderDeleteItems": "Esborrar els ítems", - "HeaderDeleteDevices": "Eliminar tots els dispositius", + "HeaderDetectMyDevices": "Elimina els meus dispositius", + "HeaderDeleteTaskTrigger": "S'està eliminant el detonador de tasques", + "HeaderDeleteProvider": "Elimina el proveïdor", + "HeaderDeleteItems": "Elimina els elements", + "HeaderDeleteDevices": "Elimina tots els dispositius", "HeaderDebugging": "Depuració i traceig", - "HeaderContinueReading": "Continuar llegint", + "HeaderContinueReading": "Continueu llegint", "HeaderConnectionFailure": "Error de connexió", - "HeaderConfirmRevokeApiKey": "Revocar la clau API", + "HeaderConfirmRevokeApiKey": "Revoca la clau API", "HeaderConfirmPluginInstallation": "Confirmeu la instal·lació del complement", - "HeaderConfigureRemoteAccess": "Configurar l'accés remot", + "HeaderConfigureRemoteAccess": "Configura l'accés remot", "HeaderCodecProfileHelp": "Els perfils dels còdecs indiquen les limitacions d’un dispositiu quan es reprodueixen codecs específics. Si s'aplica una limitació, els mitjans es transcodificaran fins i tot si el còdec està configurat per a la reproducció directa.", "HeaderChapterImages": "Imatges dels capítols", "HeaderChannelAccess": "Accés al canal", @@ -793,93 +793,93 @@ "HeaderAudioBooks": "Audiollibres", "HeaderAppearsOn": "Apareix a", "HeaderApp": "Aplicació", - "HeaderAllowMediaDeletionFrom": "Permetre la supressió de mitjans des de", + "HeaderAllowMediaDeletionFrom": "Permet l'eliminació de continguts multimèdia de", "HeaderAlert": "Alerta", - "HeaderAddUser": "Afegir un usuari", - "HeaderAddUpdateSubtitle": "Afegir o actualitzar els subtítols", + "HeaderAddUser": "Afegeix un usuari", + "HeaderAddUpdateSubtitle": "Afegeix o actualitza els subtítols", "H264CrfHelp": "El factor de velocitat constant (CRF) és el valor de qualitat predeterminat per als codificadors de programari x264 i x265. Podeu definir els valors entre 0 i 51, on els valors més baixos donarien com a resultat una millor qualitat (a costa de mides de fitxer més altes). Els valors correctes oscil·len entre 18 i 28. El valor predeterminat per a x264 és 23 i per a x265 és 28, de manera que podeu utilitzar-lo com a punt de partida. Els codificadors per maquinari no utilitzen aquesta configuració.", - "GuideProviderSelectListings": "Seleccionar Llistats", - "GroupVersions": "Grups de versions", + "GuideProviderSelectListings": "Seleccioneu llistats", + "GroupVersions": "Agrupa versions", "Framerate": "Velocitat de fotogrames", "Filter": "Filtre", - "FFmpegSavePathNotFound": "No podem localitzar FFmpeg mitjançant el directori que heu introduït. FFprobe també és obligatori i ha d’existir a la mateixa carpeta. Aquests components normalment s’agrupen en la mateixa descàrrega. Comproveu el directori i torneu-ho a provar.", - "ExtractChapterImagesHelp": "L'extracció d'imatges de capítols permetrà als clients mostrar menús gràfics de selecció d'escena. El procés pot ser lent, intensiu en recursos i pot requerir diversos gigabytes d’espai. S’executa quan es descobreixen els vídeos i també com una tasca programada cada nit. La programació es pot configurar a l'àrea de tasques programades. No es recomana executar aquesta tasca durant les hores màximes d'ús.", + "FFmpegSavePathNotFound": "No podem localitzar FFmpeg mitjançant la ruta que heu introduït. FFprobe també és obligatori i ha d’existir a la mateixa carpeta. Aquests components normalment s’agrupen en la mateixa descàrrega. Comproveu la ruta i torneu-ho a provar.", + "ExtractChapterImagesHelp": "L'extracció d'imatges de capítols permetrà als clients mostrar menús gràfics de selecció d'escena. El procés pot ser lent, intensiu en recursos i pot requerir diversos gigabytes d’espai. S’executa quan es descobreixen els vídeos i també com a una tasca programada cada nit. La programació es pot configurar a l'àrea de tasques programades. No es recomana executar aquesta tasca durant les hores de més ús.", "EveryXMinutes": "Cada {0} minuts", "EveryXHours": "Cada {0} hores", "EveryHour": "Cada hora", - "EnableTonemapping": "Activa l'assignació de tons", + "EnableTonemapping": "Habilita el mapatge de tons", "DisableCustomCss": "Desactiveu el CSS personalitzat proporcionat pel servidor", "Depressed": "Deprimit", "AudioBitDepthNotSupported": "La profunditat de bits d'àudio no és compatible", - "VideoProfileNotSupported": "El perfil d'el còdec de vídeo no és compatible", - "VideoLevelNotSupported": "El nivell de l'còdec de vídeo no és compatible", + "VideoProfileNotSupported": "El perfil del còdec de vídeo no és compatible", + "VideoLevelNotSupported": "El nivell del còdec de vídeo no és compatible", "VideoFramerateNotSupported": "La velocitat de fotogrames de vídeo no és compatible", "VideoBitDepthNotSupported": "La profunditat de bits de vídeo no és compatible", - "RefFramesNotSupported": "Sistemes de referència no són compatibles", - "SecondaryAudioNotSupported": "Pistes d'àudio secundaris no són compatibles", - "InterlacedVideoNotSupported": "Vídeo entrellaçat no és compatible", - "AnamorphicVideoNotSupported": "Vídeo anamòrfic no és compatible", - "AudioSampleRateNotSupported": "Velocitat de mostreig de l'àudio no és compatible", - "AudioProfileNotSupported": "El perfil d'el còdec d'àudio no és compatible", - "VideoResolutionNotSupported": "No s'admet la resolució de el vídeo", - "AudioChannelsNotSupported": "No s'admet el nombre de canals d'àudio", - "AudioBitrateNotSupported": "Taxa de bits d'àudio no és compatible", + "RefFramesNotSupported": "Els fotogrames de referència no són compatibles", + "SecondaryAudioNotSupported": "Les pistes d'àudio secundàries no són compatibles", + "InterlacedVideoNotSupported": "El vídeo entrellaçat no és compatible", + "AnamorphicVideoNotSupported": "El vídeo anamòrfic no és compatible", + "AudioSampleRateNotSupported": "La velocitat de mostreig de l'àudio no és compatible", + "AudioProfileNotSupported": "El perfil del còdec d'àudio no és compatible", + "VideoResolutionNotSupported": "La resolució del vídeo no és compatible", + "AudioChannelsNotSupported": "El nombre de canals d'àudio no és compatible", + "AudioBitrateNotSupported": "La taxa de bits d'àudio no és compatible", "VideoCodecNotSupported": "El còdec de vídeo no és compatible", - "SubtitleCodecNotSupported": "El còdec de subtítols no s'admet", - "ContainerNotSupported": "El contenidor no està suportat", + "SubtitleCodecNotSupported": "El còdec de subtítols no és compatible", + "ContainerNotSupported": "El contenidor no és compatible", "AudioCodecNotSupported": "El còdec d'àudio no és compatible", - "EnableGamepadHelp": "Escoltar per l'entrada de qualsevol controladors connectats. (Requereix el mode de visualització \"TV\")", - "LabelEnableGamepad": "Habilitar Gamepad", + "EnableGamepadHelp": "Detecta l'entrada de qualsevol comandament connectat. (Requereix el mode de visualització \"Televisió\")", + "LabelEnableGamepad": "Habilita el comandament de videojocs", "Controls": "Controls", - "AllowVppTonemappingHelp": "Mapeig de to basat en controladors Intel complets. Actualment només funciona amb cert maquinari amb vídeos HDR10. Això té una prioritat més alta en comparació amb una altra implementació d'OpenCL.", - "EnableVppTonemapping": "Habilitar l'assignació de to VPP", + "AllowVppTonemappingHelp": "Mapatge de tons basat en controladors Intel complets. Actualment només funciona amb cert maquinari amb vídeos HDR10. Això té una prioritat més alta en comparació amb una altra implementació d'OpenCL.", + "EnableVppTonemapping": "Habilita el mapatge VPP de to", "YoutubeDenied": "El vídeo sol·licitat no es pot reproduir en reproductors integrats.", - "YoutubeNotFound": "Vídeo no trobat.", - "YoutubePlaybackError": "vídeo sol·licitat no es pot reproduir.", + "YoutubeNotFound": "No s'ha pogut trobar el vídeo.", + "YoutubePlaybackError": "No s'ha pogut reproduir el vídeo sol·licitat.", "YoutubeBadRequest": "Sol·licitud errònia.", "LabelSelectStereo": "Estèreo", "LabelSelectMono": "Mono", "LabelSelectAudioChannels": "Canals", - "LabelAllowedAudioChannels": "Màxim permès Canals d'àudio", - "AllowHevcEncoding": "Permetre la codificació en format HEVC", - "PreferFmp4HlsContainerHelp": "Prefereixen utilitzar FMP4 com el contenidor predeterminat per HLS, de manera que és possible corrent directe contingut HEVC i AV1 en els dispositius compatibles.", - "PreferFmp4HlsContainer": "Prefereixo FMP4-HLS Mitjans de contenidors", - "LabelSyncPlayInfo": "Informació SyncPlay", - "LabelOriginalMediaInfo": "Mitjans Informació original", + "LabelAllowedAudioChannels": "Màxim permès de canals d'àudio", + "AllowHevcEncoding": "Permet la codificació en format HEVC", + "PreferFmp4HlsContainerHelp": "Fes servir FMP4 com el contenidor predeterminat per a HLS, fent possible transmetre el contingut directe HEVC i AV1 en els dispositius compatibles.", + "PreferFmp4HlsContainer": "Prioritza el contenidor multimèdia fMP4-HLS", + "LabelSyncPlayInfo": "Informació de SyncPlay", + "LabelOriginalMediaInfo": "Informació original del contingut multimèdia", "LabelRemuxingInfo": "informació remuxing", - "LabelDirectStreamingInfo": "Transmissió d'Informació Directa", + "LabelDirectStreamingInfo": "Informació de transmissió directa", "LabelTranscodingInfo": "Informació de transcodificació", "LabelVideoInfo": "Sobre el vídeo", "LabelAudioInfo": "Informació d'àudio", "LabelPlaybackInfo": "Informació de reproducció", - "RemuxHelp2": "Remux utilitza molt poca potència de processament amb una qualitat dels mitjans completament sense pèrdues.", - "RemuxHelp1": "Els mitjans de comunicació es troba en un contenidor d'arxius incompatibles (MKV, AVI, WMV, etc), però tant el flux de vídeo i àudio són compatibles amb el dispositiu. Els mitjans de comunicació han de ser empaquetats de nou sense pèrdues sobre la marxa abans de ser enviat a el dispositiu.", - "AspectRatioFill": "Estirar", - "AspectRatioCover": "Zoom", - "EnableFallbackFontHelp": "Habilitar fonts alternes d'encàrrec. Això es pot evitar el problema de renderitzat de subtítols incorrectes.", - "EnableFallbackFont": "Habilitar fonts de replegament", - "LabelFallbackFontPathHelp": "Aquestes fonts sont utilitzades per alguns clients per generar subtítols. Si us plau, consulteu la documentació per a més informació.", - "LabelFallbackFontPath": "Replegament ruta de la carpeta de la font", - "HeaderSelectFallbackFontPathHelp": "Examineu o introduïu la ruta de la carpeta de fonts que s'utilitzaran per renderitzar els subtítols ASS/SSA.", - "HeaderSelectFallbackFontPath": "Seleccioneu la ruta de la carpeta de fonts", + "RemuxHelp2": "Remux fa servir molt poca potència de processament amb una qualitat multimèdia sense pèrdues.", + "RemuxHelp1": "El contingut multimèdia es troba en un contenidor de fitxers incompatible (MKV, AVI, WMV, etc.), però tant el flux de vídeo com el flux d'àudio són compatibles amb el dispositiu. El contingut multimèdia es reempaquetarà sobre la marxa i sense pèrdues, abans d'enviar-se al dispositiu.", + "AspectRatioFill": "Estira", + "AspectRatioCover": "Escala", + "EnableFallbackFontHelp": "Habilita tipus de lletra alternatives personalitzades. Això pot evitar el problema de renderitzat incorrecte de subtítols.", + "EnableFallbackFont": "Habilita els tipus de lletra de contingència", + "LabelFallbackFontPathHelp": "Aquests tipus de lletra són fetes servir per a alguns clients per a generar subtítols. Consulteu la documentació per a més informació.", + "LabelFallbackFontPath": "Ruta del directori de tipus de lletres de contingència", + "HeaderSelectFallbackFontPathHelp": "Examineu o introduïu la ruta del directori de tipus de lletres que s'utilitzaran per renderitzar els subtítols ASS/SSA.", + "HeaderSelectFallbackFontPath": "Seleccioneu la ruta de la ruta de tipus de lletres", "Yesterday": "Ahir", - "Yes": "Si", + "Yes": "Sí", "Yadif": "Yet Another DeInterlacing Filter (YADIF)", - "XmlTvPathHelp": "Una ruta a un arxiu XMLTV. Jellyfin llegirà aquesta imatge i comprovar periòdicament si hi ha actualitzacions. Vostè és responsable de crear i actualitzar l'arxiu.", + "XmlTvPathHelp": "Una ruta a un arxiu XMLTV. Jellyfin llegirà aquest fitxer i comprovarà periòdicament si hi ha actualitzacions. Sou el responsable de crear i actualitzar l'arxiu.", "XmlDocumentAttributeListHelp": "Aquests atributs s'apliquen a l'element arrel de cada resposta XML.", "Writers": "Escriptors", - "WriteAccessRequired": "El Jellyfin necessita accés d'escriptura a aquesta carpeta. Garantiu l'accés d'escriptura i torneu-ho a intentar.", + "WriteAccessRequired": "Jellyfin necessita accés d'escriptura a aquest directori. Garantiu l'accés d'escriptura i torneu-ho a intentar.", "Whitelist": "Llista blanca", - "WeeklyAt": "{0} S a {1}", - "ViewAlbumArtist": "Veure artista àlbum", - "VideoAudio": "Vídeo Audio", + "WeeklyAt": "Tots els {0} a {1}", + "ViewAlbumArtist": "Mostra l'artista de l'àlbum", + "VideoAudio": "Pista d'àudio", "Video": "Vídeo", "Vertical": "Vertical", "ValueVideoCodec": "Vídeo Codec: {0}", "ValueTimeLimitSingleHour": "Límit de temps: 1 hora", "ValueTimeLimitMultiHour": "Termini: {0} hores", "ValueSongCount": "{0} cançons", - "ValueSeriesCount": "{0} sèrie", + "ValueSeriesCount": "{0} sèries", "ValueSeconds": "{0} segons", "ValueOneSong": "1 cançó", "ValueOneSeries": "1 sèrie", @@ -894,26 +894,26 @@ "ValueCodec": "Codec: {0}", "ValueAudioCodec": "Audio Codec: {0}", "ValueAlbumCount": "{0} àlbums", - "UserAgentHelp": "Subministrar una capçalera HTTP 'User-Agent' personalitzat.", - "UseEpisodeImagesInNextUpHelp": "Les seccions 'A continuació' i 'Continuar veient' utilitzaran imatges episodi com miniatures en lloc de la imatge principal de la sèrie.", - "UseEpisodeImagesInNextUp": "Utilitzar imatges d'episodi en les seccions 'A continuació' i 'Continuar veient'", - "UseDoubleRateDeinterlacingHelp": "Aquesta configuració utilitza el tipus de camp quan el desentrellaçat, sovint referit com el desentrellaçat Bob, el que duplica la taxa de fotogrames de vídeo per proporcionar moviment complet com el que es veu quan es visualitza vídeo entrellaçat en un televisor.", - "UseDoubleRateDeinterlacing": "El doble de la velocitat de fotogrames quan el desentrellaçat", - "Upload": "Pujar", - "UnsupportedPlayback": "Jellyfin no pot desxifrar el contingut protegit per DRM, però tot el contingut serà tractat independentment, incloent títols protegits. Alguns fitxers poden aparèixer a causa de completament negre xifrat o altres característiques no compatibles, com ara títols interactius.", - "Unplayed": "No reproduida", + "UserAgentHelp": "Subministrar una capçalera HTTP 'User-Agent' personalitzada.", + "UseEpisodeImagesInNextUpHelp": "Les seccions 'A continuació' i 'Continueu mirant' utilitzaran imatges episodi com miniatures en lloc de la imatge principal de la sèrie.", + "UseEpisodeImagesInNextUp": "Fes servir imatges d'episodis en les seccions 'A continuació' i 'Continueu mirant'", + "UseDoubleRateDeinterlacingHelp": "Aquesta configuració fa servir la velocitat de camp quan en desentrellaçar, sovint referit com el desentrellaçat bob, que duplica la taxa de fotogrames de vídeo per a proporcionar un moviment continu com el que es veu en mirar un vídeo entrellaçat en un televisor.", + "UseDoubleRateDeinterlacing": "El doble de fotogrames per segon en entrellaçar", + "Upload": "Puja", + "UnsupportedPlayback": "Jellyfin no pot desxifrar el contingut protegit per DRM, però tot el contingut serà tractat independentment, incloent-hi títols protegits. Alguns fitxers poden aparèixer completament negres degut al xifrat o altres característiques no compatibles, com ara títols interactius.", + "Unplayed": "No reproduït", "Uniform": "Uniforme", - "TvLibraryHelp": "Revisar el {0} de TV guia de noms {1}.", - "TV": "TV", + "TvLibraryHelp": "Revisa la {0}guia de noms de la programació de televisió{1}.", + "TV": "Televisió", "Transcoding": "Transcodificació", "TonemappingRangeHelp": "Seleccioneu el rang de color de sortida. Auto és el mateix que el rang d'entrada.", - "TonemappingAlgorithmHelp": "Mapeig de tons pot ser afinat. Si vostè no està familiaritzat amb aquestes opcions, simplement mantingui el valor per omissió. El valor recomanat és 'BT.2390'.", - "TitleHostingSettings": "Ajustaments de Hosting", - "TitleHardwareAcceleration": "Acceleració per hardware", + "TonemappingAlgorithmHelp": "El mapatge de tons es pot afinar amb precisió. Si no esteu familiaritzat amb aquestes opcions, millor que mantingueu el valor predeterminat. El valor recomanat és 'BT.2390'.", + "TitleHostingSettings": "Configuració d'allotjament", + "TitleHardwareAcceleration": "Acceleració per maquinari", "ThumbCard": "Targeta de miniatura", "Thumb": "Miniatura", "ThemeVideos": "Vídeos temàtics", - "ThemeSongs": "Cançons del tema", + "ThemeSongs": "Sintonies", "TextSent": "Text enviat.", "TagsValue": "Etiquetes: {0}", "TabStreaming": "Reproducció en línia", @@ -921,22 +921,22 @@ "TabNetworking": "Xarxes", "TabLogs": "Registres", "SystemDlnaProfilesHelp": "Perfils de el sistema són de només lectura. Els canvis en un perfil de sistema seran emmagatzemades a un nou perfil personalitzat.", - "SyncPlayGroupDefaultTitle": "Grup {0}'s", + "SyncPlayGroupDefaultTitle": "Grup de {0}", "SyncPlayAccessHelp": "La funció SyncPlay permet sincronitzar la reproducció amb altres dispositius. Seleccioneu el nivell d'accés a SyncPlay que té aquest usuari.", - "SubtitleVerticalPositionHelp": "Número de línia on apareix el text. Els nombres positius indiquen dalt a baix. Els nombres negatius indiquen dalt a baix.", - "SubtitleOffset": "Subtítol Offset", - "SubtitleDownloadersHelp": "Activa i classificar les seves descarregadors de subtítols preferits en ordre de prioritat.", + "SubtitleVerticalPositionHelp": "Número de línia on apareix el text. Les xifres positives numeren de dalt a baix. Les xifres negatives numeren de baix a dalt.", + "SubtitleOffset": "Decalatge de subtítols", + "SubtitleDownloadersHelp": "Habilita i classifica els descarregadors de subtítols preferits per ordre de prioritat.", "SubtitleAppearanceSettingsDisclaimer": "La configuració següent no s'aplica als subtítols gràfics esmentats anteriorment ni als subtítols ASS/SSA que incrusten els seus propis estils.", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Aquests ajustos s'apliquen també a qualsevol reproducció Google Cast iniciada per aquest dispositiu.", "Subtitle": "Subtítol", - "StopRecording": "Aturar la gravació", - "StopPlayback": "Aturar la reproducció", + "StopRecording": "Atura la gravació", + "StopPlayback": "Atura la reproducció", "Sports": "Esports", "SpecialFeatures": "Característiques especials", - "SortChannelsBy": "Ordenar els canals per", - "SortByValue": "Ordenar per {0}", - "Sort": "Ordenar", - "SmartSubtitlesHelp": "Subtítols que concordin amb la preferència d'idioma seran carregats quan l'àudio està en un idioma estranger.", + "SortChannelsBy": "Ordena els canals per", + "SortByValue": "Ordena per {0}", + "Sort": "Ordre", + "SmartSubtitlesHelp": "Els subtítols que coincideixin amb l'idioma preferit es carregaran quan l'àudio estigui en un idioma estranger.", "Smart": "Intel·ligent", "Smaller": "Menor", "SmallCaps": "Versaletes", @@ -944,137 +944,137 @@ "SimultaneousConnectionLimitHelp": "El nombre màxim de transmissions simultànies permeses. Establiu 0 per a cap límit.", "ShowYear": "Mostrar l'any", "ShowTitle": "Mostrar el títol", - "ShowMore": "Mostra més", - "ShowLess": "Mostrar menys", + "ShowMore": "Mostra'n més", + "ShowLess": "Mostra menys", "ShowAdvancedSettings": "Mostra la configuració avançada", "SettingsWarning": "El canvi d'aquests valors pot causar errors d'inestabilitat o de connectivitat. Si teniu algun problema, es recomana canviar-les per defecte.", "ServerRestartNeededAfterPluginInstall": "Jellyfin haurà de ser reiniciat després d'instal·lar el complement.", "ServerNameIsShuttingDown": "El servidor en {0} s'està tancant.", "ServerNameIsRestarting": "El servidor en {0} s'està reiniciant.", "SeriesYearToPresent": "{0} - Ara", - "SeriesDisplayOrderHelp": "Ordenar episodis per data d'emissió, ordre del DVD o numeració absoluta.", - "Series": "Sèrie", - "SelectServer": "seleccionar servidor", + "SeriesDisplayOrderHelp": "Ordena els episodis per data d'emissió, ordre dels DVD o numeració absoluta.", + "Series": "Sèries", + "SelectServer": "Seleccioneu un servidor", "SelectAdminUsername": "Seleccioneu un nom d'usuari per al compte d'administrador.", "Season": "Temporada", "SearchResults": "Resultats de la cerca", "Screenshot": "Captura", - "Schedule": "Programar", - "ScanLibrary": "biblioteca d'escaneig", - "ScanForNewAndUpdatedFiles": "Cerca fitxers nous i actualitzats", - "SaveSubtitlesIntoMediaFoldersHelp": "L'emmagatzematge de subtítols al costat dels arxius de vídeo que els permetrà ser manejats amb més facilitat.", - "SaveSubtitlesIntoMediaFolders": "Guardar subtítols en carpetes de mitjans", - "NoSubtitlesHelp": "Els subtítols no seran carregats per defecte. Encara es poden activar de forma manual durant la reproducció.", + "Schedule": "Programa", + "ScanLibrary": "S'estan escanejant les mediateques", + "ScanForNewAndUpdatedFiles": "Cerca de fitxers nous i actualitzats", + "SaveSubtitlesIntoMediaFoldersHelp": "L'emmagatzematge dels subtítols amb els fitxers de vídeo permetrà gestionar-los amb més facilitat.", + "SaveSubtitlesIntoMediaFolders": "Desa els subtítols en els directoris de continguts multimèdia", + "NoSubtitlesHelp": "Els subtítols no es carregaran per defecte. Encara es poden activar de forma manual durant la reproducció.", "Normal": "Normal", "NoNewDevicesFound": "No s'han trobat dispositius nous. Per afegir un nou sintonitzador, tanqueu aquest avís i introduïu la informació del dispositiu de forma manual.", - "NoCreatedLibraries": "Sembla que no s'ha creat cap biblioteca encara. {0} Li agradaria crear una ara? {1}", + "NoCreatedLibraries": "Sembla que encara no s'ha creat cap mediateca. {0} Us agradaria crear-ne una ara? {1}", "No": "No", "NextUp": "A continuació", - "NextTrack": "Passar a la següent", - "Next": "Pròxim", + "NextTrack": "Salta al següent", + "Next": "Següent", "News": "Notícies", "New": "Nou", "Never": "Mai", - "MusicVideo": "Music video", - "MusicLibraryHelp": "Revisar el {0} de la música guia de noms {1}.", - "MusicArtist": "Música Artista", + "MusicVideo": "Videoclip", + "MusicLibraryHelp": "Revisa la {0} guia de noms de música {1}.", + "MusicArtist": "Artista musical", "MusicAlbum": "Àlbum de música", - "MovieLibraryHelp": "Revisar la pel·lícula {0} guia de noms {1}.", + "MovieLibraryHelp": "Revisa la {0} guia de noms de pel·lícules {1}.", "Movie": "Pel·lícula", - "MoreMediaInfo": "Informació del mitjà", + "MoreMediaInfo": "Informació multimèdia", "MillisecondsUnit": "ms", - "MetadataSettingChangeHelp": "Canviar la configuració de les metadades afectarà al nou contingut afegit a partir d'ara. Per actualitzar el contingut existent, obriu la pantalla de detalls i feu clic al botó \"Actualitzar\" o actualitzeu-lo utilitzant el Gestor de metadades.", + "MetadataSettingChangeHelp": "Canviar la configuració de les metadades afectarà el nou contingut afegit a partir d'ara. Per s actualitzar el contingut existent, obriu la pantalla de detalls i feu clic al botó \"Actualitza\" o actualitzeu-lo utilitzant el \"Gestor de metadades\".", "Metadata": "Metadades", - "MessageUnsetContentHelp": "El contingut es mostrarà com carpetes de civil. Per obtenir els millors resultats utilitzar el gestor de metadades per establir els tipus de contingut de les subcarpetes.", - "MessageUnableToConnectToServer": "No es pot connectar amb el servidor seleccionat en aquest moment. Assegureu-vos que està funcionant i torni a intentar-ho.", - "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Les ubicacions següents mitjans de comunicació seran eliminats de la biblioteca", + "MessageUnsetContentHelp": "El contingut es mostrarà com a directoris simples. Per a obtenir els millors resultats feu servir el gestor de metadades per a establir els tipus de contingut dels subdirectoris.", + "MessageUnableToConnectToServer": "No es pot connectar amb el servidor seleccionat en aquest moment. Assegureu-vos que estigui funcionant i torneu a intentar-ho.", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Les ubicacions següents s'eliminaran de la mediateca", "MessageSyncPlayUserLeft": "{0} ha deixat el grup.", "MessageSyncPlayUserJoined": "{0} s'ha unit al grup.", - "MessageSyncPlayPlaybackPermissionRequired": "Permís de reproducció requerit.", - "MessageSyncPlayNoGroupsAvailable": "No hi ha grups disponibles. Comença a jugar alguna cosa primer.", + "MessageSyncPlayPlaybackPermissionRequired": "Requereix d'un permís per a la reproducció.", + "MessageSyncPlayNoGroupsAvailable": "No hi ha grups disponibles. Reproduïu primer alguna cosa.", "MessageSyncPlayLibraryAccessDenied": "L'accés a aquest contingut està restringit.", - "MessageSyncPlayJoinGroupDenied": "No es pot unir-se a grup.", - "MessageSyncPlayIsDisabled": "El permís necessari per utilitzar SyncPlay.", - "MessageSyncPlayGroupWait": "{0} és l'emmagatzematge en memòria intermèdia …", - "MessageSyncPlayGroupDoesNotExist": "No s'ha pogut unir-se a el grup, ja que no existeix.", - "MessageSyncPlayErrorNoActivePlayer": "No s'ha trobat cap reproductor actiu. SyncPlay ha estat desactivat.", - "MessageSyncPlayErrorMissingSession": "No s'ha pogut activar SyncPlay! Falta sessió.", - "MessageSyncPlayErrorMedia": "Error a l'habilitar SyncPlay! error de suport.", - "MessageSyncPlayErrorAccessingGroups": "S'ha produït un error a l'accedir a la llista de grups.", - "MessageSyncPlayEnabled": "SyncPlay habilitat.", - "MessageSyncPlayDisabled": "SyncPlay discapacitats.", - "MessageSyncPlayCreateGroupDenied": "El permís necessari per crear un grup.", + "MessageSyncPlayJoinGroupDenied": "No s'ha pogut unir al grup.", + "MessageSyncPlayIsDisabled": "Per a fer servir SyncPlay cal un permís.", + "MessageSyncPlayGroupWait": "{0} s'està carregant…", + "MessageSyncPlayGroupDoesNotExist": "La unió al grup ha fallat, perquè no existeix.", + "MessageSyncPlayErrorNoActivePlayer": "No s'ha trobat cap reproductor actiu. SyncPlay ha estat deshabilitat.", + "MessageSyncPlayErrorMissingSession": "No s'ha pogut activar SyncPlay! No s'ha trobat cap sessió.", + "MessageSyncPlayErrorMedia": "No s'ha pogut habilitar SyncPlay! S'ha produït un error de contingut multimèdia.", + "MessageSyncPlayErrorAccessingGroups": "S'ha produït un error en accedir a la llista de grups.", + "MessageSyncPlayEnabled": "SyncPlay està habilitat.", + "MessageSyncPlayDisabled": "SyncPlay està deshabilitat.", + "MessageSyncPlayCreateGroupDenied": "Per a crear un grup cal un permís.", "MessageSent": "Missatge enviat.", - "MessageReenableUser": "Vegeu més avall per tornar a activar", + "MessageReenableUser": "Vegeu més avall per a tornar a habilitar", "MessagePluginInstallError": "S'ha produït un error durant la instal·lació del complement.", "MessagePluginInstalled": "El complement s'ha instal·lat correctament. És necessari reiniciar el servidor perquè els canvis tinguin efecte.", - "MessagePluginInstallDisclaimer": "ADVERTÈNCIA: L'instal·lació d'un complement de tercers comporta riscos. Pot contenir còdi inestable o maliciós, i pot canviar en qualsevol moment. Només instal·li complements d'autors en els que confiï, i sigui conscient dels efectes que poden tenir, incloent consultes a serveis externs, exploracions de biblioteques més llargues, processos de fons addicionals.", - "MessagePluginConfigurationRequiresLocalAccess": "Connecteu-vos amb el servidor local directament per configurar aquest complement.", - "MessagePleaseWait": "Si us plau, espereu. Això pot trigar un minut.", - "MessagePlayAccessRestricted": "La reproducció d'aquest contingut està restringit actualment. Poseu-vos en contacte amb l'administrador de servidor per obtenir més informació.", - "MessagePasswordResetForUsers": "S'han restablert contrasenyes dels següents usuaris. Ara poden accedir amb codis PIN que van utilitzar per realitzar el restabliment.", - "MessageNoServersAvailable": "No hi ha servidors han estat trobats usant el descobriment automàtic de servidor.", + "MessagePluginInstallDisclaimer": "AVÍS: La instal·lació d'un complement de tercers comporta riscos. Pot contenir codi inestable o maliciós, i pot canviar en qualsevol moment. Instal·leu només complements d'autors en els que confieu, i sigueu conscient dels efectes que poden tenir, incloent peticions a serveis externs, exploracions més llargues de mediateques o processos addicionals en segon pla.", + "MessagePluginConfigurationRequiresLocalAccess": "Connecteu-vos directament amb el servidor local per a configurar aquest complement.", + "MessagePleaseWait": "Espereu, si us plau. Pot trigar un minut.", + "MessagePlayAccessRestricted": "La reproducció d'aquest contingut està actualment restringit. Poseu-vos en contacte amb l'administrador del servidor per a obtenir més informació.", + "MessagePasswordResetForUsers": "S'han restablert contrasenyes dels següents usuaris. Ara poden accedir amb els codis PIN que van utilitzar per reinicialitzar.", + "MessageNoServersAvailable": "No s'ha trobat cap servidor fent sevir el detector automàtic de servidors.", "MessageNoRepositories": "No hi ha repositoris.", - "MessageNoGenresAvailable": "Permetre alguns proveïdors de metadades per tirar dels gèneres a través d'Internet.", - "MessageNoCollectionsAvailable": "Les col·leccions us permeten gaudir d'agrupacions personalitzades de pel·lícules, sèries i àlbums. Feu clic al botó '+' per començar a crear col·leccions.", - "MessageLeaveEmptyToInherit": "Deixar en blanc per Heretar configuració d'un element principal o el valor predeterminat global.", + "MessageNoGenresAvailable": "Habilita alguns proveïdors de metadades per a extreure els gèneres d'Internet.", + "MessageNoCollectionsAvailable": "Les col·leccions us permeten gaudir d'agrupacions personalitzades de pel·lícules, sèries i àlbums. Feu clic al botó '+' per a començar a crear col·leccions.", + "MessageLeaveEmptyToInherit": "Deixeu-ho en blanc per a heretar la configuració d'un element principal o el valor predeterminat global.", "MessageInvalidUser": "Nom d'usuari o contrasenya incorrectes. Torneu-ho a provar.", - "MessageInvalidForgotPasswordPin": "S'ha introduït un codi PIN no vàlid o caducat. Torni-ho a provar.", + "MessageInvalidForgotPasswordPin": "S'ha introduït un codi PIN no vàlid o caducat. Torneu-ho a provar.", "MessageImageTypeNotSelected": "Seleccioneu un tipus d'imatge al menú desplegable.", - "MessageImageFileTypeAllowed": "Només els arxius JPEG i PNG són compatibles.", + "MessageImageFileTypeAllowed": "Només els fitxers JPEG i PNG són compatibles.", "MessageGetInstalledPluginsError": "S'ha produït un error a l'hora d'obtenir la llista de complements instal·lats.", - "MessageForgotPasswordInNetworkRequired": "Torneu a iniciar el procés de restabliment de contrasenya des de dins de la seva xarxa domèstica.", - "MessageForgotPasswordFileCreated": "El següent arxiu s'ha creat en el seu servidor i conté instruccions sobre com procedir", - "MessageFileReadError": "Hi ha hagut un error a llegint l'arxiu. Torni-ho a provar.", - "MessageDirectoryPickerLinuxInstruction": "Per a Linux amb Arch Linux, CentOS, Debian, Fedora, openSUSE, o Ubuntu, ha de concedir a l'usuari del servei com a mínim l'accés de lectura als llocs d'emmagatzematge.", - "MessageDirectoryPickerBSDInstruction": "Per BSD, pot ser que hagi de configurar l'emmagatzematge dins del seu presó FreeNAS pel Jellyfin pot accedir als mitjans de comunicació.", - "MessageDeleteTaskTrigger": "Esteu segur que voleu eliminar aquest disparador tasca?", + "MessageForgotPasswordInNetworkRequired": "Torneu a iniciar el procés de restabliment de contrasenya des de la vostra xarxa domèstica.", + "MessageForgotPasswordFileCreated": "El següent fitxer s'ha creat en el seu servidor i conté instruccions sobre com procedir", + "MessageFileReadError": "S'ha produït un error en llegir el fitxer. Torneu-ho a provar.", + "MessageDirectoryPickerLinuxInstruction": "Per a Linux amb Arch Linux, CentOS, Debian, Fedora, openSUSE, o Ubuntu, heu de concedir a l'usuari del servei com a mínim l'accés de lectura als llocs d'emmagatzematge.", + "MessageDirectoryPickerBSDInstruction": "Per a BSD, caldrà tenir configurat l'emmagatzematge del \"FreeNAS Jail\" perquè permeti a Jellyfin accedir al contingut multimèdia.", + "MessageDeleteTaskTrigger": "N'estàs segur que vols eliminar aquest llençador de tasques?", "MessageCreateAccountAt": "Crear un compte a {0}", - "MessageConfirmShutdown": "Esteu segur que voleu tancar el servidor?", - "MessageConfirmRevokeApiKey": "Esteu segur que voleu revocar aquesta clau d'API? connexió de l'aplicació d'aquest servidor es va acabar abruptament.", - "MessageConfirmRemoveMediaLocation": "Esteu segur que voleu suprimir aquesta ubicació?", - "MessageConfirmDeleteTunerDevice": "Està segur que desitja eliminar aquest dispositiu?", - "MessageConfirmDeleteGuideProvider": "Esteu segur que voleu eliminar aquest proveïdor de guia?", - "MessageConfirmAppExit": "Vols sortir?", - "MessageChangeRecordingPath": "Canviar la seva carpeta d'enregistrament no migrarà enregistraments existents des de la ubicació anterior a la nova. Haurà de moure manualment si es desitja.", - "MessageAreYouSureYouWishToRemoveMediaFolder": "Esteu segur que voleu eliminar aquesta carpeta de mitjans?", + "MessageConfirmShutdown": "Segur que vols apagar el servidor?", + "MessageConfirmRevokeApiKey": "N'esteu segur, de voler revocar aquesta clau d'API? La connexió de l'aplicació d'aquest servidor s'interromprà abruptament.", + "MessageConfirmRemoveMediaLocation": "N'esteu segur, que voleu suprimir aquesta ubicació?", + "MessageConfirmDeleteTunerDevice": "N'esteu segur, que voleu eliminar aquest dispositiu?", + "MessageConfirmDeleteGuideProvider": "N'esteu segur, que voleu eliminar aquest proveïdor de guia?", + "MessageConfirmAppExit": "Desitgeu sortir?", + "MessageChangeRecordingPath": "Canviar la seva carpeta d'enregistrament no migrarà enregistraments existents des de la ubicació anterior a la nova. Si ho desitgeu, l'haureu de moure manualment.", + "MessageAreYouSureYouWishToRemoveMediaFolder": "N'esteu segur, que desitgeu eliminar aquest directori multimèdia?", "MessageAlreadyInstalled": "Aquesta versió ja està instal·lada.", - "MessageAddRepository": "Si voleu afegir un repositori, feu clic al botó situat al costat de la capçalera i completi la informació sol·licitada.", + "MessageAddRepository": "Si voleu afegir un repositori, feu clic al botó situat al costat de la capçalera i completeu la informació sol·licitada.", "Menu": "Menú", - "MediaIsBeingConverted": "Els mitjans de comunicació s'està convertint en un format que és compatible amb el dispositiu que s'està reproduint els mitjans de comunicació.", + "MediaIsBeingConverted": "El contingut multimèdia està sent convertit a un format compatible amb el dispositiu que l'està reproduint.", "MediaInfoVideoRange": "Rang de vídeo", "MediaInfoTimestamp": "Marca de temps", - "MediaInfoSize": "Tamany", + "MediaInfoSize": "Mida", "MediaInfoSampleRate": "Freqüència de mostreig", - "MediaInfoRefFrames": "Ref de quadres", + "MediaInfoRefFrames": "Fotogrames de referència", "MediaInfoPath": "Ruta", "MediaInfoLevel": "Nivell", - "MediaInfoLayout": "Disposició", + "MediaInfoLayout": "Format", "MediaInfoInterlaced": "Entrellaçat", "MediaInfoFramerate": "Imatges per segon", "MediaInfoExternal": "Extern", "MediaInfoContainer": "Contenidor", - "MediaInfoColorTransfer": "Transferencia de color", + "MediaInfoColorTransfer": "Transferència de color", "MediaInfoColorSpace": "Espai de color", "MediaInfoColorPrimaries": "Colors primaris", - "MediaInfoCodecTag": "Etiqueta de còdec", + "MediaInfoCodecTag": "Etiqueta del còdec", "MediaInfoCodec": "Còdec", "MediaInfoBitrate": "Taxa de bits", "MediaInfoBitDepth": "Profunditat de bits", "MediaInfoAnamorphic": "Anamòrfic", - "MapChannels": "Mapa de canals", - "ManageRecording": "Maneig de gravació", - "ManageLibrary": "Maneig de la biblioteca", - "Logo": "Logo", - "LiveTV": "TV en directe", - "LiveBroadcasts": "Les emissions en directe", + "MapChannels": "Mapeja canals", + "ManageRecording": "Maneig d'enregistrament", + "ManageLibrary": "Gestió de la mediateca", + "Logo": "Logotip", + "LiveTV": "Televisió en directe", + "LiveBroadcasts": "Emissions en directe", "ListPaging": "{0} - {1} de {2}", "List": "Llista", - "LeaveBlankToNotSetAPassword": "Podeu deixar aquest camp en blanc per establir cap contrasenya.", - "LearnHowYouCanContribute": "Aprendre com pot contribuir.", + "LeaveBlankToNotSetAPassword": "Podeu deixar aquest camp en blanc per a no establir cap contrasenya.", + "LearnHowYouCanContribute": "Apreneu com hi podeu contribuir.", "LastSeen": "Última activitat {0}", "Large": "Gran", - "LanNetworksHelp": "Llista separada per comes d'adreces IP o IP/netmask que seran considerades part de la xarxa local a l'hora de fer complir les restriccions d'ample de banda. Si s'estableix, totes les altres adreces IP es consideraran part de la xarxa externa i estaran subjectes a les restriccions d'ample de banda externs. Si es deixa en blanc, només la subxarxa del servidor es considerarà part a la xarxa local.", + "LanNetworksHelp": "Llista separada per comes d'adreces IP o IP/netmask que seran considerades part de la xarxa local a l'hora de fer complir les restriccions d'amplada de banda. Si s'estableix, totes les altres adreces IP es consideraran part de la xarxa externa i estaran subjectes a les restriccions d'amplada de banda externs. Si es deixa en blanc, només la subxarxa del servidor es considerarà part a la xarxa local.", "LabelZipCode": "Codi ZIP", "LabelXDlnaDocHelp": "Determina el contingut de l'element 'X_DLNADOC' al espai de noms 'urn:schemas-dlna-org:device-1-0'.", "LabelXDlnaDoc": "Dispositiu Class ID", @@ -1082,14 +1082,14 @@ "LabelXDlnaCap": "Dispositiu Capability ID", "LabelWeb": "Web", "LabelVideoResolution": "Resolució de vídeo", - "LabelVideoRange": "Gamma de vídeo", + "LabelVideoRange": "Rang de vídeo", "LabelVideoCodec": "Còdec de vídeo", "LabelVideoBitrate": "Taxa de bits de vídeo", "LabelVersionInstalled": "{0} instal·lats", "LabelVersion": "Versió", - "LabelVaapiDeviceHelp": "Aquest és el \"render node\" que s'utilitza per a l'acceleració de maquinari.", + "LabelVaapiDeviceHelp": "Aquest és el node de processament que es fa servir per a l'acceleració del maquinari.", "LabelVaapiDevice": "Dispositiu VA-API", - "LabelUserRemoteClientBitrateLimitHelp": "Substituir el valor global predeterminat establert a la configuració del servidor, vegeu Tauler de control > Reproducció > Streaming.", + "LabelUserRemoteClientBitrateLimitHelp": "Substitueix el valor global predeterminat establert a la configuració del servidor, vegeu Tauler de control > Reproducció > Reproducció en línia.", "LabelUserMaxActiveSessions": "Nombre màxim de sessions simultànies d'usuaris", "LabelUserLoginAttemptsBeforeLockout": "Intents de connexió fallits abans que l'usuari sigui bloquejat", "LabelUserLibraryHelp": "Seleccioneu quina biblioteca d'usuari es visualitza al dispositiu. Deixeu-ho en blanc per heretar la configuració predeterminada.", @@ -1099,13 +1099,13 @@ "LabelUDPPortRange": "UDP Comunicacions de Camp", "LabelTypeText": "Text", "LabelTypeMetadataDownloaders": "Descarregadors de metadades ({0})", - "LabelTVHomeScreen": "Pantalla d'inici en mode TV", + "LabelTVHomeScreen": "Pantalla d'inici en mode televisió", "LabelTunerType": "Tipus de sintonitzador", - "LabelTunerIpAddress": "Adreça IP de l'sintonitzador", - "LabelTranscodingThreadCountHelp": "Seleccioneu el nombre màxim de fils que pot utilitzar la transcodificació. La reducció del nombre de fils disminuirà l'ús de la CPU, però es possible que no transcodifiqui prou ràpid per a una reproducció fluïda.", - "LabelTranscodingThreadCount": "Transcodificació nombre de fils", - "LabelTranscodingProgress": "Transcodificació de progrés", - "LabelTranscodingFramerate": "Transcodificació d'imatges per segon", + "LabelTunerIpAddress": "Adreça IP del sintonitzador", + "LabelTranscodingThreadCountHelp": "Seleccioneu el nombre màxim de fils que pot utilitzar la transcodificació. La reducció del nombre de fils disminuirà l'ús de la CPU, però és possible que no transcodifiqui prou de pressa per a una reproducció fluïda.", + "LabelTranscodingThreadCount": "Nombre de fils de la transcodificació", + "LabelTranscodingProgress": "Progrés de la transcodificació", + "LabelTranscodingFramerate": "Velocitat de transcodificació", "LabelTranscodes": "Transcodificadors", "LabelTranscodePath": "Ruta de transcodificació", "LabelTonemappingThresholdHelp": "Els paràmetres de l'algorisme de mapa de tons es van afinar per cada escena. I un llindar s'utilitza per detectar si l'escena ha canviat o no. Si la distància entre l'actual marc de brillantor mig i la mitjana d'execució actual supera un valor llindar, ens agradaria tornar a calcular la mitjana i l'escena lluentor màxima. Els valors recomanats i predeterminats són 0,8 i 0,2.", @@ -1113,172 +1113,172 @@ "LabelTonemappingRange": "Gamma de mapa de tons", "LabelTonemappingPeakHelp": "Anul·la el valor de metadades incrustat pel senyal d'entrada amb aquest valor com a pic. El valor per defecte és 100 (1000 nits).", "LabelTonemappingPeak": "Pic del mapa de tons", - "LabelTonemappingParamHelp": "Afinar el algoritme d'assignació de to. Els valors recomanats i per defecte són NaN. Generalment deixar-la en blanc.", + "LabelTonemappingParamHelp": "Ajusta l'algoritme de mapatge de tons. Generalment, deixeu-ho en blanc.", "LabelTonemappingParam": "Paràmetres de mapa de tons", - "LabelTonemappingDesatHelp": "Aplicar dessaturació de punts destacats que superen aquest nivell de brillantor. El valor recomanat és 0 (desactivar).", + "LabelTonemappingDesatHelp": "Aplica dessaturació de punts realçats que superen aquest nivell de brillantor. El valor recomanat és 0 (deshabilitat).", "LabelTonemappingDesat": "Mapa de tons desat", - "LabelTonemappingAlgorithm": "Seleccioneu l'algoritme de \"Tone mapping\"", - "LabelTextSize": "Mida de el text", - "LabelTextColor": "Color de el text", - "LabelTextBackgroundColor": "Text color de fons", - "LabelTagline": "Lema", + "LabelTonemappingAlgorithm": "Seleccioneu l'algoritme de mapatge de tons", + "LabelTextSize": "Mida del text", + "LabelTextColor": "Color del text", + "LabelTextBackgroundColor": "Color de fons del text", + "LabelTagline": "Eslògan", "LabelTag": "Etiqueta", - "LabelSyncPlayTimeSyncOffset": "Compensació de temps", + "LabelSyncPlayTimeSyncOffset": "Temps de decalatge", "LabelSyncPlayTimeSyncDevice": "Temps de sincronització amb", "LabelSyncPlaySyncMethod": "Mètode de sincronització", - "LabelSyncPlayResumePlaybackDescription": "Unir-se a la reproducció de el grup de tornada", - "LabelSyncPlayResumePlayback": "Reprendre la reproducció local", - "LabelSyncPlayPlaybackDiff": "Reproducció diferència de temps", - "LabelSyncPlayNewGroupDescription": "Crear un nou grup", - "LabelSyncPlayNewGroup": "Nou grup", - "LabelSyncPlayLeaveGroupDescription": "Desactivar SyncPlay", - "LabelSyncPlayLeaveGroup": "Marxar del grup", - "LabelSyncPlayHaltPlaybackDescription": "I ignorar les actualitzacions de llista de reproducció actual", - "LabelSyncPlayHaltPlayback": "Aturar la reproducció local", - "LabelSyncPlayAccessNone": "Desactivat per a aquest usuari", - "LabelSyncPlayAccessJoinGroups": "Permetre als usuaris a unir-se als grups", - "LabelSyncPlayAccessCreateAndJoinGroups": "Permetre a l'usuari crear i unir-se a grups", + "LabelSyncPlayResumePlaybackDescription": "Torneu a la reproducció grupal", + "LabelSyncPlayResumePlayback": "Reprèn la reproducció local", + "LabelSyncPlayPlaybackDiff": "Diferència de temps de reproducció", + "LabelSyncPlayNewGroupDescription": "Crea un grup nou", + "LabelSyncPlayNewGroup": "Grup nou", + "LabelSyncPlayLeaveGroupDescription": "Desactiva SyncPlay", + "LabelSyncPlayLeaveGroup": "Surt del grup", + "LabelSyncPlayHaltPlaybackDescription": "I ignora les actualitzacions de la llista de reproducció", + "LabelSyncPlayHaltPlayback": "Atura la reproducció local", + "LabelSyncPlayAccessNone": "S'ha desactivat per a aquest usuari", + "LabelSyncPlayAccessJoinGroups": "Permet als usuaris unir-se als grups", + "LabelSyncPlayAccessCreateAndJoinGroups": "Permet als usuaris crear i unir-se a grups", "LabelSyncPlayAccess": "Accés SyncPlay", "LabelSupportedMediaTypes": "Tipus de mitjans compatibles", "LabelSubtitleVerticalPosition": "Posició vertical", "LabelSubtitleDownloaders": "Descarregadors de subtítols", "LabelStreamType": "Tipus de seqüència", - "LabelStopping": "Parant", + "LabelStopping": "S'està aturant", "LabelStable": "Estable", "LabelSSDPTracingFilterHelp": "Adreça IP opcional sobre la qual es registra un filtrat de el tràfic de SSDP.", "LabelSSDPTracingFilter": "SSDP Filtre", "LabelSportsCategories": "Modalitats esportives", - "LabelSpecialSeasonsDisplayName": "Especial nom de visualització temporada", - "LabelSortOrder": "Ordre de classificació", - "LabelSortBy": "Ordenar per", + "LabelSpecialSeasonsDisplayName": "Nom de la temporada especial", + "LabelSortOrder": "Ordre", + "LabelSortBy": "Ordena per", "LabelSonyAggregationFlagsHelp": "Determina el contingut de l'element 'aggregationFlags' al espai de noms 'urn:schemas-sonycom:av'.", "LabelSonyAggregationFlags": "Banderes d'agregació de Sony", "Remuxing": "Recodificació", "MusicVideos": "Videoclips", "Trailers": "Tràilers", - "LabelGroupMoviesIntoCollectionsHelp": "Pel·lícules en una col·lecció seran agrupades com una sola llista en mostrar les llistes de pel·lícules.", - "LabelffmpegPathHelp": "La ruta d'accés a l'arxiu d'aplicació o carpeta que conté FFmpeg.", + "LabelGroupMoviesIntoCollectionsHelp": "En mostrar les llistes de pel·lícules, les que pertanyin a una col·lecció es mostraran com a un element agrupat.", + "LabelffmpegPathHelp": "La ruta d'accés al fitxer de l'aplicació de FFmpeg o del directori que la conté.", "LabelEnableSSDPTracingHelp": "Permetin als detalls de la xarxa SSDP rastreig que s'ha de registrar.
ADVERTÈNCIA:. Això farà que seria degradació del rendiment.", - "LabelBaseUrlHelp": "Afegir un subdirectori personalitzat a l'adreça URL de servidor. Per exemple: http://example.com/<baseurl>", - "LabelSlowResponseTime": "Temps en ms després de la qual cosa es considera una resposta lenta", - "LabelSlowResponseEnabled": "Registrar un avis si la resposta del servidor es lenta", - "LabelSkipIfGraphicalSubsPresentHelp": "Mantenir versions de text de subtítols donarà lloc a un lliurament més eficient i disminuir la probabilitat de transcodificació de vídeo.", - "LabelSkipIfGraphicalSubsPresent": "Saltar si el vídeo ja conté subtítols incrustats", - "LabelSkipIfAudioTrackPresentHelp": "Desmarqueu això per assegurar tots els vídeos tenen subtítols, sense importar l'idioma d'àudio.", - "LabelSkipIfAudioTrackPresent": "Saltar si la pista d'àudio per defecte coincideix amb l'idioma descàrrega", - "LabelSkipForwardLength": "Saltar cap endavant longitud", - "LabelSkipBackLength": "Saltar llarg d'esquena", + "LabelBaseUrlHelp": "Afegiu un subdirectori personalitzat a l'adreça URL de servidor. Per exemple: http://example.com/<baseurl>", + "LabelSlowResponseTime": "Temps en ms després del qual es considera que la resposta és lenta", + "LabelSlowResponseEnabled": "Registra un avís si la resposta del servidor és lenta", + "LabelSkipIfGraphicalSubsPresentHelp": "Mantenir versions de subtítols en text plans donarà lloc a un lliurament més eficient i disminuirà la probabilitat de transcodificació de vídeo.", + "LabelSkipIfGraphicalSubsPresent": "Salta, si el vídeo ja conté subtítols incrustats", + "LabelSkipIfAudioTrackPresentHelp": "Desmarqueu-ho per a assegurar tots els vídeos tenen subtítols, sense importar l'idioma de l'àudio.", + "LabelSkipIfAudioTrackPresent": "Salta-ho si la pista d'àudio per defecte coincideix amb l'idioma de descàrrega", + "LabelSkipForwardLength": "Temps d'avançament", + "LabelSkipBackLength": "Temps de rebobinat", "LabelSize": "Mida", - "LabelSimultaneousConnectionLimit": "Límit de corrent simultània", + "LabelSimultaneousConnectionLimit": "Límit de fluxos simultanis de dades", "LabelServerHostHelp": "192.168.1.100:8096 o https://myserver.com", "LabelServerHost": "Amfitrió", - "LabelScheduledTaskLastRan": "Darrera execució {0}, ha trigat {1}.", + "LabelScheduledTaskLastRan": "La darrera execució {0}, ha trigat {1}.", "LabelRuntimeMinutes": "Temps d'execució", - "LabelRequireHttpsHelp": "Si se selecciona, el servidor redirigirà automàticament totes les sol·licituds a través d'HTTP a HTTPS. Això no té efecte si el servidor no està escoltant en HTTPS.", - "LabelRequireHttps": "Requerir HTTPS", - "LabelRepositoryUrlHelp": "La ubicació de l'manifest repositori que voleu incloure.", + "LabelRequireHttpsHelp": "Si se selecciona, el servidor redirigirà automàticament totes les sol·licituds d'HTTP cap a HTTPS. Això no té efecte si el servidor no està escoltant en HTTPS.", + "LabelRequireHttps": "Requereix HTTPS", + "LabelRepositoryUrlHelp": "La ubicació del manifest repositori que voleu incloure.", "LabelRepositoryUrl": "URL del repositori", "LabelRepositoryNameHelp": "Un nom per distingir aquest repositori dels altres afegits al servidor.", "LabelRepositoryName": "Nom del repositori", - "LabelRemoteClientBitrateLimitHelp": "Un límit opcional de taxa de bits per cada corrent de tot fora dels dispositius de xarxa. Això és útil per evitar que els dispositius de sol·licitar una taxa de bits més alta que la connexió a Internet pot gestionar. Això pot resultar en una major càrrega de la CPU en el servidor per tal de transcodificació de vídeos sobre la marxa a una menor taxa de bits.", - "LabelRemoteClientBitrateLimit": "Streaming per internet límit de taxa de bits (Mbps)", - "LabelRecordingPathHelp": "Especificar la ubicació per defecte per guardar els enregistraments. Si és buit, s'utilitzarà la carpeta de dades de programa de servidor.", - "LabelReasonForTranscoding": "Motiu de transcodificació", + "LabelRemoteClientBitrateLimitHelp": "Un límit opcional de taxa de bits per als dispositius que es trobin fora de xarxa. És útil per evitar que els dispositius sol·licitin una taxa de bits més alta que la que pot gestionar la vostra connexió a Internet. Això pot resultar en una major càrrega de la CPU en el servidor per tal de transcodificar els vídeos sobre la marxa a una menor taxa de bits.", + "LabelRemoteClientBitrateLimit": "Límit de la taxa de bits en transmetre per Internet (Mbps)", + "LabelRecordingPathHelp": "Especifiqueu la ubicació per defecte per a desar els enregistraments. Si es deixa buit, es farà servir el directori de dades de programa del servidor.", + "LabelReasonForTranscoding": "Motiu per a la transcodificació", "LabelQuickConnectCode": "Codi de Quick Connect", - "LabelPublishedServerUriHelp": "Anul·lar l'URI utilitzat per Jellyfin, basat en la interfície, o l'adreça IP de client. Per exemple: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, or all=https://jellyfin.example.com", - "LabelPublishedServerUri": "URI servidor publicat", - "LabelPublicHttpsPortHelp": "El número de port públic que hauria de ser assignada a l'port HTTPS local.", - "LabelPublicHttpPortHelp": "El número de port públic que hauria de ser assignada a l'port local HTTP.", + "LabelPublishedServerUriHelp": "Sobreescriu l'URI fet servir per Jellyfin, basat en la interfície, o l'adreça IP de client. Per exemple: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, o all=https://jellyfin.example.com", + "LabelPublishedServerUri": "URI del servidor publicades", + "LabelPublicHttpsPortHelp": "El número de port públic que hauria de ser enllaçat al port HTTPS local.", + "LabelPublicHttpPortHelp": "El número de port públic que hauria de ser enllaçat al port local HTTP.", "LabelProtocolInfoHelp": "El valor que s'utilitzarà quan es respon a GetProtocolInfo sol·licita des del dispositiu.", "LabelProtocol": "Protocol", "LabelProfileContainersHelp": "Separats per comes. Es pot deixar buit per aplicar a tots els contenidors.", "LabelProfileCodecsHelp": "Separats per comes. Es pot deixar buit per aplicar a tots els còdecs.", - "LabelPostProcessorArgumentsHelp": "Ús {ruta} com la ruta de l'arxiu de gravació.", - "LabelPostProcessorArguments": "Post-processador arguments de línia de comandes", + "LabelPostProcessorArgumentsHelp": "Fes servir {path} com a la ruta del fitxer d'enregistrament.", + "LabelPostProcessorArguments": "Arguments de la línia d'ordres postprocessador", "LabelPostProcessor": "Aplicació de post-processament", "LabelPleaseRestart": "Els canvis tindran efecte després de tornar a carregar el client web manualment.", "LabelPlayMethod": "Mètode de reproducció", "LabelPlayerDimensions": "Dimensions del reproductor", "LabelPlayer": "Reproductor", - "LabelPasswordResetProvider": "Restabliment de la contrasenya de l'proveïdor", - "LabelPasswordConfirm": "Contrasenya (confirmar)", - "LabelParentNumber": "Nombre de Pares", + "LabelPasswordResetProvider": "Restabliment de la contrasenya del proveïdor", + "LabelPasswordConfirm": "Contrasenya (confirmació)", + "LabelParentNumber": "Nombre de pares", "LabelParentalRating": "Classificació parental", - "LabelOptionalNetworkPathHelp": "Si aquesta carpeta es comparteix a la xarxa, el subministrament de la ruta d'el recurs compartit de xarxa pot permetre als clients a altres dispositius de mitjans d'accés als arxius directament. Per exemple, {0} o {1}.", - "LabelOptionalNetworkPath": "Carpeta de xarxa compartida", - "LabelOpenclDeviceHelp": "Aquest és el dispositiu OpenCL que s'utilitza pel mapeig de to. El costat esquerra de el punt és el nombre de la plataforma, i el costat dret és el nombre de dispositiu a la plataforma. El valor per omissió és 0,0. Es requereix que l'arxiu de l'aplicació FFmpeg que conté el mètode d'acceleració de maquinari OpenCL.", - "LabelOpenclDevice": "OpenCL Dispositiu", - "LabelNumberOfGuideDaysHelp": "Descarregar més dies de dades de la guia ofereix la possibilitat de programar amb més antelació i veure més llistas, però també trigarà més temps a l'hora de descarregar. \"Auto\" triarà en funció del nombre de canals.", + "LabelOptionalNetworkPathHelp": "Si aquesta carpeta es comparteix a la xarxa, el subministrament de la ruta del recurs compartit de xarxa pot permetre als clients accedir directament als fitxers dels continguts multimèdia des d'altres dispositius. Per exemple, {0} o {1}.", + "LabelOptionalNetworkPath": "Directori de xarxa compartida", + "LabelOpenclDeviceHelp": "Aquest és el dispositiu OpenCL que s'utilitza per al mapatge de tons. El costat esquerra del punt és el número de la plataforma, la dreta és el número de dispositiu a la plataforma. El valor per defecte és 0,0. Es requereix que el fitxer de l'aplicació FFmpeg que conté el mètode d'acceleració de maquinari OpenCL.", + "LabelOpenclDevice": "Dispositiu OpenCL", + "LabelNumberOfGuideDaysHelp": "Descarregar les dades de més dies de la guia ofereix la possibilitat de programar amb més antelació i veure més llistats, però també trigarà més temps a l'hora de descarregar. \"Auto\" triarà en funció del nombre de canals.", "LabelNewsCategories": "Categories de notícies", "LabelMusicStreamingTranscodingBitrateHelp": "Especificar una taxa de bits màxima quan la transmissió de música.", "LabelMusicStreamingTranscodingBitrate": "Música transcodificació taxa de bits", - "LabelMoviePrefixHelp": "Si un prefix s'aplica als títols de pel·lícules, introduir-la aquí pel que el servidor pot gestionar de forma adequada.", + "LabelMoviePrefixHelp": "Si s'aplica a un prefix a títols de pel·lícules, introduïu-la aquí per a què el servidor pugui gestionar-ho de forma adequada.", "LabelMoviePrefix": "Prefix de la pel·lícula", - "LabelMovieCategories": "Categories Pel·lícula", + "LabelMovieCategories": "Categories de pel·lícules", "LabelModelUrl": "Model URL", - "LabelMinAudiobookResumeHelp": "Els títols s'assumeixen sense jugar si voleu parar abans d'aquest temps.", - "LabelMinAudiobookResume": "Llibre àudio mínim reprendre en minuts", - "LabelMetadataSaversHelp": "Triar els formats d'arxiu a utilitzar al desar les metadades.", + "LabelMinAudiobookResumeHelp": "Es considera que els títols no s'han començat si la reproducció s'atura abans d'aquest temps.", + "LabelMinAudiobookResume": "Represa mínima de l'audiollibre en minuts", + "LabelMetadataSaversHelp": "Trieu els formats de fitxers a fer servir en desar les metadades.", "LabelMetadataSavers": "Protectors de metadades", - "LabelMetadataReadersHelp": "Classificar les fonts de metadades locals preferides per ordre de prioritat. serà llegit el primer arxiu trobat.", + "LabelMetadataReadersHelp": "Classifica les fonts preferides de metadades locals per ordre de prioritat. El primer fitxer trobat serà llegit.", "LabelMetadataReaders": "Lectors de metadades", - "LabelMetadataDownloadersHelp": "Activa i classificar les seves descarregadors de metadades preferits en ordre de prioritat. Inferiors descarregadors de prioritat només s'utilitzen per suplir la falta d'informació.", + "LabelMetadataDownloadersHelp": "Habilita i classifica els descarregadors de metadades preferits en ordre de prioritat. Els de menor prioritat només es faran servir per a completar la manca d'informació.", "LabelMaxStreamingBitrate": "Màxima qualitat en streaming", - "LabelMaxMuxingQueueSizeHelp": "Nombre màxim de paquets que poden estar en buffer a l'espera que els fluxos s'inicialitzin. Intenteu incrementar-lo si teniu l'error \"Too many packets buffered for output stream\" als registres de FFmpeg. El valor recomanat és 2048.", - "LabelMaxMuxingQueueSize": "Max Muxing mida de la cua", - "LabelMaxChromecastBitrate": "Google Cast qualitat de streaming", - "LabelMaxAudiobookResumeHelp": "Els títols se suposa reproduir completament si s'atura quan la durada restant és inferior a aquest valor.", - "LabelMaxAudiobookResume": "Audiollibre minuts que queden per reprendre", + "LabelMaxMuxingQueueSizeHelp": "Nombre màxim de paquets que poden estar a la memòria intermèdia a l'espera que els fluxos s'inicialitzin. Intenteu incrementar-lo si teniu l'error \"Too many packets buffered for output stream\" als registres de FFmpeg. El valor recomanat és 2048.", + "LabelMaxMuxingQueueSize": "Mida màxima de la cua d'entremesclat", + "LabelMaxChromecastBitrate": "Qualitat de transmissió de vídeo del Google Cast", + "LabelMaxAudiobookResumeHelp": "S'assumeix que els títols s'han vist fins al final si en aturar-se queda pendent una duració menor a aquesta.", + "LabelMaxAudiobookResume": "Minuts que resten per a reiniciar l'audiollibre", "LabelMatchType": "Tipus de partida", - "LabelLoginDisclaimer": "Advertiment d'inici de sessió", + "LabelLoginDisclaimer": "Avís d'inici de sessió", "LabelLocalHttpServerPortNumberHelp": "El número de port TCP per al servidor HTTP.", - "LabelLocalCustomCss": "Estil CSS personalitzat que s'aplica només a aquest client. És possible que vulgueu desactivar el servidor de CSS personalitzat.", - "LabelLineup": "Els titulars", - "LabelLibraryPageSizeHelp": "Estableix la quantitat d'elements a mostrar en una pàgina de la biblioteca. Es posa a 0 per tal de desactivar la paginació.", - "LabelLibraryPageSize": "Mida de pàgina de la biblioteca", + "LabelLocalCustomCss": "Codi CSS personalitzat per a canvis d'estil que s'apliquen només a aquest client. És possible que vulgueu deshabilitar el servidor personalitzat de codi CSS.", + "LabelLineup": "Programació", + "LabelLibraryPageSizeHelp": "Estableix la quantitat d'elements a mostrar en una pàgina de la mediateca. Es posa a 0 per tal de desactivar la paginació.", + "LabelLibraryPageSize": "Mida de la pàgina de la mediateca", "LabelLanNetworks": "Xarxes LAN", - "LabelKodiMetadataUserHelp": "Guarda les dades de visionat en arxius NFO de manera que altres aplicacions les puguin utilitzar.", - "LabelKodiMetadataUser": "Guardar les dades de visualització d'usuari en arxius NFO per a", - "LabelKodiMetadataSaveImagePathsHelp": "Això es recomana si vostè té els noms d'arxiu d'imatge que no s'ajusten a les directrius de Kodi.", - "LabelKodiMetadataEnableExtraThumbsHelp": "Quan es descarreguin imatges, es poden guardar tant a \"extrafanart\" i \"extrathumbs\" per assegurar la màxima compatibilitat amb els skins del Kodi.", - "LabelKodiMetadataEnableExtraThumbs": "Còpia extrafanart a el camp extrathumbs", - "LabelKodiMetadataDateFormatHelp": "Totes les dates dins d'arxius NFO seran analitzats usant aquest format.", - "LabelKnownProxies": "Proxies coneguts", - "LabelKidsCategories": "Categories dels nens", + "LabelKodiMetadataUserHelp": "Desa les dades de visionament en arxius NFO de manera que d'altres aplicacions les puguin fer servir.", + "LabelKodiMetadataUser": "Desa les dades de visualització d'usuari en fitxers NFO per a", + "LabelKodiMetadataSaveImagePathsHelp": "Això està recomanat si teniu fitxers d'imatge que no s'ajusten a les directrius de Kodi.", + "LabelKodiMetadataEnableExtraThumbsHelp": "Quan es descarreguin imatges, es poden guardar tant a \"extrafanart\" com a \"extrathumbs\" per a assegurar la màxima compatibilitat amb les aparences de Kodi.", + "LabelKodiMetadataEnableExtraThumbs": "Còpia extrafanart al camp extrathumbs", + "LabelKodiMetadataDateFormatHelp": "Totes les dates dins d'arxius NFO seran analitzades fent servir aquest format.", + "LabelKnownProxies": "Servidors intermediaris coneguts", + "LabelKidsCategories": "Categories infantils", "LabelIsForced": "Forçat", "LabelInternetQuality": "Qualitat d'Internet", "LabelInNetworkSignInWithEasyPasswordHelp": "Utilitzeu el codi PIN fàcil d'accedir als clients dins de la seva xarxa local. només es necessita la contrasenya habitual fora de casa. Si el codi PIN està en blanc esquerre, no es necessita una contrasenya dins de la seva xarxa domèstica.", "LabelInNetworkSignInWithEasyPassword": "Activa senyal dins de la xarxa amb el meu codi PIN fàcil", - "LabelImportOnlyFavoriteChannels": "Restringir als canals marcats com a favorits", - "LabelImageFetchersHelp": "Activa i classificar les seves Fetchers imatge preferents en ordre de prioritat.", + "LabelImportOnlyFavoriteChannels": "Restringeix als canals marcats com a preferits", + "LabelImageFetchersHelp": "Habilita i classifica els rastrejadors preferits d'imatges, en ordre de prioritat.", "LabelIdentificationFieldHelp": "Una subcadena entre majúscules i minúscules o expressió d'expressions regulars.", "LabelIconMaxResHelp": "La resolució màxima d'icones exposades a través de la propietat 'upnp:icon'.", "LabelHttpsPortHelp": "El número de port TCP per al servidor HTTPS.", "LabelHomeNetworkQuality": "Qualitat de la xarxa domèstica", "LabelHDHomerunPortRangeHelp": "Restringeix el rang de ports UDP HDHomeRun a aquest valor. (Per defecte és 1024-65535).", "LabelHDHomerunPortRange": "Rang de ports de l'HDHomeRun", - "LabelHardwareAccelerationTypeHelp": "L'acceleració de maquinari requereix una configuració addicional.", + "LabelHardwareAccelerationTypeHelp": "L'acceleració de maquinari requereix d'una configuració addicional.", "LabelHardwareAccelerationType": "L'acceleració de maquinari", "LabelH265Crf": "H.265 codifica CRF", "LabelH264Crf": "H.264 codifica CRF", "LabelFormat": "Format", "LabelForgotPasswordUsernameHelp": "Introduïu el nom d'usuari, si el recordeu.", - "LabelFont": "Font", - "LabelFolder": "Carpeta", - "LabelFileOrUrl": "Arxiu o URL", - "LabelffmpegPath": "FFmpeg ruta", - "LabelExtractChaptersDuringLibraryScanHelp": "Generar imatges de capítols quan els vídeos s'importen durant l'exploració de la biblioteca. En cas contrari, seran extrets durant les imatges capítol tasca programada, el que permet l'exploració de la biblioteca regular per completar més ràpid.", + "LabelFont": "Tipus de lletra", + "LabelFolder": "Directori", + "LabelFileOrUrl": "Fitxer o URL", + "LabelffmpegPath": "Ruta de FFmpeg", + "LabelExtractChaptersDuringLibraryScanHelp": "Genera imatges de capítols quan els vídeos són importats durant l'escaneig de la mediateca. Desmarcant, les imatges es descarregaran quan s'executi la tasca programada, cosa que permet un escaneig més ràpid de la mediateca.", "LabelEncoderPreset": "Codificació preestablert", "LabelEnableSSDPTracing": "Habilitar rastreig SSDP", "LabelEnableSingleImageInDidlLimitHelp": "Alguns dispositius no es mostri correctament si diverses imatges estan integrats dins de DIDL.", "LabelEnableSingleImageInDidlLimit": "Limitar als una sola imatge incrustada", - "LabelEnableIP6Help": "Habilitar la funcionalitat IPv6.", - "LabelEnableIP6": "Activa IPv6", - "LabelEnableIP4Help": "Habilitar la funcionalitat IPv4.", - "LabelEnableIP4": "Activa IPv4", - "LabelEnableHttpsHelp": "Escoltar al port HTTPS configurat. Un certificat vàlid també ha de ser subministrat perquè això tingui efecte.", - "LabelEnableHttps": "Activar HTTPS", - "LabelEnableHardwareDecodingFor": "Activa descodificació de maquinari per", + "LabelEnableIP6Help": "Habilita la funcionalitat IPv6.", + "LabelEnableIP6": "Habilita IPv6", + "LabelEnableIP4Help": "Habilita la funcionalitat IPv4.", + "LabelEnableIP4": "Habilita IPv4", + "LabelEnableHttpsHelp": "Permet que el servidor escolti el port HTTPS configurat. També cal configurar un certificat vàlid perquè això tingui efecte.", + "LabelEnableHttps": "Habilita HTTPS", + "LabelEnableHardwareDecodingFor": "Habilita la descodificació de maquinari per a", "LabelEnableDlnaPlayTo": "Activar DLNA per reproduir", "LabelEnableDlnaDebugLogging": "Habilitar el registre de depuració DLNA", "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determinar la durada en segons entre dues recerques SSDP.", @@ -1288,140 +1288,140 @@ "LabelEnableAutomaticPortMapHelp": "Ports automàticament cap endavant públiques al router als ports locals en el seu servidor a través d'UPnP. Això pot no funcionar amb alguns models de routers o configuracions de xarxa. Els canvis no s'aplicaran fins després de reiniciar el servidor.", "LabelEmbedAlbumArtDidlHelp": "Alguns dispositius prefereixen aquest mètode per obtenir la portada de l'àlbum. Altres poden deixar de jugar amb aquesta opció activada.", "LabelEmbedAlbumArtDidl": "Incrustar la portada de l'àlbum en DIDL", - "LabelDropSubtitleHere": "Projectar subtítols aquí, o feu clic per navegar.", - "LabelDropShadow": "Projectar ombra", - "LabelDroppedFrames": "Cuadres caiguts", - "LabelDownMixAudioScaleHelp": "Potenciador d'àudio quan es redueixi. Un valor d'un preservarà el volum original.", - "LabelDownMixAudioScale": "Potenciador d'àudio quan es redueixi", + "LabelDropSubtitleHere": "Deixeu anar els subtítols aquí, o feu clic per a navegar.", + "LabelDropShadow": "Projecta ombra", + "LabelDroppedFrames": "Fotogrames descartats", + "LabelDownMixAudioScaleHelp": "Potencia l'àudio en barrejar a la baixa. Un valor d'1 preservarà el volum original.", + "LabelDownMixAudioScale": "Potencia l'àudio en barrejar a la baixa", "LabelDisplayMode": "Mode de visualització", - "LabelDisplayLanguageHelp": "Traducció Jellyfin és un projecte en curs.", - "LabelDisableCustomCss": "Desactivar CSS tematització d'encàrrec / branding proporciona des del servidor.", + "LabelDisplayLanguageHelp": "La traducció de Jellyfin és un projecte en curs.", + "LabelDisableCustomCss": "Desactiva el codi CSS personalitzat per a tema/marca proporcionat des del servidor.", "LabelDidlMode": "DIDL manera", "LabelDeinterlaceMethod": "Mètode de desentrellaçat", "LabelDefaultScreen": "Pantalla per defecte", - "LabelDateTimeLocale": "Data Hora Local", - "LabelDateAddedBehaviorHelp": "Si un valor de metadades és present, sempre va ser utilitzat abans que qualsevol d'aquestes opcions.", - "LabelDateAddedBehavior": "El comportament agregat Data de nous continguts", - "LabelCustomRating": "Classificació personal", - "LabelCustomDeviceDisplayNameHelp": "De donar un nom de visualització personalitzat o deixar en blanc per usar el nom reportat pel dispositiu.", - "LabelCustomCertificatePathHelp": "Ruta a un arxiu PKCS #12 que contingui un certificat i una clau privada per activar el suport TLS en un domini personalitzat.", - "LabelCustomCertificatePath": "SSL personalitzat ruta de l'certificat", + "LabelDateTimeLocale": "Data i hora local", + "LabelDateAddedBehaviorHelp": "Si hi ha un valor de metadades, sempre es farà servir abans de qualsevol d'aquestes opcions.", + "LabelDateAddedBehavior": "Comportament de la data afegida per a contingut nou", + "LabelCustomRating": "Valoració personalitzada", + "LabelCustomDeviceDisplayNameHelp": "Proporcioneu un nom personalitzat de visualització o deixeu-ho en blanc per a fer servir el nom reportat pel dispositiu.", + "LabelCustomCertificatePathHelp": "Ruta a un arxiu PKCS #12 que contingui un certificat i una clau privada per a activar el suport TLS en un domini personalitzat.", + "LabelCustomCertificatePath": "Ruta del certificat SSL personalitzat", "LabelCurrentStatus": "Estat actual", - "LabelCreateHttpPortMapHelp": "Permetre l'assignació de ports automàtica per crear una regla per al tràfic HTTP, a més de trànsit HTTPS.", - "LabelCreateHttpPortMap": "Habilitar l'assignació automàtica de ports per al tràfic HTTP, així com HTTPS.", - "LabelCorruptedFrames": "Cuadres corruptes", + "LabelCreateHttpPortMapHelp": "Permet el mapatge automàtic de ports per a crear una regla per al tràfic HTTP, a més a més del trànsit HTTPS.", + "LabelCreateHttpPortMap": "Habilita el mapatge automàtic de ports per al tràfic HTTP, així com HTTPS.", + "LabelCorruptedFrames": "Quadres corruptes", "LabelColorTransfer": "Transferència de color", "LabelColorSpace": "Espai de color", "LabelColorPrimaries": "Colors primaris", - "LabelChromecastVersion": "Versió Google Cast", - "LabelCertificatePasswordHelp": "Si el seu certificat requereix una clau, ingressi-la aquí.", - "LabelCertificatePassword": "Verificar contrasenya", - "LabelBurnSubtitles": "Gravar subtítols", - "LabelBlockContentWithTags": "Bloquejar elements amb etiquetes", + "LabelChromecastVersion": "Versió de Google Cast", + "LabelCertificatePasswordHelp": "Si el vostre certificat requereix una contrasenya, ingresseu-la aquí.", + "LabelCertificatePassword": "Verifica la contrasenya", + "LabelBurnSubtitles": "Incrusta subtítols", + "LabelBlockContentWithTags": "Bloqueja elements amb etiquetes", "LabelBlastMessageIntervalHelp": "Determina la durada en segons entre ràfegues de missatges en directe.", - "LabelBlastMessageInterval": "Interval entre missatges de vida", - "LabelBitrate": "Tassa de bits", - "LabelBindToLocalNetworkAddressHelp": "Anul·lar l'adreça IP local per al servidor HTTP. Si és buit, el servidor s'unirà a totes les adreces disponibles. Canviar aquest valor requereix un reinici.", - "LabelBindToLocalNetworkAddress": "S'uneixen a l'adreça de xarxa local", + "LabelBlastMessageInterval": "Interval entre missatges en viu", + "LabelBitrate": "Taxa de bits", + "LabelBindToLocalNetworkAddressHelp": "Anul·la l'adreça IP local per al servidor HTTP. Si és buit, el servidor s'unirà a totes les adreces disponibles. Canviar aquest valor requereix un reinici.", + "LabelBindToLocalNetworkAddress": "Vincula a l'adreça local de xarxa", "LabelBaseUrl": "URL base", - "LabelAutomaticDiscoveryHelp": "Permet que les aplicacions detecten automàticament Jellyfin usant el port UDP 7359.", - "LabelAutomaticDiscovery": "Activa el descobriment automàtic", - "LabelAutomaticallyRefreshInternetMetadataEvery": "Metadades d'actualització automàtica a través d'Internet", + "LabelAutomaticDiscoveryHelp": "Permet que les aplicacions detectin automàticament Jellyfin usant el port UDP 7359.", + "LabelAutomaticDiscovery": "Habilita el descobriment automàtic", + "LabelAutomaticallyRefreshInternetMetadataEvery": "Actualitza automàticament les metadades, prenent-les d'Internet", "LabelAutoDiscoveryTracingHelp": "Quan està activat, es registraran els paquets rebuts en el port d'autodescobriment.", "LabelAutoDiscoveryTracing": "Activa el descobriment automàtic de rastreig.", - "LabelAuthProvider": "L'autenticació de l'proveïdor", + "LabelAuthProvider": "L'autenticació del proveïdor", "LabelAudioSampleRate": "Freqüència de mostreig d'àudio", "LabelAudioCodec": "Còdec d'àudio", "LabelAudioChannels": "Canals d'àudio", "LabelAudioBitrate": "Taxa de bits d'àudio", "LabelAudioBitDepth": "Profunditat de bits d'àudio", - "LabelAppNameExample": "Un nom llegible per persones per identificar les claus de l'API. Aquesta configuració no afectarà la funcionalitat.", + "LabelAppNameExample": "Un nom humà llegible per a identificar les claus de l'API. Aquesta configuració no afectarà la funcionalitat.", "LabelAppName": "Nom de l'aplicació", - "LabelAllowHWTranscoding": "Permetre la transcodificació de maquinari", - "LabelAllowedRemoteAddressesMode": "La manera de filtre d'adreces IP remota", - "LabelAllowedRemoteAddresses": "Filtres remot IP", + "LabelAllowHWTranscoding": "Permet la transcodificació de maquinari", + "LabelAllowedRemoteAddressesMode": "Mode de filtre d'adreces IP remotes", + "LabelAllowedRemoteAddresses": "Filtre d'adreça IP remota", "LabelAlbumArtPN": "Àlbum PN art", "LabelAlbumArtMaxResHelp": "La resolució màxima de la imatge de l'àlbum exposa a través de la propietat 'upnp:albumArtURI'.", "LabelAlbumArtists": "Artistes de l'àlbum", "LabelAlbumArtHelp": "PN utilitzat per a la portada de l'àlbum, dis de l'atribut 'dlna:profileID' a 'upnp:albumArtURI'. Alguns dispositius requereixen un valor específic, independentment de la mida de la imatge.", - "LabelAirsBeforeSeason": "Al aire abans de la temporada", - "LabelAirsBeforeEpisode": "Al aire abans episodi", - "LabelAirsAfterSeason": "Al aire després de la temporada", + "LabelAirsBeforeSeason": "S'emet abans de la temporada", + "LabelAirsBeforeEpisode": "S'emet abans de l'episodi", + "LabelAirsAfterSeason": "S'emet després de la temporada", "LabelAbortedByServerShutdown": "(Avortat pel tancament de servidor)", "Label3DFormat": "Format 3D", - "KnownProxiesHelp": "Llista separada per comes de les adreces IP o els noms d'amfitrió de servidors proxy coneguts que s'utilitzen quan es connecta a la instància del Jellyfin. Això és necessari per fer un ús correcte dels headers 'X-Forwarded-For'. Requereix un reinici després de desar.", - "Kids": "Nens", + "KnownProxiesHelp": "Llista separada per comes de les adreces IP o els noms d'amfitrió de servidors proxy coneguts que s'utilitzen quan es connecta a la instància del Jellyfin. Això és necessari per fer un ús correcte de les capçaleres 'X-Forwarded-For'. Requereix un reinici després de desar.", + "Kids": "Infants", "Items": "Elements", - "ImportFavoriteChannelsHelp": "Només els canals que estiguin marcats com a favorits al dispositiu sintonitzador seran importats.", + "ImportFavoriteChannelsHelp": "Només s'importaran els canals que estiguin marcats com a favorits al dispositiu sintonitzador.", "Image": "Imatge", - "HttpsRequiresCert": "Per tal d'habilitar les connexions segures, haurà de proporcionar un certificat SSL de confiança com ara Let's Encrypt. Faciliti un certificat o desactivi les connexions segures.", + "HttpsRequiresCert": "Per tal d'habilitar les connexions segures, haureu de proporcionar un certificat SSL de confiança com ara Let's Encrypt. Faciliteu un certificat o desactiveu les connexions segures.", "Horizontal": "Horitzontal", "Home": "Inici", - "HideWatchedContentFromLatestMedia": "Amagar el contingut visionat de 'Mitjans afegits darrerament'", + "HideWatchedContentFromLatestMedia": "Amaga el contingut visionat de \"Continguts multimèdia afegits darrerament\"", "HeaderVideoType": "Tipus de vídeo", "HeaderVideos": "Vídeos", "HeaderVideoQuality": "Qualitat de vídeo", - "HeaderUploadSubtitle": "Pujar subtítols", - "HeaderTypeImageFetchers": "Buscadors d'imatge ({0})", + "HeaderUploadSubtitle": "Pujada de subtítols", + "HeaderTypeImageFetchers": "Cercadors d'imatges ({0})", "HeaderTuners": "Sintonitzadors", "HeaderTunerDevices": "Dispositius sintonitzadors", "HeaderTranscodingProfileHelp": "Afegir perfils de transcodificació per ta ld'indicar quins formats han de ser utilitzats quan es requereixi la transcodificació.", "HeaderTracks": "Pistes", "HeaderThisUserIsCurrentlyDisabled": "Aquest usuari està actualment desactivat", - "HeaderSyncPlaySelectGroup": "Unir-se a un grup", + "HeaderSyncPlaySelectGroup": "Unió a un grup", "HeaderSyncPlayEnabled": "SyncPlay habilitat", "HeaderSubtitleProfilesHelp": "Els perfils de subtítols descriuen els formats de subtítols suportats pel dispositiu.", "HeaderSubtitleProfiles": "Perfils dels subtítols", "SaveChanges": "Guardar canvis", "Runtime": "Temps d'execució", - "Rewind": "Rebobinar", + "Rewind": "Rebobina", "Restart": "Reinicia", - "ResetPassword": "Restablir la contrasenya", - "RepeatOne": "Repetir 1", + "ResetPassword": "Restableix la contrasenya", + "RepeatOne": "Repeteix un", "RepeatMode": "Mode de repetició", - "RepeatAll": "Repetir tot", + "RepeatAll": "Repeteix-ho tot", "RefreshDialogHelp": "Les metadades s'actualitzen segons la configuració i serveis d'internet habilitats al Tauler de control.", "Recordings": "Enregistraments", - "RecommendationStarring": "Protagonitzada {0}", + "RecommendationStarring": "Protagonitzada per {0}", "RecommendationDirectedBy": "Dirigida per {0}", - "RecommendationBecauseYouLike": "Perquè t'agrada {0}", - "Rate": "Rati", + "RecommendationBecauseYouLike": "Perquè us agrada {0}", + "Rate": "Valoreu", "Raised": "Elevat", "QuickConnectNotAvailable": "Demaneu a l'administrador del servidor que activi el Quick Connect", "QuickConnectNotActive": "Quick Connect no està activat en aquest servidor", "QuickConnectInvalidCode": "Codi de Quick Connect no vàlid", "QuickConnectDescription": "Per iniciar sessió amb Quick Connect, seleccioneu el botó 'Quick Connect' al dispositiu des del que us esteu connectant i introduïu el codi que apareix a continuació.", "QuickConnectDeactivated": "El Quick Connect s'ha desactivat abans que la sol·licitud d'inici de sessió pogués ser aprovada", - "QuickConnectAuthorizeSuccess": "Heu autenticat el vostre dispositiu correctament!", + "QuickConnectAuthorizeSuccess": "Heu autenticat correctament el vostre dispositiu!", "QuickConnectAuthorizeFail": "Codi de Quick Connect no reconegut", "QuickConnectAuthorizeCode": "Introduïu el codi {0} per iniciar sessió", - "QuickConnectActivationSuccessful": "Activat amb èxit", - "QuickConnect": "Quick Connect", + "QuickConnectActivationSuccessful": "S'ha activat amb èxit", + "QuickConnect": "Quick Connect (connexió ràpida)", "PluginFromRepo": "{0} des del repositori {1}", "Profile": "Perfil", "ProductionLocations": "Centres de producció", - "Primary": "Primari", - "PreviousTrack": "Vés a l'anterior", + "Primary": "Principal", + "PreviousTrack": "Ves a l'anterior", "Previous": "Anterior", "Preview": "Vista prèvia", "Premieres": "Estrenes", - "PreferEmbeddedTitlesOverFileNamesHelp": "Determinar el títol de visualització que voleu utilitzar quan no hi hagi metadades d'Internet o metadades locals disponibles.", - "PreferEmbeddedTitlesOverFileNames": "Prefereixo títols integrats més de noms de fitxer", - "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Utilitzar la informació de l'episodi de les metadades incrustades si està disponible.", - "PreferEmbeddedEpisodeInfosOverFileNames": "Prefereixo informació de l'episodi incrustat sobre els noms d'arxiu", - "PosterCard": "Targeta de pòster", - "Poster": "Pòster", - "PleaseSelectTwoItems": "Seleccioneu al menys dos ítems.", - "PleaseEnterNameOrId": "Introdueixi un nom o un ID extern.", + "PreferEmbeddedTitlesOverFileNamesHelp": "Determina el títol que farà servir quan no hi hagi metadades d'Internet o metadades locals disponibles.", + "PreferEmbeddedTitlesOverFileNames": "Prioritza els títols xuclats per sobre dels noms dels fitxers", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Fes servir la informació de l'episodi de les metadades xuclades, si es troba disponible.", + "PreferEmbeddedEpisodeInfosOverFileNames": "Prioritza la informació de l'episodi inclosa en els noms dels fitxers", + "PosterCard": "Targeta de presentació", + "Poster": "Cartell", + "PleaseSelectTwoItems": "Seleccioneu almenys dos elements.", + "PleaseEnterNameOrId": "Introduïu un nom o un identificador extern.", "PleaseConfirmPluginInstallation": "Feu clic a 'D'acord' per confirmar que ha llegit el text de dalt i desitja procedir amb la instal·lació del complement.", - "PleaseAddAtLeastOneFolder": "Afegiu al menys una carpeta a aquesta biblioteca fent clic al botó '+'.", - "PlayNextEpisodeAutomatically": "Jugar el proper episodi de forma automàtica", - "PlayNext": "Reproduir el següent", - "PlayCount": "Contador de reproduccions", + "PleaseAddAtLeastOneFolder": "Afegiu-hi almenys un directori fent clic al botó '+'.", + "PlayNextEpisodeAutomatically": "Reprodueix l'episodi següent de forma automàtica", + "PlayNext": "Reprodueix el següent", + "PlayCount": "Nombre de reproduccions", "PlaybackRate": "Velocitat de reproducció", - "PlaybackErrorNoCompatibleStream": "Aquest client no és compatible amb els mitjans de comunicació i el servidor no està enviant un format de mitjans compatibles.", + "PlaybackErrorNoCompatibleStream": "Aquest client no és compatible amb el contingut multimèdia i el servidor no està enviant un format multimèdia compatible.", "PlaybackData": "Informació de reproducció", - "PlaceFavoriteChannelsAtBeginning": "Col·loqui els canals favorits a l'començament", + "PlaceFavoriteChannelsAtBeginning": "Col·loca els canals preferits al començament", "PinCodeResetConfirmation": "Esteu segur que voleu restablir el codi PIN?", "PinCodeResetComplete": "El codi PIN s'ha restablert.", "PictureInPicture": "Imatge en imatge", @@ -1429,16 +1429,16 @@ "PersonRole": "com {0}", "Person": "Persona", "PerfectMatch": "Combinació perfecta", - "PathNotFound": "La ruta no s'ha pogut trobat. Assegureu-vos que la ruta és vàlida i torni a intentar-ho.", - "PasswordResetProviderHelp": "Escollir un proveïdor de restabliment de contrasenya que s'utilitzarà quan l'usuari sol·licita un restabliment de contrasenya.", - "PackageInstallFailed": "La instal·lació de {0} (versió {1}) ha fallat.", - "PackageInstallCompleted": "Instal·lació de {0} (versió {1}) acabada.", - "Overview": "Visió de conjunt", + "PathNotFound": "No s'ha pogut trobar el camí. Assegureu-vos que el camí és vàlid i torneu-ho a intentar.", + "PasswordResetProviderHelp": "Escollir un proveïdor de restabliment de contrasenya que s'utilitzarà quan l'usuari sol·liciti un restabliment de contrasenya.", + "PackageInstallFailed": "Ha fallat la instal·lació de {0} (versió {1}).", + "PackageInstallCompleted": "S'ha acabat la instal·lació de {0} (versió {1}).", + "Overview": "Sinopsi", "OptionTrackName": "Nom de la pista", - "OptionSaveMetadataAsHiddenHelp": "El canvi d'aquest s'aplicarà als nous metadades guardats en el futur. arxius de metadades existents s'actualitzaran la propera vegada que es guarden al servidor.", + "OptionSaveMetadataAsHiddenHelp": "La configuració s'aplicarà a les metadades noves que es vagin creant. Els fitxers existents de metadades s'actualitzaran la propera vegada que es desin al servidor.", "OptionResElement": "'res' element", - "OptionRequirePerfectSubtitleMatchHelp": "Que requereix una combinació perfecta filtrarà subtítols per incloure només aquells que han estat provats i verificats amb l'arxiu de vídeo exacta. A l'desmarcar això augmentarà la probabilitat de subtítols està descarregant, però augmentarà les possibilitats de subtítols de text inoportuns o incorrecta.", - "OptionRequirePerfectSubtitleMatch": "Només descarregar subtítols que siguin una coincidència perfecta amb els arxius de vídeo", + "OptionRequirePerfectSubtitleMatchHelp": "Requerir una combinació perfecta filtrarà els subtítols per a incloure només aquells que s'ha testat i verificat que coincideixen amb el fitxer de vídeo. En desmarcar això augmentarà la probabilitat de descàrrega de subtítols, però augmentarà les possibilitats que els subtítols no acabin d'encaixar o siguin incorrectes.", + "OptionRequirePerfectSubtitleMatch": "Descarrega només els subtítols que siguin coincideixin perfectament amb els fitxers de vídeo", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Necessari per a alguns dispositius que no busquen els fixters massa bé.", "OptionReportByteRangeSeekingWhenTranscoding": "Informe que dóna suport al servidor byte de la recerca, quan la transcodificació", "OptionRegex": "Expressions regulars", @@ -1450,70 +1450,70 @@ "OptionPlainVideoItems": "Mostra tots els vídeos com a elements de vídeo sense format", "OptionPlainStorageFoldersHelp": "Totes les carpetes estan representats en DIDL com 'object.container.storageFolder' en lloc d'un tipus específic més, com 'object.container.person.musicArtist'.", "OptionPlainStorageFolders": "Mostra totes les carpetes com carpetes d'emmagatzematge sense format", - "OptionMaxActiveSessionsHelp": "Un valor de 0 desactivarà la funció.", - "OptionMaxActiveSessions": "Establir el nombre màxim de sessions simultànies d'usuaris.", - "OptionMax": "Max", - "OptionLoginAttemptsBeforeLockoutHelp": "Un valor de 0 significa que s'hereten els valors per defecte: 3 intents per als usuaris normals i 5 per als administradors. Establir a -1 desactiva la funció.", + "OptionMaxActiveSessionsHelp": "Un valor de 0 deshabilitarà la funció.", + "OptionMaxActiveSessions": "Estableix el nombre màxim de sessions simultànies d'usuaris.", + "OptionMax": "Màx", + "OptionLoginAttemptsBeforeLockoutHelp": "Un valor de 0 significa que s'hereten els valors per defecte: 3 intents per als usuaris normals i 5 per als administradors. Posar-hi -1 deshabilita la funció.", "OptionLoginAttemptsBeforeLockout": "Determina el nombre d'intents d'inici de sessió incorrectes que es poden fer abans que es bloquegi.", "OptionIsSD": "SD", "OptionIsHD": "HD", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Aquestes sol·licituds seran ateses, però no faran cas de la capçalera d'interval de bytes.", "OptionIgnoreTranscodeByteRangeRequests": "No feu cas de les sol·licituds d'interval de bytes de transcodificació", "OptionHlsSegmentedSubtitles": "HLS segmentat subtítols", - "OptionForceRemoteSourceTranscoding": "Força de transcodificació de mitjans de comunicació a distància, com TV en directe", - "OptionExtractChapterImage": "Habilitar extracció de la imatge capítol", + "OptionForceRemoteSourceTranscoding": "Força la transcodificació de fonts externes, com ara la televisió en directe", + "OptionExtractChapterImage": "Habilita l'extracció d'imatges de capítols", "OptionEstimateContentLength": "Estimar longitud d'el contingut quan la transcodificació", "OptionEnableM2tsModeHelp": "Activar el mode M2TS quan es codifica a MPEG-TS.", "OptionEnableM2tsMode": "Activar més modes M2TS", - "OptionEnableForAllTuners": "Habilitar per a tots els dispositius sintonitzadors", - "OptionEnableExternalContentInSuggestions": "Habilitar contingut extern en suggeriments", + "OptionEnableForAllTuners": "Habilita per a tots els dispositius sintonitzadors", + "OptionEnableExternalContentInSuggestions": "Habilita el contingut extern en els suggeriments", "OptionDvd": "DVD", - "OptionDisplayFolderViewHelp": "Mostra les carpetes juntament amb els seus altres biblioteques de mitjans. Això pot ser útil si li agradaria tenir una vista de carpetes pla.", - "OptionDisplayFolderView": "Mostra una vista de carpetes per mostrar carpetes de mitjans de fricció", - "OptionDateAddedFileTime": "Utilitzar la data de creació de l'arxiu", + "OptionDisplayFolderViewHelp": "Mostra els directoris juntament amb les altres mediateques. Això pot ser útil si us agradaria tenir una vista de directoris sense format.", + "OptionDisplayFolderView": "Mostra una vista de directori per a veure directoris multimèdia sense format", + "OptionDateAddedFileTime": "Fes servir la data de creació de l'arxiu", "OptionCustomUsers": "Personalitzat", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", "OptionBluray": "BD", - "OptionAutomaticallyGroupSeriesHelp": "Sèrie que es distribueixen en diverses carpetes dins d'aquesta biblioteca es combinarà automàticament en una sola sèrie.", - "OptionAutomaticallyGroupSeries": "Automàticament sèrie que es distribueixen en diverses carpetes", - "OptionAllowVideoPlaybackTranscoding": "Permet la reproducció de vídeo que requereix la transcodificació", + "OptionAutomaticallyGroupSeriesHelp": "Les sèries d'aquesta mediateca que es distribueixin entre diversos directoris es combinaran automàticament en una única sèrie.", + "OptionAutomaticallyGroupSeries": "Combina automàticament les sèries que estiguin distribuïdes entre diversos directoris", + "OptionAllowVideoPlaybackTranscoding": "Permet la reproducció de vídeo que requereix una transcodificació", "OptionAllowVideoPlaybackRemuxing": "Permet la reproducció de vídeo que requereix una conversió sense recodificació", - "OptionAllowSyncTranscoding": "Permet la descàrrega i la sincronització dels mitjans que requereixen transcodificació", - "OptionAllowMediaPlaybackTranscodingHelp": "La restricció de l'accés a la transcodificació pot provocar errors de reproducció en els clients a causa dels formats de mitjans compatibles.", - "OptionAllowContentDownloadHelp": "Els usuaris poden descarregar els mitjans i emmagatzemar-los als seus dispositius. Això no és el mateix que una funció de sincronització. Les biblioteques de llibres ho requereixen per funcionar.", - "OptionAllowContentDownload": "Permetre la descàrrega dels mitjans", + "OptionAllowSyncTranscoding": "Permet la conversió del contingut multimèdia quan es descarregui i sincronitzi", + "OptionAllowMediaPlaybackTranscodingHelp": "La restricció de l'accés a la transcodificació pot provocar errors de reproducció en els clients a causa dels formats multimèdia incompatibles.", + "OptionAllowContentDownloadHelp": "Els usuaris poden descarregar el contingut multimèdia i emmagatzemar-lo als seus dispositius. Això no és el mateix que una funció de sincronització. Les mediateques de llibres ho requereixen per funcionar.", + "OptionAllowContentDownload": "Permet la descàrrega del contingut multimèdia", "OptionAllowAudioPlaybackTranscoding": "Permet la reproducció d'àudio que requereix la transcodificació", "Option3D": "3D", - "OnWakeFromSleep": "En deixant de la son", - "OnlyImageFormats": "Només Formats d'Imatge (VobSub, PGS, SUB)", + "OnWakeFromSleep": "En despertar de la hibernació", + "OnlyImageFormats": "Només formats d'imatge (VobSub, PGS, SUB)", "OneChannel": "Un canal", - "OnApplicationStartup": "A l'iniciar l'aplicació", + "OnApplicationStartup": "En iniciar l'aplicació", "Off": "Apagat", "HeaderSubtitleProfile": "Perfil dels subtítols", "HeaderSubtitleDownloads": "Descàrrega dels subtítols", - "HeaderStopRecording": "Aturar l'enregistrament", + "HeaderStopRecording": "Atura l'enregistrament", "HeaderSpecialEpisodeInfo": "Informació de l'episodi especial", "HeaderServerAddressSettings": "Configuració de l'adreça del servidor", "HeaderSeriesStatus": "Estat de la sèrie", - "HeaderSelectTranscodingPathHelp": "Examineu o introduïu la ruta a utilitzar per als arxius de transcodificació. La carpeta ha de tenir permís d'escriptura.", + "HeaderSelectTranscodingPathHelp": "Examineu o introduïu la ruta a utilitzar per als arxius de transcodificació. El directori ha de tenir permís d'escriptura.", "HeaderSelectTranscodingPath": "Seleccioneu la ruta de transcodificació", - "HeaderSelectServerCachePathHelp": "Examineu o introduïu la ruta a utilitzar per als arxius cau del servidor. La carpeta ha de tenir permís d'escriptura.", + "HeaderSelectServerCachePathHelp": "Examineu o introduïu la ruta a utilitzar per als arxius cau del servidor. El servidor ha de tenir permís d'escriptura.", "HeaderSelectServerCachePath": "Seleccioneu la ruta de la memòria cau del servidor", - "HeaderSelectPath": "Seleccionar ruta", - "HeaderSelectMetadataPathHelp": "Examineu o introduïu la ruta que volgueu utilitzar per a les metadades. La carpeta ha de tenir permís d'escriptura.", + "HeaderSelectPath": "Seleccioneu una ruta", + "HeaderSelectMetadataPathHelp": "Examineu o introduïu la ruta que vulgueu utilitzar per a les metadades. El directori ha de tenir permís d'escriptura.", "HeaderSelectMetadataPath": "Seleccioneu la ruta de les metadades", - "HeaderSelectCertificatePath": "Seleccionar la ruta del certificat", + "HeaderSelectCertificatePath": "Selecciona la ruta del certificat", "HeaderRevisionHistory": "Historial de versions", "HeaderResponseProfileHelp": "Els perfils de resposta proporcionen una manera de personalitzar la informació que s'envia a el dispositiu quan es reprodueixen certs tipus de mitjans.", "HeaderResponseProfile": "Perfil de resposta", - "HeaderRemoveMediaLocation": "Esborrar l'ubicació de mitjans", - "HeaderRemoveMediaFolder": "Esborrar la carpeta de mitjans", + "HeaderRemoveMediaLocation": "Elimina la ubicació dels continguts multimèdia", + "HeaderRemoveMediaFolder": "Elimina el directori de continguts multimèdia", "HeaderRemoteAccessSettings": "Configuració de l'accés remot", "HeaderRecordingPostProcessing": "Post-processament de l'enregistrament", - "HeaderPortRanges": "Firewall i configuració del proxy", + "HeaderPortRanges": "Configuració del tallafoc i el proxy", "HeaderPluginInstallation": "Instal·lació de complements", - "HeaderPlayOn": "Reproduir a", - "HeaderPlayback": "Reproducció dels mitjans", + "HeaderPlayOn": "Reprodueix a", + "HeaderPlayback": "Reproducció dels continguts multimèdia", "HeaderPinCodeReset": "Restablir el codi PIN", "HeaderPhotoAlbums": "Àlbums de fotos", "HeaderOtherItems": "Altres elements", @@ -1523,66 +1523,66 @@ "HeaderNavigation": "Navegació", "HeaderMusicQuality": "Qualitat de la música", "HeaderMoreLikeThis": "Similars", - "HeaderMedia": "Mitjans", + "HeaderMedia": "Contingut multimèdia", "HeaderLoginFailure": "Error en l'inici de sessió", - "HeaderLiveTvTunerSetup": "Configuració del sintonitzador de TV", - "HeaderKodiMetadataHelp": "Per activar o desactivar les metadades NFO, editeu una biblioteca i busqueu la secció d'Estalviadors de metadades.", - "HeaderImageOptions": "Opcions de la imatge", - "HeaderIdentifyItemHelp": "Introduïu un o més criteris de cerca. Elimineu criteris per augmentar els resultats de cerca.", + "HeaderLiveTvTunerSetup": "Configuració del sintonitzador de televisió", + "HeaderKodiMetadataHelp": "Per activar o desactivar les metadades NFO, editeu una mediateca i busqueu la secció d'Estalviadors de metadades.", + "HeaderImageOptions": "Opcions de les imatges", + "HeaderIdentifyItemHelp": "Introduïu un o més criteris de cerca. Elimineu criteris per a augmentar els resultats de cerca.", "HeaderHttpsSettings": "Configuració de HTTPS", - "HeaderGuideProviders": "Proveïdors de dades de la guia de TV", - "HeaderForKids": "Per als nens", - "HeaderFetcherSettings": "Ajustaments del recollidor", + "HeaderGuideProviders": "Proveïdors de dades de la guia de televisió", + "HeaderForKids": "Per als infants", + "HeaderFetcherSettings": "Configuració del capturador", "HeaderError": "Error", - "HeaderEnabledFieldsHelp": "Desseleccionar un camp per a bloquejar-lo i impedir un canvi de les seves dades.", - "HeaderDVR": "Gravador digital (DVR)", - "HeaderDownloadSync": "Descaregar i sincronitzar", + "HeaderEnabledFieldsHelp": "Desseleccioneu un camp per a bloquejar-lo i impedir un canvi de les seves dades.", + "HeaderDVR": "Enregistrador digital (DVR)", + "HeaderDownloadSync": "Descarrega i sincronitza", "LabelOriginalName": "Nom original", - "LabelMaxDaysForNextUpHelp": "Establir la quantitat màxima de dies que una sèrie ha de romandre a la llista \"A continuació\" sense mirar-lo.", + "LabelMaxDaysForNextUpHelp": "Estableix la quantitat màxima de dies que una sèrie ha de romandre a la llista \"A continuació\" sense haver-la mirat.", "HeaderSyncPlayTimeSyncSettings": "Sincronització de temps", "HeaderSyncPlayPlaybackSettings": "Reproducció", "HeaderSyncPlaySettings": "Configuració de SyncPlay", "Engineer": "Enginyer de so", "AgeValue": "({0} anys)", - "LabelSyncPlaySettingsExtraTimeOffsetHelp": "Ajusta manualment el temps de compensació amb el dispositiu seleccionat per la sincronització del temps. Ajustar amb cura.", + "LabelSyncPlaySettingsExtraTimeOffsetHelp": "Ajusteu manualment el temps de decalatge amb el dispositiu seleccionat per a la sincronització del temps. Ajusteu-ho amb cura.", "LabelSyncPlaySettingsDescription": "Canvia les preferències de SyncPlay", - "LabelMaxDaysForNextUp": "Màxims dies per 'A continuació'", - "LabelHardwareEncoding": "Codificació per Hardware", + "LabelMaxDaysForNextUp": "Màxim de dies per \"A continuació\"", + "LabelHardwareEncoding": "Codificació per maquinari", "ErrorPlayerNotFound": "No s'ha trobat cap reproductor per al fitxer multimèdia sol·licitat.", "SelectAll": "Selecciona-ho tot", - "DirectPlayError": "Hi ha hagut un error en iniciar la reproducció en directe", + "DirectPlayError": "S'ha produït un error en iniciar la reproducció en directe", "UnknownAudioStreamInfo": "La informació del flux d'àudio és desconeguda", "UnknownVideoStreamInfo": "La informació del flux de vídeo és desconeguda", - "VideoBitrateNotSupported": "La velocitat de transmissió del vídeo no està suportada", + "VideoBitrateNotSupported": "La velocitat de transmissió del vídeo no és compatible", "LabelHardwareEncodingOptions": "Opcions de codificació per maquinari", "EnableIntelLowPowerHevcHwEncoder": "Habilita el còdec per maquinari Intel Low-Power HEVC", "EnableIntelLowPowerH264HwEncoder": "Habilita el còdec per maquinari Intel Low-Power H.264", - "ContainerBitrateExceedsLimit": "El còdec de vídeo excedeix el límit", + "ContainerBitrateExceedsLimit": "La taxa de bits de vídeo excedeix el límit", "TypeOptionPluralVideo": "Vídeos", "TypeOptionPluralSeason": "Temporades", - "TypeOptionPluralMusicVideo": "Vídeos Musicals", + "TypeOptionPluralMusicVideo": "Videoclips", "TypeOptionPluralMusicArtist": "Artistes musicals", "TypeOptionPluralMusicAlbum": "Àlbums de música", "TypeOptionPluralMovie": "Pel·lícules", "TypeOptionPluralEpisode": "Episodis", "TypeOptionPluralBook": "Llibres", "Track": "Pista", - "Print": "Imprimeix", + "Print": "Impremta", "PreviousChapter": "Episodi anterior", - "PlaybackErrorPlaceHolder": "Això és un marcador de posició per a mitjans físics que el Jellyfin no pot reproduir. Inseriu el disc per reproduir.", + "PlaybackErrorPlaceHolder": "Això és un marcador de posició per a suports físics que Jellyfin no pot reproduir. Inseriu el disc per a reproduir-lo.", "OtherArtist": "Altres artistes", - "NextChapter": "Pròxim episodi", + "NextChapter": "Episodi següent", "Mixer": "Mesclador", "MediaInfoTitle": "Títol", "LabelSyncPlaySettingsSyncCorrection": "Correcció de sincronisme", "LabelSyncPlaySettingsExtraTimeOffset": "Temps afegit de decalatge", - "LabelSortName": "Ordenar per nom", + "LabelSortName": "Ordena per nom", "LabelAutomaticallyAddToCollectionHelp": "Quan, com a mínim dues pel·lícules, tenen el mateix nom de col·lecció, seran afegides a la col·lecció.", - "LabelAutomaticallyAddToCollection": "Afegir a la col·lecció automàticament", + "LabelAutomaticallyAddToCollection": "Afegeix automàticament a una col·lecció", "Cursive": "Cursiva", "Console": "Terminal", "ThemeVideo": "Vídeo temàtic", - "ThemeSong": "Tema musical", + "ThemeSong": "Sintonia", "Sample": "Mostra", "Scene": "Escena", "Interview": "Entrevista", @@ -1592,56 +1592,56 @@ "Clip": "Clip", "AudioIsExternal": "El flux d'àudio és extern", "IntelLowPowerEncHelp": "La codificació de baixa potència pot mantenir la sincronització CPU-GPU innecessària. A Linux s'han de desactivar si el microprogramari i915 HuC no està configurat.", - "PreferSystemNativeHwDecoder": "Preferiu els descodificadors de maquinari DXVA o VA-API natius del SO", - "Typewriter": "Màquina d'escriure", + "PreferSystemNativeHwDecoder": "Prioritza els descodificadors de maquinari DXVA o VA-API natius del sistema operatiu", + "Typewriter": "Mecanogràfica", "TypeOptionPluralSeries": "Sèries", - "TypeOptionPluralBoxSet": "Col·leccions", + "TypeOptionPluralBoxSet": "Cofres", "TypeOptionPluralAudio": "Àudios", - "StoryArc": "Arc de la història", + "StoryArc": "Arc argumental", "ShowParentImages": "Mostra imatges de sèrie", "SetUsingLastTracksHelp": "Intenta configurar la pista de subtítols/àudio amb la coincidència més semblant a l'últim vídeo.", "SetUsingLastTracks": "Establiu pistes de subtítols/àudio amb l'element anterior", "Remixer": "Remesclador", "ReleaseGroup": "Grup de llançament", "Production": "Producció", - "AllowEmbeddedSubtitlesAllowTextOption": "Permetre text", - "AllowEmbeddedSubtitlesAllowImageOption": "Permetre imatge", - "AllowEmbeddedSubtitlesAllowNoneOption": "No permetre cap", - "AllowEmbeddedSubtitlesAllowAllOption": "Permetre tot", - "AllowEmbeddedSubtitlesHelp": "Desactiveu els subtítols empaquetats dins dels contenidors multimèdia. Requereix una actualització completa de la biblioteca.", - "AllowEmbeddedSubtitles": "Desactivar diferents tipus de subtítols incrustats", + "AllowEmbeddedSubtitlesAllowTextOption": "Permet text", + "AllowEmbeddedSubtitlesAllowImageOption": "Permet imatge", + "AllowEmbeddedSubtitlesAllowNoneOption": "No en permetis cap", + "AllowEmbeddedSubtitlesAllowAllOption": "Permet-ho tot", + "AllowEmbeddedSubtitlesHelp": "Deshabilita els subtítols empaquetats dins dels contenidors multimèdia. Requereix d'una actualització completa de la mediateca.", + "AllowEmbeddedSubtitles": "Deshabilita diferents tipus de subtítols incrustats", "OriginalAirDate": "Data d'emissió original", - "MixedMoviesShows": "Pel·lícules i sèries mixtes", - "MessageUnauthorizedUser": "No teniu autorització per accedir al servidor en aquest moment. Poseu-vos en contacte amb l'administrador del servidor per obtenir més informació.", + "MixedMoviesShows": "Pel·lícules i sèries barrejades", + "MessageUnauthorizedUser": "No teniu autorització per accedir en aquest moment al servidor. Per a més informació, poseu-vos en contacte amb l'administrador del servidor.", "Lyricist": "Lletrista", "Localization": "Localització", "Larger": "Més gran", - "LabelSyncPlaySettingsSkipToSyncHelp": "Mètode de correcció de sincronització que consisteix a buscar la posició estimada. La correcció de sincronització ha d'estar activada.", - "LabelSyncPlaySettingsSkipToSync": "Activar SkipToSync", - "LabelSyncPlaySettingsSpeedToSyncHelp": "Mètode de correcció de sincronització que consisteix a accelerar la reproducció. La correcció de sincronització ha d'estar activada.", - "LabelSyncPlaySettingsSpeedToSync": "Activar SpeedToSync", + "LabelSyncPlaySettingsSkipToSyncHelp": "Mètode de correcció de sincronització que consisteix a cercar la posició estimada. La correcció de sincronització ha d'estar activada.", + "LabelSyncPlaySettingsSkipToSync": "Habilita SkipToSync", + "LabelSyncPlaySettingsSpeedToSyncHelp": "Mètode de correcció de sincronització que consisteix a accelerar la reproducció. La correcció de sincronització ha d'estar habilitada.", + "LabelSyncPlaySettingsSpeedToSync": "Habilita SpeedToSync", "LabelSyncPlaySettingsMinDelaySkipToSyncHelp": "Retard mínim de reproducció (en ms) després del qual SkipToSync intenta corregir la posició de reproducció.", - "LabelSyncPlaySettingsMinDelaySkipToSync": "SkipToSync retard mínim", - "LabelSyncPlaySettingsSpeedToSyncDurationHelp": "Quantitat de mil·lisegons utilitzat per SpeedToSync per corregir la posició de reproducció.", - "LabelSyncPlaySettingsSpeedToSyncDuration": "SpeedToSync duració", + "LabelSyncPlaySettingsMinDelaySkipToSync": "Retard mínim de SkipToSync", + "LabelSyncPlaySettingsSpeedToSyncDurationHelp": "Quantitat de mil·lisegons utilitzat per SpeedToSync per a corregir la posició de reproducció.", + "LabelSyncPlaySettingsSpeedToSyncDuration": "Duració de SpeedToSync", "LabelSyncPlaySettingsMaxDelaySpeedToSyncHelp": "Retard màxim de reproducció (en ms) després del qual s'utilitza SkipToSync en lloc de SpeedToSync.", - "LabelSyncPlaySettingsMaxDelaySpeedToSync": "SpeedToSync retard màxim", - "LabelSyncPlaySettingsMinDelaySpeedToSyncHelp": "Retard de reproducció mínim (en ms) després del qual SpeedToSync intenta corregir la posició de reproducció.", - "LabelSyncPlaySettingsMinDelaySpeedToSync": "SpeedToSync retard mínim", - "LabelSyncPlaySettingsSyncCorrectionHelp": "Activar la sincronització activa de la reproducció accelerant els mitjans o cercant la posició estimada. Desactiveu-ho en cas de intermitències.", - "ItemDetails": "Detalls d'element", - "GoogleCastUnsupported": "Google Cast no suportat", - "EnableRewatchingNextUp": "Activar tornar a mirar a \"Següent\"", - "EnableRewatchingNextUpHelp": "Activar la mostra d'episodis ja vists a les seccions \"Següent\".", + "LabelSyncPlaySettingsMaxDelaySpeedToSync": "Retard màxim de SpeedToSync", + "LabelSyncPlaySettingsMinDelaySpeedToSyncHelp": "Retard mínim de reproducció (en ms) després del qual SpeedToSync intenta corregir la posició de reproducció.", + "LabelSyncPlaySettingsMinDelaySpeedToSync": "Retard mínim de SpeedToSync", + "LabelSyncPlaySettingsSyncCorrectionHelp": "Habilita la sincronització activa de la reproducció accelerant els continguts multimèdia o cercant la posició estimada. Desactiveu-ho en cas d'intermitències.", + "ItemDetails": "Detalls de l'element", + "GoogleCastUnsupported": "El Google Cast no és compatible", + "EnableRewatchingNextUp": "Habilita tornar a mirar", + "EnableRewatchingNextUpHelp": "Habilita la mostra d'episodis ja vists a les seccions \"Més\".", "Digital": "Digital", "CopyFailed": "No es pot copiar", - "Copy": "Copiar", + "Copy": "Copia", "Copied": "Copiat", "Conductor": "Conductor", "Casual": "Informal", "ButtonSpace": "Espai", - "ButtonExitApp": "Sortir de l'aplicació", - "ButtonClose": "Tancar", + "ButtonExitApp": "Tanca l'aplicació", + "ButtonClose": "Tanca", "ButtonBackspace": "Retrocés", "Arranger": "Arranjador", "AddToFavorites": "Afegeix a preferits", @@ -1650,27 +1650,27 @@ "Bold": "Negreta", "EnableCardLayout": "Mostra la CardBox visual", "HomeVideosPhotos": "Vídeos i fotos personals", - "IgnoreDts": "Ignora DTS (decodificar la marca de temps)", + "IgnoreDts": "Ignora DTS (descodificació de la marca de temps)", "IgnoreDtsHelp": "Desactivar aquesta opció pot resoldre alguns problemes. Per exemple, àudio absent a canals amb vídeo i àudio rebuts per separat.", - "LabelMaxVideoResolution": "Resolució màxima permesa en transcodificar vídeo", - "MessageNoFavoritesAvailable": "No hi han preferits disponibles actualment.", + "LabelMaxVideoResolution": "Resolució màxima permesa en transcodificar un vídeo", + "MessageNoFavoritesAvailable": "Actualment, no hi ha preferits disponibles.", "OptionDateEpisodeAdded": "Data d'addició de l'episodi", - "MessageNoItemsAvailable": "No hi han elements disponibles actualment.", - "MessageRenameMediaFolder": "Canviar de nom una llibreria causarà que es perdi tota la metadata, continua amb precaució.", - "LabelTextWeight": "Estil del text", - "RememberSubtitleSelections": "Establir la pista de subtítols en funció de l'element anterior", - "LabelVppTonemappingBrightnessHelp": "Aplicar el guany de brillantor al mapa de to VPP. El valor recomanat és 16.", - "MediaInfoRpuPresentFlag": "Flag DV rpu predeterminat", + "MessageNoItemsAvailable": "Actualment, no hi ha elements disponibles.", + "MessageRenameMediaFolder": "Canviar una mediateca de nom provocarà que es perdin totes les metadades, continueu amb precaució.", + "LabelTextWeight": "Estil de text", + "RememberSubtitleSelections": "Estableix la pista de subtítols en funció de l'element anterior", + "LabelVppTonemappingBrightnessHelp": "Aplica el guany de brillantor al mapatge de tons VPP. El valor recomanat és 16.", + "MediaInfoRpuPresentFlag": "Senyalització DV rpu predeterminada", "MediaInfoDvBlSignalCompatibilityId": "Identificador de compatibilitat del senyal DV bl", "Unreleased": "Encara no s'ha publicat", - "OptionDateShowAdded": "Data de la Sèrie afegida", - "RememberAudioSelectionsHelp": "Intentar establir la pista d'àudio amb la coincidència més semblant a l'últim vídeo.", - "RememberSubtitleSelectionsHelp": "Intentar configurar la pista de subtítols amb la coincidència més semblant a l'últim vídeo.", - "RememberAudioSelections": "Establir la pista d'àudio en funció de l'element anterior", + "OptionDateShowAdded": "Data d'addició de la sèrie", + "RememberAudioSelectionsHelp": "Intenta establir la pista d'àudio amb la coincidència més semblant a l'últim vídeo.", + "RememberSubtitleSelectionsHelp": "Intenta configurar la pista de subtítols amb la coincidència més semblant a l'últim vídeo.", + "RememberAudioSelections": "Estableix la pista d'àudio en funció de l'element anterior", "EnableEnhancedNvdecDecoderHelp": "Implementació millorada de NVDEC, desactiveu aquesta opció per a utilitzar CUVID si trobeu errors de descodificació.", - "LabelVppTonemappingBrightness": "Guany de brillantor del mapa de to VPP", - "LabelVppTonemappingContrast": "Guany de contrast de mapatge de to VPP", - "LabelVppTonemappingContrastHelp": "Aplicar el guany de contrast a l'assignació de to VPP. El valor recomanat és 1.", + "LabelVppTonemappingBrightness": "Guany de brillantor del mapatge de tons VPP", + "LabelVppTonemappingContrast": "Guany de contrast de mapatge de tons VPP", + "LabelVppTonemappingContrastHelp": "Aplica el guany de contrast al mapatge de tons VPP. El valor recomanat és 1.", "VideoRangeTypeNotSupported": "El tipus d'interval del vídeo no és compatible", "LabelVideoRangeType": "Tipus d'interval de vídeo", "MediaInfoVideoRangeType": "Tipus d'interval de vídeo", @@ -1679,12 +1679,12 @@ "MediaInfoDvVersionMinor": "Versió inferior DV", "MediaInfoDvProfile": "Perfil DV", "MediaInfoDvLevel": "Nivell DV", - "MediaInfoElPresentFlag": "Flag DV el predeterminat", - "MediaInfoBlPresentFlag": "Flag DV bl predeterminat", + "MediaInfoElPresentFlag": "Senyalització \"DV el\" predeterminada", + "MediaInfoBlPresentFlag": "Senyalització DV bl predeterminada", "Featurette": "Migmetratge", "Short": "Curt", "HeaderRecordingMetadataSaving": "Metadades de l'enregistrament", - "PreferEmbeddedExtrasTitlesOverFileNames": "Preferir els títols incrustats als noms d'arxiu per als extres", + "PreferEmbeddedExtrasTitlesOverFileNames": "Prioritza els títols inclosos en els noms de fitxers per als extres", "SecondarySubtitles": "Subtítols secundaris", "SubtitleBlack": "Negre", "SubtitleGray": "Gris", @@ -1694,19 +1694,19 @@ "HeaderDummyChapter": "Imatges dels capítols", "LabelDummyChapterCount": "Límit", "LabelDummyChapterDuration": "Interval", - "LabelDummyChapterDurationHelp": "L'interval entre capítols ficticis. Ajusta-ho a 0 per a desactivar la generació de capítols ficticis. Canviar-ho no afectarà els capítols ficticis existents.", + "LabelDummyChapterDurationHelp": "L'interval entre capítols ficticis en segons. Ajusteu-ho a 0 per a desactivar la generació de capítols ficticis. Canviar-ho no afectarà els capítols ficticis existents.", "LabelChapterImageResolution": "Resolució", - "LabelChapterImageResolutionHelp": "La resolució de les imatges del capítol extretes. Canviar-ho no afectarà els capítols ficticis existents.", - "ResolutionMatchSource": "Coincidir amb la font", - "SaveRecordingNFOHelp": "Desa les metadades del proveïdor de llistes EPG amb els mitjans.", + "LabelChapterImageResolutionHelp": "Resolució de les imatges extretes dels capítols. Canviar-ho no afectarà els capítols de proves existents.", + "ResolutionMatchSource": "La mateixa de la font", + "SaveRecordingNFOHelp": "Desa les metadades del proveïdor de llistats EPG amb els fitxers multimèdia.", "HeaderPerformance": "Rendiment", "LabelDummyChapterCountHelp": "El nombre màxim d'imatges del capítol que s'extreuran per a cada fitxer multimèdia.", - "LabelParallelImageEncodingLimit": "Límit de codificació paral·lela d'imatges", - "LabelParallelImageEncodingLimitHelp": "Número màxim de codificacions d'imatge que es poden executar en paral·lel. Si es deixa buit, es triarà un límit en funció del número de nuclis.", - "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Els extres sovint tenen el mateix nom incrustat que el principal, marqueu-ho per utilitzar-los títols incrustats de totes maneres.", + "LabelParallelImageEncodingLimit": "Límit de codificació d'imatges en paral·lel", + "LabelParallelImageEncodingLimitHelp": "Nombre màxim de codificacions d'imatge que es poden executar en paral·lel. Si es deixa buit, es triarà un límit en funció del nombre de nuclis.", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Els extres sovint tenen els mateixos noms dels títols als que pertanyen, marqueu-ho per fer-los servir de totes maneres.", "SaveRecordingNFO": "Desa les metadades EPG d'enregistrament a NFO", - "SaveRecordingImages": "Guarda les imatges d'enregistrament EPG", - "SaveRecordingImagesHelp": "Desa les imatges del proveïdor de llistes EPG amb els mitjans.", + "SaveRecordingImages": "Desa les imatges d'enregistrament EPG", + "SaveRecordingImagesHelp": "Desa les imatges del proveïdor de llistes EPG amb el contingut multimèdia.", "SubtitleBlue": "Blau", "SubtitleCyan": "Cian", "SubtitleGreen": "Verd", @@ -1714,184 +1714,184 @@ "SubtitleMagenta": "Magenta", "SubtitleRed": "Vermell", "SubtitleYellow": "Groc", - "StereoDownmixAlgorithmHelp": "Algoritme utilitzat per barrejar àudio multicanal a estèreo.", + "StereoDownmixAlgorithmHelp": "Algoritme fet servir per a barrejar l'àudio multicanal a estèreo.", "DownloadAll": "Descarrega-ho tot", - "LabelEnableAudioVbr": "Activar la codificació d'àudio VBR", - "LabelEnableAudioVbrHelp": "La taxa de bits variable ofereix una millor relació entre la qualitat i velocitat de bits mitjana, però en alguns casos rars pot provocar problemes de compatibilitat i de memòria intermèdia (buffering).", - "LabelTonemappingMode": "Mode de mapeig de to", + "LabelEnableAudioVbr": "Habilita la codificació d'àudio VBR", + "LabelEnableAudioVbrHelp": "La taxa variable de bits ofereix una millor relació entre la qualitat i velocitat mitjana de bits, però en alguns casos rars pot provocar problemes de compatibilitat i de memòria intermèdia.", + "LabelTonemappingMode": "Mode de mapatge de tons", "EnableAudioNormalization": "Normalització d'àudio", - "LabelEnableLUFSScan": "Activar escaneig LUFS", - "Select": "Seleccionar", - "LabelEnableLUFSScanHelp": "Els clients poden normalitzar la reproducció d'àudio per obtenir un nivell de volum igual entre totes les pistes d'àudio. Això farà que els escanejos de la biblioteca siguin més duraders i requereixin de més recursos.", - "TonemappingModeHelp": "Selecciona el mode de mapeig de to. Si experimentes zones sobreexposades, prova a canviar al mode RGB.", + "LabelEnableLUFSScan": "Habilita l'escaneig LUFS", + "Select": "Selecció", + "LabelEnableLUFSScanHelp": "Els clients poden normalitzar la reproducció d'àudio per obtenir un nivell de volum igual entre pistes d'àudio. Això farà que els escanejos de la mediateca s'allarguin més i els calgui més recursos.", + "TonemappingModeHelp": "Seleccioneu el mode de mapatge de tons. Si experimenteu zones sobreexposades, proveu a canviar al mode RGB.", "EnableAudioNormalizationHelp": "La normalització de l'àudio afegirà un guany constant per mantenir la mitjana al nivell desitjat (-18dB).", "GetThePlugin": "Obtenir el Plugin", - "MenuClose": "Tancar el menú", - "MenuOpen": "Obrir el menú", + "MenuClose": "Tanca el menú", + "MenuOpen": "Obre el menú", "Notifications": "Notificacions", "NotificationsMovedMessage": "Les funcions de notificacions s'han mogut al plugin Webhook.", "UserMenu": "Menú d'usuari", "AllowCollectionManagement": "Permet a aquest usuari gestionar col·leccions", "AllowSegmentDeletion": "Suprimeix segments", - "AllowSegmentDeletionHelp": "Suprimeix els segments antics després que el client els hagi descarregat. Això impedeix haver d'emmagatzemar tot el fitxer transcodificat al disc. Desactiveu-ho si teniu problemes de reproducció.", + "AllowSegmentDeletionHelp": "Suprimeix els segments antics després que el client els hagi descarregat. Això evita haver d'emmagatzemar tot el fitxer transcodificat al disc. Desactiveu-ho si teniu problemes de reproducció.", "LabelThrottleDelaySeconds": "Acceleració després de", - "LabelThrottleDelaySecondsHelp": "Temps en segons després del qual s'accelerarà el transcodificador. Ha de ser prou gran pel client per mantenir una memòria intermèdia saludable. Només funciona si s'habilita l'acceleració.", + "LabelThrottleDelaySecondsHelp": "Temps en segons, després del qual s'accelerarà el transcodificador. La durada ha de ser suficient per a que el client mantingui una memòria intermèdia saludable. Només funciona si l'acceleració està habilitada.", "LabelSegmentKeepSeconds": "Temps per mantenir els segments", "LabelIsHearingImpaired": "Per a persones amb discapacitat auditiva (SDH)", - "LogLevel.Warning": "Advertència", - "GoHome": "Anar a l'inici", + "LogLevel.Warning": "Avís", + "GoHome": "Ves a l'inici", "HearingImpairedShort": "HI/SDH", - "LabelBackdropScreensaverInterval": "Interval del Salvapantalles de Fons", - "LabelBackdropScreensaverIntervalHelp": "El temps en segons entre els diferents fons quan s'utilitza el salvapantalles de fons.", + "LabelBackdropScreensaverInterval": "Interval de l'estalvi de pantalla de fons", + "LabelBackdropScreensaverIntervalHelp": "El temps en segons entre els diferents fons quan s'utilitza l'estalvi de pantalla de fons.", "LabelSyncPlayNoGroups": "No hi ha grups disponibles", - "GridView": "Vista de Graella", - "BackdropScreensaver": "Salvapantalles de fons", - "ListView": "Vista de Llista", + "GridView": "Vista de graella", + "BackdropScreensaver": "Estalvis de pantalla de fons", + "ListView": "Vista de llista", "LogLevel.Critical": "Crític", "LogLevel.Information": "Informació", "LogLevel.Debug": "Depuració", - "LogoScreensaver": "Salvapantalles de Logo", + "LogoScreensaver": "Estalvi de pantalles del logotip", "LogLevel.None": "Cap", "HeaderEpisodesStatus": "Estat dels episodis", "LabelDate": "Data", "LabelDeveloper": "Desenvolupador", "LabelLevel": "Nivell", - "LabelMediaDetails": "Detalls dels mitjans", + "LabelMediaDetails": "Detalls del contingut multimèdia", "LogLevel.Trace": "Rastreig", - "SearchResultsEmpty": "Perdona! No s'han trobat resultats per \"{0}\"", + "SearchResultsEmpty": "Ups! No s'han trobat cap resultat per \"{0}\"", "Studio": "Estudi", "UnknownError": "S'ha produït un error desconegut.", - "PleaseConfirmRepositoryInstallation": "Si us plau, prémi OK per confirmar que heu llegit l'anterior i voleu continuar amb l'instal·lació del repositori de complements.", + "PleaseConfirmRepositoryInstallation": "Si us plau, pitgeu D'acord per confirmar que heu llegit el text anterior i desitgeu continuar amb la instal·lació del repositori de complements.", "Unknown": "Desconegut", "SelectAudioNormalizationHelp": "Guany de pista - ajusta el volum de cada pista perquè la reproducció soni al mateix volum. Guany d'àlbum - ajusta el volum de totes les pistes d'un àlbum, mantenint el rang dinàmic de l'àlbum. Canviant entre “Apagat” i altres opcions requereix reiniciar la reproducció actual.", - "HeaderConfirmRepositoryInstallation": "Confirmi l'instal·lació del repositori de complements", - "LabelAlbumGain": "Guany de l'Àlbum", - "LabelSelectAudioNormalization": "Normalització d'àudio", + "HeaderConfirmRepositoryInstallation": "Confirmeu la instal·lació del repositori de complements", + "LabelAlbumGain": "Guany de l'àlbum", + "LabelSelectAudioNormalization": "Normalització de l'àudio", "LabelSystem": "Sistema", "LogLevel.Error": "Error", - "MessageRepositoryInstallDisclaimer": "ADVERTÈNCIA: L'instal·lació d'un complement de tercers comporta riscos. Pot contenir còdi inestable o maliciós, i pot canviar en qualsevol moment. Només instal·li complements d'autors en els que confiï.", + "MessageRepositoryInstallDisclaimer": "AVÍS: La instal·lació d'un complement de tercers comporta riscos. Pot contenir codi inestable o maliciós, i pot canviar en qualsevol moment. Instal·leu només complements d'autors en els que confieu.", "PasswordRequiredForAdmin": "Es requereix una contrasenya pels comptes d'administrador.", "LabelTrackGain": "Guany de pista", - "AllowAv1Encoding": "Permetre l'encodificació en format AV1", + "AllowAv1Encoding": "Permet la codificació en format AV1", "LabelSegmentKeepSecondsHelp": "Temps en segons per aquells segments que s'han de mantenir després que el client els hagi descarregat. Només funciona si l'esborrat de segments està habilitat.", "AiTranslated": "Traduït per IA", - "MachineTranslated": "Traduït per Màquina", - "ForeignPartsOnly": "Només parts Forçades/Forànies", - "HeaderGuestCast": "Estrelles Convidades", + "MachineTranslated": "Traduït automàticament", + "ForeignPartsOnly": "Només parts forçades/foranes", + "HeaderGuestCast": "Estrelles convidades", "HeaderAllRecordings": "Tots els enregistraments", - "LabelServerVersion": "Versió del Servidor", - "LabelWebVersion": "Versió Web", - "ButtonEditUser": "Editar usuari", + "LabelServerVersion": "Versió del servidor", + "LabelWebVersion": "Versió web", + "ButtonEditUser": "Edita l'usuari", "ChannelResolutionSD": "SD", - "DeleteName": "Esborrar {0}", + "DeleteName": "Esborra {0}", "ChannelResolutionFullHD": "Full HD", - "LabelBuildVersion": "Versió de compilació", + "LabelBuildVersion": "Versió de la compilació", "LabelUseReplayGainTagsHelp": "Escaneja els fitxers d'àudio per trobar etiquetes ReplayGain i fes-les servir en lloc de calcular el valor LUFS. (Utilitza menys potència. Invalidarà l'opció 'Escaneig LUFS')", - "EnableVideoToolboxTonemapping": "Habilitar el mapatge de tons de VideoToolbox", + "EnableVideoToolboxTonemapping": "Habilita el mapatge de tons de VideoToolbox", "AllowVideoToolboxTonemappingHelp": "Acceleració per maquinari en el mapatge de tons per VideoToolbox. Funciona amb la majoria dels formats HDR, inclosos HDR10, HDR10+ i HLG, però no funciona amb Dolby Vision Profile 5. Això té una prioritat més alta en comparació amb una altra implementació de Metal.", "LabelUseReplayGainTags": "Utilitzar etiquetes ReplayGain", "ChannelResolutionSDPAL": "SD (PAL)", "ChannelResolutionHD": "HD", "DlnaMovedMessage": "La funcionalitat DLNA s'ha mogut a complements.", - "AllowSubtitleManagement": "Permetre a aquest usuari editar els subtítols", + "AllowSubtitleManagement": "Permet editar subtítols a aquest usuari", "ChannelResolutionUHD4K": "UHD (4K)", - "LabelTrickplayAccel": "Habilitar descodificació per maquinari", + "LabelTrickplayAccel": "Habilita la descodificació per maquinari", "NonBlockingScan": "Sense Bloqueig - generació de cues, després retorna", - "ConfirmDeleteSeries": "L'esborrat d'aquesta sèrie esborrarà TOTS {0} episodis tant del sistema de fitxers com de la teva biblioteca de mitjans. Estàs segur que vols continuar?", + "ConfirmDeleteSeries": "Eliminar aquesta sèrie eliminarà TOTS {0} episodis tant del sistema de fitxers com de la mediateca. N'esteu segur, que desitgeu continuar?", "LabelEncodingFormatOptions": "Opcions de format de codificació", "LabelTrickplayAccelHelp": "Assegura't d'habilitar 'Permetre codificació MJPEG' a Transcodificació si el teu maquinari ho suporta.", - "LabelWidthResolutions": "Resolucions d'Amplada", - "LabelScanBehaviorHelp": "El comportament predeterminat és sense blocatge, que afegirà mitjans a la biblioteca abans que la generació de trickplay es completi. El bloqueig assegura que els fitxers de trickplay es generin abans que els mitjans s'afegeixin a la biblioteca, però farà que l'escaneig sigui més llarg.", - "LabelProcessPriorityHelp": "Establint-ho més baix o més alt determinarà com el processador prioritza el procés de generació de trickplay ffmpeg en relació amb altres processos. Si observeu una ralentització mentre genereu imatges de trickplay, però no voleu aturar completament la seva generació, proveu de reduir-la així com el nombre de fils.", + "LabelWidthResolutions": "Resolucions d'amplada", + "LabelScanBehaviorHelp": "El comportament predeterminat és sense blocatge, cosa que afegirà contingut multimèdia a la mediateca abans que la generació de la previsualització es completi. El bloqueig assegura que els fitxers de previsualització es generin abans que el contingut multimèdia no s'afegeixi a la mediateca, però farà que l'escaneig sigui significativament més llarg.", + "LabelProcessPriorityHelp": "Configurant-ho més baix o més alt determinarà com el processador prioritza el procés de generació de previsualització ffmpeg en relació amb altres processos. Si observeu una ralentització mentre genereu imatges de previsualització, però no voleu aturar completament la seva generació, proveu de reduir-la així com el nombre de fils.", "AirPlay": "AirPlay", - "AllowContentWithTagsHelp": "Només mostrar mitjans, com a mínim, amb una etiqueta especificada.", - "BlockContentWithTagsHelp": "Amagar mitjans com a mínim amb una de les etiquetes especificades.", - "LabelAllowContentWithTags": "Permetre elements amb etiquetes", - "BlockingScan": "Bloqueig - generació de cues, bloqueja escaneig fins a completar-se", - "LabelScanBehavior": "Comportament d'Escaneig", - "PlaybackError.ASS_RENDER_ERROR": "S'ha produït un error al renderitzador de subtítols ASS/SSA.", - "PlaybackError.MEDIA_NOT_SUPPORTED": "La reproducció ha fallat, ja que el mitjà no és compatible amb aquest client.", + "AllowContentWithTagsHelp": "Mostra només el contingut multimèdia amb com a mínim alguna de les etiquetes especificades.", + "BlockContentWithTagsHelp": "Amaga el contingut multimèdia amb com a mínim una de les etiquetes especificades.", + "LabelAllowContentWithTags": "Permet elements amb etiquetes", + "BlockingScan": "Bloqueig - generació de cues, bloqueja l'escaneig fins a completar-se", + "LabelScanBehavior": "Comportament de l'escaneig", + "PlaybackError.ASS_RENDER_ERROR": "S'ha produït un error en el renderitzador de subtítols ASS/SSA.", + "PlaybackError.MEDIA_NOT_SUPPORTED": "La reproducció ha fallat, perquè el contingut multimèdia no és compatible amb aquest client.", "PlaybackError.NETWORK_ERROR": "La reproducció ha fallat a causa d'un error de connexió.", - "PlaybackError.NO_MEDIA_ERROR": "No s'ha pogut trobar un mitjà vàlid per a reproduir.", + "PlaybackError.NO_MEDIA_ERROR": "No s'ha pogut trobar un contingut multimèdia vàlid per a reproduir.", "PlaybackError.PLAYER_ERROR": "La reproducció ha fallat a causa d'un error fatal del reproductor.", "PlaybackError.SERVER_ERROR": "La reproducció ha fallat a causa d'un error del servidor.", - "PlaybackError.NotAllowed": "La reproducció d'aquest mitjà no està permesa.", - "Trickplay": "Trickplay", + "PlaybackError.NotAllowed": "La reproducció d'aquest contingut multimèdia no està permesa.", + "Trickplay": "Previsualització", "PriorityHigh": "Alta", - "EnableLibrary": "Habilitar la biblioteca", - "EnableLibraryHelp": "Deshabilitar la biblioteca l'amagarà per a tots els usuaris.", - "LimitSupportedVideoResolution": "Limitar la resolució màxima de vídeo suportada", - "LimitSupportedVideoResolutionHelp": "Utilitzi \"Resolució de transcodificació de vídeo màxima permesa\" com a resolució màxima permesa.", - "PlaybackError.FATAL_HLS_ERROR": "S'ha produït un error fatal al stream HLS.", - "PlaybackError.RateLimitExceeded": "Aquest mitjà no es pot reproduir en aquests instants deguts a límits de la xarxa.", - "EncodingFormatHelp": "Seleccioni la codificació de vídeo a la qual hauria de transcodificar Jellyfin. Jellyfin utilitzarà codificació mitjançant programari quan l'acceleració per maquinari no estigui disponible. La codificació H264 sempre estarà habilitada.", - "PriorityAboveNormal": "Per sobre del Normal", + "EnableLibrary": "Habilita la mediateca", + "EnableLibraryHelp": "Deshabilitar la mediateca l'amagarà per a tots els usuaris.", + "LimitSupportedVideoResolution": "Limita la resolució màxima de vídeos compatibles", + "LimitSupportedVideoResolutionHelp": "Fes servir \"La màxima resolució de transcodificació de vídeo permesa\" com a màxima resolució permesa.", + "PlaybackError.FATAL_HLS_ERROR": "S'ha produït un error fatal a l'stream HLS.", + "PlaybackError.RateLimitExceeded": "Aquest contingut multimèdia no es pot reproduir en aquests instants deguts a límits de transmissió.", + "EncodingFormatHelp": "Seleccioneu la codificació de vídeo a la qual hauria de transcodificar Jellyfin. Jellyfin farà servir codificació per programari quan l'acceleració per maquinari per al format seleccionat no estigui disponible. La codificació H264 sempre estarà habilitada.", + "PriorityAboveNormal": "Per sobre del normal", "PriorityNormal": "Normal", - "LabelImageIntervalHelp": "Interval de temps (ms) entre cada imatge nova de trickplay.", - "LabelWidthResolutionsHelp": "Llista separada per comes de les amplades (px) en què es generaran les imatges de trickplay. Totes les imatges s'han de generar proporcionalment a la font, de manera que una amplada de 320 en un vídeo 16:9 acaba al voltant de 320x180.", - "LabelTileWidth": "Amplada del Títol", + "LabelImageIntervalHelp": "Interval de temps (ms) entre cada imatge nova de previsualització.", + "LabelWidthResolutionsHelp": "Llista separada per comes de les amplades (px) en què es generaran les imatges de previsualització. Totes les imatges s'han de generar proporcionalment a la font, de manera que una amplada de 320 en un vídeo 16:9 acaba al voltant de 320x180.", + "LabelTileWidth": "Amplada del títol", "LabelTileWidthHelp": "Nombre màxim d'imatges per casella en la direcció X.", - "LabelTileHeight": "Alçada del Títol", + "LabelTileHeight": "Alçada del títol", "LabelTileHeightHelp": "Nombre màxim d'imatges per casella en la direcció Y.", "LabelJpegQuality": "Qualitat JPEG", - "LabelJpegQualityHelp": "Qualitat de compressió JPEG per a les imatges de trickplay.", + "LabelJpegQualityHelp": "Qualitat de compressió JPEG per a les imatges de previsualització.", "LabelQscale": "Qscale", - "OptionExtractTrickplayImage": "Habilitar extracció d'imatges de trickplay", - "LabelExtractTrickplayDuringLibraryScan": "Extreure imatges de trickplay durant l'escaneig de la biblioteca", - "LabelExtractTrickplayDuringLibraryScanHelp": "Generar imatges de trickplay quan els vídeos són importats durant l'escaneig de la biblioteca. D'altra banda, seran extrets durant la tasca programada d'imatges de trickplay. Si la generació està marcada com a sense bloqueig, això no afectarà el temps que triga a completar l'exploració de la biblioteca.", - "DeleteEntireSeries": "Esborrar {0} Episodis", - "DeleteSeries": "Esborrar Sèries", - "DeleteEpisode": "Esborrar Episodi", + "OptionExtractTrickplayImage": "Habilita l'extracció d'imatges de previsualització", + "LabelExtractTrickplayDuringLibraryScan": "Extreu imatges de previsualització durant l'escaneig de la mediateca", + "LabelExtractTrickplayDuringLibraryScanHelp": "Genera imatges de previsualització quan els vídeos són importats durant l'escaneig de la mediateca. D'altra banda, seran extrets durant la tasca programada d'imatges de previsualització. Si la generació està marcada com a sense bloqueig, això no afectarà el temps que triga a completar l'exploració de la mediateca.", + "DeleteEntireSeries": "Elimina {0} episodis", + "DeleteSeries": "Elimina la sèrie", + "DeleteEpisode": "Elimina l'episodi", "PriorityIdle": "Parada", - "LabelProcessPriority": "Prioritat de Processos", - "LabelTrickplayThreadsHelp": "Nombre de fils a passar a l'argument de ffmpleg '-threads'.", + "LabelProcessPriority": "Prioritat de processos", + "LabelTrickplayThreadsHelp": "El nombre de fils per a passar a l'argument '-threads' de ffmpleg.", "Lyric": "Lletra", - "EnableSmoothScroll": "Habilitar desplaçament suau", - "HeaderDeleteSeries": "Esborrar Sèries", + "EnableSmoothScroll": "Habilita el desplaçament suau", + "HeaderDeleteSeries": "Elimina la sèrie", "PlaybackError.MEDIA_DECODE_ERROR": "La reproducció ha fallat a causa d'un error en descodificar el contingut.", "AllowMjpegEncoding": "Permetre codificació en format MJPEG (utilitzat durant la generació de trickplay)", - "PriorityBelowNormal": "Per sota del Normal", - "LabelImageInterval": "Interval d'Imatges", + "PriorityBelowNormal": "Per sota del normal", + "LabelImageInterval": "Interval d'imatges", "LabelQscaleHelp": "Escala de qualitat de les imatges generades per ffmpeg, sent 2 la qualitat més alta i 31 la més baixa.", "LabelTrickplayThreads": "Fils de FFmpeg", - "ExtractTrickplayImagesHelp": "Les imatges de Trickplay són similars a les imatges de capítols, excepte que abasten tota la longitud del contingut i s'utilitzen per mostrar una vista prèvia quan es desplaça pels vídeos.", + "ExtractTrickplayImagesHelp": "Les imatges de previsualització són similars a les imatges de capítols, excepte que abasten tota la longitud del contingut i s'utilitzen per mostrar una vista prèvia en moure's pels vídeos.", "LabelTrickplayAccelEncodingHelp": "En aquests moments només està disponible en QSV, VAAPI, VideoToolbox i RKMPP, aquesta opció no afecta els altres mètodes d'acceleració per maquinari.", - "LabelTrickplayAccelEncoding": "Habilitar codificació MJPEG accelerada per maquinari", - "ConfirmDeleteLyrics": "L'esborrat d'aquestes lletres, les suprimirà tant del sistema de fitxers com de la vostra biblioteca multimèdia. Esteu segur que voleu continuar?", + "LabelTrickplayAccelEncoding": "Habilita la codificació MJPEG accelerada per maquinari", + "ConfirmDeleteLyrics": "L'esborrat d'aquestes lletres, les suprimirà tant del sistema de fitxers com de la vostra mediateca. N'esteu segur, que desitgeu continuar?", "ErrorDeletingLyrics": "S'ha produït un error en suprimir les lletres del servidor. Si us plau, comproveu que Jellyfin tingui accés d'escriptura a la carpeta multimèdia i torneu-ho a provar.", - "HeaderDeleteLyrics": "Esborrar Lletres", - "DeleteLyrics": "Esborrar lletres", + "HeaderDeleteLyrics": "Elimina la lletra", + "DeleteLyrics": "Elimina les lletres", "HeaderNoLyrics": "No s'ha trobat cap lletra", "Lyrics": "Lletres", - "ViewLyrics": "Veure lletres", - "SavePassword": "Desar contrasenya", - "EnableDts": "Habilitar DTS (DCA)", - "PlaylistError.AddFailed": "S'ha produït un error en afegir a la llista de reproducció", + "ViewLyrics": "Mostra les lletres", + "SavePassword": "Desa la contrasenya", + "EnableDts": "Habilita DTS (DCA)", + "PlaylistError.AddFailed": "S'ha produït un error en agregar a la llista de reproducció", "PlaylistError.CreateFailed": "S'ha produït un error en crear la llista de reproducció", - "HeaderVideoAdvanced": "Vídeo Avançat", + "HeaderVideoAdvanced": "Vídeo avançat", "Author": "Autor", "Colorist": "Colorista", - "CoverArtist": "Artista de portada", + "CoverArtist": "Artista de la portada", "Creator": "Creador", "Editor": "Editor", "EnableDtsHelp": "Habiliteu-lo només si el vostre dispositiu és compatible amb DTS o està connectat a un receptor d'àudio compatible, en cas contrari, pot provocar un error de reproducció.", - "EnableTrueHd": "Habilitar TrueHD", - "EnableTrueHdHelp": "Habiliteu-lo només si el vostre dispositiu és compatible amb TrueHD o està connectat a un receptor d'àudio compatible, en cas contrari, pot provocar un error de reproducció.", + "EnableTrueHd": "Habilita TrueHD", + "EnableTrueHdHelp": "Habiliteu-ho només si el vostre dispositiu és compatible amb TrueHD o està connectat a un receptor d'àudio compatible, en cas contrari, pot provocar un error de reproducció.", "Illustrator": "Il·lustrador", "Translator": "Traductor", - "PlaylistPublic": "Permetre accés públic", - "PlaylistPublicDescription": "Permetre que qualsevol usuari registrat vegi aquesta llista de reproducció.", + "PlaylistPublic": "Permet l'accés públic", + "PlaylistPublicDescription": "Permet que aquesta llista de reproducció sigui vista per qualsevol usuari registrat.", "HeaderLyricDownloads": "Descàrregues de lletres", - "SaveLyricsIntoMediaFolders": "Desa la lletra a les carpetes multimèdia", - "SaveLyricsIntoMediaFoldersHelp": "Emmagatzemar les lletres al costat dels fitxers d'àudio permetrà gestionar-les més fàcilment.", + "SaveLyricsIntoMediaFolders": "Desa les lletres al directoris multimèdia", + "SaveLyricsIntoMediaFoldersHelp": "Emmagatzemar les lletres amb els fitxers d'àudio permetrà gestionar-les més fàcilment.", "LabelSelectPreferredTranscodeVideoAudioCodec": "Còdec d'àudio de transcodificació preferit en la reproducció de vídeo", - "LibraryScanFanoutConcurrencyHelp": "Nombre màxim de tasques paral·leles durant les exploracions de la biblioteca. Si es deixa buit, es triarà un límit basat en el nombre de nuclis del vostre sistema. ADVERTÈNCIA: establir aquest número massa alt pot causar problemes amb els sistemes de fitxers de xarxa; si trobeu problemes, baixeu aquest número.", - "SelectPreferredTranscodeVideoAudioCodecHelp": "Seleccioneu el còdec d'àudio preferit per transcodificar per al contingut de vídeo. Si el còdec preferit no és compatible, el servidor utilitzarà el següent millor còdec disponible.", - "LibraryScanFanoutConcurrency": "Límit de tasques d'exploració paral·leles per a les biblioteques", + "LibraryScanFanoutConcurrencyHelp": "Nombre màxim de tasques paral·leles durant les exploracions de la mediateca. Si es deixa buit, es triarà un límit basat en el nombre de nuclis del vostre sistema. AVÍS: establir aquest número massa alt pot causar problemes amb els sistemes de fitxers de xarxa; si us dona problemes, abaixeu aquest número.", + "SelectPreferredTranscodeVideoAudioCodecHelp": "Seleccioneu el còdec d'àudio preferit per a transcodificar per al contingut de vídeo. Si el còdec preferit no és compatible, el servidor utilitzarà el següent millor còdec disponible.", + "LibraryScanFanoutConcurrency": "Límit de tasques d'exploració paral·leles per a les mediateques", "Penciller": "Dibuixant", - "Inker": "Tintador", - "Letterer": "Retolador", - "Alternate": "Alternar", + "Inker": "Entintador", + "Letterer": "Retolista", + "Alternate": "Alterna", "AlternateDVD": "DVD alternatiu", "Regional": "Regional", "HeaderNextItemPlayingInValue": "Següent {0} Reproduint a {1}", @@ -1901,124 +1901,165 @@ "LabelNotInstalled": "No instal·lat", "PluginDisableError": "S'ha produït un error en deshabilitar el complement.", "PluginEnableError": "S'ha produït un error en habilitar el complement.", - "LabelEnablePlugin": "Habilitar complement", + "LabelEnablePlugin": "Habilita el complement", "LabelInstalled": "Instal·lat", "LabelNoChangelog": "No s'ha proporcionat cap registre de canvis per a aquesta versió.", "LabelRepository": "Repositori", "PluginLoadConfigError": "S'ha produït un error en obtenir les pàgines de configuració del complement.", "PluginLoadRepoError": "S'ha produït un error en obtenir els detalls del repositori del complement.", "PluginUninstallError": "S'ha produït un error en desinstal·lar el complement.", - "SelectPreferredTranscodeVideoCodecHelp": "Seleccioneu el còdec de vídeo preferit per transcodificar. Si el còdec preferit no és compatible, el servidor utilitzarà el següent millor còdec disponible.", + "SelectPreferredTranscodeVideoCodecHelp": "Seleccioneu el còdec de vídeo preferit per a transcodificar. Si el còdec preferit no és compatible, el servidor utilitzarà el següent millor còdec disponible.", "PasswordMissingSaveError": "La nova contrasenya no pot ser buida.", - "PreviewLyrics": "Previsualitzar lletres", - "Reset": "Restablir", + "PreviewLyrics": "Previsualitza lletres", + "Reset": "Restableix", "MediaInfoRotation": "Rotació", - "MoveToBottom": "Moure al final", - "MoveToTop": "Moure al principi", - "EditLyrics": "Editar lletres", - "HeaderAddLyrics": "Afegir lletres", - "HeaderPreviewLyrics": "Previsualitzar lletres", - "HeaderUploadLyrics": "Pujar lletres", + "MoveToBottom": "Mou al fons", + "MoveToTop": "Mou al cim", + "EditLyrics": "Edició de la lletra", + "HeaderAddLyrics": "Afegeix lletres", + "HeaderPreviewLyrics": "Previsualitza lletres", + "HeaderUploadLyrics": "Pujada de lletres", "LabelIsSynced": "Està sincronitzat", "NoLyricsSearchResultsFound": "No s'han trobat lletres.", - "SearchForLyrics": "Cercar lletres", - "LibraryInvalidItemIdError": "La biblioteca està en un estat invàlid, i no es pot editar. És possible que hagis trobat un error: el camí de la base de dades no és un camí correcte al sistema de fitxers.", - "LabelTrickplayKeyFrameOnlyExtraction": "Només generar imatges en fotogrames clau", - "LabelTrickplayKeyFrameOnlyExtractionHelp": "Només extreure fotogrames clau per a un processament significativament més ràpid amb una sincronització menys precisa. Si el descodificador de maquinari configurat no admet aquest mode, en el seu lloc s'utilitzarà el descodificador per programari.", + "SearchForLyrics": "Cerca lletres", + "LibraryInvalidItemIdError": "La mediateca es troba en un estat no vàlid, i no es pot editar. És possible que hàgiu trobat un error: la ruta de la base de dades no és una ruta correcta en el sistema de fitxers.", + "LabelTrickplayKeyFrameOnlyExtraction": "Només genera imatges dels fotogrames clau", + "LabelTrickplayKeyFrameOnlyExtractionHelp": "Extreu només els fotogrames clau per a un processament significativament més ràpid amb una sincronització menys precisa. Si el descodificador configurat de maquinari no admet aquest mode, en el seu lloc es farà servir el descodificador per programari.", "AllowTonemappingSoftwareHelp": "El mapatge de tons pot transformar el rang dinàmic d'un vídeo d'HDR a SDR mantenint els detalls i els colors de la imatge, que són informació molt important per representar l'escena original. Actualment, només funciona amb vídeos HDR10, HLG i DoVi de 10 bits.", "LabelDuration": "Duració", - "LabelDropLyricsHere": "Arrossega i deixa anar les lletres aquí, o fes clic aquí per cercar-les.", - "AllowFmp4TranscodingContainerHelp": "Permet el contenidor de transcodificació fMP4 per a aquest sintonintzador, activar continguts HEVC i HDR. No tots els sintonitzadors són compatibles amb aquest contenidor. Desactiva-ho si experimentes problemes de reproducció.", - "AllowStreamSharingHelp": "Permet que Jellyfin dupliqui el flux mpegts del sintonitzador i comparteixi aquest flux duplicat amb els seus clients. Això és útil quan el sintonitzador té un límit de recompte total de reproduccions, però també pot causar problemes de reproducció.", - "LabelCustomTagDelimiters": "Limitador d'etiquetes personalitzat", + "LabelDropLyricsHere": "Arrossega i deixa-hi anar les lletres, o clica-hi per a cercar-les.", + "AllowFmp4TranscodingContainerHelp": "Permet el contenidor de transcodificació fMP4 per a aquest sintonitzador, per habilitar continguts HEVC i HDR. No tots els sintonitzadors són compatibles amb aquest contenidor. Desactiveu-ho si experimenteu problemes de reproducció.", + "AllowStreamSharingHelp": "Permet que Jellyfin dupliqui el flux mpegts del sintonitzador i comparteixi aquest flux duplicat amb els seus clients. Això és útil quan el sintonitzador té un límit en la quantitat total de reproduccions, però també pot causar problemes de reproducció.", + "LabelCustomTagDelimiters": "Limitador personalitzat d'etiquetes", "Anime": "Anime", "DisableVbrAudioEncodingHelp": "Evita que el servidor codifiqui àudio en VBR per a aquest client.", - "EnableHi10p": "Activar perfil H.264 High 10", - "HeaderEditPlaylist": "Edita la llista de reproducció", + "EnableHi10p": "Habilita el perfil H.264 High 10", + "HeaderEditPlaylist": "Edició de la llista de reproducció", "HeaderNewPlaylist": "Llista de reproducció nova", - "AlwaysRemuxFlacAudioFilesHelp": "Si el teu navegador rebutja reproduir certs arxius o calcula les marques de temps de manera imprecisa, activa això com a solució alternativa.", + "AlwaysRemuxFlacAudioFilesHelp": "Si el vostre navegador rebutja reproduir certs arxius o calcula les marques de temps de manera imprecisa, activeu això com a solució alternativa.", "AlwaysRemuxMp3AudioFilesHelp": "Si el teu navegador calcula les marques de temps de certs arxius de manera imprecisa, activa això com a solució alternativa.", - "EnableHi10pHelp": "Activar per evitar transcodificació de vídeos en H.264 10-bits. Desactivar-ho si la reproducció del vídeo mostra fotogrames buits.", + "EnableHi10pHelp": "Habilita per a evitar la transcodificació de vídeos en H.264 10-bits. Deshabiliteu-ho si la reproducció del vídeo mostra fotogrames buits.", "DateModified": "Data de modificació", "HeaderAudioAdvanced": "Àudio avançat", "LabelAllowFmp4TranscodingContainer": "Permet el contenidor de transcodificació fMP4", "LabelAudioTagSettings": "Configuració de les etiquetes d'àudio", - "LabelCustomTagDelimitersHelp": "Caràcters que es consideraran delimitadors per separar etiquetes.", + "LabelCustomTagDelimitersHelp": "Caràcters que es consideraran delimitadors per a separar etiquetes.", "LabelQsvDevice": "Dispositiu QSV", "MediaSegmentAction.None": "Cap", - "MediaSegmentAction.Skip": "Saltar", + "MediaSegmentAction.Skip": "Salta", "MediaSegmentType.Intro": "Introducció", "LabelDelimiterWhitelist": "Llista blanca de delimitadors", "LabelDelimiterWhitelistHelp": "Elements a excloure de la divisió d'etiquetes. Un element per línia.", - "LabelDisableVbrAudioEncoding": "Desactivar codificació d'àudio VBR", - "LabelFallbackMaxStreamingBitrate": "Taxa de bitrate màxima de retorn (Mbps)", + "LabelDisableVbrAudioEncoding": "Desactiva la codificació d'àudio VBR", + "LabelFallbackMaxStreamingBitrate": "Velocitat de bits màxima de retorn (Mbps)", "MessageCancelSeriesTimerError": "S'ha produït un error cancel·lant el temporitzador de la sèrie", "MessageCancelTimerError": "S'ha produït un error cancel·lant el temporitzador", - "MoviesAndShows": "Pel·lícules i Sèries", + "MoviesAndShows": "Pel·lícules i sèries", "LabelLyricDownloaders": "Descarregador de lletres", - "LabelQsvDeviceHelp": "Específica el dispositiu Intel QSV en els sistemes amb múltiples GPU. En sistemes Linux, això és un node de renderitzat, per exemple, /dev/dri/renderD128. En Windows, és un índex de dispositiu que comença a 0. Deixar en blanc si no se sap el que s'està fent.", + "LabelQsvDeviceHelp": "Específica el dispositiu Intel QSV en els sistemes amb múltiples GPU. En sistemes Linux, això és un node de renderitzat, per exemple, /dev/dri/renderD128. En Windows, és un índex de dispositiu que comença al 0. Deixeu-ho en blanc, llevat que sapigueu què esteu fent.", "LabelScreensaverTime": "Temps de l'estalvi de pantalla", - "LabelScreensaverTimeHelp": "La quantitat de temps d'inactivitat en segons necessària per activar l'estalvi de pantalla.", - "MediaSegmentAction.AskToSkip": "Solicitar saltar", - "MediaSegmentSkipPrompt": "Saltar {0}", + "LabelScreensaverTimeHelp": "La quantitat de temps, en segons d'inactivitat, necessària per activar l'estalvi de pantalla.", + "MediaSegmentAction.AskToSkip": "Sol·licita saltar", + "MediaSegmentSkipPrompt": "Salta {0}", "MediaSegmentType.Commercial": "Comercial", "MediaSegmentType.Recap": "Recapitulació", - "MediaSegmentType.Outro": "Tancament", + "MediaSegmentType.Outro": "Crèdits", "MediaSegmentType.Preview": "Previsualització", - "PlaylistError.UpdateFailed": "Error en actualitzar la llista de reproducció", + "PlaylistError.UpdateFailed": "S'ha produït un error en actualitzar la llista de reproducció", "LabelAlwaysRemuxFlacAudioFiles": "Sempre re-multiplexa els fitxers d'àudio FLAC", "LabelAlwaysRemuxMp3AudioFiles": "Sempre re-multiplexa els fitxers d'àudio MP3", - "LabelSaveTrickplayLocally": "Desar imatges de trucs al costat dels mitjans", - "LabelSaveTrickplayLocallyHelp": "Desar les imatges dels trucs dins de les carpetes dels mitjans les posarà al costat d'aquests per facilitar l'accés i la migració.", - "LyricDownloadersHelp": "Activa i classifica els descarregadors de lletres preferits en ordre de prioritat.", - "MessageSplitVersionsError": "S'ha produït un error separant les versions", + "LabelSaveTrickplayLocally": "Desa les imatges de previsualització junt amb els continguts multimèdia", + "LabelSaveTrickplayLocallyHelp": "Desant les imatges de previsualització als directoris multimèdia, quedaran junt amb els continguts multimèdia per a més fàcil migració i accés.", + "LyricDownloadersHelp": "Habilita i classifica en ordre de prioritat els descarregadors de lletres preferits.", + "MessageSplitVersionsError": "S'ha produït un error en separar les versions", "LabelAllowStreamSharing": "Permet la reproducció compartida", - "AlwaysBurnInSubtitleWhenTranscoding": "Sempre gravar els subtítols al transcodificar", - "AlwaysBurnInSubtitleWhenTranscodingHelp": "Gravar tots els subtítols quan la transcodificació s'activi. Això assegura la sincronització dels subtítols després de la transcodificació, a canvi d'una menor velocitat de transcodificació.", - "HeaderMediaSegmentActions": "Accions dels segments dels mitjans", + "AlwaysBurnInSubtitleWhenTranscoding": "En transcodificar, incrusta sempre els subtítols", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Incorpora tots els subtítols quan s'activi la transcodificació. Això assegura la sincronització dels subtítols després de la transcodificació, a canvi d'una menor velocitat de transcodificació.", + "HeaderMediaSegmentActions": "Accions dels segments de continguts multimèdia", "LabelMediaSegmentsType": "{0} Segments", - "PreferNonstandardArtistsTag": "Preferir l'etiqueta ARTISTS si estan disponibles", - "ReplaceTrickplayImages": "Substitueix les imatges trickplay existents", - "UseCustomTagDelimiters": "Utilitza delimitador d'etiquetes personalitzat", - "PreferNonstandardArtistsTagHelp": "Utilitza l'etiqueta no estàndard ARTISTS en lloc de l'etiqueta ARTIST quan estigui disponible.", - "UseCustomTagDelimitersHelp": "Separa les etiquetes artista/gènere amb caràcters personalitzats.", - "RenderPgsSubtitle": "Renderitzat experimental de subtitols PGS", + "PreferNonstandardArtistsTag": "Prioritza l'etiqueta ARTISTS si es troba disponible", + "ReplaceTrickplayImages": "Substitueix les imatges de previsualització existents", + "UseCustomTagDelimiters": "Fes servir un delimitador personalitzat d'etiquetes", + "PreferNonstandardArtistsTagHelp": "Fes servir l'etiqueta no estàndard ARTISTS en lloc de l'etiqueta ARTIST quan estigui disponible.", + "UseCustomTagDelimitersHelp": "Separa les etiquetes d'artista/gènere amb caràcters personalitzats.", + "RenderPgsSubtitle": "Renderitzat experimental de subtítols PGS", "VideoCodecTagNotSupported": "L'etiqueta del còdec de vídeo no és compatible", - "RenderPgsSubtitleHelp": "Determina si el client ha de renderitzar els subtítols PGS en lloc d'usar els subtítols incrustats. Això pot evitar la transcodificació de part del servidor a canvi del rendiment de renderitzat de part del client.", - "FallbackMaxStreamingBitrateHelp": "El bitrate màxim s'usa com a alternativa quan ffprobe no pot determinar el flux de l'origen. Això ajuda a prevenir que els clients sol·licitin un bitrate de transcodificació excessivament alt, el qual provocaria errors en el reproductor o sobrecarregar el codificador.", - "HeaderNextEpisode": "Pròxim Episodi", - "HeaderNextVideo": "Pròxim Vídeo", - "LabelMediaSegmentProviders": "Proveïdors de segments de mitjans", - "MediaSegmentProvidersHelp": "Activa i classifica els teus segments de mitjans preferits en ordre de prioritat.", - "AutoSubtitleStylingHelp": "Aquest mode canviarà automàticament entre els mecanismes d'estils de subtítols natius i personalitzats, basant-se en el teu tipus de dispositiu.", + "RenderPgsSubtitleHelp": "Determina si el client ha de renderitzar els subtítols PGS en lloc de fer servir els subtítols incrustats. Això pot evitar la transcodificació de part del servidor a canvi del rendiment de renderitzat de part del client.", + "FallbackMaxStreamingBitrateHelp": "La transmissió màxima de bits s'usa com a alternativa quan ffprobe no pot determinar el flux de l'origen. Això ajuda a prevenir que els clients sol·licitin un bitrate de transcodificació excessivament alt, el qual provocaria errors en el reproductor o sobrecarregaria el codificador.", + "HeaderNextEpisode": "Episodi següent", + "HeaderNextVideo": "Vídeo següent", + "LabelMediaSegmentProviders": "Proveïdors de segments de continguts multimèdia", + "MediaSegmentProvidersHelp": "Habiliteu i classifiqueu per ordre de prioritat els vostres proveïdors preferits de segments multimèdia.", + "AutoSubtitleStylingHelp": "Aquest mode canviarà automàticament entre els mecanismes d'estils de subtítols natius i personalitzats, basant-se en el vostre tipus de dispositiu.", "Custom": "Personalitzat", "CustomSubtitleStylingHelp": "L'estilització de subtítols funciona en la majoria dels dispositius, però suposa un cost addicional de rendiment.", "LabelSubtitleStyling": "Estilització de subtítols", "Native": "Nadiu", - "NativeSubtitleStylingHelp": "L'estilització de subtítols no funcionarà en alguns dispositius. Tot i això, no suposa cap sobrecàrrega de rendiment.", - "LibraryNameInvalid": "El nom de la biblioteca no pot estar buit.", - "DeleteServerConfirmation": "De veritat vols eliminar aquest servidor?", + "NativeSubtitleStylingHelp": "L'estilització dels subtítols no funcionarà en alguns dispositius. Tot i això, no suposa cap sobrecàrrega de rendiment.", + "LibraryNameInvalid": "El nom de la mediateca no pot estar buit.", + "DeleteServerConfirmation": "N'esteu segur, que voleu eliminar aquest servidor?", "LabelDevice": "Dispositiu", "LastActive": "Últim actiu", "CopyLogSuccess": "Registres copiats satisfactòriament.", - "Retry": "Tronar a provar", - "LogLoadFailure": "Error al carregar el registre. És probable que encara s'estigui escrivint en ell.", + "Retry": "Torna a provar-ho", + "LogLoadFailure": "S'ha produït un error en carregar el registre. És probable que encara s'hi estigui escrivint.", "MetadataNfoLoadError": "No s'han pogut carregar les configuracions de metadades NFO", - "SettingsPageLoadError": "No s'ha pogut carregar la pàgina de configuracions", + "SettingsPageLoadError": "No s'ha pogut carregar la pàgina de configuració", "DisplayLoadError": "S'ha produït un error en carregar les dades de configuració de la pantalla.", "HeaderPageNotFound": "Pàgina no trobada", - "PageNotFound": "Aquesta no és la pàgina que estàs buscant.", + "PageNotFound": "Aquesta no és la pàgina que esteu cercant.", "MetadataImagesLoadError": "No s'han pogut carregar les configuracions de metadades", - "StreamCountExceedsLimit": "El número de flux excedeix el límit", - "RetryWithGlobalSearch": "Reintentar amb una cerca global", - "LabelGroupShowsIntoCollections": "Agrupar sèries en col·leccions", + "StreamCountExceedsLimit": "El nombre de fluxos excedeix el límit", + "RetryWithGlobalSearch": "Reintenta amb una cerca global", + "LabelGroupShowsIntoCollections": "Agrupa sèries en col·leccions", "LabelGroupShowsIntoCollectionsHelp": "Les sèries que estiguin dins d'una col·lecció es mostraran com un únic element agrupat quan es mostrin les llistes de sèries.", "CustomSplashScreenSize": "Les imatges personalitzades haurien de ser en 16x9 de ràtio d'aspecte i a una mida mínima de 1920x1080.", - "DeleteCustomImage": "Eliminar Imatge Personalitzada", - "ImageDeleteFailed": "Eliminació de la imatge fallida", + "DeleteCustomImage": "Elimina la imatge personalitzada", + "ImageDeleteFailed": "No s'ha pogut eliminar la imatge", "ImageUploadCancelled": "Pujada d'imatge cancel·lada", - "ImageUploadFailed": "Pujada d'imatge fallida", + "ImageUploadFailed": "No s'ha pogut carregar la imatge", "UploadCustomImage": "Pujar imatge personalitzada", - "ReadInputAtNativeFramerate": "Llegeix l'origen a la velocitat de fotogrames nativa", - "ReadInputAtNativeFramerateHelp": "Activant aquesta opció pot solucionar alguns problemes, p. ex. retransmissions en directe que es paren sobtadament." + "ReadInputAtNativeFramerate": "Fes servir la velocitat original de fotogrames", + "ReadInputAtNativeFramerateHelp": "Habilitar aquesta opció pot solucionar alguns problemes, p. ex. retransmissions en directe que s'aturen sobtadament.", + "LimitSegmentLength": "Fes servir els segments HLS més curts", + "LimitSegmentLengthHelp": "Activar aquesta opció pot ajudar a prevenir que el reproductor HLS es pengi durant la cerca en alguns dispositius, com televisors webOS.", + "HeaderServerUnavailable": "El servidor no està disponible", + "HeaderUpdateRequired": "Cal una actualització", + "ViewSettings": "Configuració de visualització", + "DownloadManager": "Descàrregues", + "MessageForgotPasswordPinReset": "Introduïu el PIN aquí per a concloure el restabliment de la contrasenya", + "LabelImageCache": "Imatges a la memòria cau", + "MessageBackupDisclaimer": "Depenent de la mida de la mediateca, la còpia de seguretat pot trigar una estona.", + "MessageRestoreDisclaimer": "ATENCIÓ: Esteu a punt de restaurar una còpia anterior de seguretat. El servidor no es podrà fer servir durant el procés i les dades creades des del moment de l'inici de la còpia es perdran.", + "MessageWaitingForServer": "S'està esperant el servidor...", + "StorageType.CDRom": "CD-ROM", + "StorageType.NoRootDirectory": "Cap directori arrel", + "BackupsPageLoadError": "No s'ha pogut carregar la pàgina de còpies de seguretat", + "ButtonCreateBackup": "Crea una còpia de seguretat", + "Create": "Crea", + "HeaderBackupsHelp": "Crea i restaura còpies del servidor, les quals poden incloure la base de dades, metadades, subtítols i imatges de previsualització.", + "LabelBackupsUnavailable": "No hi ha còpies de seguretat disponibles", + "LabelDatabase": "Base de dades", + "LabelRestore": "Restaura", + "MessageBackupInProgress": "Còpia de seguretat en progrés", + "MessageRestoreInProgress": "Restauració en procés", + "Success": "Èxit", + "HeaderBackups": "Còpies de seguretat", + "LabelProgramData": "Dades del programa", + "MessageRestoreSuccess": "Restauració completada exitosament", + "StorageType.Fixed": "Arreglat", + "StorageType.Network": "Xarxa", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Extraïble", + "StorageType.Unknown": "Desconegut", + "PluginsLoadError": "S'ha produït un error en carregar els complements.", + "ButtonLearnMore": "Saber més", + "RepositoriesPageLoadError": "No s'han pogut carregar els repositoris", + "TranscodingLoadError": "No s'han pogut carregar els paràmetres de transcodificació", + "ConfirmDeleteRepository": "Desitgeu eliminar el repositori?", + "DeleteRepositoryConfirmation": "N'esteu segur, de voler esborrar aquest repositori?", + "LiveTVPageLoadError": "La càrrega de la pàgina de gravacions ha fallat", + "ConnectAnyway": "Connecta de totes maneres", + "HeaderServerMismatch": "Discrepància amb el servidor", + "MessageServerMismatch": "El servidor al qual us esteu connectant no és el mateix servidor al qual us vau connectar anteriorment amb aquesta adreça. Si ja s'esperava això, seleccioneu \"Connecta igualment\". En cas contrari, la vostra connexió o el servidor podrien estar compromesos." } diff --git a/src/strings/cs.json b/src/strings/cs.json index 2bbe2a6af..0b8d3ccc8 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -56,7 +56,7 @@ "ButtonParentalControl": "Rodičovská kontrola", "ButtonPause": "Pozastavit", "ButtonPreviousTrack": "Předchozí stopa", - "ButtonQuickStartGuide": "Rychlý průvodce", + "ButtonQuickStartGuide": "Průvodce nastavením", "ButtonRefreshGuideData": "Aktualizovat data programového průvodce", "ButtonRemove": "Odstranit", "ButtonRename": "Přejmenovat", @@ -955,7 +955,7 @@ "Tags": "Tagy", "TellUsAboutYourself": "Řekněte nám něco o sobě", "TheseSettingsAffectSubtitlesOnThisDevice": "Tato nastavení ovlivní titulky na tomto zařízení", - "ThisWizardWillGuideYou": "Tento průvodce Vám pomůže projít procesem nastavení. Pro začátek vyberte jazyk.", + "ThisWizardWillGuideYou": "Tento průvodce Vám pomůže projít procesem nastavení. Pro začátek zadejte název serveru a vyberte preferovaný jazyk.", "Thumb": "Náhled", "Thursday": "Čtvrtek", "TitleHardwareAcceleration": "Hardwarová akcelerace", @@ -1374,7 +1374,7 @@ "Bwdif": "Odstranění prokládání \"Bob Weaver\" (BWDIF)", "UseDoubleRateDeinterlacingHelp": "Toto nastavení při odstranění prokládání zdvojnásobuje snímkovou frekvenci, aby výsledné video vypadalo stejně plynule, jako při přehrávání prokládaného obsahu v televizi.", "UseDoubleRateDeinterlacing": "Zdvojnásobit snímkovou frekvenci při odstranění prokládání", - "LabelTonemappingParamHelp": "Pro ladění algoritmu mapování tónů. Doporučená a výchozí hodnota je NaN. Obecně je pole ponecháváno prázdné.", + "LabelTonemappingParamHelp": "Pro ladění algoritmu mapování tónů. Obecně je pole ponecháváno prázdné.", "LabelTonemappingParam": "Parametr mapování tónů", "LabelTonemappingPeakHelp": "Přepsat hodnotu vstupního signálu v metadatech souboru touto vrcholnou hodnotou. Doporučená hodnota je 100 (1000 nitů).", "LabelTonemappingPeak": "Vrchol mapování tónů", @@ -2026,5 +2026,44 @@ "ReadInputAtNativeFramerate": "Nativní snímková frekvence při načítání vstupu", "ReadInputAtNativeFramerateHelp": "Zapnutí této možnosti může pomoct s některými problémy, např. s livestreamy, které se nečekaně ukončují.", "LimitSegmentLength": "Použít kratší segmenty HLS", - "LimitSegmentLengthHelp": "Povolení této možnosti může pomoci v zamezení zasekávání přehrávače HSL během posouvání na určitých zařízeních, například televizích s webOS." + "LimitSegmentLengthHelp": "Povolení této možnosti může pomoci v zamezení zasekávání přehrávače HSL během posouvání na určitých zařízeních, například televizích s webOS.", + "HeaderServerUnavailable": "Server není dostupný", + "HeaderUpdateRequired": "Je nutná aktualizace", + "ViewSettings": "Zobrazit nastavení", + "DownloadManager": "Stažené", + "MessageForgotPasswordPinReset": "Zadáním PINu dokončete obnovení hesla", + "LabelImageCache": "Mezipamět obrázků", + "StorageType.CDRom": "CD-ROM", + "StorageType.Fixed": "Fixní", + "StorageType.Removable": "Odstranitelný", + "StorageType.Network": "Síť", + "StorageType.NoRootDirectory": "Neexistuje kořenový adresář", + "StorageType.Ram": "RAM", + "StorageType.Unknown": "Neznámý", + "BackupsPageLoadError": "Načtení stránky se zálohami se nezdařilo", + "ButtonCreateBackup": "Vytvořit zálohu", + "Create": "Vytvořit", + "HeaderBackupsHelp": "Vytvořit a obnovit zálohu vašeho serveru, což zahrnuje databázi, metadata, titulky a soubory TrickPlay.", + "LabelBackupsUnavailable": "Žádná záloha není k dispozici", + "LabelDatabase": "Databáze", + "LabelRestore": "Obnovit", + "MessageBackupDisclaimer": "Tento proces může trvat delší dobu podle toho, jak velkou máte knihovnu.", + "MessageBackupInProgress": "Probíhá zálohování", + "MessageRestoreDisclaimer": "UPOZORNĚNÍ: Chystáte se obnovit existující zálohu. Váš server bude během tohoto procesu nedostupný a veškerá data vytvořená během obnovy zálohy budou ztracena.", + "MessageRestoreInProgress": "Probíhá obnovení ze zálohy", + "MessageRestoreSuccess": "Obnovení ze zálohy dokončeno", + "MessageWaitingForServer": "Čekání na odezvu serveru...", + "Success": "Úspěch", + "HeaderBackups": "Zálohy", + "LabelProgramData": "Programová data", + "ConfirmDeleteRepository": "Odstranit repozitář?", + "RepositoriesPageLoadError": "Načtení repozitářů se nezdařilo", + "PluginsLoadError": "Při načítání zásuvných modulů došlo k chybě.", + "ButtonLearnMore": "Více informací", + "DeleteRepositoryConfirmation": "Opravdu chcete odstranit tento repozitář?", + "TranscodingLoadError": "Načtení nastavení překódování se nezdařilo", + "LiveTVPageLoadError": "Načtení stránky s nahrávkami se nezdařilo", + "ConnectAnyway": "Přesto připojit", + "HeaderServerMismatch": "Neshoda serveru", + "MessageServerMismatch": "Adresa serveru, ke kterému se připojujete, se od posledního připojení změnila. Pokud jste to očekávali, stiskněte \"Přesto připojit\". Pokud jste to neočekávali, může být vaše připojení nebo server kompromitován." } diff --git a/src/strings/da.json b/src/strings/da.json index 8b63a784e..61c023650 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -876,7 +876,7 @@ "TabScheduledTasks": "Planlagte opgaver", "TabUpcoming": "Kommende", "TellUsAboutYourself": "Fortæl os lidt om dig selv", - "ThisWizardWillGuideYou": "Denne guide vil hjælpe dig igennem opsætningen. For at begynde, vælg venligst dit fortrukne sprog.", + "ThisWizardWillGuideYou": "Denne guide vil hjælpe dig igennem opsætningsprocessen. For at starte, indtast venligst et servernavn og vælg dit foretrukne sprog.", "Thursday": "Torsdag", "TitleHardwareAcceleration": "Hardwareacceleration", "TitleHostingSettings": "Værts-indstillinger", @@ -1866,7 +1866,7 @@ "Inker": "Maler", "Penciller": "Tegner", "Letterer": "Skrift fra", - "LibraryScanFanoutConcurrencyHelp": "Maks. antal parallelle opgaver under biblioteks-scanninger. Hvis du indstiller dette til 0, vil der vælges en grænse baseret på dit systems kerneantal. ADVARSEL: Indstilles dette tal for højt, kan det forårsage problemer med netværksfilsystemer; hvis du oplever problemer, skal du sænke dette tal.", + "LibraryScanFanoutConcurrencyHelp": "Maksimalt antal parallelle opgaver under biblioteks­scanning. Hvis feltet efterlades tomt, vælges en grænse baseret på antallet af kerner i systemet. ADVARSEL: Et for højt tal kan give problemer med netværksfilsystemer – sænk tallet, hvis du oplever problemer.", "Lyrics": "Sangtekster", "PlaylistError.AddFailed": "Fejl ved tilføjelse til afspilningsliste", "PlaylistError.CreateFailed": "Fejl ved oprettelse af afspilningsliste", @@ -2010,5 +2010,34 @@ "DeleteCustomImage": "Slet brugerdefineret billede", "ImageUploadCancelled": "Billedupload annulleret", "ImageDeleteFailed": "Billedsletning mislykkedes", - "ImageUploadFailed": "Billedupload mislykkedes" + "ImageUploadFailed": "Billedupload mislykkedes", + "StreamCountExceedsLimit": "Antallet af streams overskrider grænsen", + "LimitSegmentLengthHelp": "Aktivering af denne indstilling kan hjælpe med at forhindre, at HLS-afspilleren fryser ved søgning på visse enheder, f.eks. webOS-tv.", + "MetadataImagesLoadError": "Kunne ikke indlæse metadata-indstillinger", + "MetadataNfoLoadError": "Kunne ikke indlæse metadata-NFO-indstillinger", + "Native": "Oprindelig", + "UploadCustomImage": "Upload brugerdefineret billede", + "SettingsPageLoadError": "Kunne ikke indlæse indstillingsside", + "ReadInputAtNativeFramerate": "Læs input ved den oprindelige billedfrekvens", + "ReadInputAtNativeFramerateHelp": "Aktivering af denne indstilling kan løse nogle problemer, f.eks. at live streams stopper for tidligt.", + "RetryWithGlobalSearch": "Prøv igen med en global søgning", + "PageNotFound": "Dette er ikke den side, du leder efter.", + "LogLoadFailure": "Kunne ikke indlæse logfilen. Den kan stadig blive skrevet til aktivt.", + "LabelGroupShowsIntoCollectionsHelp": "Serier i en samling vises som ét samlet element, når serielister vises.", + "LimitSegmentLength": "Brug kortere HLS-segmenter", + "ViewSettings": "Vis Indstillinger", + "HeaderServerUnavailable": "Server Utilgængelig", + "HeaderUpdateRequired": "Opdatering Nødvendig", + "PluginsLoadError": "En fejl opstod imens der blev loaded plugins.", + "ButtonLearnMore": "Lær Mere", + "MessageForgotPasswordPinReset": "Skriv PIN her for at færdigøre Adgangskode nulstilling", + "BackupsPageLoadError": "Fejlede ved at load backup side", + "ButtonCreateBackup": "Opret Backup", + "Create": "Opret", + "LabelBackupsUnavailable": "Ingen backups tilgængelige", + "LabelRestore": "Genopret", + "MessageBackupDisclaimer": "Afhængig af størrelsen på det biblotek, backup processen tager måske et stykke tid.", + "MessageBackupInProgress": "Backup igang", + "LabelDatabase": "Database", + "LabelProgramData": "Program Data" } diff --git a/src/strings/de.json b/src/strings/de.json index f8314768b..427c2833b 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1,7 +1,7 @@ { "Absolute": "Absolut", "AccessRestrictedTryAgainLater": "Der Zugriff ist derzeit eingeschränkt. Bitte versuche es später erneut.", - "Actor": "Darsteller(in)", + "Actor": "Darsteller", "Add": "Hinzufügen", "AddToCollection": "Zu Sammlung hinzufügen", "AddToPlayQueue": "Zu Warteschlange hinzufügen", @@ -44,7 +44,7 @@ "BoxRear": "Box (Rückseite)", "Browse": "Durchsuchen", "MessageBrowsePluginCatalog": "Durchsuche unseren Katalog, um alle verfügbaren Plugins anzuzeigen.", - "BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel einbrennen soll. Deaktivieren verbessert die Serverperformance immens. Wähle Auto, um bildbasierte Formate (z.B. VobSub, PGS, SUB, IDX, etc.) sowie bestimmte ASS- oder SSA-Untertitel einbrennen zu lassen.", + "BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel einbrennen soll. Deaktivieren verbessert die Performance immens. Wähle Auto, um bildbasierte Formate (z.B. VobSub, PGS, SUB, IDX, etc.) sowie bestimmte ASS- oder SSA-Untertitel einbrennen zu lassen.", "ButtonAddMediaLibrary": "Medienbibliothek hinzufügen", "ButtonAddScheduledTaskTrigger": "Auslöser hinzufügen", "ButtonAddServer": "Server hinzufügen", @@ -67,13 +67,13 @@ "ButtonOpen": "Öffnen", "ButtonParentalControl": "Kindersicherung", "ButtonPreviousTrack": "Vorheriges Lied", - "ButtonQuickStartGuide": "Schnellstartanleitung", + "ButtonQuickStartGuide": "Einrichtungsanleitung", "ButtonRefreshGuideData": "TV-Programmdaten aktualisieren", "ButtonRemove": "Entfernen", "ButtonRename": "Umbenennen", "ButtonResetEasyPassword": "Easy PIN-Code zurücksetzen", "ButtonResume": "Fortsetzen", - "ButtonRevoke": "Wiederrufen", + "ButtonRevoke": "Widerrufen", "ButtonScanAllLibraries": "Alle Bibliotheken scannen", "ButtonSelectDirectory": "Verzeichnis wählen", "ButtonSelectView": "Ansicht wählen", @@ -91,17 +91,17 @@ "ChannelNameOnly": "Nur Kanal {0}", "ChannelNumber": "Kanalnummer", "Channels": "Kanäle", - "CinemaModeConfigurationHelp": "Der Kinomodus bringt mit der Fähigkeit, Trailer und benutzerdefinierte Intros vor dem Hauptfilm abzuspielen, das Kinoerlebnis direkt in dein Wohnzimmer.", + "CinemaModeConfigurationHelp": "Der Kinomodus bringt das Kinoerlebnis direkt in dein Wohnzimmer. Trailer und benutzerdefinierte Intros können vor dem Hauptfilm abgespielt werden.", "Collections": "Sammlungen", "ColorSpace": "Farbraum", "CommunityRating": "Communitybewertung", "Composer": "Komponist", - "ConfigureDateAdded": "Legen Sie fest, wie die Metadaten für ‚Hinzugefügt am‘ unter Dashboard > Bibliotheken > Anzeige bestimmt werden.", + "ConfigureDateAdded": "Lege fest, wie die Metadaten für ‚Hinzugefügt am‘ unter Dashboard > Bibliotheken > Anzeige bestimmt werden", "ConfirmDeleteImage": "Bild löschen?", - "ConfirmDeleteItem": "Das Löschen dieses Objekts löscht die Datei vom Laufwerk und in deiner Medienbibliothek. Bist du wirklich sicher?", - "ConfirmDeleteItems": "Das Löschen dieser Objekte löscht die Dateien vom Laufwerk und in deiner Medienbibliothek. Bist du wirklich sicher?", + "ConfirmDeleteItem": "Das Löschen dieses Objekts löscht die Datei vom Laufwerk und aus deiner Medienbibliothek. Bist du wirklich sicher?", + "ConfirmDeleteItems": "Das Löschen dieser Objekte löscht die Dateien vom Laufwerk und aus deiner Medienbibliothek. Bist du wirklich sicher?", "ConfirmDeletion": "Löschen bestätigen", - "ConfirmEndPlayerSession": "Möchtest du Jellyfin auf {0} beenden?", + "ConfirmEndPlayerSession": "Möchtest du Jellyfin um {0} herunterfahren?", "Connect": "Verbinden", "ContinueWatching": "Weiterschauen", "Continuing": "Fortlaufend", @@ -117,17 +117,17 @@ "Delete": "Löschen", "DeleteDeviceConfirmation": "Sind Sie sicher, dass Sie dieses Gerät löschen möchten? Es wird wieder angezeigt, wenn sich ein Benutzer das nächste Mal damit anmeldet.", "DeleteImage": "Bild löschen", - "DeleteImageConfirmation": "Bist du dir sicher, dass du dieses Bild löschen willst?", + "DeleteImageConfirmation": "Bist du sicher, dass du dieses Bild löschen willst?", "DeleteMedia": "Medien löschen", "DeleteUser": "Benutzer löschen", - "DeleteUserConfirmation": "Bist du dir sicher, dass du diesen Benutzer löschen willst?", + "DeleteUserConfirmation": "Bist du sicher, dass du diesen Benutzer löschen willst?", "Depressed": "Gedrückt", "Descending": "Absteigend", "DetectingDevices": "Suche Geräte", "DeviceAccessHelp": "Dies wird nur auf Geräte angewendet, die eindeutig identifiziert werden können, und verhindert nicht den Web-Zugriff. Gefilterter Zugriff auf Geräte verhindert die Nutzung neuer Geräte solange, bis der Zugriff für diese freigegeben wird.", "DirectPlaying": "Direktes Abspielen", "DirectStreamHelp1": "Der Videostream ist mit dem Abspielgerät kompatibel, hat jedoch ein inkompatibles Audioformat (DTS, Dolby TrueHD usw.) oder eine inkompatible Anzahl von Audiokanälen. Der Videostream wird im laufenden Betrieb verlustfrei neu verpackt, bevor er an das Gerät gesendet wird. Nur der Audiostream wird transkodiert.", - "DirectStreamHelp2": "Die durch direktes Streaming verbrauchte Rechenleistung hängt normalerweise vom Audioprofil ab. Nur der Videostream ist verlustfrei.", + "DirectStreamHelp2": "Die durch direktes Streaming verbrauchte Energie hängt gewöhnlich vom Audioprofil ab. Nur der Videostream ist verlustfrei.", "DirectStreaming": "Direktes Streaming", "Director": "Regisseur", "Directors": "Regisseure", @@ -135,7 +135,7 @@ "Disconnect": "Verbindung trennen", "Display": "Anzeige", "DisplayInMyMedia": "Auf Startbildschirm anzeigen", - "DisplayInOtherHomeScreenSections": "Bereiche wie 'Neueste Medien' oder 'Weiterschauen' auf dem Startbildschirm anzeigen", + "DisplayInOtherHomeScreenSections": "Bereiche wie 'Kürzlich hinzugefügte Medien' oder 'Weiterschauen' auf dem Startbildschirm anzeigen", "DisplayMissingEpisodesWithinSeasons": "Fehlende Folgen innerhalb von Staffeln anzeigen", "DisplayMissingEpisodesWithinSeasonsHelp": "Dies muss in den Servereinstellungen auch für TV-Bibliotheken aktiviert werden.", "DisplayModeHelp": "Wähle den für die Oberfläche zu verwendenden Layoutstil.", @@ -143,13 +143,13 @@ "Down": "Runter", "DownloadsValue": "{0} Downloads", "DrmChannelsNotImported": "Verschlüsselte Kanäle werden nicht importiert.", - "DropShadow": "Schatten", + "DropShadow": "Schatten werfen", "EasyPasswordHelp": "Die vereinfachte PIN-Eingabe wird für Offline-Zugriffe über unterstützte Clients verwendet. Sie kann ebenso für ein einfaches Einloggen über das eigene Netzwerk verwendet werden.", "Edit": "Bearbeiten", "EditImages": "Bilder bearbeiten", "EditMetadata": "Metadaten bearbeiten", "EditSubtitles": "Untertitel bearbeiten", - "EnableBackdropsHelp": "Zeige während des Blätterns durch die Bibliothek passenden Hintergründe auf einigen Seiten an.", + "EnableBackdropsHelp": "Die Hintergründe hinter einigen Seiten anzeigen während durch die Bibliothek geblättert wird.", "EnableCinemaMode": "Kinomodus", "EnableColorCodedBackgrounds": "Farbige Hintergründe", "EnableDisplayMirroring": "Displayspiegelung", @@ -157,12 +157,12 @@ "EnableExternalVideoPlayersHelp": "Ein Menü für externe Videoplayer wird beim Starten der Videowiedergabe angezeigt.", "EnableHardwareEncoding": "Hardwarekodierung aktivieren", "EnableNextVideoInfoOverlay": "Zeige Informationen zum nächsten Video während der Wiedergabe", - "EnableNextVideoInfoOverlayHelp": "Blendet Informationen über das nächste abzuspielende Video der aktuellen Wiedergabeliste am Ende des laufenden Videos ein.", - "EnablePhotos": "Die Fotos anzeigen", + "EnableNextVideoInfoOverlayHelp": "Blendet am Ende eines Videos Informationen über das nächste abzuspielende Video der aktuellen Wiedergabeliste ein.", + "EnablePhotos": "Fotos anzeigen", "EnablePhotosHelp": "Bilder werden erkannt und neben anderen Mediendateien angezeigt.", "EnableStreamLooping": "Live-Streams automatisch verknüpfen", "EnableStreamLoopingHelp": "Aktivieren, wenn Live Streams nur Daten für ein paar Sekunden enthalten und ständig angefragt werden müssen. Kann zu Problemen führen, falls die Option nicht zwingend notwendig ist.", - "EnableThemeSongsHelp": "Die Titelmusiken im Hintergrund abspielen, während du die Bibliothek durchblätterst.", + "EnableThemeSongsHelp": "Titelmusiken im Hintergrund abspielen, während du die Bibliothek durchblätterst.", "EnableThemeVideosHelp": "Titelvideos im Hintergrund abspielen, während du die Bibliothek durchblätterst.", "Ended": "Beendet", "EndsAtValue": "Endet um {0}", @@ -171,7 +171,7 @@ "ErrorAddingMediaPathToVirtualFolder": "Ein Fehler trat beim Hinzufügen eines Medienverzeichnisses auf. Bitte stelle sicher, dass der Pfad gültig ist und Jellyfin die notwendigen Zugriffsrechte besitzt.", "ErrorAddingTunerDevice": "Es trat ein Fehler beim Hinzufügen eines Tuners auf. Bitte stelle sicher, dass dieser erreichbar ist und versuche es erneut.", "ErrorAddingXmlTvFile": "Fehler beim Zugriff auf die XMLTV-Datei. Bitte stelle sicher, dass die Datei existiert und versuche es erneut.", - "ErrorDeletingItem": "Fehler beim Löschen des Objekts vom Server. Bitte stelle sicher, dass Jellyfin Schreibzugriff auf den Dateiordner hat und versuche es erneut.", + "ErrorDeletingItem": "Fehler beim Löschen des Objekts vom Server. Bitte stelle sicher, dass Jellyfin Schreibzugriff auf den Medienordner hat und versuche es erneut.", "ErrorGettingTvLineups": "Fehler beim Herunterladen des Fernsehprogramms. Bitte stelle sicher, dass deine Informationen korrekt sind und versuche es erneut.", "ErrorStartHourGreaterThanEnd": "Die Endzeit muss nach der Startzeit liegen.", "ErrorPleaseSelectLineup": "Bitte wähle ein TV-Programm und versuche es erneut. Wenn keine Programme verfügbar sind prüfe bitte Benutzername, Passwort und Postleitzahl.", @@ -179,15 +179,15 @@ "EveryNDays": "Alle {0} Tage", "ExitFullscreen": "Vollbild verlassen", "ExtraLarge": "Extragroß", - "ExtractChapterImagesHelp": "Die Extraktion von Kapitelbildern ermöglicht es Jellyfin-Apps eine grafische Szenenauswahl anzubieten. Sie kann sehr langsam und rechenintensiv sein und erfordert ggf. einige Gigabyte an freiem Speicherplatz. Diese Aufgabe wird ausgeführt, wenn neue Videos erkannt werden und wiederkehrend jede Nacht. Es wird nicht empfohlen diese Aufgabe in Zeiten hoher Serverauslastung zu starten.", - "FFmpegSavePathNotFound": "Wir konnten kein FFmpeg in dem von Dir angegebenen Verzeichnis finden. FFprobe wird ebenso benötigt und muss sich im gleichen Verzeichnis befinden. Diese Komponenten sind normalerweise in einem Paket kombiniert und kommen zusammen in einem Download. Bitte prüfe das Verzeichnis und versuche es erneut.", + "ExtractChapterImagesHelp": "Die Extraktion von Kapitelbildern ermöglicht es Clients eine grafische Szenenauswahl anzubieten. Sie kann langsam und rechenintensiv sein und erfordert ggf. einige Gigabytes Speicherplatz. Diese Aufgabe wird ausgeführt, wenn neue Videos erkannt werden und wiederkehrend jede Nacht. Es ist nicht empfohlen, diese Aufgabe während hoher Serverauslastung zu starten.", + "FFmpegSavePathNotFound": "Wir können FFmpeg in dem von Dir angegebenen Verzeichnis nicht finden. FFprobe wird ebenso benötigt und muss sich im gleichen Verzeichnis befinden. Diese Komponenten sind normalerweise im selben Download enthalten. Bitte prüfe das Verzeichnis und versuche es erneut.", "FastForward": "Vorwärts spulen", "Favorite": "Favorit", "Favorites": "Favoriten", "FetchingData": "Zusätzliche Daten abrufen", "File": "Datei", "FileNotFound": "Datei nicht gefunden.", - "FileReadCancelled": "Dateiimport wurde abgebrochen.", + "FileReadCancelled": "Das Lesen der Datei wurde abgebrochen.", "FileReadError": "Beim Lesen der Datei ist ein Fehler aufgetreten.", "Filters": "Filter", "Folders": "Verzeichnisse", @@ -218,12 +218,12 @@ "HeaderAllowMediaDeletionFrom": "Erlaube Medienlöschung von", "HeaderApiKey": "API-Schlüssel", "HeaderApiKeys": "API-Schlüssel", - "HeaderApiKeysHelp": "Externe Applikationen benötigen einen API-Schlüssel, um mit dem Server zu kommunizieren. API-Schlüssel werden beim Anmelden mit einem normalen Benutzerkonto oder durch eine manuelle Freigabe vergeben.", + "HeaderApiKeysHelp": "Externe Applikationen benötigen einen API-Schlüssel, um mit dem Server zu kommunizieren zu können. Schlüssel werden durch Anmeldung mit einem normalen Benutzerkonto oder durch manuelle Freigabe vergeben.", "HeaderAppearsOn": "Erscheint auf", "HeaderAudioBooks": "Hörbücher", "HeaderAudioSettings": "Audioeinstellungen", "HeaderBlockItemsWithNoRating": "Blockiere Inhalte mit keiner oder nicht erkannter Altersfreigabe", - "HeaderBranding": "Branding / CSS", + "HeaderBranding": "Branding", "HeaderCancelRecording": "Aufnahme abbrechen", "HeaderCancelSeries": "Serie abbrechen", "HeaderCastAndCrew": "Besetzung & Mitwirkende", @@ -243,7 +243,7 @@ "HeaderContinueWatching": "Weiterschauen", "HeaderCustomDlnaProfiles": "Benutzerdefinierte Profile", "HeaderDateIssued": "Erstellungsdatum", - "HeaderDefaultRecordingSettings": "Standardaufnahmeeinstellungen", + "HeaderDefaultRecordingSettings": "Standard-Aufnahmeeinstellungen", "HeaderDeleteDevice": "Gerät löschen", "HeaderDeleteItem": "Objekt löschen", "HeaderDeleteItems": "Objekte löschen", @@ -258,13 +258,13 @@ "HeaderDownloadSync": "Herunterladen & Synchronisieren", "HeaderEasyPinCode": "Einfacher Easy PIN Code", "HeaderEditImages": "Bilder bearbeiten", - "HeaderEnabledFields": "Felder aktivieren", - "HeaderEnabledFieldsHelp": "Deaktiviere Felder, um das Ändern von Daten zu verhindern.", + "HeaderEnabledFields": "Aktivierte Felder", + "HeaderEnabledFieldsHelp": "Deaktiviere ein Feld, um es zu Sperren das Ändern von Daten zu verhindern.", "HeaderError": "Fehler", "HeaderExternalIds": "Externe IDs", "HeaderFeatureAccess": "Funktionszugriff", "HeaderFetchImages": "Bilder abrufen", - "HeaderFetcherSettings": "Quellen-Einstellungen", + "HeaderFetcherSettings": "Abruf-Einstellungen", "HeaderForKids": "Für Kinder", "HeaderFrequentlyPlayed": "Oft abgespielt", "HeaderGuideProviders": "Fernsehprogramm-Anbieter", @@ -272,7 +272,7 @@ "HeaderIdentificationCriteriaHelp": "Gib mindestens ein Identifikationskriterium an.", "HeaderIdentificationHeader": "Identfikations-Header", "HeaderIdentifyItemHelp": "Gib ein oder mehrere Suchkriterien ein. Entferne Kriterien, um die Suchergebnisse zu erweitern.", - "HeaderImageOptions": "Bild-Einstellungen", + "HeaderImageOptions": "Bild-Optionen", "HeaderImageSettings": "Bild-Einstellungen", "HeaderInstall": "Installieren", "HeaderInstantMix": "Sofortmix", @@ -301,7 +301,7 @@ "HeaderMyMediaSmall": "Meine Medien (Klein)", "HeaderNewApiKey": "Neuer API-Schlüssel", "HeaderNewDevices": "Neue Geräte", - "HeaderNextEpisodePlayingInValue": "Nächste Episode in {0}", + "HeaderNextEpisodePlayingInValue": "Nächste Episode beginnt in {0}", "HeaderNextVideoPlayingInValue": "Nächstes Video wird abgespielt in {0}", "HeaderOnNow": "Gerade läuft", "HeaderOtherItems": "Andere Inhalte", @@ -378,7 +378,7 @@ "Help": "Hilfe", "Hide": "Verbergen", "HideWatchedContentFromLatestMedia": "Gesehene Inhalte in 'Neueste Medien' ausblenden", - "HttpsRequiresCert": "Um HTTPS für externe Verbindungen zu erzwingen, benötigst du ein vertrauenswürdiges SSL-Zertifikat, z.B. von Let's Encrypt. Bitte stelle entweder ein Zertifikat bereit, oder deaktiviere sichere Verbindungen.", + "HttpsRequiresCert": "Um HTTPS für externe Verbindungen zu aktivieren, benötigst du ein vertrauenswürdiges SSL-Zertifikat, z.B. von Let's Encrypt. Bitte stelle entweder ein Zertifikat bereit, oder deaktiviere sichere Verbindungen.", "Identify": "Identifizieren", "Images": "Bilder", "ImportFavoriteChannelsHelp": "Nur auf dem Tuner favorisierte Kanäle werden importiert.", @@ -427,14 +427,14 @@ "LabelChannels": "Kanäle", "LabelCollection": "Sammlung", "LabelCommunityRating": "Community Bewertung", - "LabelContentType": "Typ des Inhalts", + "LabelContentType": "Inhaltstyp", "LabelCountry": "Land/Region", "LabelCriticRating": "Kritikerbewertung", "LabelCurrentPassword": "Aktuelles Passwort", "LabelCustomCertificatePath": "Benutzerdefinierter Pfad zum SSL-Zertifikat", "LabelCustomCertificatePathHelp": "Pfad zu einer PKCS-#12-Datei, die ein Zertifikat und einen privaten Schlüssel enthält, um TLS-Unterstützung für eine eigene Domain zu aktivieren.", "LabelCustomCss": "Benutzerdefinierter CSS-Code", - "LabelCustomCssHelp": "Wende deinen eigenen, benutzerdefinierten CSS-Code für Theming/Branding auf die Weboberfläche an.", + "LabelCustomCssHelp": "Wende deinen benutzerdefinierten CSS-Code für Theming/Branding auf die Weboberfläche an.", "LabelCustomDeviceDisplayNameHelp": "Lege einen individuellen Anzeigenamen fest oder lasse das Feld leer, um den vom Gerät übermittelten Namen zu nutzen.", "LabelCustomRating": "Eigene Bewertung", "LabelDashboardTheme": "Server-Dashboard-Theme", @@ -452,10 +452,10 @@ "LabelDiscNumber": "Disknummer", "LabelDisplayLanguage": "Anzeigesprache", "LabelDisplayLanguageHelp": "Die Übersetzung von Jellyfin ist ein laufendes Projekt.", - "LabelDisplayMode": "Bildschirmmodus", + "LabelDisplayMode": "Anzeigemodus", "LabelDisplayName": "Anzeigename", "LabelDisplayOrder": "Anzeigereihenfolge", - "LabelDisplaySpecialsWithinSeasons": "Sonderinhalt innerhalb der Staffel, in der er ausgestrahlt wurde, anzeigen", + "LabelDisplaySpecialsWithinSeasons": "Specials in den Staffeln anzeigen, in den sie ausgestrahlt wurden", "LabelDownMixAudioScale": "Audioverstärkung beim Heruntermischen", "LabelDownMixAudioScaleHelp": "Lautstärke beim Heruntermischen erhöhen. Setze den Wert auf 1, um die Originallautstärke zu erhalten.", "LabelDownloadLanguages": "Herunterzuladende Sprachen", @@ -498,7 +498,7 @@ "LabelGroupMoviesIntoCollectionsHelp": "Filme in einer Sammlung werden bei der Anzeige von Filmlisten als ein gruppiertes Element angezeigt.", "LabelEncoderPreset": "Kodierungsvoreinstellung", "LabelHardwareAccelerationType": "Hardwarebeschleunigung", - "LabelHardwareAccelerationTypeHelp": "Hardwarebeschleunigung benötigt zusätzliche Einstellungen.", + "LabelHardwareAccelerationTypeHelp": "Hardwarebeschleunigung erfordert zusätzliche Konfiguration.", "LabelHomeNetworkQuality": "Qualität des Heimnetzwerk", "LabelHomeScreenSectionValue": "Startseitenbereich {0}", "LabelHttpsPort": "Lokale HTTPS-Portnummer", @@ -516,8 +516,8 @@ "LabelKidsCategories": "Kinderkategorien", "LabelKodiMetadataDateFormat": "Format des Veröffentlichungsdatums", "LabelKodiMetadataDateFormatHelp": "Alle Daten innerhalb von NFO-Dateien werden mit diesem Format verarbeitet.", - "LabelKodiMetadataEnableExtraThumbs": "Kopiere Extra-Fanart- nach Extra-Vorschau-Feld", - "LabelKodiMetadataEnableExtraThumbsHelp": "Beim Downloaden von Bildern können diese sowohl als Extrafanart als auch als Extrathumb gespeichert werden, um maximale Kompatibilität mit Kodi zu erzielen.", + "LabelKodiMetadataEnableExtraThumbs": "Kopiere extrafanart nach extrathumbs Feld", + "LabelKodiMetadataEnableExtraThumbsHelp": "Beim Downloaden von Bildern können diese sowohl als extrafanart als auch als extrathumb gespeichert werden, um maximale Kompatibilität mit Kodi zu erzielen.", "LabelKodiMetadataEnablePathSubstitution": "Pfadersetzung aktivieren", "LabelKodiMetadataEnablePathSubstitutionHelp": "Aktiviert die Pfadersetzung für Bildpfade. Es werden die Einstellungen des Servers zur Pfadersetzung verwendet.", "LabelKodiMetadataSaveImagePaths": "Bildpfade in NFO-Dateien speichern", @@ -539,7 +539,7 @@ "LabelMaxChromecastBitrate": "Google Cast Streaming-Qualität", "LabelMaxParentalRating": "Maximal erlaubte Altersfreigabe", "LabelMaxResumePercentage": "Maximale Prozent für Wiederaufnahme", - "LabelMaxResumePercentageHelp": "Titel werden als vollständig gesehen markiert, wenn sie nach dieser Zeit gestoppt werden.", + "LabelMaxResumePercentageHelp": "Titel gelten als vollständig abgespielt, wenn sie nach dieser Zeit gestoppt werden.", "LabelMaxScreenshotsPerItem": "Maximale Anzahl von Screenshots pro Element:", "LabelMaxStreamingBitrate": "Maximale Streaming-Qualität", "LabelMaxStreamingBitrateHelp": "Wähle die maximale Bitrate während des Streamens.", @@ -612,10 +612,10 @@ "LabelPublicHttpPortHelp": "Die öffentliche Portnummer sollte einem lokalen HTTP-Port zugewiesen werden.", "LabelPublicHttpsPort": "Öffentliche HTTPS-Portnummer", "LabelPublicHttpsPortHelp": "Die öffentliche Portnummer sollte einem lokalen HTTPS-Port zugewiesen werden.", - "LabelReasonForTranscoding": "Grund für die Transkodierung", + "LabelReasonForTranscoding": "Grund für Transkodierung", "LabelRecord": "Aufnahme", "LabelRecordingPath": "Standardaufnahmepfad", - "LabelRecordingPathHelp": "Legt das Verzeichnis für Aufnahmen fest. Wird es leer gelassen, wird das Daten-Verzeichnis des Servers verwendet.", + "LabelRecordingPathHelp": "Gebe das Verzeichnis zum Speichern von Aufnahmen an. Wird es leer gelassen, wird das Datenverzeichnis des Servers verwendet.", "LabelRefreshMode": "Aktualisierungsmodus", "LabelReleaseDate": "Veröffentlichungsdatum", "LabelRemoteClientBitrateLimit": "Bitratenlimit für Internet-Streaming (Mbit/s)", @@ -641,12 +641,12 @@ "LabelSkipIfAudioTrackPresent": "Überspringen, falls der Ton bereits der herunterladbaren Sprache entspricht", "LabelSkipIfAudioTrackPresentHelp": "Entferne den Haken, um sicherzustellen das alle Videos Untertitel haben, unabhängig von der Audiosprache.", "LabelSkipIfGraphicalSubsPresent": "Überspringen, falls das Video bereits eingebettete Untertitel enthält", - "LabelSkipIfGraphicalSubsPresentHelp": "Das Vorhalten von textbasierten Untertiteln führt zu einer effizienteren Anzeige und verringert die Wahrscheinlichkeit einer Videotranskodierung.", + "LabelSkipIfGraphicalSubsPresentHelp": "Das Vorhalten von textbasierten Untertiteln führt zu einer effizienteren Auslieferung und verringert die Wahrscheinlichkeit einer Videotranskodierung.", "LabelSonyAggregationFlags": "Sony Aggregation Flags", "LabelSonyAggregationFlagsHelp": "Legt den Inhalt des 'aggregationFlags'-Elements im 'urn:schemas-sonycom:av' Namensraum fest.", "LabelSortBy": "Sortiert nach", "LabelSortOrder": "Sortierreihenfolge", - "LabelSortTitle": "Sortiertitel", + "LabelSortTitle": "Sortieren nach Titel", "LabelSource": "Quelle", "LabelSpecialSeasonsDisplayName": "Anzeigename für Serien-Specials", "LabelSportsCategories": "Sportkategorie", @@ -668,7 +668,7 @@ "LabelTrackNumber": "Liednummer", "LabelTranscodingTempPathHelp": "Wähle einen eigenen Pfad für transkodierte Dateien. Lasse das Feld frei, um den Standardspeicherort zu nutzen.", "LabelTranscodingThreadCount": "Anzahl der Transkodierungsthreads", - "LabelTranscodingThreadCountHelp": "Legt die maximale Anzahl von Transkodierungs-Threads fest. Das Reduzieren der Thread-Anzahl verringert die CPU-Auslastung, verhindert aber möglicherweise eine ausreichend schnelle Transkodierung für eine störungsfrei Wiedergabe.", + "LabelTranscodingThreadCountHelp": "Legt die maximale Anzahl von Transkodierungs-Threads fest. Das Reduzieren der Thread-Anzahl verringert die CPU-Auslastung, verhindert aber möglicherweise eine ausreichend schnelle Transkodierung für eine störungsfreie Wiedergabe.", "LabelTriggerType": "Auslöser-Typ", "LabelTunerIpAddress": "IP-Adresse des Tuners", "LabelTunerType": "Typ des Tuners", @@ -694,10 +694,10 @@ "LabelZipCode": "PLZ", "LabelffmpegPath": "FFmpeg-Verzeichnis", "LabelffmpegPathHelp": "Verzeichnis zur FFmpeg-Applikationsdatei oder zum Ordner, der FFmpeg enthält.", - "LanNetworksHelp": "Komma separierte Liste von IP-Adressen oder IP/Netzmasken die als lokale Netzwerke behandelt werden sollen, um Bandbreitenlimitationen auszusetzen. Wenn gesetzt, werden alle anderen IP-Adressen als extern behandelt und unterliegen den Bandbreitenlimitationen für externe Verbindungen. Wenn leer, wird nur das Subnetz des Servers als lokales Netzwerk behandelt.", + "LanNetworksHelp": "Komma getrennte Liste von IP-Adressen oder IP/Netzmasken die als lokale Netzwerke behandelt werden sollen, um Bandbreitenbegrenzungen umzusetzen. Wenn gesetzt, werden alle anderen IP-Adressen als extern behandelt und unterliegen den Bandbreitenbegrenzungen für externe Verbindungen. Wenn leer, wird nur das Subnetz des Servers als lokales Netzwerk behandelt.", "Large": "Groß", "LatestFromLibrary": "Kürzlich hinzugefügt in {0}", - "LearnHowYouCanContribute": "Erfahre, wie du unterstützen kannst.", + "LearnHowYouCanContribute": "Erfahre, wie du dich beteiligen kannst.", "LibraryAccessHelp": "Wähle die Bibliotheken aus, die du mit diesem Benutzer teilen möchtest. Administratoren können den Metadaten-Manager verwenden, um alle Ordner zu bearbeiten.", "List": "Liste", "LiveBroadcasts": "Liveübertragungen", @@ -709,7 +709,7 @@ "MaxParentalRatingHelp": "Inhalte mit einer höheren Bewertung werden dem Benutzer nicht angezeigt.", "MediaInfoAnamorphic": "Anamorph", "MediaInfoAspectRatio": "Seitenverhältnis", - "MediaInfoBitDepth": "Bit-Tiefe", + "MediaInfoBitDepth": "Bittiefe", "MediaInfoChannels": "Kanäle", "MediaInfoDefault": "Standard", "MediaInfoExternal": "Extern", @@ -728,20 +728,20 @@ "MediaIsBeingConverted": "Das Medium wird in ein Format konvertiert, das mit dem Abspielgerät kompatibel ist.", "Menu": "Menü", "MessageAlreadyInstalled": "Diese Version ist bereits installiert.", - "MessageAreYouSureDeleteSubtitles": "Bist du dir sicher, dass du diese Untertitel-Datei löschen willst?", - "MessageAreYouSureYouWishToRemoveMediaFolder": "Bist du dir sicher dieses Medienverzeichnis entfernen zu wollen?", - "MessageConfirmDeleteGuideProvider": "Bist du dir sicher, dass du diesen Programm-Anbieter löschen willst?", - "MessageConfirmDeleteTunerDevice": "Bist du dir sicher, dass du dieses Gerät löschen willst?", + "MessageAreYouSureDeleteSubtitles": "Bist du sicher, dass du diese Untertitel-Datei löschen willst?", + "MessageAreYouSureYouWishToRemoveMediaFolder": "Bist du sicher, dass du dieses Medienverzeichnis entfernen möchtest?", + "MessageConfirmDeleteGuideProvider": "Bist du sicher, dass du diesen Programm-Anbieter löschen willst?", + "MessageConfirmDeleteTunerDevice": "Bist du sicher, dass du dieses Gerät löschen willst?", "MessageConfirmProfileDeletion": "Bist du dir sicher, dass du dieses Profil löschen willst?", "MessageConfirmRecordingCancellation": "Aufnahme abbrechen?", - "MessageConfirmRemoveMediaLocation": "Bist du dir sicher, dass du diese Medienquelle entfernen willst?", + "MessageConfirmRemoveMediaLocation": "Bist du sicher, dass du diese Medienquelle entfernen willst?", "MessageConfirmRestart": "Willst du Jellyfin wirklich neu starten?", - "MessageConfirmRevokeApiKey": "Bist du dir sicher, dass du diesen API-Schlüssel löschen willst? Die Verbindung der Anwendung zu diesem Server wird sofort unterbrochen werden.", - "MessageConfirmShutdown": "Willst du den Server wirklich herunterfahren?", - "MessageContactAdminToResetPassword": "Bitte kontaktiere deinen Systemadministrator, um dein Passwort zurücksetzen zu lassen.", + "MessageConfirmRevokeApiKey": "Bist du sicher, dass du diesen API-Schlüssel löschen willst? Die Verbindung der Anwendung zu diesem Server wird sofort unterbrochen werden.", + "MessageConfirmShutdown": "Bist du sicher, dass du den Server herunterfahren möchtest?", + "MessageContactAdminToResetPassword": "Bitte kontaktiere deinen Systemadministrator, um dein Passwort zurückzusetzen.", "MessageCreateAccountAt": "Erstelle ein Konto bei {0}", - "MessageDeleteTaskTrigger": "Bist du dir sicher, dass du diesen Aufgabenauslöser entfernen möchtest?", - "MessageDirectoryPickerBSDInstruction": "Für BSD musst du ggf. Speicherplatz in deinem 'FreeNAS Jail' so konfigurieren, dass Jellyfin auf deine Medien zugreifen kann.", + "MessageDeleteTaskTrigger": "Bist du sicher, dass du diesen Aufgabenauslöser entfernen möchtest?", + "MessageDirectoryPickerBSDInstruction": "Für BSD musst du ggf. Speicherplatz in deinem 'FreeNAS Jail' so konfigurieren, damit Jellyfin auf deine Medien zugreifen kann.", "MessageDirectoryPickerLinuxInstruction": "Für Linux auf Arch Linux, CentOS, Debian, Fedora, openSUSE oder Ubuntu muss der Servicebenutzer mindestens lesenden Zugriff auf die Speicherorte der Medien besitzen.", "MessageDownloadQueued": "Download eingereiht.", "MessageEnablingOptionLongerScans": "Die Aktivierung dieser Option kann erheblich längere Bibliotheks-Scans verursachen.", @@ -763,7 +763,7 @@ "MessagePleaseEnsureInternetMetadata": "Bitte sicherstellen, dass das Herunterladen von Metadaten aus dem Internet aktiviert ist.", "MessagePleaseWait": "Bitte warten, dies kann eine Minute dauern.", "MessagePluginConfigurationRequiresLocalAccess": "Melde dich bitte direkt an deinem lokalen Server an, um dieses Plugin einzurichten.", - "MessagePluginInstallDisclaimer": "WARNUNG: Mit dem Installieren eines Drittanbieterplugins entstehen Risiken. Es könnte nicht stabilen oder bösartigen Code enthalten und kann jederzeit von seinem Entwickler verändert werden. Installiere daher nur Plugins von Entwicklern, denen du vertraust. Sei dir den möglichen Auswirkungen bewusst, die eine Installation haben kann, einschließlich Anfragen an externe Dienste, verlängerte Bibliotheksscans oder zusätzliche Hintergrundverarbeitungen.", + "MessagePluginInstallDisclaimer": "WARNUNG: Das Installieren eines Drittanbieterplugins birgt Risiken. Es könnte instabilen oder bösartigen Code enthalten und kann jederzeit verändert werden. Installiere daher nur Plugins von Entwicklern, denen du vertraust. Sei dir den möglichen Auswirkungen bewusst, die eine Installation haben kann, einschließlich Anfragen an externe Dienste, verlängerte Scans von Bibliotheken oder zusätzliche Hintergrundverarbeitungen.", "MessageReenableUser": "Siehe unten zur Reaktivierung", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Die folgenden Medienverzeichnisse werden aus der Bibliothek entfernt", "MessageUnableToConnectToServer": "Wir können gerade keine Verbindung zum gewählten Server herstellen. Bitte stelle sicher, dass dieser läuft und versuche es erneut.", @@ -786,8 +786,8 @@ "MySubtitles": "Meine Untertitel", "Never": "Niemals", "NewCollection": "Neue Sammlung", - "NewCollectionHelp": "Sammlungen ermöglichen personallisierte Gruppen von Filmen oder anderen Medien.", - "NewCollectionNameExample": "Beispiel: Star Wars Collection", + "NewCollectionHelp": "Sammlungen ermöglichen personalisierte Gruppen von Filmen oder anderen Medien.", + "NewCollectionNameExample": "Beispiel: Star Wars Sammlung", "NewEpisodes": "Neue Episoden", "NewEpisodesOnly": "Nur neue Episoden", "News": "Nachrichten", @@ -809,10 +809,10 @@ "OptionAdminUsers": "Administratoren", "OptionAllUsers": "Alle Benutzer", "OptionAllowAudioPlaybackTranscoding": "Audio-Wiedergabe, die Transkodierung benötigt, zulassen", - "OptionAllowBrowsingLiveTv": "Live TV Zugriff zulassen", + "OptionAllowBrowsingLiveTv": "Live-TV Zugriff zulassen", "OptionAllowContentDownloading": "Erlaube Mediendownload und Synchronisation", "OptionAllowLinkSharing": "Teilen in sozialen Netzwerken zulassen", - "OptionAllowLinkSharingHelp": "Es werden nur Webseiten mit Medieninformationen geteilt. Mediendateien werden niemals öffentlich geteilt. Die geteilten Inhalte sind nur begrenzt zugänglich und werden nach {0} Tagen ungültig.", + "OptionAllowLinkSharingHelp": "Es werden nur Webseiten mit Medieninformationen geteilt. Mediendateien werden niemals öffentlich geteilt. Geteilte Inhalte sind zeitlich begrenzt und laufen nach {0} Tagen ab.", "OptionAllowManageLiveTv": "Live-TV Aufnahmeplanung zulassen", "OptionAllowMediaPlayback": "Medienwiedergabe zulassen", "OptionAllowMediaPlaybackTranscodingHelp": "Das Einschränken der Transkodierung kann bei nicht unterstützten Medienformaten Abspielfehler in Clients hervorrufen.", @@ -825,7 +825,7 @@ "OptionAllowVideoPlaybackTranscoding": "Video-Wiedergabe, die Transkodierung benötigt, zulassen", "OptionAutomaticallyGroupSeries": "Automatisches Zusammenführen von Serieninhalten, die über mehrere Ordner verteilt sind", "OptionAutomaticallyGroupSeriesHelp": "Inhalte einer Serie in verschiedenen Ordnern werden innerhalb einer Bibliothek als eine Serie angezeigt.", - "OptionCommunityRating": "Community Bewertung", + "OptionCommunityRating": "Community-Bewertung", "OptionCriticRating": "Kritikerbewertung", "OptionCustomUsers": "Benutzerdefiniert", "OptionDaily": "Täglich", @@ -846,7 +846,7 @@ "OptionEnableAccessToAllChannels": "Zugriff auf alle Kanäle zulassen", "OptionEnableAccessToAllLibraries": "Zugriff auf alle Bibliotheken zulassen", "OptionEnableExternalContentInSuggestions": "Externe Inhalte in Empfehlungen aktivieren", - "OptionEnableExternalContentInSuggestionsHelp": "Erlaube Internet Trailer und Live TV Sendungen in Empfehlungen.", + "OptionEnableExternalContentInSuggestionsHelp": "Erlaube Internet Trailer und Live-TV Sendungen in Empfehlungen.", "OptionEnableForAllTuners": "Für alle Tuner aktivieren", "OptionEnableM2tsMode": "M2TS Modus aktivieren", "OptionEnableM2tsModeHelp": "Aktiviere M2TS-Modus beim Kodieren in MPEG-TS.", @@ -873,11 +873,11 @@ "OptionPlainVideoItems": "Alle Videos als reine Videodateien anzeigen", "OptionPlainVideoItemsHelp": "Alle Videos werden in DIDL als \"object.item.videoItem\" angezeigt, anstatt eines spezifischen Typs wie beispielsweise \"object.item.videoItem.movie\".", "OptionPlayCount": "Wiedergabezähler", - "OptionPremiereDate": "Premiere", + "OptionPremiereDate": "Premierendatum", "OptionReleaseDate": "Veröffentlichungsdatum", "OptionReportByteRangeSeekingWhenTranscoding": "Melde, dass der Server bei der Transkodierung Bytesuche unterstützt", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Dies wird für manche Abspielgeräte benötigt, auf denen die Zeitsuche nicht gut funktioniert.", - "OptionRequirePerfectSubtitleMatch": "Nur Untertitel mit einem perfekten Ergebnis zu meinen Videos herunterladen", + "OptionRequirePerfectSubtitleMatch": "Nur Untertitel herunterladen, die perfekt zu den Videodateien passen", "OptionRequirePerfectSubtitleMatchHelp": "Perfektes Ergebnis wählt beim Filtern nur Untertitel, welche getestet und für deine exakte Videodatei verifiziert wurden. Die Abwahl dieser Option erhöht die Chance, dass Untertitel heruntergeladen werden, die Möglichkeit falscher Untertitel oder dass Text an falschen Positionen angezeigt wird ist aber ebenfalls größer.", "OptionResElement": "'res'-Element", "OptionResumable": "Fortsetzbar", @@ -885,7 +885,7 @@ "OptionSaveMetadataAsHiddenHelp": "Diese Änderung betrifft nur neu gespeicherte Metadaten. Schon gespeicherte Metadaten werden erst aktualisiert, wenn der Server diese erneut speichert.", "OptionTvdbRating": "TheTVDB-Bewertung", "OptionUnairedEpisode": "Nicht ausgestrahlte Episoden", - "OptionWakeFromSleep": "Aufwachen nach dem Schlafen", + "OptionWakeFromSleep": "Aufwachen vom Schlafen", "OptionWeekdays": "An Wochentagen", "OptionWeekends": "An Wochenenden", "OptionWeekly": "Wöchentlich", @@ -914,7 +914,7 @@ "PlayNextEpisodeAutomatically": "Nächste Episode automatisch abspielen", "Played": "Gespielt", "Playlists": "Wiedergabelisten", - "PleaseAddAtLeastOneFolder": "Bitte füge mindestens ein Verzeichnis zur Bibliothek durch Klicken der \"Hinzufügen\"-Schaltfläche hinzu.", + "PleaseAddAtLeastOneFolder": "Bitte füge der Bibliothek mindestens ein Verzeichnis durch Klicken der \"+\"-Schaltfläche im 'Ordner'-Bereich hinzu.", "PleaseConfirmPluginInstallation": "Bitte bestätige mit OK, dass du den oben stehenden Text gelesen hast und die Installation des Plugins fortführen möchtest.", "PleaseEnterNameOrId": "Bitte gib einen Namen oder eine externe ID an.", "PleaseRestartServerName": "Bitte Jellyfin auf {0} neustarten.", @@ -941,7 +941,7 @@ "Record": "Aufnehmen", "RecordSeries": "Serie aufnehmen", "RecordingCancelled": "Aufnahme abgebrochen.", - "MessageChangeRecordingPath": "Das Ändern des Aufnahmeverzeichnisses wird alte Aufnahmen nicht automatisch verschieben. Wenn du das möchtest, musst du es selbst tun.", + "MessageChangeRecordingPath": "Das Ändern des Aufnahmeverzeichnisses wird vorhandene Aufnahmen nicht automatisch verschieben. Wenn gewünscht, musst du sie selbst verschieben.", "RecordingScheduled": "Aufnahme geplant.", "Recordings": "Aufnahmen", "Refresh": "Aktualisieren", @@ -965,7 +965,7 @@ "Saturday": "Samstag", "Save": "Speichern", "SaveSubtitlesIntoMediaFolders": "Untertitel in den Medienverzeichnissen speichern", - "SaveSubtitlesIntoMediaFoldersHelp": "Das Speichern der Untertitel neben den Videodateien macht die Verwaltung deutlich leichter.", + "SaveSubtitlesIntoMediaFoldersHelp": "Das Speichern der Untertitel zusammen mit den Videodateien ermöglicht eine einfachere Verwaltung.", "ScanForNewAndUpdatedFiles": "Nach neuen und aktualisierten Dateien scannen", "ScanLibrary": "Bibliothek scannen", "Schedule": "Zeitplan", @@ -982,7 +982,7 @@ "SeriesRecordingScheduled": "Serienaufnahme geplant.", "SeriesSettings": "Serieneinstellungen", "SeriesYearToPresent": "{0}-Heute", - "ServerNameIsRestarting": "Jellyfin-Server auf {0} startet neu.", + "ServerNameIsRestarting": "Der Server auf {0} startet neu.", "ServerNameIsShuttingDown": "Der Server auf {0} fährt herunter.", "ServerRestartNeededAfterPluginInstall": "Jellyfin muss nach der Installation des Plugins neu gestartet werden.", "ServerUpdateNeeded": "Dieser Server muss aktualisiert werden. Um die neueste Version herunterzuladen, besuche bitte {0}", @@ -995,9 +995,9 @@ "ShowTitle": "Titel anzeigen", "ShowYear": "Jahr anzeigen", "Shows": "Serien", - "Shuffle": "Zufallswiedergabe", + "Shuffle": "Zufällig", "SimultaneousConnectionLimitHelp": "Die maximale Anzahl der parallel erlaubten Streams. 0 für kein Limit.", - "SkipEpisodesAlreadyInMyLibrary": "Nehme keine Episoden auf, die schon in meiner Bibliothek verfügbar sind", + "SkipEpisodesAlreadyInMyLibrary": "Keine Episoden aufnehmen, die schon in meiner Bibliothek sind", "SkipEpisodesAlreadyInMyLibraryHelp": "Wenn verfügbar, werden Episoden mittels Staffel- und Episodennummer verglichen.", "Small": "Klein", "SmallCaps": "Kapitälchen", @@ -1039,7 +1039,7 @@ "ThemeSongs": "Titelsongs", "ThemeVideos": "Titelvideos", "TheseSettingsAffectSubtitlesOnThisDevice": "Diese Einstellungen beeinflussen Untertitel auf diesem Gerät", - "ThisWizardWillGuideYou": "Dieser Assistent wird dich durch den Einrichtungsprozess führen. Um zu beginnen, wähle bitte deine bevorzugte Sprache.", + "ThisWizardWillGuideYou": "Dieser Assistent wird dich durch den Einrichtungsprozess führen. Um zu beginnen, gebe bitte einen Servernamen ein wähle deine bevorzugte Sprache.", "Thursday": "Donnerstag", "TitleHardwareAcceleration": "Hardwarebeschleunigung", "TitleHostingSettings": "Hosting-Einstellungen", @@ -1056,7 +1056,7 @@ "Unrated": "Nicht bewertet", "Up": "Hoch", "Upload": "Hochladen", - "UserAgentHelp": "Stelle einen benutzerdefinierten 'User-Agent' HTTP header zur Verfügung.", + "UserAgentHelp": "Stelle einen benutzerdefinierten 'User-Agent' HTTP-Header zur Verfügung.", "UserProfilesIntro": "Jellyfin bietet Unterstützung für Benutzerprofile mit eigenen Ansichtseinstellungen, Wiedergabepositionen und Altersfreigaben.", "ValueAlbumCount": "{0} Alben", "ValueConditions": "Bedingungen: {0}", @@ -1078,17 +1078,17 @@ "Vertical": "Vertikal", "ViewAlbum": "Album anzeigen", "ViewPlaybackInfo": "Abspielinfo ansehen", - "Watched": "Gesehen", + "Watched": "Bereits gesehen", "Wednesday": "Mittwoch", "WelcomeToProject": "Willkommen bei Jellyfin!", "WizardCompleted": "Das ist jetzt erst mal alles. Jellyfin sammelt nun Informationen über deine Medienbibliothek. Schau dir doch ein paar unserer Apps an und klicke dann auf Fertig um das Dashboard anzuzeigen.", "Writer": "Drehbuch", "XmlDocumentAttributeListHelp": "Diese Attribute werden für das Stammelement jeder XML-Antwort angewendet.", - "XmlTvKidsCategoriesHelp": "Programme mit diesen Kategorien werden als Kinderprogramme angezeigt. Separiere mehrere mit '|'.", - "XmlTvMovieCategoriesHelp": "Programme mit diesen Kategorien werden als Filme angezeigt. Separiere mehrere mit '|'.", - "XmlTvNewsCategoriesHelp": "Programme mit diesen Kategorien werden als Nachrichtenprogramme angezeigt. Separiere mehrere mit '|'.", - "XmlTvPathHelp": "Ein Pfad zu einer XMLTV Datei. Jellyfin wird diese Datei periodisch auf Updates prüfen und lesen. Du bist für das Erstellen und updaten verantwortlich.", - "XmlTvSportsCategoriesHelp": "Programme mit diesen Kategorien werden als Sport Programme angezeigt. Separiere mehrere mit '|'.", + "XmlTvKidsCategoriesHelp": "Programme mit diesen Kategorien werden als Kinderprogramme angezeigt. Trenne mehrere mit '|'.", + "XmlTvMovieCategoriesHelp": "Programme mit diesen Kategorien werden als Filme angezeigt. Trenne mehrere mit '|'.", + "XmlTvNewsCategoriesHelp": "Programme mit diesen Kategorien werden als Nachrichtenprogramme angezeigt. Trenne mehrere mit '|'.", + "XmlTvPathHelp": "Ein Pfad zu einer XMLTV-Datei. Jellyfin wird diese Datei lesen und periodisch auf Updates prüfen. Du bist für das Erstellen und Updaten der Datei verantwortlich.", + "XmlTvSportsCategoriesHelp": "Programme mit diesen Kategorien werden als Sportprogramme angezeigt. Trenne mehrere mit '|'.", "Yes": "Ja", "Yesterday": "Gestern", "Alerts": "Warnhinweise", @@ -1157,7 +1157,7 @@ "OptionProtocolHls": "HTTP-Live-Streaming (HLS)", "OptionProtocolHttp": "HTTP", "OptionRegex": "Reguläre Ausdrücke", - "OptionSpecialEpisode": "Special Features", + "OptionSpecialEpisode": "Specials", "OptionTrackName": "Titel", "Screenshots": "Bildschirmfotos", "Studios": "Studios", @@ -1171,7 +1171,7 @@ "ValueAudioCodec": "Audiocodec: {0}", "ValueCodec": "Codec: {0}", "ValueContainer": "Container: {0}", - "ValueDiscNumber": "Disk {0}", + "ValueDiscNumber": "Disc {0}", "ValueVideoCodec": "Videocodec: {0}", "LabelTag": "Tag", "LabelTagline": "Slogan", @@ -1225,10 +1225,10 @@ "MessageNoServersAvailable": "Die automatische Serversuche konnte keinen Server finden.", "LabelPlayer": "Player", "MediaInfoCodecTag": "Codec-Tag", - "SubtitleOffset": "Untertitelzeitversatz", + "SubtitleOffset": "Untertitel-Zeitversatz", "PlaybackData": "Wiedergabeinformationen", "MusicVideo": "Musikvideo", - "MusicLibraryHelp": "Überprüfe den {0}Musikbenennungsguide{1}.", + "MusicLibraryHelp": "Überprüfe den {0}Musikbenennungsleitfaden{1}.", "OptionRandom": "Zufällig", "TabNetworking": "Netzwerk", "ButtonSplit": "Teilen", @@ -1240,14 +1240,14 @@ "LabelPlayerDimensions": "Playerabmessungen", "LabelDroppedFrames": "Ausgelassene Frames", "LabelCorruptedFrames": "Fehlerhafte Frames", - "OptionForceRemoteSourceTranscoding": "Transkodieren von externen Medienquellen erzwingen (z.B. LiveTV)", + "OptionForceRemoteSourceTranscoding": "Transkodieren von externen Medienquellen erzwingen (z.B. Live-TV)", "AskAdminToCreateLibrary": "Bitte einen Administrator, eine Bibliothek zu erstellen.", "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": "Dieser Client ist nicht mit den Medien kompatibel und der Server sendet kein kompatibles Medienformat.", "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 übersprungen wird. Bei Wiedergabeproblemen sollte diese Option deaktiviert werden.", "ClientSettings": "Client-Einstellungen", - "OnApplicationStartup": "Beim Starten der Applikation", + "OnApplicationStartup": "Beim Start der Anwendung", "EveryXHours": "Alle {0} Stunden", "EveryHour": "Stündlich", "EveryXMinutes": "Alle {0} Minuten", @@ -1267,7 +1267,7 @@ "AlbumArtist": "Albumkünstler", "Album": "Album", "BoxSet": "Box Set", - "Yadif": "Noch ein Zeilenentflechtungs Filter", + "Yadif": "Noch ein Zeilenentflechtungsfilter (YADIF)", "LabelLibraryPageSizeHelp": "Setzt die Anzahl der auf einer Seite angezeigten Objekte. Auf 0 setzen, um alle Elemente auf einer Seite anzuzeigen.", "LabelLibraryPageSize": "Größe der Bibliotheksseiten", "DeinterlaceMethodHelp": "Wähle die Deinterlacing-Methode zum Transkodieren von Inhalten im Zeilensprungverfahren (Interlace). Sofern bei unterstützten Geräten Deinterlacing durch Hardwarebeschleunigung aktiviert ist, wird der Hardware-Deinterlacer anstelle dieser Einstellung verwendet.", @@ -1283,7 +1283,7 @@ "SaveChanges": "Änderungen speichern", "LabelRequireHttpsHelp": "Wenn dies ausgewählt ist, leitet der Server alle Anfragen über HTTP an HTTPS weiter. Dies hat keinen Effekt, falls der Server nicht auf HTTPS hört.", "LabelRequireHttps": "HTTPS erforderlich", - "LabelEnableHttpsHelp": "Beobachtet den konfigurierten HTTPS-Port. Damit dies geschehen kann, muss ein gültiges Zertifikat bereitgestellt werden.", + "LabelEnableHttpsHelp": "Hören auf dem konfigurierten HTTPS-Port. Damit dies geschehen kann, muss ein gültiges Zertifikat bereitgestellt werden.", "LabelEnableHttps": "HTTPS aktivieren", "HeaderServerAddressSettings": "Server-Adresseinstellungen", "HeaderRemoteAccessSettings": "Fernzugriffs-Einstellungen", @@ -1322,8 +1322,8 @@ "EnableDetailsBanner": "Detailbanner", "ShowMore": "Mehr anzeigen", "ShowLess": "Weniger anzeigen", - "EnableBlurHashHelp": "Bilder, die noch nicht fertig geladen wurden, werden mit einem verschwommenen Platzhalter dargestellt.", - "EnableBlurHash": "Verschwommene Platzhalter für Bilder zulassen", + "EnableBlurHashHelp": "Bilder die noch geladen werden, werden mit einem Platzhalter abgebildet.", + "EnableBlurHash": "Verschwommene Platzhalter für Bilder aktivieren", "EnableFasterAnimations": "Schnellere Animationen", "EnableDecodingColorDepth10Vp9": "10-Bit-Hardware-Dekodierung für VP9 aktivieren", "EnableDecodingColorDepth10Hevc": "10-Bit-Hardware-Dekodierung für HEVC aktivieren", @@ -1377,15 +1377,15 @@ "LabelColorSpace": "Farbraum", "MediaInfoColorSpace": "Farbraum", "VideoAudio": "Videoton", - "AllowTonemappingHelp": "Tone-Mapping kann den Dynamikumfang eines Videos von HDR nach SDR wandeln und dabei die für die Darstellung der Originalszene sehr wichtigen Bilddetails und Farben beibehalten. Dies funktioniert zurzeit nur bei 10bit HDR10, HLG und Dolby-Vision Videos und benötigt die entsprechende GPGPU-Laufzeitumgebung.", + "AllowTonemappingHelp": "Tone-Mapping kann den Dynamikumfang eines Videos von HDR nach SDR wandeln und dabei die für die Darstellung der Originalszene sehr wichtigen Bilddetails und Farben beibehalten. Dies funktioniert derzeit nur bei 10bit HDR10, HLG und DoVi-Videos. Erfordert die entsprechende GPGPU-Laufzeitumgebung.", "TonemappingRangeHelp": "Wähle den Ausgabefarbraum aus. Auto ist derselbe wie der Eingabefarbraum.", - "TonemappingAlgorithmHelp": "Das Tone-Mapping kann fein abgestimmt werden. Wenn du mit diesen Optionen nicht vertraut bist, behalte einfach den Standardwert bei. Der empfohlene Wert ist \"BT.2390\".", + "TonemappingAlgorithmHelp": "Tone-Mapping kann fein abgestimmt werden. Wenn du mit diesen Optionen nicht vertraut bist, behalte einfach den Standardwert. Der empfohlene Wert ist \"BT.2390\".", "LabelTonemappingAlgorithm": "Wähle den zu verwendenden Tone-Mapping-Algorithmus aus", "LabelKnownProxies": "Bekannte Proxys", "KnownProxiesHelp": "Kommagetrennte Liste von IP-Adressen oder Hostnamen bekannter Proxys, die bei der Verbindung mit dieser Jellyfin-Instanz verwendet werden. Dies ist erforderlich, um die X-Forwarded-For-Header korrekt verwenden zu können. Erfordert nach dem Speichern einen Neustart.", "LabelMaxMuxingQueueSizeHelp": "Maximale Anzahl von Paketen, die gepuffert werden können, während auf die Initialisierung aller Streams gewartet wird. Versuche diese zu erhöhen, wenn in den FFmpeg-Protokollen der Fehler \"Zu viele Pakete für den Ausgabestrom gepuffert\" auftaucht. Der empfohlene Wert ist 2048.", "LabelMaxMuxingQueueSize": "Maximale Größe der Muxing-Warteschlange", - "LabelTonemappingParamHelp": "Feinabstimmung des Tone-Mapping-Algorithmus. Die empfohlenen und Standardwerte sind NaN. Im Allgemeinen leer lassen.", + "LabelTonemappingParamHelp": "Feinabstimmung des Tone-Mapping-Algorithmus. Im Allgemeinen leer lassen.", "LabelTonemappingParam": "Tone-Mapping-Parameter", "LabelTonemappingPeakHelp": "Überschreibt den Maximalwert des Input Signals der eingebetteten Metadaten mit diesem Wert. Der Standardwert ist 100 (1000nit).", "LabelTonemappingPeak": "Tone-Mapping-Spitze", @@ -1408,7 +1408,7 @@ "QuickConnectDeactivated": "Quick Connect wurde deaktiviert, bevor der Login verifiziert werden konnte", "QuickConnectAuthorizeFail": "Unbekannter Quick Connect-Code", "QuickConnectAuthorizeSuccess": "Das Gerät wurde erfolgreich authentifiziert!", - "QuickConnectAuthorizeCode": "Login Code {0} eingeben", + "QuickConnectAuthorizeCode": "Code {0} zum Login eingeben", "QuickConnectActivationSuccessful": "Erfolgreich aktiviert", "EnableQuickConnect": "Quick Connect auf diesem Server aktivieren", "QuickConnect": "Quick Connect", @@ -1425,13 +1425,13 @@ "OptionAllowContentDownloadHelp": "Benutzer können Medien herunterladen und auf ihren Geräten speichern. Dies ist nicht dasselbe wie eine Synchronisierungsfunktion. Buchbibliotheken benötigen diese Funktion, um ordnungsgemäß zu funktionieren.", "OptionAllowContentDownload": "Mediendownloads zulassen", "HeaderDeleteDevices": "Alle Geräte löschen", - "DeleteDevicesConfirmation": "Bist du dir sicher, dass du alle Geräte löschen willst? Alle anderen Sitzungen werden abgemeldet. Die Geräte erscheinen wieder, sobald sich ein Benutzer das nächste Mal von ihnen anmeldet.", + "DeleteDevicesConfirmation": "Bist du sicher, dass du alle Geräte löschen willst? Alle anderen Sitzungen werden abgemeldet. Die Geräte erscheinen wieder, sobald sich ein Benutzer das nächste Mal von ihnen anmeldet.", "DeleteAll": "Alle löschen", "EnableFallbackFontHelp": "Benutzerdefinierte, alternative Schriftarten aktivieren. Dies kann Probleme mit inkorrekt dargestellten Untertiteln vermeiden.", "EnableFallbackFont": "Ausweichschriftarten aktivieren", "LabelFallbackFontPathHelp": "Diese Schriftarten werden von einigen Clients zur Darstellung von Untertiteln verwendet. Weitere Informationen hierzu finden Sie in der Dokumentation.", "LabelFallbackFontPath": "Verzeichnis für Ausweichschriftarten", - "HeaderSelectFallbackFontPathHelp": "Suche oder gib das Verzeichnis für Ausweichschriftarten zum Rendern von ASS/SSA Untertiteln an.", + "HeaderSelectFallbackFontPathHelp": "Suche oder gib das Verzeichnis für Ausweichschriftarten zum Rendern von ASS/SSA-Untertiteln an.", "HeaderSelectFallbackFontPath": "Verzeichnis für Ausweichschriftarten auswählen", "YoutubeDenied": "Angefordertes Video darf nicht in eingebetteten Playern abgespielt werden.", "YoutubeNotFound": "Video nicht gefunden.", @@ -1441,7 +1441,7 @@ "LabelSelectMono": "Mono", "LabelSelectAudioChannels": "Kanäle", "LabelAllowedAudioChannels": "Maximal erlaubte Audio-Kanäle", - "LabelPlaybackInfo": "Abspielinformationen", + "LabelPlaybackInfo": "Wiedergabe-Informationen", "LabelIsForced": "Erzwungen", "LabelH265Crf": "CRF für Kodierung in H.265", "LabelEnableIP6Help": "Aktiviert die IPv6-Funktionalität.", @@ -1471,11 +1471,11 @@ "AllowHevcEncoding": "Kodierung im HEVC-Format zulassen", "PreferFmp4HlsContainerHelp": "Bevorzugen Sie die Verwendung von fMP4 als Standardcontainer für HLS, um das direkte Streamen von HEVC- und AV1-Inhalten auf unterstützten Geräten zu ermöglichen.", "PreferFmp4HlsContainer": "Bevorzuge fMP4-HLS als Mediencontainer", - "LabelDirectStreamingInfo": "Direkte Streaming-Informationen", + "LabelDirectStreamingInfo": "Direct Streaming-Informationen", "LabelTranscodingInfo": "Transkodierungsinfo", "LabelVideoInfo": "Videoinformationen", "LabelAudioInfo": "Audioinformationen", - "RemuxHelp2": "Remux verbraucht sehr wenig Rechenleistung bei einer völlig verlustfreien Medienqualität.", + "RemuxHelp2": "Remuxen verbraucht sehr wenig Rechenleistung bei einer völlig verlustfreien Medienqualität.", "RemuxHelp1": "Das Medium befindet sich in einem inkompatiblen Dateicontainer (MKV, AVI, WMV, usw.), aber sowohl Video- als auch der Audiostream sind mit dem Gerät kompatibel. Die Medien werden verlustfrei im laufenden Betrieb neu verpackt, bevor sie an das Gerät gesendet werden.", "PluginFromRepo": "{0} aus dem Repository {1}", "LabelUDPPortRangeHelp": "Beschränkt Jellyfin auf die Verwendung dieses Portbereichs beim Herstellen von UDP-Verbindungen. (Standard ist 1024 - 645535).
Hinweis: Für bestimmte Funktionen sind feste Ports erforderlich, die möglicherweise außerhalb dieses Bereichs liegen.", @@ -1483,8 +1483,8 @@ "LabelHDHomerunPortRangeHelp": "Beschränkt den HDHomeRun UDP-Portbereich zu diesem Wert. (Standard ist 1024 - 65535).", "LabelHDHomerunPortRange": "HDHomeRun Portbereich", "LabelSyncPlayInfo": "SyncPlay-Info", - "LabelOriginalMediaInfo": "Originale Medieninformation", - "Remuxing": "Remuxing", + "LabelOriginalMediaInfo": "Original Medium-Information", + "Remuxing": "Remuxen", "LabelRemuxingInfo": "Remux-Information", "AspectRatioCover": "Ausfüllen", "AspectRatioFill": "Strecken", @@ -1492,11 +1492,11 @@ "MessageSyncPlayIsDisabled": "Berechtigung erforderlich für die Nutzung von SyncPlay.", "LabelSyncPlayTimeSyncOffset": "Zeitversatz", "LabelSyncPlayTimeSyncDevice": "Zeitsynchronisierung mit", - "LabelSyncPlayResumePlaybackDescription": "Lokale Wiedergabe wiederherstellen", + "LabelSyncPlayResumePlaybackDescription": "Gruppen-Wiedergabe wieder beitreten", "LabelSyncPlayResumePlayback": "Lokale Wiedergabe fortsetzen", "LabelSyncPlayHaltPlaybackDescription": "Und ignoriere aktuelle Änderungen der Wiedergabeliste", "LabelSyncPlayHaltPlayback": "Lokale Wiedergabe stoppen", - "LabelMaxAudiobookResumeHelp": "Titel werden als vollständig abgespielt angenommen, wenn beim Stoppen die verbleibende Dauer kleiner als dieser Wert ist.", + "LabelMaxAudiobookResumeHelp": "Titel gelten als vollständig abgespielt, wenn sie gestoppt werden und die verbleibende Dauer geringer als dieser Wert ist.", "MessageChromecastConnectionError": "Dein Google-Cast-Empfänger kann sich nicht mit dem Jellyfin-Server verbinden. Bitte überprüfe die Verbindung und versuche es erneut.", "MessagePlaybackError": "Es gab einen Fehler während dem Abspielen dieser Datei auf deinem Google Cast-Empfänger.", "LabelMinAudiobookResumeHelp": "Titel gelten bis zu diesem Zeitpunkt als nicht abgespielt.", @@ -1562,7 +1562,7 @@ "SetUsingLastTracksHelp": "Versucht, die am besten übereinstimmende Untertitel-/Audiospur basierend auf dem letzten Video auszuwählen.", "SetUsingLastTracks": "Untertitel/Audiospuren basierend auf vorherigem Element einstellen", "PreviousChapter": "Vorheriges Kapitel", - "PlaybackErrorPlaceHolder": "Dies ist ein Platzhalter für physische Medien, die Jellyfin nicht abspielen kann. Bitte lege eine Disc zum Abspielen ein.", + "PlaybackErrorPlaceHolder": "Dies ist ein Platzhalter für physische Medien, die Jellyfin nicht abspielen kann. Bitte lege die Disc zum Abspielen ein.", "NextChapter": "Nächstes Kapitel", "LabelSyncPlaySettingsSkipToSyncHelp": "Sync-Korrekturmethode, die darin besteht, zur geschätzten Wiedergabeposition zu springen. Sync-Korrektur muss aktiviert sein.", "LabelSyncPlaySettingsSkipToSync": "SkipToSync aktivieren", @@ -1590,7 +1590,7 @@ "TypeOptionPluralSeason": "Staffeln", "TypeOptionPluralMusicVideo": "Musikvideos", "TypeOptionPluralMusicArtist": "Musik-Interpreten", - "TypeOptionPluralMusicAlbum": "Musik-Alben", + "TypeOptionPluralMusicAlbum": "Musikalben", "TypeOptionPluralMovie": "Filme", "TypeOptionPluralEpisode": "Episoden", "TypeOptionPluralBoxSet": "Sammlungen", @@ -1611,7 +1611,7 @@ "UnknownVideoStreamInfo": "Die Video-Stream-Info ist unbekannt", "UnknownAudioStreamInfo": "Die Audio-Stream-Info ist unbekannt", "ContainerBitrateExceedsLimit": "Die Bitrate des Videos übersteigt das Limit", - "PreferSystemNativeHwDecoder": "Präferiere Betriebssystem-native DXVA- oder VA-API-Hardware-Dekoder", + "PreferSystemNativeHwDecoder": "Bevorzuge betriebssystemnative DXVA- oder VA-API-Hardwaredekoder", "SelectAll": "Alles auswählen", "ButtonExitApp": "Anwendung schließen", "ThemeSong": "Titellied", @@ -1649,7 +1649,7 @@ "MessageUnauthorizedUser": "Du bist aktuell nicht berechtigt, auf den Server zuzugreifen. Bitte kontaktiere den Serveradministrator für weitere Informationen.", "StoryArc": "Handlungsstrang", "Digital": "Digital", - "EnableEnhancedNvdecDecoderHelp": "Verbesserte NVDEC-Implementierung, deaktivieren, falls es zu Dekodierungsfehlern kommt.", + "EnableEnhancedNvdecDecoderHelp": "Verbesserte NVDEC-Implementierung, deaktivieren um CUVID zu nutzen, falls es zu Dekodierungsfehlern kommt.", "HomeVideosPhotos": "Heimvideos und -bilder", "Bold": "Fett", "LabelTextWeight": "Schriftstärke", @@ -1665,9 +1665,9 @@ "LabelVppTonemappingBrightnessHelp": "Wende Helligkeitsverstärkung für VPP-Tone-Mapping an. Der empfohlene Wert ist 16.", "LabelVppTonemappingBrightness": "VPP-Tone-Mapping-Helligkeitsverstärkung", "ScreenResolution": "Bildschirmauflösung", - "RememberSubtitleSelectionsHelp": "Versuche den zum letzten Video ähnlichsten Untertitel zu setzen.", - "RememberSubtitleSelections": "Setze den Untertitel auf Basis des letzten Objekts", - "RememberAudioSelectionsHelp": "Versuchen die ähnlichste Tonspur zum letzten Video zu setzen.", + "RememberSubtitleSelectionsHelp": "Versuchen, den zum letzten Video ähnlichsten Untertitel auszuwählen.", + "RememberSubtitleSelections": "Untertitel auf Basis des letzten Objekts auswählen", + "RememberAudioSelectionsHelp": "Versuchen, die zum letzten Video ähnlichste Tonspur auszuwählen.", "RememberAudioSelections": "Tonspur auf Basis des letzten Objekt auswählen", "LabelMaxVideoResolution": "Maximal erlaubte Auflösung der Videotranskodierung", "VideoRangeTypeNotSupported": "Der Dynamikumfang des Videos wird nicht unterstützt", @@ -1697,14 +1697,14 @@ "SaveRecordingImages": "EPG-Bilder der Aufnahme speichern", "SaveRecordingImagesHelp": "Speichere Bilder von EPG-Anbietern zusammen mit den Medien.", "SecondarySubtitles": "Sekundäre Untertitel", - "HeaderDummyChapter": "Kapitel Bilder", + "HeaderDummyChapter": "Kapitelbilder", "HeaderRecordingMetadataSaving": "Aufzeichnung von Metadaten", "LabelDummyChapterDuration": "Intervall", - "LabelDummyChapterDurationHelp": "Das Intervall zwischen Dummy-Kapiteln. Auf 0 setzen, um die Erzeugung von Dummy-Kapiteln zu deaktivieren. Eine Änderung dieses Wertes hat keine Auswirkung auf bestehende Dummy-Kapitel.", + "LabelDummyChapterDurationHelp": "Das Intervall zwischen Dummy-Kapiteln in Sekunden. Auf 0 setzen, um die Erzeugung von Dummy-Kapiteln zu deaktivieren. Eine Änderung dieses Wertes hat keine Auswirkung auf bestehende Dummy-Kapitel.", "LabelDummyChapterCount": "Limit", "LabelDummyChapterCountHelp": "Die maximale Anzahl von Kapitelbildern, die für jede Mediendatei extrahiert werden.", "LabelChapterImageResolution": "Auflösung", - "LabelChapterImageResolutionHelp": "Die Auflösung der extrahierten Kapitelbilder.", + "LabelChapterImageResolutionHelp": "Die Auflösung der extrahierten Kapitelbilder. Eine Änderung hat keine Auswirkung auf existierende Dummy-Kapitel.", "SubtitleBlack": "Schwarz", "SubtitleBlue": "Blau", "SubtitleCyan": "Cyan", @@ -1715,10 +1715,10 @@ "SubtitleRed": "Rot", "SubtitleWhite": "Weiß", "SubtitleYellow": "Gelb", - "Featurette": "Hinter den Kulissen", + "Featurette": "Featurette", "Short": "Kurzfilm", "LabelParallelImageEncodingLimit": "Limit der parallelen Bildkodierung", - "LabelParallelImageEncodingLimitHelp": "Maximale Anzahl von Bildkodierungen, die parallel ausgeführt werden dürfen. Wenn Sie diesen Wert auf 0 lassen, wird ein Limit auf Grundlage der Kernanzahl Ihres Systems festgelegt.", + "LabelParallelImageEncodingLimitHelp": "Maximale Anzahl von Bildkodierungen, die parallel ausgeführt werden dürfen. Lässt Du diesen Wert leer, wird ein Limit auf Grundlage der Kernanzahl deines Systems festgelegt.", "HeaderPerformance": "Leistung", "LabelEnableAudioVbr": "Aktiviere Audiokodierung mit variabler Bitrate (VBR)", "LabelEnableAudioVbrHelp": "Eine variable Bitrate bietet bessere Qualität im Vergleich zu einer konstanten, kann jedoch in manchen Fällen zu Problemen beim Buffering und der Kompatibilität führen.", @@ -1730,7 +1730,7 @@ "UserMenu": "Benutzermenü", "Studio": "Studio", "AllowCollectionManagement": "Dieser Benutzer darf Sammlungen verwalten", - "PasswordRequiredForAdmin": "Für Admin Konten wird ein Passwort benötigt.", + "PasswordRequiredForAdmin": "Für Admin-Konten wird ein Passwort benötigt.", "LabelEnableLUFSScan": "LUFS-Scan aktivieren", "LabelSyncPlayNoGroups": "Keine Gruppen verfügbar", "LabelEnableLUFSScanHelp": "Clients können die Audio-Wiedergabe normalisieren, um die selbe Lautstärke für mehrere Stücke zu bekommen. Dies verlängert den Bibliotheks-Scan und benötigt mehr Ressourcen.", @@ -1742,7 +1742,7 @@ "HeaderConfirmRepositoryInstallation": "Plugin-Repository-Installation bestätigen", "LabelDeveloper": "Entwickler", "MessageRepositoryInstallDisclaimer": "WARNUNG: Eine Drittanbieterquelle für Plugins kann instabilen oder schadhaften Code beinhalten und kann sich zu jedem Zeitpunkt ändern. Bitte installiere nur Quellen von Autoren, denen du vertraust.", - "PleaseConfirmRepositoryInstallation": "Bitte klicke auf OK um zu bestätigen, dass du den obigen Text gelesen hast und mit Plugin-Quellen-Installation fortfahren willst.", + "PleaseConfirmRepositoryInstallation": "Bitte klicke auf OK um zu bestätigen, dass du obiges gelesen hast und mit Plugin-Repository-Installation fortfahren willst.", "Unknown": "Unbekannt", "LabelDate": "Datum", "LabelLevel": "Level", @@ -1757,7 +1757,7 @@ "LogLevel.None": "Nichts", "HeaderEpisodesStatus": "Episodenstatus", "AllowSegmentDeletion": "Segmente löschen", - "AllowSegmentDeletionHelp": "Alte Segmente löschen, nachdem sie vom Client heruntergeladen wurden. Damit muss nicht die gesamte transkodierte Datei auf der Festplatte zwischengespeichert werden. Deaktivieren Sie diese Option, wenn bei der Wiedergabe Probleme auftreten.", + "AllowSegmentDeletionHelp": "Alte Segmente löschen, nachdem sie vom Client heruntergeladen wurden. Damit muss nicht die gesamte transkodierte Datei auf der Festplatte zwischengespeichert werden. Deaktiviere diese Option, wenn bei der Wiedergabe Probleme auftreten.", "LabelThrottleDelaySeconds": "Drosseln nach", "LabelThrottleDelaySecondsHelp": "Zeit in Sekunden, nach der die Transkodierung gedrosselt wird. Muss groß genug sein, damit der Client einen gesunden Puffer aufrechterhalten kann. Funktioniert nur wenn \"Transkodierung drosseln\" aktiviert ist.", "LabelSegmentKeepSeconds": "Zeit, wie lange Segmente behalten werden", @@ -1768,7 +1768,7 @@ "ListView": "Listenansicht", "GoHome": "Startseite", "AiTranslated": "KI-übersetzt", - "MachineTranslated": "maschinenübersetzt", + "MachineTranslated": "Maschinenübersetzt", "AllowAv1Encoding": "Kodierung im AV1-Format erlauben", "LabelIsHearingImpaired": "Für Hörgeschädigte (SDH)", "LabelBackdropScreensaverInterval": "Hintergrund-Bildschirmschoner-Intervall", @@ -1777,16 +1777,16 @@ "HearingImpairedShort": "BaFa/SDH", "HeaderGuestCast": "Gast Stars", "LabelBackdropScreensaverIntervalHelp": "Die Zeit in Sekunden zwischen dem Wechsel verschiedener Hintergrundbilder im Bildschirmschoner.", - "SearchResultsEmpty": "Entschuldigung! Es konnten keine Ergebnisse für „{0}“ gefunden werden", + "SearchResultsEmpty": "Entschuldigung! Keine Ergebnisse für „{0}“ gefunden", "LabelTrackGain": "Titel Gain", - "SelectAudioNormalizationHelp": "Track Gain - passt die Lautstärke der einzelnen Tracks an, so dass sie mit der gleichen Lautstärke wiedergegeben werden. Albumverstärkung - passt nur die Lautstärke aller Titel eines Albums an, wobei der Dynamikbereich des Albums erhalten bleibt. Um zwischen „Aus“ und anderen Optionen zu wechseln, muss die aktuelle Wiedergabe neu gestartet werden.", - "LabelAlbumGain": "Albumlautstärke", + "SelectAudioNormalizationHelp": "Titel Gain - passt die Lautstärke der einzelnen Tracks an, damit sie mit der gleichen Lautstärke wiedergegeben werden. Album Gain - passt nur die Lautstärke aller Titel eines Albums an, wobei der Dynamikbereich des Albums erhalten bleibt. Um zwischen „Aus“ und anderen Optionen zu wechseln, muss die aktuelle Wiedergabe neu gestartet werden.", + "LabelAlbumGain": "Album Gain", "LabelSelectAudioNormalization": "Audio Normalisierung", "HeaderAllRecordings": "Alle Aufnahmen", "LabelBuildVersion": "Build-Version", "LabelServerVersion": "Server-Version", "LabelWebVersion": "Web-Version", - "ButtonEditUser": "Editiere Benutzer", + "ButtonEditUser": "Benutzer bearbeiten", "DlnaMovedMessage": "Die DLNA-Funktion wurde in ein Plugin verschoben.", "DeleteName": "Löschen {0}", "AllowSubtitleManagement": "Erlaube diesem Nutzer Untertitel zu bearbeiten", @@ -1804,18 +1804,18 @@ "BlockContentWithTagsHelp": "Medien mit mindestens einem der spezifizierten Tags verstecken.", "EnableLibrary": "Aktiviert die Bibliothek", "EnableLibraryHelp": "Mit dem deaktivieren der Bibliothek ist sie für keinen Benutzer mehr sichtbar.", - "PlaybackError.ASS_RENDER_ERROR": "Beim rendern der ASS/SSA Untertitel ist ein Fehler aufgetreten.", - "ConfirmDeleteSeries": "Das löschen dieser Serie wird alle {0} Folgen aus deiner Medienbibliothek und dem Dateisystem löschen. Bist du sicher das du fortfahren möchtest?", + "PlaybackError.ASS_RENDER_ERROR": "Beim Rendern der ASS/SSA-Untertitel ist ein Fehler aufgetreten.", + "ConfirmDeleteSeries": "Das Löschen dieser Serie wird alle {0} Folgen aus dem Dateisystem und von deiner Medienbibliothek löschen. Bist du sicher das du fortfahren möchtest?", "DeleteEntireSeries": "Lösche {0} Folgen", "DeleteSeries": "Lösche Serien", "DeleteEpisode": "Lösche Folge", - "HeaderDeleteSeries": "Lösche Serien", + "HeaderDeleteSeries": "Serien löschen", "LabelAllowContentWithTags": "Erlaube Einträge mit Tags", - "Lyric": "Songtext", - "LimitSupportedVideoResolution": "Limitiert die maximale Videoauflösung", + "Lyric": "Liedtext", + "LimitSupportedVideoResolution": "Maximale unterstützte Videoauflösung limitieren", "LabelEncodingFormatOptions": "Codierungsformat-Optionen", "EncodingFormatHelp": "Wähl die Videokodierung, in die Jellyfin transcodieren soll. Jellyfin wird die Softwarecodierung verwenden, wenn die Hardwarebeschleunigung für das ausgewählte Format nicht verfügbar ist. Die H264-Codierung wird immer aktiviert sein.", - "LimitSupportedVideoResolutionHelp": "Benutze \"Maximal erlaubte Auflösung der Videotranskodierung\" als maximal unterstützte Videoauflösung.", + "LimitSupportedVideoResolutionHelp": "\"Maximal erlaubte Auflösung der Videotranskodierung\" als maximal unterstützte Videoauflösung verwenden.", "AllowMjpegEncoding": "Codierung im MJPEG-Format zulassen (wird bei der Trickplay-Erstellung verwendet)", "Trickplay": "Trickplay", "LabelTrickplayAccel": "Hardware-Dekoder aktivieren", @@ -1836,48 +1836,48 @@ "LabelTileWidthHelp": "Maximale Anzahl von Bildern pro Kachel in X-Richtung.", "LabelTileHeight": "Kachelhöhe", "LabelTileHeightHelp": "Maximale Anzahl von Bildern pro Kachel in Y-Richtung.", - "LabelJpegQuality": "JPEG Qualität", + "LabelJpegQuality": "JPEG-Qualität", "LabelJpegQualityHelp": "Die JPEG-Komprimierungsqualität für Trickplay-Bilder.", "LabelQscale": "Qscale", "LabelQscaleHelp": "Die Qualitätsskala der von ffmpeg ausgegebenen Bilder, wobei 2 die höchste und 31 die niedrigste Qualität darstellt.", "ExtractTrickplayImagesHelp": "Trickplay-Bilder ähneln den Kapitelbildern, mit dem Unterschied, dass sie sich über die gesamte Länge des Inhalts erstrecken und beim Scrubbing von Videos als Vorschau angezeigt werden.", "LabelImageIntervalHelp": "Zeitintervall (ms) zwischen jedem neuen Trickplay Bild.", - "LabelTrickplayThreads": "FFmpeg Threads", + "LabelTrickplayThreads": "FFmpeg-Threads", "LabelTrickplayThreadsHelp": "Die Anzahl der Threads, die an das Argument '-threads' von ffmpeg übergeben wird.", "OptionExtractTrickplayImage": "Extrahieren von Trickplay-Bildern aktivieren", "LabelExtractTrickplayDuringLibraryScan": "Extrahieren von Trickplay-Bildern beim Scannen der Bibliothek", "LabelExtractTrickplayDuringLibraryScanHelp": "Trickplay-Bilder erzeugen, wenn Videos während der Bibliothekssuche importiert werden. Andernfalls werden sie während der geplanten Aufgabe \"Trickplay-Bilder\" extrahiert. Wenn die Generierung auf nicht blockierend eingestellt ist, hat dies keinen Einfluss auf die Zeit, die eine Bibliotheksüberprüfung dauert.", "EnableSmoothScroll": "Flüssiges Scrollen aktivieren", - "PlaybackError.MEDIA_NOT_SUPPORTED": "Die Wiedergabe ist fehlgeschlagen, weil die Medien von diesem Client nicht unterstützt wird.", + "PlaybackError.MEDIA_NOT_SUPPORTED": "Die Wiedergabe ist fehlgeschlagen, weil die Medien von diesem Client nicht unterstützt werden.", "PlaybackError.FATAL_HLS_ERROR": "Im HLS-Stream ist ein schwerwiegender Fehler aufgetreten.", "PlaybackError.MEDIA_DECODE_ERROR": "Die Wiedergabe ist aufgrund eines Fehlers bei der Dekodierung der Medien fehlgeschlagen.", "PlaybackError.NETWORK_ERROR": "Die Wiedergabe ist aufgrund eines Netzwerkfehlers fehlgeschlagen.", "PlaybackError.NO_MEDIA_ERROR": "Es konnte keine gültige Medienquelle für die Wiedergabe gefunden werden.", "PlaybackError.SERVER_ERROR": "Die Wiedergabe ist aufgrund eines Serverfehlers fehlgeschlagen.", "PlaybackError.NotAllowed": "Die Wiedergabe dieser Medien ist nicht erlaubt.", - "PlaybackError.RateLimitExceeded": "Dieses Medium kann derzeit aufgrund von Beschränkungen nicht abgespielt werden.", + "PlaybackError.RateLimitExceeded": "Diese Medien können derzeit aufgrund von Beschränkungen nicht abgespielt werden.", "PlaybackError.PLAYER_ERROR": "Die Wiedergabe ist aufgrund eines schwerwiegenden Player-Fehlers fehlgeschlagen.", "NonBlockingScan": "Non Blocking - reiht Erstellung ein, kehrt dann zurück", "BlockingScan": "Blocking - reiht Erstellung ein, blockiert Scan bis fertig", "LabelTrickplayAccelEncoding": "Hardwarebeschleunigte MJPEG-Enkodierung aktivieren", - "LabelTrickplayAccelEncodingHelp": "Derzeit nur auf QSV, VA-API, VideoToolbox und RKMPP verfügbar, diese Option hat keine Auswirkungen auf andere Methoden zur Hardwarebeschleunigung.", - "Lyrics": "Songtexte", - "ConfirmDeleteLyrics": "Das Löschen dieses Songtextes löscht die Datei vom Laufwerk und in deiner Medienbibliothek. Bist du wirklich sicher?", + "LabelTrickplayAccelEncodingHelp": "Derzeit nur auf QSV, VA-API, VideoToolbox und RKMPP verfügbar. Diese Option hat keine Auswirkungen auf andere Methoden zur Hardwarebeschleunigung.", + "Lyrics": "Liedtexte", + "ConfirmDeleteLyrics": "Das Löschen dieses Songtextes löscht die Datei vom Laufwerk und aus deiner Medienbibliothek. Bist du wirklich sicher?", "DeleteLyrics": "Songtexte löschen", "ErrorDeletingLyrics": "Es trat ein Fehler beim Löschen der Songtexte vom Server auf. Bitte stelle sicher, dass Jellyfin die notwendigen Zugriffsrechte besitzt.", "HeaderDeleteLyrics": "Songtexte löschen", - "HeaderNoLyrics": "Keine Songtexte gefunden", - "ViewLyrics": "Songtexte ansehen", + "HeaderNoLyrics": "Keine Liedtexte gefunden", + "ViewLyrics": "Liedtexte ansehen", "Author": "Autor", "CoverArtist": "Cover-Künstler", "Creator": "Ersteller", "Editor": "Bearbeiter", - "EnableTrueHdHelp": "Aktiviere diese Funktion nur, wenn dein Gerät TrueHD unterstützt oder an einen kompatiblen Audioreceiver angeschlossen ist. Andernfalls kann es zu Wiedergabefehlern kommen.", + "EnableTrueHdHelp": "Nur aktivieren, wenn dein Gerät TrueHD unterstützt oder an einen kompatiblen Audioreceiver angeschlossen ist. Andernfalls kann es zu Wiedergabefehlern kommen.", "EnableDts": "DTS zulassen (DCA)", - "EnableDtsHelp": "Aktiviere diese Funktion nur, wenn dein Gerät DTS unterstützt oder an einen kompatiblen Audioempfänger angeschlossen ist. Andernfalls kann es zu Wiedergabefehlern kommen.", - "EnableTrueHd": "TrueHD zulassen", + "EnableDtsHelp": "Aktiviere diese Funktion nur, wenn dein Gerät DTS unterstützt oder an einen kompatiblen Audioreceiver angeschlossen ist. Andernfalls kann es zu Wiedergabefehlern kommen.", + "EnableTrueHd": "TrueHD aktivieren", "Illustrator": "Illustrator", - "HeaderLyricDownloads": "Lyrik Downloads", + "HeaderLyricDownloads": "Liedtexte Downloads", "LabelSelectPreferredTranscodeVideoAudioCodec": "Bevorzugter Transcode-Audiocodec bei der Videowiedergabe", "Translator": "Übersetzer", "LibraryScanFanoutConcurrency": "Limit der Parallelen Aufgaben für das Scanen der Bibliotheken", @@ -1914,20 +1914,20 @@ "PluginUninstallError": "Beim Deinstallieren des Plugins ist ein Fehler aufgetreten.", "AndOtherArtists": "{0} und {1} andere Künstler.", "PasswordMissingSaveError": "Neues Passwort kann nicht leer sein.", - "SearchForLyrics": "Songtext suchen", + "SearchForLyrics": "Liedtext suchen", "EditLyrics": "Songtext bearbeiten", "HeaderAddLyrics": "Songtext hinzufügen", - "HeaderPreviewLyrics": "Songtextvorschau anzeigen", - "HeaderUploadLyrics": "Songtext hochladen", + "HeaderPreviewLyrics": "Liedtextvorschau anzeigen", + "HeaderUploadLyrics": "Liedtext hochladen", "LabelDuration": "Dauer", "LabelIsSynced": "Ist synchronisiert", - "NoLyricsSearchResultsFound": "Kein Songtext gefunden.", - "PreviewLyrics": "Songtextvorschau anzeigen", + "NoLyricsSearchResultsFound": "Kein Liedtext gefunden.", + "PreviewLyrics": "Liedtextvorschau anzeigen", "AllowTonemappingSoftwareHelp": "Tone-Mapping kann den Dynamikbereich eines Videos von HDR in SDR umwandeln und dabei Bilddetails und Farben beibehalten, die für die Darstellung der ursprünglichen Szene sehr wichtig sind. Funktioniert derzeit nur mit 10bit HDR10-,HLG- und DoVi-Videos.", "LabelTrickplayKeyFrameOnlyExtraction": "Nur Bilder von Schlüsselbildern erzeugen", "MoveToBottom": "Nach unten bewegen", "MoveToTop": "Nach oben bewegen", - "LabelDropLyricsHere": "Text hier ablegen, oder klicke zum Durchsuchen.", + "LabelDropLyricsHere": "Text hier ablegen, oder klicken zum Durchsuchen.", "LabelTrickplayKeyFrameOnlyExtractionHelp": "Extrahiert nur Schlüsselbilder für eine deutlich schnellere Verarbeitung mit weniger genauem Timing. Wenn der konfigurierte Hardware-Decoder diesen Modus nicht unterstützt, wird stattdessen der Software-Decoder verwendet.", "Reset": "Zurücksetzen", "LibraryInvalidItemIdError": "Die Bibliothek ist in einem ungültigen Zustand und kann nicht verändert werden. Dies ist möglicherweise ein Bug: Der Pfad in der Datenbank ist nicht der richtige Pfad im Dateisystem.", @@ -1935,22 +1935,22 @@ "EnableHi10p": "H.264 High 10 Profil aktivieren", "EnableHi10pHelp": "Aktivieren, um die Transkodierung von H.264-Videos zu verhindern. Deaktivieren, wenn die Videos nur leere Frames zeigen.", "LabelDisableVbrAudioEncoding": "VBR-Audiocodierung deaktivieren", - "AlwaysRemuxFlacAudioFilesHelp": "Wenn du Dateien hast, welche dein Browser verweigert abzuspielen oder ungenaue Zeitstempel berechnet, aktiviere diese Behelfslösung.", + "AlwaysRemuxFlacAudioFilesHelp": "Wenn du Dateien hast, welche dein Browser nicht abspielt oder bei denen ungenaue Zeitstempel berechnet werden, aktiviere diese Behelfslösung.", "AlwaysRemuxMp3AudioFilesHelp": "Wenn du Dateien hast, bei welchen dein Browser ungenaue Zeitstempel berechnet, aktiviere diese Behelfslösung.", - "DisableVbrAudioEncodingHelp": "Verhindern Sie, dass der Server Audio mit VBR für diesen Client kodiert.", + "DisableVbrAudioEncodingHelp": "Verhindern, dass der Server Audio mit VBR für diesen Client kodiert.", "HeaderAudioAdvanced": "Erweiterter Ton", - "LabelAlwaysRemuxFlacAudioFiles": "FLAC-Audiodateien immer wieder neu mischen", - "LabelAlwaysRemuxMp3AudioFiles": "MP3-Audiodateien immer wieder neu mischen", + "LabelAlwaysRemuxFlacAudioFiles": "FLAC-Audiodateien immer remuxen", + "LabelAlwaysRemuxMp3AudioFiles": "MP3-Audiodateien immer remuxen", "LabelAllowFmp4TranscodingContainer": "fMP4-Transkodierungscontainer zulassen", "FallbackMaxStreamingBitrateHelp": "Die maximale Streaming-Bitrate wird als Fallback verwendet, wenn ffprobe die Bitrate des Quellstreams nicht ermitteln kann. Dadurch wird verhindert, dass Clients eine zu hohe Transcodierungs-Bitrate anfordern, was zu einem Ausfall des Players und einer Überlastung des Encoders führen könnte.", - "AllowFmp4TranscodingContainerHelp": "Erlauben Sie den fMP4-Transcodierungscontainer für diesen Tuner, um HEVC- und HDR-Inhalte zu aktivieren. Nicht alle Tuner sind mit diesem Container kompatibel. Deaktivieren Sie dies, wenn bei der Wiedergabe Probleme auftreten.", + "AllowFmp4TranscodingContainerHelp": "Erlauben Sie den fMP4-Transcodierungscontainer für diesen Tuner, um HEVC- und HDR-Inhalte zu aktivieren. Nicht alle Tuner sind mit diesem Container kompatibel. Deaktiviere dies, wenn bei der Wiedergabe Probleme auftreten.", "AllowStreamSharingHelp": "Erlauben Sie Jellyfin, den MPEG-Stream vom Tuner zu duplizieren und diesen duplizierten Stream an seine Clients weiterzugeben. Dies ist nützlich, wenn der Tuner eine Gesamtstreamanzahlbegrenzung hat, kann aber auch zu Wiedergabeproblemen führen.", "RenderPgsSubtitleHelp": "Legen Sie fest, ob der Client PGS-Untertitel rendern soll, anstatt eingebaute Untertitel zu verwenden. Dadurch kann eine serverseitige Transkodierung vermieden und die clientseitige Rendering-Leistung verbessert werden.", "LabelAllowStreamSharing": "Stream-Sharing zulassen", "LabelFallbackMaxStreamingBitrate": "Maximale Fallback-Stream-Bitrate (Mbps)", "VideoCodecTagNotSupported": "Das Video-Codec-Tag wird nicht unterstützt", - "LabelLyricDownloaders": "Songtext-Downloader", - "LyricDownloadersHelp": "Aktivieren und ordnen Sie Ihre bevorzugten Songtext-Downloader nach der Priorität.", + "LabelLyricDownloaders": "Liedtext-Downloader", + "LyricDownloadersHelp": "Aktivieren und ordnen Sie Ihre bevorzugten Liedtext-Downloader nach der Priorität.", "ReplaceTrickplayImages": "Ersetzen vorhandener Trickplay-Bilder", "LabelSaveTrickplayLocally": "Trickplay-Bilder bei den Medien speichern", "LabelSaveTrickplayLocallyHelp": "Wenn Sie Trickplay-Bilder in Medienordnern speichern, werden sie bei Ihren Medien abgelegt und ermöglichen so eine einfache Migration und den Zugriff.", @@ -1976,8 +1976,8 @@ "HeaderMediaSegmentActions": "Medien-Segmentierungs-Aktionen", "HeaderNewPlaylist": "Neue Wiedergabeliste", "LabelMediaSegmentsType": "{0} Segmente", - "LabelQsvDevice": "QSV Gerät", - "LabelQsvDeviceHelp": "Wählt das Gerät für Intel QSV auf einem multi-GPU System aus. Unter Linux ist dies der Renderknoten, z.B. /dev/dri/renderD128. Unter Windows ist dies der Geräte-Index, beginnend bei 0. Leerlassen, außer du weißt was du tust.", + "LabelQsvDevice": "QSV-Gerät", + "LabelQsvDeviceHelp": "Wählt das Gerät für Intel QSV auf einem Multi-GPU System aus. Unter Linux ist dies der Renderknoten, z.B. /dev/dri/renderD128. Unter Windows ist dies der Geräte-Index, beginnend bei 0. Leerlassen, außer du weißt was du tust.", "MediaSegmentAction.None": "Keine", "MediaSegmentAction.Skip": "Überspringen", "MediaSegmentType.Commercial": "Werbung", @@ -1994,14 +1994,14 @@ "HeaderNextVideo": "Nächstes Video", "LabelMediaSegmentProviders": "Mediensegment Providers", "MediaSegmentProvidersHelp": "Aktiviere und Ordne die Mediensegmentanbieter in einer Benutzerdefinierten Reihenfolge.", - "CustomSubtitleStylingHelp": "Dieser Modus wechselt je nach Gerätetyp automatisch zwischen den nativen und benutzerdefinierten Untertitel-Styling-Mechanismen.", + "CustomSubtitleStylingHelp": "Untertitle-Stile funktionieren auf den meisten Geräten, sind aber mit zusätzlichem Leistungsmehraufwand verbunden.", "LabelSubtitleStyling": "Untertitelstil", "Native": "Nativ", "NativeSubtitleStylingHelp": "Das Untertitel-Styling funktioniert auf einigen Geräten nicht. Allerdings ist damit kein Leistungsaufwand verbunden.", "AutoSubtitleStylingHelp": "In diesem Modus wird je nach Gerätetyp automatisch zwischen dem nativen und dem benutzerdefinierten Untertitel-Styling umgeschaltet.", "Custom": "benutzerdefiniert", "LibraryNameInvalid": "Der Bibliotheksname darf nicht leer sein.", - "DeleteServerConfirmation": "Bist du sicher, dass du diesen Server löschen möchtest?", + "DeleteServerConfirmation": "Bist du sicher, dass du diesen Server löschen willst?", "LabelDevice": "Gerät", "LastActive": "Zuletzt aktiv", "CopyLogSuccess": "Protokollinhalte erfolgreich kopiert.", @@ -2011,20 +2011,59 @@ "DisplayLoadError": "Ein Fehler trat während des Ladens der Konfigurationsdaten auf.", "MetadataImagesLoadError": "Einstellungen für Metadaten konnten nicht geladen werden", "HeaderPageNotFound": "Seite nicht gefunden", - "PageNotFound": "Dies ist nicht die Seite, die Sie suchen.", + "PageNotFound": "Dies ist nicht die Seite, die du suchst.", "SettingsPageLoadError": "Einstellungsseite konnte nicht geladen werden", "StreamCountExceedsLimit": "Die Anzahl der Streams überschreitet das Limit", "RetryWithGlobalSearch": "Erneuter Versuch mit einer globalen Suche", "CustomSplashScreenSize": "Benutzerdefinierte Bilder sollten das Seitenverhältnis 16x9 und eine Mindestgröße von 1920x1080 haben.", "DeleteCustomImage": "Benutzerdefiniertes Bild gelöscht", - "LabelGroupShowsIntoCollectionsHelp": "Serien in einer Sammlung werden als ein gruppiertes Element bei der Anzeige von Serienlisten dargestellt.", + "LabelGroupShowsIntoCollectionsHelp": "Serien in einer Sammlung werden bei der Anzeige von Serienlisten als ein gruppiertes Element dargestellt.", "ImageDeleteFailed": "Bild konnte nicht gelöscht werden", "LabelGroupShowsIntoCollections": "Serien in Kollektionen gruppieren", - "UploadCustomImage": "Benutzerdefinitiertes Bild hochladen", + "UploadCustomImage": "Benutzerdefiniertes Bild hochladen", "ReadInputAtNativeFramerateHelp": "Durch Aktivieren dieser Option können Probleme wie das vorzeitige Stoppen von Live-Streams behoben werden.", "LimitSegmentLength": "Kürzere HLS-Segmente verwenden", "LimitSegmentLengthHelp": "Durch Aktivieren dieser Option kann verhindert werden, dass der HLS-Player während der Suche auf bestimmten Geräten, beispielsweise webOS-Fernsehern, hängen bleibt.", "ImageUploadCancelled": "Bild hochladen abgebrochen", "ImageUploadFailed": "Bild hochladen fehlgeschlagen", - "ReadInputAtNativeFramerate": "Eingabe mit nativer Framerate lesen" + "ReadInputAtNativeFramerate": "Eingabe mit nativer Framerate lesen", + "HeaderUpdateRequired": "Update erforderlich", + "HeaderServerUnavailable": "Server nicht verfügbar", + "ViewSettings": "Einstellungen anzeigen", + "MessageForgotPasswordPinReset": "Gib hier die PIN ein, um das Zurücksetzen des Passworts abzuschließen", + "DownloadManager": "Downloads", + "Create": "Erstellen", + "HeaderBackupsHelp": "Snapshots des Servers erstellen und wiederherstellen. Die Snapshots können die Datenbank, Metadaten, Untertitel und Trickplay enthalten.", + "LabelBackupsUnavailable": "Keine Backups verfügbar", + "LabelDatabase": "Datenbank", + "MessageBackupDisclaimer": "Je nach Größe der Bibliothek kann der Backup-Vorgang eine Weile dauern.", + "MessageBackupInProgress": "Backup läuft", + "MessageRestoreDisclaimer": "WARNUNG: Du bist dabei, eine frühere Sicherung wiederherzustellen. Der Server wird für die Dauer des Vorgangs nicht nutzbar sein und alle neuen Daten, die seit der Sicherung erstellt wurden, gehen verloren.", + "MessageRestoreInProgress": "Wiederherstellung läuft", + "MessageRestoreSuccess": "Wiederherstellung erfolgreich abgeschlossen", + "MessageWaitingForServer": "Warte auf Server...", + "Success": "Erfolgreich", + "HeaderBackups": "Backups", + "LabelImageCache": "Bild-Cache", + "StorageType.CDRom": "CD-ROM", + "StorageType.NoRootDirectory": "Kein Root-Verzeichnis", + "BackupsPageLoadError": "Laden der Backup Seite fehlgeschlagen", + "ButtonCreateBackup": "Backup erstellen", + "LabelProgramData": "Programmdaten", + "LabelRestore": "Wiederherstellen", + "StorageType.Fixed": "Fest", + "StorageType.Network": "Netzwerk", + "StorageType.Ram": "Arbeitsspeicher", + "StorageType.Removable": "Wechselmedium", + "StorageType.Unknown": "Unbekannt", + "RepositoriesPageLoadError": "Repositories konnten nicht geladen werden", + "PluginsLoadError": "Beim Laden der Plugins ist ein Fehler aufgetreten.", + "ButtonLearnMore": "Mehr erfahren", + "TranscodingLoadError": "Transcodierungseinstellungen konnten nicht geladen werden", + "ConfirmDeleteRepository": "Repository löschen?", + "DeleteRepositoryConfirmation": "Sind Sie sicher, dass Sie dieses Repository löschen wollen?", + "LiveTVPageLoadError": "Aufzeichnungsseite konnte nicht geladen werden", + "MessageServerMismatch": "Der Server mit dem Du dich verbindest, ist nicht der selbe, wie der, mit dem Du zuletzt unter dieser Adresse verbunden warst. Wenn das so sein soll, wähle \"Trotzdem verbinden\". Ansonsten könnte es sein, dass Deine Verbindung oder der Server kompromittiert wurde.", + "ConnectAnyway": "Trotzdem verbinden", + "HeaderServerMismatch": "Server nicht übereinstimmend" } diff --git a/src/strings/el.json b/src/strings/el.json index 788d021a7..7c8c2927a 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -66,7 +66,7 @@ "ButtonParentalControl": "Γονικός έλεγχος", "ButtonPause": "Παύση", "ButtonPreviousTrack": "Προηγούμενο", - "ButtonQuickStartGuide": "Οδηγός Γρήγορης Εκκίνησης", + "ButtonQuickStartGuide": "Οδηγός Ρύθμισης", "ButtonRefreshGuideData": "Ανανέωση Δεδομένων Οδηγού", "ButtonRemove": "Κατάργηση", "ButtonRename": "Μετονομασία", @@ -864,7 +864,7 @@ "SeriesYearToPresent": "{0} - Εώς σήμερα", "ServerNameIsRestarting": "Ο διακομιστής {0} επανεκκινείται.", "ServerNameIsShuttingDown": "Ο διακομιστής {0} τερματίζεται.", - "ServerRestartNeededAfterPluginInstall": "Θα πρέπει να γίνει επανεκκίνηση του Jellyfin μετά την εγκατάσταση ενός plugin.", + "ServerRestartNeededAfterPluginInstall": "Θα πρέπει να γίνει επανεκκίνηση του Jellyfin μετά την εγκατάσταση του plugin.", "ServerUpdateNeeded": "Αυτός ο server πρέπει να ενημερωθεί. Για να κάνετε λήψη της τελευταίας έκδοσης, επισκεφθείτε την {0}", "Settings": "Ρυθμίσεις", "SettingsSaved": "Οι ρυθμίσεις αποθηκεύτηκαν.", @@ -924,7 +924,7 @@ "ThemeSongs": "Θεματικά τραγούδια", "ThemeVideos": "Θεματικά βίντεο", "TheseSettingsAffectSubtitlesOnThisDevice": "Αυτές οι ρυθμίσεις επηρεάζουν τους υπότιτλους αυτής της συσκευής", - "ThisWizardWillGuideYou": "Αυτός ο οδηγός θα σας καθοδηγήσει στη διαδικασία εγκατάστασης. Για να ξεκινήσετε, παρακαλούμε επιλέξτε τη γλώσσα που προτιμάτε.", + "ThisWizardWillGuideYou": "Αυτός ο οδηγός θα σας βοηθήσει να ολοκληρώσετε την εγκατάσταση. Για να ξεκινήσετε, παρακαλούμε επιλέξτε τη γλώσσα που προτιμάτε.", "Thursday": "Πέμπτη", "TitleHardwareAcceleration": "Επιτάχυνση υλικού", "TitlePlayback": "Αναπαραγωγή", @@ -1304,7 +1304,7 @@ "LabelSyncPlaySettingsSpeedToSyncHelp": "Μέθοδος διόρθωσης συγχρονισμού που συνίσταται στην επιτάχυνση της αναπαραγωγής. Η διόρθωση συγχρονισμού πρέπει να είναι ενεργοποιημένη.", "LabelSyncPlaySettingsSkipToSyncHelp": "Μέθοδος διόρθωσης συγχρονισμού που συνίσταται στην αναζήτηση της εκτιμώμενης θέσης. Η διόρθωση συγχρονισμού πρέπει να είναι ενεργοποιημένη.", "LabelTonemappingDesatHelp": "Εφαρμόστε αποκορεσμό για τονισμένα σημεία που υπερβαίνουν αυτό το επίπεδο φωτεινότητας. Οι συνιστώμενη τιμή είναι 0 (απενεργοποίηση).", - "LabelTonemappingParamHelp": "Συντονίστε τον αλγόριθμο χαρτογράφησης τόνου. Οι συνιστώμενες και προεπιλεγμένες τιμές είναι NaN. Γενικά αφήστε το κενό.", + "LabelTonemappingParamHelp": "Συντονίστε τον αλγόριθμο χαρτογράφησης τόνου. Γενικά αφήστε το κενό.", "LabelTonemappingPeakHelp": "Παράκαμψη τιμής ενσωματωμένων μεταδεδομένων για ένα σήμα εισόδου με αυτή τη τιμή κορυφής. Οι προεπιλεγμένη τιμή είναι 100 (1000nit).", "LabelTonemappingThresholdHelp": "Οι παράμετροι του αλγορίθμου χαρτογράφησης τόνου ρυθμίζονται με ακρίβεια ανά σκηνή. Και χρησιμοποιείται ένα κατώφλι για να ανιχνεύσει εάν η σκηνή έχει αλλάξει ή όχι. Εάν η απόσταση μεταξύ της τρέχουσας μέσης φωτεινότητας του καρέ και του τρέχοντος μέσου όρου λειτουργίας υπερβαίνει μια τιμή κατωφλίου, θα υπολογίσουμε εκ νέου τη μέση φωτεινότητα της σκηνής και τη μέγιστη φωτεινότητα. Οι συνιστώμενες και προεπιλεγμένες τιμές είναι 0,8 και 0,2.", "LabelTranscodingProgress": "Πρόοδος διακωδικοποίησης", @@ -1548,7 +1548,7 @@ "NoCreatedLibraries": "Φαίνεται ότι δεν έχετε δημιουργήσει ακόμη βιβλιοθήκες. {0}Θα θέλατε να δημιουργήσετε μια τώρα;{1}", "OnWakeFromSleep": "Ξυπνώντας από τον ύπνο", "LabelServerHost": "Host", - "Rate": "βαθμός", + "Rate": "Ρυθμός", "LabelTypeMetadataDownloaders": "Λήπτες μεταδεδόμενων ({0})", "MediaInfoContainer": "Δοχείο", "MediaInfoExternal": "Εξωτερικό", @@ -1656,9 +1656,9 @@ "Clip": "Featurette", "Interview": "Συνέντευξη", "EnableSplashScreen": "Ενεργοποιήστε την οθόνη εκκίνησης", - "LabelVppTonemappingBrightnessHelp": "Εφαρμόστε κέρδος φωτεινότητας στη χαρτογράφηση τόνου VPP. Τόσο οι προτεινόμενες όσο και οι προεπιλεγμένες τιμές είναι 0.", + "LabelVppTonemappingBrightnessHelp": "Εφαρμόστε κέρδος φωτεινότητας στη χαρτογράφηση τόνου VPP. Η προτεινόμενη τιμή είναι 16.", "LabelVppTonemappingContrast": "Κέρδος αντίθεσης αντιστοίχισης τόνου VPP", - "LabelVppTonemappingContrastHelp": "Εφαρμόστε κέρδος αντίθεσης στη χαρτογράφηση τόνου VPP. Οι προτεινόμενες και προεπιλεγμένες τιμές είναι 1,2 και 1.", + "LabelVppTonemappingContrastHelp": "Εφαρμόστε κέρδος αντίθεσης στη χαρτογράφηση τόνου VPP. Η προτεινόμενη τιμή είναι 1.", "MediaInfoDvProfile": "Προφίλ DV", "MediaInfoRpuPresentFlag": "Προκαθορισμένη σημαία DV rpu", "MediaInfoBlPresentFlag": "Προκαθορισμένη σημαία DV bl", @@ -1691,7 +1691,7 @@ "LabelParallelImageEncodingLimit": "Οριο παράλληλης κωδικοποίησης εικόνων", "HeaderRecordingMetadataSaving": "Καταγραφή Μεταδεδομένων", "HeaderPerformance": "Επίδοση", - "LabelDummyChapterDurationHelp": "Το διάστημα ανάμεσα στα ψεύτικα κεφάλαια. Ορισμός σε 0 για την απενεργοποίηση παραγωγής ψεύτικων κεφαλαίων. Η μεταβολή αυτού δεν θα έχει επίδραση στα ήδη υπάρχοντα ψεύτικα κεφάλαια.", + "LabelDummyChapterDurationHelp": "Το διάστημα ανάμεσα στα ψεύτικα κεφάλαια σε δευτερόλεπτα. Ορίστε το σε 0 για την απενεργοποίηση δημιουργίας ψεύτικων κεφαλαίων. Η αλλαγή της ρύθμισης δεν θα έχει επίδραση στα ήδη υπάρχοντα ψεύτικα κεφάλαια.", "HeaderDummyChapter": "Εικόνες Κεφαλαίου", "LabelDummyChapterCount": "Όριο", "LabelDummyChapterCountHelp": "Ο μέγιστος αριθμός εικόνων κεφαλαίου που θα εξαχθεί για κάθε αρχείο πολυμέσων.", @@ -1709,7 +1709,7 @@ "LabelSegmentKeepSeconds": "Χρόνος που θα κρατηθούν τα τμήματα", "BackdropScreensaver": "Φόντο προφύλαξης οθόνης", "GridView": "Προβολή Πλέγματος", - "LabelBackdropScreensaverInterval": "Διάστημα Φόντου Προφύλαξης Οθόνης", + "LabelBackdropScreensaverInterval": "Διάρκεια Προφύλαξης Οθόνης", "LabelBackdropScreensaverIntervalHelp": "Ο χρόνος σε δευτερόλεπτα μεταξύ διαφορετικών φόντων όταν χρησιμοποιείται το φόντο προφύλαξης οθόνης.", "LabelEnableLUFSScan": "Ενεργοποίηση σάρωσης LUFS", "LabelMediaDetails": "Λεπτομέρειες πολυμέσων", @@ -1971,5 +1971,67 @@ "DeleteCustomImage": "Διαγραφή προσαρμοσμένης εικόνας", "ImageDeleteFailed": "Η διαγραφή εικόνας απέτυχε", "ImageUploadCancelled": "Η φόρτωση της εικόνας ακυρώθηκε", - "ImageUploadFailed": "Η φόρτωση της εικόνας απέτυχε" + "ImageUploadFailed": "Η φόρτωση της εικόνας απέτυχε", + "LimitSegmentLength": "Χρήση μικρότερων τμημάτων HLS", + "PreferNonstandardArtistsTag": "Προτίμηση της ετικέτας ARTISTS εάν είναι διαθέσιμη", + "Penciller": "Στυλογράφος", + "Native": "Εγγενές", + "SaveRecordingImages": "Αποθήκευση εικόνων εγγραφής EPG", + "StreamCountExceedsLimit": "Ο αριθμός των ροών υπερβαίνει το όριο", + "RetryWithGlobalSearch": "Επανάληψη με συνολική αναζήτηση", + "SaveLyricsIntoMediaFoldersHelp": "Η αποθήκευση των στίχων μαζί με τα αρχεία ήχου θα επιτρέψει την ευκολότερη διαχείρισή τους.", + "SaveRecordingNFOHelp": "Αποθήκευση μεταδεδομένων από τον πάροχο καταλόγων EPG μαζί με τα μέσα ενημέρωσης.", + "UploadCustomImage": "Ανέβασμα προσαρμοσμένης εικόνας", + "Translator": "Μεταφραστής", + "UseCustomTagDelimiters": "Χρήση προσαρμοσμένου διαχωριστικού ετικέτας", + "Regional": "Περιφερειακή", + "SaveLyricsIntoMediaFolders": "Αποθήκευση στίχων σε φακέλους πολυμέσων", + "SearchForLyrics": "Αναζήτηση στίχων", + "Studio": "Στούντιο", + "SaveRecordingImagesHelp": "Αποθήκευση εικόνων από τον πάροχο καταλόγων EPG μαζί με τα μέσα ενημέρωσης.", + "PriorityHigh": "Υψηλή", + "ReadInputAtNativeFramerateHelp": "Ενεργοποιώντας αυτή την επιλογή μπορεί να επιλύσει κάποια προβλήματα, π.χ. πρόωρη διακοπή των ζωντανών μεταδόσεων.", + "HeaderServerUnavailable": "Διακομιστής μη διαθέσιμος", + "LabelScanBehavior": "Συμπεριφορά σάρωσης", + "PriorityNormal": "Κανονική", + "LabelJpegQuality": "Ποιότητα JPEG", + "PreferNonstandardArtistsTagHelp": "Χρησιμοποιήστε τη μη τυποποιημένη ετικέτα ARTISTS αντί της ετικέτας ARTIST όταν είναι διαθέσιμη.", + "LogLoadFailure": "Αποτυχία στη φόρτωση του αρχείου συμβάντων. Το αρχείο μπορεί να είναι ακόμα υπό επεξεργασία.", + "VideoCodecTagNotSupported": "Η ετικέτα κωδικοποίησης βίντεο δεν υποστηρίζεται", + "LimitSegmentLengthHelp": "Η ενεργοποίηση αυτής της επιλογής μπορεί να βοηθήσει στην αποτροπή κολλήματος του προγράμματος αναπαραγωγής HLS κατά την αναζήτηση σε ορισμένες συσκευές, όπως οι τηλεοράσεις webOS.", + "LabelQscale": "Qscale", + "HeaderUpdateRequired": "Απαιτείται ενημέρωση", + "ReadInputAtNativeFramerate": "Ανάγνωση εισόδου σε εγγενή ρυθμό καρέ", + "DownloadManager": "Λήψεις", + "LabelBackupsUnavailable": "Δεν υπάρχουν διαθέσιμα αντίγραφα ασφαλείας", + "MessageForgotPasswordPinReset": "Εισάγετε το PIN εδώ για να ολοκληρώσετε την επαναφορά κωδικού πρόσβασης", + "MessageRestoreDisclaimer": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Θα επαναφέρετε ένα προηγούμενο αντίγραφο ασφαλείας. Ο διακομιστής σας δεν θα λειτουργεί για όσο διαρκεί η διαδικασία επαναφοράς, και όλα τα δεδομένα που δημιουργήθηκαν μετά την δημιουργία του αντίγραφου ασφαλείας θα χαθούν.", + "PluginsLoadError": "Ένα σφάλμα συνέβη κατά την φόρτωση των προσθέτων.", + "StorageType.NoRootDirectory": "Δεν υπάρχει ριζικός κατάλογος", + "LiveTVPageLoadError": "Αποτυχία φόρτωσης σελίδας καταγραφών", + "MessageRestoreSuccess": "Η επαναφορά ολοκληρώθηκε επιτυχώς", + "RepositoriesPageLoadError": "Αποτυχία φόρτωσης αποθετηρίων", + "ButtonLearnMore": "Μάθετε περισσότερα", + "LabelImageCache": "Κρυφή μνήμη εικόνων", + "StorageType.CDRom": "CD-ROM", + "StorageType.Fixed": "Σταθερός", + "StorageType.Network": "Δίκτυο", + "StorageType.Ram": "RAM", + "StorageType.Unknown": "Άγνωστος", + "Success": "Επιτυχία", + "TranscodingLoadError": "Αποτυχία φόρτωσης ρυθμίσεων διακωδικοποίησης", + "BackupsPageLoadError": "Αποτυχία φόρτωσης σελίδας αντιγράφων ασφαλείας", + "ButtonCreateBackup": "Δημιουργία αντίγραφου ασφαλείας", + "Create": "Δημιουργία", + "LabelDatabase": "Βάση δεδομένων", + "LabelRestore": "Επαναφορά", + "MessageBackupDisclaimer": "Ανάλογα με το μέγεθος της βιβλιοθήκης σας, η διαδικασία δημιουργίας αντιγράφων ασφαλείας μπορεί να διαρκέσει πολύ ώρα.", + "MessageBackupInProgress": "Δημιουργία αντιγράφων ασφαλείας σε εξέλιξη", + "MessageWaitingForServer": "Αναμονή για τον διακομιστή...", + "HeaderBackups": "Αντίγραφα ασφαλείας", + "ConfirmDeleteRepository": "Διαγραφή αποθετηρίου;", + "DeleteRepositoryConfirmation": "Είστε σίγουροι ότι θέλετε να σβήσετε αυτό το αποθετήριο;", + "HeaderBackupsHelp": "Δημιουργήστε και επαναφέρετε στιγμιότυπα του διακομιστή σας, τα οποία μπορεί να περιλαμβάνουν τη βάση δεδομένων, τα μεταδεδομένα, τους υποτίτλους και το Trickplay.", + "LabelProgramData": "Δεδομένα προγράμματος", + "MessageRestoreInProgress": "Επαναφορά σε εξέλιξη" } diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index 9fd676af1..bbaaccdd5 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -398,7 +398,7 @@ "TitleHostingSettings": "Hosting Settings", "TitleHardwareAcceleration": "Hardware Acceleration", "Thursday": "Thursday", - "ThisWizardWillGuideYou": "This wizard will help guide you through the setup process. To begin, please select your preferred language.", + "ThisWizardWillGuideYou": "This wizard will help guide you through the setup process. To begin, please enter a server name and select your preferred language.", "TheseSettingsAffectSubtitlesOnThisDevice": "These settings affect subtitles on this device", "TabServer": "Server", "TabScheduledTasks": "Scheduled Tasks", @@ -1490,8 +1490,8 @@ "RemuxHelp2": "Re-mux uses very little processing power with a completely lossless media quality.", "RemuxHelp1": "The media is in an incompatible file container (MKV, AVI, WMV, etc) but both the video stream and audio stream are compatible with the device. The media will be repackaged losslessly on the fly before being sent to the device.", "Remuxing": "Re-muxing", - "AspectRatioFill": "Fill", - "AspectRatioCover": "Cover", + "AspectRatioFill": "Stretch", + "AspectRatioCover": "Zoom", "SyncPlayGroupDefaultTitle": "{0}'s group", "PluginFromRepo": "{0} from repository {1}", "MessageSyncPlayIsDisabled": "Permission required to use Sync Play.", @@ -1651,7 +1651,7 @@ "Digital": "Digital", "MessageUnauthorizedUser": "You are not authorized to access the server at this time. Please contact your server administrator for more information.", "EnableEnhancedNvdecDecoderHelp": "Enhanced NVDEC implementation, disable this option to use CUVID if you encounter decoding errors.", - "EnableSplashScreen": "Enable the splash screen", + "EnableSplashScreen": "Enable the splash screen image", "Bold": "Bold", "HomeVideosPhotos": "Home Videos and Photos", "MediaInfoDvBlSignalCompatibilityId": "DV bl signal compatibility id", @@ -2013,5 +2013,21 @@ "PageNotFound": "This is not the page you are looking for.", "MetadataImagesLoadError": "Failed to load metadata settings", "SettingsPageLoadError": "Failed to load settings page", - "RetryWithGlobalSearch": "Retry with a global search" + "RetryWithGlobalSearch": "Retry with a global search", + "CustomSplashScreenSize": "Custom images should be in a 16x9 aspect ratio at a minimum size of 1920x1080.", + "ImageDeleteFailed": "Image deletion failed", + "ImageUploadCancelled": "Image upload cancelled", + "LabelGroupShowsIntoCollections": "Group shows into collections", + "LabelGroupShowsIntoCollectionsHelp": "Shows in a collection will be displayed as one grouped item when displaying show lists.", + "ReadInputAtNativeFramerate": "Read input at native frame rate", + "StreamCountExceedsLimit": "The number of streams exceeds the limit", + "LimitSegmentLength": "Use shorter HLS segments", + "LimitSegmentLengthHelp": "Enabling this option may help prevent the HLS player from hanging during seeking on certain devices, such as webOS TVs.", + "ReadInputAtNativeFramerateHelp": "Enabling this option may resolve some issues, e.g. live streams stopping prematurely.", + "DeleteCustomImage": "Delete Custom Image", + "ImageUploadFailed": "Image upload failed", + "UploadCustomImage": "Upload Custom Image", + "ViewSettings": "View settings", + "HeaderServerUnavailable": "Server Unavailable", + "HeaderUpdateRequired": "Update Required" } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 21e3491bf..9dd457388 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -76,6 +76,7 @@ "Backdrop": "Backdrop", "Backdrops": "Backdrops", "BackdropScreensaver": "Backdrop Screensaver", + "BackupsPageLoadError": "Failed to load backups page", "Banner": "Banner", "BirthDateValue": "Born: {0}", "BirthLocation": "Birth location", @@ -104,12 +105,14 @@ "ButtonCast": "Cast to Device", "ButtonChangeServer": "Change Server", "ButtonClose": "Close", + "ButtonCreateBackup": "Create Backup", "ButtonEditOtherUserPreferences": "Edit this user's profile, image and personal preferences.", "ButtonEditUser": "Edit user", "ButtonForgotPassword": "Forgot Password", "ButtonFullscreen": "Fullscreen", "ButtonGotIt": "Got It", "ButtonInfo": "Info", + "ButtonLearnMore": "Learn More", "ButtonLibraryAccess": "Library access", "ButtonManualLogin": "Manual Login", "ButtonMore": "More", @@ -119,7 +122,7 @@ "ButtonPause": "Pause", "ButtonPlayer": "Player", "ButtonPreviousTrack": "Previous track", - "ButtonQuickStartGuide": "Quick Start Guide", + "ButtonQuickStartGuide": "Setup Guide", "ButtonRefreshGuideData": "Refresh Guide Data", "ButtonRemove": "Remove", "ButtonRename": "Rename", @@ -177,9 +180,11 @@ "ConfirmDeleteSeries": "Deleting this series will delete ALL {0} episodes from both the file system and your media library. Are you sure you wish to continue?", "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", "ConfirmDeleteLyrics": "Deleting these lyrics will delete them from both the file system and your media library. Are you sure you wish to continue?", + "ConfirmDeleteRepository": "Delete repository?", "ConfirmDeletion": "Confirm Deletion", - "ConfirmEndPlayerSession": "Would you like to shutdown Jellyfin on {0}?", + "ConfirmEndPlayerSession": "Would you like to shut Jellyfin down on {0}?", "Connect": "Connect", + "ConnectAnyway": "Connect Anyway", "Console": "Console", "ContinueWatching": "Continue watching", "Continuing": "Continuing", @@ -190,6 +195,7 @@ "CopyStreamURLSuccess": "URL copied successfully.", "CopyLogSuccess": "Log contents copied successfully.", "CoverArtist": "Cover artist", + "Create": "Create", "Creator": "Creator", "CriticRating": "Critics rating", "Cursive": "Cursive", @@ -212,6 +218,7 @@ "DeleteCustomImage": "Delete Custom Image", "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", "DeleteDevicesConfirmation": "Are you sure you wish to delete all devices? All other sessions will be logged out. Devices will reappear the next time a user signs in.", + "DeleteRepositoryConfirmation": "Are you sure you want to delete this repository?", "DeleteImage": "Delete Image", "DeleteImageConfirmation": "Are you sure you wish to delete this image?", "DeleteLyrics": "Delete lyrics", @@ -253,6 +260,7 @@ "Down": "Down", "Download": "Download", "DownloadAll": "Download All", + "DownloadManager": "Downloads", "DownloadsValue": "{0} downloads", "DrmChannelsNotImported": "Channels with DRM will not be imported.", "DropShadow": "Drop Shadow", @@ -387,6 +395,7 @@ "HeaderAudioSettings": "Audio Settings", "HeaderAutoDiscovery": "Network Discovery", "HeaderBlockItemsWithNoRating": "Block items with no or unrecognized rating information", + "HeaderBackupsHelp": "Create and restore snapshots of your server which can include the database, metadata, subtitles and trickplay.", "HeaderBranding": "Branding", "HeaderCancelRecording": "Cancel Recording", "HeaderCancelSeries": "Cancel Series", @@ -515,6 +524,8 @@ "HeaderSeriesOptions": "Series Options", "HeaderSeriesStatus": "Series Status", "HeaderServerAddressSettings": "Server Address Settings", + "HeaderServerMismatch": "Server Mismatch", + "HeaderServerUnavailable": "Server Unavailable", "HeaderSetupLibrary": "Set up your media libraries", "HeaderSortBy": "Sort By", "HeaderSortOrder": "Sort Order", @@ -538,6 +549,7 @@ "HeaderTypeText": "Enter Text", "HeaderUninstallPlugin": "Uninstall Plugin", "HeaderUpcomingOnTV": "Upcoming On TV", + "HeaderUpdateRequired": "Update Required", "HeaderUploadImage": "Upload Image", "HeaderUploadLyrics": "Upload Lyrics", "HeaderUploadSubtitle": "Upload Subtitle", @@ -614,6 +626,7 @@ "LabelAutomaticallyRefreshInternetMetadataEvery": "Automatically refresh metadata from the internet", "LabelAutomaticDiscovery": "Enable Auto Discovery", "LabelAutomaticDiscoveryHelp": "Allow applications to automatically detect Jellyfin by using UDP port 7359.", + "LabelBackupsUnavailable": "No backups available", "LabelBaseUrl": "Base URL", "LabelBaseUrlHelp": "Add a custom subdirectory to the server URL. For example: http://example.com/<baseurl>", "LabelBackdropScreensaverInterval": "Backdrop Screensaver Interval", @@ -658,6 +671,7 @@ "LabelCustomTagDelimiters": "Custom Tag Delimiter", "LabelCustomTagDelimitersHelp": "Characters to be treated as delimiters to separate tags.", "LabelDashboardTheme": "Server Dashboard theme", + "LabelDatabase": "Database", "LabelDate": "Date", "LabelDateAdded": "Date added", "LabelDateAddedBehavior": "Date added behavior for new content", @@ -691,7 +705,7 @@ "LabelDropShadow": "Drop shadow", "LabelDropSubtitleHere": "Drop subtitle here, or click to browse.", "LabelDummyChapterDuration": "Interval", - "LabelDummyChapterDurationHelp": "The interval between dummy chapters. Set to 0 to disable dummy chapter generation. Changing this will have no effect on existing dummy chapters.", + "LabelDummyChapterDurationHelp": "The interval between dummy chapters in seconds. Set to 0 to disable dummy chapter generation. Changing this will have no effect on existing dummy chapters.", "LabelChapterImageResolution": "Resolution", "LabelChapterImageResolutionHelp": "The resolution of the extracted chapter images. Changing this will have no effect on existing dummy chapters.", "LabelDynamicExternalId": "{0} Id", @@ -740,6 +754,7 @@ "LabelHomeScreenSectionValue": "Home screen section {0}", "LabelHttpsPort": "Local HTTPS port number", "LabelHttpsPortHelp": "The TCP port number for the HTTPS server.", + "LabelImageCache": "Image Cache", "LabelImageFetchersHelp": "Enable and rank your preferred image fetchers in order of priority.", "LabelImageType": "Image type", "LabelImportOnlyFavoriteChannels": "Restrict to channels marked as favorite", @@ -853,6 +868,7 @@ "LabelPreferredDisplayLanguage": "Preferred display language", "LabelPreferredSubtitleLanguage": "Preferred subtitle language", "LabelProfileContainer": "Container", + "LabelProgramData": "Program Data", "LabelProtocol": "Protocol", "LabelPublicHttpPort": "Public HTTP port number", "LabelPublicHttpPortHelp": "The public port number that should be mapped to the local HTTP port.", @@ -878,6 +894,7 @@ "LabelRepositoryUrlHelp": "The location of the repository manifest you want to include.", "LabelRequireHttps": "Require HTTPS", "LabelRequireHttpsHelp": "If checked, the server will automatically redirect all requests over HTTP to HTTPS. This has no effect if the server is not listening on HTTPS.", + "LabelRestore": "Restore", "LabelRuntimeMinutes": "Runtime", "LabelSaveLocalMetadata": "Save artwork into media folders", "LabelSaveLocalMetadataHelp": "Saving artwork into media folders will put them in a place where they can be easily edited.", @@ -974,7 +991,7 @@ "LabelTonemappingDesat": "Tone mapping desat", "LabelTonemappingDesatHelp": "Apply desaturation for highlights that exceed this level of brightness. The recommended value is 0 (disable).", "LabelTonemappingParam": "Tone mapping param", - "LabelTonemappingParamHelp": "Tune the tone mapping algorithm. The recommended and default values are NaN. Generally leave it blank.", + "LabelTonemappingParamHelp": "Tune the tone mapping algorithm. Generally leave it blank.", "LabelTonemappingPeak": "Tone mapping peak", "LabelTonemappingPeakHelp": "Override the embedded metadata value for the input signal with this peak value instead. The default value is 100 (1000nit).", "LabelTonemappingRange": "Tone mapping range", @@ -1039,6 +1056,7 @@ "Live": "Live", "LiveBroadcasts": "Live broadcasts", "LiveTV": "Live TV", + "LiveTVPageLoadError": "Failed to load recordings page", "Localization": "Localization", "LogLevel.Trace": "Trace", "LogLevel.Debug": "Debug", @@ -1106,6 +1124,8 @@ "MessageAddRepository": "If you wish to add a repository, click the button next to the header and fill out the requested information.", "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?", "MessageAreYouSureYouWishToRemoveMediaFolder": "Are you sure you wish to remove this media folder?", + "MessageBackupDisclaimer": "Depending on the size of your library, the backup process may take a while.", + "MessageBackupInProgress": "Backup in progress", "MessageBrowsePluginCatalog": "Browse our plugin catalog to view available plugins.", "MessageCancelSeriesTimerError": "An error occurred while canceling the series timer", "MessageCancelTimerError": "An error occurred while canceling the timer", @@ -1117,7 +1137,7 @@ "MessageConfirmRemoveMediaLocation": "Are you sure you wish to remove this location?", "MessageConfirmRestart": "Are you sure you wish to restart Jellyfin?", "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this API key? The application's connection to this server will be abruptly ended.", - "MessageConfirmShutdown": "Are you sure you wish to shutdown the server?", + "MessageConfirmShutdown": "Are you sure you wish to shut the server down?", "MessageContactAdminToResetPassword": "Please contact your system administrator to reset your password.", "MessageCreateAccountAt": "Create an account at {0}", "MessageDeleteTaskTrigger": "Are you sure you wish to delete this task trigger?", @@ -1127,6 +1147,7 @@ "MessageEnablingOptionLongerScans": "Enabling this option may result in significantly longer library scans.", "MessageFileReadError": "There was an error reading the file. Please try again.", "MessageForgotPasswordFileCreated": "The following file has been created on your server and contains instructions on how to proceed", + "MessageForgotPasswordPinReset": "Enter PIN here to finish Password reset", "MessageForgotPasswordInNetworkRequired": "Please try again within your home network to initiate the password reset process.", "MessageGetInstalledPluginsError": "An error occurred while getting the list of currently installed plugins.", "MessageImageFileTypeAllowed": "Only JPEG and PNG files are supported.", @@ -1159,7 +1180,11 @@ "MessageReenableUser": "See below to reenable", "MessageRenameMediaFolder": "Renaming a media library will cause all metadata to be lost, proceed with caution.", "MessageRepositoryInstallDisclaimer": "WARNING: Installing a third party plugin repository carries risks. It may contain unstable or malicious code, and may change at any time. Only install repositories from authors that you trust.", + "MessageRestoreDisclaimer": "WARNING: You are about to restore from a previous backup. Your server will be rendered unusable for the duration of the process and any new data created since the backup will be lost.", + "MessageRestoreInProgress": "Restore in progress", + "MessageRestoreSuccess": "Restore successfully completed", "MessageSent": "Message sent.", + "MessageServerMismatch": "The server you are connecting to is not the same server that you previously connected to at this address. If this is expected, please select \"Connect Anyway\". Otherwise, your connection or the server might be compromised.", "MessageSplitVersionsError": "An error occurred while splitting versions", "MessageSyncPlayCreateGroupDenied": "Permission required to create a group.", "MessageSyncPlayDisabled": "SyncPlay disabled.", @@ -1181,6 +1206,7 @@ "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please ensure it is running and try again.", "MessageUnauthorizedUser": "You are not authorized to access the server at this time. Please contact your server administrator for more information.", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", + "MessageWaitingForServer": "Waiting for server...", "MetadataImagesLoadError": "Failed to load metadata settings", "MetadataManager": "Metadata Manager", "MetadataNfoLoadError": "Failed to load metadata NFO settings", @@ -1380,6 +1406,7 @@ "PluginLoadConfigError": "An error occurred while getting the plugin configuration pages.", "PluginLoadRepoError": "An error occurred while getting the plugin details from the repository.", "PluginUninstallError": "An error occurred while uninstalling the plugin.", + "PluginsLoadError": "An error occurred while loading plugins.", "Poster": "Poster", "PosterCard": "Poster Card", "PreferEmbeddedEpisodeInfosOverFileNames": "Prefer embedded episode information over filenames", @@ -1460,6 +1487,7 @@ "ReplaceAllMetadata": "Replace all metadata", "ReplaceExistingImages": "Replace existing images", "ReplaceTrickplayImages": "Replace existing trickplay images", + "RepositoriesPageLoadError": "Failed to load repositories", "Retry": "Retry", "RetryWithGlobalSearch": "Retry with a global search", "Reset": "Reset", @@ -1541,6 +1569,13 @@ "StoryArc": "Story Arc", "StopPlayback": "Stop playback", "StopRecording": "Stop recording", + "StorageType.CDRom": "CD-ROM", + "StorageType.Fixed": "Fixed", + "StorageType.Network": "Network", + "StorageType.NoRootDirectory": "No Root Directory", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Removable", + "StorageType.Unknown": "Unknown", "StreamCountExceedsLimit": "The number of streams exceeds the limit", "Studio": "Studio", "Studios": "Studios", @@ -1561,12 +1596,14 @@ "SubtitleVerticalPositionHelp": "Line number where text appears. Positive numbers indicate top down. Negative numbers indicate bottom up.", "SubtitleWhite": "White", "SubtitleYellow": "Yellow", + "Success": "Success", "Suggestions": "Suggestions", "Sunday": "Sunday", "SyncPlayAccessHelp": "The SyncPlay feature enables to sync playback with other devices. Select the level of access this user has to the SyncPlay.", "SyncPlayGroupDefaultTitle": "{0}'s group", "TabAccess": "Access", "TabAdvanced": "Advanced", + "HeaderBackups": "Backups", "TabCatalog": "Catalog", "TabDashboard": "Dashboard", "TabLatest": "Recently Added", @@ -1591,7 +1628,7 @@ "ThemeSongs": "Theme songs", "ThemeVideos": "Theme videos", "TheseSettingsAffectSubtitlesOnThisDevice": "These settings affect subtitles on this device", - "ThisWizardWillGuideYou": "This wizard will help guide you through the setup process. To begin, please select your preferred language.", + "ThisWizardWillGuideYou": "This wizard will help guide you through the setup process. To begin, please enter a server name and select your preferred language.", "Thumb": "Thumb", "ThumbCard": "Thumb Card", "Thursday": "Thursday", @@ -1604,6 +1641,7 @@ "TrackCount": "{0} tracks", "Trailers": "Trailers", "Transcoding": "Transcoding", + "TranscodingLoadError": "Failed to load transcoding settings", "Translator": "Translator", "Tuesday": "Tuesday", "TV": "TV", @@ -1664,6 +1702,7 @@ "ViewAlbumArtist": "View album artist", "ViewLyrics": "View lyrics", "ViewPlaybackInfo": "View playback info", + "ViewSettings": "View settings", "Watched": "Watched", "Wednesday": "Wednesday", "WeeklyAt": "{0}s at {1}", diff --git a/src/strings/enm.json b/src/strings/enm.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/src/strings/enm.json @@ -0,0 +1 @@ +{} diff --git a/src/strings/es.json b/src/strings/es.json index 5bb4e849c..2f4a6bf5f 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -63,7 +63,7 @@ "ButtonParentalControl": "Control parental", "ButtonPause": "Pausa", "ButtonPreviousTrack": "Pista anterior", - "ButtonQuickStartGuide": "Guía de inicio rápido", + "ButtonQuickStartGuide": "Guía de configuración", "ButtonRefreshGuideData": "Actualizar datos de la guía", "ButtonRemove": "Eliminar", "ButtonRename": "Renombrar", @@ -311,7 +311,7 @@ "HeaderSendMessage": "Enviar mensaje", "HeaderSeriesOptions": "Opciones de series", "HeaderServerSettings": "Ajustes del servidor", - "HeaderSetupLibrary": "Configure su biblioteca multimedia", + "HeaderSetupLibrary": "Configure sus bibliotecas multimedia", "HeaderSortBy": "Ordenar por", "HeaderSortOrder": "Orden", "HeaderSpecialEpisodeInfo": "Información del episodio especial", @@ -993,7 +993,7 @@ "Tags": "Etiquetas", "TellUsAboutYourself": "Háblenos acerca de usted", "TheseSettingsAffectSubtitlesOnThisDevice": "Estas opciones afectan a los subtítulos en este dispositivo", - "ThisWizardWillGuideYou": "Este asistente lo guiará en el proceso de instalación. Para comenzar, seleccione su idioma preferido.", + "ThisWizardWillGuideYou": "Este asistente lo guiará durante el proceso de configuración. Para comenzar, por favor ingrese un nombre de servidor y seleccione su idioma preferido.", "Thumb": "Miniatura", "Thursday": "Jueves", "TitleHardwareAcceleration": "Aceleración por Hardware", @@ -1406,7 +1406,7 @@ "MediaInfoColorSpace": "Espacio de color", "MediaInfoVideoRange": "Rango de video", "LabelMaxMuxingQueueSize": "Tamaño máximo de la cola de entremezclado", - "LabelTonemappingParamHelp": "Ajuste el algoritmo de mapeo de Tono. El valor recomendado y predeterminados es NaN. Generalmente déjelo en blanco.", + "LabelTonemappingParamHelp": "Ajuste el algoritmo de mapeo de Tono. Generalmente déjelo en blanco.", "LabelTonemappingParam": "Parámetros del mapeo de tono", "LabelTonemappingPeak": "Pico del mapeo de tono", "LabelTonemappingDesat": "Mapeo de tonos desaturado", @@ -1485,7 +1485,7 @@ "LabelAutomaticDiscoveryHelp": "Permite a las aplicaciones detectar automáticamente Jellyfin usando el puerto UDP 7359.", "LabelAutomaticDiscovery": "Activar descubrimiento automático", "LabelAutoDiscoveryTracingHelp": "Si está activada, los paquetes recibidos en el puerto de descubrimiento automático serán registrados.", - "HeaderUploadSubtitle": "Cargar subtítulo", + "HeaderUploadSubtitle": "Subir subtítulos", "HeaderPortRanges": "Configuración de cortafuegos y proxy", "HeaderNetworking": "Protocolos IP", "MessagePlaybackError": "Ha habido un error al reproducir este archivo en tu receptor Google Cast.", @@ -1695,7 +1695,7 @@ "SaveRecordingImages": "Guardar grabación de imágenes EPG", "SaveRecordingImagesHelp": "Guardar imágenes del proveedor de listados EPG junto con los archivos multimedia.", "LabelDummyChapterDuration": "Intervalo", - "LabelDummyChapterDurationHelp": "Intervalo entre capítulos dummy. Dejar a 0 para deshabilitar la generación de capítulos dummy. Cambiar esta opción no tendrá efecto para capítulos dummy ya existentes.", + "LabelDummyChapterDurationHelp": "Intervalo entre capítulos dummy en segundos. Dejar a 0 para deshabilitar la generación de capítulos dummy. Cambiar esta opción no tendrá efecto para capítulos dummy ya existentes.", "HeaderDummyChapter": "Imágenes de capítulos", "LabelDummyChapterCount": "Límite", "Featurette": "Reportaje extra", @@ -1890,7 +1890,7 @@ "PlaylistPublic": "Permitir acceso publico", "PlaylistPublicDescription": "Permitir que esta lista de reproduccion sea vista por cualquier usuario que este logueado.", "HeaderLyricDownloads": "Descarga de letras", - "HeaderVideoAdvanced": "Video Avanzado", + "HeaderVideoAdvanced": "Video avanzado", "SaveLyricsIntoMediaFolders": "Guardar letras en carpeta de media", "Alternate": "Alternar", "AlternateDVD": "DVD alternativo", @@ -2022,5 +2022,46 @@ "ImageDeleteFailed": "Error al eliminar la imagen", "ImageUploadCancelled": "Se canceló la carga de la imagen", "ImageUploadFailed": "Falló la carga de la imagen", - "UploadCustomImage": "Cargar imagen personalizada" + "UploadCustomImage": "Cargar imagen personalizada", + "RetryWithGlobalSearch": "Reintentar con una búsqueda global", + "LimitSegmentLength": "Usar segmentos HLS más pequeños", + "LimitSegmentLengthHelp": "Habilitar esta opción puede prevenir que el reproductor HLS se congele mientras se avanza en ciertos dispositivos, como televisores webOS.", + "StreamCountExceedsLimit": "El numero de transmisiones excede el límite", + "HeaderServerUnavailable": "Servidor no disponible", + "HeaderUpdateRequired": "Actualización requerida", + "ViewSettings": "Ajustes de vista", + "DownloadManager": "Descargas", + "MessageForgotPasswordPinReset": "Introducir PIN aquí para terminar el restablecimiento de contraseña", + "ButtonLearnMore": "Saber Más", + "Create": "Crear", + "HeaderBackupsHelp": "Crea y restaura copias de seguridad de tu servidor, que pueden incluir la base de datos, los metadatos, los subtítulos y el trickplay.", + "LabelBackupsUnavailable": "No hay copias de seguridad disponibles", + "LabelDatabase": "Base de datos", + "BackupsPageLoadError": "Fallo al cargar la página de copias de seguridad", + "ButtonCreateBackup": "Crear copia de seguridad", + "LabelRestore": "Restaurar", + "ConfirmDeleteRepository": "Eliminar repositorio?", + "DeleteRepositoryConfirmation": "Estás seguro que quieres eliminar este repositorio?", + "LabelProgramData": "Datos del programa", + "LabelImageCache": "Caché de imágenes", + "StorageType.Fixed": "Corregido", + "StorageType.CDRom": "CD-ROM", + "StorageType.Removable": "Extraíble", + "PluginsLoadError": "Se produjo un error al cargar los complementos.", + "RepositoriesPageLoadError": "Fallo al cargar los repositorios", + "MessageBackupDisclaimer": "Dependiendo del tamaño de tu biblioteca, el proceso de copia de seguridad puede tardar un rato.", + "MessageBackupInProgress": "Copia de seguridad en curso", + "MessageRestoreSuccess": "Restauración completada con éxito", + "StorageType.Network": "Red", + "StorageType.Ram": "RAM", + "StorageType.NoRootDirectory": "Directorio raíz no encontrado", + "StorageType.Unknown": "Desconocido", + "Success": "Se ha completado correctamente", + "HeaderBackups": "Copias de seguridad", + "TranscodingLoadError": "Error al cargar la configuración de transcodificación", + "MessageRestoreDisclaimer": "ADVERTENCIA: Estás a punto de restaurar una copia de seguridad anterior. Tu servidor quedará inoperativo durante el proceso y se perderán todos los datos nuevos creados desde la fecha de esa copia.", + "MessageRestoreInProgress": "Restauración en progreso", + "MessageWaitingForServer": "Esperando al servidor...", + "LiveTVPageLoadError": "Falló la carga de la pagina de grabaciones", + "ConnectAnyway": "Conectar de todos modos" } diff --git a/src/strings/es_419.json b/src/strings/es_419.json index 4670075b6..1f5e8fe44 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -1213,7 +1213,7 @@ "ConfirmDeleteItems": "Eliminar estos elementos los eliminará tanto del sistema como de tu biblioteca de medios. ¿Estás seguro de querer continuar?", "ConfirmDeleteItem": "Eliminar este elemento lo eliminará tanto del sistema como de tu biblioteca de medios. ¿Estás seguro de querer continuar?", "ConfirmDeleteImage": "¿Eliminar imagen?", - "ConfigureDateAdded": "Configure como los metadatos para 'Fecha de adición' en el Panel de control > Bibliotecas > Configuración de NFO", + "ConfigureDateAdded": "Configure cómo los metadatos para 'Fecha de adición' se determinan en el Panel de control > Bibliotecas > Configuración de NFO", "Composer": "Compositor", "CommunityRating": "Calificación de la comunidad", "ColorTransfer": "Transferencia de color", @@ -1249,7 +1249,7 @@ "ButtonRename": "Renombrar", "ButtonRemove": "Remover", "ButtonRefreshGuideData": "Actualizar datos de la guía", - "ButtonQuickStartGuide": "Guía de inicio rápido", + "ButtonQuickStartGuide": "Guía de instalación", "ButtonPreviousTrack": "Pista anterior", "ButtonPause": "Pausar", "ButtonParentalControl": "Control parental", @@ -1418,7 +1418,7 @@ "LabelQuickConnectCode": "Código de «Conexión rápida»", "LabelKnownProxies": "Proxies conocidos", "LabelIconMaxResHelp": "Resolución maxima de los iconos por medio de la función 'upnp:icon'.", - "EnableAutoCast": "Establecer como Predeterminado", + "EnableAutoCast": "Establecer como predeterminado", "OptionMaxActiveSessionsHelp": "fijar esto en 0 desactivará esta característica.", "OptionMaxActiveSessions": "Determina el número máximo de sesiones que puede tener cada usuario de forma simultnea.", "LabelUserMaxActiveSessions": "Límite de sesiones simultaneas", @@ -1508,7 +1508,7 @@ "DisablePlugin": "Deshabilitar", "EnablePlugin": "Habilitar", "Framerate": "Cuadros por segundo", - "DirectPlayHelp": "El archivo de origen es totalmente compatible con este cliente y la sesión esta recibiendo el archivo sin modificaciones.", + "DirectPlayHelp": "El archivo de origen es totalmente compatible con este cliente y la sesión está recibiendo el archivo sin modificaciones.", "HeaderContinueReading": "Continuar leyendo", "EnableGamepadHelp": "Esperando por entrada desde cualquier controlador conectado. (Requiere: ‘TV’ Modo Pantalla)", "LabelEnableGamepad": "Habilitar Gamepad", @@ -1640,7 +1640,7 @@ "NotificationsMovedMessage": "La funcionalidad de notificaciones se ha movido al plugin de Webhooks.", "MessageRenameMediaFolder": "Renombrar una librería de medios provoca que los metadatos guardados se pierdan, proceder con caución.", "NextChapter": "Proxima escena", - "SelectAudioNormalizationHelp": "Ganancia de pista - ajusta el volumen de cada pista para que la reproducción suene en la misma intensidad. Ganancia de Album - ajusta el volumen de todas las pistas del album, manteniendo el rango dinámico del mismo.", + "SelectAudioNormalizationHelp": "Ganancia de pista - ajusta el volumen de cada pista para que la reproducción suene con la misma intensidad. Ganancia de Album - ajusta el volumen de todas las pistas del album, manteniendo el rango dinámico del mismo.", "LabelAlbumGain": "Ganancia de Album", "LabelSelectAudioNormalization": "Normalización de Audio", "PasswordRequiredForAdmin": "Una contraseña es requerida para las cuentas de administrador.", @@ -1724,5 +1724,38 @@ "PlaybackError.FATAL_HLS_ERROR": "Se encontró un error fatal en la transmisión HLS.", "PreferEmbeddedExtrasTitlesOverFileNames": "Preferir los títulos incrustados en lugar de los nombres de archivo para los extras", "AllowVideoToolboxTonemappingHelp": "El mapeo de tonos acelerado por hardware proporcionado por VideoToolbox. Funciona con la mayoría de los formatos HDR, incluyendo HDR10, HDR10+ y HLG, pero no funciona con Dolby Vision Perfil 5. Tiene una mayor prioridad en comparación con otra implementación en Metal.", - "HeaderMediaSegmentActions": "Acciones de segmentos de medios" + "HeaderMediaSegmentActions": "Acciones de segmentos de medios", + "DisplayLoadError": "Se produjo un error al cargar los datos de configuración de visualización.", + "AutoSubtitleStylingHelp": "Este modo cambiará automáticamente entre los mecanismos nativos y personalizados de estilo de subtítulos según el tipo de dispositivo.", + "Custom": "Personalizado", + "Colorist": "Colorista", + "CopyLogSuccess": "Contenido del registro copiado correctamente.", + "CustomSubtitleStylingHelp": "El estilo de subtítulos funcionará en la mayoría de los dispositivos, pero implica una carga adicional de rendimiento.", + "DisableVbrAudioEncodingHelp": "Evita que el servidor codifique el audio con VBR para este cliente.", + "DlnaMovedMessage": "La funcionalidad DLNA se ha movido a un plugin.", + "DateModified": "Fecha de modificación", + "EnableDtsHelp": "Activa esta opción solo si tu dispositivo es compatible con DTS o está conectado a un receptor de audio compatible, de lo contrario, podría fallar la reproducción.", + "EditLyrics": "Editar letras", + "Anime": "Anime", + "Editor": "Editor", + "DeleteServerConfirmation": "¿Estás seguro de querer eliminar este servidor?", + "EnableHi10p": "Activar perfil H.264 High 10", + "CustomSplashScreenSize": "Las imágenes personalizadas deben tener una relación de aspecto de 16:9 y un tamaño mínimo de 1920x1080.", + "DeleteCustomImage": "Borrar imagen personalizada", + "DeleteEpisode": "Borrar episodio", + "DeleteName": "Borrar {0}", + "EnableDts": "Activar DTS (DCA)", + "DownloadManager": "Descargas", + "EnableLibrary": "Habilitar la librería", + "EnableLibraryHelp": "Deshabilitar la librería ocultará la ayuda de todos las vistas de usuario.", + "EnableHi10pHelp": "Activar para evitar transcodificar vídeos a H.264 10-bit. Desactivar esta opción si el video muestra recuadros en blanco.", + "ButtonLearnMore": "Aprender Más", + "Create": "Crear", + "EnableTrueHd": "Activar TrueHD", + "BackupsPageLoadError": "Falló al cargar la página de respaldos", + "ButtonCreateBackup": "Crear Respaldo", + "EnableSmoothScroll": "Activar desplazamiento suavizado", + "ConfirmDeleteRepository": "¿Eliminar repositorio?", + "DeleteRepositoryConfirmation": "¿Estás seguro de que deseas eliminar este repositorio?", + "EnableTrueHdHelp": "Habilítelo solo si su dispositivo es compatible con TrueHD o está conectado a un receptor de audio compatible, de lo contrario, puede provocar fallas en la reproducción." } diff --git a/src/strings/eu.json b/src/strings/eu.json index 0f4f73f2c..9871e6a97 100644 --- a/src/strings/eu.json +++ b/src/strings/eu.json @@ -1,5 +1,5 @@ { - "ThisWizardWillGuideYou": "Laguntzaile horrek instalazio-prozesuan gidatuko du. Hasteko, aukeratu zure hizkuntza hobetsia.", + "ThisWizardWillGuideYou": "Laguntzaile honek konfigurazio prozesuan zehar gidatuko zaitu. Hasteko, idatzi zerbitzari-izen bat eta hautatu zure hizkuntza lehenetsia.", "LabelPreferredSubtitleLanguage": "Azpitituluen hizkuntza hobetsia", "LabelPreferredDisplayLanguage": "Bistaratze hizkuntza hobetsia", "LabelMetadataDownloadLanguage": "Deskargatzeko hizkuntza hobetsia", @@ -61,11 +61,11 @@ "YoutubePlaybackError": "Eskatutako bideoa ezin da erreproduzitu.", "YoutubeBadRequest": "Eskaera ez da zuzena.", "LabelSelectStereo": "Estereoa", - "LabelSelectMono": "Tximinoa", + "LabelSelectMono": "Monoa (audio-kanal bakarra)", "LabelSelectAudioChannels": "Kanalak", "LabelAllowedAudioChannels": "Baimendutako gehieneko audio-kanalak", "AllowHevcEncoding": "HEVC formatuan kodetzea baimentzea", - "PreferFmp4HlsContainerHelp": "Hobetsi fMP4 erabiltzea HLSrako edukiontzi lehenetsi gisa, HEVC eduki zuzena gailu bateragarrietan transmititu ahal izateko.", + "PreferFmp4HlsContainerHelp": "Hobetsi fMP4 erabiltzea HLSrako edukiontzi lehenetsi gisa, HEVC eta AV1 eduki zuzena gailu bateragarrietan transmititu ahal izateko.", "PreferFmp4HlsContainer": "Hobetsi fMP4-HLS multimedia-edukiontzia", "LabelSyncPlayInfo": "SyncPlay informazioa", "LabelOriginalMediaInfo": "Jatorrizko multimedia informazioa", @@ -78,17 +78,17 @@ "RemuxHelp2": "Remuxek prozesatzeko oso potentzia gutxi erabiltzen du, galerarik gabeko multimedia kalitatearekin.", "RemuxHelp1": "Multimedia artxibo-edukiontzi bateraezin batean dago (MKV, AVI, WMV, etab.), baina bideoaren zein audioaren transmisioa bateragarriak dira gailuarekin. Gailura bidali aurretik multimedia unean bertan galerarik gabe berriro paketatuko da.", "Remuxing": "Remuxing", - "AspectRatioFill": "Bete", - "AspectRatioCover": "Azala", + "AspectRatioFill": "Luzatu", + "AspectRatioCover": "Zooma", "EnableFallbackFontHelp": "Iturri alternatibo pertsonalizatuak aktibatzea. Horrek azpitituluak oker errenderizatzearen arazoa saihets dezake.", "EnableFallbackFont": "Iturri alternatiboak aktibatzea", - "LabelFallbackFontPathHelp": "ASS/SSA azpitituluak renderizatzeko iturri alternatiboak dituen bidea zehazten du. Iturriaren gehieneko tamaina 20 MB-koa da. Iturri arineko formatuak eta web bateragarriak, hala nola woff2 gomendatzen dira.", + "LabelFallbackFontPathHelp": "Letra-tipo hauek bezero batzuek erabiltzen dituzte azpitituluak errendatzeko. Informazio gehiago lortzeko, jo dokumentaziora.", "LabelFallbackFontPath": "Iturrien karpeta alternatiboaren helbidea", "HeaderSelectFallbackFontPathHelp": "Bilatu edo idatzi ASS/SSA azpitituluak errenderizatzeko erabilitako iturri karpeta alternatiboaren helbidea.", "HeaderSelectFallbackFontPath": "Hautatu iturri alternatiboen karpeta", "Yesterday": "Atzo", "Yes": "Bai", - "Yadif": "YADIF", + "Yadif": "Yet Another DeInterlacing Filter (YADIF)", "XmlTvSportsCategoriesHelp": "Kategoria horiek dituzten programak kirol-programa gisa agertuko dira. Kategoria asko jar ditzakezu '|' -rekin bereiziz.", "XmlTvPathHelp": "XML TV fitxategirako bidea. Jellyfinek fitxategi hori irakurriko du eta aldizka eguneratzerik dagoen egiaztatuko du. Artxiboa sortzearen eta eguneratzearen arduraduna zara.", "XmlTvNewsCategoriesHelp": "Kategoria horiek dituzten programak albiste-programa gisa agertuko dira. Kategoria asko jar ditzakezu '|' -rekin bereiziz.", @@ -135,7 +135,7 @@ "UseEpisodeImagesInNextUp": "Erabili kapituluen irudiak \"Nobedadeak\" eta \"Ikusten jarraitu\" ataletan", "UseDoubleRateDeinterlacingHelp": "Konfigurazio honek eremu-abiadura erabiltzen du, askotan desrelazado bob deitzen dena, bideoaren fotogramak bikoizten dituena, etengabeko mugimendu bat emateko, telebista batean bideo bat elkarri lotuta ikustean ikusiko nukeen bezala.", "UseDoubleRateDeinterlacing": "Koadro kopurua bikoiztea segundoko, elkar gurutzatzean", - "Upload": "Igo", + "Upload": "Kargatu", "Up": "Goian", "UnsupportedPlayback": "Jellyfinek ezin du DRMk babestutako edukia desenkriptatu, nahiz eta dena dela erreproduzitzen saiatuko den. Fitxategi batzuk erabat beltzak ager daitezke enkriptazioa edo jasan gabeko beste ezaugarri batzuk direla eta, hala nola izenburu interaktiboak.", "Unrated": "Sailkatu gabe", @@ -145,7 +145,7 @@ "Uniform": "Uniformea", "Typewriter": "Mekanografia", "TypeOptionPluralVideo": "Bideoak", - "TypeOptionPluralSeries": "Telesailak", + "TypeOptionPluralSeries": "Serieak", "TypeOptionPluralSeason": "Denboraldiak", "TypeOptionPluralMusicVideo": "Bideo musikalak", "TypeOptionPluralMusicArtist": "Musika-artistak", @@ -248,7 +248,7 @@ "SettingsSaved": "Konfigurazio gordea.", "Settings": "Ezarpenak", "ServerUpdateNeeded": "Zerbitzaria eguneratu egin behar da. Azken bertsioa deskargatzeko, bisitatu {0}", - "ServerRestartNeededAfterPluginInstall": "Jellyfin berriz hasi beharko da osagarri bat instalatu ondoren.", + "ServerRestartNeededAfterPluginInstall": "Jellyfin berrabiarazi beharko da plugina instalatu ondoren.", "ServerNameIsShuttingDown": "{0}(e)ko zerbitzaria itzaltzen ari da.", "ServerNameIsRestarting": "{0}(e)ko zerbitzaria berrabiarazten ari da.", "SeriesYearToPresent": "{0} - Gaur egun", @@ -315,7 +315,7 @@ "QuickConnectInvalidCode": "Konexio azkarreko kode baliogabea", "QuickConnectDescription": "Saioa konexio azkarrarekin hasteko, \"konexio azkarra\" botoia sakatu saioa hasteko erabiltzen ari zaren gailuan, eta jarraian agertzen den kodea sartu.", "QuickConnectDeactivated": "Konexio azkarra saioa hasteko eskaera onartu baino lehen desaktibatu zen", - "QuickConnectAuthorizeSuccess": "Baimena eskatu", + "QuickConnectAuthorizeSuccess": "Zure gailua behar bezala autentifikatu duzu!", "OptionExternallyDownloaded": "Kanpoko deskarga", "OptionEveryday": "Egunero", "OptionEstimateContentLength": "Edukiaren luzera balioestea bihurtzean", @@ -378,7 +378,7 @@ "NoSubtitleSearchResultsFound": "Ez da emaitzarik aurkitu.", "Normal": "Normala", "NoNewDevicesFound": "Ez da gailu berririk aurkitu. Sintonizadore bat gehitzeko, itxi elkarrizketa hau eta sartu gailuaren informazioa eskuz.", - "None": "Ezer ez", + "None": "Bat ere ez", "NoCreatedLibraries": "Badirudi ez duzula liburutegirik sortu. {0}Sortu nahi al duzu bat orain?{1}", "No": "Ez", "NextUp": "Nobedadeak", @@ -451,7 +451,7 @@ "MessagePleaseWait": "Mesedez, itxaron.", "MessagePleaseEnsureInternetMetadata": "Ziurtatu metadatuak Internetetik deskargatzea aktibatuta dagoela.", "MessagePlayAccessRestricted": "Eduki horren erreprodukzioa mugatuta dago. Informazio gehiago nahi izanez gero, jarri harremanetan zerbitzari honen administratzailearekin.", - "MessagePasswordResetForUsers": "Hurrengo erabiltzaileei pasahitzak berrezarri dizkie. Orain saioa has dezakete berrezartzeko erabili ziren PIN kodeekin.", + "MessagePasswordResetForUsers": "Erabiltzaile hauen pasahitzak berrezarri dira. Orain berrezarpena egiteko erabilitako PIN kodeekin saioa has dezakete.", "MessageNoTrailersFound": "Trailerren kanala instalatu zure esperientzia zinematografikoa hobetzeko, Interneteko trailerren liburutegi bat gehituz.", "MessageNothingHere": "Hemen ezer ez.", "MessageNoServersAvailable": "Ez da zerbitzaririk aurkitu zerbitzarien detekzio automatikoa erabilita.", @@ -546,7 +546,7 @@ "LabelRecord": "Grabatu", "LabelReasonForTranscoding": "Bihurketa egiteko arrazoia", "LabelQuickConnectCode": "Konexio azkarreko kodea", - "LabelPublishedServerUriHelp": "Jellyfinek erabilitako URIa ezeztatzen du, bezeroaren interfazearen edo IP helbidearen arabera.", + "LabelPublishedServerUriHelp": "Jellyfinek erabiltzen duen URIa gainidatzi, interfazearen edo bezeroaren IP helbidearen arabera. Adibidez: internal=http://jellyfin.adibidea.com, external=https://jellyfin.adibidea.com edo all=https://jellyfin.adibidea.com", "LabelPublishedServerUri": "Argitaratutako zerbitzariaren URI", "LabelPublicHttpsPortHelp": "https tokiko portuarekin lotu behar den portu publikoa.", "LabelPublicHttpsPort": "https portu publikoa", @@ -760,7 +760,7 @@ "LabelLogs": "Erregistroak", "LabelLoginDisclaimerHelp": "Mezua saioaren hasierako orriaren behealdean agertuko da.", "LabelLoginDisclaimer": "Saioa hasteko erantzukizunaren deskargua", - "LabelLockItemToPreventChanges": "Blokeatu elementu hau, etorkizunean aldaketarik gerta ez dadin", + "LabelLockItemToPreventChanges": "Blokeatu elementu hau etorkizunean metadatuen aldaketak saihesteko", "LabelLocalHttpServerPortNumberHelp": "http zerbitzarirako TCP ataka zenbakia.", "LabelLocalHttpServerPortNumber": "http tokiko portua", "LabelLocalCustomCss": "Bezero horri bakarrik aplikatzen zaizkion CSS estilo pertsonalizatuak. Baliteke zerbitzariaren CSS pertsonalizatua desaktibatu nahi izatea.", @@ -872,7 +872,7 @@ "LabelAudioBitDepth": "Audio-biten sakonera", "LabelArtistsHelp": "Artista ugari puntu eta koma erabiliz bereiztea.", "LabelArtists": "Artistak", - "LabelAppNameExample": "Adibidea: Sickbeard, Sonarr", + "LabelAppNameExample": "API gakoak identifikatzeko gizakiek irakur dezaketen izen bat. Ezarpen honek ez du funtzionaltasunean eragingo.", "LabelAppName": "Aplikazioaren izena", "LabelAllowHWTranscoding": "Baimendu hardware bidezko transkodetzea", "LabelAllowedRemoteAddressesMode": "Urruneko IP direkzio-iragazkiaren modua", @@ -921,7 +921,7 @@ "HeaderUsers": "Erabiltzaileak", "HeaderUser": "Erabiltzailea", "HeaderUploadSubtitle": "Kargatu azpititulua", - "HeaderUploadImage": "Igo irudia", + "HeaderUploadImage": "Kargatu irudia", "HeaderUpcomingOnTV": "Laster telebistan", "HeaderUninstallPlugin": "Desinstalatu osagarria", "HeaderTypeText": "Testua sartu", @@ -954,12 +954,12 @@ "LeaveBlankToNotSetAPassword": "Hutsik utz dezakezu pasahitza ez konfiguratzeko.", "LearnHowYouCanContribute": "Ezagutu nola lagundu dezakezun.", "LatestFromLibrary": "Duela gutxi gehitutako {0}", - "LastSeen": "Azkenekoz ikusita {0}", + "LastSeen": "Azken jarduera {0}", "Larger": "Handiagoa", "Large": "Handia", "LanNetworksHelp": "Banda-zabaleraren murrizketak ezartzean sare lokalean kontuan hartuko diren sareetarako IP helbideen zerrenda, komen edo IP/sare-maskara helbideko sarreren bidez bereizita. Ezartzen bada, gainerako IP helbide guztiak kanpoko sarean hartuko dira kontuan, eta kanpoko banda-zabaleraren murrizketei lotuta egongo dira. Hutsik utziz gero, zerbitzariaren azpisarea sare lokalean dagoela baino ez da ulertuko.", "LabelZipCode": "Posta kodea", - "LabelYoureDone": "Kito!", + "LabelYoureDone": "Amaitu duzu!", "LabelYear": "Urtea", "LabelXDlnaDocHelp": "X_DLNADOC elementuaren edukia zehazten du izen espazioan: schemas-dlna-org: device-1-0.", "LabelXDlnaDoc": "X-DLNA doc", @@ -1005,11 +1005,11 @@ "LabelTonemappingThresholdHelp": "Tonuak mapatzeko algoritmoaren parametroak eszena bakoitzean egokitzen dira. Atalase bat erabiltzen da eszena aldatu den ala ez antzemateko. Batez besteko distira egungo fotogramaren eta hurrengoaren arteko atalasetik ateratzen bada, batez besteko eta moko distiraren balioak kalkulatuko dira berriro. 0.8 eta 0.2 balio lehenetsiak gomendatzen dira.", "LabelTonemappingThreshold": "Tonuaren mapaketaren atalasea", "LabelTonemappingRange": "Tonuaren mapaketa-tartea", - "LabelTonemappingPeakHelp": "Balio hori duten erreferentziazko tontorrak ez dira kontuan hartuko. Erabilgarria da irudi-metadatuetan txertatutako moko-informazioa fidagarria ez denean edo tonuen mapaketa maila baxu batetik maila altuago batera egiten denean. 100 eta 0 balio lehenetsiak gomendatzen dira.", + "LabelTonemappingPeakHelp": "Gainditu sarrera-seinalearen metadatu txertatuaren balioa gailur-balio honekin. Balio lehenetsia 100 da (1000 nit).", "LabelTonemappingPeak": "Tonuaren mapaketaren pikoa", - "LabelTonemappingParamHelp": "Tonua mapatzeko algoritmoa doitzea. Gomendatutako eta aurrez zehaztutako balioa NaN da. Normalean, utzi hutsik.", + "LabelTonemappingParamHelp": "Tonua mapatzeko algoritmoa doitzea. Normalean, utzi hutsik.", "LabelTonemappingParam": "Tonuaren mapaketaren parametroak", - "LabelTonemappingDesatHelp": "Distira-maila hori gainditzen duten aberastasunei saturazioa kentzea. Parametroa zenbat eta gorago, orduan eta kolore-informazio gehiago gordeko da. Doikuntza horri esker, erraz itzaltzen diren kolore altuak pixkanaka zurira aldatzen dira. Horren ondorioz, irudiak naturalagoak dira, tartetik kanpo dauden koloreei buruzko informazioa murriztearen truke. 0 eta 0.5 balio lehenetsiak gomendatzen dira.", + "LabelTonemappingDesatHelp": "Aplikatu desaturazioa distira-maila hori gainditzen duten argi-izpietarako. Gomendatutako balioa 0 da (desgaitu).", "LabelTonemappingDesat": "Tonuen mapaketa gaingabetua", "LabelTonemappingAlgorithm": "Hautatu tonuak mapatzeko algoritmoa", "LabelTitle": "Izenburua", @@ -1262,11 +1262,11 @@ "AllowMediaConversion": "Baimendu multimedia-bihurketa", "AllowHWTranscodingHelp": "Baimendu sintonizatzaileari edukia zuzenean transkodetzea. Horrek zerbitzariak gutxiago transkodetu behar izatea ekarriko du.", "AllowFfmpegThrottlingHelp": "Bihurketa edo remux bat uneko erreprodukzio posiziotik aurrera nahiko urrun dagoenean, eten prozesua, baliabide gutxiago kontsumitzeko. Hau erabilgarriena da maiz bilatu gabe ikustean. Desgaitu hau erreproduzitzeko arazoak badituzu.", - "AllowFfmpegThrottling": "Mugatu bihurketak", + "AllowFfmpegThrottling": "Mugatu transkodeketak", "AllowedRemoteAddressesHelp": "IP helbideen komen edo IP/sare-maskararen sarreren bidez bereizitako zerrenda, urrunetik konektatzeko aukera emango zaien sareetarako. Hutsik utziz gero, urruneko norabide guztiak baimenduko dira.", "AllLibraries": "Liburutegi guztiak", "AllLanguages": "Hizkuntza guztiak", - "AllEpisodes": "Atal guztiak", + "AllEpisodes": "Kapitulu guztiak", "AllComplexFormats": "Formatu konplexu guztiak (ASS, SSA, VobSub, PGS, SUB, IDX, …)", "AllChannels": "Kanal guztiak", "All": "Dena", @@ -1275,7 +1275,7 @@ "AlbumArtist": "Albumaren artista", "Album": "Albuma", "Aired": "Igorria", - "AirDate": "Emisio-data", + "AirDate": "Igorpen-data", "AgeValue": "({0} urte)", "AddToPlayQueue": "Gehitu erreprodukzio-ilarara", "AddToPlaylist": "Gehitu erreprodukzio-zerrendara", @@ -1315,7 +1315,7 @@ "LabelCriticRating": "Kritikaren balorazioa", "LabelCreateHttpPortMapHelp": "Portuen mapatze automatikoa ahalbidetzen du, http eta https trafikorako arau berri bat sortzeko.", "LabelCreateHttpPortMap": "Portuen mapatze automatikoa gaitzen du http eta https trafikorako.", - "LabelCountry": "Herrialdea", + "LabelCountry": "Herrialdea/Eskualdea", "LabelCorruptedFrames": "Frame ustelak", "LabelContentType": "Eduki mota", "LabelCommunityRating": "Komunitatearen puntuazioa", @@ -1402,7 +1402,7 @@ "DirectStreaming": "Zuzeneko streaminga", "DirectStreamHelp2": "Zuzeneko transmisioak kontsumitutako energia audio-profilaren araberakoa izaten da. Bideo transmisioak bakarrik ez du galerarik.", "DirectStreamHelp1": "Bideo-transmisioa bateragarria da gailuarekin, baina audio-formatu bateraezina du (DTS, Dolby TrueHD, etab.) edo audio-kanalen kopurua. Bideo-transmisioa berriro paketatuko da, martxan galerarik gabe, gailura bidali aurretik. Audio-transmisioa baino ez da transkodetuko.", - "DirectPlayHelp": "Jatorrizko fitxategia guztiz bateragarria da bezero honekin, eta saioa fitxategia jasotzen ari da aldaketarik gabe.", + "DirectPlayHelp": "Iturburu-fitxategia bezero honekin guztiz bateragarria da eta saioak fitxategia aldaketarik gabe jasotzen ari du.", "DirectPlaying": "Zuzeneko erreprodukzioa", "Directors": "Zuzendariak", "Director": "Zuzendaria", @@ -1442,12 +1442,12 @@ "ContinueWatching": "Ikusten jarraitu", "Console": "Kontsola", "Connect": "Konektatu", - "ConfirmEndPlayerSession": "Jellyfin dispositiboan itxi nahi duzu?", + "ConfirmEndPlayerSession": "Jellyfin {0}-(e)n itxi nahi duzu?", "ConfirmDeletion": "Baieztatu ezabatuta", "ConfirmDeleteItems": "Elementu horiek ezabatzean, artxibo-sistematik zein multimedia-liburutegitik ezabatuko dira. Ziur zaude jarraitu nahi duzula?", "ConfirmDeleteItem": "Elementu hori ezabatzean, artxibo-sistematik zein multimedia-liburutegitik ezabatuko da. Ziur zaude jarraitu nahi duzula?", "ConfirmDeleteImage": "Irudia ezabatu?", - "ConfigureDateAdded": "Konfiguratu nola zehaztuko den eranskinaren data liburutegiaren konfiguraziopeko panelean", + "ConfigureDateAdded": "Konfiguratu 'Gehitze-data'-ren metadatuak nola zehazten diren Hasiera > Liburutegiak > Erakutsi atalean", "Conductor": "Orkestra-zuzendaria", "Composer": "Konpositorea", "CommunityRating": "Komunitatearen puntuazioa", @@ -1467,7 +1467,7 @@ "Casual": "Kasuala", "CancelSeries": "Utzi serieak", "CancelRecording": "Utzi grabazioa", - "Bwdif": "BWDIF", + "Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)", "ButtonWebsite": "Webgunea", "ButtonUseQuickConnect": "Konexio azkarra erabili", "ButtonUninstall": "Desinstalatu", @@ -1491,7 +1491,7 @@ "ButtonRename": "Berriro izendatu", "ButtonRemove": "Ezabatu", "ButtonRefreshGuideData": "Gidako datuak eguneratzea", - "ButtonQuickStartGuide": "Hasiera azkarreko gida", + "ButtonQuickStartGuide": "Konfigurazio gida", "ButtonPreviousTrack": "Aurreko pista", "ButtonPlayer": "Ugaltzailea", "ButtonPause": "Etenaldia", @@ -1624,7 +1624,7 @@ "ButtonBackspace": "Atzera", "ButtonClose": "Itxi", "ButtonSpace": "Hutsunea", - "EnableRewatchingNextUp": "Gaitu berriz ikustea Nobedadeak atalekoentzat", + "EnableRewatchingNextUp": "Gaitu berriz ikustea Nobedadeak atalean", "EnableRewatchingNextUpHelp": "Gaitu jada ikusitako kapituluak \"Nobedadeak\" atalean agertzea.", "LabelMaxVideoResolution": "Onartutako bideo-transkodetzearen bereizmen maximoa", "EnableCardLayout": "Erakutsi CardBox ikusgai", @@ -1635,10 +1635,10 @@ "AllowSegmentDeletion": "Ezabatu segmentuak", "AllowSegmentDeletionHelp": "Ezabatu segmentu zaharrak bezeroak deskargatu ondoren. Honela, bihurtutako fitxategi osoa diskoan gordetzea saihesten da. Desgaitu erreproduzitzeko arazoak badituzu.", "LabelThrottleDelaySeconds": "Throttle buruan", - "LabelThrottleDelaySecondsHelp": "Denbora segundotan transkodetzailea geldiarazten hasiko den. Bezeroak buffer osasuntsu bat mantentzeko bezain handia izan behar da. Bakarrik funtzionatzen du throttling onartua baldin badago.", - "LabelSegmentKeepSeconds": "Segmentuak gordetzeko denbora..", + "LabelThrottleDelaySecondsHelp": "Transkodetzailea mugatuko den denbora segundotan. Bezeroak buffer osasuntsu bat mantentzeko bezain handia izan behar du. Mugaketa gaituta dagoenean bakarrik funtzionatzen du.", + "LabelSegmentKeepSeconds": "Segmentuak mantentzeko denbora", "AirPlay": "AirPlay", - "AllowContentWithTagsHelp": "Erakutsi zehaztutako etiketetik gutxienez bat duen serieen media.", + "AllowContentWithTagsHelp": "Erakutsi gutxienez zehaztutako etiketetariko bat duen multimedia.", "AllowSubtitleManagement": "Baimendu erabiltzaile honek azpitituluak editatzea", "SelectAudioNormalizationHelp": "Pista irabazia - pista bakoitzaren bolumena doitzen du ozentasun berarekin erreproduzitu daitezen. Album irabazia - pista bakoitzaren bolumena doitzen du album batean soilik, albumaren eremu dinamikoa mantentzeko. \"Itzalita\" eta beste aukeren artean aldatzeak uneko erreproduzkzioa berrabiaraztea behar du.", "LabelProcessPriorityHelp": "Handiago edo txikiago ezartzeak PUZ-ak ffmpeg trickplay sortzeko prozesua beste prozesu batzuekin alderatuta nola lehenesten duen zehaztuko du. Trickplay irudiak sortzen dituzun bitartean moteltzea nabaritzen baduzu, baina ez duzu sorpena erabat gelditu nahi, saiatu hau eta hari kopurua ere jaisten.", @@ -1653,5 +1653,398 @@ "LabelExtractTrickplayDuringLibraryScanHelp": "Sortu trickplay irudiak liburutegia eskaneatzean bideoak inportatzen direnean. Bestela, trickplay irudiak programatutako zeregin bezala erauziko dira. Sorkuntza blokeatzen ez bada, horrek ez du eragingo liburutegiko eskaneatzea burutzeko denboran.", "AllowTonemappingSoftwareHelp": "Tonu-mapatzeak bideo baten barruti dinamikoa HDRtik SDRra alda dezake, irudiaren xehetasunak eta koloreak mantenduz, jatorrizko eszena irudikatzeko oso informazio garrantzitsua baita. Gaur egun 10 biteko HDR10, HLG eta DoVi bideoekin bakarrik funtzionatzen du.", "MessageRepositoryInstallDisclaimer": "OHARRA: hirugarrenen pluginen biltegi bat instalatzeak arriskuak dakartza. Kode ezegonkorra edo gaiztoa izan dezake eta edozein unetan alda daiteke. Instalatu fidagarriak diren egileen biltegiak soilik.", - "EncodingFormatHelp": "Hautatu Jellyfin-ek transkodetu behar duen bideo-kodeketa. Jellyfin-ek software-kodeketa erabiliko du hautatutako formaturako hardware-azelerazioa erabilgarri ez dagoenean. H264 kodeketa gaituta egongo da beti." + "EncodingFormatHelp": "Hautatu Jellyfin-ek transkodetu behar duen bideo-kodeketa. Jellyfin-ek software-kodeketa erabiliko du hautatutako formaturako hardware-azelerazioa erabilgarri ez dagoenean. H264 kodeketa gaituta egongo da beti.", + "LabelTrickplayKeyFrameOnlyExtractionHelp": "Gako-fotogramak soilik atera, prozesaketa askoz azkarragoa lortzeko, denbora-zehaztasuna gutxituz. Konfiguratutako hardware deskodetzaileak modu hau onartzen ez badu, software deskodetzailea erabiliko da horren ordez.", + "ExtractTrickplayImagesHelp": "Trickplay irudiak kapitulu-irudien antzekoak dira, baina edukiaren luzera osoa hartzen dute eta bideoetan zehar mugitzean aurrebista bat erakusteko erabiltzen dira.", + "SelectPreferredTranscodeVideoAudioCodecHelp": "Hautatu audio kodek hobetsia bideo edukia transkodetzeko. Kodek hobetsia ez bada onartzen, zerbitzariak eskuragarri dagoen hurrengo kodekik onena erabiliko du.", + "LabelParallelImageEncodingLimitHelp": "Paraleloan exekutatzeko baimendutako irudi-kodeketa kopuru maximoa. Hutsik uzten baduzu, zure sistemaren nukleo kopuruan oinarritutako muga bat aukeratuko da.", + "AllowFmp4TranscodingContainerHelp": "Baimendu sintonizatzaile honetarako fMP4 transkodetze edukiontziari HEVC eta HDR edukiak gaitzea. Sintonizatzaile guztiak ez dira bateragarriak edukiontzi honekin. Desgaitu hau erreprodukzio arazoak badituzu.", + "LibraryInvalidItemIdError": "Liburutegia egoera baliogabean dago eta ezin da editatu. Baliteke akats bat izatea: datu-baseko bide-izena ez da fitxategi-sistemako bide-izen zuzena.", + "RenderPgsSubtitleHelp": "Zehaztu bezeroak PGS azpitituluak errendatu behar dituen azpititulu errendatuen ordez. Horrek zerbitzariaren aldeko transkodifikazioa saihestu dezake bezeroaren aldeko errendatze-errendimenduaren truke.", + "ConfirmDeleteSeries": "Serie hau ezabatzeak fitxategi-sistematik eta zure multimedia liburutegitik {0} kapitulu GUZTIAK ezabatuko ditu. Ziur jarraitu nahi duzula?", + "SelectPreferredTranscodeVideoCodecHelp": "Hautatu transkodetzeko bideo kodek hobetsia. Kodek hobetsia ez bada onartzen, zerbitzariak eskuragarri duen hurrengo kodek onena erabiliko du.", + "IntelLowPowerEncHelp": "Energia gutxiko kodeketak beharrezkoa ez den CPU-GPU sinkronizazioa mantendu dezake. Linuxen desgaitu egin behar dira i915 HuC firmwarea konfiguratuta ez badago.", + "AlwaysRemuxFlacAudioFilesHelp": "Zure arakatzaileak erreproduzitzea ukatzen dituen fitxategiak badituzu edo denbora-zigiluak gaizki kalkulatzen baditu, gaitu hau konponbide gisa.", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Gehigarriek askotan gurasoaren izen txertatu bera izaten dute, markatu hau hala ere izenburu txertatuak erabiltzeko.", + "PleaseConfirmRepositoryInstallation": "Mesedez, egin klik Ados botoian goikoa irakurri duzula eta plugin biltegiaren instalazioarekin jarraitu nahi duzula berresteko.", + "AutoSubtitleStylingHelp": "Modu honek automatikoki aldatuko du azpitituluen estilo-mekanismo natibo eta pertsonalizatuen artean, zure gailu motaren arabera.", + "NativeSubtitleStylingHelp": "Azpitituluen estiloak ez du funtzionatuko gailu batzuetan. Hala ere, ez dator errendimendu-gainkargarekin.", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Transkodetzea abiarazten denean azpititulu guztiak grabatu. Horrek azpitituluen sinkronizazioa bermatzen du transkodetu ondoren, baina transkodetze-abiadura murrizten du.", + "AlwaysRemuxMp3AudioFilesHelp": "Zure arakatzaileak denbora-zigiluak oker kalkulatzen dituen fitxategiak badituzu, gaitu hau konponbide gisa.", + "CustomSplashScreenSize": "Irudi pertsonalizatuek 16x9ko alderdi-erlazioa eta gutxienez 1920x1080ko tamaina izan behar dute.", + "LabelBackdropScreensaverIntervalHelp": "Atzeko planoaren pantaila-babeslea erabiltzean atzeko plano desberdinen arteko denbora segundotan.", + "RememberAudioSelectionsHelp": "Saiatu audio-pista azken bideoaren antzekoena ezartzen.", + "SaveLyricsIntoMediaFoldersHelp": "Audio fitxategien ondoan letrak gordetzeak errazago kudeatzen utziko du.", + "MessageRenameMediaFolder": "Multimedia liburutegi baten izena aldatzeak metadatu guztiak galtzea eragingo du, kontuz erabili aukera hau.", + "LabelScreensaverTimeHelp": "Pantaila-babeslea abiarazteko behar den jarduerarik gabeko denbora segundotan.", + "CustomSubtitleStylingHelp": "Azpitituluen estiloak gailu gehienetan funtzionatuko du, baina errendimendu-gastu gehigarria dakar.", + "LabelVppTonemappingBrightnessHelp": "Aplikatu distira-irabazia VPP tonu-mapeatzean. Gomendatutako balioa 16 da.", + "LabelVppTonemappingContrastHelp": "Aplikatu kontraste-irabazia VPP tonu-mapeatzean. Gomendatutako balioa 1 da.", + "LogLoadFailure": "Erregistro-fitxategia kargatzeak huts egin du. Baliteke oraindik aktiboki idazten ari izatea bertan.", + "LabelSegmentKeepSecondsHelp": "Bezeroak deskargatu ondoren segmentuak gorde behar diren denbora segundotan. Segmentuak ezabatzeko aukera gaituta badago bakarrik funtzionatzen du.", + "ConfirmDeleteLyrics": "Letra hauek ezabatzeak fitxategi-sistematik eta zure multimedia liburutegitik ezabatuko ditu. Ziur jarraitu nahi duzula?", + "EnableDtsHelp": "Gaitu hau soilik zure gailuak DTS onartzen badu edo audio hargailu bateragarri batera konektatuta badago; bestela, erreprodukzioak huts egin dezake.", + "EnableTrueHdHelp": "Gaitu hau soilik zure gailuak TrueHD onartzen badu edo audio hargailu bateragarri batera konektatuta badago; bestela, erreprodukzioak huts egin dezake.", + "EnableEnhancedNvdecDecoderHelp": "NVDEC inplementazio hobetua, desgaitu aukera hau CUVID erabiltzeko deskodetze-erroreak izanez gero.", + "LabelEnableLUFSScanHelp": "Bezeroek audio erreprodukzioa normalizatu dezakete pista guztietan ozentasun berdina lortzeko. Horrek liburutegiko eskaneatzeak luzeagoak egingo ditu eta baliabide gehiago beharko ditu.", + "EnableHi10pHelp": "Gaitu H.264 10 biteko bideoak transkodetzea saihesteko. Desgaitu aukera hau bideoak fotograma hutsak erakusten badira.", + "ErrorDeletingLyrics": "Errorea gertatu da letrak zerbitzaritik ezabatzean. Mesedez, egiaztatu Jellyfinek multimedia karpetan idazteko baimena duela eta saiatu berriro.", + "LabelEnableAudioVbrHelp": "Bit-tasa aldakorrak kalitate hobea eskaintzen du batez besteko bit-tasaren aldean, baina kasu bakan batzuetan buffering eta bateragarritasun arazoak sor ditzake.", + "LabelGroupShowsIntoCollectionsHelp": "Bilduma bateko saioak elementu multzokatu bakar gisa bistaratuko dira saioaren zerrendak bistaratzean.", + "IgnoreDtsHelp": "Aukera hau desgaitzeak arazo batzuk konpondu ditzake, adibidez, audio eta bideo jario bereiziak dituzten kanaletan audioa galtzea.", + "LimitSegmentLengthHelp": "Aukera hau gaitzeak HLS erreproduzitzailea zenbait gailutan, hala nola webOS telebistetan, bilaketan blokeatzea eragotzi dezake.", + "RememberSubtitleSelectionsHelp": "Saiatu azpitituluen pista azken bideoaren antzekoena ezartzen.", + "TonemappingModeHelp": "Hautatu tonu-mapatze modua. Argi-izpiak lehertuta badaude, saiatu RGB modura aldatzen.", + "LabelTrickplayAccelEncodingHelp": "Gaur egun QSV, VA-API, VideoToolbox eta RKMPP-n bakarrik eskuragarri, aukera honek ez du eraginik beste hardware azelerazio metodoetan.", + "AllowEmbeddedSubtitlesHelp": "Desgaitu multimedia edukiontzietan dauden azpitituluak. Liburutegia guztiz freskatzea eskatzen du.", + "LabelSaveTrickplayLocallyHelp": "Trickplay irudiak multimedia karpetetan gordetzeak zure multimedia ondoan jarriko ditu migrazio eta sarbide errazak izan ditzaten.", + "LabelTrickplayThreadsHelp": "ffmpeg-en '-threads' argumentura pasatuko diren hari kopurua.", + "LabelQscaleHelp": "ffmpeg-ek sortutako irudien kalitate-eskala, 2 kalitate handiena izanik eta 31 baxuena.", + "LabelDummyChapterDurationHelp": "Kapitulu faltsuen arteko tartea, segundotan. 0ra ezarri kapitulu faltsuen sorrera desgaitzeko. Hau aldatzeak ez du eraginik izango dauden kapitulu faltsuetan.", + "LabelChapterImageResolutionHelp": "Ateratako kapitulu-irudien bereizmena. Hau aldatzeak ez du eraginik izango dauden kapitulu faltsuetan.", + "ReadInputAtNativeFramerateHelp": "Aukera hau gaitzeak arazo batzuk konpondu ditzake, adibidez, zuzeneko erreprodukzioak azkarregi gelditzea.", + "PlaybackError.RateLimitExceeded": "Une honetan ezin da multimedia hau erreproduzitu abiadura-mugak direla eta.", + "MediaSegmentProvidersHelp": "Gaitu eta sailkatu nahiago dituzun multimedia-segmentu hornitzaileak lehentasunaren arabera.", + "LabelDelimiterWhitelistHelp": "Etiketa zatitzetik kanpo utzi beharreko elementuak. Elementu bat lerro bakoitzeko.", + "PluginLoadRepoError": "Errore bat gertatu da pluginaren xehetasunak biltegitik lortzean.", + "PlaylistPublicDescription": "Baimendu erreprodukzio-zerrenda hau saioa hasitako edozein erabiltzailek ikustea.", + "DisableVbrAudioEncodingHelp": "Eragotzi zerbitzariari bezero honentzat VBR-rekin audioa kodetzea.", + "PlaybackError.MEDIA_NOT_SUPPORTED": "Erreprodukzioak huts egin du bezero honek ez duelako multimedia onartzen.", + "LimitSupportedVideoResolutionHelp": "Erabili 'Bideoa transkodetzeko gehienezko bereizmena' onartutako bideo bereizmen maximo gisa.", + "LyricDownloadersHelp": "Gaitu eta sailkatu zure letra deskargatzaile gogokoenak lehentasunaren arabera.", + "EnableLibraryHelp": "Liburutegia desgaitzeak erabiltzaile guztien ikuspegietatik ezkutatuko du.", + "BlockContentWithTagsHelp": "Ezkutatu gutxienez zehaztutako etiketa bat duen multimedia.", + "PreferNonstandardArtistsTagHelp": "Erabili ARTISTS etiketa ez-estandarra ARTIST etiketaren ordez, eskuragarri dagoenean.", + "LabelTileHeightHelp": "Y norabidean teila bakoitzeko irudi kopuru maximoa.", + "LabelTileWidthHelp": "X norabidean teila bakoitzeko irudi kopuru maximoa.", + "SaveRecordingNFOHelp": "Gorde EPG zerrenden hornitzailearen metadatuak multimediarekin batera.", + "SaveRecordingImagesHelp": "Gorde EPG zerrenden hornitzailearen irudiak multimediarekin batera.", + "PlaybackError.FATAL_HLS_ERROR": "Errore larri bat gertatu da HLS jarioan.", + "PlaybackError.ASS_RENDER_ERROR": "Errore bat gertatu da ASS/SSA azpitituluen errendatzailean.", + "PreferSystemNativeHwDecoder": "Hobetsi sistema eragilearen jatorrizko DXVA edo VA-API hardware deskodetzaileak", + "PluginLoadConfigError": "Errore bat gertatu da pluginaren konfigurazio orriak lortzean.", + "PlaybackError.MEDIA_DECODE_ERROR": "Erreprodukzioak huts egin du multimedia deskodetzean errore bat gertatu delako.", + "LabelCustomTagDelimitersHelp": "Etiketak bereizteko mugatzaile gisa tratatuko diren karaktereak.", + "DeleteServerConfirmation": "Ziur zaude zerbitzari hau ezabatu nahi duzula?", + "PageNotFound": "Hau ez da bilatzen ari zaren orrialdea.", + "StereoDownmixAlgorithmHelp": "Kanal anitzeko audioa estereo bihurtzeko erabiliko den algoritmoa.", + "DlnaMovedMessage": "DLNA funtzionalitatea plugin batera mugitu da.", + "LabelImageIntervalHelp": "Trickplay irudi berri bakoitzaren arteko denbora-tartea (ms).", + "PlaybackError.NO_MEDIA_ERROR": "Ezin da erreproduzitzeko baliozko multimedia iturririk aurkitu.", + "PlaybackError.PLAYER_ERROR": "ErreprodukzioaK huts egin du erreproduzitzailearen errore larri baten ondorioz.", + "MessageCancelSeriesTimerError": "Errore bat gertatu da serieko tenporizadorea ezeztatzean", + "RememberAudioSelections": "Ezarri audio-pista aurreko elementuan oinarrituta", + "VideoRangeTypeNotSupported": "Bideoaren barruti mota ez da onartzen", + "PreferEmbeddedExtrasTitlesOverFileNames": "Hobetsi txertatutako izenburuak fitxategi-izenekin alderatuta gehigarrietarako", + "PasswordRequiredForAdmin": "Pasahitza beharrezkoa da administratzaile kontuetarako.", + "NonBlockingScan": "Blokeorik gabe - sorpena ilaratzen du, gero itzultzen du", + "DisplayLoadError": "Errore bat gertatu da pantailaren konfigurazio datuak kargatzean.", + "LabelJpegQualityHelp": "Trickplay irudientzako JPEG konpresio kalitatea.", + "BlockingScan": "Blokeoa - sorpena ilaran jartzen du, eskaneoa blokeatzen bukatu arte", + "LabelExtractTrickplayDuringLibraryScan": "Atera trickplay irudiak liburutegia eskaneatzean", + "RememberSubtitleSelections": "Ezarri azpitituluen pista aurreko elementuan oinarrituta", + "PlaybackError.NETWORK_ERROR": "Erreprodukzioak huts egin du sareko errore baten ondorioz.", + "MessageCancelTimerError": "Errore bat gertatu da tenporizadorea ezeztatzean", + "PlaybackError.SERVER_ERROR": "Erreprodukzioak huts egin du zerbitzariaren errore baten ondorioz.", + "PluginDisableError": "Errore bat gertatu da plugina desgaitzean.", + "PluginUninstallError": "Errore bat gertatu da plugina desinstalatzean.", + "LabelNoChangelog": "Ez da aldaketa-erregistrorik eman bertsio honetarako.", + "EnableIntelLowPowerHevcHwEncoder": "Gaitu Intel Low-Power HEVC hardware kodetzailea", + "UnknownAudioStreamInfo": "Audio-jarioaren informazioa ezezaguna da", + "SaveRecordingNFO": "Gorde grabazioko EPG metadatuak NFOn", + "MessageSplitVersionsError": "Errore bat gertatu da bertsioak zatitzean", + "MetadataNfoLoadError": "Ezin izan dira metadatuen NFO ezarpenak kargatu", + "AlwaysBurnInSubtitleWhenTranscoding": "Beti grabatu azpitituluak transkodetzean", + "ReadInputAtNativeFramerate": "Irakurri sarrera jatorrizko fotograma-tasan", + "LabelTrickplayKeyFrameOnlyExtraction": "Irudiak fotograma nagusietatik soilik sortu", + "StreamCountExceedsLimit": "Jario kopuruak muga gainditzen du", + "SearchResultsEmpty": "Barkatu! Ez da emaitzarik aurkitu \"{0}\" bilaketarentzat", + "LabelSaveTrickplayLocally": "Gorde trickplay irudiak multimediaren ondoan", + "UnknownVideoStreamInfo": "Bideo-jarioaren informazioa ezezaguna da", + "LabelSelectPreferredTranscodeVideoAudioCodec": "Bideo erreprodukzioan hobetsitako transkodetze audio kodeka", + "PluginEnableError": "Errore bat gertatu da plugina gaitzean.", + "VideoCodecTagNotSupported": "Bideo kodek etiketa ez da onartzen", + "EnableIntelLowPowerH264HwEncoder": "Gaitu Intel Low-Power H.264 hardware kodetzailea", + "EnableSplashScreen": "Gaitu hasierako pantailaren irudia", + "PlaybackError.NotAllowed": "Multimedia hau erreproduzitzea ez dago baimenduta.", + "UseCustomTagDelimitersHelp": "Banatu artista/genero etiketak karaktere pertsonalizatuekin.", + "VideoBitrateNotSupported": "Bideoaren bit-tasa ez da onartzen", + "ContainerBitrateExceedsLimit": "Bideoaren bit-tasak muga gainditzen du", + "LabelDropLyricsHere": "Jarri letrak hemen, edo egin klik arakatzeko.", + "MediaInfoDvBlSignalCompatibilityId": "DV bl seinalearen bateragarritasun IDa", + "LabelVppTonemappingBrightness": "VPP Tonu mapaketaren distira irabazia", + "LabelAlwaysRemuxFlacAudioFiles": "Beti birmultiplikatu FLAC audio fitxategiak", + "AllowAv1Encoding": "Onartu AV1 formatuan kodetzea", + "EnableHi10p": "Gaitu H.264 High 10 profila", + "LabelTrickplayAccelEncoding": "Gaitu hardware bidez azeleratutako MJPEG kodeketa", + "PasswordMissingSaveError": "Pasahitz berria ezin da hutsik egon.", + "PreferNonstandardArtistsTag": "ARTISTS etiketa hobetsi, erabilgarri badago", + "MixedMoviesShows": "Film eta serie nahasiak", + "LabelAllowFmp4TranscodingContainer": "Baimendu fMP4 transkodetze edukiontzia", + "LabelCustomTagDelimiters": "Etiketa mugatzaile pertsonalizatua", + "MediaInfoRpuPresentFlag": "DV rpu aurrezarpenaren bandera", + "HeaderConfirmRepositoryInstallation": "Berretsi pluginen biltegiaren instalazioa", + "NoLyricsSearchResultsFound": "Ez da letrarik aurkitu.", + "MediaInfoElPresentFlag": "DV el aurrezarpenaren bandera", + "PlaylistError.AddFailed": "Errorea erreprodukzio-zerrendara gehitzean", + "SaveRecordingImages": "Gorde EPG irudien grabaketa", + "UnknownError": "Errore ezezagun bat gertatu da.", + "LabelSelectPreferredTranscodeVideoCodec": "Bideo kodeka transkodetzeko hobetsia", + "RenderPgsSubtitle": "PGS azpitituluen errendatze esperimentala", + "MediaInfoVideoRangeType": "Bideo-tarte mota", + "LabelStereoDownmixAlgorithm": "Stereo Downmix algoritmoa", + "PlaylistError.CreateFailed": "Errorea erreprodukzio-zerrenda sortzean", + "SearchForLyrics": "Bilatu letrak", + "MoviesAndShows": "Filmak eta serieak", + "LabelAllowStreamSharing": "Baimendu erreprodukzioa partekatzea", + "LabelAudioTagSettings": "Audio Etiketaren ezarpenak", + "MediaSegmentAction.AskToSkip": "Saltatzeko eskatu", + "LabelTrickplayAccel": "Gaitu hardware deskodetzea", + "ForeignPartsOnly": "Behartutako/Atzerriko piezak bakarrik", + "MediaInfoBlPresentFlag": "DV bl aurrezarpenaren bandera", + "OptionExtractTrickplayImage": "Gaitu trickplay irudien erauzketa", + "LabelMediaSegmentProviders": "Multimedia segmentu hornitzaileak", + "LabelAllowContentWithTags": "Baimendu etiketak dituzten elementuak", + "OptionDateEpisodeAdded": "Kapitulua gehitu den data", + "SaveLyricsIntoMediaFolders": "Gorde letrak multimedia karpetetan", + "EnableVideoToolboxTonemapping": "Gaitu VideoToolbox tonu-mapeatzea", + "LabelSyncPlayNoGroups": "Ez dago talderik eskuragarri", + "HeaderPageNotFound": "Ez da orrialdea aurkitu", + "AndOtherArtists": "{0} eta beste {1} artista.", + "LabelDisableVbrAudioEncoding": "Desgaitu VBR audio kodeketa", + "MoveToTop": "Mugitu gora", + "ThemeVideo": "Gai-bideoa", + "CopyLogSuccess": "Erregistroaren edukia behar bezala kopiatu da.", + "DeleteEntireSeries": "Ezabatu {0} kapitulu", + "LabelEnableLUFSScan": "Gaitu LUFS eskaneatzea", + "LimitSupportedVideoResolution": "Mugatu onartutako bideo-bereizmen maximoa", + "MoveToBottom": "Behera eraman", + "PlaylistPublic": "Baimendu sarbide publikoa", + "UseCustomTagDelimiters": "Erabili etiketa mugatzaile pertsonalizatua", + "OptionDateShowAdded": "Seria gehitutako data", + "EnableLibrary": "Gaitu liburutegia", + "EnableDts": "Gaitu DTS (DCA)", + "LabelGroupShowsIntoCollections": "Serieak bildumetan taldekatu", + "LabelBackdropScreensaverInterval": "Atzeko planoaren pantaila-babeslearen tartea", + "LimitSegmentLength": "Erabili HLS segmentu laburragoak", + "LabelVppTonemappingContrast": "VPP Tonu-maparen kontraste-irabazia", + "StoryArc": "Istorioaren arkua", + "HomeVideosPhotos": "Etxeko bideoak eta argazkiak", + "IgnoreDts": "Ezikusi DTS (denbora-zigilua deskodetzeari)", + "LabelAlwaysRemuxMp3AudioFiles": "Beti birmultiplikatu MP3 audio fitxategiak", + "LabelEnableAudioVbr": "Gaitu VBR audio kodeketa", + "LabelFallbackMaxStreamingBitrate": "Erreserbako gehienezko erreprodukzio-bit-tasa (Mbps)", + "LibraryScanFanoutConcurrency": "Liburutegiko eskaneatze-zeregin paraleloen muga", + "MessageNoItemsAvailable": "Ez dago elementurik eskuragarri une honetan.", + "PlaylistError.UpdateFailed": "Errorea erreprodukzio-zerrenda eguneratzean", + "RetryWithGlobalSearch": "Saiatu berriro bilaketa global batekin", + "LabelEncodingFormatOptions": "Kodeketa formatu aukerak", + "ThemeSong": "Gai-abestia", + "LabelVideoRangeType": "Bideo-tarte mota", + "LabelIsHearingImpaired": "Entzumen urritasuna dutenentzat (SDH)", + "LabelParallelImageEncodingLimit": "Irudi kodeketa paraleloen muga", + "MessageNoFavoritesAvailable": "Ez dago gogokorik une honetan.", + "MediaInfoDvVersionMinor": "DV bertsio txikia", + "MediaInfoDvVersionMajor": "DV bertsio nagusia", + "Unreleased": "Kaleratu gabe", + "LabelTonemappingMode": "Tonu mapatzeko modua", + "DeleteCustomImage": "Ezabatu irudi pertsonalizatua", + "EnableSmoothScroll": "Gaitu korritze leuna", + "OriginalAirDate": "Jatorrizko emisio data", + "ReplaceTrickplayImages": "Ordeztu dauden trickplay irudiak", + "SettingsPageLoadError": "Ezarpenen orria kargatzeak huts egin du", + "UploadCustomImage": "Kargatu irudi pertsonalizatua", + "MetadataImagesLoadError": "Ezin izan dira metadatuen ezarpenak kargatu", + "HeaderNoLyrics": "Ez da letrarik aurkitu", + "HeaderMediaSegmentActions": "Multimedia segmentuen ekintzak", + "LibraryNameInvalid": "Liburutegiaren izena ezin da hutsik egon.", + "ImageDeleteFailed": "Irudia ezabatzeak huts egin du", + "ImageUploadCancelled": "Irudiaren karga bertan behera utzi da", + "ImageUploadFailed": "Irudiaren kargak huts egin du", + "LabelTextWeight": "Testuaren pisua", + "MediaInfoDoViTitle": "DV izenburua", + "MediaInfoDvProfile": "DV profila", + "ScreenResolution": "Pantailaren bereizmena", + "SecondarySubtitles": "Bigarren mailako azpitituluak", + "SubtitleLightGray": "Gris argia", + "LabelMediaDetails": "Multimediaren xehetasunak", + "MachineTranslated": "Makinaz itzulia", + "GoHome": "Joan hasierara", + "UserMenu": "Erabiltzailearen menua", + "BackdropScreensaver": "Atzeko planoaren pantaila-babeslea", + "ResolutionMatchSource": "Iturburua bat-etorri", + "HeaderGuestCast": "Izar gonbidatuak", + "GridView": "Sareta-ikuspegia", + "ListView": "Zerrenda-ikuspegia", + "HeaderDummyChapter": "Kapituluen irudiak", + "HeaderEpisodesStatus": "Kapituluen egoera", + "MediaInfoDvLevel": "DV maila", + "AiTranslated": "AA bidez itzulia", + "HeaderRecordingMetadataSaving": "Grabaketaren metadatuak", + "MenuClose": "Itxi menua", + "MenuOpen": "Ireki menua", + "LabelSelectAudioNormalization": "Audioaren normalizazioa", + "LabelServerVersion": "Zerbitzariaren bertsioa", + "ButtonEditUser": "Editatu erabiltzailea", + "ChannelResolutionSDPAL": "SD (PAL)", + "ChannelResolutionUHD4K": "UHD (4K)", + "LabelImageInterval": "Irudien tartea", + "LabelEnablePlugin": "Gaitu plugina", + "PreviewLyrics": "Aurreikusi letrak", + "LabelDelimiterWhitelist": "Mugatzaileen zerrenda zuria", + "LabelScreensaverTime": "Pantaila-babeslearen denbora", + "HeaderEditPlaylist": "Editatu erreprodukzio-zerrenda", + "HeaderNewPlaylist": "Erreprodukzio-zerrenda berria", + "HeaderNextEpisode": "Hurrengo kapitulua", + "Clip": "Ebaki", + "SubtitleCyan": "Ziana", + "SubtitleGray": "Grisa", + "SubtitleMagenta": "Magenta", + "Unknown": "Ezezaguna", + "Author": "Egilea", + "Lyric": "Letra", + "Colorist": "Kolorista", + "Reset": "Berrezarri", + "Native": "Natiboa", + "Editor": "Editorea", + "SubtitleBlack": "Beltza", + "ViewSettings": "Ikusi ezarpenak", + "Sample": "Lagina", + "Select": "Hautatu", + "LabelProcessPriority": "Prozesuaren prioritatea", + "LabelTileHeight": "Teilaren altuera", + "LabelQscale": "Qscale", + "MediaInfoRotation": "Rotazioa", + "SubtitleBlue": "Urdina", + "LabelTileWidth": "Teilaren zabalera", + "Custom": "Pertsonalizatua", + "EnableTrueHd": "Gaitu TrueHD", + "LogLevel.Information": "Informazioa", + "Creator": "Sortzailea", + "CoverArtist": "Azaleko artista", + "HeaderNextVideo": "Hurrengo bideoa", + "ChannelResolutionHD": "HD", + "ChannelResolutionSD": "SD", + "LabelAlbumGain": "Albumaren irabazia", + "LabelSubtitleStyling": "Azpitituluen estiloa", + "LabelDate": "Data", + "LabelJpegQuality": "JPEG kalitatea", + "LabelQsvDevice": "QSV gailua", + "LabelDuration": "Iraupena", + "LabelLevel": "Maila", + "LastActive": "Azkenengoz aktibo", + "MediaSegmentType.Outro": "Finala", + "Anime": "Anime", + "ChannelResolutionFullHD": "Full HD", + "Regional": "Eskualdekoa", + "DeleteLyrics": "Ezabatu letrak", + "SubtitleGreen": "Berdea", + "SubtitleWhite": "Zuria", + "EditLyrics": "Editatu letrak", + "LabelMediaSegmentsType": "{0} segmentu", + "HeaderAddLyrics": "Gehitu letrak", + "HeaderAllRecordings": "Grabazio guztiak", + "HeaderDeleteSeries": "Ezabatu seriea", + "HeaderLyricDownloads": "Letren deskarga", + "LogLevel.Debug": "Arazpena", + "LabelBuildVersion": "Eraiketa bertsioa", + "LabelRepository": "Biltegia", + "LabelWebVersion": "Webaren bertsioa", + "Lyrics": "Letrak", + "MediaSegmentAction.Skip": "Saltatu", + "MediaSegmentType.Commercial": "Iragarpena", + "LabelTrackGain": "Pistaren irabazia", + "Penciller": "Arkatzailea", + "Alternate": "Ordezkoa", + "AlternateDVD": "DVD alternatiboa", + "Featurette": "Erreportajea", + "HeaderServerUnavailable": "Zerbitzaria ez dago eskuragarri", + "HeaderUploadLyrics": "Kargatu letrak", + "HeaderVideoAdvanced": "Bideo aurreratua", + "LabelDeveloper": "Garatzailea", + "LabelIsSynced": "Sinkronizatuta dago", + "LabelNotInstalled": "Instalatu gabe", + "Letterer": "Letrista", + "LogLevel.Warning": "Oharra", + "LogLevel.Error": "Errorea", + "LogoScreensaver": "Logo pantaila-babeslea", + "LogLevel.Critical": "Kritikoa", + "MediaSegmentSkipPrompt": "Saltatu {0}", + "MediaSegmentAction.None": "Bat ere ez", + "MediaSegmentType.Intro": "Introdukzioa", + "MediaSegmentType.Preview": "Aurreikuspena", + "MediaSegmentType.Recap": "Rekapitulazioa", + "Studio": "Estudioa", + "SubtitleRed": "Gorria", + "SubtitleYellow": "Horia", + "Translator": "Itzultzailea", + "PriorityHigh": "Altua", + "LabelScanBehavior": "Eskanerraren portaera", + "Trickplay": "Trickplay", + "HearingImpairedShort": "HI/SDH", + "PriorityAboveNormal": "Normalaren gainetik", + "PriorityIdle": "Inaktibo", + "LabelDevice": "Gailua", + "LabelInstalled": "Instalatuta", + "SavePassword": "Gorde pasahitza", + "LabelWidthResolutions": "Zabalera bereizmenak", + "HeaderDeleteLyrics": "Ezabatu letrak", + "HeaderAudioAdvanced": "Audio aurreratua", + "LabelLyricDownloaders": "Letra deskargatzaileak", + "LogLevel.Trace": "Traza", + "ViewLyrics": "Ikusi letrak", + "Short": "Film laburra", + "DateModified": "Aldatutako data", + "DeleteName": "Ezabatu {0}", + "DeleteSeries": "Ezabatu seriea", + "DeleteEpisode": "Ezabatu kapitulua", + "Bold": "Lodia", + "LabelSystem": "Sistema", + "PriorityBelowNormal": "Normalaren azpitik", + "PriorityNormal": "Normala", + "LabelTrickplayThreads": "FFmpeg hariak", + "HeaderPreviewLyrics": "Aurreikusi letrak", + "HeaderPerformance": "Errendimendua", + "Inker": "Tintatzailea", + "LabelChapterImageResolution": "Bereizmena", + "LabelDummyChapterDuration": "Tartea", + "LogLevel.None": "Bat ere ez", + "HeaderUpdateRequired": "Eguneraketa beharrezkoa da", + "Illustrator": "Ilustratzailea", + "MessageForgotPasswordPinReset": "Sartu PINa hemen pasahitza berrezartzeko", + "DownloadManager": "Deskargak", + "LabelRestore": "Leheneratu", + "LabelImageCache": "Irudien cachea", + "BackupsPageLoadError": "Babeskopien orria kargatzeak huts egin du", + "ButtonCreateBackup": "Sortu babeskopia", + "Create": "Sortu", + "HeaderBackupsHelp": "Sortu eta leheneratu zure zerbitzariaren argazkiak, datu-basea, metadatuak, azpitituluak eta trickplay barne hartuz.", + "LabelBackupsUnavailable": "Ez dago babeskopiarik eskuragarri", + "LabelDatabase": "Datu-basea", + "LabelProgramData": "Programaren datuak", + "StorageType.Network": "Sarea", + "MessageBackupDisclaimer": "Liburutegiaren tamainaren arabera, babeskopia prozesuak denbora pixka bat iraun dezake.", + "MessageRestoreDisclaimer": "OHARRA: Aurreko babeskopia batetik leheneratzear zaude. Zure zerbitzaria ezingo da erabili prozesuak irauten duen bitartean eta babeskopiatik sortutako datu berri guztiak galduko dira.", + "MessageRestoreInProgress": "Leheneratzea martxan", + "MessageRestoreSuccess": "Leheneratzea behar bezala burutu da", + "MessageWaitingForServer": "Zerbitzariari itxaroten...", + "MessageBackupInProgress": "Babeskopia martxan", + "StorageType.CDRom": "CD-ROM", + "StorageType.Fixed": "Konponduta", + "StorageType.NoRootDirectory": "Ez dago erro karpetarik", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Kengarria", + "StorageType.Unknown": "Ezezaguna", + "Success": "Arrakasta", + "HeaderBackups": "Babeskopiak", + "ButtonLearnMore": "Ikasi gehiago", + "TranscodingLoadError": "Ezin izan dira transkodetze ezarpenak kargatu", + "PluginsLoadError": "Errore bat gertatu da pluginak kargatzean.", + "ConfirmDeleteRepository": "Ezabatu biltegia?", + "DeleteRepositoryConfirmation": "Ziur zaude biltegi hau ezabatu nahi duzula?", + "RepositoriesPageLoadError": "Biltegiak kargatzeak huts egin du", + "MessageServerMismatch": "Konektatzen ari zaren zerbitzaria ez da helbide honetan lehenago konektatu zinen zerbitzari bera. Hori espero bada, hautatu \"Konektatu hala ere\". Bestela, zure konexioa edo zerbitzaria arriskuan egon daitezke.", + "LiveTVPageLoadError": "Grabaketen orria kargatzeak huts egin du", + "ConnectAnyway": "Konektatu hala ere", + "HeaderServerMismatch": "Zerbitzaria ez dator bat" } diff --git a/src/strings/fa.json b/src/strings/fa.json index 2193167e2..844ab7d72 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -30,7 +30,7 @@ "HeaderUsers": "کاربران", "LabelAudioLanguagePreference": "اولویت زبان صدا", "LabelContentType": "نوع محتوا", - "LabelCountry": "کشور", + "LabelCountry": "کشور/منطقه", "LabelCurrentPassword": "رمز فعلی", "LabelCustomCertificatePath": "مسیر اختصاصی گواهینامه SSL", "LabelCustomCertificatePathHelp": "پچ به فایل PKCS #12 حاوی یک گواهینامه و کلید خصوصی است تا پشتیبانی از TLS را در یک دامنه شخصی فعال کند.", @@ -68,7 +68,7 @@ "TabProfiles": "پروفایل ها", "TabUpcoming": "بزودی", "TellUsAboutYourself": "در مورد خودتان به ما بگویید", - "ThisWizardWillGuideYou": "این عمل برای انجام تنظیمات به شما کمک می‌کند. برای شروع، لطفا زبان مورد نظر خود را انتخاب کنید.", + "ThisWizardWillGuideYou": "این برنامه دستیاری برای مراحل نصب کردن است. برای شروع، لطفا نامی برای سرور وارد کرده و زبان مورد نظر خود را انتخاب کنید.", "UserProfilesIntro": "Jellyfin دارای پشتیبانی داخلی از پروفایل کاربران می باشد. با فعال سازی هر کاربر، او می تواند تنظیمات ، وضعیت پخش و کنترل والدین خاص خودش را داشته باشد.", "WelcomeToProject": "به Jellyfin خوش آمدید!", "WizardCompleted": "همه چیزی که فعلا می‌خواهیم همین است. جمع آوری اطلاعات کتابخانه‌های شما هم اکنون توسط Jellyfin آغاز شده است. اپلیکیشن‌های ما را امتحان کنید و سپس بر روی پایان کلیک کنید تا پیشخوان سرور را مشاهده نمایید.", @@ -421,13 +421,13 @@ "Uniform": "یکپارچه", "Tuesday": "سه‌شنبه", "Transcoding": "کدگذاری", - "Trailers": "تریلرها", + "Trailers": "پیش نمایش‌ها", "TrackCount": "{0} آهنگ", "TitlePlayback": "پخش", "TitleHostingSettings": "تنظیمات میزبانی", "TitleHardwareAcceleration": "شتاب سخت افزاری", - "Thursday": "پنج‌شنبه", - "Thumb": "بندانگشتی", + "Thursday": "پنجشنبه", + "Thumb": "انگشت شصت", "ThemeVideos": "تم ویدیوها", "ThemeSongs": "آهنگ‌های تم", "TagsValue": "برچسب‌ها: {0}", @@ -648,7 +648,7 @@ "LabelSeriesRecordingPath": "مسیر ضبط سریال", "LabelSelectFolderGroups": "به طور خودکار محتواهای پوشه‌های زیر به 'فیلم' ، 'موسیقی' و' تلویزیون' گروه بندی شوند", "LabelSeasonNumber": "شماره فصل", - "ConfigureDateAdded": "چگونگی تنظیم 'تاریخ اضافه شده' در ابرداده را در پیش‌خوان > کتابخانه > تنظیمات NFO مشخص کنید", + "ConfigureDateAdded": "تنظیم کردن فراداده‌ی «تاریخ اضافه شده» در پیش‌خوان > کتابخانه‌ها > نمایش", "CinemaModeConfigurationHelp": "حالت سینما تجربه تئاتر گونه را مستقیم به اتاق نشیمن شما می‌آورد با قابلیت پخش تریلرها و پیش نمایش‌ها قبل از سایر ویژگی‌های اصلی.", "NoSubtitleSearchResultsFound": "نتیجه‌ای یافت نشد.", "MessageNoPluginConfiguration": "این افزونه هیچ تنظیماتی برای پیکربندی ندارد.", @@ -743,7 +743,7 @@ "LabelDisplaySpecialsWithinSeasons": "نمایش قسمت های ویژه در فصل هایی که در آنها پخش شده", "LabelDownMixAudioScale": "بهبود صدا هنگام کاهش توزیع کانال های صوتی", "LabelDownMixAudioScaleHelp": "بهبود صدا هنگام کاهش توزیع کانال های صوتی. مقدار را روی ۱ تنظیم کنید تا مقدار اصلی صدا حفظ شود.", - "LabelDownloadLanguages": "بارگیری زبان های", + "LabelDownloadLanguages": "بارگیری زبان ها", "LabelDropImageHere": "تصویر را بکشید اینجا، یا برای مرور کلیک کنید.", "LabelDroppedFrames": "فریم های از دست رفته", "LabelDropShadow": "سایه انداختن", @@ -1319,7 +1319,7 @@ "SyncPlayAccessHelp": "ویژگی SyncPlay امکان همگام سازی پخش با سایر دستگاه ها را فراهم می کند. سطح دسترسی این کاربر به SyncPlay را انتخاب کنید.", "SystemDlnaProfilesHelp": "", "TabContainers": "محفظه ها", - "TvLibraryHelp": "", + "TvLibraryHelp": "راهنمای{1} نامگذاری تلویزیون{0} را برّسی کنید.", "UserAgentHelp": "", "ValueContainer": "محفظه: {0}", "EnableBlurHash": "فعال سازی مکان نگهدارهای تار شده برای تصاویر", @@ -1374,9 +1374,9 @@ "Video": "ویدئو", "UseDoubleRateDeinterlacingHelp": "این تنظیم در هنگام deinterlacing از میزان فیلد استفاده می کند ، که اغلب به آن bob deinterlacing گفته می شود ، که نرخ فریم فیلم را دو برابر می کند تا حرکتی کامل مانند آنچه را که هنگام مشاهده فیلم بهم پیوسته در تلویزیون مشاهده می کنید فراهم کند.", "UseDoubleRateDeinterlacing": "هنگام پاک کردن صفحه ، نرخ فریم را دو برابر کنید", - "TonemappingRangeHelp": "محدوده رنگ خروجی را انتخاب کنید. خودکار همان محدوده ورودی است.", - "TonemappingAlgorithmHelp": "نگاشت تن را می توان دقیق تنظیم کرد. اگر با این گزینه ها آشنا نیستید ، فقط پیش فرض را نگه دارید. مقدار پیشنهادی 'BT.2390' است.", - "ThumbCard": "کارت شست", + "TonemappingRangeHelp": "حدود نمایش رنگ را انتخاب کنید. خودکار همان حدود داخلی است.", + "TonemappingAlgorithmHelp": "نگاشت تن را می توان دقیق تنظیم کرد. اگر با این گزینه ها آشنا نیستید ، پیش فرض را نگه دارید. تنظیمِ پیشنهادی 'BT.2390' است.", + "ThumbCard": "کارت شصت", "TabRepositories": "مخازن", "SyncPlayGroupDefaultTitle": "گروه {0}", "SubtitleVerticalPositionHelp": "شماره خطی که متن ظاهر می شود. اعداد مثبت از بالا به پایین نشان می دهد. اعداد منفی نشانگر پایین به بالا هستند.", @@ -1509,7 +1509,7 @@ "DeleteDevicesConfirmation": "آیا مطمئن هستید که می خواهید همه دستگاه ها را حذف کنید؟ تمام جلسات دیگر از سیستم خارج می شوند. بار دیگر که کاربر وارد سیستم شود ، دستگاه ها دوباره ظاهر می شوند.", "Bwdif": "BWDIF", "ButtonUseQuickConnect": "از اتصال سریع استفاده کنید", - "Track": "شیار", + "Track": "قطعه", "TypeOptionPluralVideo": "ویدیوها", "TypeOptionPluralMovie": "فیلم ها", "TypeOptionPluralEpisode": "قسمت‌ها", @@ -1600,7 +1600,7 @@ "MessageNoFavoritesAvailable": "هیچ مورد علاقه ای در حال حاضر در دسترس نیست.", "HeaderPerformance": "کارایی", "IgnoreDtsHelp": "غیر فعال کردن این گزینه ممکن است برخی اشکالات را رفع کند، مثل نبودن صدا بر روی کانال هایی که جریان صدا و تصویر جداگانه دارند.", - "LabelDummyChapterDurationHelp": "وقفه استخراج تصاویر فصل به ثانیه.", + "LabelDummyChapterDurationHelp": "وقفهٔ بین بخش ‌های الکی. برای توقف تولید بخش‌های الکی، به صفر بزارید. عوض کردن این هیچ تاثیری بر بخش‌هایی که تولید شده‌اند نخواهد داشت.", "HeaderDummyChapter": "تصاویر فصل", "EnableAudioNormalization": "معمول سازی صوت", "AllowCollectionManagement": "به این کاربر اجازه مدیریت مجموعه را بده", @@ -1641,7 +1641,7 @@ "ChannelResolutionHD": "HD", "ChannelResolutionFullHD": "Full HD", "ChannelResolutionUHD4K": "UHD (4K)", - "SelectAudioNormalizationHelp": "تنظیم صدا تِرَک - حجم صدای هر تِرَک صدا را به گونه‌ای تنظیم می‌کند که همه با بلندی یکسانی پخش شوند. تنظیم صدای آلبوم - تنها حجم صدای تِرَک‌های یک آلبوم را با حفظ دامنه داینامیک آن آلبوم، تنظیم می‌کند.", + "SelectAudioNormalizationHelp": "بهرهٔ قطعه - صدای هر قطعه را به گونه‌ای تنظیم می‌کند که همه با بلندی یکسانی پخش شوند. بهرهٔ آلبوم - فقط بلندیهٔ صدای قطعه‌های یک آلبوم را تنظیم می‌کند، بدون تغییردادن بازه دینامیک آلبوم. انتخاب ‌کردن بین «خاموش» یا دیگر گزینه‌ها نیاز به شروع دوباره‌ی پخش کنونی دارد.", "Colorist": "رنگارنگ", "ConfirmDeleteSeries": "حذف این سریال تمام {0} قسمت‌های آن را هم از فهرست رسانه و هم فایل‌هایش را از محل ذخیره‌سازی آن، حذف خواهد کرد. آیا مطمئنید که می‌خواهید ادامه دهید؟", "CoverArtist": "عکس هنرمند", @@ -1730,5 +1730,15 @@ "Retry": "تلاش مجدد", "RenderPgsSubtitle": "نمایش آزمایشی زیرنویس PGS", "RememberAudioSelections": "تنظیم ترک صدا بر اساس آیتم قبلی", - "PreviousChapter": "بخش قبلی" + "PreviousChapter": "بخش قبلی", + "ImageDeleteFailed": "تصویر حذف نشد", + "DeleteCustomImage": "حذف تصویر مخصوص", + "LabelStereoDownmixAlgorithm": "الگوریتم کاهش میکس ِ(داون‌میکس) استریو", + "CustomSplashScreenSize": "تصاویر مخصوص باید به نسبت-تصویر ۱۶x۹ و‌‌ حداقل به اندازهٔ ۱۹۲۰x۱۰۸۰ باشند.", + "ImageUploadCancelled": "بارگذاری تصویر لغو شد", + "ImageUploadFailed": "تصویر بارگذاری نشد", + "LabelEnableAudioVbr": "فعال‌کردن رمزگذاریِ وی‌بی‌آر(VBR)", + "LabelChapterImageResolutionHelp": "وضوح تصویر عکس بخش. عوض کردن این هیچ اثری بر بخش‌هایی که تولیدشده‌اند نخواهد داشت.", + "Translator": "ترجمه‌گر", + "ViewSettings": "مشاهدهٔ تنظیمات" } diff --git a/src/strings/fi.json b/src/strings/fi.json index 6667c81d7..55a2d39b4 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -34,7 +34,7 @@ "SettingsSaved": "Asetukset tallennettu.", "TabProfiles": "Profiilit", "TellUsAboutYourself": "Kerro meille itsestäsi", - "ThisWizardWillGuideYou": "Tämä työkalu auttaa sinua asennusprosessin aikana. Valitse kieli aloittaaksesi.", + "ThisWizardWillGuideYou": "Tämä työkalu auttaa sinua asennusprosessin aikana. Anna palvelimen nimi ja valitse kieli aloittaaksesi.", "UninstallPluginConfirmation": "Haluatko varmasti poistaa lisäosan '{0}'?", "HeaderUninstallPlugin": "Poista lisäosa", "Absolute": "Ehdoton", @@ -113,7 +113,7 @@ "ButtonParentalControl": "Lapsilukko", "ButtonPause": "Tauko", "ButtonPreviousTrack": "Edellinen raita", - "ButtonQuickStartGuide": "Pikaopas", + "ButtonQuickStartGuide": "Asennusopas", "ButtonRefreshGuideData": "Päivitä oppaan tiedot", "ButtonRemove": "Poista", "ButtonRename": "Nimeä uudelleen", @@ -145,7 +145,7 @@ "ColorTransfer": "Värien siirto", "CommunityRating": "Yhteisön arvosana", "Composer": "Säveltäjä", - "ConfigureDateAdded": "Määritä miten 'Lisäyspäivä' tunnistetaan kohdasta Hallintapaneeli > Kirjastot > NFO-asetukset", + "ConfigureDateAdded": "Määritä miten 'Lisäyspäivä' tunnistetaan kohdasta Hallintapaneeli > Kirjastot > Näytä", "ConfirmDeleteImage": "Poista kuva?", "ConfirmDeleteItem": "Tämän kohteen poistaminen poistaa sen sekä tiedostojärjestelmästä että mediakirjastosta. Haluatko varmasti jatkaa?", "ConfirmDeleteItems": "Näiden kohteiden poistaminen poistaa ne sekä tiedostojärjestelmästä että mediakirjastosta. Haluatko varmasti jatkaa?", @@ -243,7 +243,7 @@ "Album": "Albumi", "Played": "Toistetut", "PlayFromBeginning": "Toista alusta", - "PlayNext": "Toista seuraava", + "PlayNext": "Toista seuraavaksi", "Play": "Toista", "PinCodeResetConfirmation": "Haluatko varmasti poistaa Helppo PIN -koodin?", "People": "Ihmiset", @@ -353,7 +353,7 @@ "HeaderSubtitleDownloads": "Tekstitysten lataus", "HeaderSpecialEpisodeInfo": "Erikoisjakson tiedot", "HeaderSortOrder": "Lajittelujärjestys", - "HeaderSetupLibrary": "Aseta mediakirjastosi", + "HeaderSetupLibrary": "Määritä mediakirjastosi", "HeaderSeriesStatus": "Sarjan tila", "HeaderSeriesOptions": "Sarjan asetukset", "HeaderSelectTranscodingPath": "Valitse transkoodauksen väliakaistiedostojen sijainti", @@ -646,8 +646,8 @@ "EveryXHours": "{0} tunnin välein", "EveryXMinutes": "{0} minuutin välein", "EveryHour": "Tunnin välein", - "LastSeen": "Viimeksi nähty {0}", - "Yadif": "YADIF", + "LastSeen": "Viimeksi aktiivinen {0}", + "Yadif": "Yet Another DeInterlacing Filter (YADIF)", "Writer": "Kirjoittaja", "WelcomeToProject": "Tervetuloa Jellyfiniin!", "Wednesday": "Keskiviikko", @@ -793,7 +793,7 @@ "LabelMessageText": "Viestin sisältö", "LabelMaxScreenshotsPerItem": "Kuvakaappausten enimmäismäärä per kohde:", "LabelLoginDisclaimerHelp": "Kirjautumissivun alareunassa näytettävä viesti.", - "LabelLockItemToPreventChanges": "Lukitse tämä kohde estääksesi tulevat muutokset", + "LabelLockItemToPreventChanges": "Lukitse tämä kohde estääksesi tulevat metatietojen muutokset", "LabelLocalHttpServerPortNumberHelp": "HTTP-palvelimen TCP-portin numero.", "LabelLocalHttpServerPortNumber": "Paikallisen HTTP-portin numero", "LabelKodiMetadataSaveImagePaths": "Tallenna kuvien tiedostosijainnit NFO-tiedostoihin", @@ -1026,7 +1026,7 @@ "HeaderAccessScheduleHelp": "Rajoita käyttö tiettyihin aikoihin luomalla käyttöaikataulu.", "HardwareAccelerationWarning": "Laitteistokiihdytyksen käyttöönotto voi joissain ympäristöissä aiheuttaa epävakautta. Varmista, että käyttöjärjestelmän ja näytönohjaimen ajurit ovat ajan tasalla. Mikäli huomaat videotoistossa ongelmia käyttöönoton jälkeen, palauta \"Ei mitään\" -asetus.", "EncoderPresetHelp": "Nopeampi asetus parantaa transkoodauksen nopeutta kuvanlaadun kustannuksella, ja hitaampi kuvanlaatua nopeuden kustannuksella.", - "H264CrfHelp": "Constant Rate Factor (CRF) on x264 -enkooderin kuvanlaadun vakioasetus. Voit valita arvon lukujen 0 ja 51 väliltä, jossa matalammat arvot tarkoittavat parempaa kuvanlaatua (suurempien tiedostokokojen hinnalla). Järkevät arvot ovat väliltä 18-28. Oletusarvo x264:lle on 23, joten voit käyttää sitä lähtökohtana.", + "H264CrfHelp": "Constant Rate Factor (CRF) on x264 ja x265 -ohjelmistoenkooderien kuvanlaadun vakioasetus. Voit valita arvon lukujen 0 ja 51 väliltä, jossa matalammat arvot tarkoittavat parempaa kuvanlaatua (suurempien tiedostokokojen hinnalla). Järkevät arvot ovat väliltä 18-28. Oletusarvo x264:lle on 23, joten voit käyttää sitä lähtökohtana. Laitteistoenkooderit eivät käytä näitä asetuksia.", "GuideProviderSelectListings": "Valitse luettelot", "GuideProviderLogin": "Kirjaudu", "GuestStar": "Vieraileva näyttelijä", @@ -1278,11 +1278,11 @@ "LabelTonemappingThresholdHelp": "Sävykartoitusalgoritmin parametrit on hienosäädetty kohtauskohtaisesti ja raja-arvon avulla havaitaan onko kohtaus muuttunut vai ei. Jos nykyisen kehyksen keskimääräinen kirkkaus ja tämän hetkisen keskiarvon välimatka ylittää kynnysarvon, lasketaan kohtauksen kirkkauden keski- ja huippuarvo uudelleen. Suositellut ja oletusarvot ovat 0.8 ja 0.2.", "LabelTonemappingThreshold": "Sävykartoituksen raja-arvo", "LabelTonemappingRange": "Sävykartoituksen alue", - "LabelTonemappingPeakHelp": "Korvaa signal-/nominal-/reference-huiput tällä arvolla. Hyödyllinen silloin kun näytön metatiedoissa ilmoitettu huipputieto ei ole luotettava tai kun sävykartoitetaan matalammalta alueelta korkeammalle. Suositeltu arvo on 100 ja oletusarvo on 0.", + "LabelTonemappingPeakHelp": "Korvaa metatiedoissa ilmoitetun input signaalin arvon tällä huippuarvolla. Suositeltu arvo on 100 (1000nit).", "LabelTonemappingPeak": "Sävykartoituksen huippu", - "LabelTonemappingParamHelp": "Säädä sävykartoitusalgoritmia. Suositeltu ja oletusarvo on NaN. Tyypillisesti jätetään tyhjäksi.", + "LabelTonemappingParamHelp": "Säädä sävykartoitusalgoritmia. Tyypillisesti jätetään tyhjäksi.", "LabelTonemappingParam": "Sävykartoituksen parametrit", - "LabelTonemappingDesatHelp": "Vähentää tämän tason ylittävien värien kylläisyyttä. Auttaa estämään ylikorostuneita värejä muuntamalla väriavaruuden ulkopuoliset värit tasaisesti kohti valkoista. Korkeampi arvo säilyttää enemmän värejä. Suositus- ja oletusarvot ovat 0 ja 0,5.", + "LabelTonemappingDesatHelp": "Vähentää tämän kirkkaustason ylittävien värien kylläisyyttä. Suositeltu arvo on 0 (poista käytöstä).", "LabelTonemappingDesat": "Sävykartoituksen kylläisyys", "LabelTonemappingAlgorithm": "Valitse käytettävä sävykartoitusalgoritmi", "LabelSyncPlayTimeSyncOffset": "Aika poikkeama", @@ -1545,8 +1545,8 @@ "LabelVideoInfo": "Videon tiedot", "LabelAudioInfo": "Äänen tiedot", "LabelPlaybackInfo": "Toiston tiedot", - "AspectRatioFill": "Täyttö", - "AspectRatioCover": "Kansi", + "AspectRatioFill": "Täytä", + "AspectRatioCover": "Suurenna", "EnableFallbackFontHelp": "Käytä omia vaihtoehtoisia fontteja. Tämän avulla voidaan välttää tekstitysten renderöintiongelmia.", "EnableFallbackFont": "Käytä varmistusfontteja", "WriteAccessRequired": "Jellyfin tarvitsee kirjoitusoikeuden tähän kansioon. Varmista kirjoitusoikeus ja yritä uudelleen.", @@ -1646,12 +1646,12 @@ "PreferSystemNativeHwDecoder": "Suosi käyttöjärjestelmän natiiveja DXVA- ja VA-API-laitteistodekoodereita", "ContainerBitrateExceedsLimit": "Videon bittinopeus ylittää rajoituksen", "AudioBitDepthNotSupported": "Äänen bittisyvyyttä ei tueta", - "EnableEnhancedNvdecDecoderHelp": "Kokeellinen NVDEC-toteutus, jota ei tule käyttää, jollei dekoodausvirheitä esiinny.", + "EnableEnhancedNvdecDecoderHelp": "Parannettu NVDEC-toteutus. Kytke tämä asetus pois päältä käyttääksesi CUVID:ia jos dekoodausvirheitä esiintyy.", "PersonRole": "roolissa {0}", "HomeVideosPhotos": "Kotivideot ja valokuvat", "Bold": "Lihavoitu", "LabelTextWeight": "Tekstin vahvuus", - "EnableSplashScreen": "Käytä aloitusruutua", + "EnableSplashScreen": "Ota käyttöön aloitusruudun kuva", "MediaInfoDvLevel": "DV-taso", "MediaInfoDvProfile": "DV-profiili", "MediaInfoDoViTitle": "DV-nimike", @@ -1689,7 +1689,7 @@ "SaveRecordingImagesHelp": "Tallenna ohjelmaoppaan tietolähteen kuvat mediatiedoston oheen.", "HeaderDummyChapter": "Kappalekuvat", "LabelDummyChapterDuration": "Aikaväli", - "LabelDummyChapterDurationHelp": "Kappalekuvien purkuväli sekunteina. Poista kappalekuvien luonti käytöstä asettamalla arvoksi 0. Tämän muutos ei vaikuta olemassa oleviin kappaleisiin.", + "LabelDummyChapterDurationHelp": "Kappaleiden välinen aika sekunteina. Aseta arvoksi 0 poistaaksesi kappaleiden luomisen käytöstä. Tämä muutos ei vaikuta olemassa oleviin kappaleisiin.", "LabelDummyChapterCount": "Enimmäismäärä", "LabelDummyChapterCountHelp": "Yhdestä mediatiedostosta purettavien kappalekuvien enimmäismäärä.", "LabelChapterImageResolution": "Resoluutio", @@ -1715,7 +1715,7 @@ "MediaInfoBlPresentFlag": "DV BL havaittu", "MediaInfoRpuPresentFlag": "DV RPU havaittu", "MediaInfoDvVersionMinor": "DV-väliversio", - "LabelParallelImageEncodingLimitHelp": "Rinnakkain suoritettavien kuvaenkoodauksien enimmäismäärä. Asettamalla arvoksi \"0\" rajoitus asetetaan automaattisesti järjestelmän perusteella.", + "LabelParallelImageEncodingLimitHelp": "Rinnakkain suoritettavien kuvaenkoodauksien enimmäismäärä. Jättämällä arvon tyhjäksi rajoitus asetetaan automaattisesti järjestelmän perusteella.", "HeaderPerformance": "Suorituskyky", "LabelParallelImageEncodingLimit": "Rinnakkaisten kuvaenkoodauksien rajoitus", "LabelEnableAudioVbr": "Käytä vaihtelevaa bittinopeutta äänen pakkaamiseen", @@ -1775,7 +1775,7 @@ "BackdropScreensaver": "Backdrop-näytönsäästäjä", "LogoScreensaver": "Logo-näytönsäästäjä", "LabelIsHearingImpaired": "Kuulorajoitteisille (SDH)", - "SelectAudioNormalizationHelp": "Kappalekohtainen vahvistus – jokaisen kappaleen äänenvoimakkuus pyritään säätämään samalle tasolle. Albumikohtainen vahvistus – kappaleiden äänenvoimakkuus pyritään tasaamaan albumikohtaisesti albumikohtaisen dynamiikan säilyttämiseksi.", + "SelectAudioNormalizationHelp": "Kappalekohtainen vahvistus – jokaisen kappaleen äänenvoimakkuus pyritään säätämään samalle tasolle. Albumikohtainen vahvistus – kappaleiden äänenvoimakkuus pyritään tasaamaan albumikohtaisesti albumikohtaisen dynamiikan säilyttämiseksi. Asetuksen vaihtaminen voi edellyttää nykyisen toiston käynnistämistä uudelleen.", "LabelAlbumGain": "Albumikohtainen vahvistus", "LabelSelectAudioNormalization": "Äänenvoimakkuuden normalisointi", "LabelTrackGain": "Kappelkohtainen vahvistus", @@ -1827,7 +1827,7 @@ "PlaybackError.NotAllowed": "Tämän median toisto ei ole sallittua.", "EnableVideoToolboxTonemapping": "Ota käyttöön VideoToolbox Tone mapping", "AllowMjpegEncoding": "Salli enkoodaus MJPEG formaattiin (käytetään trickplay luomisessa)", - "LabelTrickplayAccel": "Ota käyttöön laitteistokiihdytys", + "LabelTrickplayAccel": "Ota käyttöön laitteistodekoodaus", "LabelTrickplayAccelHelp": "Varmista, että otat käyttöön \"Salli MPEG enkoodaus' Transkoodausasetuksissa jos laitteistosi tukee sitä.", "LabelScanBehaviorHelp": "Oletuskäyttäytyminen on ei-blokkaava, joka lisää median kirjastoon ennen trickplay luontia. Blokkaus varmistaa, että trickplay-tiedostot luodaan ennen kuin media lisätään kirjastoon, mutta tekee skannauksista merkittävästi pitempiä.", "PriorityIdle": "Toimeton", @@ -1882,7 +1882,7 @@ "EnableTrueHd": "Ota TrueHD käyttöön", "HeaderNextItem": "Seuraava {0}", "HeaderNextItemPlayingInValue": "Seuraavaksi {0} jonka alkuun {1}", - "LabelTrickplayKeyFrameOnlyExtraction": "Luo kuvia ainoastaan avainkehyksistä", + "LabelTrickplayKeyFrameOnlyExtraction": "Luo kuvia ainoastaan avainruuduista", "PasswordMissingSaveError": "Uusi salasana ei voi olla tyhjä.", "SearchForLyrics": "Etsi sanoituksia", "LabelSelectPreferredTranscodeVideoCodec": "Ensisijainen transkoodaava videokoodekki", @@ -1903,7 +1903,7 @@ "LabelNoChangelog": "Tälle julkaisuversiolle ei ole saatavilla muutoshistoriaa.", "LabelIsSynced": "On synkronisoitu", "NoLyricsSearchResultsFound": "Kappaleen sanoja ei löytynyt.", - "PluginLoadRepoError": "Virhe haettaessa lisäosan tietoja sen säilytyspaikasta.", + "PluginLoadRepoError": "Virhe haettaessa lisäosan tietoja ohjelmavarastosta.", "PluginUninstallError": "Virhe poistettaessa lisäosaa.", "PreviewLyrics": "Esikatsele kappaleen sanoja", "PluginEnableError": "Virhe lisäosan käyttöönotossa.", @@ -1919,13 +1919,13 @@ "LabelSelectPreferredTranscodeVideoAudioCodec": "Ensisijainen transkoodattu äänikoodekki videotoistossa", "AllowTonemappingSoftwareHelp": "Sävykartoitus voi muuttaa videon dynaamista aluetta HDR:stä SDR:ään säilyttäen silti kuvan yksityiskohdat ja värin, jotka ovat erittäin tärkeitä alkuperäisen kohtauksen tiedon säilyttämiseksi. Tällä hetkellä se toimii ainoastaan 10bit HDR10, -HLG, ja DoVi-videoiden kanssa.", "Editor": "Ohjaus", - "Letterer": "Kirjoittaja", + "Letterer": "Tekstaaja", "LibraryScanFanoutConcurrencyHelp": "Samanaikaisten suoritettavien kirjastoskannausten maksimimäärä. Mikäli tämä arvo on jätetty tyhjäksi, määrä valitaan järjestelmän prosessorin säikeiden lukumäärän mukaan. VAROITUS: Tämän arvon asettaminen liian korkeaksi voi aiheuttaa ongelmia verkkotiedostojärjestelmissä. Jos koet ongelmatilanteista, laske tätä numeroa.", "SaveLyricsIntoMediaFoldersHelp": "Sanoitusten tallentaminen äänitiedoston kanssa samaan sijaintiin helpottaa niiden hallintaa.", "SelectPreferredTranscodeVideoAudioCodecHelp": "Valitse ensisijainen äänikoodekki videomateriaalin transkoodaamiseen. Jos ensisijainen koodekki ei ole tuettu, serveri käyttää seuraavaksi parasta koodekkia.", - "LabelTrickplayAccelEncoding": "Käyttöönota rautakiihdytetty MJPEG enkoodaus", + "LabelTrickplayAccelEncoding": "Ota käyttöön laitteistokiihdytetty MJPEG enkoodaus", "LabelTrickplayAccelEncodingHelp": "Tällä hetkellä ainoastaan käytettävissä QSV, VA-API, VideoToolbox ja RKMPP. Tällä valinnalla ei ole vaikutusta muihin rautakiihdytysmetodeihin.", - "HeaderVideoAdvanced": "Edistynyt video", + "HeaderVideoAdvanced": "Video (edistynyt)", "PlaylistPublicDescription": "Salli tämän soittolistan katsominen jokaiselle kirjautuneelle käyttäjälle.", "DateModified": "Muokkauspäivämäärä", "AlwaysBurnInSubtitleWhenTranscoding": "Polta tekstit aina muunnettaessa", @@ -1992,5 +1992,72 @@ "DeleteServerConfirmation": "Haluatko varmasti poistaa tämän palvelimen?", "LabelDevice": "Laite", "MetadataImagesLoadError": "Metadata-asetusten lataus epäonnistui", - "LibraryNameInvalid": "Kirjastolla tulee olla nimi." + "LibraryNameInvalid": "Kirjastolla tulee olla nimi.", + "AutoSubtitleStylingHelp": "Tämä tila vaihtaa automaattisesti natiivien ja mukautettujen tekstitystyylien välillä päätelaitteesta riippuen.", + "Custom": "Mukautettu", + "CustomSubtitleStylingHelp": "Tekstityksien tyylit toimivat useimmilla laitteilla, mutta kuormittavat suorituskykyä.", + "DisplayLoadError": "Virhe ladattaessa näytön konfiguraatiotietoja.", + "LastActive": "Viimeksi aktiivinen", + "MessageCancelSeriesTimerError": "Virhe peruessa sarjan ajastinta", + "MetadataNfoLoadError": "Metatietojen NFO-asetusten lataaminen epäonnistui", + "Native": "Natiivi", + "LabelMediaSegmentProviders": "Median osioiden tarjoajat", + "LabelSubtitleStyling": "Tekstityksien tyyli", + "MessageCancelTimerError": "Virhe peruessa ajastinta", + "LabelGroupShowsIntoCollections": "Kokoa sarjat kokoelmiksi", + "LabelGroupShowsIntoCollectionsHelp": "Kokoelmissa olevat sarjat näytetään yhtenä kohteena sarjalistauksissa.", + "LimitSegmentLength": "Käytä lyhyempiä HLS segmenttejä", + "LimitSegmentLengthHelp": "Tämän asetuksen käyttöön ottaminen voi ehkäistä HLS soittimen jämähtämistä kelattaessa tietyillä laitteilla, kuten webOS TV:llä.", + "MediaSegmentProvidersHelp": "Ota käyttöön ja järjestä halutut mediaosioiden tarjoajat tärkeysjärjestykseen.", + "CustomSplashScreenSize": "Mukautetut kuvat tulee olla 16x9 näyttösuhteessa ja minimissään 1920x1080 resoluutiolla.", + "DeleteCustomImage": "Poista mukautettu kuva", + "ImageDeleteFailed": "Kuvan poistaminen epäonnistui", + "ImageUploadCancelled": "Kuvan lähetys peruttiin", + "ImageUploadFailed": "Kuvan lähetys epäonnistui", + "RetryWithGlobalSearch": "Yritä uudelleen globaalilla haulla", + "StreamCountExceedsLimit": "Lähetyksien määrä ylittää raja-arvon", + "UploadCustomImage": "Lähetä mukautettu kuva", + "UseCustomTagDelimitersHelp": "Leikkaa artisti/genre tagit mukautetulla merkillä.", + "ReadInputAtNativeFramerate": "Lue syöte natiivilla ruudunpäivitysnopeudella", + "ReadInputAtNativeFramerateHelp": "Tämän asetuksen käyttöön ottaminen voi ratkaista joitain ongelmia, esim. suoratoiston ennenaikaisen pysähtymisen.", + "UseCustomTagDelimiters": "Käytä mukautettua tagien erotinta", + "SettingsPageLoadError": "Asetukset-sivun lataaminen epäonnistui", + "NativeSubtitleStylingHelp": "Tekstityksen tyylit eivät toimi kaikilla laitteilla, mutta ei aiheuta ylimääräistä kuormaa.", + "VideoCodecTagNotSupported": "Videokoodekin tagi ei ole tuettu", + "LogLoadFailure": "Logitiedoston lataaminen epäonnistui. Se saattaa olla kirjoituksen kohteena.", + "HeaderServerUnavailable": "Palvelin ei ole käytettävissä", + "DownloadManager": "Lataukset", + "ViewSettings": "Tarkastele asetuksia", + "HeaderUpdateRequired": "Päivitys vaaditaan", + "DeleteRepositoryConfirmation": "Oletko varma, että haluat poistaa tämän ohjelmavaraston?", + "RepositoriesPageLoadError": "Ohjelmavarastojen lataus epäonnistui", + "TranscodingLoadError": "Transkoodaus asetusten lataus epäonnistui", + "StorageType.CDRom": "CD-levy", + "StorageType.Fixed": "Kiinteä", + "MessageForgotPasswordPinReset": "Anna PIN-koodi viimeistelläksesi salasanan palautuksen", + "ButtonLearnMore": "Lue lisää", + "HeaderBackupsHelp": "Luo ja palauta palvelimen tilannekuvia, jotka voivat sisältää tietokannan, metatiedot, tekstitykset ja trickplay-kuvat.", + "LabelBackupsUnavailable": "Ei varmuuskopioita saatavilla", + "PluginsLoadError": "Lisäosia ladatessa tapahtui virhe.", + "StorageType.NoRootDirectory": "Ei juurihakemistoa", + "StorageType.Ram": "Muisti", + "StorageType.Network": "Verkko", + "StorageType.Removable": "Irrotettava", + "StorageType.Unknown": "Tuntematon", + "Success": "Onnistui", + "BackupsPageLoadError": "Varmuuskopio sivun lataus epäonnistui", + "ButtonCreateBackup": "Luo varmuuskopio", + "Create": "Luo", + "LabelDatabase": "Tietokanta", + "LabelRestore": "Palauta", + "MessageBackupDisclaimer": "Varmuuskopiointi saattaa kestää jonkin aikaa riippuen kirjastosi koosta.", + "MessageBackupInProgress": "Varmuuskopiointi meneillään", + "MessageRestoreDisclaimer": "VAROITUS: Olet palauttamassa aiempaa varmuuskopiota. Palvelin ei ole käytettävissä palautuksen aikana, ja kaikki varmuuskopion ottamisen jälkeen tehdyt muutokset katoavat.", + "MessageRestoreInProgress": "Palautus meneillään", + "MessageRestoreSuccess": "Palautus onnistui", + "MessageWaitingForServer": "Odotetaan vastausta palvelimelta...", + "HeaderBackups": "Varmuuskopiot", + "ConfirmDeleteRepository": "Poista ohjelmavarasto?", + "LabelImageCache": "Kuvien välimuisti", + "LabelProgramData": "Ohjelmatiedot" } diff --git a/src/strings/fr-ca.json b/src/strings/fr-ca.json index d946b1dd6..41acd11fe 100644 --- a/src/strings/fr-ca.json +++ b/src/strings/fr-ca.json @@ -5,10 +5,10 @@ "ButtonCancel": "Annuler", "ButtonGotIt": "J'ai compris", "ButtonQuickStartGuide": "Guide de démarrage rapide", - "ButtonSignOut": "Sign out", + "ButtonSignOut": "Se déconnecter", "ConfirmDeleteItem": "Supprimer cet élément l'effacera à la fois du système de fichiers et de votre médiathèque. Êtes-vous sûr de vouloir continuer?", "Delete": "Supprimer", - "Disconnect": "Se déconnecter", + "Disconnect": "Déconnecter", "Download": "Télécharger", "Edit": "Modifier", "EnableDisplayMirroring": "Duplication d'écran", @@ -60,7 +60,7 @@ "Subtitles": "Sous-titres", "Sunday": "Dimanche", "TellUsAboutYourself": "Parlez-nous de vous", - "ThisWizardWillGuideYou": "Cet assistant vous guidera dans le processus de configuration. Pour commencer, merci de sélectionner votre langue préférée.", + "ThisWizardWillGuideYou": "Cet assistant vous guidera dans le processus de configuration. Pour commencer, merci d'entrer votre nom et de sélectionner votre langue préférée.", "Thursday": "Jeudi", "TrackCount": "{0} pistes", "Tuesday": "Mardi", @@ -165,7 +165,7 @@ "CopyStreamURL": "Copier l'URL du stream", "ContinueWatching": "Continuer à visionner", "Connect": "Connexion", - "ConfirmEndPlayerSession": "Voulez-vous éteindre Jellyfin sur {0}?", + "ConfirmEndPlayerSession": "Voulez-vous arrêter Jellyfin sur {0}?", "ConfirmDeletion": "Confirmer la suppression", "ConfirmDeleteItems": "Supprimer ces éléments les effaceront du disque et de votre médiathèque. Êtes-vous sûr de vouloir continuer?", "ConfirmDeleteImage": "Effacer l'image?", @@ -1053,7 +1053,7 @@ "LabelProtocolInfoHelp": "La valeur utilisée pour répondre aux requêtes « GetProtocolInfo » de l’appareil.", "Bold": "Gras", "LabelTonemappingDesatHelp": "Appliquer la désaturation pour les hautes lumières qui dépassent ce niveau de luminosité. La valeur recommandée est 0 (désactivé).", - "LabelTonemappingParamHelp": "Paramètre pour régler l’algorithme de tone-mapping. La valeur par défaut et recommandée est vide.", + "LabelTonemappingParamHelp": "Paramètre pour régler l’algorithme de tone-mapping. Recommandée de laisser vide.", "LabelSyncPlayLeaveGroupDescription": "Désactiver SyncPlay", "LabelSyncPlayNewGroup": "Nouveau groupe", "LabelPostProcessorArgumentsHelp": "Utilisez {path} comme le chemin d’accès au fichier d’enregistrement.", @@ -1144,7 +1144,7 @@ "LabelTonemappingParam": "Paramètre de tone-mapping", "LabelSkipForwardLength": "Temps de saut en avant", "LabelSortName": "Nom de tri", - "LabelDummyChapterDurationHelp": "L’intervalle entre les chapitres fictifs. Définir une valeur de 0 pour désactiver la génération de chapitres fictifs. Le changement de cette valeur n’aura aucun effet sur les chapitres fictifs existants.", + "LabelDummyChapterDurationHelp": "L’intervalle entre les chapitres fictifs en secondes. Définir une valeur de 0 pour désactiver la génération de chapitres fictifs. Le changement de cette valeur n’aura aucun effet sur les chapitres fictifs existants.", "LabelEnableLUFSScan": "Activer le scan LUFS", "LabelOriginalAspectRatio": "Format d’image original", "LabelPlayer": "Lecteur", @@ -1752,7 +1752,7 @@ "LabelSelectPreferredTranscodeVideoCodec": "Codec vidéo préféré pour le transcodage", "MediaSegmentAction.Skip": "Sauter", "MediaSegmentType.Commercial": "Commercial", - "MediaSegmentType.Intro": "Intro", + "MediaSegmentType.Intro": "Générique", "AlwaysRemuxFlacAudioFilesHelp": "Si vous avez des fichiers que votre navigateur refuse de lire ou dont les horodatages sont calculés de manière imprécise, activez cette option en guise de solution de rechange.", "AlwaysRemuxMp3AudioFilesHelp": "Si vous avez des fichiers pour lesquels votre navigateur calcule les horodatages de manière imprécise, activez cette option en guise de solution de rechange.", "LabelQsvDevice": "Dispositif QSV", @@ -1970,5 +1970,44 @@ "ReadInputAtNativeFramerate": "Lire l'entrée à la fréquence d'images native", "ReadInputAtNativeFramerateHelp": "Activer cette option peut résoudre certains problèmes, par exemple les flux en direct qui s'arrêtent prématurément.", "LimitSegmentLength": "Utiliser des segments HLS plus courts", - "LimitSegmentLengthHelp": "L'activation de cette option peut aider à empêcher le lecteur HLS de se bloquer pendant la recherche sur certains appareils, comme les téléviseurs webOS." + "LimitSegmentLengthHelp": "L'activation de cette option peut aider à empêcher le lecteur HLS de se bloquer pendant la recherche sur certains appareils, comme les téléviseurs webOS.", + "HeaderServerUnavailable": "Serveur Indisponible", + "HeaderUpdateRequired": "Mise à jour requise", + "ViewSettings": "Afficher les paramètres", + "MessageForgotPasswordPinReset": "Entrez le NIP ici pour finaliser la réinitialisation du mot de passe", + "DownloadManager": "Téléchargement", + "LabelImageCache": "Cache d'images", + "LabelProgramData": "Données du programme", + "StorageType.CDRom": "CD-ROM", + "StorageType.Fixed": "Réparé", + "BackupsPageLoadError": "Échec du chargement de la page de sauvegarde", + "ButtonCreateBackup": "Créer une sauvegarde", + "Create": "Créer", + "HeaderBackupsHelp": "Créez et restaurez des instantanés de votre serveur qui peuvent inclure la base de données, les métadonnées, les sous-titres et le trickplay.", + "LabelBackupsUnavailable": "Aucune sauvegarde disponible", + "LabelDatabase": "Base de données", + "MessageBackupInProgress": "Sauvegarde en cours", + "MessageRestoreDisclaimer": "AVERTISSEMENT : Vous êtes sur le point de restaurer une sauvegarde précédente. Votre serveur sera inutilisable pendant toute la durée du processus et toutes les nouvelles données créées depuis la sauvegarde seront perdues.", + "MessageRestoreInProgress": "Restauration en cours", + "MessageRestoreSuccess": "Restauration terminée avec succès", + "LabelRestore": "Restaurer", + "MessageWaitingForServer": "En attente du serveur...", + "StorageType.Network": "Réseau", + "StorageType.NoRootDirectory": "Pas de répertoire racine", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Amovible", + "StorageType.Unknown": "Inconnu", + "Success": "Succès", + "HeaderBackups": "Sauvegardes", + "MessageBackupDisclaimer": "Selon la taille de votre médiathèque, le processus de sauvegarde peut prendre un certain temps.", + "PluginsLoadError": "Une erreur s'est produite lors du chargement des plugins.", + "DeleteRepositoryConfirmation": "Êtes-vous sûr de vouloir supprimer ce dépôt ?", + "ButtonLearnMore": "En apprendre plus", + "TranscodingLoadError": "Échec du chargement des paramètres de transcodage", + "ConfirmDeleteRepository": "Supprimer le dépôt ?", + "RepositoriesPageLoadError": "Échec du chargement des dépôts", + "LiveTVPageLoadError": "Échec du chargement de la page d'enregistrements", + "ConnectAnyway": "Se connecter quand même", + "HeaderServerMismatch": "Incompatibilité du serveur", + "MessageServerMismatch": "Le serveur auquel vous vous connectez n'est pas le même que celui auquel vous vous êtes précédemment connecté à cette adresse. Si cela est normal, sélectionnez « Se connecter quand même ». Sinon, votre connexion ou le serveur pourrait être compromis." } diff --git a/src/strings/fr.json b/src/strings/fr.json index 8704c6581..8de946447 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1087,7 +1087,7 @@ "ThemeSongs": "Thèmes musicaux", "ThemeVideos": "Génériques", "TheseSettingsAffectSubtitlesOnThisDevice": "Ces paramètres affectent les sous-titres de cet appareil", - "ThisWizardWillGuideYou": "Cet assistant vous guidera dans le processus de configuration. Pour commencer, merci de sélectionner votre langue préférée.", + "ThisWizardWillGuideYou": "Cet assistant vous guidera dans le processus de configuration. Pour commencer, merci d'entrer votre nom et de sélectionner votre langue préférée.", "Thumb": "Vignettes", "Thursday": "Jeudi", "TitleHardwareAcceleration": "Accélération Matérielle", @@ -1398,7 +1398,7 @@ "KnownProxiesHelp": "Liste séparée par des virgules des adresses IP ou noms des relais connus pour se connecter à ce serveur Jellyfin. Cette liste est nécessaire au bon fontionnement des en-têtes 'X-Forwarded-For'. Un redémarrage sera requis après sauvegarde.", "LabelTonemappingThreshold": "Seuil de mappage tonal", "LabelTonemappingDesatHelp": "Désaturer les couleurs qui dépassent ce niveau de luminosité. La valeur recommandée est 0 (désactivé).", - "LabelTonemappingParamHelp": "Régler l'algorithme de mappage tonal. Sauf cas particulier, il est recommandé de laisser ce champ vide.", + "LabelTonemappingParamHelp": "Paramètre pour régler l’algorithme de tone-mapping. Recommandée de laisser vide.", "LabelTonemappingPeak": "Pic de mappage tonal", "LabelTonemappingThresholdHelp": "Les paramètres de l'algorithme de mappage tonal sont affinés pour chaque scène. Définir ici le seuil utilisé pour détecter un changement de scène. Si la distance entre la moyenne actuelle de la luminosité du cadre et la moyenne mobile actuelle dépasse la valeur de ce seuil, la moyenne et le pic de la luminosité du cadre sont recalculés. La valeur recommandée est 0,8 ; la valeur par défaut est 0,2.", "LabelVideoRange": "Plage vidéo", @@ -1615,7 +1615,7 @@ "SelectAll": "Tout sélectionner", "ButtonExitApp": "Quitter l'application", "Clip": "Clip", - "ThemeVideo": "Thème vidéo", + "ThemeVideo": "Générique", "ThemeSong": "Thème musical", "Sample": "Échantillon", "Scene": "Scène", @@ -1694,7 +1694,7 @@ "HeaderRecordingMetadataSaving": "Enregistrement des métadonnées", "SaveRecordingNFO": "Enregistrer les métadonnées du fournisseur dans le fichier NFO", "SaveRecordingImages": "Enregistrer les images des métadonnées du fournisseur", - "LabelDummyChapterDurationHelp": "Intervalle entre deux chapitres factices ou 0 pour désactiver la génération. Changer la valeur n’affectera pas les chapitres existants.", + "LabelDummyChapterDurationHelp": "Intervalle entre deux chapitres factices en secondes ou 0 pour désactiver la génération. Changer la valeur n’affectera pas les chapitres existants.", "LabelDummyChapterCount": "Limite", "LabelChapterImageResolution": "Résolution", "LabelChapterImageResolutionHelp": "La résolution d'image des chapitre factices. Changer la valeur n’affectera pas les chapitres existants.", @@ -2026,5 +2026,44 @@ "ReadInputAtNativeFramerateHelp": "Activer cette option peut résoudre certains problèmes, par exemple les flux en direct qui s'arrêtent prématurément.", "ReadInputAtNativeFramerate": "Lire l'entrée à la fréquence d'images native", "LimitSegmentLengthHelp": "L'activation de cette option peut aider à empêcher le lecteur HLS de se bloquer pendant la recherche sur certains appareils, comme les téléviseurs webOS.", - "LimitSegmentLength": "Utiliser des segments HLS plus courts" + "LimitSegmentLength": "Utiliser des segments HLS plus courts", + "HeaderServerUnavailable": "Serveur Indisponible", + "HeaderUpdateRequired": "Mise à jour requise", + "ViewSettings": "Afficher les paramètres", + "MessageForgotPasswordPinReset": "Entrez le PIN ici pour finaliser la réinitialisation du mot de passe", + "DownloadManager": "Téléchargement", + "LabelImageCache": "Cache d'images", + "LabelRestore": "Restaurer", + "StorageType.CDRom": "CD-ROM", + "StorageType.NoRootDirectory": "Pas de répertoire racine", + "HeaderBackups": "Sauvegardes", + "BackupsPageLoadError": "Échec du chargement de la page de sauvegarde", + "ButtonCreateBackup": "Créer une sauvegarde", + "Create": "Créer", + "HeaderBackupsHelp": "Créez et restaurez des instantanés de votre serveur qui peuvent inclure la base de données, les métadonnées, les sous-titres et le trickplay.", + "LabelBackupsUnavailable": "Aucune sauvegarde disponible", + "LabelDatabase": "Base de données", + "MessageWaitingForServer": "En attente du serveur...", + "LabelProgramData": "Données du programme", + "MessageBackupInProgress": "Sauvegarde en cours", + "MessageRestoreInProgress": "Restauration en cours", + "MessageRestoreSuccess": "Restauration terminée avec succès", + "StorageType.Fixed": "Réparé", + "StorageType.Network": "Réseau", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Amovible", + "StorageType.Unknown": "Inconnu", + "Success": "Succès", + "MessageBackupDisclaimer": "Selon la taille de votre médiathèque, le processus de sauvegarde peut prendre un certain temps.", + "MessageRestoreDisclaimer": "AVERTISSEMENT : Vous êtes sur le point de restaurer une sauvegarde précédente. Votre serveur sera inutilisable pendant toute la durée du processus et toutes les nouvelles données créées depuis la sauvegarde seront perdues.", + "PluginsLoadError": "Une erreur s'est produite lors du chargement des plugins.", + "ButtonLearnMore": "En apprendre plus", + "TranscodingLoadError": "Échec du chargement des paramètres de transcodage", + "ConfirmDeleteRepository": "Supprimer le dépôt ?", + "DeleteRepositoryConfirmation": "Êtes-vous sûr de vouloir supprimer ce dépôt ?", + "RepositoriesPageLoadError": "Échec du chargement des dépôts", + "LiveTVPageLoadError": "Échec du chargement de la page d'enregistrements", + "ConnectAnyway": "Se connecter quand même", + "HeaderServerMismatch": "Incompatibilité du serveur", + "MessageServerMismatch": "Le serveur auquel vous vous connectez n'est pas le même que celui auquel vous vous êtes précédemment connecté à cette adresse. Si cela est normal, sélectionnez « Se connecter quand même ». Sinon, votre connexion ou le serveur pourrait être compromis." } diff --git a/src/strings/ga.json b/src/strings/ga.json index b6f8d2f78..f652c2a9a 100644 --- a/src/strings/ga.json +++ b/src/strings/ga.json @@ -172,7 +172,7 @@ "LabelMetadataSaversHelp": "Roghnaigh na formáidí comhaid le húsáid agus do mheiteashonraí á sábháil.", "LabelMinResumeDuration": "Íosfhad atosaithe", "LabelNumber": "Uimhir", - "LabelParallelImageEncodingLimitHelp": "Líon uasta ionchóduithe íomhá a cheadaítear a rith go comhthreomhar. Má shocraíonn tú é seo go 0, roghnóidh sé teorainn bunaithe ar chroí-chomhaireamh do chórais.", + "LabelParallelImageEncodingLimitHelp": "Uasmhéid na n-ionchóduithe íomhá a cheadaítear a rith go comhthreomhar. Má fhágtar seo folamh roghnófar teorainn bunaithe ar chomhaireamh croí do chórais.", "LabelParentalRating": "Rátáil tuismitheora", "LabelParentNumber": "Uimhir tuismitheora", "LabelPostProcessorArgumentsHelp": "Úsáid {path} mar chosán an chomhaid taifeadta.", @@ -318,7 +318,7 @@ "LabelTonemappingDesat": "Desat mapála ton", "LabelTonemappingDesatHelp": "Cuir dísháithiú i bhfeidhm ar bhuaicphointí a sháraíonn an leibhéal gile seo. Is é an luach molta ná 0 (díchumasaigh).", "LabelTonemappingParam": "Param mapála ton", - "LabelTonemappingParamHelp": "Tiúnáil an algartam mapála ton. Is iad na luachanna molta agus réamhshocraithe NaN. Go ginearálta fág bán é.", + "LabelTonemappingParamHelp": "Tiúnáil an algartam mapála toin. Fág bán é go ginearálta.", "LabelTonemappingPeak": "Buaic mhapála ton", "LabelTonemappingPeakHelp": "Sáraigh luach meiteashonraí leabaithe an chomhartha ionchuir leis an buaicluach seo ina ionad. Is é an luach réamhshocraithe ná 100 (1000nit).", "LabelTonemappingRange": "Raon mapála ton", @@ -351,7 +351,7 @@ "Letterer": "Leitir Ceanainn", "LibraryAccessHelp": "Roghnaigh na leabharlanna le roinnt leis an úsáideoir seo. Beidh riarthóirí in ann gach fillteán a chur in eagar ag baint úsáide as an mbainisteoir meiteashonraí.", "LibraryScanFanoutConcurrency": "Teorainn le tascanna scanadh leabharlainne comhthreomhara", - "LibraryScanFanoutConcurrencyHelp": "Líon uasta tascanna comhthreomhara le linn scanadh leabharlainne. Má shocraíonn tú é seo go 0, roghnóidh sé teorainn bunaithe ar chroí-chomhaireamh do chórais. RABHADH: D'fhéadfadh socrú na huimhreach seo ró-ard a bheith ina chúis le saincheisteanna le córais comhad líonra; má bhíonn fadhbanna agat an uimhir seo a ísliú.", + "LibraryScanFanoutConcurrencyHelp": "Uasmhéid na dtascanna comhthreomhara le linn scananna leabharlainne. Má fhágtar seo folamh roghnófar teorainn bunaithe ar chomhaireamh croí do chórais. RABHADH: D’fhéadfadh fadhbanna a bheith ann le córais chomhad líonra nuair a shocraítear an uimhir seo ró-ard; má bhíonn fadhbanna agat, ísligh an uimhir seo.", "LimitSupportedVideoResolution": "Cuir teorainn leis an taifeach físe uasta a dtacaítear leis", "LimitSupportedVideoResolutionHelp": "Bain úsáid as 'Maximum Allowed Video Transcoding Resolution' mar réiteach físe uasta tacaithe.", "List": "Liosta", @@ -599,7 +599,7 @@ "Rewind": "Athchasadh", "MessageConfirmRestart": "An bhfuil tú cinnte gur mian leat Jellyfin a atosú?", "MessageConfirmRevokeApiKey": "An bhfuil tú cinnte gur mian leat an eochair API seo a chúlghairm? Cuirfear deireadh tobann le nasc an fheidhmchláir leis an bhfreastalaí seo.", - "MessageConfirmShutdown": "An bhfuil tú cinnte gur mian leat an freastalaí a mhúchadh?", + "MessageConfirmShutdown": "An bhfuil tú cinnte gur mian leat an freastalaí a dhúnadh?", "MessageContactAdminToResetPassword": "Téigh i dteagmháil le do riarthóir córais chun do phasfhocal a athshocrú.", "MessageCreateAccountAt": "Cruthaigh cuntas ag {0}", "MessageDeleteTaskTrigger": "An bhfuil tú cinnte gur mian leat an truicear tasc seo a scriosadh?", @@ -726,7 +726,7 @@ "Vertical": "Ingearach", "WriteAccessRequired": "Éilíonn Jellyfin rochtain scríofa ar an bhfillteán seo. Cinntigh le do thoil go bhfuil rochtain scríofa agat agus bain triail eile as.", "Writer": "Scríbhneoir", - "AspectRatioFill": "Líon", + "AspectRatioFill": "Sín", "LabelRemuxingInfo": "Eolas Remuxing", "LabelOriginalMediaInfo": "Buneolas faoi na Meáin", "LabelSyncPlayInfo": "Eolas sioncronaithePlay", @@ -805,7 +805,7 @@ "LabelDropLyricsHere": "Buail liricí anseo, nó cliceáil chun brabhsáil.", "LabelDropShadow": "Buail scáth", "LabelDropSubtitleHere": "Buail fotheideal anseo, nó cliceáil chun brabhsáil.", - "LabelDummyChapterDurationHelp": "An t-eatramh idir caibidlí caocha. Socraigh go 0 chun giniúint chaibidil caoch a dhíchumasú. Ní bheidh aon éifeacht ag athrú seo ar chaibidlí caocha atá ann cheana féin.", + "LabelDummyChapterDurationHelp": "An t-eatramh idir caibidlí bréige i soicindí. Socraigh go 0 chun giniúint caibidlí bréige a dhíchumasú. Ní bheidh aon tionchar ag athrú seo ar chaibidlí bréige atá ann cheana féin.", "LabelEnableAudioVbrHelp": "Cuireann ráta giotán athraitheach cáilíocht níos fearr ar fáil do chóimheas meánráta giotán, ach i gcásanna neamhchoitianta d'fhéadfadh saincheisteanna maolánacha agus comhoiriúnachta a bheith mar thoradh orthu.", "LabelEnableAutomaticPortMap": "Cumasaigh mapáil uathoibríoch calafoirt", "LabelEnableAutomaticPortMapHelp": "Cuir calafoirt phoiblí ar do ródaire ar aghaidh go huathoibríoch chuig calafoirt áitiúla ar do fhreastalaí trí UPnP. B'fhéidir nach n-oibreoidh sé seo le roinnt samhlacha ródaire nó cumraíochtaí líonra. Ní chuirfear athruithe i bhfeidhm go dtí tar éis atosú freastalaí.", @@ -1187,7 +1187,7 @@ "TabParentalControl": "Rialú Tuismitheoirí", "TellUsAboutYourself": "Inis dúinn fút féin", "TheseSettingsAffectSubtitlesOnThisDevice": "Bíonn tionchar ag na socruithe seo ar fhotheidil ar an ngléas seo", - "ThisWizardWillGuideYou": "Cabhróidh an draoi seo leat tú a threorú tríd an bpróiseas socraithe. Chun tús a chur leis, roghnaigh an teanga is fearr leat.", + "ThisWizardWillGuideYou": "Cabhróidh an draoi seo leat an próiseas socraithe a dhéanamh. Chun tús a chur leis, cuir isteach ainm freastalaí agus roghnaigh do theanga is fearr leat.", "Thumb": "Ordóg", "Thursday": "Déardaoin", "TitleHardwareAcceleration": "Luasghéarú Crua-earraí", @@ -1376,7 +1376,7 @@ "HeaderEnabledFieldsHelp": "Díthiceáil réimse chun é a ghlasáil agus cosc a chur ar a chuid sonraí a athrú.", "ConfirmDeleteSeries": "Má scriostar an tsraith seo, scriosfar GACH eipeasóid {0} ón gcóras comhad agus ó do leabharlann meán araon. An bhfuil tú cinnte gur mian leat leanúint ar aghaidh?", "ConfirmDeleteItems": "Má scriostar na míreanna seo, scriosfar iad ón gcóras comhad agus ó do leabharlann meán araon. An bhfuil tú cinnte gur mian leat leanúint ar aghaidh?", - "ConfirmEndPlayerSession": "Ar mhaith leat Jellyfin a mhúchadh ar {0}?", + "ConfirmEndPlayerSession": "Ar mhaith leat Jellyfin a dhúnadh síos ar {0}?", "Console": "Consól", "Continuing": "Ag leanúint ar aghaidh", "HeaderError": "Earráid", @@ -1386,7 +1386,7 @@ "Sports": "Spórt", "HeaderFetchImages": "Faigh Íomhánna", "HeaderForKids": "Do Pháistí", - "AspectRatioCover": "Clúdach", + "AspectRatioCover": "Zúmáil", "Unreleased": "Gan scaoileadh fós", "HeaderFrequentlyPlayed": "Seinnte go Minic", "HeaderGuestCast": "Réaltaí Aoi", @@ -1420,7 +1420,7 @@ "ButtonOk": "Ceart go leor", "ButtonPlayer": "Imreoir", "ButtonPreviousTrack": "An rian roimhe seo", - "ButtonQuickStartGuide": "Treoir Tosaigh Thapa", + "ButtonQuickStartGuide": "Treoir Socraithe", "ButtonRefreshGuideData": "Athnuaigh Sonraí Treorach", "ButtonRename": "Athainmnigh", "ButtonResume": "Athdhúisigh", @@ -1709,7 +1709,7 @@ "EnableIntelLowPowerH264HwEncoder": "Cumasaigh ionchódóir crua-earraí Intel Low-Power H.264", "EncodingFormatHelp": "Roghnaigh an t-ionchódú físe gur chóir jellyfin transcode chuig. Úsáidfidh Jellyfin ionchódú bogearraí nuair nach bhfuil luasghéarú crua-earraí don fhormáid roghnaithe ar fáil. Cumasófar ionchódú H264 i gcónaí.", "ThemeVideo": "Físeán Téama", - "EnableSplashScreen": "Cumasaigh an splancscáileán", + "EnableSplashScreen": "Cumasaigh an íomhá splancscáileáin", "LabelVppTonemappingContrast": "VPP Tone mapáil gnóthachan codarsnachta", "MediaInfoDvLevel": "Leibhéal DV", "LabelQscale": "Qscale", @@ -1812,8 +1812,70 @@ "LabelSubtitleStyling": "Stíleáil fotheideal", "Native": "Dúchasach", "NativeSubtitleStylingHelp": "Ní oibreoidh stíliú fotheideal ar ghléasanna áirithe. Mar sin féin, ní thagann sé le haon forchostais feidhmíochta.", - "LibraryNameInvalid": "Ní féidir le hainm na leabharlainne a bheith folamh ná spásanna tosaigh/rianta a bheith ann.", + "LibraryNameInvalid": "Ní féidir ainm na leabharlainne a fhágáil folamh.", "DeleteServerConfirmation": "An bhfuil tú cinnte gur mian leat an freastalaí seo a scriosadh?", "LastActive": "Gníomhach seo caite", - "LabelDevice": "Gléas" + "LabelDevice": "Gléas", + "CopyLogSuccess": "Cóipeáladh ábhar an loga go rathúil.", + "HeaderServerUnavailable": "Freastalaí Gan Fáil", + "ImageDeleteFailed": "Theip ar scriosadh íomhá", + "SettingsPageLoadError": "Theip ar an leathanach socruithe a lódáil", + "DisplayLoadError": "Tharla earráid agus sonraí cumraíochta an taispeána á lódáil.", + "DownloadManager": "Íoslódálacha", + "ReadInputAtNativeFramerateHelp": "D’fhéadfadh sé go réiteofaí roinnt fadhbanna tríd an rogha seo a chumasú, e.g. sruthú beo ag stopadh roimh am.", + "MetadataNfoLoadError": "Theip ar shocruithe NFO meiteashonraí a lódáil", + "ReadInputAtNativeFramerate": "Léigh ionchur ag ráta fráma dúchasach", + "LogLoadFailure": "Theip ar an gcomhad loga a luchtú. Seans go bhfuiltear fós ag scríobh chuige go gníomhach.", + "HeaderPageNotFound": "Leathanach gan aimsiú", + "PageNotFound": "Ní hé seo an leathanach atá á lorg agat.", + "LabelGroupShowsIntoCollectionsHelp": "Taispeánfar seónna i mbailiúchán mar mhír ghrúpáilte amháin agus liostaí seónna á dtaispeáint.", + "LabelGroupShowsIntoCollections": "Taispeántais ghrúpa i mbailiúcháin", + "LimitSegmentLength": "Úsáid codanna HLS níos giorra", + "LimitSegmentLengthHelp": "D’fhéadfadh sé go gcuideodh cumasú an rogha seo le cosc a chur ar an seinnteoir HLS dul i bhfostú le linn cuardaigh ar ghléasanna áirithe, amhail teilifíseáin webOS.", + "Retry": "Déan iarracht arís", + "RetryWithGlobalSearch": "Déan iarracht eile le cuardach domhanda", + "ViewSettings": "Féach ar shocruithe", + "CustomSplashScreenSize": "Ba chóir go mbeadh íomhánna saincheaptha i gcóimheas gné 16x9 agus méid íosta 1920x1080.", + "DeleteCustomImage": "Scrios Íomhá Saincheaptha", + "ImageUploadCancelled": "Uaslódáil íomhá curtha ar ceal", + "ImageUploadFailed": "Theip ar uaslódáil íomhá", + "MessageForgotPasswordPinReset": "Cuir isteach an PIN anseo chun an t-athshocrú pasfhocail a chríochnú", + "StreamCountExceedsLimit": "Tá líon na sruthanna níos mó ná an teorainn", + "UploadCustomImage": "Uaslódáil Íomhá Saincheaptha", + "MetadataImagesLoadError": "Theip ar shocruithe meiteashonraí a lódáil", + "HeaderUpdateRequired": "Nuashonrú Riachtanach", + "MessageWaitingForServer": "Ag fanacht leis an bhfreastalaí...", + "DeleteRepositoryConfirmation": "An bhfuil tú cinnte gur mian leat an stórlann seo a scriosadh?", + "LabelImageCache": "Taisce Íomhá", + "MessageRestoreDisclaimer": "RABHADH: Tá tú ar tí cúltaca roimhe seo a athchóiriú. Ní bheidh do fhreastalaí inúsáidte ar feadh ré an phróisis agus caillfear aon sonraí nua a cruthaíodh ó rinneadh an cúltaca.", + "RepositoriesPageLoadError": "Theip ar luchtú na stórtha", + "PluginsLoadError": "Tharla earráid agus breiseáin á luchtú.", + "StorageType.Fixed": "Seasta", + "StorageType.Unknown": "Anaithnid", + "Success": "Rath", + "ButtonLearnMore": "Foghlaim Tuilleadh", + "Create": "Cruthaigh", + "HeaderBackupsHelp": "Cruthaigh agus athchóirigh snapshots de do fhreastalaí lena n-áirítear an bunachar sonraí, meiteashonraí, fotheidil agus cleasaíocht.", + "LabelBackupsUnavailable": "Níl aon chúltacaí ar fáil", + "LabelDatabase": "Bunachar Sonraí", + "LabelProgramData": "Sonraí an Chláir", + "LabelRestore": "Athchóirigh", + "MessageBackupDisclaimer": "Ag brath ar mhéid do leabharlainne, d’fhéadfadh go dtógfadh an próiseas cúltaca tamall.", + "MessageBackupInProgress": "Cúltaca ar siúl", + "MessageRestoreInProgress": "Athchóiriú ar siúl", + "MessageRestoreSuccess": "Athchóiriú críochnaithe go rathúil", + "StorageType.CDRom": "CD-ROM", + "StorageType.Network": "Líonra", + "StorageType.NoRootDirectory": "Gan Eolaire Fréamhacha", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Inbhainte", + "HeaderBackups": "Cúltacaí", + "TranscodingLoadError": "Theip ar shocruithe traschódaithe a lódáil", + "BackupsPageLoadError": "Theip ar an leathanach cúltaca a lódáil", + "ButtonCreateBackup": "Cruthaigh Cúltaca", + "ConfirmDeleteRepository": "Scrios an stórlann?", + "LiveTVPageLoadError": "Theip ar an leathanach taifeadtaí a lódáil", + "ConnectAnyway": "Ceangail Ar Aon Slí", + "HeaderServerMismatch": "Mí-chomhoiriúnacht Freastalaí", + "MessageServerMismatch": "Ní hé an freastalaí atá tú ag ceangal leis an bhfreastalaí céanna a raibh tú ceangailte leis roimhe seo ag an seoladh seo. Más rud é go bhfuiltear ag súil leis seo, roghnaigh \"Ceangail ar aon nós\". Seachas sin, d'fhéadfadh do nasc nó an freastalaí a bheith i mbaol." } diff --git a/src/strings/gl.json b/src/strings/gl.json index a00865904..c37a3cef4 100644 --- a/src/strings/gl.json +++ b/src/strings/gl.json @@ -205,7 +205,7 @@ "ButtonRevoke": "Revogar", "ButtonEditOtherUserPreferences": "Edita o perfil desta usuaria, imaxe e preferencias personais.", "ButtonScanAllLibraries": "Escanear tódalas bibliotecas", - "BurnSubtitlesHelp": "Indica se o servidor debería incluír os subtítulos ao recodificar os vídeos. Se non fas esto mellorarás moito o rendemento. Elixe Auto para incluir formatos baseados na imaxe (VobSub, PGS, SUB, IDX, etc.) e certos subtítulos ASS ou SSA.", + "BurnSubtitlesHelp": "Indica se o servidor debería incluír os subtítulos. Se non fas esto mellorarás moito o rendemento. Elixe Auto para incluir formatos baseados na imaxe (VobSub, PGS, SUB, IDX, etc.) e certos subtítulos ASS ou SSA.", "ButtonAddScheduledTaskTrigger": "Engadir activador", "ButtonForgotPassword": "Contrasinal esquecido", "DownloadsValue": "{0} descargas", @@ -1017,5 +1017,44 @@ "LabelEnableAutomaticPortMapHelp": "Redireccionar automáticamente portos publicos do teu router aos portos locais do teu servidor mediante UPnP. É posible que isto non funcione con algúns modelos de router ou confiugurancións de rede. Os cambios non se aplicarán ata despois de reiniciar o servidor.", "LabelEnableAudioVbr": "Activar a codificación de audio VBR", "LabelEnableAudioVbrHelp": "A taxa de bits variable ofrece unha mellor relación entre a calidade e a taxa media de bits, pero nalgúns casos raros pode causar problemas de compatibilidade e almacenamento no búfer.", - "LabelEnableHardwareDecodingFor": "Activar a decodificación de hardware para" + "LabelEnableHardwareDecodingFor": "Activar a decodificación de hardware para", + "AirPlay": "AirPlay", + "BackdropScreensaver": "Protector de pantalla de fondo", + "AllowFmp4TranscodingContainerHelp": "Permite que o contedor de transcodificación fMP4 para este sintonizador active contidos HEVC e HDR. Non todos os sintonizadores son compatibles con este contedor. Desactiva esta opción se tes problemas de reprodución.", + "AllowStreamSharingHelp": "Permite que Jellyfin duplique o fluxo mpegts do sintonizador e comparta este fluxo duplicado cos seus clientes. Isto é útil cando o sintonizador ten un límite de conta total de fluxos, pero tamén pode causar problemas de reprodución.", + "AlwaysBurnInSubtitleWhenTranscoding": "Gravar sempre os subtítulos ao transcodificar", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Gravar todos os subtítulos cando se active a transcodificación. Isto garante a sincronización dos subtítulos despois da transcodificación a custo dunha velocidade de transcodificación reducida.", + "AllowTonemappingSoftwareHelp": "O mapeo de tons pode transformar o rango dinámico dun vídeo de HDR a SDR mantendo os detalles e as cores da imaxe, que son información moi importante para representar a escena orixinal. Actualmente só funciona con vídeos HDR10, HLG e DoVi de 10 bits.", + "AlwaysRemuxFlacAudioFilesHelp": "Se tes ficheiros que o teu navegador rexeita a reprodución ou nos que calcula as marcas de tempo de forma incorrecta, activa isto como solución alternativa.", + "ChannelResolutionSDPAL": "SD (PAL)", + "AutoSubtitleStylingHelp": "Este modo alternará automaticamente entre os mecanismos de estilo de subtítulos nativos e personalizados segundo o tipo de dispositivo.", + "AlwaysRemuxMp3AudioFilesHelp": "Se tes ficheiros nos que o teu navegador calcula as marcas de tempo de forma incorrecta, activa isto como solución alternativa.", + "AndOtherArtists": "{0} e {1} outros artistas.", + "CopyLogSuccess": "O contido do rexistro copiouse correctamente.", + "AlternateDVD": "DVD alternativo", + "Anime": "Anime", + "LabelThrottleDelaySeconds": "Acelerar despois", + "LabelThrottleDelaySecondsHelp": "Tempo en segundos despois do cal se limitará o transcodificador. Debe ser o suficientemente grande para que o cliente manteña un búfer saudable. Só funciona se a limitación está activada.", + "DropShadow": "Sombra paralela", + "EnableBlurHash": "Activar marcadores de posición borrosos para as imaxes", + "CustomSubtitleStylingHelp": "O estilo dos subtítulos funcionará na maioría dos dispositivos, pero supón un custo adicional de rendemento.", + "EditLyrics": "Editar letra", + "Custom": "Personalizado", + "DisplayLoadError": "Produciuse un erro ao cargar os datos de configuración da pantalla.", + "DeleteServerConfirmation": "Estás seguro de que queres eliminar este servidor?", + "DisableVbrAudioEncodingHelp": "Impide que o servidor codifique audio con VBR para este cliente.", + "Depressed": "Deprimido", + "CustomSplashScreenSize": "As imaxes personalizadas deben ter unha relación de aspecto de 16x9 e un tamaño mínimo de 1920x1080.", + "DeleteCustomImage": "Eliminar imaxe personalizada", + "DateModified": "Data de modificación", + "HeaderLatestRecordings": "Gravacións recentemente engadidas", + "HeaderNextEpisode": "Seguinte episodio", + "HeaderPageNotFound": "Páxina non atopada", + "HeaderOtherItems": "Outros elementos", + "HeaderMusicQuality": "Calidade de son", + "HeaderNewPlaylist": "Nova lista de reprodución", + "HeaderNextVideo": "Seguinte vídeo", + "BackupsPageLoadError": "Fallou a carga da páxina de copias de seguridade", + "ButtonCreateBackup": "Crear copia de seguridade", + "ButtonLearnMore": "Saber máis" } diff --git a/src/strings/gu.json b/src/strings/gu.json index cd87e5f91..0ac9f33ef 100644 --- a/src/strings/gu.json +++ b/src/strings/gu.json @@ -21,5 +21,95 @@ "Alternate": "અન્ય", "AllLanguages": "બધી ભાષાઓ", "AlternateDVD": "અન્ય DVD", - "AllowMediaConversion": "મીડિયા રૂપાંતરણની અનુમતિ આપો" + "AllowMediaConversion": "મીડિયા રૂપાંતરણની અનુમતિ આપો", + "Absolute": "સંપૂર્ણ", + "Add": "ઉમેરો", + "AddedOnValue": "{0} ઉમેર્યું", + "AddToCollection": "સંગ્રહમાં ઉમેરો", + "AddToPlaylist": "પ્લેલિસ્ટમાં ઉમેરો", + "AddToPlayQueue": "પ્લે કતારમાં ઉમેરો", + "AllowSegmentDeletion": "સેગમેન્ટ્સ કાઢી નાખો", + "LabelSegmentKeepSeconds": "સેગમેન્ટ્સ રાખવાનો સમય", + "AllowMediaConversionHelp": "કન્વર્ટ મીડિયા સુવિધાની ઍક્સેસ આપો અથવા નકારો.", + "AlwaysPlaySubtitles": "હંમેશા વગાડો", + "AskAdminToCreateLibrary": "લાઇબ્રેરી બનાવવા માટે એડમિનિસ્ટ્રેટરને કહો.", + "Backdrop": "પૃષ્ઠભૂમિ", + "BirthLocation": "જન્મસ્થળ", + "ButtonAudioTracks": "ઑડિયો ટ્રૅક્સ", + "ButtonEditOtherUserPreferences": "આ વપરાશકર્તાની પ્રોફાઇલ, છબી અને વ્યક્તિગત પસંદગીઓમાં ફેરફાર કરો.", + "ButtonClose": "બંધ કરો", + "AddToFavorites": "મનપસંદમાં ઉમેરો", + "AllowedRemoteAddressesHelp": "નેટવર્ક્સ માટે IP સરનામાં અથવા IP/નેટમાસ્ક એન્ટ્રીઓની અલ્પવિરામથી વિભાજિત સૂચિ જે દૂરસ્થ રીતે કનેક્ટ થવાની મંજૂરી આપવામાં આવશે. જો ખાલી છોડી દેવામાં આવે, તો બધા દૂરસ્થ સરનામાંને મંજૂરી આપવામાં આવશે.", + "AllowFfmpegThrottlingHelp": "જ્યારે ટ્રાન્સકોડ અથવા રીમક્સ વર્તમાન પ્લેબેક સ્થિતિથી ખૂબ આગળ વધે છે, ત્યારે પ્રક્રિયાને થોભાવો જેથી તે ઓછા સંસાધનોનો ઉપયોગ કરે. વારંવાર શોધ્યા વિના જોતી વખતે આ સૌથી ઉપયોગી છે. જો તમને પ્લેબેક સમસ્યાઓનો અનુભવ થાય તો આને બંધ કરો.", + "AllowFmp4TranscodingContainerHelp": "આ ટ્યુનર માટે fMP4 ટ્રાન્સકોડિંગ કન્ટેનરને HEVC અને HDR કન્ટેન્ટ સક્ષમ કરવાની મંજૂરી આપો. બધા ટ્યુનર આ કન્ટેનર સાથે સુસંગત નથી. જો તમને પ્લેબેક સમસ્યાઓનો અનુભવ થાય તો આને અક્ષમ કરો.", + "AllowSegmentDeletionHelp": "ક્લાયન્ટ દ્વારા જૂના સેગમેન્ટ્સ ડાઉનલોડ કર્યા પછી તેને કાઢી નાખો. આનાથી આખી ટ્રાન્સકોડેડ ફાઇલને ડિસ્ક પર સ્ટોર કરવાની જરૂર પડતી નથી. જો તમને પ્લેબેક સમસ્યાઓનો અનુભવ થાય તો આને બંધ કરો.", + "AllowStreamSharingHelp": "જેલીફિનને ટ્યુનરમાંથી mpegts સ્ટ્રીમ ડુપ્લિકેટ કરવાની મંજૂરી આપો અને આ ડુપ્લિકેટ સ્ટ્રીમ તેના ક્લાયન્ટ્સ સાથે શેર કરો. જ્યારે ટ્યુનરમાં કુલ સ્ટ્રીમ કાઉન્ટ મર્યાદા હોય ત્યારે આ ઉપયોગી છે પરંતુ પ્લેબેક સમસ્યાઓનું કારણ પણ બની શકે છે.", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "ટ્રાન્સકોડિંગ ટ્રિગર થાય ત્યારે બધા સબટાઈટલ બર્ન કરો. આ ટ્રાન્સકોડિંગ પછી સબટાઈટલ સિંક્રનાઇઝેશનને ઓછી ટ્રાન્સકોડિંગ ઝડપના ખર્ચે સુનિશ્ચિત કરે છે.", + "AndOtherArtists": "{0} અને {1} અન્ય કલાકારો.", + "LabelThrottleDelaySecondsHelp": "ટ્રાન્સકોડર થ્રોટલ થાય તે પછીનો સમય સેકન્ડમાં. ક્લાયન્ટ સ્વસ્થ બફર જાળવી શકે તેટલો મોટો હોવો જોઈએ. જો થ્રોટલિંગ સક્ષમ હોય તો જ તે કાર્ય કરે છે.", + "LabelSegmentKeepSecondsHelp": "ક્લાયન્ટ દ્વારા ડાઉનલોડ કર્યા પછી સેગમેન્ટ્સ કયા માટે રાખવા જોઈએ તે સેકન્ડમાં સમય. જો સેગમેન્ટ ડિલીટ કરવાનું સક્ષમ હોય તો જ તે કાર્ય કરે છે.", + "AllowTonemappingHelp": "ટોન-મેપિંગ વિડિઓની ગતિશીલ શ્રેણીને HDR થી SDR માં રૂપાંતરિત કરી શકે છે, જ્યારે છબીની વિગતો અને રંગો જાળવી રાખે છે, જે મૂળ દ્રશ્યનું પ્રતિનિધિત્વ કરવા માટે ખૂબ જ મહત્વપૂર્ણ માહિતી છે. હાલમાં ફક્ત 10bit HDR10, HLG અને DoVi વિડિઓઝ સાથે કામ કરે છે. આ માટે અનુરૂપ GPGPU રનટાઇમની જરૂર છે.", + "AllowTonemappingSoftwareHelp": "ટોન-મેપિંગ વિડિઓની ગતિશીલ શ્રેણીને HDR થી SDR માં પરિવર્તિત કરી શકે છે, જ્યારે છબીની વિગતો અને રંગો જાળવી રાખે છે, જે મૂળ દ્રશ્યનું પ્રતિનિધિત્વ કરવા માટે ખૂબ જ મહત્વપૂર્ણ માહિતી છે. હાલમાં ફક્ત 10bit HDR10, HLG અને DoVi વિડિઓઝ સાથે કામ કરે છે.", + "AlwaysRemuxFlacAudioFilesHelp": "જો તમારી પાસે એવી ફાઇલો છે જેને તમારું બ્રાઉઝર ચલાવવાનો ઇનકાર કરે છે અથવા જ્યાં તે ખોટી રીતે ટાઇમસ્ટેમ્પની ગણતરી કરે છે, તો આને ઉકેલ તરીકે સક્ષમ કરો.", + "ApiKeysCaption": "હાલમાં સક્ષમ API કીની સૂચિ", + "Ascending": "ચડતા ક્રમમાં", + "LabelThrottleDelaySeconds": "થ્રોટલ પછી", + "AllowHWTranscodingHelp": "ટ્યુનરને તરત જ સ્ટ્રીમ્સ ટ્રાન્સકોડ કરવાની મંજૂરી આપો. આ સર્વર દ્વારા જરૂરી ટ્રાન્સકોડિંગ ઘટાડવામાં મદદ કરી શકે છે.", + "Art": "ક્લિયર આર્ટ", + "AspectRatio": "પાસા ગુણોત્તર", + "Artists": "કલાકારો", + "AsManyAsPossible": "શક્ય હોય તેટલા", + "Auto": "ઓટો", + "Author": "લેખક", + "AllowOnTheFlySubtitleExtractionHelp": "વિડિઓ ટ્રાન્સકોડિંગ અટકાવવા માટે, એમ્બેડેડ સબટાઈટલને વિડિઓમાંથી એક્સટ્રેક્ટ કરી શકાય છે અને ક્લાયંટને સાદા ટેક્સ્ટમાં પહોંચાડી શકાય છે. કેટલીક સિસ્ટમો પર આમાં લાંબો સમય લાગી શકે છે અને એક્સટ્રેક્શન પ્રક્રિયા દરમિયાન વિડિઓ પ્લેબેક અટકી શકે છે. જ્યારે ક્લાયંટ ડિવાઇસ દ્વારા મૂળ રીતે સપોર્ટેડ ન હોય ત્યારે વિડિઓ ટ્રાન્સકોડિંગ સાથે એમ્બેડેડ સબટાઈટલ બર્ન કરવા માટે આને અક્ષમ કરો.", + "Artist": "કલાકાર", + "Audio": "ઑડિયો", + "Authorize": "અધિકૃત કરો", + "AuthProviderHelp": "આ વપરાશકર્તાના પાસવર્ડને પ્રમાણિત કરવા માટે ઉપયોગમાં લેવાતા પ્રમાણીકરણ પ્રદાતાને પસંદ કરો.", + "BurnSubtitlesHelp": "સર્વર સબટાઈટલમાં બર્ન થવું જોઈએ કે નહીં તે નક્કી કરો. આને ટાળવાથી કામગીરીમાં ઘણો સુધારો થશે. છબી આધારિત ફોર્મેટ (VobSub, PGS, SUB, IDX, વગેરે) અને ચોક્કસ ASS અથવા SSA સબટાઈટલ બર્ન કરવા માટે ઓટો પસંદ કરો.", + "AutoSubtitleStylingHelp": "આ મોડ આપમેળે તમારા ઉપકરણના પ્રકાર પર આધારિત મૂળ અને કસ્ટમ સબટાઈટલ સ્ટાઇલ મિકેનિઝમ્સ વચ્ચે સ્વિચ કરશે.", + "ButtonFullscreen": "પૂર્ણસ્ક્રીન", + "ButtonGotIt": "સમજાઈ ગયું", + "AnyLanguage": "કોઈપણ ભાષા", + "Banner": "બેનર", + "AlwaysBurnInSubtitleWhenTranscoding": "ટ્રાન્સકોડિંગ કરતી વખતે હંમેશા સબટાઈટલમાં બર્ન કરો", + "AllowOnTheFlySubtitleExtraction": "તરત જ ઉપશીર્ષક કાઢવાની મંજૂરી આપો", + "AllowRemoteAccess": "આ સર્વર પર રિમોટ કનેક્શન્સને મંજૂરી આપો", + "AllowRemoteAccessHelp": "જો અનચેક કરવામાં આવે, તો બધા રિમોટ કનેક્શન બ્લોક થઈ જશે.", + "AlwaysPlaySubtitlesHelp": "ઑડિઓ ભાષાને ધ્યાનમાં લીધા વિના, ભાષા પસંદગી સાથે મેળ ખાતા સબટાઈટલ લોડ કરવામાં આવશે.", + "AlwaysRemuxMp3AudioFilesHelp": "જો તમારી પાસે એવી ફાઇલો છે જેના માટે તમારું બ્રાઉઝર ખોટી રીતે ટાઇમસ્ટેમ્પની ગણતરી કરે છે, તો આને ઉકેલ તરીકે સક્ષમ કરો.", + "Anytime": "કોઈપણ સમયે", + "AroundTime": "લગભગ {0}", + "Books": "પુસ્તકો", + "ButtonAddServer": "સર્વર ઉમેરો", + "ButtonArrowLeft": "ડાબે", + "ButtonAddUser": "વપરાશકર્તા ઉમેરો", + "ButtonArrowRight": "અધિકાર", + "ButtonBackspace": "બેકસ્પેસ", + "ButtonCancel": "રદ કરો", + "Anime": "એનીમે", + "Arranger": "ગોઠવનાર", + "BirthPlaceValue": "જન્મ સ્થળ: {0}", + "Blacklist": "બ્લેકલિસ્ટ", + "BlockContentWithTagsHelp": "ઓછામાં ઓછા એક ઉલ્લેખિત ટૅગ સાથે મીડિયા છુપાવો.", + "BookLibraryHelp": "ઑડિયો અને ટેક્સ્ટ બુક સપોર્ટેડ છે. {0} પુસ્તક નામકરણ માર્ગદર્શિકા {1}ની સમીક્ષા કરો.", + "Box": "બોક્સ", + "BoxRear": "બોક્સ (પાછળનું)", + "BoxSet": "બોક્સ સમૂહ", + "Browse": "બ્રાઉઝ", + "ButtonActivate": "સક્રિય કરો", + "Backdrops": "પાછળની બાજુ", + "BackdropScreensaver": "બેકડ્રોપ સ્ક્રીનસેવર", + "BirthDateValue": "જન્મ: {0}", + "ButtonAddMediaLibrary": "મીડિયા લાઇબ્રેરી ઉમેરો", + "ButtonAddScheduledTaskTrigger": "ટ્રીગર ઉમેરો", + "ButtonBack": "પાછળ", + "ButtonCast": "ઉપકરણ પર કાસ્ટ કરો", + "ButtonChangeServer": "સર્વર બદલો", + "ButtonEditUser": "વપરાશકર્તા સંપાદિત કરો", + "ButtonForgotPassword": "પાસવર્ડ ભૂલી ગયા", + "ButtonInfo": "માહિતી", + "ButtonAddImage": "છબી ઉમેરો", + "ButtonLibraryAccess": "લાઇબ્રેરી એક્સેસ", + "ButtonManualLogin": "મેન્યુઅલ લોગિન" } diff --git a/src/strings/he.json b/src/strings/he.json index 9f0042f71..4cf43afda 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -20,7 +20,7 @@ "ButtonGotIt": "הבנתי", "ButtonManualLogin": "התחברות ידנית", "ButtonOk": "בסדר", - "ButtonQuickStartGuide": "מדריך מהיר", + "ButtonQuickStartGuide": "מדריך התקנה", "ButtonRefreshGuideData": "רענן את מדריך השידור", "ButtonRemove": "הסר", "ButtonSelectDirectory": "בחר תיקיות", @@ -256,7 +256,7 @@ "MySubtitles": "הכתוביות שלי", "Name": "שם", "NewCollection": "אוספים חדשים", - "NewCollectionHelp": "אוספים מאפשרים לך ליצור קיבוצים מותאמים אישית של סרטים ותוכן ספריה אחר.", + "NewCollectionHelp": "אוספים מאפשרים לך ליצור קיבוצים מותאמים אישית של סרטים ותוכן ספרייה אחר.", "NewCollectionNameExample": "לדוגמא :אוסף מלחמת הכוכבים", "NewEpisodes": "פרקים חדשים", "NewEpisodesOnly": "פרקים חדשים בלבד", @@ -312,7 +312,7 @@ "PlayAllFromHere": "נגן הכל מכאן", "PlayFromBeginning": "נגן מהתחלה", "PleaseEnterNameOrId": "הזן שם או מזהה חיצוני.", - "PleaseRestartServerName": "נא להפעיל מחדש את ג'ליפין ב-{0}.", + "PleaseRestartServerName": "נא להפעיל מחדש את Jellyfin ב-{0}.", "PleaseSelectTwoItems": "בחר לפחות שני פריטים.", "Premiere": "הקרנת בכורה", "Premieres": "בכורות", @@ -333,7 +333,7 @@ "RepeatEpisodes": "חזור על פרקים", "ReplaceAllMetadata": "החלף את כל המטא נתונים", "ReplaceExistingImages": "החלף תמונות קיימות", - "ResumeAt": "המשך מ {0}", + "ResumeAt": "המשך מ־{0}", "Runtime": "זמן ריצה", "Saturday": "שבת", "Save": "שמור", @@ -380,7 +380,7 @@ "TabUpcoming": "בקרוב", "Tags": "מילות מפתח", "TellUsAboutYourself": "ספר לנו על עצמך", - "ThisWizardWillGuideYou": "אשף זה יעזור לך בהתליך ההתקנה.", + "ThisWizardWillGuideYou": "אשף זה יעזור לך בתהליך ההתקנה. כדי להתחיל, אנא הזן שם לשרת ובחר את השפה המועדפת עליך.", "Thursday": "חמישי", "TrackCount": "{0} רצועות", "Tuesday": "שלישי", @@ -404,7 +404,7 @@ "ValueSpecialEpisodeName": "מיוחד- {0}", "ViewAlbum": "צפה באלבום", "Wednesday": "רביעי", - "WelcomeToProject": "ברוכים הבאים לג'ליפין!", + "WelcomeToProject": "ברוכים הבאים ל-Jellyfin!", "Writer": "כותב", "Albums": "אלבומים", "Artists": "אומנים", @@ -479,7 +479,7 @@ "Ascending": "בסדר עולה", "Photos": "צילומים", "MessageConfirmShutdown": "‫האם אתה בטוח שברצונך לכבות את השרת?", - "MessageConfirmRestart": "‫האם אתה בטוח שברצונך לאתחל את ג'ליפין?", + "MessageConfirmRestart": "‫האם אתה בטוח שברצונך לאתחל את Jellyfin?", "HeaderThisUserIsCurrentlyDisabled": "משתמש זה אינו פעיל כרגע", "HeaderTaskTriggers": "טריגרים של המשימה", "HeaderStopRecording": "עצור הקלטה", @@ -558,7 +558,7 @@ "CopyStreamURLSuccess": "הקישור הועתק בהצלחה.", "CopyStreamURL": "העתק קישור זרם", "Connect": "התחבר", - "ConfirmEndPlayerSession": "‫האם לכבות את ג'ליפין על {0}?", + "ConfirmEndPlayerSession": "‫האם ברצונך לכבות את Jellyfin ב-{0}?", "CommunityRating": "דירוג קהילה", "ButtonWebsite": "אתר אינטרנט", "ButtonSubmit": "שלח", @@ -637,7 +637,7 @@ "LabelDisplaySpecialsWithinSeasons": "הצג פרקים מיוחדים בתוך העונות שבמהלכן הם שודרו", "LabelDisplayName": "שם תצוגה", "LabelDisplayMode": "מצב תצוגה", - "LabelDisplayLanguageHelp": "תרגום ג'ליפין הוא פרויקט מתמשך.", + "LabelDisplayLanguageHelp": "תרגום Jellyfin הוא פרויקט מתמשך.", "LabelDisplayLanguage": "שפת תצוגה", "LabelDidlMode": "מצב DIDL", "LabelDeviceDescription": "תיאור מכשיר", @@ -809,10 +809,10 @@ "ErrorSavingTvProvider": "אירעה שגיאה בשמירת ספק הטלוויזיה. אנא וודא שהוא נגיש ונסה שוב.", "ErrorPleaseSelectLineup": "אנא בחר מערך ונסה שוב. אם אין מערכים זמינים, אנא בדוק ששם המשתמש, הסיסמה והמיקוד שלך נכונים.", "ErrorGettingTvLineups": "אירעה שגיאה בהורדת מערכי הטלוויזיה. אנא ודא שהמידע שלך נכון ונסה שוב.", - "ErrorDeletingItem": "אירעה שגיאה במחיקת הפריט מהשרת. נא לבדוק שיש לג'ליפין הרשאת כתיבה לתיקיית המדיה ולנסות שוב.", + "ErrorDeletingItem": "אירעה שגיאה במחיקת הפריט מהשרת. נא לבדוק שיש ל-Jellyfin הרשאת כתיבה לתיקיית המדיה ולנסות שוב.", "ErrorAddingXmlTvFile": "אירעה שגיאה בגישה לקובץ XMLTV. אנא ודא שהקובץ קיים ונסה שוב.", "ErrorAddingTunerDevice": "אירעה שגיאה בהוספת מכשיר המקלט. אנא וודא שהוא נגיש ונסה שוב.", - "ErrorAddingMediaPathToVirtualFolder": "אירעה שגיאה בהוספת נתיב המדיה. אנא וודא שהנתיב תקף ולג'ליפין יש גישה למיקום זה.", + "ErrorAddingMediaPathToVirtualFolder": "אירעה שגיאה בהוספת נתיב המדיה. אנא וודא שהנתיב תקף ול-Jellyfin יש גישה למיקום זה.", "Episode": "פרק", "EnableDetailsBannerHelp": "הצג תמונת באנר בראש עמוד פרטי הפריט.", "EnableDetailsBanner": "באנר פרטים", @@ -866,7 +866,7 @@ "ShowLess": "הצג פחות", "ShowAdvancedSettings": "הצג הגדרות מתקדמות", "SettingsWarning": "שינוי ערכים אלו עלול לגרום לחוסר יציבות או בעיות חיבור. אם אתה נתקל בבעיות, אנו ממליצים להחזיר אותם לערכי ברירת המחדל.", - "ServerRestartNeededAfterPluginInstall": "ג'ליפין יצטרך לאתחל לאחר התקנת התוסף.", + "ServerRestartNeededAfterPluginInstall": "יש צורך לאתחל את Jellyfin לאחר התקנת התוסף.", "SeriesDisplayOrderHelp": "סדר פרקים על פי תאריך שידור, סדר DVD, או מספרים אבסולוטיים.", "Series": "סדרה", "SendMessage": "שלח הודעה", @@ -909,7 +909,7 @@ "LabelAlbumArtMaxWidth": "רוחב מירבי של אומנות אלבום", "LabelAlbumArtMaxHeight": "גובה מירבי של אומנות אלבום", "LabelAbortedByServerShutdown": "(הופסק על ידי כיבוי השרת)", - "KnownProxiesHelp": "רשימה מופרדת באמצעות פסיקים של כתובות IP או שמות מארחים של מתווכים ידועים המשמשים בעת חיבור לשרת ג'ליפין שלך. זה נדרש כדי לעשות שימוש נכון בכותרות X-Forwarded-For. דורש אתחול מחדש לאחר השמירה.", + "KnownProxiesHelp": "רשימה מופרדת באמצעות פסיקים של כתובות IP או שמות מארחים של מתווכים ידועים המשמשים בעת חיבור לשרת ה-Jellyfin שלך. זה נדרש כדי לעשות שימוש נכון בכותרות X-Forwarded-For. דורש אתחול מחדש לאחר השמירה.", "ImportFavoriteChannelsHelp": "רק ערוצים המסומנים כחביבים במכשיר המקלט ייובאו .", "HttpsRequiresCert": "כדי לאפשר חיבורים מאובטחים, יהיה עליך לספק אישור SSL מהימן, כגון Let's Encrypt. אנא ספק תעודה או השבת חיבורים מאובטחים.", "HideWatchedContentFromLatestMedia": "הסתר תוכן שנצפה מ'מדיה שהתווספה לאחרונה'", @@ -1034,7 +1034,7 @@ "IgnoreDtsHelp": "השבתת אפשרות זו עשויה לפתור בעיות מסוימות, למשל. אודיו חסר בערוצים עם זרמי אודיו ווידאו נפרדים.", "HeaderContainerProfileHelp": "פרופילי קונטיינר מציינים את המגבלות של מכשיר בעת הפעלת קידודים ספציפיים. אם חלה מגבלה אז המדיה תקודד מחדש, גם אם הקידוד מוגדר להפעלה ישירה.", "LabelAutoDiscoveryTracingHelp": "כאשר מופעל, חבילות רשת המתקבלות בפורט הגילוי האוטומטי יתועדו.", - "LabelAutomaticDiscoveryHelp": "אפשר ליישומים לזהות באופן אוטומטי את ג'ליפין באמצעות שימוש ב-UDP דרך פורט 7359.", + "LabelAutomaticDiscoveryHelp": "אפשר ליישומים לזהות באופן אוטומטי את Jellyfin באמצעות שימוש ב-UDP דרך פורט 7359.", "LabelBaseUrlHelp": "הוסף תת-תיקייה מותאמת אישית לכתובת ה-URL של השרת. לדוגמא:http://example.com/<baseurl>", "LabelBindToLocalNetworkAddressHelp": "דרוס את כתובת ה-IP המקומית של שרת ה-HTTP. אם ריק, השרת ייצמד לכל הכתובות הזמינות. שינוי ערך זה דורש הפעלה מחדש.", "LabelChromecastVersion": "גרסאת Google Cast", @@ -1203,12 +1203,12 @@ "LabelKodiMetadataEnableExtraThumbs": "העתק extrafanart לשדה extrathumbs", "LabelGroupMoviesIntoCollectionsHelp": "כל הסרטים באוסף יופיעו בתור פריט מקובץ אחד ברשימות סרטים.", "LabelHomeScreenSectionValue": "איזור {0} בעמוד הבית", - "LabelExtractChaptersDuringLibraryScan": "חלץ את תמונות הפרק תוך כדי סריקת הספריה", + "LabelExtractChaptersDuringLibraryScan": "חלץ את תמונות הפרק תוך כדי סריקת הספרייה", "LabelBackdropScreensaverInterval": "interval שומר המסך של הרקע", "LabelEnableLUFSScan": "הפעלת סריקת LUFS", "LabelEnableAutomaticPortMapHelp": "בצע port forward בצורה אוטומטית מפורטים בראוטר אל פורטים לוקאליים על השרת באמצעות UPnP. ייתכן שזה לא יעבוד עם דגמי נתב מסוימים או עם קונפיגורציות רשת מסוימות. שינויים לא יחולו עד לאחר הפעלה מחדש של השרת.", "BackdropScreensaver": "שומר המסך של הרקע", - "LabelExtractChaptersDuringLibraryScanHelp": "צור תמונות פרקים כאשר סרטונים מיובאים תוך כדי סריקת הספריה. אחרת, הם יחולצו תוך כדי המשימה המתוזמנת העוסקת בתמונות הפרק, מה שיאפשר לסריקת הספריה הרגילה להסתיים מהר יותר.", + "LabelExtractChaptersDuringLibraryScanHelp": "צור תמונות פרקים כאשר סרטונים מיובאים תוך כדי סריקת הספרייה. אחרת, הם יחולצו תוך כדי המשימה המתוזמנת העוסקת בתמונות הפרק, מה שיאפשר לסריקת הספרייה הרגילה להסתיים מהר יותר.", "LabelThrottleDelaySecondsHelp": "כמות הזמן בשניות שלאחריה המקודד יגיע ל-throttle. חייב להיות גדול מספיק כדי שהלקוח ישמור על buffer גדול מספיק. עובד רק אם throttling מופעל.", "HeaderGuestCast": "כוכבים אורחים", "LabelBackdropScreensaverIntervalHelp": "הזמן בשניות בין רקעים שונים כאשר משתמשים ברקעים כשומר מסך.", @@ -1274,7 +1274,7 @@ "EnableSmoothScroll": "הפעל גלילה חלקה", "HeaderDeleteSeries": "מחק סדרה", "LabelAlbumGain": "עוצמת אלבום", - "LabelDummyChapterDurationHelp": "מרווח הזמן בין פרקי הדמה. קבע ל-0 כדי להשבית את ייצור פרקי הדמה. שינוי זה לא ישפיע על פרקי דמה קיימים.", + "LabelDummyChapterDurationHelp": "מרווח הזמן בין פרקי הדמה בשניות. קבע ל-0 כדי להשבית את ייצור פרקי הדמה. שינוי זה לא ישפיע על פרקי דמה קיימים.", "LabelMaxDaysForNextUpHelp": "הגדר את מספר הימים המקסימלי שתכנית צריכה להישאר ברשימת 'הבא בתור' מבלי לצפות בה.", "LabelMaxVideoResolution": "רזולוצייה מקסימלית המותרת להמרת קידוד וידאו", "LabelLocalCustomCss": "קוד CSS לעיצוב מותאם אישית ללקוח זה בלבד. ייתכן שתרצה להשבית את קוד ה-CSS המסופק על ידי השרת.", @@ -1297,7 +1297,7 @@ "Creator": "יוצר", "EnableHi10p": "הפעלת פרופיל H.264 High 10", "AllowFmp4TranscodingContainerHelp": "אפשר המרת קידוד של fMP4 עבור מכוון זה כדי לאפשר תוכן HEVC ו-HDR. לא כל המכוונים תומכים בפורמט זה. בטל זאת אם יש בעיה בניגון.", - "AllowStreamSharingHelp": "אפשר לג'ליפין לשכפל את זרם mpgets מהמכוון ולשתף ללקוחות. זה עוזר כשהמכוון מוגבל במספר הזרמים אך עלול לגרום לבעיות בניגון.", + "AllowStreamSharingHelp": "אפשר ל-Jellyfin לשכפל את זרם ה-MPEGTS מהמכוון ולשתף ללקוחותיו. זה עוזר כשהמכוון מוגבל במספר הזרמים הכולל אך עלול לגרום לבעיות בניגון.", "AlwaysRemuxFlacAudioFilesHelp": "אם יש לך קבצים שהדפדפן מסרב להציג או מראה זמנים שגויים, ניתן להפעיל זאת כפתרון חלופי.", "AlwaysRemuxMp3AudioFilesHelp": "אם יש לך קבצים שהדפדפן מראה עבורם זמנים שגויים, ניתן להפעיל זאת כפתרון חלופי.", "AndOtherArtists": "{0} ו-{1} אומנים נוספים.", @@ -1307,7 +1307,7 @@ "AlwaysBurnInSubtitleWhenTranscoding": "צרוב כתוביות תמיד בעת המרת קידוד", "EnableDtsHelp": "יש להפעיל רק אם מכשירך תומך ב-DTS או מחובר למקלט שמע תואם, אחרת תיגרם שגיאת ניגון.", "EnableHi10pHelp": "הפעל כדי להימנע מהמרת קידוד וידיאו מסוג H.264 10-bit. יש לבטל אפשרות זו אם הוידיאו מציג פריימים ריקים.", - "ErrorDeletingLyrics": "אירעה שגיאה במחיקת המילים מהשרת. נא לבדוק שיש לג'ליפין הרשאת כתיבה לתיקיית המדיה ולנסות שוב.", + "ErrorDeletingLyrics": "אירעה שגיאה במחיקת המילים מהשרת. נא לבדוק שיש ל-Jellyfin הרשאת כתיבה לתיקיית המדיה ולנסות שוב.", "AlwaysBurnInSubtitleWhenTranscodingHelp": "צרוב את כל הכתוביות בזמן המרת קידוד. זה מבטיח שהכתוביות יהיו מסונכרנות אך מאט את מהירות ההמרה.", "EnableTrueHd": "הפעלת TrueHD", "EnableTrueHdHelp": "יש להפעיל רק אם מכשירך תומך ב-TrueHD או מחובר למקלט שמע תואם, אחרת תהיה שגיאת ניגון.", @@ -1364,7 +1364,7 @@ "LabelPublicHttpsPort": "מספר פורט HTTPS פומבי", "LabelPublicHttpsPortHelp": "מספר הפורט הפומבי אשר ימופה לפורט HTTPS המקומי.", "LabelPublishedServerUri": "כתובות URI של השרת שיפורסמו", - "LabelPublishedServerUriHelp": "יש לדרוס את ה-URI שבשימוש ג'ליפין, בהתבסס על כרטיס הרשת, או כתובת IP של הלקוח. למשל: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, או all=https://jellyfin.example.com", + "LabelPublishedServerUriHelp": "יש לדרוס את ה-URI שבשימוש Jellyfin, בהתבסס על כרטיס הרשת או כתובת IP של הלקוח. למשל: internal=http://jellyfin.example.com, external=https://jellyfin.example.com או all=https://jellyfin.example.com", "LabelParallelImageEncodingLimit": "גבול קידוד תמונות במקביל", "LabelParallelImageEncodingLimitHelp": "המספר המקסימלי של קידודי תמונות שירוצו במקביל. השארת ערך זה ריק תקבע מגבלה בהתאם למספר המעבדים במערכת שלך.", "LabelPlayDefaultAudioTrack": "ניגון פס הקול הדיפולטי ללא תלות בשפה", @@ -1375,8 +1375,8 @@ "LabelRecordingPath": "מסלול הקלטה ברירת מחדל", "LabelScreensaverTimeHelp": "מספר השניות הנחוץ של חוסר פעילות כדי להפעיל את שומר המסך.", "LabelRepository": "מאגר", - "LabelSaveTrickplayLocally": "שמירת תמונות טריקפליי ליד המדיה", - "LabelSaveTrickplayLocallyHelp": "שמירת תמונות טריקפליי בתיקיית המדיה תשים אותם ליד המדיה שלך למיגרציה וגישה קלה.", + "LabelSaveTrickplayLocally": "שמירת תמונות Trickplay לצד המדיה", + "LabelSaveTrickplayLocallyHelp": "שמירת תמונות Trickplay בתיקיית המדיה תשים אותן לצד המדיה שלך למיגרציה וגישה קלה.", "LabelRemoteClientBitrateLimit": "גבול קצב הזרמת רשת (Mbps)", "LabelOptionalNetworkPathHelp": "אם תיקייה זו משותפת ברשת, הגדרת הכתובת המשותפת תאפשר ללקוחות אחרים לגשת לקבצי המדיה ישירות. למשל {0} או {1}.", "LabelOpenclDeviceHelp": "התקן OpenCL זה משמש למיפוי גוונים. משמאל לנקודה מופיע מספר הפלטפורמה, ומימינה מספר הרכיב בפלטפורמה. ערך ברירת המחדל הוא 0.0. נדרשת תוכנת FFmpeg המכילה את שיטת האצת החומרה OpenCL.", @@ -1433,7 +1433,7 @@ "LabelTranscodingFramerate": "קצב הפריימים של המרת קידוד", "TypeOptionPluralBoxSet": "מארזי מדיה", "LabelTonemappingParam": "פרמטר מיפוי גוונים", - "LabelTonemappingParamHelp": "נא לכוון אצ מיפוי הגוונים. הערכים המומלצים והדיפולטיים הם NaN. בכללי מומלץ להשאיר אותם ריקים.", + "LabelTonemappingParamHelp": "כיוונון מיפוי הגוונים. בכללי כדאי להשאיר ריק.", "LabelVaapiDeviceHelp": "זה רכיב הרינדור שמשמש להאצת חומרה.", "LabelUserLoginAttemptsBeforeLockout": "ניסיונות התחברות כושלים לפני שהמשתמש ננעל", "LabelUserMaxActiveSessions": "מספר מירבי של משתמשים מחוברים במקביל", @@ -1466,7 +1466,7 @@ "LogLevel.Debug": "ניפוי שגיאות", "LabelTVHomeScreen": "עמוד הבית במצב טלוויזיה", "LearnHowYouCanContribute": "איך ניתן לתרום.", - "LibraryInvalidItemIdError": "הספריה נמצאת במצב לא תקין ולא ניתן לערוך אותה. אולי נתקלת בשגיאה: המסלול במבנה-הנתונים שונה מהמסלול במערכת הקבצים.", + "LibraryInvalidItemIdError": "הספרייה נמצאת במצב לא תקין ולא ניתן לערוך אותה. אולי נתקלת בשגיאה: הנתיב במסד-הנתונים שונה מהנתיב במערכת הקבצים.", "LimitSupportedVideoResolution": "הגבלת המספר המירבי של רזולוציות וידיאו נתמכות", "LabelUnstable": "לא יציב", "LeaveBlankToNotSetAPassword": "ניתן להשאיר ריק כדי להימנע מהגדרת סיסמה.", @@ -1519,7 +1519,7 @@ "MessageConfirmAppExit": "האם ברצונך לצאת?", "MessageConfirmRemoveMediaLocation": "למחוק את מיקום זה?", "MessageConfirmRevokeApiKey": "לבטל את מפתח ה-API הזה? החיבור של אפליקציות לשרת זה יסתיימו באופן פתאומי.", - "MessageDirectoryPickerBSDInstruction": "עבור BSD, עליך להגדיר אחסון בתוך 'FreeNAS Jail' שלך כדי שג'ליפין יוכל לגשת למדיה שלך.", + "MessageDirectoryPickerBSDInstruction": "עבור BSD, עליך להגדיר אחסון בתוך 'FreeNAS Jail' שלך כדי ש-Jellyfin יוכל לגשת למדיה שלך.", "MessageDirectoryPickerLinuxInstruction": "עבור לינוקס על Arch Linux, CentOS, Debian, Fedora, openSUSE, או Ubuntu, יש לתת למשתמש השירות גישת קריאה למקומות האחסון לכל הפחות.", "MessageForgotPasswordFileCreated": "הקובץ הבא נוצר בשרת שלך ומסביר כיצד להמשיך", "MessageNoItemsAvailable": "אין פריטים זמינים כעת.", @@ -1538,7 +1538,7 @@ "MessagePluginInstalled": "התוסף הותקן בהצלחה. יש לרסט את השרת כדי שהשינויים ייכנסו לתוקף.", "MessageSyncPlayIsDisabled": "צפייה מסונכרנת דורשת הרשאות.", "MessageSent": "ההודעה נשלחה.", - "MessageSplitVersionsError": "אירגע שגיאה במהלך פיצול גרסאות", + "MessageSplitVersionsError": "אירעה שגיאה במהלך פיצול גרסאות", "MoreMediaInfo": "מידע המדיה", "NoLyricsSearchResultsFound": "לא נמצאו מילים לשיר.", "MessageSyncPlayErrorNoActivePlayer": "לא נמצא נגן פעיל. הצפייה המסונכרנת הושבתה.", @@ -1630,7 +1630,7 @@ "PlaybackError.ASS_RENDER_ERROR": "אירעה שגיאה בעיבוד כתוביות ASS/SSA.", "PlayNext": "נגן את הבא", "PlaybackErrorNoCompatibleStream": "הלקוח אינו תואם למדיה והשרת לא שולח מדיה בפורמט תואם.", - "PlaybackErrorPlaceHolder": "זהו ממלא מקום עבור מדיה פיזית שג'ליפין לא יכול לנגן. יש להכניס את הדיסק כדי לנגן.", + "PlaybackErrorPlaceHolder": "זהו ממלא מקום עבור מדיה פיזית ש-Jellyfin לא יכול לנגן. יש להכניס את הדיסק כדי לנגן.", "PlayNextEpisodeAutomatically": "נגן את הפרק הבא אוטומטית", "PleaseAddAtLeastOneFolder": "נא להוסיף לפחות תיקייה אחת לספרייה זו על ידי לחיצה על הכפתור '+' באיזור 'תיקיות'.", "PleaseConfirmRepositoryInstallation": "נא ללחוץ אוקיי כדי לאשר שקראת וברצונך להמשיך בהתקנת רפוזיטורי התוספים.", @@ -1697,7 +1697,7 @@ "RenderPgsSubtitleHelp": "לקבוע אם על הלקוח לרנדר כתוביות PGS במקום להשתמש בכתוביות מוטמעות. זה יכול לחסוך שינוי קידוד בצד השרת על חשבון ביצועי הרנדר בצד השרת.", "RepeatAll": "חזרה על הכל", "RepeatOne": "חזרה פעם אחת", - "ReplaceTrickplayImages": "החלפת תמונות קיימות", + "ReplaceTrickplayImages": "החלפת תמונות Trickplay קיימות", "SearchForLyrics": "חיפוש מילים לשיר", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "הגדרות אלה תקפות גם לניגון Google Cast שהופעלו על ידי מכשיר זה.", "SubtitleMagenta": "לילך", @@ -1757,21 +1757,21 @@ "Up": "למעלה", "UseCustomTagDelimitersHelp": "פיצול תגי אומן/ז'אנר באמצעות תווים מוגדרים אישית.", "UseDoubleRateDeinterlacingHelp": "הגדרה זו משתמשת בקצב השדה בעת deinterlacing, לרוב נקראת גם bob deinterlacing, אשר מכפילה את קצב הפריימים של הוידיאו כדי לספק תנועה מלאה כמו בצפייה בוידיאו השזור בטלוויזיה.", - "UnsupportedPlayback": "ג'ליפין לא יכול לפענח תוכן המוגן על ידי DRM אבל ינסה לפענח את כל התוכן למרות זאת, כולל כותרות מוגנות. חלק מהקבצים עלולים להיראות שחורים לגמרי בגלל ההצפנה או תכונות לא נתמכות אחרות, למשל כותרות אינטראקטיביות.", + "UnsupportedPlayback": "Jellyfin לא יכול לפענח תוכן המוגן על ידי DRM אבל ינסה לפענח את כל התוכן למרות זאת, כולל כותרות מוגנות. חלק מהקבצים עלולים להיראות שחורים לגמרי בגלל ההצפנה או תכונות לא נתמכות אחרות, למשל כותרות אינטראקטיביות.", "UseCustomTagDelimiters": "שימוש במפריד תגים מוגדר אישית", "Studio": "סטודיו", "Print": "הדפסה", "UserMenu": "תפריט משתמש", "UserAgentHelp": "ניתן לספק שדה 'User-Agent' מוגדר אישית.", - "UserProfilesIntro": "ג'ליפין כולל תמיכה בפרופילי משתמש עם הגדרות צפייה, מצב ניגון, ובקרת הורים לכל אחד.", + "UserProfilesIntro": "Jellyfin כולל תמיכה בפרופילי משתמש עם הגדרות צפייה, מצב ניגון ובקרת הורים לכל אחד.", "ValueSeconds": "{0} שניות", "ValueTimeLimitMultiHour": "הגבלת זמן: {0} שעות", "ValueTimeLimitSingleHour": "הגבלת זמן: שעה אחת", "VideoAudio": "שמע הוידיאו", "WeeklyAt": "{0}ים ב-{1}", - "WriteAccessRequired": "ג'ליפין דורש הרשאות כתיבה לתיקייה זו. נא לוודא הרשאת כתיבה ולנסות שוב.", + "WriteAccessRequired": "Jellyfin דורש הרשאות כתיבה לתיקייה זו. נא לוודא הרשאת כתיבה ולנסות שוב.", "Whitelist": "מותרים", - "WizardCompleted": "זה כל מה שצריך לעכשיו. ג'ליפין התחיל לאסוף מידע על ספריית המדיה שלך. מומלץ לבדוק את האפליקציות שלנו, ואז ללחוץ סיום כדי לראות את לוח המחוונים.", + "WizardCompleted": "זה כל מה שצריך לעכשיו. Jellyfin התחיל לאסוף מידע על ספריית המדיה שלך. מומלץ לבדוק את האפליקציות שלנו ואז ללחוץ סיום כדי לראות את לוח המחוונים.", "XmlTvMovieCategoriesHelp": "תוכניות בקטגוריות אלה יוצגו כסרטים. יש להפריד ערכים עם '|'.", "LabelFallbackFontPath": "נתיב תיקיית גופן לגיבוי", "Watched": "נצפה", @@ -1779,7 +1779,7 @@ "XmlTvKidsCategoriesHelp": "תוכניות בקטגוריות אלה יוצגו כתוכניות לילדים. יש להפריד ערכים עם '|'.", "ViewAlbumArtist": "צפייה באומן האלבום", "ViewLyrics": "צפייה במילות השיר", - "XmlTvPathHelp": "נתיב לקובץ XMLTV. ג'ליפין יקרא קובץ זה ויבדוק עדכונים מדי פעם. באחריותך ליצור ולעדכן את הקובץ.", + "XmlTvPathHelp": "נתיב לקובץ XMLTV. שרת ה-Jellyfin יקרא קובץ זה ויבדוק עדכונים מדי פעם. באחריותך ליצור ולעדכן את הקובץ.", "XmlTvNewsCategoriesHelp": "תוכניות בקטגוריות אלה יוצגו כתוכניות של חדשות. יש להפריד ערכים עם '|'.", "HeaderSelectFallbackFontPath": "בחירת נתיב תיקיית גופן לגיבוי", "HeaderSelectFallbackFontPathHelp": "חיפוש או הכנסת נתיב לתיקיית גופן גיבוי עבור רינדור כתוביות ASS/SSA.", @@ -1791,7 +1791,7 @@ "AspectRatioFill": "מתיחה", "Remuxing": "רימיקס", "YoutubeDenied": "לא ניתן לנגן את הוידיאו המבוקש בנגנים מוטמעים.", - "MessageChromecastConnectionError": "מתאם Google Cast שלך לא הצליח להתחבר לשרת ג'ליפין. נא לבדוק את החיבור ולנסות שוב.", + "MessageChromecastConnectionError": "מתאם ה-Google Cast שלך לא הצליח להתחבר לשרת ה-Jellyfin. נא לבדוק את החיבור ולנסות שוב.", "MessagePlaybackError": "אירעה שגיאה בניגון הקובץ הזה דרך Google Cast.", "EnableEnhancedNvdecDecoder": "הפעלת מפענח NVDEC משופר", "RefFramesNotSupported": "מסגרות ייחוס אינן נתמכות", @@ -1821,7 +1821,7 @@ "YoutubeBadRequest": "בקשה שגויה.", "Featurette": "סרט קצר", "Short": "סרטון", - "EncodingFormatHelp": "בחירת קידוד הוידיאו שג'ליפין יקודד אליו. ג'ליפין ישתמש בקידוד תוכנה אם אין האצת חומרה לפורנט הנבחר. קידוד H264 תמיד מאופשר.", + "EncodingFormatHelp": "בחירת קידוד הוידאו ש-Jellyfin יקודד אליו. Jellyfin ישתמש בקידוד תוכנה אם אין האצת חומרה לפורמט הנבחר. קידוד H264 תמיד מאופשר.", "AudioIsExternal": "זרם השמע הוא חיצוני", "UnknownAudioStreamInfo": "מידע הזרמת השמע אינו ידוע", "DirectPlayError": "אירעה שגיאה בהפעלת ניגון ישיר", @@ -1867,16 +1867,16 @@ "LabelVideoRangeType": "סוג טווח וידיאו", "LabelTrickplayAccel": "הפעלת פענוח חומרה", "LabelProcessPriority": "עדיפות התהליך", - "LabelProcessPriorityHelp": "שינוי ערך זה יקבע כמה המעבד מתעדף את תהליך יצירת טריקפליי ביחס לתהליכים אחרים. אם הבחנת בהאטה בזמן יצירת תמונות טריקפליי ולא רוצה לעצור את יצירתם, ניתן להוריד זאת לצד הורדת מספר החוטים.", + "LabelProcessPriorityHelp": "שינוי ערך זה יקבע כמה המעבד מתעדף את תהליך יצירת Trickplay ביחס לתהליכים אחרים. אם הבחנת בהאטה בזמן יצירת תמונות Trickplay ולא רוצה לעצור את יצירתם, ניתן להוריד זאת לצד הורדת מספר החוטים.", "LabelTileHeight": "גובה אריח", - "LabelWidthResolutionsHelp": "רשימה מופרדת בפסיקים של רוחבים (פיקסלים) שיווצרו על ידי טריקפליי. כל התמונות יווצרו ביחס למקור, למשל רוחב 320 בוידיאו ביחס 16:9 יוציא תמונה ברזולוציה 320x180.", + "LabelWidthResolutionsHelp": "רשימה מופרדת בפסיקים של רוחבי התמונות (בפיקסלים) שייווצרו על ידי Trickplay. כל התמונות ייווצרו ביחס למקור, למשל רוחב 320 בווידיאו ביחס 16:9 יוציא תמונה ברזולוציה 320x180.", "LabelTileWidth": "רוחב אריח", "LabelTileWidthHelp": "מספר מירבי של תמונות לכל אריח בכיוון אופקי.", - "LabelExtractTrickplayDuringLibraryScanHelp": "האם ליצור תמונות טריקפליי כאשר וידיאו מיובא במהלך סריקת ספרייה. אחרת, הן ייחולצו במהלך המשימה המתוכננת של טריקפליי. אם היצירה הוגדרה ללא חסימה זה לא ישפיע על זמן הסריקה.", - "ExtractTrickplayImagesHelp": "תמונות טריקפליי הן דומות לתמונות פרק, פרט לכך שהן מתוחות לכל אורך התוכן ומשמשות לתצוגה מקדימה כאשר גוללים דרך וידיאו.", + "LabelExtractTrickplayDuringLibraryScanHelp": "האם ליצור תמונות Trickplay כאשר וידיאו מיובא במהלך סריקת ספרייה. אחרת, הן יחולצו במהלך המשימה המתוכננת של Trickplay. אם היצירה הוגדרה ללא חסימה זה לא ישפיע על זמן הסריקה.", + "ExtractTrickplayImagesHelp": "תמונות Trickplay דומות לתמונות פרקים, פרט לכך שהן קיימות לכל אורך התוכן ומשמשות לתצוגה מקדימה כאשר מדלגים קדימה ואחורה בווידיאו.", "LabelTileHeightHelp": "מספר מירבי של תמונות לכל אריח בכיוון אנכי.", "LabelJpegQuality": "איכות JPEG", - "LabelJpegQualityHelp": "איכות כיוו. JPEG בתמונות טריקפליי.", + "LabelJpegQualityHelp": "איכות כיווץ JPEG בתמונות Trickplay.", "LabelQscale": "דרגת איכות התמונה", "LabelVppTonemappingContrast": "עוצמת ניגודיות במיפוי גוונים של VPP", "LabelVppTonemappingContrastHelp": "הגדרת עוצמת הניגודיות במיפוי גוונים ב-VPP. הערך המומלץ הוא 1.", @@ -1888,7 +1888,7 @@ "MediaInfoBlPresentFlag": "דגל bl של דולבי ויז'ן", "LabelTonemappingMode": "מצב מיפוי גוונים", "LabelImageInterval": "משך-זמן התמונה", - "LabelImageIntervalHelp": "משך הזמן (מילישניות) בין כל תמונת טריקפליי חדשה.", + "LabelImageIntervalHelp": "משך הזמן (במילי-שניות) בין כל תמונת Trickplay חדשה.", "LabelWidthResolutions": "רזולוציות רוחב", "MediaInfoDvLevel": "רמת דולבי ויז'ן", "MediaInfoRpuPresentFlag": "דגל rpu של דולבי ויז'ן", @@ -1900,14 +1900,14 @@ "MachineTranslated": "תרגום מכונה", "ForeignPartsOnly": "כפוי/שפה זרה בלבד", "HearingImpairedShort": "HI/SDH", - "LabelExtractTrickplayDuringLibraryScan": "חילוץ תמונות טריקפליי במהלך סריקות ספרייה", + "LabelExtractTrickplayDuringLibraryScan": "חילוץ תמונות Trickplay במהלך סריקות ספרייה", "MediaInfoVideoRangeType": "סוג טווח וידיאו", "LabelIsHearingImpaired": "כתוביות לחירשים וכבדי שמיעה (SDH)", "LabelVppTonemappingBrightnessHelp": "הגדרת עוצמת בהירות במיפוי גוונים ב-VPP. הערך המומלץ הוא 16.", - "Trickplay": "טריקפליי", + "Trickplay": "Trickplay", "LabelTrickplayKeyFrameOnlyExtraction": "יצירת תמונות ממסגרות מפתח בלבד", "LabelTrickplayKeyFrameOnlyExtractionHelp": "הוצאת מסגרות המפתח בלבד תספק עיבוד מהיר בהרבה עם תזמון פחות מדויק. אם מפענח החומרה המוגדר לא תומך במצב זה, ייעשה שימוש במפענח תוכנה במקום.", - "LabelTrickplayAccelEncoding": "הפעלת האצת חומרה בקידוד MJPEG", + "LabelTrickplayAccelEncoding": "הפעלה של האצת חומרה בקידוד MJPEG", "LabelTrickplayAccelEncodingHelp": "כרגע זמין רק ב-QSV, VA-API, VideoToolbox, RKMPP, אפשרות זו לא משפיעה על שיטות האצת חומרה אחרות.", "LabelScanBehavior": "התנהגות סריקה", "NonBlockingScan": "ללא חסימה - מוסיף את הפעולה לתור, וחוזר", @@ -1915,11 +1915,11 @@ "PriorityHigh": "גבוהה", "PriorityAboveNormal": "מעל רגילה", "PriorityNormal": "רגילה", - "LabelScanBehaviorHelp": "התנהגות ברירת המחדל היא ללא חסימה, מה שיוסיף מדיה לספרייה לפני שטריקפליי מסיים. חסימה תבטיח שהקבצים של טריקפליי יווצרו לפני שהמדיה נוספת לספרייה, אך תגרום לסריקות להיות משמעותית ארוכות יותר.", + "LabelScanBehaviorHelp": "התנהגות ברירת המחדל היא ללא חסימה, מה שיוסיף מדיה לספרייה לפני שיצירת תמונות ה-Trickplay תסתיים. חסימה תבטיח שהקבצים של Trickplay ייווצרו לפני שהמדיה נוספת לספרייה, אך תגרום לסריקות להיות ארוכות יותר משמעותית.", "LabelTrickplayThreads": "חוטי FFmpeg", "LabelQscaleHelp": "דרגת האיכות של תמונות שייצאו מ-ffmpeg, כאשר האיכות הכי גבוהה היא 2 והאיכות הכי נמוכה היא 31.", "LabelTrickplayThreadsHelp": "מספר החוטים שיעברו ל-ffmpeg.", - "OptionExtractTrickplayImage": "הפעלת חילוץ תמונות של טריקפליי", + "OptionExtractTrickplayImage": "הפעלת חילוץ תמונות של Trickplay", "Anime": "אנימה", "MoviesAndShows": "סרטים וסדרות", "HeaderNextEpisode": "הפרק הבא", @@ -1956,5 +1956,46 @@ "ImageDeleteFailed": "מחיקת התמונה נכשלה", "ImageUploadCancelled": "העלאת התמונה בוטלה", "ImageUploadFailed": "העלאת התמונה נכשלה", - "UploadCustomImage": "העלאת תמונה מותאמת אישית" + "UploadCustomImage": "העלאת תמונה מותאמת אישית", + "ViewSettings": "הצג הגדרות", + "LimitSegmentLength": "השתמש במקטעי HLS קצרים יותר", + "LimitSegmentLengthHelp": "הפעלת אפשרות זו עשויה לסייע במניעת תקיעות של נגן HLS בעת דילוג במכשירים מסוימים, כגון טלוויזיות webOS.", + "HeaderServerUnavailable": "שרת לא זמין", + "DownloadManager": "הורדות", + "HeaderUpdateRequired": "נדרש עדכון", + "MessageForgotPasswordPinReset": "הכנס את קוד ה-PIN כאן כדי לסיים את איפוס הסיסמה", + "ConfirmDeleteRepository": "למחוק את המאגר?", + "DeleteRepositoryConfirmation": "בטוח שבכוונתך למחוק את המאגר?", + "ButtonLearnMore": "קרא עוד", + "Create": "יצירה", + "LabelBackupsUnavailable": "אין גיבויים זמינים", + "LabelProgramData": "תוכנייה", + "LabelRestore": "שחזור", + "BackupsPageLoadError": "טעינת עמוד הגיבויים נכשלה", + "ButtonCreateBackup": "יצירת גיבוי", + "LabelDatabase": "בסיס נתונים", + "LabelImageCache": "מטמון תמונות", + "RepositoriesPageLoadError": "טעינת המאגרים נכשלה", + "PluginsLoadError": "אירעה שגיאה בזמן טעינת התוספים.", + "StorageType.Unknown": "לא ידוע", + "HeaderBackupsHelp": "יצירה ושחזור תמונות מצב של השרת שלך כוללת בסיס נתונים, מטא-דאטה, כתוביות ו-Trickplay.", + "MessageBackupDisclaimer": "תהליך הגיבוי ייקח זמן מה, כתלות בגודל הספרייה שלך.", + "MessageBackupInProgress": "מתבצע גיבוי", + "MessageWaitingForServer": "ממתין לשרת...", + "StorageType.CDRom": "CD-ROM", + "StorageType.Network": "רשת", + "StorageType.Fixed": "תוקן", + "StorageType.NoRootDirectory": "אין תיקיית שורש", + "StorageType.Ram": "RAM", + "StorageType.Removable": "נשלף", + "HeaderBackups": "גיבויים", + "TranscodingLoadError": "טעינת הגדרות השעתוק נכשלה", + "MessageRestoreDisclaimer": "אזהרה: שחזור מגיבוי קודם. השרת לא יהיה פעיל בזמן השחזור וכל מידע חדש שנוצר מאז הגיבוי יאבד.", + "Success": "הצלחה", + "MessageRestoreInProgress": "מתבצע שחזור", + "MessageRestoreSuccess": "השחזור הושלם בהצלחה", + "LiveTVPageLoadError": "נכשל בטעינת דף ההקלטות", + "HeaderServerMismatch": "שרת לא מתאים", + "ConnectAnyway": "התחבר בכל זאת", + "MessageServerMismatch": "השרת שהתחברת אליו כעת אינו אותו השרת שהתחברת אליו בעבר באמצעות כתובת זו. אם הדבר צפוי לך, נא לבחור \"התחבר בכל זאת\". אחרת, החיבור שלך לשרת עשוי להיות מנוצל לרעה." } diff --git a/src/strings/hi-in.json b/src/strings/hi-in.json index 1a3dbb643..826a23114 100644 --- a/src/strings/hi-in.json +++ b/src/strings/hi-in.json @@ -1,5 +1,5 @@ { - "ButtonQuickStartGuide": "तुरंत आरंभ मार्गदर्शिका", + "ButtonQuickStartGuide": "सेटअप गाइड", "ButtonSignOut": "Sign out", "LabelFinish": "समाप्त", "LabelYoureDone": "आपने पूरा कर लिया है!", @@ -57,17 +57,17 @@ "BoxRear": "बॉक्स (पीछे)", "Box": "बॉक्स", "Books": "पुस्तकें", - "BookLibraryHelp": "ऑडियो और पाठ्य पुस्तकें समर्थित हैं। {0} पुस्तक नामकरण गाइड {1} की समीक्षा करें।", + "BookLibraryHelp": "ऑडियो और पाठ्य पुस्तकें समर्थित हैं। {0} पुस्तक नामकरण मार्गदर्शिका {1} की समीक्षा करें।", "Blacklist": "काला सूची में डालना", "BirthPlaceValue": "जन्म स्थान: {0}", "BirthLocation": "जन्म स्थान", "BirthDateValue": "जन्म: {0}", - "Banner": "झंडा", + "Banner": "बैनर", "Backdrops": "पृष्ठभूमि", "Backdrop": "पृष्ठभूमि", "Auto": "ऑटो", "AuthProviderHelp": "इस उपयोगकर्ता के पासवर्ड को प्रमाणित करने के लिए एक प्रमाणीकरण प्रदाता का उपयोग करें।", - "Audio": "नया", + "Audio": "ऑडियो", "AspectRatio": "आस्पेक्ट अनुपात", "AskAdminToCreateLibrary": "लाइब्रेरी बनाने के लिए किसी व्यवस्थापक से पूछें।", "Ascending": "आरोही", @@ -83,7 +83,7 @@ "AllowedRemoteAddressesHelp": "नेटवर्क के लिए आईपी पतों आईपी/नेटमास्क एंट्रीज़ की कॉमा विभाजित सूची जो रिमोट रूप से कनेक्ट करने की अनुमति देगा। यदि खाली छोड़ा गया है, तो सभी रिमोट पतों को अनुमति दी जाएगी।", "AllowRemoteAccessHelp": "अनियंत्रित होने पर, सभी दूरस्थ कनेक्शन अवरुद्ध हो जाएंगे।", "AllowRemoteAccess": "इस सर्वर को असमीप संपर्क की अनुमति दें", - "AllowFfmpegThrottlingHelp": "जब कोई ट्रांसकोड या रीमक्स वर्तमान प्लेबैक स्थिति से काफी आगे निकल जाता है, तो प्रक्रिया को रोक दें ताकि यह कम संसाधनों का उपभोग करे। अक्सर बिना खोजे देखते समय यह सबसे उपयोगी होता है। यदि आप प्लेबैक समस्याओं का अनुभव करते हैं तो इसे बंद कर दें।", + "AllowFfmpegThrottlingHelp": "जब कोई ट्रांसकोड या रीमक्स वर्तमान प्लेबैक स्थिति से काफी आगे निकल जाता है, तो प्रक्रिया को रोक दें ताकि यह कम संसाधनों का उपभोग करे। अक्सर बिना बार-बार आगे पीछे किए देखते समय यह सबसे उपयोगी होता है। यदि आप प्लेबैक में समस्या अनुभव करते हैं तो इसे बंद कर दें।", "AllowFfmpegThrottling": "थ्रोटल ट्रांसकोड", "AllowOnTheFlySubtitleExtractionHelp": "वीडियो ट्रांसकोडिंग को रोकने में मदद करने के लिए एंबेडेड सबटाइटल वीडियो से निकाले जा सकते हैं और सादे पाठ में ग्राहकों तक पहुंचाए जाते हैं। कुछ प्रणालियों पर यह एक लंबा समय ले सकता है और निष्कर्षण प्रक्रिया के दौरान वीडियो प्लेबैक को स्टाल करने का कारण बन सकता है। जब वे क्लाइंट डिवाइस द्वारा मूल रूप से समर्थित नहीं होते हैं, तो वीडियो ट्रांसकोडिंग के साथ जले हुए एम्बेडेड उपशीर्षक को अक्षम करें।", "AlbumArtist": "एल्बम कलाकार", @@ -93,7 +93,7 @@ "MessageBrowsePluginCatalog": "उपलब्ध प्लगिन्स देखने के लिए हमारे कैटलॉग को ब्राउज़ करें।", "Browse": "ब्राउज़", "BoxSet": "बॉक्स सेट", - "BurnSubtitlesHelp": "निर्धारित करता है कि वीडियो ट्रांसकोडिंग करते समय सर्वर को उपशीर्षक बर्न-इन करना चाहिए। इससे बचने से प्रदर्शन में बहुत सुधार होगा। छवि आधारित उपशीर्षक (VOBSUB, PGS, SUB, IDX, …) एवं ASS अथवा SSA जैसे उपशीर्षक बर्न-इन करने के लिए ऑटो का चयन करें।", + "BurnSubtitlesHelp": "निर्धारित करें कि सर्वर को उपशीर्षक बर्न करना चाहिए या नहीं। इससे बचने से प्रदर्शन में बहुत सुधार होगा। छवि आधारित प्रारूप (VobSub, PGS, SUB, IDX, आदि) और कुछ ASS या SSA उपशीर्षक बर्न करने के लिए ऑटो का चयन करें।", "ButtonRemove": "हटाना", "ButtonOpen": "खोलो", "HeaderContinueWatching": "देखना जारी रखें", @@ -161,7 +161,7 @@ "AllowContentWithTagsHelp": "केवल उन मीडिया को दिखाएं जिनमें से कम से कम एक निर्दिष्ट टैग हो।", "AirPlay": "वायु प्रसारण", "AllowSubtitleManagement": "इस उपयोगकर्ता को उपशीर्षक संपादित करने की अनुमति दें", - "BackdropScreensaver": "पृष्ठभूमि स्क्रीनसेवर", + "BackdropScreensaver": "बैकड्रॉप स्क्रीनसेवर", "ChangingMetadataImageSettingsNewContent": "मेटाडेटा या कलाकृति डाउनलोडिंग सेटिंग्स में परिवर्तन केवल आपकी लाइब्रेरी में जोड़ी गई नई सामग्री पर लागू होंगे। मौजूदा शीर्षकों में परिवर्तन लागू करने के लिए, आपको उनके मेटाडेटा को मैन्युअल रूप से ताज़ा करना होगा।", "Author": "लेखक", "ButtonBackspace": "बैकस्पेस", @@ -184,7 +184,40 @@ "ChannelNumber": "चैनल संख्या", "Alternate": "वैकल्पिक", "AlternateDVD": "वैकल्पिक डीवीडी", - "BlockContentWithTagsHelp": "निर्दिष्ट टैगों में से कम से कम एक टैग के साथ मीडिया छिपाएँ।", + "BlockContentWithTagsHelp": "कम से कम एक निर्दिष्ट टैग वाले मीडिया को छिपाएं।", "ButtonEditUser": "यूजर को संपादित करो", - "CinemaModeConfigurationHelp": "सिनेमा मोड मुख्य फीचर से पहले ट्रेलर और कस्टम इंट्रो चलाने की क्षमता के साथ थिएटर अनुभव को सीधे आपके लिविंग रूम में लाता है।" + "CinemaModeConfigurationHelp": "सिनेमा मोड मुख्य फीचर से पहले ट्रेलर और कस्टम इंट्रो चलाने की क्षमता के साथ थिएटर अनुभव को सीधे आपके लिविंग रूम में लाता है।", + "AlwaysRemuxFlacAudioFilesHelp": "अगर आपके पास ऐसी फाइलें हैं जिन्हें आपका ब्राउज़र चलाने से मना करता है या जिनमें टाइमस्टैम्प गलत तरीके से दिखते हैं, तो इस विकल्प को चालू करें। यह एक वैकल्पिक समाधान के रूप में काम करेगा।", + "AllowFmp4TranscodingContainerHelp": "HEVC और HDR कंटेंट चलाने के लिए इस ट्यूनर में fMP4 ट्रांसकोडिंग कंटेनर चालू करें। ध्यान दें कि सभी ट्यूनर इसके साथ काम नहीं करते। अगर वीडियो प्लेबैक में कोई समस्या हो, तो इसे बंद कर दें।", + "AllowStreamSharingHelp": "Jellyfin को ट्यूनर से MPEG-TS स्ट्रीम की एक कॉपी बनाने और उसे अपने क्लाइंट्स के साथ शेयर करने की अनुमति दें। यह तब उपयोगी होता है जब ट्यूनर पर स्ट्रीम की संख्या की सीमा होती है, लेकिन इससे कभी-कभी प्लेबैक में दिक्कत भी आ सकती है।", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "जब ट्रांसकोडिंग शुरू हो, तब सभी सबटाइटल्स को वीडियो में स्थायी रूप से जोड़ दें। इससे ट्रांसकोडिंग के बाद सबटाइटल्स की सही टाइमिंग बनी रहती है, लेकिन ट्रांसकोडिंग की गति थोड़ी कम हो सकती है।", + "AllowTonemappingSoftwareHelp": "टोन-मैपिंग एक वीडियो के डायनामिक रेंज को HDR से SDR में बदल सकती है, जिससे ओरिजिनल सीन की डिटेल्स और रंग सही तरीके से बने रहते हैं। यह जानकारी वीडियो की गुणवत्ता बनाए रखने के लिए बेहद ज़रूरी होती है। फिलहाल, यह फ़ीचर केवल 10-बिट HDR10, HLG और DoVi वीडियो पर काम करता है।", + "AlwaysRemuxMp3AudioFilesHelp": "अगर आपकी कुछ फाइलों में ब्राउज़र टाइमस्टैम्प गलत दिखा रहा है, तो इस विकल्प को एक समाधान के रूप में चालू करें।", + "Anime": "एनिमे", + "AutoSubtitleStylingHelp": "यह मोड आपके डिवाइस के प्रकार के आधार पर, मूल (native) और कस्टम सबटाइटल स्टाइलिंग के बीच अपने आप स्विच करेगा।", + "AlwaysBurnInSubtitleWhenTranscoding": "ट्रांसकोडिंग करते समय सबटाइटल को हमेशा वीडियो में स्थायी रूप से जोड़ें", + "ConfirmDeleteItem": "इस आइटम को हटाने से यह फ़ाइल सिस्टम और आपकी मीडिया लाइब्रेरी दोनों से हट जाएगा। क्या आप वाकई जारी रखना चाहते हैं?", + "ConfirmDeleteItems": "इन आइटम को हटाने से वे फ़ाइल सिस्टम और आपकी मीडिया लाइब्रेरी दोनों से हट जाएँगे। क्या आप वाकई जारी रखना चाहते हैं?", + "ConfirmDeleteLyrics": "इन गीतों को हटाने से वे फ़ाइल सिस्टम और आपकी मीडिया लाइब्रेरी दोनों से मिट जाएँगे। क्या आप वाकई जारी रखना चाहते हैं?", + "ConfirmEndPlayerSession": "क्या आप {0} पर जेलीफिन को बंद करना चाहेंगे?", + "Console": "कंसोल", + "ContinueWatching": "देखना जारी रखें", + "Continuing": "सतत", + "Connect": "कनेक्ट करें", + "Copy": "कॉपी", + "ConfirmDeletion": "विलोपन की पुष्टि करें", + "Copied": "कॉपी किया गया", + "ColorTransfer": "रंग स्थानांतरण", + "ColorSpace": "रंग स्थान", + "CommunityRating": "सामुदायिक रेटिंग", + "ConfirmDeleteSeries": "इस श्रृंखला को हटाने से फ़ाइल सिस्टम और आपकी मीडिया लाइब्रेरी दोनों से सभी {0} एपिसोड हट जाएँगे। क्या आप वाकई जारी रखना चाहते हैं?", + "Composer": "संगीतकार", + "Conductor": "कंडक्टर", + "ConfigureDateAdded": "डैशबोर्ड > लाइब्रेरीज़ > डिस्प्ले में 'जोड़ी गई तिथि' के लिए मेटाडेटा निर्धारित करने का तरीका सेट करें", + "ConfirmDeleteImage": "छवि हटाएँ?", + "CopyFailed": "कॉपी नहीं किया जा सका", + "BehindTheScenes": "पर्दे के पीछे", + "MachineTranslated": "मशीन द्वारा अनुवादित", + "Unknown": "अज्ञात", + "AiTranslated": "AI (ऐ. आई.) द्वारा अनुतवादि" } diff --git a/src/strings/hr.json b/src/strings/hr.json index 2b82e04a8..1f3693399 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -2,7 +2,7 @@ "Actor": "Glumac", "Add": "Dodaj", "AddToCollection": "Dodaj u kolekciju", - "AddToPlaylist": "Dodaj popisu za reprodukciju", + "AddToPlaylist": "Dodaj u popis za reprodukciju", "AdditionalNotificationServices": "Pretražite katalog dodataka kako bi instalirali dodatne servise za obavijesti.", "AllChannels": "Svi kanali", "AllEpisodes": "Sve epizode", @@ -276,7 +276,7 @@ "LabelAlbumArtists": "Izvođači albuma", "LabelAllowHWTranscoding": "Dopusti hardversko konvertiranje", "LabelAppName": "Ime aplikacije", - "LabelAppNameExample": "Primjer: Sickbeard, Sonarr", + "LabelAppNameExample": "Ime za identifikaciju API ključeva koje ljudi mogu pročitati. Ova postavka neće utjecati na funkcionalnost.", "LabelArtists": "Izvođači", "LabelArtistsHelp": "Odvoji višestruke izvođače sa ; (točka sa zarezom).", "LabelAudioLanguagePreference": "Postavke audio jezika", @@ -1458,7 +1458,7 @@ "LabelKodiMetadataUserHelp": "Spremite podatke o gledanju u NFO datoteke za potrebe drugih primjena.", "LabelParentNumber": "Broj roditelja", "LabelTonemappingPeak": "Vrh tonskog preslikavanja", - "LabelPublishedServerUriHelp": "Zaobiđi URI koji koristi Jellyfin, na osnovu sučelja ili klijentske IP adrese.", + "LabelPublishedServerUriHelp": "Zaobiđi URI koji koristi Jellyfin, na osnovu sučelja ili klijentske IP adrese. Na primjer: internal=http://jellyfin.example.com, external=https://jellyfin.example.com ili all=https://jellyfin.example.com", "UseEpisodeImagesInNextUpHelp": "Odjeljci 'Sljedeće' i 'Nastavi s gledanjem' koristit će slike epizoda kao minijature umjesto primarne minijature emisije.", "PreferEmbeddedTitlesOverFileNamesHelp": "Odredite naslov prikaza koji će se koristiti kada nisu dostupni internetski metapodaci ili lokalni metapodaci.", "SubtitleAppearanceSettingsDisclaimer": "Sljedeće postavke ne odnose se na gore navedene grafičke titlove ili ASS/SSA titlove koji imaju vlastite stilove.", @@ -1584,5 +1584,7 @@ "EnableHi10p": "Uključi H.264 High 10 Profil", "EnableTrueHd": "Uključi TrueHD", "Editor": "Uređivač", - "DateModified": "Datum izmjenjivanja" + "DateModified": "Datum izmjenjivanja", + "AllowStreamSharingHelp": "Dozvoliti Jellyfinu da udvostruči mpegts stream iz tunera i podijeli novu kopiju streama sa svojim klijentima. Ovo je korisno kada tuner ima ograničen broj stream-ova, no može uzrokovati poteškoće pri reprodukciji.", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Ukomponirati titlove u video stream kada se aktivira transcoding. Ovo osigurava sinkronizaciju titlova nakon transcoding-a, no uz smanjenu brzinu transcoding-a." } diff --git a/src/strings/hu.json b/src/strings/hu.json index b5776e06b..2e17b9499 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -31,7 +31,7 @@ "ButtonParentalControl": "Szülői felügyelet", "ButtonPause": "Szünet", "ButtonPreviousTrack": "Előző sáv", - "ButtonQuickStartGuide": "Gyors beállítási varázsló", + "ButtonQuickStartGuide": "Beállítási útmutató", "ButtonRemove": "Eltávolítás", "ButtonRename": "Átnevezés", "ButtonResetEasyPassword": "PIN-kód visszaállítása", @@ -411,7 +411,7 @@ "TabUpcoming": "Hamarosan érkezik", "Tags": "Címkék", "TellUsAboutYourself": "Mondj valamit magadról", - "ThisWizardWillGuideYou": "Ez a varázsló végigvezet a telepítésen. A kezdéshez válasz nyelvet.", + "ThisWizardWillGuideYou": "Ez a varázsló segít végigvezetni Önt a beállítási folyamaton. A kezdéshez kérjük, adja meg a szervernevet, és válassza ki az előnyben részesített nyelvet.", "Thursday": "Csütörtök", "TitleHardwareAcceleration": "Hardveres gyorsítás", "TitlePlayback": "Lejátszás", @@ -492,7 +492,7 @@ "ColorSpace": "Színtér", "ColorTransfer": "Színátvitel", "Composer": "Zeneszerző", - "ConfigureDateAdded": "Állítsa be az Irányítópult > Médiatárak > Megjelenítés menüpontban, hogy a „Hozzáadás dátuma” metaadat hogyan legyen meghatározva.", + "ConfigureDateAdded": "Állítsa be az Irányítópult > Médiatárak > Megjelenítés menüpontban, hogy a „Hozzáadás dátuma” metaadat hogyan legyen meghatározva", "ConfirmDeleteImage": "Kép törlése?", "ConfirmDeleteItem": "Az elem törlésével az törlődni fog a fájlrendszerből és a médiakönyvtárból is. Biztosan folytatni akarod?", "ConfirmDeleteItems": "Az elemek törlésével azok törlődni fognak a fájlrendszerből és a médiakönyvtárból is. Biztosan folytatni akarod?", @@ -752,7 +752,7 @@ "LabelKodiMetadataSaveImagePathsHelp": "Ez akkor ajánlott, ha olyan képfájlnevek vannak amelyek nem felelnek meg a Kodi irányelveinek.", "LabelLanNetworks": "LAN hálózatok", "LabelLocalHttpServerPortNumber": "Helyi HTTP port száma", - "LabelLockItemToPreventChanges": "Az elem zárolása a jövőbeni változások elkerülése érdekében", + "LabelLockItemToPreventChanges": "Elem zárolása a további metaadat-módosítások megakadályozására", "LabelLoginDisclaimer": "Bejelentkezési nyilatkozat", "LabelLoginDisclaimerHelp": "Ez az üzenet a bejelentkezési oldal alján jelenik meg.", "LabelManufacturer": "Gyártó", @@ -1272,7 +1272,7 @@ "LabelDeinterlaceMethod": "Váltottsorosság-mentesítő mód", "DeinterlaceMethodHelp": "Válassza ki a a váltottsoros tartalom szoftveres átkódolásához használt váltottsorosság-mentesítési módot. Ha engedélyezi a hardveres váltottsorosság-mentesítést támogató hardveres gyorsítást, akkor az lesz használva ezen beállítás helyett.", "UnsupportedPlayback": "A Jellyfin nem tudja feloldani a DRM-mel védett tartalmak titkosítását, de ettől függetlenül mindig megpróbálja a lejátszást, a védett címek esetén is. Néhány fájl emiatt teljesen feketeként jelenhet meg a titkosítás vagy a nem támogatott funkciók miatt, például az interaktív címeknél.", - "Yadif": "YADIF", + "Yadif": "Egy újabb váltottsorosságot megszüntető szűrő (YADIF)", "ButtonTogglePlaylist": "Lejátszási lista", "Filter": "Szűrés", "New": "Új", @@ -1335,7 +1335,7 @@ "MessageAddRepository": "Ha új tárolót szeretnél hozzáadni, kattints a gombra a fejlécben, és add meg a szükséges adatokat.", "LabelRepositoryNameHelp": "Egy egyedi név, amivel megkülönböztetheted a tárolót a többi, a szervezhez hozzáadott tárolótól.", "LabelRepositoryName": "Tároló neve", - "LabelRepositoryUrlHelp": "A hivatkozni kívánt tároló manifeszt helye.", + "LabelRepositoryUrlHelp": "A hivatkozni kívánt tároló jegyzékének helye.", "LabelRepositoryUrl": "Tároló URL-je", "HeaderNewRepository": "Új tároló", "MessageNoRepositories": "Nincs tároló.", @@ -1388,11 +1388,11 @@ "LabelQuickConnectCode": "Gyors kapcsolódás kódja", "LabelKnownProxies": "Ismert proxyk", "LabelCurrentStatus": "Jelenlegi állapot", - "LabelTonemappingPeakHelp": "A jel / névleges / referencia csúcs felülírása ezzel az értékkel. Hasznos, ha a megjelenített metaadatokba beágyazott csúcsinformációk nem megbízhatóak, vagy ha az alacsonyabb tartományból magasabb tartományba történik a tónusleképezés. Az ajánlott és az alapértelmezett érték 100 és 0.", + "LabelTonemappingPeakHelp": "A bemeneti jel beágyazott metaadat-értékének felülbírálása ezzel a csúcsértékkel. Az alapértelmezett érték 100 (1000 nit).", "LabelTonemappingPeak": "Tónusleképezés csúcs", "LabelTonemappingThresholdHelp": "A tónusleképezési algoritmus paramétereit minden jelenetre finomhangolják. És egy küszöböt használnak annak felderítésére, hogy a jelenet megváltozott-e vagy sem. Ha az aktuális keret átlagos fényereje és az aktuális futási átlag közötti távolság meghaladja a küszöbértéket, akkor újra kiszámolnánk a jelenet átlagát és a csúcs fényerejét. Az ajánlott és az alapértelmezett érték 0,8 és 0,2.", "LabelTonemappingThreshold": "Tónusleképezés küszöb", - "LabelTonemappingDesatHelp": "Alkalmazz deszaturálást olyan fénypontokra, amelyek meghaladják ezt a fényerőszintet. Minél magasabb a paraméter, annál több színinformáció marad meg. Ez a beállítás segít megakadályozni a természetellenesen kifújt színeket a szuper kiemelések érdekében, mivel (simán) fehérré válnak. Ezáltal a képek természetesebbnek érezhetik magukat, annak árán, hogy csökkentsék a tartományon kívül eső színekkel kapcsolatos információkat. Az ajánlott és az alapértelmezett érték 0 és 0,5.", + "LabelTonemappingDesatHelp": "Csökkentse a színtelítettséget azoknál a csúcsfényeknél, amelyek fényereje meghaladja ezt a szintet. Javasolt érték: O (letiltva).", "TonemappingRangeHelp": "Válaszd ki a kimeneti színtartományt. Az Auto megegyezik a bemeneti tartományral.", "LabelTonemappingRange": "Tónusleképezés tartomány", "TonemappingAlgorithmHelp": "A tónusleképezés finomhangolható. Ha még nem ismered ezeket az opciókat, tartsd meg az alapértelmezett értéket. Az ajánlott érték 'BT.2390'.", @@ -1415,7 +1415,7 @@ "HeaderDeleteDevices": "Összes eszköz törlése", "DeleteDevicesConfirmation": "Biztos, hogy törli az összes eszközt? Az összes munkamenet ki lesz jelentkeztetve. Az eszközök újra megjelennek, amikor egy felhasználó újra bejelentkezik.", "DeleteAll": "Összes törlése", - "AspectRatioFill": "Kitöltés", + "AspectRatioFill": "Nyújtás", "LabelTonemappingParam": "Tónusleképezés-paraméter", "LabelTonemappingDesat": "Tónusleképezés deszaturáció", "YoutubeDenied": "A kért videót nem szabad lejátszani beágyazott lejátszókban.", @@ -1440,7 +1440,7 @@ "RemuxHelp2": "A Remux nagyon kevés feldolgozási teljesítményt használ, teljesen veszteségmentes médiaminőség mellett.", "RemuxHelp1": "Az adathordozók nem kompatibilis fájlok tárolójában vannak (MKV, AVI, WMV stb.), De mind a video, mind az audio adatfolyam kompatibilis az eszközzel. A médiát menet közben veszteségmentesen csomagolják át, mielőtt a készülékre küldik őket.", "Remuxing": "Remuxolás", - "AspectRatioCover": "Borító", + "AspectRatioCover": "Nagyítás", "EnableFallbackFontHelp": "Engedélyezze az egyéni alternatív betűtípusokat. Ezzel elkerülhető a helytelen felirat-megjelenítés problémája.", "EnableFallbackFont": "Engedélyezze a tartalék betűtípusokat", "LabelFallbackFontPathHelp": "Ezeket a betűtípusokat egyes ügyfelek feliratok megjelenítésére használják. További információért kérjük, olvassa el a dokumentációt.", @@ -1454,7 +1454,7 @@ "MediaInfoColorPrimaries": "Fő színek", "LabelUDPPortRangeHelp": "Korlátozza a Jellyfint, hogy ezt a porttartományt használja UDP-kapcsolatok létrehozásakor. (Alapértelmezés szerint 1024 - 65535).
Megjegyzés: Bizonyos funkciókhoz fix portok szükségesek, amelyek kívül eshetnek ezen a tartományon.", "LabelUDPPortRange": "UDP kommunikációs tartomány", - "LabelTonemappingParamHelp": "Hangolja be a tónusleképezési algoritmust. Az ajánlott és az alapértelmezett érték NaN. Általában hagyja üresen.", + "LabelTonemappingParamHelp": "Hangolja be a tónusleképezési algoritmust. Általában hagyja üresen.", "LabelSSDPTracingFilterHelp": "Opcionális IP-cím, amelyen szűrni lehet a naplózott SSDP-forgalmat.", "LabelSSDPTracingFilter": "SSDP Szűrő", "LabelPublishedServerUriHelp": "Felülírja a Jellyfin által használt URI-t az interfész vagy a kliens IP-címe alapján. Például: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, or all=https://jellyfin.example.com", @@ -1662,9 +1662,9 @@ "MediaInfoVideoRangeType": "Videótartomány típusa", "LabelVideoRangeType": "Videótartomány típusa", "VideoRangeTypeNotSupported": "A videó tartománytípusa nem támogatott", - "LabelVppTonemappingContrastHelp": "Kontraszt növelésének mértéke VPP tónusleképezés használatakor. Az ajánlott és az alapértelmezett érték 1.", + "LabelVppTonemappingContrastHelp": "Kontraszt növelésének mértéke VPP tónusleképezés használatakor. Az ajánlott érték 1.", "LabelVppTonemappingContrast": "VPP tónusleképezés kontrasztszintje", - "LabelVppTonemappingBrightnessHelp": "Fényerő növelésének mértéke VPP tónusleképezés használatakor. Az ajánlott és az alapértelmezett értékek 16 és 0.", + "LabelVppTonemappingBrightnessHelp": "Fényerő növelésének mértéke VPP tónusleképezés használatakor. Az ajánlott értékek 16.", "LabelVppTonemappingBrightness": "VPP tónusleképezés fényerőszintje", "ScreenResolution": "Képernyőfelbontás", "RememberSubtitleSelectionsHelp": "Próbálja meg úgy beállítani a feliratsávot, hogy a legközelebb legyen az utolsó videóhoz.", @@ -1714,7 +1714,7 @@ "HeaderPerformance": "Teljesítmény", "Short": "Rövidfilm", "Featurette": "Mellékfilm", - "LabelParallelImageEncodingLimitHelp": "Maximálisan engedélyezett egyidejűleg futó képkódolások száma. 0-ra állítva a processzormagok száma alapján lesz kiválasztva a limit.", + "LabelParallelImageEncodingLimitHelp": "Maximálisan engedélyezett egyidejűleg futó képkódolások száma. Üresen hagyva a processzormagok száma alapján lesz kiválasztva a limit.", "ResolutionMatchSource": "Forrásnak megfelelő", "LabelParallelImageEncodingLimit": "Egyidejű képkódolási limit", "AllowCollectionManagement": "Ez a felhasználó módosíthatja a gyűjteményeket", @@ -1810,7 +1810,7 @@ "PlaybackError.MEDIA_NOT_SUPPORTED": "A lejátszás meghiúsult, mert a tartalmat a kliens nem támogatja.", "PlaybackError.NotAllowed": "Ennek a tartalomnak a lejátszása nem engedélyezett.", "BlockingScan": "Blokkoló – beütemezi az előállítást, a befejeződéséig blokkolja a tartalomkeresést", - "LabelTrickplayAccelEncodingHelp": "Jelenleg csak QSV és VAAPI gyorsítókon elérhető, más hardveres gyorsítókat nem befolyásol.", + "LabelTrickplayAccelEncodingHelp": "Ez a beállítás jelenleg csak a QSV, VA-API, VideoToolbox és RKMPP technológiáknál érhető el. Más hardveres gyorsítási módokra nincs hatással.", "PriorityHigh": "Magas", "LabelTrickplayAccelEncoding": "Hardveresen gyorsított MJPEG kódolás engedélyezése", "ConfirmDeleteLyrics": "A dalszövegek törlésével azok törlődni fognak a fájlrendszerből és a médiakönyvtárból is. Biztosan folytatni akarod?", @@ -1917,8 +1917,8 @@ "LabelNotInstalled": "Nincs telepítve", "LabelScreensaverTimeHelp": "Az az inaktivitási idő (másodpercben), hogy elinduljon a képernyővédő.", "LabelSelectPreferredTranscodeVideoCodec": "Preferált transzkódolási videó kódek", - "LibraryScanFanoutConcurrencyHelp": "A párhuzamos feladatok maximális száma a könyvtár vizsgálás során. Ha ezt 0-ra állítja, a rendszer magszáma alapján választ ki egy korlátot. FIGYELMEZTETÉS: Ennek a számnak a túl magas beállítása problémákat okozhat a hálózati fájlrendszerekben; ha problémákat tapasztal, csökkentsd ezt a számot.", - "LyricDownloadersHelp": "Engedélyezd és rangsorold a preferált felirat letöltőket a prioritás sorrendjében.", + "LibraryScanFanoutConcurrencyHelp": "A médiatár-ellenőrzések során futtatható párhuzamos feladatok maximális száma. Ha ezt üresen hagyja, a rendszer a processzormagok száma alapján választ egy korlátot. FIGYELMEZTETÉS: A szám túl magasra állítása problémákat okozhat hálózati fájlrendszereknél. Ha problémákba ütközik, csökkentse ezt az értéket.", + "LyricDownloadersHelp": "Engedélyezze és rangsorolja a preferált dalszövegletöltőket prioritási sorrendben.", "MediaInfoRotation": "Elforgás", "MediaSegmentAction.None": "Egyik sem", "MediaSegmentAction.Skip": "Kihagyás", @@ -1992,5 +1992,73 @@ "PreferNonstandardArtistsTagHelp": "Használja a nem szabványos ARTISTS címkét az ARTIST címke helyett, ha elérhető.", "Penciller": "Grafikus", "MetadataImagesLoadError": "Nem sikerült betölteni a metaadat beállításokat", - "LibraryNameInvalid": "A könyvtár neve nem lehet üres." + "LibraryNameInvalid": "A könyvtár neve nem lehet üres.", + "LabelGroupShowsIntoCollections": "Sorozatok csoportosítása kollekcióként", + "LabelGroupShowsIntoCollectionsHelp": "Az egy kollekcióban lévő sorozatok egyetlen csoportosított elemként fognak megjelenni a sorozatlistában.", + "CustomSplashScreenSize": "Az egyedi képeknek 16:9-es képarányúnak, és legalább 1920x1080 pixel méretűnek kell lenniük.", + "DeleteCustomImage": "Egyedi kép törlése", + "ImageDeleteFailed": "A kép törlése nem sikerült", + "ImageUploadCancelled": "A kép feltöltése megszakítva", + "ImageUploadFailed": "A kép feltöltése sikertelen", + "RetryWithGlobalSearch": "Újra globális kereséssel", + "SaveLyricsIntoMediaFolders": "Feliratok mentése a média mappába", + "SearchForLyrics": "Feliratok keresése", + "Retry": "Újra", + "Reset": "Visszaállítás", + "Regional": "Regionális", + "LimitSegmentLength": "Használj rövidebb HLS szegmenst", + "LimitSegmentLengthHelp": "A beállítás engedélyezése segíthet bizonyos eszközökön mint a webOS TV-k a HLS lejátszó akadozását megszűntetni.", + "PreviewLyrics": "Felirat előnézet", + "HeaderUpdateRequired": "Frissítés szükséges", + "RenderPgsSubtitle": "Kísérleti PGS felirat renderelés", + "ReplaceTrickplayImages": "A már létező trickplay képek cseréje", + "SaveLyricsIntoMediaFoldersHelp": "A szövegek tárolása az audió fájlok mellett, a könnyebb kezelhetőség érdekében.", + "ReadInputAtNativeFramerate": "Bemenet beolvasása az eredeti képkockasebességgel", + "ReadInputAtNativeFramerateHelp": "Ezen opció bekapcsolása orvosolhat bizonyos problémákat, például azt, hogy az élő közvetítések túl korán leállnak.", + "RenderPgsSubtitleHelp": "Annak meghatározása, hogy a kliens PGS feliratokat rendereljen-e a beégetett feliratok használata helyett. Ezzel elkerülhető a szerveroldali átkódolás, a kliensoldali renderelési teljesítmény rovására.", + "StreamCountExceedsLimit": "A streamek száma meghaladja a korlátot", + "Translator": "Fordító", + "LogLoadFailure": "Nem sikerült betölteni a naplófájlt. Lehet hogy még írás alatt van.", + "HeaderServerUnavailable": "A szerver nem elérhető", + "SelectPreferredTranscodeVideoCodecHelp": "Válassza ki az átkódoláshoz előnyben részesített videó kodeket. Ha az előnyben részesített kodek nem támogatott, a szerver a következő legjobb elérhető kodeket fogja használni.", + "SelectPreferredTranscodeVideoAudioCodecHelp": "Válassza ki a videó tartalmak átkódolásához előnyben részesített audió kodeket. Ha az előnyben részesített kodek nem támogatott, a szerver a következő legjobb elérhető kodeket fogja használni.", + "UseCustomTagDelimiters": "Egyéni címke elválasztó használata", + "UseCustomTagDelimitersHelp": "Előadó/műfaj címkék szétválasztása egyéni karakterekkel.", + "UploadCustomImage": "Egyedi kép feltöltése", + "BackupsPageLoadError": "Nem sikerült betölteni a biztonsági mentések oldalt", + "LabelRestore": "Visszaállítás", + "LabelDatabase": "Adatbázis", + "ViewSettings": "Beállítások megtekintése", + "PluginsLoadError": "Hiba lépett fel a bővítmények betöltése során.", + "StorageType.NoRootDirectory": "Több forrás", + "StorageType.Network": "Hálózati", + "StorageType.Ram": "RAM", + "Success": "Siker", + "HeaderBackups": "Mentések", + "DownloadManager": "Letöltések", + "ButtonLearnMore": "Bővebben", + "Create": "Létrehozás", + "HeaderBackupsHelp": "Hozzon létre és állítson vissza mentéseket a szerverről. A mentés tartalmazhatja az adatbázist, a metaadatokat, a feliratokat és a trükkfelvételeket.", + "MessageBackupDisclaimer": "A mentés a könyvtár méretétől függően hosszabb időt vehet igénybe.", + "MessageBackupInProgress": "Mentés folyamatban", + "MessageRestoreSuccess": "A visszaállítás sikeresen befejeződött", + "MessageWaitingForServer": "Várakozás a szerverre...", + "StorageType.CDRom": "CD-ROM", + "StorageType.Fixed": "Belső", + "StorageType.Removable": "Cserélhető", + "StorageType.Unknown": "Ismeretlen", + "TranscodingLoadError": "Nem sikerült betölteni az átkódolási beállításokat", + "MessageForgotPasswordPinReset": "A jelszó-visszaállítás befejezéséhez adja meg a PIN-kódot", + "ButtonCreateBackup": "Biztonsági mentés készítése", + "LabelBackupsUnavailable": "Nincsenek mentések", + "MessageRestoreInProgress": "Visszaállítás folyamatban", + "DeleteRepositoryConfirmation": "Biztosan törölni szeretnéd ezt a tárolót?", + "ConfirmDeleteRepository": "Tároló törlése?", + "MessageRestoreDisclaimer": "FIGYELEM: Ön egy korábbi mentés visszaállítására készül. A művelet alatt a szerver nem lesz használható, és a mentés óta létrehozott minden új adat elvész.", + "RepositoriesPageLoadError": "Tárolók betöltése sikertelen", + "LabelProgramData": "Alkalmazás adatai", + "LabelImageCache": "Képgyorsítótár", + "ConnectAnyway": "Kapcsolódás mindenképp", + "HeaderServerMismatch": "Szerver eltérés", + "MessageServerMismatch": "A szerver melyre most próbál csatlakozni, nem egyezik meg az előző szerverrel mely ezen a címen volt található. Ha ez várható volt, kattintson a \"Kapcsolódás mindenképp\" gombra. Ellenkező esetben a szerver elérése kompromittálódott." } diff --git a/src/strings/id.json b/src/strings/id.json index 1305e9570..8bff80574 100644 --- a/src/strings/id.json +++ b/src/strings/id.json @@ -1,5 +1,5 @@ { - "ButtonQuickStartGuide": "Panduan cepat", + "ButtonQuickStartGuide": "Panduan Pengaturan", "ButtonSignOut": "Sign out", "HeaderEasyPinCode": "Kode PIN Mudah", "HeaderSetupLibrary": "Siapkan perpustakaan media Anda", @@ -52,12 +52,12 @@ "Continuing": "Melanjutkan", "ContinueWatching": "Lanjutkan menonton", "Connect": "Sambung", - "ConfirmEndPlayerSession": "Apakah Anda ingin mematikan Jellyfin pada {0}?", + "ConfirmEndPlayerSession": "Apakah Anda ingin mematikan Jellyfin di {0}?", "ConfirmDeletion": "Konfirmasi Penghapusan", "ConfirmDeleteItems": "Penghapusan item-item ini akan menghapus baik pada sistem berkas maupun pustaka media Anda. Apakah Anda yakin untuk melanjutkan?", "ConfirmDeleteItem": "Penghapusan item ini akan menghapus baik pada sistem berkas maupun pustaka media Anda. Apakah Anda yakin untuk melanjutkan?", "ConfirmDeleteImage": "Hapus gambar?", - "ConfigureDateAdded": "Atur cara kerja penentuan metadata untuk 'Tanggal ditambahkan' di menu Dasbor > Pustaka > Pengaturan NFO", + "ConfigureDateAdded": "Atur bagaimana metadata untuk 'Tanggal Ditambahkan' ditentukan di Dasbor > Pustaka > Tampilan.", "Composer": "Komposer", "CommunityRating": "Peringkat komunitas", "ChannelNumber": "Nomor saluran", @@ -1945,5 +1945,31 @@ "HeaderNextVideo": "Video Selanjutnya", "AndOtherArtists": "{0} dan {1} artis lainnya.", "LabelAllowStreamSharing": "Mengizinkan berbagi stream", - "LabelAudioTagSettings": "Pengaturan Tag Audio" + "LabelAudioTagSettings": "Pengaturan Tag Audio", + "Custom": "Kustom", + "CopyLogSuccess": "Catatan konten berhasil di salin.", + "CustomSplashScreenSize": "Kustom gambar harus dalam 16x9 aspek rasio dengan ukuran minimum 1920x1080.", + "AllowFmp4TranscodingContainerHelp": "Izinkan kontainer transkode fMP4 pada tuner ini untuk mengaktifkan konten HEVC dan HDR. Tidak semua tuner kompatibel dengan kontainer ini. Nonaktifkan jika Anda mengalami masalah pemutaran.", + "AllowTonemappingSoftwareHelp": "Pemetaan nada dapat mengubah rentang dinamis video dari HDR ke SDR sambil mempertahankan detail gambar dan warna, yang merupakan informasi sangat penting untuk merepresentasikan adegan asli. Saat ini hanya berfungsi dengan video 10-bit HDR10, HLG, dan DoVi.", + "DisplayLoadError": "Terjadi kesalahan saat memuat data konfigurasi tampilan.", + "FallbackMaxStreamingBitrateHelp": "Bitrate streaming maksimum digunakan sebagai nilai pengganti saat ffprobe tidak dapat menentukan bitrate aliran sumber. Ini membantu mencegah klien meminta bitrate transkode yang sangat tinggi, yang dapat menyebabkan pemutar gagal dan membebani encoder secara berlebihan.", + "AllowStreamSharingHelp": "Izinkan Jellyfin menggandakan aliran mpegts dari tuner dan membagikan salinannya ke klien. Fitur ini berguna jika tuner memiliki batas jumlah aliran, namun berisiko menyebabkan masalah pemutaran.", + "HeaderPageNotFound": "Halaman tidak ditemukan", + "DownloadManager": "Unduhan", + "HeaderAudioAdvanced": "Audio Lanjutan", + "AutoSubtitleStylingHelp": "Mode ini akan secara otomatis beralih antara mekanisme gaya subtitle bawaan dan kustom berdasarkan jenis perangkat Anda.", + "CustomSubtitleStylingHelp": "Gaya subtitle akan berfungsi di sebagian besar perangkat, namun disertai dengan beban performa tambahan.", + "DeleteServerConfirmation": "Apakah Anda yakin ingin menghapus server ini?", + "ButtonLearnMore": "Pelajari Lebih Lanjut", + "Create": "Buat", + "DeleteCustomImage": "Hapus Gambar Kustom", + "HeaderBackupsHelp": "Buat dan pulihkan snapshot server Anda yang dapat mencakup database, metadata, subtitle, dan trickplay.", + "BackupsPageLoadError": "Gagal memuat halaman cadangan", + "ButtonCreateBackup": "Buat Cadangan", + "HeaderMediaSegmentActions": "Tindakan Segmen Media", + "HeaderUpdateRequired": "Pembaruan Diperlukan", + "ConfirmDeleteRepository": "Hapus Repositori?", + "DeleteRepositoryConfirmation": "Apakah Anda yakin ingin menghapus repositori ini?", + "HeaderServerUnavailable": "Server tidak tersedia", + "ImageDeleteFailed": "Gagal menghapus gambar" } diff --git a/src/strings/it.json b/src/strings/it.json index 5a5a146fa..8ac4a95fd 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -66,7 +66,7 @@ "ButtonParentalControl": "Controllo parentale", "ButtonPause": "Pausa", "ButtonPreviousTrack": "Traccia Precedente", - "ButtonQuickStartGuide": "Guida rapida", + "ButtonQuickStartGuide": "Guida alla Configurazione", "ButtonRefreshGuideData": "Aggiorna la guida", "ButtonRemove": "Rimuovi", "ButtonRename": "Rinomina", @@ -1045,7 +1045,7 @@ "ThemeSongs": "Temi canzoni", "ThemeVideos": "Temi video", "TheseSettingsAffectSubtitlesOnThisDevice": "Queste impostazioni influenzano i sottotitoli di questo dispositivo", - "ThisWizardWillGuideYou": "Questa procedura ti guiderà attraverso il processo di installazione. Per iniziare, per favore scegli la tua lingua preferita.", + "ThisWizardWillGuideYou": "Questa procedura ti guiderà attraverso il processo di installazione. Per iniziare, per favore inserisci il nome del server e scegli la tua lingua preferita.", "Thumb": "Miniatura", "Thursday": "Giovedì", "TitleHardwareAcceleration": "Accelerazione Hardware", @@ -1461,7 +1461,7 @@ "LabelCreateHttpPortMapHelp": "Consenti la mappatura automatica delle porte per creare una regola per il traffico HTTP oltre al traffico HTTPS.", "LabelCreateHttpPortMap": "Abilita la mappatura automatica delle porte per il traffico HTTP e HTTPS.", "LabelTonemappingPeak": "Valore massimo della mappatura dei toni", - "LabelTonemappingParamHelp": "Regola l'algoritmo di mappatura dei toni. I valori raccomandati e di default sono NaN. Solitamente lasciare vuoto.", + "LabelTonemappingParamHelp": "Regola l'algoritmo di mappatura dei toni. Di solito si lascia vuoto.", "LabelTonemappingParam": "Parametro per la mappatura dei toni", "LabelTonemappingDesatHelp": "Applica la desaturazione per le alte-luci che superano questo livello di luminosità. Il valore raccomandato 0 (disabilitato).", "LabelSyncPlayTimeSyncOffset": "Offset del tempo", @@ -1482,8 +1482,8 @@ "LabelHDHomerunPortRange": "Intervallo porte di HD Homerun", "LabelH265Crf": "CRF di codifica H.265", "LabelAllowedAudioChannels": "Numero massimo di Canali Audio permessi", - "AspectRatioFill": "Riempi", - "AspectRatioCover": "Copertina", + "AspectRatioFill": "Allunga", + "AspectRatioCover": "Zoom", "SyncPlayGroupDefaultTitle": "Gruppo di {0}", "AllowHevcEncoding": "Permetti codifica in formato HEVC", "DisablePlugin": "Disabilita", @@ -1653,7 +1653,7 @@ "Digital": "Digitale", "LabelTextWeight": "Stile testo", "Bold": "Grassetto", - "EnableSplashScreen": "Abilita la schermata di avvio", + "EnableSplashScreen": "Abilita l'immagine nella schermata di avvio", "MediaInfoDvBlSignalCompatibilityId": "Id compatibilità segnale bl DV", "MediaInfoBlPresentFlag": "Flag di preselezione bl DV", "MediaInfoElPresentFlag": "Flag di preselezione el DV", @@ -1963,7 +1963,7 @@ "MediaSegmentType.Outro": "Titoli di coda", "MediaSegmentType.Intro": "Intro", "MediaSegmentType.Preview": "Anteprima", - "MediaSegmentType.Recap": "RIassunto", + "MediaSegmentType.Recap": "Riassunto", "MediaSegmentAction.AskToSkip": "Chiedi di saltare", "MediaSegmentSkipPrompt": "Salta {0}", "MessageCancelSeriesTimerError": "Si è verificato un errore durante l'annullamento del timer della serie", @@ -2014,5 +2014,56 @@ "PageNotFound": "Questa non è la pagina che stai cercando.", "SettingsPageLoadError": "Errore nel caricamento della pagina di configurazione", "RetryWithGlobalSearch": "Riprova con la ricerca globale", - "StreamCountExceedsLimit": "Il numero di flussi supera il limite" + "StreamCountExceedsLimit": "Il numero di flussi supera il limite", + "ReadInputAtNativeFramerate": "Lettura dell'ingresso alla frequenza di fotogrammi nativa", + "ReadInputAtNativeFramerateHelp": "Abilitando questa opzione potresti risolvere alcuni problemi, ad esempio l'interruzione anticipata delle dirette streaming.", + "CustomSplashScreenSize": "Le immagini personalizzate devono avere un formato 16x9 e una dimensione minima di 1920x1080.", + "DeleteCustomImage": "Elimina l'immagine personalizzata", + "ImageUploadCancelled": "Caricamento immagine annullato", + "ImageUploadFailed": "Caricamento immagine non riuscito", + "ImageDeleteFailed": "Eliminazione immagine non riuscita", + "UploadCustomImage": "Carica immagine personalizzata", + "LabelGroupShowsIntoCollectionsHelp": "Le serie in una collezione verranno mostrate come un elemento di gruppo quando vengono mostrate le liste di serie.", + "LimitSegmentLength": "Usa segmenti HLS più corti", + "LimitSegmentLengthHelp": "Abilitare questa opzione può aiutare ad evitare che il lettore HLS si blocchi mentre si ricerca su alcuni dispositivi, come le TV webOS.", + "LabelGroupShowsIntoCollections": "Raggruppa le serie in collezioni", + "HeaderServerUnavailable": "Server Non Disponibile", + "HeaderUpdateRequired": "Aggiornamento Necessario", + "ViewSettings": "Mostra impostazioni", + "DownloadManager": "Scaricati", + "MessageForgotPasswordPinReset": "Inserisci il PIN per resettare la Password", + "LiveTVPageLoadError": "Impossibile caricare la pagina delle registrazioni", + "MessageBackupDisclaimer": "In base alla grandezza della tua libreria, il processo di backup può impiegare un po' di tempo.", + "MessageRestoreDisclaimer": "ATTENZIONE: Stai per ripristinare un backup precedente. Il tuo server verrà reso inutilizzabile durante il processo e tutti i dati creati dopo il backup verranno persi.", + "RepositoriesPageLoadError": "Impossibile caricare i repository", + "PluginsLoadError": "Si è verificato un errore durante il caricamento dei plugin.", + "StorageType.NoRootDirectory": "Nessuna Cartella Radice", + "Success": "Successo", + "StorageType.Network": "Rete", + "HeaderBackups": "Backup", + "MessageBackupInProgress": "Backup in corso", + "StorageType.CDRom": "CD-ROM", + "StorageType.Fixed": "Fisso", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Removibile", + "StorageType.Unknown": "Sconosciuto", + "ButtonLearnMore": "Scopri di più", + "Create": "Crea", + "HeaderBackupsHelp": "Crea e ripristina snapshot del tuo server che possono includere il database, metadati, sottotitoli e trickplay.", + "LabelBackupsUnavailable": "Nessun backup disponibile", + "LabelDatabase": "Database", + "MessageRestoreSuccess": "Ripristino completato con successo", + "MessageWaitingForServer": "In attesa del server...", + "TranscodingLoadError": "Impossibile caricare le impostazioni di transcodifica", + "BackupsPageLoadError": "Impossibile caricare la pagina dei backup", + "ButtonCreateBackup": "Crea Backup", + "ConfirmDeleteRepository": "Eliminare repository?", + "DeleteRepositoryConfirmation": "Sei sicuro di voler eliminare questo repository?", + "LabelRestore": "Ripristina", + "MessageRestoreInProgress": "Ripristino in corso", + "LabelImageCache": "Cache delle immagini", + "LabelProgramData": "Dati del programma", + "ConnectAnyway": "Connetti Comunque", + "HeaderServerMismatch": "I Server Non Combaciano", + "MessageServerMismatch": "Il server al quale ti stai connettendo non è lo stesso server a cui ti sei connesso in precedenza a questo indirizzo. Se questo era previsto, per favore seleziona \"Connetti Comunque\". Altrimenti, la tua connessione o il server potrebbe essere compromesso." } diff --git a/src/strings/ja.json b/src/strings/ja.json index b408c5d86..44ffb1c6f 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -750,7 +750,7 @@ "LabelFolder": "フォルダー", "LabelForgotPasswordUsernameHelp": "ユーザー名を覚えていたら入力してください。", "LabelFormat": "フォーマット", - "LabelDropImageHere": "画像を個々にドロップするか検索する。", + "LabelDropImageHere": "ここに画像をドロップするか、クリックして参照してください。", "LabelEasyPinCode": "簡単な PIN コード", "LabelManufacturerUrl": "製作社のURL", "LabelHomeScreenSectionValue": "ホームスクリーンセクション {0}", @@ -1935,5 +1935,6 @@ "FallbackMaxStreamingBitrateHelp": "最大ストリーミングビットレートは、ffprobe がソースストリームのビットレートを決定できない場合のフォールバックとして使用されます。 これは、クライアントが過度に高いトランスコード・ビットレートを要求するのを防ぐのに役立ちます。", "HeaderAddLyrics": "歌詞を追加", "HeaderPageNotFound": "ページが見つかりません", - "AndOtherArtists": "{0}と他のアーティスト{1}人。" + "AndOtherArtists": "{0}と他のアーティスト{1}人。", + "HeaderUpdateRequired": "更新が必要です" } diff --git a/src/strings/kn.json b/src/strings/kn.json index 2162b1e31..fcd8a5323 100644 --- a/src/strings/kn.json +++ b/src/strings/kn.json @@ -26,5 +26,24 @@ "Shows": "ಧಾರವಾಹಿಗಳು", "Photos": "ಚಿತ್ರಗಳು", "Artists": "ಕಲಾವಿದರು", - "Books": "ಪುಸ್ತಕಗಳು" + "Books": "ಪುಸ್ತಕಗಳು", + "AddedOnValue": "{0} ಸೇರಿಸಲಾಗಿದೆ", + "AddToPlaylist": "ಪ್ಲೇಲಿಸ್ಟ್‌ಗೆ ಸೇರಿಸಿ", + "Aired": "ಪ್ರಸಾರಗೊಂಡಿದೆ", + "AllComplexFormats": "ಎಲ್ಲಾ ಸಂಕೀರ್ಣ ಫಾರ್ಮ್ಯಾಟ್‌ಗಳು (ASS, SSA, VobSub, PGS, SUB, IDX, …)", + "All": "ಎಲ್ಲಾ", + "AirPlay": "ಎರ್‌ಪ್ಲೇ", + "Add": "ಸೇರಿಸಿ", + "AddToCollection": "ಸಂಗ್ರಹಕ್ಕೆ ಸೇರಿಸಿ", + "AllEpisodes": "ಎಲ್ಲಾ ಎಪಿಸೋಡ್‌ಗಳು", + "AllChannels": "ಎಲ್ಲಾ ಚಾನೆಲ್‌ಗಳು", + "Album": "ಆಲ್ಬಮ್", + "AddToFavorites": "ಮೆಚ್ಚಿನವುಗಳಿಗೆ ಸೇರಿಸಿ", + "AlbumArtist": "ಆಲ್ಬಮ್ ಕಲಾವಿದ", + "Alerts": "ಅಲರ್ಟ್‌ಗಳು", + "AllLanguages": "ಎಲ್ಲಾ ಭಾಷೆಗಳು", + "AllLibraries": "ಎಲ್ಲಾ ಲೈಬ್ರರಿ ಗಳು", + "AddToPlayQueue": "ಪ್ಲೇ ಕ್ಯೂಗೆ ಸೇರಿಸಿ", + "AgeValue": "({0} ವರ್ಷಗಳಷ್ಟು ಹಳೆಯದು)", + "AirDate": "ಪ್ರಸಾರ ದಿನಾಂಕ" } diff --git a/src/strings/lv.json b/src/strings/lv.json index e88862159..1c9dcaa26 100644 --- a/src/strings/lv.json +++ b/src/strings/lv.json @@ -441,7 +441,7 @@ "ButtonResetEasyPassword": "Nomainīt vieglo PIN kodu", "ButtonRename": "Pārsaukt", "ButtonRemove": "Noņemt", - "ButtonRefreshGuideData": "Atjaunot ceļveža datus", + "ButtonRefreshGuideData": "Atjaunināt ceļveža datus", "ButtonPreviousTrack": "Iepriekšējais celiņš", "ButtonPause": "Pauzēt", "ButtonParentalControl": "Vecāku pārvaldība", @@ -639,7 +639,7 @@ "RemoveFromPlaylist": "Noņemt no atskaņošanas sarakasta", "RemoveFromCollection": "Noņemt no kolekcijas", "RememberMe": "Atcerēties mani", - "Refresh": "Atjaunot", + "Refresh": "Atjaunināt", "Recordings": "Ieraksti", "RecordingCancelled": "Ieraksts atcelts.", "RecordSeries": "Ierakstīt seriālu", @@ -731,7 +731,7 @@ "LabelBlockContentWithTags": "Bloķēt vienumus ar birkām", "LabelBitrate": "Bitu ātrums", "LabelBindToLocalNetworkAddress": "Saistīt ar vietējā tīkla adresi", - "LabelAutomaticallyRefreshInternetMetadataEvery": "Automātiski atjaunot metadatus no interneta", + "LabelAutomaticallyRefreshInternetMetadataEvery": "Automātiski atjaunināt metadatus no interneta", "LabelAuthProvider": "Autentifikācijas nodrošinātājs", "LabelAudioSampleRate": "Audio izlases ātrums", "LabelAudioCodec": "Audio kodeks", @@ -813,7 +813,7 @@ "ConfirmEndPlayerSession": "Vai vēlaties izslēgt Jellyfin uz servera {0}?", "ConfirmDeleteItems": "Dzēšot šos vienumus, tie tiks izdzēsti no failu sistēmas un multivides bibliotēkas. Vai tiešām turpināt?", "ConfirmDeleteItem": "Dzēšot šo vienumu, tas tiks izdzēsts no failu sistēmas un multivides bibliotēkas. Vai tiešām turpināt?", - "ConfigureDateAdded": "Uzstādīt kā metadati priekš 'Pievienošanas datums' tiek noteikts sadaļā Info panelis > Bibliotēkas > NFO Iestatījumi", + "ConfigureDateAdded": "Uzstādīt kā metadati priekš 'Pievienošanas datums' tiek noteikts sadaļā Info panelis > Bibliotēkas > Displejs", "Composer": "Komponists", "ColorSpace": "Krāsu telpa", "ColorPrimaries": "Primārās krāsas", @@ -821,7 +821,7 @@ "ChannelAccessHelp": "Izvēlieties kanālus, ko koplietot ar šo lietotāju. Administratori spēs rediģēt visus kanālus izmantojot metadatu pārvaldnieku.", "ChangingMetadataImageSettingsNewContent": "Izmaiņas metadatu vai mākslas lejupielādes iestatījumos tiks izmantotas tikai vēlāk pievienotajam bibliotēkas saturam. Lai pielietotu šīs izmaiņas jau esošiem vienumiem, jums nepieciešams atjaunināt šo vienumu metadatus manuāli.", "ButtonSubmit": "Iesniegt", - "ButtonQuickStartGuide": "Ātrā lietošanas instrukcija", + "ButtonQuickStartGuide": "Uzstādīšanas instrukcija", "ButtonManualLogin": "Manuāla pieteikšanās", "ButtonEditOtherUserPreferences": "Rediģēt šī lietotāja profilu, attēlu un personīgos iestatījumus.", "ButtonArrowRight": "Pa labi", @@ -836,7 +836,7 @@ "AlwaysPlaySubtitlesHelp": "Valodas priekšrokai atbilstošie subtitri tiks ielādēti neatkarīgi no audio valodas.", "AllowFfmpegThrottling": "Ierobežot transkodējumus", "AllowHWTranscodingHelp": "Atļaut uztvērējam transkodēt straumes tiešsaistē. Tas var atvieglot transkodēšanu, kas jāveic serverim.", - "AirDate": "Tiešraides datums", + "AirDate": "Translācijas datums", "LabelHardwareAccelerationTypeHelp": "Aparatūras paātrināšanai ir vajadzīga papildus konfigurācija.", "LabelEncoderPreset": "Kodēšanas noklusējumi", "HardwareAccelerationWarning": "Iespējota aparatūras paātrināšana var izraisīt nestabilitāti atsevišķās vidēs. Pārliecinieties, ka operētājsistēma un video draiveri it pilnībā atjaunināti. Ja jums ir problēmas ar video atskaņošanu pēc šī iestatījuma iespējošanas, jums vajadzēs nomainīt to atpakaļ uz Neviens.", @@ -1107,9 +1107,9 @@ "LabelTonemappingThresholdHelp": "Toņu kartēšanas algoritma parametri tiek precīzi noregulēti katrai ainai. Un tiek izmantots slieksnis, lai noteiktu, vai aina ir mainījusies vai nav. Ja attālums starp pašreizējo kadra vidējo spilgtumu un pašreizējo vidējo spilgtumu pārsniedz sliekšņa vērtību, mēs pārrēķinām ainas vidējo un maksimālo spilgtumu. Ieteicamās un noklusējuma vērtības ir 0.8 un 0.2 .", "LabelTonemappingThreshold": "Toņu kartēšanas slieksnis", "LabelTonemappingRange": "Toņu kartēšanas diapazons", - "LabelTonemappingPeakHelp": "Pārrakstīt signālu/nominālo/atsauces maksimumu ar šo vērtību. Noderīga, ja displeja metadatos iegultā maksimālā informācija nav uzticama vai arī notiek toņu kartēšana no zemāka diapazona uz augstāku diapazonu. Ieteicamās un noklusējuma vērtības ir 100 un 0.", + "LabelTonemappingPeakHelp": "Pārrakstīt iegulto metadatu vērtību ievadsignālam ar šo maksimālo vērtību. Noklusējuma vērtība ir 100 (1000nit).", "LabelTonemappingPeak": "Toņu kartēšanas maksimums", - "LabelTonemappingParamHelp": "Noregulējiet toņu kartēšanas algoritmu. Ieteicamās un noklusējuma vērtības ir NaN. Parasti atstājiet to tukšu.", + "LabelTonemappingParamHelp": "Toņu kartēšanas algoritma tūnings. Vispārēji atstājiet to tukšu.", "LabelTonemappingParam": "Toņu kartēšanas parametrs", "LabelTonemappingDesatHelp": "Izmantojiet piesātinājuma samazināšanu izgaismotajiem objektiem, kas pārsniedz šo spilgtuma līmeni. Ieteicamās vērtība ir 0 (atslēgts).", "LabelTonemappingDesat": "Toņu kartēšanas piesātinājums \"desat\"", @@ -1234,7 +1234,7 @@ "Conductor": "Diriģents", "Casual": "Ikdienišķs", "Arranger": "Aranžetājs", - "AgeValue": "({0} gadu vecs)", + "AgeValue": "({0} gadi)", "LabelPublishedServerUriHelp": "Pārrakstīt URI, ko izmanto Jellyfin, vadoties pēc tīkla interfeisa vai klienta IP adreses. Piemēram: internal=http://jellyfin.example.com, external=https://jellyfin.example.com vai all=https://jellyfin.example.com", "LabelPublishedServerUri": "Publicētā servera URI", "LabelProtocolInfoHelp": "Vērtība, kas tiks izmantota, atbildot uz GetProtocolInfo pieprasījumiem no ierīces.", @@ -1345,7 +1345,7 @@ "MessageChangeRecordingPath": "Ierakstu mapes maiņa automātiski nepārvietos jau pastāvošus ierakstus no vecās uz jauno atrašanās vietu. Jums vajadzēs pašam tos manuāli pārvietot vajadzības gadījumā.", "MessageEnablingOptionLongerScans": "Šīs opcijas iespējošana var krietni paildzināt bibliotēku skenēšanu.", "HeaderPerformance": "Veiktspēja", - "LabelDummyChapterDurationHelp": "Intervāls starp fiktīvajām nodaļām. Iestatiet 0, lai atslēgtu fiktīvo nodaļu ģenerēšanu. Šīs vērtības maiņa neietekmēs esošās fiktīvās nodaļas.", + "LabelDummyChapterDurationHelp": "Intervāls starp fiktīvajām nodaļām sekundēs. Iestatiet 0, lai atslēgtu fiktīvo nodaļu ģenerēšanu. Šīs vērtības maiņa neietekmēs esošās fiktīvās nodaļas.", "LabelDummyChapterCountHelp": "Maksimālais nodaļu attēlu skaits, kas tiks ekstraktēts no katra multivides faila.", "LabelChapterImageResolutionHelp": "Izvilkto nodaļu attēlu izšķirtspēja. Šīs vērtības maiņa neietekmēs esošās fiktīvās nodaļas.", "LabelParallelImageEncodingLimit": "Paralēlas attēlu kodēšanas limits", @@ -1559,7 +1559,7 @@ "SubtitleMagenta": "Purpursarkans", "SubtitleVerticalPositionHelp": "Rindas numurs, kurā parādās teksts. Pozitīvie skaitļi norāda no augšas uz leju. Negatīvi skaitļi norāda uz augšupejošu tekstu.", "TheseSettingsAffectSubtitlesOnThisDevice": "Šie iestatījumi ietekmē subtitrus šajā ierīcē", - "ThisWizardWillGuideYou": "Šis vednis palīdzēs jums veikt iestatīšanas procesu. Lai sāktu, izvēlieties vēlamo valodu.", + "ThisWizardWillGuideYou": "Šis vednis palīdzēs jums veikt uzstādīšanas procesu. Lai sāktu, ievadiet servera vārdu un izvēlieties vēlamo valodu.", "EnableVppTonemapping": "Iespējot VPP toņu kartēšanu", "AudioCodecNotSupported": "Audio kodeks netiek atbalstīts", "AudioChannelsNotSupported": "Audio kanālu skaits netiek atbalstīts", @@ -1778,7 +1778,7 @@ "PlaybackError.FATAL_HLS_ERROR": "Kritiska kļūda notika HLS straumē.", "PlaybackError.PLAYER_ERROR": "Atskaņošana nav iespējama sakarā ar atskaņotāja kritisko kļūdu.", "PlaybackError.NotAllowed": "Šito failu atskaņošana nav atļauta.", - "PlaybackError.RateLimitExceeded": "Šis fails šobrīd nevar būt atskaņots, jo serveris ierobežo pieprasījumus.", + "PlaybackError.RateLimitExceeded": "Šo failu šobrīd nevar atskaņot, jo serveris ierobežo pieprasījumus.", "PlaylistError.CreateFailed": "Nesanāca izveidot atskaņošanas sarakstu", "PlaylistError.AddFailed": "Nesanāca pievienot atskaņošanas sarakstam", "Smart": "Viedais", @@ -1825,7 +1825,7 @@ "PriorityNormal": "Normāls", "PriorityIdle": "Brīvs", "LabelProcessPriority": "Procesu prioritāte", - "IntelLowPowerEncHelp": "Zemas jaudas kodēšana var paturēt nevajadzīgo CPU-GPU sinhronizāciju. Linux sistēmā tiem jabūt izslēgtiem ja i915 HuC aparātprogrammatūra nav nokonfigurēta.", + "IntelLowPowerEncHelp": "Zemas jaudas kodēšana var paturēt nevajadzīgo CPU-GPU sinhronizāciju. Linux sistēmā tiem jābūt izslēgtiem, ja i915 HuC aparātprogrammatūra nav nokonfigurēta.", "EnableVideoToolboxTonemapping": "Iespējot VideoToolbox toņu kartēšanu", "PreferSystemNativeHwDecoder": "Dod priekšroku natīvam DXVA vai VA-API aparatūras paātrinājumiem", "LabelEncodingFormatOptions": "Kodēšanas formāta opcijas", @@ -1954,5 +1954,81 @@ "ImageDeleteFailed": "Attēla dzēšana neizdevās", "ImageUploadFailed": "Attēla augšupielāde neizdevās", "LimitSegmentLength": "Lietot īsākus HLS segmentus", - "LimitSegmentLengthHelp": "Iespējojot šo opciju HLS atskaņošana varbūtēji novērsīs iekāršanos meklēšanas operāciju laikā noteiktās ierīcēs, piemēram WebOS televizoros." + "LimitSegmentLengthHelp": "Iespējojot šo opciju HLS atskaņošana varbūtēji novērsīs iekāršanos meklēšanas operāciju laikā noteiktās ierīcēs, piemēram WebOS televizoros.", + "HeaderServerUnavailable": "Serveris nav pieejams", + "HeaderUpdateRequired": "Nepieciešams atjauninājums", + "ViewSettings": "Apskatīt uzstādījumus", + "StorageType.NoRootDirectory": "Bez saknes mapes", + "MessageRestoreSuccess": "Atjaunošana izdevās", + "LabelProgramData": "Program Data", + "HeaderBackups": "Rezerves kopijas", + "MessageRestoreDisclaimer": "BRĪDINĀJUMS: Jūs atjaunosiet iepriekšēju rezerves kopiju. Serveris nedarbosies procesa laikā. Tie dati, kas tika radīti pēc atjaunojamās rezerves kopijas izveides, pazudīs.", + "MessageWaitingForServer": "Gaida uz serveri...", + "MessageBackupDisclaimer": "Rezerves kopijas izveide var aizņemt samērā ilgu laiku, kas atkarīgs no jūsu bibliotēkas lieluma.", + "MessageBackupInProgress": "Rezerves kopijas izveide ir procesā", + "LabelBackupsUnavailable": "Nav nevienas rezerves kopijas", + "StorageType.Network": "Tīkls", + "StorageType.Fixed": "Nenoņemama", + "StorageType.CDRom": "Kompaktdisks", + "StorageType.Unknown": "Nav zināms", + "StorageType.Removable": "Noņemama", + "StorageType.Ram": "Atmiņa (RAM)", + "Success": "Izdevās", + "ButtonCreateBackup": "Izveidot rezerves kopiju", + "BackupsPageLoadError": "Neizdevās ielādēt rezerves kopiju lapu", + "Create": "Izveidot", + "HeaderBackupsHelp": "Veidojiet vai atjaunojiet jūsu servera rezerves kopijas, kuras ietver datu bāzi, metadatus, subtitrus un trickplay attēlus.", + "LabelDatabase": "Datu bāze", + "MessageRestoreInProgress": "Atjaunošana ir procesā", + "LabelImageCache": "Attēlu kešatmiņa", + "LabelRestore": "Atjaunot", + "DeleteRepositoryConfirmation": "Vai tiešām vēlaties dzēst šo krātuvi?", + "NativeSubtitleStylingHelp": "Subtitru stilizēšana nedarbosies uz dažām ierīcēm. Lai gan tas nenāk ar veiktspējas pārpalikumiem.", + "PluginsLoadError": "Notika kļūme ielādējot spraudņus.", + "VideoCodecTagNotSupported": "Šis video kodeka tegs vairs nav atbalstīts", + "MessageSplitVersionsError": "Notika kļūme sadalot versijas", + "UseCustomTagDelimiters": "Izmantot pielāgotu tega atdalītāju", + "MessagePlaybackError": "Notika kļūme atskaņojot šo failu uz Jūsu Google Cast uztvērēja.", + "HeaderPageNotFound": "Lapa nav atrasta", + "AutoSubtitleStylingHelp": "Šis režīms automātiski pārslēgs starp vietējo un pielāgoto subtitru stilizēšanas mehānismiem, atkarībā no ierīces tipa.", + "LibraryInvalidItemIdError": "Bibliotēka ir nederīgā stāvoklī un to nevar rediģēt. Jūs, iespējams, saskaraties ar kļūmi - ceļš datubāzē nav pareizais ceļš failu sistēmā.", + "MediaSegmentProvidersHelp": "Ieslēgt un novērtēt savus vēlamos mediju segmentu sniedzējus prioritātes kārtībā.", + "RetryWithGlobalSearch": "Atkārtot ar globālu meklējumu", + "LabelDelimiterWhitelistHelp": "Vienumi, kur tiks izslēgti no tegu sadalīšanas. Viens vienums rindiņā.", + "LabelGroupShowsIntoCollectionsHelp": "Šovi kolekcijā tiks parādīti kā sagrupēts vienums, kad tiek parādīts šovu saraksts.", + "PreferNonstandardArtistsTag": "Priekšroku dot ARTISTS tegam, ja pieejams", + "ReadInputAtNativeFramerateHelp": "Ieslēdzot šo opciju var atrisināt dažas problēmas, t.i., tiešraides priekšlaicīgi apturas.", + "ReplaceTrickplayImages": "Aizvietot esošos Trickplay attēlus", + "RenderPgsSubtitleHelp": "Noteikt vai klientam vajadzētu atveidot PGS subtitrus nevis iededzinātos subtitrus. Tas var novērst servera puses transkodēšanu, tā vietā izmantojot klienta puses atveidošanas veiktspēju.", + "MessageCancelTimerError": "Notika kļūme atceļot taimeri", + "PreferNonstandardArtistsTagHelp": "Izmantot nestandarta ARTISTS tegu nevis ARTISTS tegu, kad pieejams.", + "LabelJpegQuality": "JPEG kvalitāte", + "UploadCustomImage": "Augšupielādēt pielāgotu attēlu", + "CustomSplashScreenSize": "Pielāgotiem attēliem vajadzētu būt 16:9 attiecībā un vismaz 1920x1080 pikseļu izmērā.", + "DownloadManager": "Lejupielādes", + "MessageCancelSeriesTimerError": "Notika kļūme atceļot sērijas taimeri", + "StreamCountExceedsLimit": "Straumju skaits pārsniedz ierobežojumu", + "MessageForgotPasswordPinReset": "Ievadiet PIN šeit lai pabeigtu paroles atiestatīšanu", + "ButtonLearnMore": "Uzzināt vairāk", + "ConfirmDeleteRepository": "Dzēst krātuvi?", + "ImageUploadCancelled": "Attēla augšupielāde atcelta", + "PageNotFound": "Šī nav lapa, kuru Jūs meklējat.", + "RepositoriesPageLoadError": "Neizdevās ielādēt krātuves", + "TranscodingLoadError": "Neizdevās ielādēt transkodēšanas iestatījumus", + "TonemappingModeHelp": "Izvēlēties toņu kartēšanas režīmu. Ja konstatētas izplūdušas spilgtās vietas, pamēģināt RGB režīmu.", + "LabelQscale": "Qscale", + "ReadInputAtNativeFramerate": "Lasīt ievadi vietējā kadru nomaiņas ātrumā", + "Reset": "Atiestatīt", + "FallbackMaxStreamingBitrateHelp": "Maksimālā straumēšanas bitu pārraides ātrums tiek izmantots kā rezerves variants, kad ffprobe nespēj noteikt avota straumes bitu pārraides ātrumu. Tas palīdz novērst pieprasījumus no klientiem ar pārmērīgi augstu transkodēšanas bitu pārraides ātrumu, kas var likt atskaņotājam nobrukt and pārslogot kodētāju.", + "LabelQsvDeviceHelp": "Precizēt ierīci Intel QSV izmantošanai vairāku video karšu sistēmā. Linux sistēmās tā ir atveidošanas mezgls, t.i., /dev/dri/renderD128. Windows sistēmās tas ir ierīču indekss sākot no 0. Atstāt lauku tukšu izņemot, ja zināt ko darāt.", + "StoryArc": "Stāsta loks", + "LabelFallbackMaxStreamingBitrate": "Rezerves variants maksimālajam bitu pārraides ātrumam (Mb/s)", + "AlwaysRemuxFlacAudioFilesHelp": "Ja Jums ir faili, kurus Jūsu pārlūkprogramma atsakās atskaņot vai neprecīzi aprēķina laika zīmogus, ieslēgt šo kā risinājumu.", + "SelectPreferredTranscodeVideoCodecHelp": "Izvēlēties vēlamo video kodeku tā transkodēšanai. Ja vēlamais kodeks netiek atbalstīts, serveris izmantos nākamo labāko pieejamo kodeku.", + "UseDoubleRateDeinterlacing": "Dubultot kadru nomaiņas ātrumu kad noņem rindpārleces izvērsi", + "UseCustomTagDelimitersHelp": "Sadalīt izpildītājus/žanru tegus ar pielāgotiem simboliem.", + "LabelSaveTrickplayLocallyHelp": "Saglabājot trickplay attēlus multivides mapēs novietos attēlus blakus tavai multividei vieglai migrācijai un piekļuvei.", + "AllowTonemappingSoftwareHelp": "Toņu kartēšana var pārveidot video dinamisko diapazonu uz HDR no SDR (uz augstu diapazonu no zema) paturot attēla detaļas un krāsas, kas ir ļoti būtiska informāciju reprezentējot oriģinālo ainu. Šobrīd darbojas tikai ar 10bit HDR10, HLG un DoVi video.", + "LiveTVPageLoadError": "Neizdevās ielādēt lapu ar ierakstiem", + "HeaderServerMismatch": "Servera nesakritība" } diff --git a/src/strings/mn.json b/src/strings/mn.json index 2972aec05..d0a63d892 100644 --- a/src/strings/mn.json +++ b/src/strings/mn.json @@ -3,10 +3,10 @@ "Songs": "Дуунууд", "Playlists": "Тоглуулах жагсаалт", "Movies": "Кино", - "Genres": "Төрөл зүйл", + "Genres": "Төрлүүд", "Favorites": "Дуртай", "Collections": "Багц", - "Artists": "Зураачуд", + "Artists": "Уран бүтээлчид", "ButtonCancel": "Цуцлах", "Artist": "Жүжигчин", "Album": "Цомог", @@ -100,5 +100,14 @@ "AccessRestrictedTryAgainLater": "Одоогоор хандалт хязгаарлагдмал байна. Дараа дахин оролдож үзнэ үү.", "Actor": "Жүжигчин", "Add": "Нэмэх", - "AddedOnValue": "Нэмсэн" + "AddedOnValue": "Нэмсэн", + "Shows": "Нэвтрүүлгүүд", + "Photos": "Зургууд", + "MusicVideos": "Дууны клип", + "Folders": "Хавтаснууд", + "Channels": "Сувгууд", + "HeaderAlbumArtists": "Цомгийн уран бүтээлчид", + "ValueSpecialEpisodeName": "Тусгай - {0}", + "Default": "Өгөгдмөл", + "AddToCollection": "Цуглуулгад нэмэх" } diff --git a/src/strings/mr.json b/src/strings/mr.json index abd68cf42..a3217c063 100644 --- a/src/strings/mr.json +++ b/src/strings/mr.json @@ -519,7 +519,7 @@ "LabelAudioCodec": "ऑडियो कोडेक", "LabelAudioChannels": "ऑडियो वाहिन्या", "LabelArtists": "संगीतकार", - "LabelAppNameExample": "उदाहरणार्थ: Sickbeard, Sonarr", + "LabelAppNameExample": "", "LabelAppName": "अ‍ॅपचे नाव", "LabelAlbumArtists": "अल्बम संगीतका", "LabelAlbum": "अल्बम", @@ -676,5 +676,10 @@ "AllowCollectionManagement": "या वापरकर्त्यास संग्रह व्यवस्थापित करण्यास अनुमती द्या", "AllowSegmentDeletion": "विभागांना हटवा", "AllowSegmentDeletionHelp": "क्लायंटला पाठवल्यानंतर जुन्या विभागांना हटवा. यामुळे संपूर्ण ट्रान्सकोड केलेली फाईल डिस्कवर साठवण्याची आवश्यकता नाही. केवळ थ्रॉटलिंग सक्षम असल्यास कार्य करेल. जर आपल्याला प्लेबॅक समस्या येत असतील तर हे बंद करा.", - "LabelSegmentKeepSeconds": "विभागांना ठेवण्याची वेळ" + "LabelSegmentKeepSeconds": "विभागांना ठेवण्याची वेळ", + "AirPlay": "एअरप्ले", + "AccessRestrictedTryAgainLater": "सध्या प्रवेश मर्यादित आहे. कृपया नंतर पुन्हा प्रयत्न करा.", + "Alternate": "पर्यायी", + "AllowContentWithTagsHelp": "फक्त निर्दिष्ट टॅगपैकी किमान एक असलेले मीडिया दाखवा.", + "AllowSubtitleManagement": "या वापरकर्त्याला सबटायटल संपादित करण्याची परवानगी द्या" } diff --git a/src/strings/my.json b/src/strings/my.json index c22f50ead..2e282b78d 100644 --- a/src/strings/my.json +++ b/src/strings/my.json @@ -116,10 +116,10 @@ "AddToPlaylist": "အစီအစဉ်သို့ ထည့်ပါ", "AddToCollection": "စုစည်းမှုထဲထည့်ပါ", "AdditionalNotificationServices": "ထပ်ဆောင်း သတိပေးချက်ဝန်ဆောင်မှုများကို ထည့်သွင်းရန် ပလပ်အင်ကတ်တလောက်ကို ကြည့်ရှုပါ။", - "AddedOnValue": "ထပ်ခဲ့သည်။{0}", + "AddedOnValue": "{0} ထပ်ခဲ့သည်", "Add": "ထပ်မည်။", "Actor": "သရုပ်ဆောင်", - "AccessRestrictedTryAgainLater": "ဝင်ရောက်ခွင့်ကို လောလောဆယ် ကန့်သတ်ထားပါသည်။ နောက်တစ်ကြိမ် ထပ်မံကြိုးစားကြည့်ပါ။.", + "AccessRestrictedTryAgainLater": "ဝင်ရောက်ခွင့်ကို လတ်တလော ကန့်သတ်ထားပါသည်။ နောက်တစ်ကြိမ် ထပ်မံကြိုးစားကြည့်ပါ။.", "Absolute": "ပကတိ", "DirectPlayHelp": "အရင်းအမြစ်ဖိုင်သည် ဤကလိုင်းယင့်နှင့် လုံးဝသဟဇာတဖြစ်ပြီး စက်ရှင်သည် ပြုပြင်မွမ်းမံမှုမရှိဘဲ ဖိုင်ကို လက်ခံရရှိနေပါသည်။", "DirectPlaying": "တိုက်ရိုက်ဖွင့်ခြင်း", diff --git a/src/strings/nb.json b/src/strings/nb.json index 6b64461c8..daa22e0d7 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -55,7 +55,7 @@ "ButtonOpen": "Åpne", "ButtonParentalControl": "Foreldrekontroll", "ButtonPreviousTrack": "Forrige spor", - "ButtonQuickStartGuide": "Hurtigveiledning", + "ButtonQuickStartGuide": "Oppsettsveiledning", "ButtonRefreshGuideData": "Oppdater TV-guidedata", "ButtonRemove": "Fjern", "ButtonRename": "Endre navn", @@ -890,7 +890,7 @@ "TabUpcoming": "Kommende", "Tags": "Tagger", "TellUsAboutYourself": "Fortell oss litt om deg selv", - "ThisWizardWillGuideYou": "Denne veiviseren vil hjelpe deg gjennom installasjonsprosessen. Velg ønsket språk for å komme i gang.", + "ThisWizardWillGuideYou": "Denne veiviseren vil hjelpe deg gjennom installasjonsprosessen. Velg et navn på serveren og ønsket språk for å komme i gang.", "Thursday": "Torsdag", "TitleHardwareAcceleration": "Maskinvareakselerasjon", "TitleHostingSettings": "Vertsinnstillinger", @@ -1401,7 +1401,7 @@ "MediaInfoColorTransfer": "Fargeoverføring", "MediaInfoColorSpace": "Fargeområde", "MediaInfoVideoRange": "Videoutvalg", - "Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF).", + "Bwdif": "Bob Weaver Deinterlacing-filter (BWDIF).", "UseDoubleRateDeinterlacingHelp": "Denne innstillingen bruker feltfrekvensen når du fjerner linjefletting, ofte referert til som bob deinterlacing, som dobler bildefrekvensen til videoen for å gi full bevegelse som det du ville se når du ser linjeflettet video på en TV.", "UseDoubleRateDeinterlacing": "Doble bildefrekvensen ved fjerning av linjefletting", "LabelMaxMuxingQueueSizeHelp": "Maksimalt antall pakker som kan buffres mens de venter på at alle strømmer skal initialiseres. Prøv å øke verdien hvis du fremdeles ser \"Too many packets buffered for output stream\" -feil i FFmpeg-logger. Den anbefalte verdien er 2048.", @@ -1437,8 +1437,8 @@ "RemuxHelp2": "Ompakking bruker svært lite prosessorkraft og fører ikke til tap av kvalitet på mediet.", "RemuxHelp1": "Mediet er i en inkompatibel mediabeholder (MKV, AVI, WMV osv.), men både videostrømmen og lydstrømmen er kompatibel med enheten. Mediet vil pakkes om fortløpende uten kvalitetstap før det sendes til enheten.", "Remuxing": "Ompakking", - "AspectRatioFill": "Fyll", - "AspectRatioCover": "Dekk", + "AspectRatioFill": "Strekk", + "AspectRatioCover": "Zoom", "EnableFallbackFontHelp": "Aktiver egendefinerte alternative skrifttyper. Dette kan hjelpe med å unngå problemer ved gjengivelse av undertekster.", "EnableFallbackFont": "Aktiver skrifttyper å falle tilbake på", "LabelFallbackFontPathHelp": "Disse skrifttypene er brukt av noen klienter for å vise undertekster. Referer til dokumentasjonen for mer informasjon.", @@ -1590,7 +1590,7 @@ "Mixer": "Mikser", "MediaInfoTitle": "Tittel", "Lyricist": "Tekstforfatter", - "Larger": "Stor", + "Larger": "Større", "LabelSyncPlaySettingsSkipToSyncHelp": "Synkroniseringskorrigeringsmetode som består i å søke til den estimerte posisjonen. Synkroniseringskorrigering må være aktivert.", "LabelSyncPlaySettingsSkipToSync": "Aktiver SkipToSync", "LabelSyncPlaySettingsSpeedToSyncHelp": "Synkroniseringsmetode som består i å øke hastigheten på avspillingen. Synkroniseringskorrigering må være aktivert.", @@ -1655,7 +1655,7 @@ "LabelTextWeight": "Tekstvekt", "LabelMaxVideoResolution": "Høyest tillatte oppløsning for video-omkoding", "LabelVppTonemappingBrightness": "VPP-tonekartlegging lysstyrkeforsterkning", - "EnableSplashScreen": "Aktiver oppstartsskjerm", + "EnableSplashScreen": "Aktiver oppstartsbilde", "ScreenResolution": "Skjermoppløsning", "RememberSubtitleSelections": "Velg undertekst basert på forrige video", "RememberSubtitleSelectionsHelp": "Prøv å velg undertekst automatisk basert på forrige video.", @@ -1694,7 +1694,7 @@ "LabelDummyChapterDuration": "Intervall", "HeaderRecordingMetadataSaving": "Opptak metadata", "HeaderPerformance": "Ytelse", - "LabelDummyChapterDurationHelp": "Tid mellom dummykapitler. Sett til 0 for å slå av dummykapittelgenerering. Endring av dette vil ha ingen effekt på eksiterende dummykapitler.", + "LabelDummyChapterDurationHelp": "Tid mellom dummykapitler i sekunder. Sett til 0 for å slå av dummykapittelgenerering. Endring av dette vil ha ingen effekt på eksisterende dummykapitler.", "LabelEnableAudioVbrHelp": "Variabel bithastighet tilbyr bedre forhold mellom kvalitet og gjennomsnittlig bithastighet, men kan i visse tilfeller forårsake buffering og problemer med kompatibilitet.", "LabelEnableAudioVbr": "Aktiver VBR lydenkoding", "SubtitleBlack": "Svart", @@ -1954,7 +1954,7 @@ "LabelCustomTagDelimiters": "Egendefinert skilletegn for tagger", "LabelCustomTagDelimitersHelp": "Tegn som skal behandles som skilletegn for å separere tagger.", "LabelDelimiterWhitelist": "Hviteliste for skilletegn", - "LabelDelimiterWhitelistHelp": "Objekter som skal ekskluderes fra tagdeling. Ett objekt per linje.", + "LabelDelimiterWhitelistHelp": "Elementer som skal ekskluderes fra tagdeling. Ett element per linje.", "PreferNonstandardArtistsTag": "Foretrekk ARTISTER-tag om tilgjengelig", "PreferNonstandardArtistsTagHelp": "Bruk ikke-standard ARTISTS-taggen istedenfor ARTIST-taggen når den er tilgjengelig.", "UseCustomTagDelimiters": "Bruk egendefinert skilletegn for tagger", @@ -2007,5 +2007,24 @@ "LabelSubtitleStyling": "Undertekstiling", "Native": "Innebygd", "Retry": "Prøv igjen", - "MetadataImagesLoadError": "Kunne ikke laste inn metadata-innstillinger" + "MetadataImagesLoadError": "Kunne ikke laste inn metadata-innstillinger", + "LimitSegmentLength": "Bruk kortere HLS segmenter", + "UploadCustomImage": "Last opp egendefinert bilde", + "ReadInputAtNativeFramerateHelp": "Aktivering av denne innstillingen kan løse noen problemer som f. eks. direktesendinger som avsluttes for tidlig.", + "CustomSplashScreenSize": "Egendefinerte bilder bør være i en 16x9 størrelsesforhold med en minimumstørrelse på 1920x1080.", + "DeleteCustomImage": "Slett egendefinert bilde", + "ImageDeleteFailed": "Sletting av bilde mislykket", + "ImageUploadCancelled": "Opplastning av bilde avbrutt", + "ImageUploadFailed": "Opplastning av bilde mislykket", + "RetryWithGlobalSearch": "Prøv på nytt med globalt søk", + "LimitSegmentLengthHelp": "Aktivering av denne innstillingen kan hindre HLS-spilleren fra å henge seg opp ved spoling på enkelte enheter som f. eks. webOS TV-er.", + "LabelGroupShowsIntoCollections": "Grupper serier inn i samlinger", + "LabelGroupShowsIntoCollectionsHelp": "Serier i en samling vil vises som ett samlet element når serielister vises.", + "HeaderServerUnavailable": "Server utilgjengelig", + "StreamCountExceedsLimit": "Antallet strømninger overskrider grensen", + "ReadInputAtNativeFramerate": "Les inndata i opprinnelig bildefrekvens", + "HeaderUpdateRequired": "Oppdatering kreves", + "ViewSettings": "Se instillinger", + "MessageForgotPasswordPinReset": "Tast inn PIN-kode her for å fullføre tilbakestilling av passordet", + "DownloadManager": "Nedlastinger" } diff --git a/src/strings/nl.json b/src/strings/nl.json index 2425ae8e1..b77f7aeea 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -70,7 +70,7 @@ "ButtonParentalControl": "Ouderlijk toezicht", "ButtonPause": "Pauzeren", "ButtonPreviousTrack": "Vorige nummer", - "ButtonQuickStartGuide": "Snelstartgids", + "ButtonQuickStartGuide": "Instelgids", "ButtonRefreshGuideData": "Gidsgegevens vernieuwen", "ButtonRemove": "Verwijderen", "ButtonRename": "Hernoemen", @@ -1036,7 +1036,7 @@ "ThemeSongs": "Themamuziek", "ThemeVideos": "Themavideo's", "TheseSettingsAffectSubtitlesOnThisDevice": "Deze instellingen betreffen ondertiteling op dit apparaat", - "ThisWizardWillGuideYou": "Deze helper helpt je door het opzetproces heen. Om te beginnen selecteer je eerst de gewenste taal.", + "ThisWizardWillGuideYou": "Deze wizard helpt je stap voor stap bij het instellen. Voer om te beginnen een servernaam in en kies je voorkeurstaal.", "Thumb": "Miniatuur", "Thursday": "Donderdag", "TitleHardwareAcceleration": "Hardwareversnelling", @@ -1392,7 +1392,7 @@ "LabelMaxMuxingQueueSize": "Maximale grootte muxing-wachtrij", "LabelColorPrimaries": "Primaire kleur", "MediaInfoColorPrimaries": "Primaire kleuren", - "LabelTonemappingParamHelp": "Stel het tonemapping-algoritme af. Dit veld is standaard leeg; het wordt aanbevolen dit zo te laten.", + "LabelTonemappingParamHelp": "Stel het tonemapping-algoritme af. Normaliter kan dit veld leeg blijven.", "LabelTonemappingParam": "Tonemapping-parameter", "LabelTonemappingPeakHelp": "Gebruik deze piekwaarde voor het ingangssignaal in plaats van de waarde in de ingesloten metadata. De standaardwaarde is 100 (1000 nit).", "LabelTonemappingPeak": "Tonemapping-piek", @@ -1700,7 +1700,7 @@ "SaveRecordingNFOHelp": "Metadata uit de EPG-vermeldingen naast media opslaan.", "SaveRecordingImages": "EPG-afbeeldingen opslaan", "HeaderDummyChapter": "Hoofdstukafbeeldingen", - "LabelDummyChapterDurationHelp": "De interval tussen dummy-hoofdstukken. Stel in op 0 om het genereren van dummy-hoofdstukken uit te zetten. Wijzigingen hebben geen invloed op bestaande dummy-hoofdstukken.", + "LabelDummyChapterDurationHelp": "De interval tussen dummy-hoofdstukken in seconden. Stel in op 0 om het genereren van dummy-hoofdstukken uit te zetten. Wijzigingen hebben geen invloed op bestaande dummy-hoofdstukken.", "ResolutionMatchSource": "Gelijk aan bron", "HeaderRecordingMetadataSaving": "Metadata opname", "SecondarySubtitles": "Secundaire ondertiteling", @@ -2025,5 +2025,44 @@ "ReadInputAtNativeFramerate": "Invoer lezen op oorspronkelijke verversingssnelheid", "ReadInputAtNativeFramerateHelp": "Het inschakelen van deze optie kan bepaalde problemen oplossen, zoals het voortijdig stoppen van livestreams.", "LimitSegmentLength": "Kortere HLS-segmenten gebruiken", - "LimitSegmentLengthHelp": "Het inschakelen van deze optie kan helpen voorkomen dat de HLS-speler vastloopt tijdens terug- en vooruitspoelen op bepaalde apparaten, zoals webOS-tv's." + "LimitSegmentLengthHelp": "Het inschakelen van deze optie kan helpen voorkomen dat de HLS-speler vastloopt tijdens terug- en vooruitspoelen op bepaalde apparaten, zoals webOS-tv's.", + "HeaderUpdateRequired": "Bijwerken vereist", + "HeaderServerUnavailable": "Server niet beschikbaar", + "MessageForgotPasswordPinReset": "Pincode hier invoeren om wachtwoordherstel te voltooien", + "DownloadManager": "Downloads", + "ViewSettings": "Weergave-instellingen", + "Create": "Aanmaken", + "Success": "Gelukt", + "HeaderBackups": "Back-ups", + "MessageWaitingForServer": "Wachten op server...", + "ButtonCreateBackup": "Back-up aanmaken", + "LabelRestore": "Terugzetten", + "BackupsPageLoadError": "Laden van back-up-pagina mislukt", + "LabelBackupsUnavailable": "Geen back-ups beschikbaar", + "LabelDatabase": "Database", + "MessageBackupInProgress": "Back-up in uitvoering", + "MessageRestoreInProgress": "Terugzetten in uitvoering", + "MessageRestoreSuccess": "Terugzetten voltooid", + "HeaderBackupsHelp": "Maak en herstel momentopnamen van je server. Deze kunnen de database, metadata, ondertiteling en trickplay bevatten.", + "LabelImageCache": "Afbeeldingscache", + "MessageBackupDisclaimer": "Afhankelijk van de grootte van je bibliotheek kan het maken van de back-up enige tijd duren.", + "LabelProgramData": "Programmagegevens", + "StorageType.CDRom": "Cd-rom", + "MessageRestoreDisclaimer": "WAARSCHUWING: Je staat op het punt een eerdere back-up terug te zetten. Je server is tijdens dit proces onbruikbaar en alle gegevens die sinds de back-up zijn aangemaakt gaan verloren.", + "StorageType.Fixed": "Vast", + "StorageType.Network": "Netwerk", + "StorageType.NoRootDirectory": "Geen hoofdmap", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Verwisselbaar", + "StorageType.Unknown": "Onbekend", + "PluginsLoadError": "Er is een fout opgetreden bij het laden van plug-ins.", + "ButtonLearnMore": "Meer informatie", + "ConfirmDeleteRepository": "Repository verwijderen?", + "DeleteRepositoryConfirmation": "Weet je zeker dat je dit repository wilt verwijderen?", + "RepositoriesPageLoadError": "Laden van repository's mislukt", + "TranscodingLoadError": "Laden van transcodeerinstellingen mislukt", + "LiveTVPageLoadError": "Laden van opnamepagina mislukt", + "MessageServerMismatch": "De server waarmee je probeert te verbinden, is niet dezelfde als de server waarmee je eerder op dit adres verbonden was. Als dit klopt, kies dan voor \"Toch verbinden\". Is dat niet het geval, dan is je verbinding of de server mogelijk niet veilig.", + "ConnectAnyway": "Toch verbinden", + "HeaderServerMismatch": "Server komt niet overeen" } diff --git a/src/strings/nn.json b/src/strings/nn.json index 1987e0156..2b2a60123 100644 --- a/src/strings/nn.json +++ b/src/strings/nn.json @@ -607,7 +607,7 @@ "AllowOnTheFlySubtitleExtraction": "Tillat at undertekstar hentast ut fortløpande", "AllowMediaConversionHelp": "Tillat eller forby tilgang til mediakonverteringsfunksjonen.", "AllowMediaConversion": "Tillat konvertering av media", - "AllowFfmpegThrottlingHelp": "Når ei omkoding eller ompakking kjem langt nok foran den noverande avspelingsposisjonen, stoppast prosessen slik at den bruker mindre ressursar. Dette er mest nyttig når du sjeldan bytter posisjonen i videoen. Slå av dette viss du opplever problem med avspelinga.", + "AllowFfmpegThrottlingHelp": "Når ei omkoding eller ompakking kjem langt nok foran den noverande avspelingsposisjonen, stoppast prosessen slik at den sparar ressursar. Dette er mest nyttig når du sjeldan bytter posisjonen i videoen. Slå av dette viss du opplever problem med avspelinga.", "AllowFfmpegThrottling": "Avgrens hastigheit på omkoding", "AllowedRemoteAddressesHelp": "Kommaseparert liste over IP-adresser eller IP-/nettverksmaske for nettverk som er godkjent for eksterne tilkoplingar. Dersom feltet står tomt er alle adresser tillatten.", "AllLibraries": "Alle bibliotek", @@ -755,5 +755,13 @@ "AllowTonemappingHelp": "Tonekartlegging kan forvandla det dynamiske området til ein video frå HDR til SDR samtidig som bildedetaljar og fargar blir tatt vare på, noko som er veldig viktig informasjon for å representera den originale scena. Fungerer for augneblinken berre når du omkodar videoar med innebygd HDR10- eller HLG-metadata. Viss avspelinga ikkje er jamn eller mislykkast, bør du vurdera å slå av den tilsvarande maskinvaredekodaren.", "AllowOnTheFlySubtitleExtractionHelp": "Integrerte undertekstar kan hentast ut frå videoar og bli leverte til klientar i klartekst for å unngå omkoding av video. På nokre system kan dette ta lang tid og føra til opphald i avspelinga samtidig som prosessen pågår. Deaktiver innstillinga for å brenna inn underteksten i videoen ved hjelp av omkoding når undertekstformatet ikkje er støtta av klienten.", "AllowHWTranscodingHelp": "Tillat at tuneren omkodar strøymer fortløpande. Dette kan bidra til å redusera mengda omkoding som må utførast av tenaren.", - "OptionBluray": "BD" + "OptionBluray": "BD", + "AirPlay": "AirPlay", + "AllowContentWithTagsHelp": "Vis berre media med minst ein av dei angitte taggene.", + "AllowSubtitleManagement": "Tillet denne brukaren å redigere undertekstar", + "AddToFavorites": "Legg til i favorittar", + "AgeValue": "({0} år gammal)", + "AllowSegmentDeletionHelp": "Slett gamle segment etter at de er lastet ned av klienten. Dette forhindrar at heile den omkodede filen må lagres på disken. Slå av hvis du opplever avspelingsproblemer", + "AllowSegmentDeletion": "Slett segment", + "AllowCollectionManagement": "Tillet denne brukaren å organisere samlingar" } diff --git a/src/strings/pl.json b/src/strings/pl.json index 47e2486c5..bb7686c0d 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -76,7 +76,7 @@ "ButtonParentalControl": "Kontrola rodzicielska", "ButtonPause": "Pauza", "ButtonPreviousTrack": "Poprzedni utwór", - "ButtonQuickStartGuide": "Skrócona instrukcja obsługi", + "ButtonQuickStartGuide": "Przewodnik konfiguracji", "ButtonRefreshGuideData": "Odśwież dane przewodnika", "ButtonRemove": "Usuń", "ButtonRename": "Zmień nazwę", @@ -115,7 +115,7 @@ "ConfirmDeleteItem": "Usunięcie tej pozycji usunie ją zarówno z systemu plików jak i z biblioteki mediów. Czy chcesz kontynuować?", "ConfirmDeleteItems": "Usunięcie tej pozycji usunie ją zarówno z systemu plików jak i z biblioteki mediów. Czy chcesz kontynuować?", "ConfirmDeletion": "Potwierdzenie usunięcia", - "ConfirmEndPlayerSession": "Czy chcesz zamknąć Jellyfin na {0}?", + "ConfirmEndPlayerSession": "Czy chcesz wyłączyć Jellyfin na {0}?", "Connect": "Połącz", "ContinueWatching": "Kontynuuj odtwarzanie", "Continuing": "Dalej wyświetlane", @@ -782,7 +782,7 @@ "MessageConfirmRemoveMediaLocation": "Czy na pewno chcesz usunąć tę lokalizację?", "MessageConfirmRestart": "Czy na pewno chcesz uruchomić Jellyfin ponownie?", "MessageConfirmRevokeApiKey": "Czy na pewno chcesz unieważnić klucz API? Połączenia aplikacji z serwerem zostaną natychmiastowo zakończone.", - "MessageConfirmShutdown": "Czy na pewno chcesz zamknąć serwer?", + "MessageConfirmShutdown": "Czy na pewno chcesz wyłączyć serwer?", "MessageContactAdminToResetPassword": "W celu wyczyszczenia hasła. skontaktuj się z administratorem systemu.", "MessageCreateAccountAt": "Utwórz konto na {0}", "MessageDeleteTaskTrigger": "Czy na pewno chcesz usunąć ten wyzwalacz zadania?", @@ -1105,7 +1105,7 @@ "ThemeSongs": "Motywy muzyczne", "ThemeVideos": "Motywy wideo", "TheseSettingsAffectSubtitlesOnThisDevice": "Te ustawienia dotyczą napisów na tym urządzeniu", - "ThisWizardWillGuideYou": "Niniejszy kreator pomoże Ci przejść przez proces instalacji. Najpierw wybierz preferowany przez siebie język.", + "ThisWizardWillGuideYou": "Niniejszy kreator pomoże Ci przejść przez proces instalacji. Najpierw wpisz nazwę serwera i wybierz preferowany język.", "Thumb": "Miniatura", "Thursday": "Czwartek", "TitleHardwareAcceleration": "Akceleracja sprzętowa", @@ -1148,8 +1148,8 @@ "ValueTimeLimitSingleHour": "Limit czasu: 1 godzina", "ValueVideoCodec": "Kodek wideo: {0}", "Vertical": "Wertykalny", - "ViewAlbum": "Podgląd albumu", - "ViewPlaybackInfo": "Wyświetlaj informacje o odtwarzaniu", + "ViewAlbum": "Zobacz album", + "ViewPlaybackInfo": "Zobacz informacje o odtwarzaniu", "Watched": "Obejrzany", "Wednesday": "Środa", "WelcomeToProject": "Witaj w Jellyfin!", @@ -1245,7 +1245,7 @@ "LabelVideoResolution": "Rozdzielczość wideo", "LabelStreamType": "Typ transmisji", "Artist": "Wykonawca", - "AlbumArtist": "Album wykonawcy", + "AlbumArtist": "Wykonawca albumu", "Album": "Album", "Person": "Osoba", "Movie": "Film", @@ -1256,7 +1256,7 @@ "DeinterlaceMethodHelp": "Wybierz metodę usuwania przeplotu używaną podczas transkodowania. Gdy przyśpieszenie sprzętowe wspierające usuwanie przeplotu jest włączone sprzętowe usuwanie przeplotu zostanie użyte zamiast tego ustawienia.", "ClientSettings": "Ustawienia klienta", "ButtonTogglePlaylist": "Lista odtwarzania", - "ButtonSyncPlay": "Odtwarzanie zsynchronizowane", + "ButtonSyncPlay": "SyncPlay", "ClearQueue": "Wyczyść kolejkę", "StopPlayback": "Zatrzymaj odtwarzanie", "ButtonPlayer": "Odtwarzacz", @@ -1409,7 +1409,7 @@ "LabelTonemappingRange": "Zakres mapowania tonów", "LabelTonemappingPeakHelp": "Zamiast tego zastąp osadzoną wartość metadanych dla sygnału wejściowego tą wartością szczytową. Wartość domyślna to 100 (1000 nitów).", "LabelTonemappingPeak": "Szczyt mapowania tonów", - "LabelTonemappingParamHelp": "Wyreguluj algorytm mapowania tonów. Zalecane i domyślne wartości to NaN. Ogólnie pozostaw to puste.", + "LabelTonemappingParamHelp": "Wyreguluj algorytm mapowania tonów. Zazwyczaj pozostaw to puste.", "LabelTonemappingParam": "Parametry mapowania tonów", "LabelTonemappingDesatHelp": "Zastosuj desaturację dla rozjaśnień, które przekraczają ten poziom jasności. Zalecana wartość to 0 (wyłącz).", "LabelTonemappingDesat": "Desaturacja mapowania tonów", @@ -1693,7 +1693,7 @@ "SaveRecordingNFOHelp": "Zapisz metadane od dostawcy list EPG wraz z mediami.", "HeaderDummyChapter": "Obrazy rozdziału", "LabelDummyChapterDuration": "Interwał", - "LabelDummyChapterDurationHelp": "Odstęp między fikcyjnymi rozdziałami. Ustaw na 0, aby wyłączyć generowanie fikcyjnych rozdziałów. Zmiana tego nie będzie miała wpływu na istniejące fikcyjne rozdziały.", + "LabelDummyChapterDurationHelp": "Odstęp między fikcyjnymi rozdziałami w sekundach. Ustaw na 0, aby wyłączyć generowanie fikcyjnych rozdziałów. Zmiana tego nie będzie miała wpływu na istniejące fikcyjne rozdziały.", "LabelDummyChapterCount": "Ograniczenie", "LabelChapterImageResolution": "Rozdzielczość", "LabelChapterImageResolutionHelp": "Rozdzielczość wyodrębnionych obrazów rozdziałów. Zmiana tego ustawienia nie ma wpływu na istniejące rozdziały.", @@ -2026,5 +2026,44 @@ "ReadInputAtNativeFramerate": "Odczytuj dane wejściowe z natywną szybkością klatek", "ReadInputAtNativeFramerateHelp": "Włączenie tej opcji może rozwiązać niektóre problemy, np. przedwczesne kończenie transmisji na żywo.", "LimitSegmentLength": "Użyj krótszych segmentów HLS", - "LimitSegmentLengthHelp": "Włączenie tej opcji może pomóc zapobiec zawieszaniu się odtwarzacza HLS podczas wyszukiwania na niektórych urządzeniach, np. telewizorach z systemem webOS." + "LimitSegmentLengthHelp": "Włączenie tej opcji może pomóc zapobiec zawieszaniu się odtwarzacza HLS podczas wyszukiwania na niektórych urządzeniach, np. telewizorach z systemem webOS.", + "HeaderUpdateRequired": "Wymagana aktualizacja", + "HeaderServerUnavailable": "Serwer niedostępny", + "ViewSettings": "Zobacz ustawienia", + "MessageForgotPasswordPinReset": "Wpisz tutaj kod PIN, aby zakończyć resetowanie hasła", + "DownloadManager": "Pobrane", + "BackupsPageLoadError": "Nie udało się wczytać strony kopii zapasowych", + "ButtonCreateBackup": "Utwórz kopię zapasową", + "MessageWaitingForServer": "Oczekiwanie na serwer...", + "LabelBackupsUnavailable": "Brak dostępnych kopii zapasowych", + "LabelProgramData": "Dane programu", + "StorageType.CDRom": "CD-ROM", + "StorageType.NoRootDirectory": "Brak katalogu głównego", + "HeaderBackups": "Kopie zapasowe", + "MessageBackupInProgress": "Tworzenie kopii zapasowej w toku", + "MessageBackupDisclaimer": "W zależności od rozmiaru biblioteki proces tworzenia kopii zapasowej może potrwać pewien czas.", + "MessageRestoreSuccess": "Przywracanie zakończone pomyślnie", + "Create": "Utwórz", + "LabelDatabase": "Baza danych", + "LabelRestore": "Przywróć", + "MessageRestoreInProgress": "Przywracanie w toku", + "StorageType.Fixed": "Stały", + "StorageType.Network": "Sieć", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Wymienny", + "StorageType.Unknown": "Nieznany", + "Success": "Powodzenie", + "HeaderBackupsHelp": "Twórz i przywracaj migawki swojego serwera, które mogą zawierać bazę danych, metadane, napisy i trickplay.", + "LabelImageCache": "Pamięć podręczna obrazów", + "MessageRestoreDisclaimer": "OSTRZEŻENIE: zamierzasz przywrócić dane z poprzedniej kopii zapasowej. Twój serwer będzie bezużyteczny przez cały czas trwania procesu, a wszelkie nowe dane utworzone od czasu utworzenia kopii zapasowej zostaną utracone.", + "ConfirmDeleteRepository": "Usunąć repozytorium?", + "RepositoriesPageLoadError": "Nie udało się załadować repozytoriów", + "PluginsLoadError": "Wystąpił błąd podczas ładowania wtyczek.", + "ButtonLearnMore": "Dowiedz się więcej", + "TranscodingLoadError": "Nie udało się załadować ustawień transkodowania", + "DeleteRepositoryConfirmation": "Czy na pewno chcesz usunąć to repozytorium?", + "LiveTVPageLoadError": "Nie udało się załadować strony z nagraniami", + "HeaderServerMismatch": "Niezgodność serwera", + "MessageServerMismatch": "Serwer, z którym się łączysz, nie jest tym samym serwerem, z którym łączyłeś się wcześniej pod tym adresem. Jeśli jest to oczekiwane, wybierz „Połącz się mimo wszystko”. W przeciwnym razie Twoje połączenie lub serwer mogą być zagrożone.", + "ConnectAnyway": "Połącz się mimo wszystko" } diff --git a/src/strings/pr.json b/src/strings/pr.json index 8547d5635..f0019627d 100644 --- a/src/strings/pr.json +++ b/src/strings/pr.json @@ -101,5 +101,7 @@ "AllComplexFormats": "All Fancy Codecs (ARR, SSA, BootySub, Pirate GoldS, Swabby, Charts, …)", "AllowFfmpegThrottling": "Rein in Code Scurvy", "Channels": "Channels", - "AllowCollectionManagement": "Permit this scallywag to handle treasures" + "AllowCollectionManagement": "Permit this scallywag to handle treasures", + "Absolute": "Abs'lute", + "AgeValue": "({0} summers gone by)" } diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index 88f683915..e60e09c7b 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -72,7 +72,7 @@ "ButtonParentalControl": "Controle dos pais", "ButtonPause": "Pausar", "ButtonPreviousTrack": "Faixa anterior", - "ButtonQuickStartGuide": "Guia Rápido", + "ButtonQuickStartGuide": "Guia de configuração", "ButtonRefreshGuideData": "Atualizar Dados do Guia", "ButtonRemove": "Remover", "ButtonRename": "Renomear", @@ -104,7 +104,7 @@ "ColorTransfer": "Transferência de cor", "CommunityRating": "Avaliação da comunidade", "Composer": "Compositor", - "ConfigureDateAdded": "Configure como os metadados são determinados para 'Data adicionada' em \"Painel > Bibliotecas > Configurações de NFO\"", + "ConfigureDateAdded": "Configure como os metadados são determinados para 'Data adicionada' em \"Painel > Bibliotecas > Exibição\"", "ConfirmDeleteImage": "Excluir imagem?", "ConfirmDeleteItem": "Ao excluir este item, você o excluirá do sistema de arquivos e também da biblioteca de mídias. Deseja realmente continuar?", "ConfirmDeleteItems": "Ao excluir estes itens, você os excluirá do sistema de arquivos e de sua biblioteca de mídias. Deseja realmente continuar?", @@ -546,7 +546,7 @@ "LabelLineup": "Programação", "LabelLocalHttpServerPortNumber": "Número da porta local de HTTP", "LabelLocalHttpServerPortNumberHelp": "O número da porta TCP para o servidor HTTP.", - "LabelLockItemToPreventChanges": "Bloquear este item para evitar alterações futuras", + "LabelLockItemToPreventChanges": "Bloqueie este item para evitar alterações futuras de metadados", "LabelLoginDisclaimer": "Aviso legal no login", "LabelLoginDisclaimerHelp": "Um aviso será exibido na parte inferior da página de login.", "LabelManufacturer": "Fabricante", @@ -1066,7 +1066,7 @@ "ThemeSongs": "Músicas-tema", "ThemeVideos": "Vídeos-tema", "TheseSettingsAffectSubtitlesOnThisDevice": "Estas configurações afetam as legendas neste dispositivo", - "ThisWizardWillGuideYou": "Este assistente irá guiá-lo pelo processo de instalação. Para começar, por favor selecione seu idioma preferido.", + "ThisWizardWillGuideYou": "Este assistente irá guiá-lo pelo processo de instalação. Para começar, por favor digite o nome do servidor e selecione seu idioma preferido.", "Thumb": "Miniatura", "Thursday": "Quinta-feira", "TitleHardwareAcceleration": "Aceleração de Hardware", @@ -1194,7 +1194,7 @@ "TabCodecs": "Codecs", "TabContainers": "Formatos", "TabLogs": "Registros", - "TabNetworking": "Rede", + "TabNetworking": "Redes", "TabPlugins": "Plugins", "TabStreaming": "Transmissão", "Tags": "Etiquetas", @@ -1404,7 +1404,7 @@ "OptionMaxActiveSessionsHelp": "O valor 0 desativa esta funcão.", "LabelMaxMuxingQueueSizeHelp": "Número máximo de pacotes que podem ser armazenados em buffer enquanto aguardam a inicialização de todos os stream's. Tente aumentá-lo se você ainda encontrar o erro \"Muitos pacotes armazenados em buffer para stream\" nos logs do FFmpeg. O valor recomendado é 2048.", "LabelMaxMuxingQueueSize": "Tamanho máximo da fila de \"muxing\"", - "LabelTonemappingParamHelp": "Sintonize o algoritmo de tonemapping. Os valores padrões e recomendados são NaN. Geralmente, deixe em branco.", + "LabelTonemappingParamHelp": "Ajuste o algoritmo de mapeamento de tom. Geralmente, deixe-o em branco.", "LabelTonemappingParam": "Parâmetros de mapeamento de tom", "LabelTonemappingPeakHelp": "Substitui o valor de metadados incorporado para o sinal de entrada por este valor de pico. O valor predefinido é 100 (1000nit).", "LabelTonemappingPeak": "Pico do Mapeamento de tom", @@ -1475,7 +1475,7 @@ "RemuxHelp2": "Remux usa muito pouco processamento com uma qualidade de mídia completamente sem perdas.", "RemuxHelp1": "A mídia está em um contêiner de arquivo incompatível (MKV, AVI, WMV, etc.), mas tanto o fluxo de vídeo quanto o de áudio são compatíveis com o dispositivo. A mídia será reembalada sem perdas em tempo real antes de ser enviada para o dispositivo.", "Remuxing": "Remuxar", - "AspectRatioCover": "Capa", + "AspectRatioCover": "Ampliar", "EnableFallbackFontHelp": "Habilite fontes alternativas personalizadas. Isso pode evitar o problema de renderização incorreta das legendas.", "EnableFallbackFont": "Ativar fontes alternativas", "LabelFallbackFontPathHelp": "Estas fontes são utilizadas em alguns clientes para mostrar legendas. Por favor, consulte a documentação para mais informações.", @@ -1507,7 +1507,7 @@ "EnablePlugin": "Habilitar", "DirectPlayHelp": "O arquivo de origem é totalmente compatível com este cliente e a sessão está recebendo o arquivo sem modificações.", "YoutubeBadRequest": "Requisição ruim.", - "AspectRatioFill": "Preencher", + "AspectRatioFill": "Esticar", "LabelHDHomerunPortRange": "Intervalo de portas HDHomerun", "HeaderContinueReading": "Continue Lendo", "UseEpisodeImagesInNextUp": "Utilizar imagens dos episódios nas seções 'Veja a Seguir' e 'Continue Assistindo'", @@ -1590,7 +1590,7 @@ "TypeOptionPluralMusicAlbum": "Álbuns de música", "TypeOptionPluralMovie": "Filmes", "TypeOptionPluralEpisode": "Episódios", - "TypeOptionPluralBoxSet": "Boxes Coleção", + "TypeOptionPluralBoxSet": "Box Coleções", "TypeOptionPluralBook": "Livros", "TypeOptionPluralAudio": "Áudios", "Print": "Imprimir", @@ -1652,7 +1652,7 @@ "AllowEmbeddedSubtitles": "Desabilitar diferentes tipos de legendas embutidas", "Bold": "Negrito", "LabelTextWeight": "Intensidade do texto", - "EnableSplashScreen": "Ativar tela de abertura", + "EnableSplashScreen": "Ativar imagem na tela de abertura", "ScreenResolution": "Resolução de tela", "RememberAudioSelectionsHelp": "Tentar definir a faixa de áudio com a correspondência mais próxima do último vídeo.", "RememberAudioSelections": "Definir faixa de áudio baseado no item anterior", @@ -1723,12 +1723,12 @@ "UserMenu": "Menu do Usuário", "HeaderPerformance": "Rendimento", "EnableAudioNormalizationHelp": "A normalização de áudio vai adicionar um ganho constante para manter a média no nível desejado (-18db).", - "LabelDummyChapterDurationHelp": "Intervalo entre os capítulos forçados. Ajuste com 0 para desabilitar a geração de capítulos forçados. A mudança não terá efeito nos capítulos forçados existentes.", + "LabelDummyChapterDurationHelp": "Intervalo entre os capítulos forçados em segundos. Ajuste com 0 para desabilitar a geração de capítulos forçados. A mudança não terá efeito nos capítulos forçados existentes.", "LabelParallelImageEncodingLimit": "Limite de codificação em paralelo de imagens", "HeaderDummyChapter": "Imagem dos capítulos", "LabelEnableLUFSScan": "Habilitar procura LUFS", "LabelEnableLUFSScanHelp": "Tocadores podem normalizar a reprodução de áudio (LUFS) para obter igual volume em todas as faixas. Isto fará com que o escaneamento das bibliotecas demore mais e utilize mais recursos.", - "LabelParallelImageEncodingLimitHelp": "Número máximo de codificação de imagens que são permitidas executar em paralelo. Ajustar com 0 irá escolher um limite baseado na quantidade de núcleos.", + "LabelParallelImageEncodingLimitHelp": "Número máximo de codificação de imagens que são permitido executar em paralelo. Deixar isso vazio irá escolher um limite baseado na quantidade de núcleos.", "PreferEmbeddedExtrasTitlesOverFileNames": "Prefere os títulos inclusos ao nome dos arquivos para os extras", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Os extras geralmente têm o mesmo nome incorporado do título principal, verifique isso para usar títulos incorporados para eles de qualquer maneira.", "TonemappingModeHelp": "Selecione o modo de mapeamento de tom. Se você experimentar realces estourados, tente mudar para o modo RGB.", @@ -1857,7 +1857,7 @@ "LabelScanBehaviorHelp": "O comportamento padrão é não bloqueadora, o que adicionará mídia à biblioteca antes que a geração do trickplay seja feita. Bloquear garantirá que os arquivos trickplay sejam gerados antes que a mídia seja adicionada à biblioteca, mas tornará os escaneamentos significativamente mais longos.", "LabelTrickplayThreadsHelp": "O número de threads a ser passado para o argumento '-threads' do ffmpeg.", "LabelTrickplayThreads": "Tarefas de processamento FFmpeg", - "Trickplay": "Trickplay", + "Trickplay": "Pré-visualizações de vídeo", "Author": "Autor", "Colorist": "Colorista", "CoverArtist": "Artista de capa", @@ -1880,7 +1880,7 @@ "SelectPreferredTranscodeVideoAudioCodecHelp": "Selecione o codec de áudio preferido para o qual transcodificar o conteúdo de vídeo. Se o codec preferido não for compatível, o servidor usará o próximo melhor codec disponível.", "SaveLyricsIntoMediaFolders": "Salvar letras de música nas pastas de mídia", "SaveLyricsIntoMediaFoldersHelp": "Armazenar as letras de músicas ao lado dos arquivos de áudio permite que eles sejam gerenciadas com mais facilidade.", - "LibraryScanFanoutConcurrencyHelp": "Número máximo de tarefas paralelas durante o escaneamento da biblioteca. Definir o valor como 0 irá escolher um limite com base na quantidade de núcleos do seu sistema. AVISO: Definir esse número muito alto pode causar problemas com sistema de arquivos em rede; se você encontrar problemas, reduza esse número.", + "LibraryScanFanoutConcurrencyHelp": "Número máximo de tarefas paralelas durante o escaneamento da biblioteca. Definir deixar isso vazio irá escolher um limite com base na quantidade de núcleos do seu sistema. AVISO: Definir esse número muito alto pode causar problemas com sistema de arquivos em rede; se você encontrar problemas, reduza esse número.", "PlaylistError.CreateFailed": "Erro ao criar lista de reprodução", "PlaylistPublic": "Permitir acesso público", "PlaylistPublicDescription": "Permitir que essa lista de reprodução seja visualizada por qualquer usuário conectado.", @@ -1988,5 +1988,73 @@ "LabelMediaSegmentProviders": "Provedores de segmento de mídia", "HeaderNextEpisode": "Próximo episódio", "HeaderNextVideo": "Próximo vídeo", - "MediaSegmentProvidersHelp": "Habilite e classifique seus provedores de segmentos de mídia preferidos em ordem de prioridade." + "MediaSegmentProvidersHelp": "Habilite e classifique seus provedores de segmentos de mídia preferidos em ordem de prioridade.", + "CustomSubtitleStylingHelp": "A personalização das legendas funcionará na maioria dos dispositivos, mas pode acarretar um custo adicional de desempenho.", + "CustomSplashScreenSize": "Imagens personalizadas devem ter uma proporção de 16x9 com um tamanho mínimo de 1920x1080.", + "DeleteCustomImage": "Excluir Imagem Personalizada", + "CopyLogSuccess": "Conteúdo do log copiado com sucesso.", + "AutoSubtitleStylingHelp": "Este modo alternará automaticamente entre os mecanismos de estilo de legenda nativo e personalizado com base no tipo do seu dispositivo.", + "Custom": "Personalizado", + "DeleteServerConfirmation": "Você tem certeza que deseja excluir este servidor?", + "HeaderPageNotFound": "Página indisponível", + "LabelDevice": "Dispositivo", + "HeaderServerUnavailable": "Servidor indisponível", + "LabelGroupShowsIntoCollections": "Agrupar shows em coleções", + "LabelGroupShowsIntoCollectionsHelp": "Shows em uma coleção vão ser exibidos como um item agrupado nas listagens de shows.", + "LibraryNameInvalid": "O nome da biblioteca não pode ficar em branco.", + "LimitSegmentLength": "Use segmentos HLS menores", + "LimitSegmentLengthHelp": "Habilitar essa opção pode ajudar a prevenir o reprodutor de mídia HLS de travar a reprodução durante o avanço rápido em alguns dispositivos, como as TVs com webOS.", + "ReadInputAtNativeFramerateHelp": "Habilitando essa opção pode resolver alguns problemas, ex.: transmissões ao vivo parando prematuramente.", + "MetadataNfoLoadError": "Falha ao carregar as configurações de metadados NFO", + "SettingsPageLoadError": "Falha ao carregar a pagina de configurações", + "ReadInputAtNativeFramerate": "Ler a entrada na frequência de quadros nativa", + "ViewSettings": "Ver as configurações", + "ImageUploadCancelled": "Upload de imagem cancelado", + "ImageUploadFailed": "Upload de imagem falhou", + "LogLoadFailure": "Falha ao carregar o arquivo de registros. Pode estar ainda sendo gravado.", + "UploadCustomImage": "Enviar imagem personalizada", + "RetryWithGlobalSearch": "Retentar com a pesquisa global", + "PageNotFound": "Essa não é a pagina que você está procurando.", + "Retry": "Retentar", + "DownloadManager": "Downloads", + "ImageDeleteFailed": "Falha ao deletar a imagem", + "DisplayLoadError": "Um erro ocorreu durante o carregamento dos dados de configuração de tela.", + "LabelSubtitleStyling": "Estilização da legenda", + "NativeSubtitleStylingHelp": "A estilização das legendas podem não funcionar em alguns dispositivos. Mas ela não causa nenhuma perda de desempenho.", + "LastActive": "Ultima vez ativo", + "HeaderUpdateRequired": "Atualização requerida", + "MetadataImagesLoadError": "Falha ao carregar as configurações de metadados", + "MessageForgotPasswordPinReset": "Digite o PIN aqui para finalizar a redefinição da senha", + "Native": "Nativo", + "StreamCountExceedsLimit": "O número de reproduções excede o limite", + "Create": "Criar", + "BackupsPageLoadError": "Falha ao carregar a página de backups", + "ButtonCreateBackup": "Criar backup", + "ConfirmDeleteRepository": "Excluir repositório?", + "DeleteRepositoryConfirmation": "Tem certeza de que deseja excluir este repositório?", + "ButtonLearnMore": "Saiba Mais", + "HeaderBackupsHelp": "Crie e recupere cópias de segurança do seu servidor, incluindo banco de dados, legendas, informações dos arquivos e pré-visualizações de vídeo.", + "LabelBackupsUnavailable": "Nenhum backup disponível", + "MessageRestoreDisclaimer": "AVISO: Você está prestes a restaurar a partir de um backup anterior. Seu servidor ficará inutilizável durante o processo e todos os dados novos criados desde o backup serão perdidos.", + "StorageType.CDRom": "CD-ROM", + "StorageType.NoRootDirectory": "Sem diretório raiz", + "TranscodingLoadError": "Falha ao carregar as configurações de transcodificação", + "PluginsLoadError": "Ocorreu um erro ao carregar os plugins.", + "MessageBackupDisclaimer": "Dependendo do tamanho da sua biblioteca, o processo de backup pode demorar um pouco.", + "MessageBackupInProgress": "Backup em andamento", + "LabelDatabase": "Banco de dados", + "MessageRestoreInProgress": "Restauração em andamento", + "MessageRestoreSuccess": "Restauração concluída com sucesso", + "MessageWaitingForServer": "Aguardando o servidor...", + "RepositoriesPageLoadError": "Falha ao carregar repositórios", + "StorageType.Fixed": "Corrigido", + "StorageType.Network": "Rede", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Removível", + "StorageType.Unknown": "Desconhecido", + "Success": "Sucesso", + "LabelProgramData": "Arquivos de programa", + "LabelRestore": "Restaurar", + "HeaderBackups": "Backups", + "LabelImageCache": "Arquivos de imagem temporários" } diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index d76b0441b..a2ffeb8e8 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -1,7 +1,7 @@ { "Actor": "Ator", "Add": "Adicionar", - "AddToPlaylist": "Adicionar à lista de reprodução", + "AddToPlaylist": "Adicionar à playlist", "AdditionalNotificationServices": "Explore o catálogo de extensões para instalar serviços de notificação adicionais.", "All": "Todos", "Audio": "Áudio", @@ -27,7 +27,7 @@ "ButtonOpen": "Abrir", "ButtonPause": "Pausar", "ButtonPreviousTrack": "Faixa anterior", - "ButtonQuickStartGuide": "Guia de Início Rápido", + "ButtonQuickStartGuide": "Guia de instalação", "ButtonRefreshGuideData": "Atualizar Guia TV", "ButtonRemove": "Remover", "ButtonResetEasyPassword": "Redefinir código Easy PIN", @@ -223,10 +223,10 @@ "LabelBlastMessageIntervalHelp": "Determina a duração em segundos entre as mensagens de exploração enviadas pelo servidor.", "LabelBlockContentWithTags": "Bloquear itens com etiquetas", "LabelCachePath": "Localização da cache", - "LabelCachePathHelp": "Defina uma localização para os ficheiros de cache como, por exemplo, imagens. Deixe em branco para utilizar o padrão do servidor.", + "LabelCachePathHelp": "Especifica um local personalizado para os ficheiros de cache do servidor, como imagens. Deixa em branco para utilizar o local predefinido do servidor.", "LabelCancelled": "Cancelado", "LabelCollection": "Coleção", - "LabelCommunityRating": "Avaliação da comunidade", + "LabelCommunityRating": "Classificação da comunidade", "LabelContentType": "Tipo de conteúdo", "LabelCountry": "País/Região", "LabelCriticRating": "Avaliação dos críticos", @@ -235,7 +235,7 @@ "LabelCustomCertificatePathHelp": "Localização do ficheiro PKCS #12 que contém um certificado e uma chave privada para ativar o suporte TLS num domínio personalizado.", "LabelCustomCss": "Código CSS personalizado", "LabelCustomCssHelp": "Aplica o teu código CSS personalizado à interface web.", - "LabelCustomDeviceDisplayNameHelp": "Forneça um nome a ser mostrado, ou deixe em branco para utilizar o nome reportado pelo dispositivo.", + "LabelCustomDeviceDisplayNameHelp": "Fornece um nome de exibição personalizado ou deixa em branco para usar o nome fornecido pelo dispositivo.", "LabelCustomRating": "Classificação personalizada", "LabelDateAdded": "Adicionado em", "LabelDateAddedBehavior": "Comportamento da data de adição para conteúdo novo", @@ -300,8 +300,8 @@ "LabelKodiMetadataDateFormatHelp": "Todas as datas presentes em ficheiros NFO serão analisadas utilizando este formato.", "LabelKodiMetadataEnableExtraThumbs": "Copiar o parâmetro 'extrafanart'para 'extrathumbs'", "LabelKodiMetadataEnableExtraThumbsHelp": "Ao transferir imagens, estas podem ser guardadas como extrafanart e extrathumbs para uma maior compatibilidade com os temas Kodi.", - "LabelKodiMetadataEnablePathSubstitution": "Ativar substituição de localização", - "LabelKodiMetadataEnablePathSubstitutionHelp": "Ativar a substituição da localização das imagens utilizando as opções de substituição da localização do servidor.", + "LabelKodiMetadataEnablePathSubstitution": "Ativar a substituição de caminhos", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Ativa a substituição de caminhos de imagens usando as definições de substituição de caminhos do servidor.", "LabelKodiMetadataSaveImagePaths": "Guardar a localização de imagens em ficheiros NFO", "LabelKodiMetadataSaveImagePathsHelp": "Esta opção é recomendada se existirem nomes de imagens que não estejam de acordo com as recomendações do Kodi.", "LabelLanguage": "Idioma", @@ -355,7 +355,7 @@ "LabelPath": "Local", "LabelPersonRole": "Personagem", "LabelPlaceOfBirth": "Local de nascimento", - "LabelPlayDefaultAudioTrack": "Reproduzir a faixa de áudio padrão independentemente do idioma", + "LabelPlayDefaultAudioTrack": "Reproduzir a faixa de áudio predefinida independentemente do idioma", "LabelPreferredDisplayLanguage": "Idioma de visualização preferido", "LabelProfileAudioCodecs": "Codecs de áudio", "LabelProfileCodecsHelp": "Separados por vírgula. Pode ser deixado em branco para usar com todos os codecs.", @@ -378,7 +378,7 @@ "LabelScheduledTaskLastRan": "Última execução {0}. Tempo de execução {1}.", "LabelSeasonNumber": "Número da temporada", "LabelSelectUsers": "Selecionar utilizadores", - "LabelSelectVersionToInstall": "Selecione a versão para instalar", + "LabelSelectVersionToInstall": "Seleciona a versão a instalar", "LabelSendNotificationToUsers": "Enviar notificação para", "LabelSerialNumber": "Número de série", "LabelServerHost": "Servidor", @@ -393,14 +393,14 @@ "LabelStartWhenPossible": "Começar, quando possível", "LabelStatus": "Estado", "LabelStopWhenPossible": "Parar, quando possível", - "LabelStopping": "A Parar", + "LabelStopping": "A parar", "LabelSubtitleFormatHelp": "Exemplo: srt", "LabelSubtitlePlaybackMode": "Modo de legendas", "LabelSupportedMediaTypes": "Tipos de Conteúdos Suportados", "LabelTagline": "Slogan", "LabelTime": "Tempo", "LabelTimeLimitHours": "Limite de tempo (horas)", - "LabelTranscodingTempPathHelp": "Indique uma localização personalizada para os ficheiros de transcodificação em utilização, ou deixe em branco para utilizar o caminho padrão.", + "LabelTranscodingTempPathHelp": "Especifica um caminho personalizado para os ficheiros transcodificados enviados aos clientes, ou deixa em branco para utilizar o caminho predefinido do servidor.", "LabelTranscodingThreadCount": "Número de processos de transcodificação", "LabelTranscodingThreadCountHelp": "Seleciona o número máximo de processos a utilizar durante a transcodificação. Reduzir o número de processos diminuirá a utilização do CPU, mas pode não converter com rapidez suficiente para uma experiência de reprodução suave.", "LabelTriggerType": "Tipo de acionador", @@ -461,20 +461,20 @@ "OptionAllowContentDownloading": "Permitir transferência e sincronização de conteúdo", "OptionAllowLinkSharing": "Permitir partilha nas redes sociais", "OptionAllowManageLiveTv": "Permitir gestão de gravações de TV em Direto", - "OptionAllowMediaPlayback": "Permitir reprodução de média", + "OptionAllowMediaPlayback": "Permitir reprodução de multimédia", "OptionAllowMediaPlaybackTranscodingHelp": "Restringir o acesso à transcodificação pode causar falhas de reprodução nos clientes Jellyfin devido a formatos multimédia não suportados.", "OptionAllowRemoteControlOthers": "Permitir controlo remoto de outros utilizadores", "OptionAllowRemoteSharedDevices": "Permitir controlo remoto de dispositivos compartilhados", "OptionAllowRemoteSharedDevicesHelp": "Dispositivos DLNA são considerados como partilhados até que um utilizador comece a controlá-lo.", "OptionAllowUserToManageServer": "Permitir a este utilizador gerir o servidor", "OptionAllowVideoPlaybackTranscoding": "Permitir reprodução de vídeo que necessite de transcodificação", - "OptionCommunityRating": "Classificação da Comunidade", + "OptionCommunityRating": "Classificação da comunidade", "OptionCriticRating": "Classificação da crítica", "OptionCustomUsers": "Personalizado", "OptionDaily": "Diariamente", "OptionDateAdded": "Data de adição", - "OptionDateAddedFileTime": "Usar a data de criação do ficheiro", - "OptionDateAddedImportTime": "Usar a data de importação para a biblioteca", + "OptionDateAddedFileTime": "Utilizar a data de criação do ficheiro", + "OptionDateAddedImportTime": "Utilizar a data de adição à biblioteca", "OptionDatePlayed": "Data de reprodução", "OptionDisableUser": "Desativar este utilizador", "OptionDisableUserHelp": "O servidor não permitirá nenhuma ligação feita por este utilizador. Ligações existentes serão abruptamente paradas.", @@ -585,7 +585,7 @@ "TabServer": "Servidor", "TabUpcoming": "Próximos", "TellUsAboutYourself": "Fale-nos sobre si", - "ThisWizardWillGuideYou": "Este assistente irá ajudá-lo durante o processo de configuração. Para começar, selecione o idioma.", + "ThisWizardWillGuideYou": "Este assistente irá ajudar-te durante o processo de configuração. Para começar, introduz o nome do servidor e seleciona o teu idioma.", "Thursday": "Quinta", "TitlePlayback": "Reprodução", "TrackCount": "{0} faixas", @@ -646,7 +646,7 @@ "HeaderAlbumArtists": "Artistas do álbum", "Movies": "Filmes", "Photos": "Fotografias", - "Playlists": "Listas de Reprodução", + "Playlists": "Playlists", "Shows": "Séries", "Songs": "Músicas", "Sync": "Sincronização", @@ -656,7 +656,7 @@ "ConfirmEndPlayerSession": "Deseja encerrar o servidor Jellyfin em {0}?", "ConfirmDeleteImage": "Eliminar a imagem?", "ConfigureDateAdded": "Configura a forma como é atribuída a data de adição, no Painel de controlo > Bibliotecas > Visualização", - "CommunityRating": "Avaliação da comunidade", + "CommunityRating": "Classificação da comunidade", "ChannelNumber": "Número do canal", "ChannelNameOnly": "Apenas canal {0}", "ChangingMetadataImageSettingsNewContent": "As alterações às definições de transferência de metadados ou de imagens só se aplicam a novos conteúdos adicionados à tua biblioteca. Para aplicar as alterações aos títulos existentes, terás de atualizar os metadados manualmente.", @@ -677,7 +677,7 @@ "BookLibraryHelp": "São suportados audiolivros e ebooks. Consulta o {0} guia de nomenclatura de livros {1}.", "BirthLocation": "Local de nascimento", "AsManyAsPossible": "Tantos quanto possível", - "Art": "Clearart", + "Art": "ClearArt (imagem transparente)", "Anytime": "Qualquer altura", "Aired": "Estreou a", "HeaderKeepRecording": "Continuar a gravar", @@ -701,7 +701,7 @@ "HeaderAudioBooks": "Áudiolivro", "HeaderAllowMediaDeletionFrom": "Permitir remoção de multimídia a partir de", "HeaderAlert": "Alerta", - "HeaderAddToPlaylist": "Adicionar à lista de reprodução", + "HeaderAddToPlaylist": "Adicionar à playlist", "HDPrograms": "Programas em Alta-Definição", "EncoderPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho, ou um valor mais lento para melhorar a qualidade.", "Guide": "Programação", @@ -713,7 +713,7 @@ "FormatValue": "Formato: {0}", "Filters": "Filtros", "File": "Ficheiro", - "Favorite": "Favoritos", + "Favorite": "Favorito", "FFmpegSavePathNotFound": "Não conseguimos encontrar o FFmpeg na localização que introduziste. O FFprobe também é necessário e deve estar na mesma pasta. Estes componentes são, por norma, instalados em conjunto. Por favor, verifica a localização e tenta novamente.", "Extras": "Extras", "ExtraLarge": "Extra grande", @@ -727,11 +727,11 @@ "EndsAtValue": "Termina às {0}", "EnablePhotosHelp": "Imagens serão detectadas e exibidas em conjunto com outros ficheiros multimédia.", "EnablePhotos": "Mostrar fotografias", - "EnableNextVideoInfoOverlayHelp": "No final de um vídeo, mostrar informação sobre o próximo vídeo da lista de reprodução.", + "EnableNextVideoInfoOverlayHelp": "No final de um vídeo, mostrar informações sobre o próximo vídeo da playlist atual.", "EnableNextVideoInfoOverlay": "Mostrar informação sobre o próximo vídeo durante a reprodução", "EnableHardwareEncoding": "Ativar codificação por hardware", - "EnableExternalVideoPlayersHelp": "O menu de um reprodutor externo será mostrado no início da reprodução de vídeo.", - "EnableExternalVideoPlayers": "Reprodutores de vídeo externos", + "EnableExternalVideoPlayersHelp": "O menu do leitor externo surgirá ao iniciar a reprodução de vídeo.", + "EnableExternalVideoPlayers": "Leitores de vídeo externos", "EnableDisplayMirroring": "Duplicação de ecrã", "EnableColorCodedBackgrounds": "User fundos marcados por cores", "EditSubtitles": "Editar legendas", @@ -750,9 +750,9 @@ "DirectStreaming": "Transmissão direta", "DirectStreamHelp2": "A energia consumida pela transmissão direta depende normalmente do perfil de áudio. Apenas a transmissão do vídeo é feita sem perdas.", "DefaultSubtitlesHelp": "As legendas são carregadas com base nas definições predefinidas e forçadas para os metadados incorporados. As preferências de idioma são consideradas quando existem múltiplas opções disponíveis.", - "DefaultMetadataLangaugeDescription": "Estes são os valores-padrão que podem ser personalizados para cada uma das bibliotecas.", + "DefaultMetadataLangaugeDescription": "Estes são os valores-predefinidos que podem ser personalizados para cada uma das bibliotecas.", "ErrorDefault": "Ocorreu um erro ao processar o pedido. Por favor, tente novamente mais tarde.", - "Default": "Padrão", + "Default": "Predefinição", "DeathDateValue": "Faleceu: {0}", "DatePlayed": "Reproduzido a", "DateAdded": "Adicionado a", @@ -783,7 +783,7 @@ "LabelBurnSubtitles": "Integrar legendas", "LabelBirthYear": "Ano de nascimento", "LabelBirthDate": "Data de nascimento", - "LabelBindToLocalNetworkAddressHelp": "Substituir o endereço IP local do servidor HTTP. Se deixado em branco, o servidor irá vincular-se a todos os endereços disponíveis. A alteração deste valor requer uma reinicialização.", + "LabelBindToLocalNetworkAddressHelp": "Substitui o endereço IP local do servidor HTTP. Se for deixado em branco, o servidor será associado a todos os endereços disponíveis. Alterar este valor requer o reinício do servidor.", "LabelBindToLocalNetworkAddress": "Vincular ao endereço de rede local", "LabelAutomaticallyRefreshInternetMetadataEvery": "Atualizar metadados automaticamente a partir da Internet", "LabelAuthProvider": "Fornecedor de autenticação", @@ -826,7 +826,7 @@ "Runtime": "Tempo de execução", "ResumeAt": "Retomar desde {0}", "ReplaceAllMetadata": "Substituir todos os metadados", - "RepeatOne": "Repetir este", + "RepeatOne": "Repetir uma vez", "RepeatMode": "Modo de repetição", "ServerRestartNeededAfterPluginInstall": "O Jellyfin terá que reiniciar após instalar a extensão.", "MessageNoPluginConfiguration": "Esta extensão não tem definições que possas alterar.", @@ -834,14 +834,14 @@ "MessagePluginConfigurationRequiresLocalAccess": "Para configurar esta extensão, inicia sessão localmente no servidor.", "HeaderPluginInstallation": "Instalação de extensão", "MessagePluginInstalled": "A extensão foi instalada com sucesso. O servidor terá que reiniciar para aplicar as alterações.", - "PleaseRestartServerName": "Por favor, reinicie o Jellyfin no {0}.", + "PleaseRestartServerName": "Por favor, reinicia o Jellyfin no {0}.", "PleaseConfirmPluginInstallation": "Por favor clique em OK para confirmar que leu o conteúdo acima, e que deseja prosseguir com a instalação da extensão.", - "PleaseAddAtLeastOneFolder": "Por favor, adicione pelo menos uma pasta a esta Biblioteca, utilizando para isso o botão '+' na secção 'Pastas'.", + "PleaseAddAtLeastOneFolder": "Adiciona pelo menos uma pasta a esta biblioteca, clicando no botão '+' na secção 'Pastas'.", "Played": "Reproduzido", "PlayNext": "Reproduzir a seguir", "PlayFromBeginning": "Reproduzir do início", "PlayCount": "N.º de Reproduções", - "PlaybackData": "Informações de Reprodução", + "PlaybackData": "Informações de reprodução", "PlayAllFromHere": "Reproduzir todos a partir daqui", "PerfectMatch": "Correspondência perfeita", "People": "Pessoas", @@ -858,12 +858,12 @@ "HeaderStartNow": "Iniciar", "HeaderOnNow": "No ar", "Unplayed": "Por reproduzir", - "RemoveFromPlaylist": "Remover da lista de reprodução", + "RemoveFromPlaylist": "Remover da playlist", "LabelUserRemoteClientBitrateLimitHelp": "Esta opção substituirá o valor predefinido do servidor, definido no Painel de Controlo > Reprodução > Transmissão.", "MarkUnplayed": "Marcar como não visto", "MarkPlayed": "Marcar como visto", "LabelSelectFolderGroupsHelp": "Pastas não selecionadas serão apresentadas sozinhas, na sua própria vista.", - "LabelPlaylist": "Lista de reprodução", + "LabelPlaylist": "Playlist", "HeaderPlayOn": "Reproduzir em", "HeaderNextVideoPlayingInValue": "O próximo vídeo começa dentro de {0}", "HeaderNextEpisodePlayingInValue": "O próximo episódio começa dentro de {0}", @@ -888,7 +888,7 @@ "Raised": "Alto relevo", "Depressed": "Baixo relevo", "OptionEnableExternalContentInSuggestionsHelp": "Permitir que trailers da Internet e programas de TV em Direto sejam incluídos no conteúdo sugerido.", - "H264CrfHelp": "O parâmetro \"Constant Rate Factor\" (CRF) é o que define o nível de qualidade padrão para os codificadores de software x264 e x265. Os valores aceites são entre 0 e 51, em que valores mais baixos resultam numa melhor qualidade (a custo de ficheiros de maior dimensão). Os valores considerados aceitáveis estão entre 18 e 28. O valor padrão para o x264 é 23 e para o x265 é 28, podendo ser considerado um ponto de partida para ajustes. Os codificadores de hardware não utilizam estas definições.", + "H264CrfHelp": "O parâmetro \"Constant Rate Factor\" (CRF) define o nível de qualidade predefinido para os codificadores de software x264 e x265. Os valores possíveis vão de 0 a 51, sendo que valores mais baixos produzem melhor qualidade — à custa de ficheiros maiores. Os valores mais comuns situam-se entre 18 e 28. O valor predefinido para o x264 é 23, e para o x265 é 28, podendo servir como ponto de partida para afinares a qualidade conforme necessário. Codificadores por hardware não utilizam esta definição.", "TabStreaming": "Transmissão", "SimultaneousConnectionLimitHelp": "O número máximo de transmissões simultâneas permitidas. Introduz 0 para não haver limite.", "LabelSimultaneousConnectionLimit": "Limite de transmissões simultâneas", @@ -926,7 +926,7 @@ "LabelBaseUrlHelp": "Acrescenta um sub-diretório personalizado ao URL do servidor. Por exemplo: http://exemplo.com/<baseurl>", "LabelMoviePrefixHelp": "Se aplicares um prefixo aos títulos dos filmes, introduz aqui para que o servidor o possa tratar corretamente.", "LabelPleaseRestart": "As alterações produzirão efeito depois de recarregar a página.", - "LabelRecordingPathHelp": "Especifica a localização predefinida para guardar as gravações. Se for deixada em branco, será utilizada a pasta de dados do programa do servidor.", + "LabelRecordingPathHelp": "Especifica o caminho predefinido para guardar gravações. Se for deixado em branco, será utilizada a pasta de dados do programa do servidor.", "ColorTransfer": "Transferência de cores", "ExtractChapterImagesHelp": "Extrair imagens dos capítulos permite aos clientes apresentar menus de seleção de cenas com gráficos. O processo poderá ser lento e exigente em recursos, bem como ocupar múltiplos gigabytes em disco. Este processo é executado quando novos vídeos são encontrados e também através de uma tarefa agendada noturna. É possível configurar a hora de execução para que, idealmente, não coincida com horas de maior utilização.", "Features": "Funcionalidades", @@ -935,7 +935,7 @@ "HeaderSortBy": "Ordenar por", "LabelOptionalNetworkPathHelp": "Caso a pasta esteja partilhada, fornecer o caminho de rede pode permitir aos clientes aceder diretamente aos ficheiros multimédia. Por exemplo, {0} ou {1}.", "LabelPersonRoleHelp": "Exemplo: motorista da carrinha de gelados", - "LabelPlayer": "Reprodutor", + "LabelPlayer": "Leitor", "LabelServerName": "Nome do servidor", "LabelSize": "Tamanho", "LabelLanNetworks": "Redes locais (LAN)", @@ -968,7 +968,7 @@ "LabelPreferredSubtitleLanguage": "Idioma preferido das legendas", "LabelProfileCodecs": "Codecs", "LabelReasonForTranscoding": "Razão para transcodificação", - "LabelScreensaver": "Proteção de Ecrã", + "LabelScreensaver": "Proteção de ecrã", "LabelSeriesRecordingPath": "Localização para gravação de séries", "ColorPrimaries": "Cores primárias", "MessageInvalidForgotPasswordPin": "Introduziste um código PIN inválido ou expirado. Tenta novamente.", @@ -983,10 +983,10 @@ "Menu": "Menu", "MediaIsBeingConverted": "O conteúdo está a ser convertido para um formato compatível com o dispositivo em que o está a reproduzir.", "MediaInfoTimestamp": "Data e Hora", - "MediaInfoSampleRate": "Taxa de Amostragem", + "MediaInfoSampleRate": "Taxa de amostragem", "MediaInfoResolution": "Resolução", "MediaInfoProfile": "Perfil", - "MediaInfoPixelFormat": "Formato de Píxeis", + "MediaInfoPixelFormat": "Formato dos píxeis", "MediaInfoPath": "Caminho", "MediaInfoLevel": "Nível", "Banner": "Faixa", @@ -1222,7 +1222,7 @@ "NoCreatedLibraries": "Parece que ainda não foi criada nenhuma biblioteca. {0} Deseja criar uma biblioteca agora? {1}", "AskAdminToCreateLibrary": "Peça a um administrador para criar uma biblioteca.", "LabelVideoResolution": "Resolução de vídeo", - "LabelPlayerDimensions": "Dimensões do reprodutor", + "LabelPlayerDimensions": "Dimensões do leitor", "OptionLoginAttemptsBeforeLockoutHelp": "O valor zero significa herdar a definição por defeito de três tentativas para utilizadores comuns e cinco para administradores. Definir este campo como -1 desativa esta funcionalidade.", "OptionDisplayFolderViewHelp": "Mostrar pastas juntamente com outras bibliotecas multimédia. Pode ser útil caso pretenda ter uma vista simples das pastas.", "OptionForceRemoteSourceTranscoding": "Força a transcodificação de fontes multimédia remotas, como a TV em direto", @@ -1266,7 +1266,7 @@ "HeaderRemoteAccessSettings": "Definições de acesso remoto", "HeaderHttpsSettings": "Definições de HTTPS", "HeaderDVR": "Gravador digital", - "ApiKeysCaption": "Lista das chaves de API atualmente ativadas", + "ApiKeysCaption": "Lista das chaves da API atualmente ativas", "Episode": "Episódio", "EnableDetailsBannerHelp": "Mostrar uma imagem no topo da página dos detalhes do item.", "EnableDetailsBanner": "Faixa de detalhes", @@ -1274,7 +1274,7 @@ "EnableDecodingColorDepth10Hevc": "Ativar descodificação de hardware de 10-bits para HEVC", "DeinterlaceMethodHelp": "Seleciona o método de desentrelaçamento a utilizar quando o software transcodifica conteúdo entrelaçado. Caso esteja ativo, o desentrelaçamento através de aceleração por hardware terá prioridade sobre esta opção.", "ClientSettings": "Definições do cliente", - "ButtonTogglePlaylist": "lista de reprodução", + "ButtonTogglePlaylist": "Playlist", "BoxSet": "Coleção", "Artist": "Artista", "AlbumArtist": "Artista do álbum", @@ -1291,7 +1291,7 @@ "StopPlayback": "Parar reprodução", "LabelTonemappingAlgorithm": "Seleciona o algoritmo de mapeamento de tons a utilizar", "EnableTonemapping": "Ativar mapeamento de tons", - "LabelOpenclDeviceHelp": "Este é o dispositivo OpenCL usado para o Tone Mapping. O lado esquerdo do ponto representa o número da plataforma e no lado direito é representado o número do dispositivo na plataforma. O valor padrão é 0.0. É necessário o ficheiro da aplicação FFmpeg que contem o método de aceleração por hardware OpenCL.", + "LabelOpenclDeviceHelp": "Este é o dispositivo OpenCL utilizado para o mapeamento de tons. O número à esquerda do ponto representa a plataforma, e o da direita representa o número do dispositivo nessa plataforma. O valor predefinido é 0.0. É necessário o ficheiro da aplicação FFmpeg que contenha o método de aceleração por hardware via OpenCL.", "LabelOpenclDevice": "Dispositivo OpenCL", "LabelColorPrimaries": "Cor primária", "LabelColorTransfer": "Transferência de cor", @@ -1301,7 +1301,7 @@ "MediaInfoColorTransfer": "Transferência da cor", "MediaInfoColorSpace": "Espaço de cor", "MediaInfoVideoRange": "Gama de vídeo", - "ButtonPlayer": "Reprodutor", + "ButtonPlayer": "Leitor", "ButtonCast": "Transmitir para dispositivo", "EnableBlurHashHelp": "Imagens que ainda estão a ser descarregadas serão substituídas por um marcador de posição.", "EnableBlurHash": "Ativar marcadores de posição desfocados para imagens", @@ -1331,12 +1331,12 @@ "SubtitleDownloadersHelp": "Ativa e ordena os teus fornecedores de legendas preferidos por ordem de prioridade.", "SubtitleAppearanceSettingsDisclaimer": "Estas definições não se aplicam a legendas gráficas mencionadas acima ou a legendas ASS/SSA com estilos próprios incorporados.", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Estas definições também se aplicam à reprodução através do Google Cast iniciada por este dispositivo.", - "SpecialFeatures": "Faixas especiais", + "SpecialFeatures": "Opções especiais", "Filter": "Filtro", "New": "Novo", "ShowMore": "Mostrar mais", "ShowLess": "Mostrar menos", - "SettingsWarning": "Alterar estes valores poderá causar instabilidade ou falhas de ligação. Caso ocorra algum problema recomendamos que volte a alterar para os valores padrão.", + "SettingsWarning": "Alterar estes valores poderá causar instabilidade ou falhas de ligação. Se ocorrer algum problema, recomendamos que os voltes a alterar para os valores predefinidos.", "SelectServer": "Selecionar Servidor", "Season": "Temporada", "SaveChanges": "Guardar alterações", @@ -1361,7 +1361,7 @@ "PosterCard": "Cartaz em forma de cartão", "Poster": "Cartaz", "PlaybackErrorNoCompatibleStream": "Este cliente não é compatível com o formato multimédia e o servidor não envia um formato que seja compatível.", - "PlaybackRate": "Velocidade de Reprodução", + "PlaybackRate": "Velocidade de reprodução", "Photo": "Fotografia", "Person": "Pessoa", "OptionRequirePerfectSubtitleMatchHelp": "Solicitar uma combinação perfeita filtrará as legendas para apenas as que tenham sido testadas e verificadas com seu ficheiro de vídeo. Desmarcar esta opção aumenta a probabilidade de transferência de legendas, aumentando também o número de casos de dessincronia de tempos ou textos incorrectos.", @@ -1370,13 +1370,13 @@ "LabelAlbumArtMaxResHelp": "Resolução máxima da arte do álbum exposta através da propriedade 'upnp:albumArtURI'.", "Other": "Outro", "EnableQuickConnect": "Ativar Ligação Rápida neste servidor", - "EnableAutoCast": "Definir como padrão", + "EnableAutoCast": "Definir como predefinição", "NextTrack": "Ir para o próximo", "MusicVideos": "Videoclipes", "Movie": "Filme", "MessageSyncPlayErrorMedia": "A ativação do SyncPlay falhou! Erro de média.", "MessageSyncPlayErrorMissingSession": "A ativação do SyncPlay falhou! Sessão em falta.", - "MessageSyncPlayErrorNoActivePlayer": "Não foi encontrado nenhum reprodutor ativo. O SyncPlay foi desativado.", + "MessageSyncPlayErrorNoActivePlayer": "Não foi encontrado nenhum leitor ativo. O SyncPlay foi desativado.", "MessageSyncPlayErrorAccessingGroups": "Ocorreu um erro ao aceder à lista de grupos.", "MessageSyncPlayLibraryAccessDenied": "Conteúdo de acesso restrito.", "MessageSyncPlayJoinGroupDenied": "Não é possível aderir ao grupo.", @@ -1402,24 +1402,24 @@ "LabelCurrentStatus": "Estado atual", "KnownProxiesHelp": "Lista separada por virgulas de endereços IP, ou nomes de anfitrião, de proxies usados para ligar ao seu servidor Jellyfin. Sem esta informação os cabeçalhos \"X-Forwarded-For\" não funcionarão correctamente. É necessário reiniciar o servidor para que as alterações façam efeito.", "Image": "Imagem", - "LabelTonemappingParamHelp": "Afine o algoritmo do Tone mapping. Os valores recomendado e padrão são NaN. Geralmente este campo é deixado em branco.", - "LabelTonemappingParam": "Parâmetros do Tone Mapping", + "LabelTonemappingParamHelp": "Ajusta o algoritmo de mapeamento de tons. Exceto em casos específicos, é recomendado deixar este campo em branco.", + "LabelTonemappingParam": "Parâmetros do mapeamento de tons", "LabelTonemappingPeakHelp": "Substitui o valor de metadados incorporado para o sinal de entrada por este valor de pico. O valor predefinido é 100 (1000nit).", - "LabelTonemappingPeak": "Pico do Tone Mapping", + "LabelTonemappingPeak": "Pico do mapeamento de tons", "LabelTonemappingThresholdHelp": "Os parâmetros do algoritmo de Tone Mapping são afinados a cada cena. E é aplicado um limite para detetar se a cena mudou ou não. Caso a distancia entre o brilho médio atual do frame e a média atual de execução excedam o valor do limite, o brilho médio e o pico de brilho da cena serão recalculados. Os valores recomendado e padrão são 0.8 e 0.2, respetivamente.", "LabelTonemappingThreshold": "Limite de mapeamento de tons", "LabelTonemappingDesatHelp": "Aplica a dessaturação aos realces que excedem este nível de brilho. O valor recomendado é 0 (desativar).", "TonemappingRangeHelp": "Seleciona o intervalo de cores de saída. A opção 'Automático' mantém o intervalo de cores de entrada.", "SmallCaps": "Maiúsculas reduzidas", - "LabelTonemappingRange": "Alcance do Tone Mapping", - "TonemappingAlgorithmHelp": "O Tone Mapping pode ser afinado. Se não estiver familiarizado com estas opções, mantenha-as nas opções padrão. O valor recomendado é 'BT.2390'.", + "LabelTonemappingRange": "Intervalo do mapeamento de tons", + "TonemappingAlgorithmHelp": "O mapeamento de tons pode ser afinado. Se não estiveres familiarizado com estas opções, mantém o valor predefinido. O valor recomendado é 'BT.2390'.", "AllowTonemappingHelp": "O mapeamento de tons pode transformar a gama dinâmica de um vídeo de HDR para SDR, mantendo os detalhes e as cores da imagem, que são informações muito importantes para representar a cena original. Atualmente funciona apenas com vídeos HDR10 de 10 bits, HLG e DoVi. Isso requer o tempo de execução GPGPU correspondente.", "LabelMaxMuxingQueueSizeHelp": "Número máximo de pacotes que podem ser armazenados em buffer enquanto espera que todas as transmissões sejam inicializadas. Tenta aumentá-lo se ainda encontrares o erro \"Demasiados pacotes armazenados em buffer para o fluxo de saída\" nos registos do FFmpeg. O valor recomendado é 2048.", "DeleteAll": "Eliminar tudo", "DeleteDevicesConfirmation": "Tens a certeza de que pretendes eliminar todos os dispositivos? Todas as outras sessões serão encerradas. Os dispositivos voltarão a aparecer da próxima vez que um utilizador iniciar sessão.", "Bwdif": "Filtro de Desentrelação Bob Weaver (BWDIF)", "LabelAudioInfo": "Info da Áudio", - "LabelPlaybackInfo": "Info da Reprodução", + "LabelPlaybackInfo": "Informações de reprodução", "RemuxHelp2": "O Remux requer uma potência de processamento muito baixa, mas oferece uma qualidade de multimédia completamente sem perdas.", "RemuxHelp1": "O ficheiro multimédia está num container de ficheiros incompatível (MKV, AVI, WMV, etc.), mas tanto o fluxo de vídeo como o fluxo de áudio são compatíveis com o dispositivo. O ficheiro multimédia será reempacotado sem perdas em tempo real antes de ser enviado para o dispositivo.", "AspectRatioCover": "Zoom", @@ -1429,17 +1429,17 @@ "LabelFallbackFontPath": "Localização da pasta de fontes de contingência", "HeaderSelectFallbackFontPathHelp": "Procurar ou digitar a localização da pasta de fontes de contingência, utilizados para renderizar as legendas ASS/SSA.", "HeaderSelectFallbackFontPath": "Selecionar Localização da Pasta de Fontes de Contingência", - "Yadif": "Mais Um Filtro de Desentrelação (YADIF)", + "Yadif": "Mais um filtro de desentrelaçamento (YADIF)", "WeeklyAt": "{0} às {1}", "VideoAudio": "Vídeo Áudio", "ThumbCard": "Miniatura em forma de cartão", "QuickConnect": "Ligação Rápida", "PluginFromRepo": "{0} do repositório {1}", - "OptionAllowContentDownloadHelp": "Os utilizadores podem descarregar multimédia e armazená-la nos seus dispositivos. Esta não é igual a uma funcionalidade de sincronização. Os arquivos de livros requerem a ativação desta opção para funcionar corretamente.", + "OptionAllowContentDownloadHelp": "Os utilizadores podem transferir conteúdo multimédia e armazená-lo nos seus dispositivos. Isto não é o mesmo que uma funcionalidade de sincronização. As bibliotecas de livros necessitam de ter esta opção ativada para funcionarem corretamente.", "OptionAllowContentDownload": "Permitir transferências de multimédia", "LabelUDPPortRangeHelp": "Restringir o Jellyfin a esta gama de portas quando abre conexões UDP. (Padrão é 1024 - 65535).
Nota: Certas funcionalidades requerem portas fixas que podem estar fora desta gama.", "LabelUDPPortRange": "Gama de Portas UDP", - "LabelTonemappingDesat": "Dessaturação do Tone mapping", + "LabelTonemappingDesat": "Dessaturação do mapeamento de tons", "LabelSSDPTracingFilterHelp": "Endereço IP opcional, no qual será filtrado o tráfego SSDP registado.", "LabelSSDPTracingFilter": "Filtro SSDP", "LabelPublishedServerUriHelp": "Substituir o URI utilizado pelo Jellyfin, com base na interface, ou no endereço IP do cliente. Por exemplo: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, ou all=https://jellyfin.example.com", @@ -1501,7 +1501,7 @@ "LabelDirectStreamingInfo": "Informações de transmissão direta", "LabelTranscodingInfo": "Informações de transcodificação", "LabelSyncPlayTimeSyncDevice": "Sincronizar o tempo com", - "LabelSyncPlayHaltPlaybackDescription": "E ignorar as atualizações recentes da lista de reprodução", + "LabelSyncPlayHaltPlaybackDescription": "E ignorar as atualizações recentes da playlist", "LabelSyncPlaySettingsDescription": "Mudar definições SyncPlay", "LabelSortName": "Filtrar nome", "LabelSlowResponseTime": "Tempo em ms após o qual a resposta é considerada lenta", @@ -1517,7 +1517,7 @@ "HeaderSyncPlaySettings": "Definições de SyncPlay", "HeaderContinueReading": "Continuar a ler", "Framerate": "Taxa de fotogramas", - "ErrorPlayerNotFound": "Não foi possível identificar nenhum reprodutor compatível com o ficheiro pedido.", + "ErrorPlayerNotFound": "Não foi possível identificar nenhum leitor compatível com o ficheiro solicitado.", "Engineer": "Engenheiro de Som", "DisablePlugin": "Desativar", "DisableCustomCss": "Desativar código CSS personalizado fornecido pelo servidor", @@ -1530,7 +1530,7 @@ "LabelAutomaticallyAddToCollection": "Adicionar automaticamente à coleção", "ItemDetails": "Detalhes", "GoogleCastUnsupported": "O Google Cast não é suportado", - "EnableRewatchingNextUpHelp": "Mostrar episódios já vistos nas secções 'A Seguir'.", + "EnableRewatchingNextUpHelp": "Mostrar episódios já vistos na secção \"A seguir\".", "EnableRewatchingNextUp": "Ativar Rever em 'A Seguir'", "Digital": "Digital", "Cursive": "Cursivo", @@ -1540,7 +1540,7 @@ "Console": "Consola", "Casual": "Casual", "ButtonSpace": "Espaço", - "ButtonExitApp": "Sair da Aplicação", + "ButtonExitApp": "Sair da aplicação", "ButtonClose": "Fechar", "ButtonBackspace": "Retrocesso", "AddToFavorites": "Adicionar aos favoritos", @@ -1562,13 +1562,13 @@ "LabelEnableGamepad": "Ativar comandos de jogos", "Controls": "Comandos", "AllowVppTonemappingHelp": "Mapeamento de tons totalmente baseado no driver Intel. Vídeos em HDR10 funcionam apenas em certas configurações de hardware. Tem maior prioridade quando comparado a outras implementações OpenCL.", - "EnableVppTonemapping": "Ativar Tone Mapping VPP", + "EnableVppTonemapping": "Ativar o mapeamento de tons VPP", "EnableEnhancedNvdecDecoder": "Ativar o descodificador NVDEC", "UseEpisodeImagesInNextUpHelp": "As secções 'A seguir' e 'Continuar a ver' vão utilizar imagens dos episódios como miniatura em vez da imagem primária da série.", "UseEpisodeImagesInNextUp": "Utilizar imagens do episódio nas secções 'A seguir' e 'Continuar a ver'", "Typewriter": "Máquina de escrever", "TypeOptionPluralVideo": "Vídeos", - "TypeOptionPluralSeries": "Séries de TV", + "TypeOptionPluralSeries": "Séries", "TypeOptionPluralSeason": "Temporadas", "TypeOptionPluralMusicVideo": "Vídeos de Música", "TypeOptionPluralMusicArtist": "Artistas de música", @@ -1648,7 +1648,7 @@ "EnableEnhancedNvdecDecoderHelp": "Implementação NVDEC melhorada, desativa esta opção e utiliza CUVID no caso de encontrares erros de descodificação.", "Clip": "Média-metragem", "SelectAll": "Selecionar tudo", - "DirectPlayError": "Ocorreu um erro ao iniciar a reprodução directa", + "DirectPlayError": "Ocorreu um erro ao iniciar a reprodução direta", "UnknownAudioStreamInfo": "A informação da faixa de áudio é desconhecida", "UnknownVideoStreamInfo": "A informação da faixa de vídeo é desconhecida", "VideoBitrateNotSupported": "A taxa de bits deste vídeo não é suportada", @@ -1674,7 +1674,7 @@ "Scene": "Cena", "Interview": "Entrevista", "DeletedScene": "Cenas removidas", - "BehindTheScenes": "Nos bastidores", + "BehindTheScenes": "Bastidores", "DownloadAll": "Transferir tudo", "MessageNoItemsAvailable": "Nenhum item disponível atualmente.", "MessageNoFavoritesAvailable": "Não existem favoritos atualmente disponíveis.", @@ -1698,11 +1698,11 @@ "AllowCollectionManagement": "Permitir este utilizador gerir as coleções", "SecondarySubtitles": "Legendas secundárias", "LabelDummyChapterDuration": "Intervalo", - "LabelDummyChapterDurationHelp": "Define o intervalo entre capítulos fictícios. Para desativar a criação de capítulos fictícios, define como 0. Se alterares este valor, não terás qualquer efeito sobre os capítulos fictícios existentes.", + "LabelDummyChapterDurationHelp": "Define o intervalo entre capítulos fictícios em segundos. Para desativar a criação de capítulos fictícios, define como 0. Alterar este valor não terá qualquer efeito sobre os capítulos fictícios existentes.", "LabelChapterImageResolution": "Resolução", "LabelChapterImageResolutionHelp": "A resolução das imagens dos capítulos extraídas. A alteração desta resolução não terá qualquer efeito nos capítulos fictícios existentes.", "LabelParallelImageEncodingLimit": "Limite de codificação paralela de imagens", - "LabelParallelImageEncodingLimitHelp": "Número máximo de codificações de imagem permitidas para execução em paralelo. Se deixares este campo vazio, será escolhido um limite baseado na contagem de núcleos do teu sistema.", + "LabelParallelImageEncodingLimitHelp": "Número máximo de codificações de imagem que podem ser executadas em paralelo. Deixar este campo em branco fará com que o limite seja definido automaticamente com base no número de núcleos do sistema.", "GetThePlugin": "Obter Plugin", "Notifications": "Notificações", "NotificationsMovedMessage": "A funcionalidade de notificações foi movida para o plugin Webhook.", @@ -1728,15 +1728,15 @@ "OptionDateShowAdded": "Data de adição da Série", "LabelLevel": "Nível", "LabelSystem": "Sistema", - "LogLevel.Debug": "Debug", + "LogLevel.Debug": "Depuração", "LabelDeveloper": "Desenvolvedor", - "LabelTonemappingMode": "Modo de Tone Mapping", + "LabelTonemappingMode": "Modo do mapeamento de tons", "LabelDate": "Data", "LogLevel.Information": "Informação", "Unknown": "Desconhecido", "HeaderEpisodesStatus": "Estado do Episódio", - "LabelMediaDetails": "Detalhes Multimédia", - "LogLevel.Trace": "Vestígio", + "LabelMediaDetails": "Detalhes do conteúdo multimédia", + "LogLevel.Trace": "Rastreio", "LogLevel.Error": "Erro", "LogLevel.Critical": "Crítico", "LogLevel.None": "Nenhum", @@ -1767,11 +1767,11 @@ "LabelBackdropScreensaverInterval": "Intervalo da imagem de fundo do protetor de ecrã", "HeaderAllRecordings": "Todas as Gravações", "SelectAudioNormalizationHelp": "Ganho de faixa - ajusta o volume de cada faixa para que sejam reproduzidas com o mesmo volume. Ganho do álbum - ajusta o volume de todas as faixas apenas de um álbum, mantendo a faixa dinâmica do álbum. Alternar entre \"Desativado\" e outras opções requer o reinício da reprodução atual.", - "LogoScreensaver": "Logotipo de proteção de ecrã", - "TonemappingModeHelp": "Selecione o modo de mapeamento de tons. Se você tiver destaques estourados, tente mudar para o modo RGB.", + "LogoScreensaver": "Logótipo da proteção de ecrã", + "TonemappingModeHelp": "Seleciona o modo de mapeamento de tons. Se notares áreas muito claras ou estouradas, experimenta mudar para o modo RGB.", "MachineTranslated": "Traduzido Automaticamente", "ForeignPartsOnly": "Apenas partes forçadas/estrangeiras", - "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Os extras geralmente têm o mesmo nome incorporado do parente, marque isto para usar títulos incorporados de qualquer maneira.", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Os extras têm frequentemente o mesmo nome incorporado que o conteúdo principal; ativa esta opção para utilizar os títulos incorporados mesmo assim.", "SaveRecordingImagesHelp": "Guardar imagens do fornecedor de listas EPG juntamente com os ficheiros multimédia.", "MessageRepositoryInstallDisclaimer": "AVISO: A instalação de uma extensão de terceiros acarreta riscos. Ela pode conter código instável ou malicioso e pode ser alterado a qualquer momento. Instala apenas extensões de autores em quem confias.", "SaveRecordingNFO": "Guardar metadados EPG da gravação no NFO", @@ -1811,7 +1811,7 @@ "LabelQscale": "Fator de qualidade (Qscale)", "LabelJpegQualityHelp": "A qualidade de compressão JPEG para imagens trickplay.", "LabelJpegQuality": "Qualidade JPEG", - "EncodingFormatHelp": "Seleciona a codificação de vídeo para a qual o Jellyfin deve transcodificar. O Jellyfin usará a codificação de software quando a aceleração de hardware para o formato selecionado não estiver disponível. A codificação H264 será sempre ativada.", + "EncodingFormatHelp": "Seleciona a codificação de vídeo para a qual o Jellyfin deve transcodificar. O Jellyfin utilizará codificação por software quando não estiver disponível aceleração por hardware para o formato selecionado. A codificação H264 estará sempre ativada.", "LabelEncodingFormatOptions": "Opções de formato de codificação", "AirPlay": "AirPlay", "BlockContentWithTagsHelp": "Ocultar os conteúdos multimédia com pelo menos uma das etiquetas especificadas.", @@ -1846,7 +1846,7 @@ "LabelAllowContentWithTags": "Permitir items com etiquetas", "PlaybackError.NETWORK_ERROR": "A reprodução falhou devido a um erro de rede.", "PlaybackError.PLAYER_ERROR": "A reprodução falhou devido a um erro fatal do leitor.", - "PlaybackError.FATAL_HLS_ERROR": "Um erro fatal foi encontrado na stream HLS.", + "PlaybackError.FATAL_HLS_ERROR": "Foi encontrado um erro fatal na transmissão HLS.", "Lyric": "Letra", "NonBlockingScan": "Não bloqueante - coloca a geração em fila de espera e depois regressa", "BlockingScan": "Bloqueante - coloca a geração em fila de espera, bloqueia a análise até ser concluída", @@ -1879,17 +1879,17 @@ "HeaderVideoAdvanced": "Definições avançadas de vídeo", "LabelSelectPreferredTranscodeVideoAudioCodec": "Codec de áudio de transcodificação preferido na reprodução de vídeo", "SelectPreferredTranscodeVideoAudioCodecHelp": "Seleciona o codec de áudio preferido para transcodificar o conteúdo de vídeo. Se o codec preferido não for suportado, o servidor utilizará o próximo melhor codec disponível.", - "LibraryScanFanoutConcurrencyHelp": "Número máximo de tarefas paralelas durante as verificações da biblioteca. Se deixar este campo vazio, escolherá um limite baseado na contagem de núcleos do teu sistema. AVISO: Definir este número demasiado alto pode causar problemas com os sistemas de ficheiros de rede; se tiveres problemas, reduz este número.", + "LibraryScanFanoutConcurrencyHelp": "Número máximo de tarefas paralelas durante a análise da biblioteca. Deixar este campo em branco fará com que o limite seja definido automaticamente com base no número de núcleos do sistema. AVISO: Definir este número demasiado alto pode causar problemas em sistemas de ficheiros de rede; se encontrares dificuldades, reduz este valor.", "LibraryScanFanoutConcurrency": "Limite das tarefas de análise da biblioteca paralela", - "PlaylistError.AddFailed": "Erro ao adicionar à lista de reprodução", - "PlaylistError.CreateFailed": "Erro ao criar a lista de reprodução", + "PlaylistError.AddFailed": "Erro ao adicionar à playlist", + "PlaylistError.CreateFailed": "Erro ao criar a playlist", "SaveLyricsIntoMediaFoldersHelp": "Guardar letras junto a ficheiros de áudio permiti-las-á ser mais facilmente geridas.", "Inker": "Tinteiro", "Penciller": "Lapiseira", "Alternate": "Alternar", "AlternateDVD": "DVD alternativo", "PlaylistPublic": "Permitir acesso público", - "PlaylistPublicDescription": "Permitir que esta lista de reprodução seja vista por qualquer utilizador com sessão iniciada.", + "PlaylistPublicDescription": "Permitir que esta playlist seja vista por qualquer utilizador com sessão iniciada.", "Regional": "Regional", "SaveLyricsIntoMediaFolders": "Guardar letras em pastas multimédia", "Translator": "Tradutor", @@ -1904,7 +1904,7 @@ "EnableHi10pHelp": "Ativa para evitar a transcodificação de vídeos H.264 de 10 bits. Desativa esta opção se o vídeo apresentar quadros em branco.", "HeaderAudioAdvanced": "Definições avançadas de áudio", "LabelRepository": "Repositório", - "LabelSaveTrickplayLocally": "Guardar imagens de trickplay junto ao conteúdo multimédia", + "LabelSaveTrickplayLocally": "Guardar miniaturas de pré-visualização (trickplay) junto aos ficheiros de multimédia", "LabelLyricDownloaders": "Fornecedores de letras", "LabelEnablePlugin": "Ativar extensão", "EditLyrics": "Editar letra", @@ -1936,9 +1936,9 @@ "LabelNotInstalled": "Não instalado", "AndOtherArtists": "{0} e {1} outros artistas.", "AlwaysRemuxFlacAudioFilesHelp": "Se tiveres ficheiros que o teu navegador recusar reproduzir ou em que calcula incorretamente os registos de data/hora, ativa esta opção como solução alternativa.", - "AllowTonemappingSoftwareHelp": "Mapear os tons pode transformar a gama dinâmica de um vídeo de HDR para SDR, mantendo os detalhes e cores da imagens, que são informações muito importantes para representar a cena original. De momento, funciona apenas com vídeos HDR10 de 10 bits, HLG e DoVi.", + "AllowTonemappingSoftwareHelp": "O mapeamento de tons pode transformar a gama dinâmica de um vídeo de HDR para SDR, mantendo os detalhes e cores da imagens, que são informações muito importantes para representar a cena original. De momento, funciona apenas com vídeos HDR10 de 10 bits, HLG e DoVi.", "LabelQsvDevice": "Dispositivo QSV", - "LabelSaveTrickplayLocallyHelp": "Guarda as imagens de trickplay nas pastas multimédia junto dos teus ficheiros para facilitar a migração e o acesso.", + "LabelSaveTrickplayLocallyHelp": "As miniaturas de pré-visualização (trickplay) serão guardadas junto aos ficheiros de multimédia, o que facilita a migração e o acesso.", "AlwaysBurnInSubtitleWhenTranscoding": "Incorporar sempre legendas durante a transcodificação", "AlwaysBurnInSubtitleWhenTranscodingHelp": "Incorpora todas as legendas quando a transcodificação é acionada. Isto assegura que as legendas são sincronizadas após a transcodificação, à custa de uma velocidade de transcodificação reduzida.", "EnableHi10p": "Ativar o perfil H.264 High 10", @@ -2020,6 +2020,42 @@ "LabelGroupShowsIntoCollectionsHelp": "As séries de uma coleção serão apresentadas como um item agrupado quando forem apresentadas listas de séries.", "DisplayLoadError": "Ocorreu um erro ao carregar os dados de configuração do ecrã.", "MetadataImagesLoadError": "Falha ao carregar definições de metadados", - "LimitSegmentLength": "Usar segmentos curtos de HLS", - "LimitSegmentLengthHelp": "Ativar esta opção pode prevenir que o player HLS bloqueie durante a procura em certos dispositivos como TVs webOS." + "LimitSegmentLength": "Utilizar segmentos HLS mais curtos", + "LimitSegmentLengthHelp": "Ativar esta opção pode ajudar a evitar que o leitor HLS bloqueie durante a pesquisa em determinados dispositivos, como as TVs webOS.", + "HeaderServerUnavailable": "Servidor indisponível", + "HeaderUpdateRequired": "Atualização necessária", + "ViewSettings": "Ver definições", + "MessageForgotPasswordPinReset": "Introduz o PIN para concluir a redefinição da palavra-passe", + "DownloadManager": "Transferências", + "ConfirmDeleteRepository": "Eliminar repositório?", + "DeleteRepositoryConfirmation": "Tens a certeza que queres eliminar este repositório?", + "PluginsLoadError": "Ocorreu um erro ao carregar os plugins.", + "StorageType.CDRom": "CD-ROM", + "StorageType.Fixed": "Fixo", + "StorageType.Unknown": "Desconhecido", + "HeaderBackups": "Cópias de segurança", + "ButtonLearnMore": "Saber mais", + "Create": "Criar", + "MessageBackupDisclaimer": "Dependendo do tamanho da tua biblioteca, o processo de cópia de segurança pode demorar algum tempo.", + "Success": "Sucesso", + "TranscodingLoadError": "Falha ao carregar as definições de transcodificação", + "HeaderBackupsHelp": "Cria e restaura snapshots do teu servidor, que podem incluir a base de dados, metadados, legendas e trickplay.", + "LabelBackupsUnavailable": "Nenhuma cópia de segurança disponível", + "LabelDatabase": "Base de dados", + "LabelProgramData": "Dados do programa", + "LabelRestore": "Restaurar", + "MessageBackupInProgress": "Cópia de segurança em curso", + "BackupsPageLoadError": "Falha ao carregar a página de cópias de segurança", + "ButtonCreateBackup": "Criar cópia de segurança", + "MessageRestoreInProgress": "Restauração em curso", + "MessageRestoreSuccess": "Restauração concluída com sucesso", + "MessageRestoreDisclaimer": "AVISO: Estás prestes a restaurar a partir de uma cópia de segurança anterior. O teu servidor ficará inutilizável durante o processo e quaisquer dados novos criados desde essa cópia serão perdidos.", + "MessageWaitingForServer": "À espera do servidor...", + "RepositoriesPageLoadError": "Falha ao carregar os repositórios", + "StorageType.Network": "Rede", + "StorageType.NoRootDirectory": "Sem pasta raiz", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Removível", + "LabelImageCache": "Cache de imagens", + "LiveTVPageLoadError": "Falha ao carregar a página de gravações" } diff --git a/src/strings/pt.json b/src/strings/pt.json index f93b1dd9a..10a0e4052 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -16,7 +16,7 @@ "ValueVideoCodec": "Codec de Vídeo: {0}", "ValueTimeLimitSingleHour": "Limite de tempo: 1 hora", "ValueTimeLimitMultiHour": "Limite de tempo: {0} horas", - "ValueSpecialEpisodeName": "Episódio Especial - {0}", + "ValueSpecialEpisodeName": "Especial - {0}", "ValueConditions": "Condições: {0}", "ValueAudioCodec": "Codec de Áudio: {0}", "UserProfilesIntro": "O Jellyfin suporta perfis de utilizadores, permitindo que cada utilizador tenha as suas definições de visualização, estado de reprodução e controlos parentais.", @@ -30,7 +30,7 @@ "TrackCount": "{0} faixas", "TitlePlayback": "Reprodução", "Thursday": "Quinta", - "ThisWizardWillGuideYou": "Este assistente ajudá-lo-á durante o processo de configuração. Para começar, selecione o idioma.", + "ThisWizardWillGuideYou": "Este assistente irá ajudar-te durante o processo de configuração. Para começar, introduz o nome do servidor e seleciona o teu idioma.", "TellUsAboutYourself": "Fale-nos sobre si", "TabUpcoming": "Próximos", "TabStreaming": "Transmissão", @@ -92,11 +92,11 @@ "ResumeAt": "Retomar a partir de {0}", "ReplaceExistingImages": "Substituir imagens existentes", "ReplaceAllMetadata": "Substituir todos os metadados", - "RepeatOne": "Repetir um", + "RepeatOne": "Repetir uma vez", "RepeatMode": "Modo de repetição", "Repeat": "Repetir", "RemoveFromPlaylist": "Remover da lista de reprodução", - "Refresh": "Actualizar", + "Refresh": "Atualizar", "RecordingScheduled": "Gravação agendada.", "RecordingCancelled": "Gravação cancelada.", "RecordSeries": "Gravar série", @@ -110,11 +110,11 @@ "Producer": "Produtor", "MessagePluginInstalled": "A extensão foi instalada com sucesso. O servidor necessitará de ser reiniciado para aplicar as alterações.", "PleaseSelectTwoItems": "Por favor selecione pelo menos dois itens.", - "PleaseRestartServerName": "Por favor, reinicie o Servidor Jellyfin - {0}.", + "PleaseRestartServerName": "Por favor, reinicia o Jellyfin no {0}.", "PleaseEnterNameOrId": "Introduz um nome ou um ID externo.", "PleaseConfirmPluginInstallation": "Por favor clique em OK para confirmar que leu o conteúdo acima e que deseja prosseguir com a instalação da extensão.", - "PleaseAddAtLeastOneFolder": "Por favor, adicione pelo menos uma pasta a esta Biblioteca, utilizando o botão Adicionar.", - "Playlists": "Listas de Reprodução", + "PleaseAddAtLeastOneFolder": "Adiciona pelo menos uma pasta a esta biblioteca, clicando no botão '+' na secção 'Pastas'.", + "Playlists": "Playlists", "Played": "Reproduzido", "PlayNextEpisodeAutomatically": "Reproduzir próximo episódio automaticamente", "PlayNext": "Reproduzir a seguir", @@ -194,8 +194,8 @@ "LabelPostProcessor": "Aplicação de pós-processamento", "LabelPleaseRestart": "As alterações produzirão efeito depois de recarregar a página web.", "LabelPlayMethod": "Método de reprodução", - "LabelPlaylist": "Lista de Reprodução", - "LabelPlayer": "Reprodutor", + "LabelPlaylist": "Playlist", + "LabelPlayer": "Leitor", "LabelPersonRoleHelp": "Exemplo: motorista da carrinha de gelados", "LabelPersonRole": "Personagem", "LabelPath": "Localização", @@ -265,8 +265,8 @@ "LabelLanNetworks": "Redes locais (LAN)", "LabelKodiMetadataSaveImagePathsHelp": "Esta opção é recomendada se existirem nomes de imagens que não estejam de acordo com as recomendações do Kodi.", "LabelKodiMetadataSaveImagePaths": "Guardar a localização de imagens em ficheiros nfo", - "LabelKodiMetadataEnablePathSubstitutionHelp": "Ativar a substituição da localização das imagens utilizando as opções de substituição da localização do servidor.", - "LabelKodiMetadataEnablePathSubstitution": "Ativar substituição de localização", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Ativa a substituição de caminhos de imagens usando as definições de substituição de caminhos do servidor.", + "LabelKodiMetadataEnablePathSubstitution": "Ativar a substituição de caminhos", "LabelKodiMetadataEnableExtraThumbsHelp": "Ao transferir imagens, estas podem ser guardadas como extrafanart e extrathumbs para uma maior compatibilidade com os temas Kodi.", "LabelKodiMetadataEnableExtraThumbs": "Copiar o parâmetro extrafanart para extrathumbs", "LabelKodiMetadataDateFormatHelp": "Todas as datas presentes em ficheiros NFO serão analisadas utilizando este formato.", @@ -291,7 +291,7 @@ "LabelH264Crf": "CRF para codificação H.264", "LabelGroupMoviesIntoCollectionsHelp": "Ao mostrar listas de filmes, aqueles que pertençam a uma coleção serão apresentados como um único item agrupado.", "LabelGroupMoviesIntoCollections": "Agrupar filmes em coleções", - "LabelServerNameHelp": "Esse nome será usado para identificar o servidor e será o padrão para o hostname do servidor.", + "LabelServerNameHelp": "Este nome será utilizado para identificar o servidor. Hostname do servidor usado por defeito.", "LabelFriendlyName": "Nome amigável", "LabelFormat": "Formato", "LabelForgotPasswordUsernameHelp": "Introduz o teu nome de utilizador, se te lembrares dele.", @@ -300,8 +300,8 @@ "LabelFinish": "Terminar", "LabelFileOrUrl": "Ficheiro ou URL", "LabelFailed": "Falhou", - "LabelExtractChaptersDuringLibraryScanHelp": "Gerar imagens dos capítulos quando os vídeos forem importados durante a atualização da biblioteca. Caso contrário, serão geradas durante a tarefa agendada de extração de imagens dos capítulos, permitindo uma atualização mais rápida da biblioteca.", - "LabelExtractChaptersDuringLibraryScan": "Extrair imagens dos capítulos durante a atualização da biblioteca", + "LabelExtractChaptersDuringLibraryScanHelp": "Gerar imagens dos capítulos ao importar vídeos durante a análise da biblioteca. Caso contrário, as imagens serão extraídas mais tarde, através da tarefa agendada de extração de imagens de capítulos, permitindo que a análise regular da biblioteca seja concluída mais rapidamente.", + "LabelExtractChaptersDuringLibraryScan": "Extrair imagens dos capítulos durante a análise da biblioteca", "LabelBaseUrlHelp": "Adicione um subdiretório personalizado ao URL do servidor. Por exemplo: http://example.com/<baseurl>", "LabelBaseUrl": "URL Base", "LabelEveryXMinutes": "A cada", @@ -374,13 +374,13 @@ "LabelCriticRating": "Avaliação da crítica", "LabelCountry": "País/Região", "LabelContentType": "Tipo de conteúdo", - "LabelCommunityRating": "Avaliação da comunidade", + "LabelCommunityRating": "Classificação da comunidade", "LabelCollection": "Coleção", "LabelChannels": "Canais", "LabelCertificatePasswordHelp": "Se o certificado requer uma palavra-passe, escreva-a aqui.", "LabelCertificatePassword": "Palavra-passe do certificado", "LabelCancelled": "Cancelado", - "LabelCachePathHelp": "Defina uma localização para os ficheiros de cache como, por exemplo, imagens. Deixe em branco para utilizar o padrão do servidor.", + "LabelCachePathHelp": "Especifica uma localização personalizada para os ficheiros de cache do servidor, como imagens. Deixa em branco para usar a predefinição do servidor.", "LabelCachePath": "Localização da cache", "LabelCache": "Cache", "LabelBirthDate": "Data de nascimento", @@ -456,9 +456,9 @@ "HeaderStopRecording": "Parar gravação", "HeaderStatus": "Estado", "HeaderStartNow": "Iniciar", - "HeaderSpecialEpisodeInfo": "Informação do Episódio Especial", - "HeaderSortOrder": "Direcção de Ordenação", - "HeaderSortBy": "Ordenar Por", + "HeaderSpecialEpisodeInfo": "Informação sobre o episódio especial", + "HeaderSortOrder": "Sequência de ordenação", + "HeaderSortBy": "Ordenar por", "HeaderSetupLibrary": "Configurar bibliotecas multimédia", "HeaderServerSettings": "Configurações do Servidor", "HeaderSeriesStatus": "Estado da Série", @@ -548,13 +548,13 @@ "OptionDisableUserHelp": "O servidor não permitirá nenhuma conexão deste usuário. As conexões existentes serão encerradas abruptamente.", "OptionDisableUser": "Desativar este utilizador", "OptionDatePlayed": "Data de reprodução", - "OptionDateAddedImportTime": "Usar a data de importação para a biblioteca", + "OptionDateAddedImportTime": "Utilizar a data da análise para a biblioteca", "OptionDateAddedFileTime": "Usar a data de criação do ficheiro", "OptionDateAdded": "Data de adição", "OptionDaily": "Diariamente", "OptionCustomUsers": "Personalizado", "OptionCriticRating": "Classificação dos críticos", - "OptionCommunityRating": "Classificação da Comunidade", + "OptionCommunityRating": "Classificação da comunidade", "OptionAllowVideoPlaybackTranscoding": "Permitir reprodução de vídeo que necessite de transcodificação", "OptionAllowUserToManageServer": "Permitir a este utilizador gerir o servidor", "OptionAllowRemoteSharedDevicesHelp": "Dispositivos DLNA são considerados partilhados até que um utilizador comece a controlá-lo.", @@ -563,11 +563,11 @@ "MapChannels": "Mapear canais", "ManageLibrary": "Gerir biblioteca", "LabelSize": "Tamanho", - "LabelPlayDefaultAudioTrack": "Reproduzir a faixa de áudio padrão independentemente do idioma", + "LabelPlayDefaultAudioTrack": "Reproduzir a faixa de áudio predefinida independentemente do idioma", "LabelPlaceOfBirth": "Local de nascimento", "OptionAllowRemoteControlOthers": "Permitir controlo remoto de outros utilizadores", "OptionAllowMediaPlaybackTranscodingHelp": "Restringir o acesso à transcodificação pode causar falhas de reprodução em clientes devido a formatos de mídia não suportados.", - "OptionAllowMediaPlayback": "Permitir reprodução de média", + "OptionAllowMediaPlayback": "Permitir reprodução de multimédia", "OptionAllowManageLiveTv": "Permitir gestão de gravações de TV em Direto", "OptionAllowLinkSharing": "Permitir partilha nas redes sociais", "OptionAllowContentDownloading": "Permitir download dos ficheiros multimédia", @@ -590,7 +590,7 @@ "MessageUnableToConnectToServer": "Não foi possível estabelecer ligação ao servidor. Por favor, certifique-se que o servidor está a correr e tente de novo.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "As seguintes pastas multimédia serão removidas da tua biblioteca", "MessageReenableUser": "Vê abaixo para reativar", - "MessagePluginInstallDisclaimer": "AVISO: A instalação de uma extensão de terceiros acarreta riscos. Ela pode conter código instável ou malicioso e pode ser alterado a qualquer momento. Instala apenas extensões de autores em quem confias e tem em atenção os potenciais efeitos que podem ter, incluindo consultas de serviços externos, análises mais longas da biblioteca ou processamento adicional em segundo plano.", + "MessagePluginInstallDisclaimer": "AVISO: Instalar uma extensão de terceiros implica riscos. Pode conter código instável ou malicioso e pode ser alterada a qualquer momento. Instala apenas extensões de autores em quem confies e está atento aos possíveis efeitos, incluindo consultas a serviços externos, análises da biblioteca mais longas ou processamento adicional em segundo plano.", "MessagePluginConfigurationRequiresLocalAccess": "Para configurar esta extensão, inicia sessão localmente no servidor.", "MessagePleaseEnsureInternetMetadata": "Certifique-se de que a transferência de metadados da Internet está ativada.", "MessagePasswordResetForUsers": "Os seguintes utilizadores tiveram as suas palavras-passe redefinidas. Podem agora iniciar sessão com os códigos PIN que foram utilizados para efetuar a redefinição.", @@ -609,7 +609,7 @@ "MessageForgotPasswordInNetworkRequired": "Por favor, volte a tentar o processo de redefinição de palavra-passe quando se encontrar dentro da sua rede local.", "MessageForgotPasswordFileCreated": "Foi criado no servidor o ficheiro abaixo que contém instruções de como prosseguir", "MessageFileReadError": "Ocorreu um erro ao ler este ficheiro.", - "MessageEnablingOptionLongerScans": "Ativar esta opção pode aumentar significativamente a duração da análise da biblioteca.", + "MessageEnablingOptionLongerScans": "Ativar esta opção pode prolongar significativamente o tempo das análises da biblioteca.", "MessageDownloadQueued": "Transferência pendente.", "MessageDirectoryPickerLinuxInstruction": "Em sistemas operativos como Arch Linux, CentOS, Debian, Fedora, OpenSuse ou Ubuntu, é necessário dar permissão ao utilizador que executa o processo Jellyfin para ter, no mínimo, acesso de leitura à pasta.", "MessageDirectoryPickerBSDInstruction": "Para BSD, você talvez precise configurar o armazenamento em seu FreeNAS Jail para que o Jellyfin possa acessar sua mídia.", @@ -630,10 +630,10 @@ "MediaIsBeingConverted": "O conteúdo está a ser convertido para um formato compatível com o dispositivo em que o está a reproduzir.", "MediaInfoTimestamp": "Data e Hora", "MediaInfoSize": "Tamanho", - "MediaInfoSampleRate": "Taxa de Amostragem", + "MediaInfoSampleRate": "Taxa de amostragem", "MediaInfoResolution": "Resolução", "MediaInfoProfile": "Perfil", - "MediaInfoPixelFormat": "Formato de Píxeis", + "MediaInfoPixelFormat": "Formato dos píxeis", "MediaInfoPath": "Caminho", "MediaInfoLevel": "Nível", "MediaInfoChannels": "Canais", @@ -664,7 +664,7 @@ "LabelTriggerType": "Tipo do Accionador", "LabelTranscodingThreadCountHelp": "Seleciona o número máximo de processos a utilizar durante a transcodificação. Reduzir o número de processos diminuirá a utilização do CPU, mas pode não converter com rapidez suficiente para uma experiência de reprodução suave.", "LabelTranscodingThreadCount": "Número de processos de transcodificação", - "LabelTranscodingTempPathHelp": "Indique uma localização personalizada para os ficheiros de transcodificação em utilização, ou deixe em branco para utilizar o caminho por omissão.", + "LabelTranscodingTempPathHelp": "Especifica um caminho personalizado para os ficheiros transcodificados enviados aos clientes, ou deixa em branco para utilizar o caminho predefinido do servidor.", "LabelTimeLimitHours": "Limite de tempo (horas)", "LabelTime": "Tempo", "LabelTextSize": "Tamanho do Texto", @@ -672,7 +672,7 @@ "LabelSupportedMediaTypes": "Tipos de Conteúdos Suportados", "LabelSubtitlePlaybackMode": "Modo de legendas", "LabelSubtitleFormatHelp": "Exemplo: srt", - "LabelStopping": "A Parar", + "LabelStopping": "A parar", "LabelStopWhenPossible": "Parar, quando possível", "LabelStatus": "Estado", "LabelStartWhenPossible": "Começar, quando possível", @@ -692,12 +692,12 @@ "LabelSeriesRecordingPath": "Localização para gravação de séries", "LabelSerialNumber": "Número de série", "LabelSendNotificationToUsers": "Enviar notificação para", - "LabelSelectVersionToInstall": "Seleccione a versão a instalar", + "LabelSelectVersionToInstall": "Seleciona a versão a instalar", "LabelSelectUsers": "Seleccionar utilizadores", "LabelSelectFolderGroupsHelp": "Pastas não selecionadas serão apresentadas sozinhas, na sua própria vista.", "LabelSelectFolderGroups": "Agrupar automaticamente o conteúdo das pastas seguintes em vistas como Filmes, Música e TV", "LabelSeasonNumber": "Número da temporada", - "LabelScreensaver": "Proteção de Ecrã", + "LabelScreensaver": "Proteção de ecrã", "LabelScheduledTaskLastRan": "Última execução {0}. Tempo de execução {1}.", "HeaderFeatureAccess": "Acesso a funcionalidades", "HeaderExternalIds": "IDs Externos", @@ -722,7 +722,7 @@ "File": "Ficheiro", "Features": "Funcionalidades", "Favorites": "Favoritos", - "Favorite": "Favoritos", + "Favorite": "Favorito", "FastForward": "Avanço rápido", "FFmpegSavePathNotFound": "Não conseguimos encontrar o FFmpeg na localização que introduziste. O FFprobe também é necessário e deve estar na mesma pasta. Estes componentes são, por norma, instalados em conjunto. Por favor, verifica a localização e tenta novamente.", "Extras": "Extras", @@ -748,8 +748,8 @@ "EnableNextVideoInfoOverlayHelp": "No final de um vídeo, mostrar informação sobre o próximo vídeo na lista de reprodução.", "EnableNextVideoInfoOverlay": "Mostrar informação sobre o próximo vídeo durante a reprodução", "EnableHardwareEncoding": "Ativar codificação por hardware", - "EnableExternalVideoPlayersHelp": "O menu de um reprodutor externo será mostrado no início da reprodução de vídeo.", - "EnableExternalVideoPlayers": "Reprodutores de vídeo externos", + "EnableExternalVideoPlayersHelp": "O menu do leitor externo surgirá ao iniciar a reprodução de vídeo.", + "EnableExternalVideoPlayers": "Leitores de vídeo externos", "EnableDisplayMirroring": "Duplicação de ecrã", "EnableColorCodedBackgrounds": "Código de cores para o fundo", "EnableCinemaMode": "Modo cinema", @@ -810,7 +810,7 @@ "ConfirmDeleteImage": "Eliminar a imagem?", "ConfigureDateAdded": "Configura a forma como é atribuída a data de adição, no Painel de controlo > Bibliotecas > Visualização", "Composer": "Compositor", - "CommunityRating": "Avaliação da comunidade", + "CommunityRating": "Classificação da comunidade", "ColorTransfer": "Transferência de cores", "ColorSpace": "Espaço de cores", "ColorPrimaries": "Cores primárias", @@ -843,7 +843,7 @@ "ButtonRename": "Alterar o nome", "ButtonRemove": "Remover", "ButtonRefreshGuideData": "Atualizar Guia TV", - "ButtonQuickStartGuide": "Guia de Início Rápido", + "ButtonQuickStartGuide": "Guia de instalação", "ButtonPreviousTrack": "Faixa anterior", "ButtonPause": "Pausar", "ButtonParentalControl": "Controlo parental", @@ -912,14 +912,14 @@ "BirthPlaceValue": "Local de nascimento: {0}", "BirthLocation": "Local de nascimento", "BirthDateValue": "Nascimento: {0}", - "Banner": "Insígnia", + "Banner": "Faixa", "Backdrops": "Imagens de fundo", "Backdrop": "Imagem de fundo", "AuthProviderHelp": "Seleciona um mecanismo de autenticação a ser utilizado para validar as credenciais deste utilizador.", "Audio": "Áudio", "AspectRatio": "Proporção da imagem", "Ascending": "Crescente", - "Art": "Clearart", + "Art": "ClearArt (imagem transparente)", "AroundTime": "Por volta das {0}", "Anytime": "Qualquer altura", "AnyLanguage": "Qualquer idioma", @@ -986,7 +986,7 @@ "HeaderAlbumArtists": "Artistas do Álbum", "HeaderAdditionalParts": "Partes Adicionais", "HeaderAddUpdateImage": "Adicionar/Atualizar imagem", - "HeaderAddToPlaylist": "Adicionar à lista de reprodução", + "HeaderAddToPlaylist": "Adicionar à playlist", "HeaderAddToCollection": "Adicionar à coleção", "HeaderActivity": "Atividade", "HeaderActiveRecordings": "Gravações ativas", @@ -996,7 +996,7 @@ "HardwareAccelerationWarning": "Ativar a aceleração por hardware pode causar instabilidade em alguns ambientes. Certifica-te de que o teu sistema operativo e controladores de vídeo estão totalmente atualizados. Se tiveres dificuldades em reproduzir vídeo depois de ativares esta opção, terás de voltar a alterar a definição para \"Nenhum\".", "HDPrograms": "Programas HD", "EncoderPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho, ou um valor mais lento para melhorar a qualidade.", - "H264CrfHelp": "O parâmetro \"Constant Rate Factor\" (CRF) é o que define o nível de qualidade padrão para os codificadores de software x264 e x265. Os valores aceites são entre 0 e 51, em que valores mais baixos resultam numa melhor qualidade (a custo de ficheiros de maior dimensão). Os valores considerados aceitáveis estão entre 18 e 28. O valor padrão para o x264 é 23 e para o x265 é 28, podendo ser considerado um ponto de partida para ajustes. Os codificadores de hardware não utilizam estas definições.", + "H264CrfHelp": "O parâmetro \"Constant Rate Factor\" (CRF) define o nível de qualidade predefinido para os codificadores de software x264 e x265. Os valores possíveis vão de 0 a 51, sendo que valores mais baixos produzem melhor qualidade — à custa de ficheiros maiores. Os valores mais comuns situam-se entre 18 e 28. O valor predefinido para o x264 é 23, e para o x265 é 28, podendo servir como ponto de partida para afinares a qualidade conforme necessário. Codificadores por hardware não utilizam esta definição.", "GuideProviderSelectListings": "Selecionar listas", "Guide": "Programação", "GuestStar": "Estrela convidada", @@ -1004,7 +1004,7 @@ "GroupBySeries": "Agrupar por série", "ErrorAddingListingsToSchedulesDirect": "Ocorreu um erro ao adicionar o alinhamento à tua conta do Schedules Direct. O Schedules Direct só permite um número limitado de alinhamentos por conta. Poderás ter de iniciar sessão no site do Schedules Direct e remover outras listagens da tua conta antes de prosseguires.", "Ended": "Terminado", - "DefaultMetadataLangaugeDescription": "Estes são os valores por omissão que podem ser individualizados para cada uma das bibliotecas.", + "DefaultMetadataLangaugeDescription": "Estes são os valores-predefinidos que podem ser personalizados para cada uma das bibliotecas.", "Genres": "Géneros", "Genre": "Género", "General": "Geral", @@ -1018,7 +1018,7 @@ "EnableStreamLooping": "Transmissões em direto em loop automático", "Down": "Baixar", "HeaderNavigation": "Navegação", - "ButtonSplit": "Dividir", + "ButtonSplit": "Separar", "AskAdminToCreateLibrary": "Peça a um administrador para criar uma biblioteca.", "AllowFfmpegThrottling": "Transcodificação do Acelerador", "DashboardOperatingSystem": "Sistema Operativo", @@ -1108,13 +1108,13 @@ "LabelTag": "Tag", "LabelTVHomeScreen": "Tela inicial do modo TV", "LabelSubtitleDownloaders": "Fornecedores de legendas", - "LabelStreamType": "Tipo de fluxo", + "LabelStreamType": "Tipo de transmissão", "LabelSpecialSeasonsDisplayName": "Nome de exibição da temporada especial", "LabelSortTitle": "Classificar título", - "LabelSortOrder": "Ordem de classificação", + "LabelSortOrder": "Sequência de ordenação", "LabelSortBy": "Ordenar por", "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", + "LabelPlayerDimensions": "Dimensões do leitor", "LabelParentNumber": "Número pai", "LabelMetadataSavers": "Formatos de gravação dos metadados", "LabelDroppedFrames": "Quadros caídos", @@ -1159,9 +1159,9 @@ "StopRecording": "Parar gravação", "ShowYear": "Exibir ano", "ShowTitle": "Exibir título", - "SettingsWarning": "Mudar estes valores pode causar instabilidade ou falhas de conexão. Se tiver problemas, recomendamos restaurar os valores originais.", - "ServerNameIsShuttingDown": "O servidor Jellyfin - {0} está a desligar.", - "ServerNameIsRestarting": "O servidor Jellyfin - {0} está a reiniciar.", + "SettingsWarning": "Alterar estes valores poderá causar instabilidade ou falhas de ligação. Se ocorrer algum problema, recomendamos que os voltes a alterar para os valores predefinidos.", + "ServerNameIsShuttingDown": "O servidor {0} está a desligar.", + "ServerNameIsRestarting": "O servidor {0} está a reiniciar.", "SeriesYearToPresent": "{0} - Atualmente", "SeriesCancelled": "Série cancelada.", "SelectAdminUsername": "Seleciona um nome de utilizador para a conta de administrador.", @@ -1198,19 +1198,19 @@ "HeaderRemoteAccessSettings": "Definições de acesso remoto", "HeaderHttpsSettings": "Definições de HTTPS", "HeaderDVR": "DVR", - "ApiKeysCaption": "Lista das chaves de API ativadas no momento", + "ApiKeysCaption": "Lista das chaves da API atualmente ativas", "ButtonTogglePlaylist": "Lista de reprodução", "ButtonSyncPlay": "SyncPlay", "Data": "Dados", "ButtonUseQuickConnect": "Utilizar Ligação Rápida", "ButtonActivate": "Ativar", "Authorize": "Autorizar", - "EnableDetailsBannerHelp": "Exibir banner no topo da página de detalhes do item.", - "EnableDetailsBanner": "Banner de Detalhes", + "EnableDetailsBannerHelp": "Mostrar uma imagem no topo da página dos detalhes do item.", + "EnableDetailsBanner": "Faixa de detalhes", "EnableQuickConnect": "Ativar Ligação Rápida neste servidor", "EnableDecodingColorDepth10Vp9": "Ativar descodificação de hardware de 10-bits para VP9", "EnableDecodingColorDepth10Hevc": "Ativar descodificação de hardware de 10-bits para HEVC", - "EnableAutoCast": "Definir como padrão", + "EnableAutoCast": "Definir como predefinição", "HeaderDeleteDevices": "Eliminar todos os dispositivos", "Other": "Outros", "DeleteDevicesConfirmation": "Tens a certeza de que pretendes eliminar todos os dispositivos? Todas as outras sessões serão encerradas. Os dispositivos voltarão a aparecer da próxima vez que um utilizador iniciar sessão.", @@ -1218,15 +1218,15 @@ "DailyAt": "Diariamente, às {0}", "ClearQueue": "Limpar fila", "Bwdif": "Filtro de Desentrelação Bob Weaver (BWDIF)", - "ButtonPlayer": "Reprodutor", + "ButtonPlayer": "Leitor", "ButtonCast": "Transmitir para o dispositivo", "AllowTonemappingHelp": "O mapeamento de tons pode transformar a gama dinâmica de um vídeo de HDR para SDR, mantendo os detalhes e as cores da imagem, que são informações muito importantes para representar a cena original. Atualmente funciona apenas com vídeos HDR10 de 10 bits, HLG e DoVi. Isso requer o tempo de execução GPGPU correspondente.", "MusicVideos": "Videoclipes", - "LabelTonemappingPeak": "Pico de mapeamento de Tom", - "LabelTonemappingParamHelp": "Ajuste o algoritmo de mapeamento de tom. Os valores recomendados e padrão são NaN. Geralmente, deixa-se em branco.", - "LabelTonemappingParam": "Parâmetro de mapeamento de Tom", + "LabelTonemappingPeak": "Pico do mapeamento de tons", + "LabelTonemappingParamHelp": "Afina o algoritmo de mapeamento de tons. É recomendado deixar este campo em branco.", + "LabelTonemappingParam": "Parâmetros do mapeamento de tons", "LabelTonemappingDesatHelp": "Aplica a dessaturação aos realces que excedem este nível de brilho. O valor recomendado é 0 (desativar).", - "LabelTonemappingDesat": "Dessaturação de mapeamento de Tom", + "LabelTonemappingDesat": "Dessaturação do mapeamento de tons", "LabelTonemappingAlgorithm": "Seleciona o algoritmo de mapeamento de tons a utilizar", "LabelSyncPlayTimeSyncOffset": "Deslocamento de tempo", "LabelSyncPlayTimeSyncDevice": "Sincronizando o tempo com", @@ -1238,7 +1238,7 @@ "LabelSyncPlayNewGroup": "Novo grupo", "LabelSyncPlayLeaveGroupDescription": "Desativar SyncPlay", "LabelSyncPlayLeaveGroup": "Deixar o grupo", - "LabelSyncPlayHaltPlaybackDescription": "E ignorar as atualizações recentes da lista de reprodução", + "LabelSyncPlayHaltPlaybackDescription": "E ignorar as atualizações recentes da playlist", "LabelSyncPlayHaltPlayback": "Parar reprodução local", "LabelSyncPlayAccessNone": "Desativado para este utilizador", "LabelSyncPlayAccessJoinGroups": "Permitir ao utilizador aderir a grupos", @@ -1250,12 +1250,12 @@ "LabelSSDPTracingFilter": "Filtro SSDP", "LabelRepositoryUrlHelp": "A localização do manifesto do repositório que você deseja incluir.", "LabelRepositoryUrl": "URL do Repositório", - "LabelRepositoryNameHelp": "Um nome personalizado para distinguir este repositório de qualquer outro adicionado ao seu servidor.", + "LabelRepositoryNameHelp": "Nome personalizado para distinguir este repositório de outros presentes no servidor.", "LabelRepositoryName": "Nome do Repositório", "LabelQuickConnectCode": "Código de Ligação Rápida", "LabelPublishedServerUriHelp": "Substituir o URI utilizado pelo Jellyfin, com base na interface, ou no endereço IP do cliente. Por exemplo: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, ou all=https://jellyfin.example.com", "LabelPublishedServerUri": "URIs de Servidor Publicado", - "LabelOpenclDeviceHelp": "Este é o dispositivo OpenCL usado para mapeamento de tom. O lado esquerdo do ponto é o número da plataforma e o lado direito é o número do dispositivo na plataforma. O valor padrão é 0.0. O arquivo do aplicativo ffmpeg contendo o método de aceleração de hardware OpenCL é necessário.", + "LabelOpenclDeviceHelp": "Este é o dispositivo OpenCL utilizado para o mapeamento de tons. O número à esquerda do ponto representa a plataforma, e o da direita representa o número do dispositivo nessa plataforma. O valor predefinido é 0.0. É necessário o ficheiro da aplicação FFmpeg que contenha o método de aceleração por hardware via OpenCL.", "LabelOpenclDevice": "Dispositivo OpenCL", "LabelMinAudiobookResumeHelp": "Os audiolivros são considerados como não ouvidos se parados antes do valor definido.", "LabelMinAudiobookResume": "Duração mínima do audiolivro em minutos para permitir retomar", @@ -1338,11 +1338,11 @@ "HeaderSyncPlayTimeSyncSettings": "Sincronização de tempo", "HeaderSyncPlayPlaybackSettings": "Reprodução", "HeaderSyncPlaySettings": "Definições de SyncPlay", - "ErrorPlayerNotFound": "Nenhum player encontrado para a mídia solicitada.", + "ErrorPlayerNotFound": "Não foi possível identificar nenhum leitor compatível com o ficheiro solicitado.", "Engineer": "Engenheiro de som", "DisableCustomCss": "Desativar código CSS personalizado fornecido pelo servidor", "Console": "Consola", - "Conductor": "Condutor", + "Conductor": "Maestro", "Casual": "Casual", "ButtonBackspace": "Retrocesso", "GoogleCastUnsupported": "Google Cast não compatível", @@ -1351,7 +1351,7 @@ "Copy": "Copiar", "Copied": "Copiado", "ButtonSpace": "Espaço", - "ButtonExitApp": "Sair da Aplicação", + "ButtonExitApp": "Sair da aplicação", "ButtonClose": "Fechar", "AddToFavorites": "Adicionar aos favoritos", "DownloadAll": "Transferir tudo", @@ -1408,7 +1408,7 @@ "AllowEmbeddedSubtitlesAllowTextOption": "Permitir texto", "Premiere": "Estreia", "PreviousChapter": "Capítulo anterior", - "LabelDummyChapterDurationHelp": "Define o intervalo entre capítulos fictícios. Para desativar a criação de capítulos fictícios, define como 0. Se alterares este valor, não terás qualquer efeito sobre os capítulos fictícios existentes.", + "LabelDummyChapterDurationHelp": "Define o intervalo entre capítulos fictícios em segundos. Para desativar a criação de capítulos fictícios, define como 0. Alterar este valor não terá qualquer efeito sobre os capítulos fictícios existentes.", "AllowCollectionManagement": "Permitir este utilizador gerir as coleções", "LabelMaxVideoResolution": "Resolução máxima permitida para transcodificação de vídeo", "EnableAudioNormalization": "Normalização de Áudio", @@ -1420,7 +1420,7 @@ "EnableAudioNormalizationHelp": "A normalização de áudio vai adicionar um ganho constante para manter a média em um nível desejável (-18db).", "LabelParallelImageEncodingLimit": "Limite de codificação de imagens em paralelo", "LabelEnableLUFSScan": "Ativar a verificação LUFS", - "LabelEnableLUFSScanHelp": "Os clientes podem normalizar a reprodução de áudio para obter o mesmo volume entre as faixas. Isso fará com que as varreduras da biblioteca sejam mais longas e consumam mais recursos.", + "LabelEnableLUFSScanHelp": "Os clientes podem normalizar a reprodução de áudio para obter um volume uniforme entre faixas. Isto tornará as análises da biblioteca mais lentas e exigirá mais recursos.", "LabelParallelImageEncodingLimitHelp": "Número máximo de codificações de imagem permitidas para execução em paralelo. Se deixares este campo vazio, será escolhido um limite baseado na contagem de núcleos do teu sistema.", "GoHome": "Ir ao início", "GridView": "Vista em grelha", @@ -1467,15 +1467,15 @@ "AllowEmbeddedSubtitlesHelp": "Desativar as legendas que estão empacotadas em containers multimédia. Requer uma atualização completa da biblioteca.", "LabelEnableGamepad": "Ativar Gamepad", "LabelTonemappingThreshold": "Limite de mapeamento de tons", - "LabelTonemappingRange": "Intervalo de mapeamento de tons", + "LabelTonemappingRange": "Intervalo do mapeamento de tons", "PasswordRequiredForAdmin": "É necessária uma palavra passe para contas de administrador.", "PleaseConfirmRepositoryInstallation": "Clique em OK para confirmar que leu o texto acima e deseja prosseguir com a instalação do repositório de plug-ins.", "LabelThrottleDelaySecondsHelp": "Tempo em segundos após o qual o transcodificador será limitado. Deve ser grande o suficiente para que o cliente mantenha um buffer saudável. Só funciona se a limitação estiver ligada.", "QuickConnectAuthorizeFail": "Código de Ligação Rápida desconhecido", - "TonemappingAlgorithmHelp": "O mapeamento de tons pode ser ajustado. Se você não estiver familiarizado com essas opções, mantenha o padrão. O valor recomendado é 'BT.2390'.", + "TonemappingAlgorithmHelp": "O mapeamento de tons pode ser afinado. Se não estiveres familiarizado com estas opções, mantém o valor predefinido. O valor recomendado é 'BT.2390'.", "UseEpisodeImagesInNextUp": "Utilizar imagens do episódio nas secções 'A seguir' e 'Continuar a ver'", "UseEpisodeImagesInNextUpHelp": "As secções 'A seguir' e 'Continuar a ver' vão utilizar imagens dos episódios como miniatura em vez da imagem primária da série.", - "Yadif": "Mais Um Filtro de Desentrelação (YADIF)", + "Yadif": "Mais um filtro de desentrelaçamento (YADIF)", "IntelLowPowerEncHelp": "A codificação de baixo consumo pode manter uma sincronização CPU-GPU desnecessária. No Linux eles devem ser desativados se o firmware i915 HuC não estiver configurado.", "LabelTonemappingThresholdHelp": "Os parâmetros do algoritmo de mapeamento de tom são ajustados para cada cena. Um limite é usado para detectar se a cena mudou ou não. Se a distância entre o brilho médio do quadro atual e a média atual exceder um valor limite, recalcularíamos a média da cena e o brilho máximo. Os valores recomendados e padrão são 0,8 e 0,2.", "SyncPlayAccessHelp": "O recurso SyncPlay permite sincronizar a reprodução com outros dispositivos. Selecione o nível de acesso que este usuário tem ao SyncPlay.", @@ -1510,9 +1510,9 @@ "Subtitle": "Legenda", "MixedMoviesShows": "Filmes e séries misturados", "MessageSyncPlayIsDisabled": "Requer permissão para utilizar SyncPlay.", - "LabelMediaDetails": "Detalhes da mídia", - "MessageSyncPlayErrorNoActivePlayer": "Nenhum tocador ativo encontrado. A Sincronização foi desativada.", - "SpecialFeatures": "Faixas especiais", + "LabelMediaDetails": "Detalhes do conteúdo multimédia", + "MessageSyncPlayErrorNoActivePlayer": "Não foi encontrado nenhum leitor ativo. O SyncPlay foi desativado.", + "SpecialFeatures": "Opções especiais", "MessageSyncPlayNoGroupsAvailable": "Não há grupos disponíveis. Começa por reproduzir algo primeiro.", "Smaller": "Menor", "MessageSyncPlayErrorMedia": "Falha ao ativar o SyncPlay! Erro de mídia.", @@ -1587,7 +1587,7 @@ "LabelDate": "Data", "MessageRenameMediaFolder": "Mudar o nome de uma biblioteca multimédia fará com que todos os metadados se percam, por isso, procede com cuidado.", "LabelSyncPlaySettingsMinDelaySkipToSync": "Atraso mínimo do pulo de sincronização", - "LogLevel.None": "Nada", + "LogLevel.None": "Nenhum", "LogLevel.Critical": "Crítico", "New": "Novo", "SubtitleWhite": "Branco", @@ -1598,8 +1598,8 @@ "LabelSelectMono": "Mono", "HeaderEpisodesStatus": "Status dos episódios", "LabelSyncPlaySettingsSkipToSyncHelp": "Método de correção de sincronismo que consiste em buscar a posição estimada. A correção de sincronização deve estar habilitada.", - "LogLevel.Trace": "Vestígio", - "LogLevel.Debug": "Depurar", + "LogLevel.Trace": "Rastreio", + "LogLevel.Debug": "Depuração", "LogLevel.Information": "Informação", "MessageRepositoryInstallDisclaimer": "AVISO: A instalação de uma extensão de terceiros acarreta riscos. Ela pode conter código instável ou malicioso e pode ser alterado a qualquer momento. Instala apenas extensões de autores em quem confias.", "OptionAllowContentDownload": "Permitir transferências de multimédia", @@ -1628,7 +1628,7 @@ "UseDoubleRateDeinterlacingHelp": "Esta definição utiliza a taxa de campo durante o desentrelaçamento, muitas vezes referido como desentrelaçamento bob, que duplica a taxa de fotogramas do vídeo para proporcionar movimento fluído, como o que verias ao ver vídeo entrelaçado numa televisão.", "LabelDirectStreamingInfo": "Informações de transmissão direta", "LabelAlbumGain": "Ganho do álbum", - "LogoScreensaver": "Logotipo do Protetor de tela", + "LogoScreensaver": "Logótipo da proteção de ecrã", "MediaInfoColorSpace": "Espaço colorido", "Studio": "Estúdio", "SubtitleGray": "Cinzento", @@ -1653,14 +1653,14 @@ "Lyricist": "Letrista", "NextChapter": "Próximo capítulo", "TvLibraryHelp": "Revise o {0}guia de nomenclatura de TV{1}.", - "TypeOptionPluralSeries": "Programas de televisão", + "TypeOptionPluralSeries": "Séries", "TypeOptionPluralVideo": "Vídeos", "ValueSeriesCount": "{0} série", "LabelAudioInfo": "Informações de áudio", "RemuxHelp2": "Remux usa muito pouco poder de processamento com qualidade de mídia completamente sem perdas.", "MenuOpen": "Abrir Menu", "MenuClose": "Fechar Menu", - "OptionAllowContentDownloadHelp": "Os usuários podem baixar mídia e armazená-la em seus dispositivos. Isso não é o mesmo que um recurso de sincronização. As bibliotecas de livros exigem que isso esteja ativado para funcionar corretamente.", + "OptionAllowContentDownloadHelp": "Os utilizadores podem transferir conteúdo multimédia e armazená-lo nos seus dispositivos. Isto não é o mesmo que uma funcionalidade de sincronização. As bibliotecas de livros necessitam de ter esta opção ativada para funcionarem corretamente.", "SmallCaps": "Letras Minúsculas", "StereoDownmixAlgorithmHelp": "Algoritmo usado para fazer downmix de áudio multicanal para estéreo.", "Suggestions": "Sugestões", @@ -1716,7 +1716,7 @@ "LabelAllowedAudioChannels": "Máximo de canais de áudio permitidos", "YoutubeNotFound": "Vídeo não encontrado.", "EnableEnhancedNvdecDecoder": "Habilitar decodificador NVDEC aprimorado", - "EnableVppTonemapping": "Habilitar mapeamento de tom VPP", + "EnableVppTonemapping": "Ativar o mapeamento de tons VPP", "MediaInfoDvProfile": "Perfil DV", "VideoCodecNotSupported": "O codec de vídeo não é compatível", "SubtitleCodecNotSupported": "O codec de legenda não é compatível", @@ -1729,7 +1729,7 @@ "DirectPlayError": "Ocorreu um erro ao iniciar a reprodução direta", "Short": "Curto", "Clip": "Clipe", - "BehindTheScenes": "Por trás das cenas", + "BehindTheScenes": "Bastidores", "DeletedScene": "Cena deletada", "Interview": "Entrevista", "LabelVideoRangeType": "Tipo de gama de vídeo", @@ -1741,7 +1741,7 @@ "AllowAv1Encoding": "Permitir codificação no formato AV1", "AiTranslated": "IA traduzida", "MachineTranslated": "Traduzido automaticamente", - "AnamorphicVideoNotSupported": "O vídeo anamórfico não é compatível", + "AnamorphicVideoNotSupported": "Vídeos anamórficos não são suportados", "InterlacedVideoNotSupported": "Vídeo entrelaçado não é compatível", "EnableEnhancedNvdecDecoderHelp": "Implementação NVDEC melhorada, desativa esta opção e utiliza CUVID no caso de encontrares erros de descodificação.", "AudioChannelsNotSupported": "O número de canais de áudio não é suportado", @@ -1776,8 +1776,8 @@ "VideoFramerateNotSupported": "A taxa de quadros do vídeo não é compatível", "UnknownVideoStreamInfo": "As informações do stream de vídeo são desconhecidas", "SelectAll": "Selecionar tudo", - "LabelTonemappingMode": "Modo de mapeamento de tons", - "TonemappingModeHelp": "Selecione o modo de mapeamento de tons. Se ocorrerem erros de sobre-exposição, experimente o modo RGB.", + "LabelTonemappingMode": "Modo do mapeamento de tons", + "TonemappingModeHelp": "Seleciona o modo de mapeamento de tons. Se notares áreas muito claras ou estouradas, experimenta mudar para o modo RGB.", "VideoRangeTypeNotSupported": "O tipo de gama deste vídeo não é suportado", "ChannelResolutionHD": "HD", "ChannelResolutionSD": "SD", @@ -1801,7 +1801,7 @@ "LabelImageInterval": "Intervalo de imagem", "LabelQscale": "Fator de qualidade (Qscale)", "LabelImageIntervalHelp": "Intervalo de tempo (ms) entre cada nova imagem trickplay.", - "LabelScanBehaviorHelp": "O comportamento predefinido é não bloquear, o que adicionará ficheiros multimédia à biblioteca antes que a geração de trickplay seja feita. Bloquear irá garantir que os ficheiros trickplay são gerados antes de os ficheiros multimédia serem adicionados à biblioteca, mas fará com que as pesquisas sejam significativamente mais longas.", + "LabelScanBehaviorHelp": "O comportamento predefinido é não bloqueante, o que faz com que os ficheiros multimédia sejam adicionados à biblioteca antes da geração do trickplay estar concluída. O modo bloqueante assegura que os ficheiros trickplay são gerados antes dos ficheiros multimédia serem adicionados à biblioteca, mas tornará as análises significativamente mais demoradas.", "LabelWidthResolutions": "Resoluções de largura", "LabelTileWidth": "Largura do mosaico", "LabelWidthResolutionsHelp": "Lista separada por vírgulas das larguras (px) em que serão geradas as imagens trickplay. Todas as imagens devem ser geradas proporcionalmente à fonte, por isso um vídeo 16:9 com uma largura de 320 acabará por ter cerca de 320x180.", @@ -1833,7 +1833,7 @@ "LabelScanBehavior": "Comportamento de análise", "LabelTrickplayThreads": "Threads FFmpeg", "Lyric": "Letra", - "PlaybackError.FATAL_HLS_ERROR": "Um erro fatal foi encontrado na stream HLS.", + "PlaybackError.FATAL_HLS_ERROR": "Foi encontrado um erro fatal na transmissão HLS.", "PlaybackError.MEDIA_DECODE_ERROR": "A reprodução falhou devido a um erro ao descodificar o conteúdo.", "PlaybackError.MEDIA_NOT_SUPPORTED": "A reprodução falhou porque o conteúdo não é suportado por este cliente.", "PlaybackError.NETWORK_ERROR": "A reprodução falhou devido a um erro de rede.", @@ -1859,7 +1859,7 @@ "BlockingScan": "Bloqueante - coloca a geração em fila de espera, bloqueia a análise até ser concluída", "NonBlockingScan": "Não bloqueante - coloca a geração em fila de espera e depois regressa", "LabelExtractTrickplayDuringLibraryScan": "Extrair imagens trickplay durante a análise da biblioteca", - "LabelExtractTrickplayDuringLibraryScanHelp": "Gera imagens trickplay quando os vídeos são importados durante a análise da biblioteca. Caso contrário, serão extraídas durante a tarefa agendada de imagens trickplay. Se a geração estiver definida como não bloqueante, isto não afetará o tempo que a análise da biblioteca demora a ser concluída.", + "LabelExtractTrickplayDuringLibraryScanHelp": "Gerar imagens trickplay quando os vídeos são importados durante a análise da biblioteca. Caso contrário, as imagens serão extraídas durante a tarefa agendada de imagens trickplay. Se a geração estiver definida como não bloqueante, isto não afetará o tempo que a análise da biblioteca demora a concluir.", "PlaybackError.ASS_RENDER_ERROR": "Foi encontrado um erro no renderizador de legendas ASS/SSA.", "SavePassword": "Guardar palavra-passe", "Author": "Autor", @@ -1877,13 +1877,13 @@ "Letterer": "Letrista", "LabelSelectPreferredTranscodeVideoAudioCodec": "Codec de áudio de transcodificação preferido na reprodução de vídeo", "SelectPreferredTranscodeVideoAudioCodecHelp": "Seleciona o codec de áudio preferido para transcodificar o conteúdo de vídeo. Se o codec preferido não for suportado, o servidor utilizará o próximo melhor codec disponível.", - "LibraryScanFanoutConcurrencyHelp": "Número máximo de tarefas paralelas durante as verificações da biblioteca. Se deixar este campo vazio, escolherá um limite baseado na contagem de núcleos do teu sistema. AVISO: Definir este número demasiado alto pode causar problemas com os sistemas de ficheiros de rede; se tiveres problemas, reduz este número.", - "LibraryScanFanoutConcurrency": "Limite das tarefas de análise da biblioteca paralela", - "PlaylistPublicDescription": "Permitir que esta lista de reprodução seja vista por qualquer utilizador com sessão iniciada.", + "LibraryScanFanoutConcurrencyHelp": "Número máximo de tarefas paralelas durante as análises da biblioteca. Se deixares este campo vazio, será escolhido um limite com base no número de núcleos do teu sistema. AVISO: Definir um valor demasiado elevado pode causar problemas com sistemas de ficheiros em rede; se encontrares problemas, reduz este número.", + "LibraryScanFanoutConcurrency": "Limite de tarefas paralelas de análise da biblioteca", + "PlaylistPublicDescription": "Permitir que esta playlist seja vista por qualquer utilizador com sessão iniciada.", "PlaylistPublic": "Permitir acesso público", "SaveLyricsIntoMediaFoldersHelp": "Guardar letras junto a ficheiros de áudio permiti-las-á ser mais facilmente geridas.", - "PlaylistError.AddFailed": "Erro ao adicionar à lista de reprodução", - "PlaylistError.CreateFailed": "Erro ao criar a lista de reprodução", + "PlaylistError.AddFailed": "Erro ao adicionar à playlist", + "PlaylistError.CreateFailed": "Erro ao criar a playlist", "Translator": "Tradutor", "Inker": "Tinteiro", "Alternate": "Alternar", @@ -1924,7 +1924,7 @@ "MoviesAndShows": "Filmes e séries", "Anime": "Animé", "AlwaysBurnInSubtitleWhenTranscodingHelp": "Incorpora todas as legendas quando a transcodificação é acionada. Isto assegura que as legendas são sincronizadas após a transcodificação, à custa de uma velocidade de transcodificação reduzida.", - "AllowTonemappingSoftwareHelp": "Mapear os tons pode transformar a gama dinâmica de um vídeo de HDR para SDR, mantendo os detalhes e cores da imagens, que são informações muito importantes para representar a cena original. De momento, funciona apenas com vídeos HDR10 de 10 bits, HLG e DoVi.", + "AllowTonemappingSoftwareHelp": "O mapeamento de tons pode transformar a gama dinâmica de um vídeo de HDR para SDR, mantendo os detalhes e cores da imagens, que são informações muito importantes para representar a cena original. De momento, funciona apenas com vídeos HDR10 de 10 bits, HLG e DoVi.", "AlwaysBurnInSubtitleWhenTranscoding": "Incorporar sempre legendas durante a transcodificação", "DateModified": "Data de modificação", "AllowFmp4TranscodingContainerHelp": "Permite que o container de transcodificação fMP4 para este sintonizador permita conteúdos HEVC e HDR. Nem todos os sintonizadores são compatíveis com este container. Desativa-o se tiveres problemas de reprodução.", @@ -1941,8 +1941,8 @@ "HeaderMediaSegmentActions": "Ações de segmentos de multimédia", "FallbackMaxStreamingBitrateHelp": "A taxa de bits máxima de transmissão é usada como um recurso quando o ffprobe não consegue determinar a taxa de bits da transmissão de origem. Isso ajuda a evitar que os clientes solicitem uma taxa de bits de transcodificação excessivamente alta, o que poderia fazer com que o leitor falhasse e sobrecarregasse o codificador.", "LabelAudioTagSettings": "Definições de etiquetas de áudio", - "LabelSaveTrickplayLocally": "Guardar imagens de trickplay junto ao conteúdo multimédia", - "LabelSaveTrickplayLocallyHelp": "Guarda as imagens de trickplay nas pastas multimédia junto dos teus ficheiros para facilitar a migração e o acesso.", + "LabelSaveTrickplayLocally": "Guardar miniaturas de pré-visualização (trickplay) junto aos ficheiros de multimédia", + "LabelSaveTrickplayLocallyHelp": "As miniaturas de pré-visualização (trickplay) serão guardadas junto aos ficheiros de multimédia, o que facilita a migração e o acesso.", "LabelAllowStreamSharing": "Permitir partilha de transmissão", "LabelLyricDownloaders": "Fornecedores de letras", "LabelNoChangelog": "Nenhum registo de alterações foi disponibilizado para esta versão.", @@ -2016,5 +2016,32 @@ "LabelGroupShowsIntoCollectionsHelp": "As séries de uma coleção serão apresentadas como um item agrupado quando forem apresentadas listas de séries.", "DisplayLoadError": "Ocorreu um erro ao carregar os dados de configuração do ecrã.", "MetadataImagesLoadError": "Falha ao carregar definições de metadados", - "CopyLogSuccess": "Conteúdo do registo copiado com sucesso." + "CopyLogSuccess": "Conteúdo do registo copiado com sucesso.", + "LimitSegmentLength": "Utilizar segmentos HLS mais curtos", + "LimitSegmentLengthHelp": "Ativar esta opção pode ajudar a evitar que o leitor HLS bloqueie durante a pesquisa em determinados dispositivos, como as TVs webOS.", + "Retry": "Tentar novamente", + "HeaderServerUnavailable": "Servidor indisponível", + "HeaderUpdateRequired": "Atualização necessária", + "ViewSettings": "Ver definições", + "MessageForgotPasswordPinReset": "Introduz o PIN para concluir a redefinição da palavra-passe", + "DownloadManager": "Transferências", + "LiveTVPageLoadError": "Falha ao carregar a página de gravações", + "ButtonLearnMore": "Saber mais", + "ButtonCreateBackup": "Criar cópia de segurança", + "BackupsPageLoadError": "Falha ao carregar página de cópias de segurança", + "ConfirmDeleteRepository": "Apagar repositório?", + "LabelRestore": "Restauro", + "MessageBackupDisclaimer": "Dependendo do tamanho da mediateca, o processo de cópia de segurança poderá ser demorado.", + "HeaderBackups": "Cópias de segurança", + "TranscodingLoadError": "Falha ao carregar configurações de transcodificação", + "StorageType.Unknown": "Desconhecido", + "Success": "Sucesso", + "MessageBackupInProgress": "Cópia de segurança em progresso", + "Create": "Criar", + "DeleteRepositoryConfirmation": "Tem a certeza que pretende apagar este repositório?", + "HeaderBackupsHelp": "Criar e restaurar cópias do servidor, incluindo metadados, legendas e miniaturas de pré-visualização.", + "LabelBackupsUnavailable": "Sem cópias de segurança disponíveis", + "LabelDatabase": "Base de dados", + "LabelImageCache": "Memória cache de imagens", + "LabelProgramData": "Dados da aplicação" } diff --git a/src/strings/ro.json b/src/strings/ro.json index 6a62b4568..29115ce5d 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -4,7 +4,7 @@ "ButtonAddUser": "Adaugă Utilizator", "ButtonCancel": "Anulează", "ButtonManualLogin": "Conectare manuală", - "ButtonQuickStartGuide": "Ghid rapid de Start", + "ButtonQuickStartGuide": "Ghid de Configurare", "ButtonRefreshGuideData": "Reîmprospătează Ghidul", "ButtonRemove": "Elimină", "ButtonSelectDirectory": "Selectați Director", @@ -136,7 +136,7 @@ "TabProfiles": "Profile", "TabUpcoming": "Urmează să apară", "TellUsAboutYourself": "Spune-ne despre tine", - "ThisWizardWillGuideYou": "Acest asistent vă va ghida prin procesul de configurare. Pentru a începe, vă rugăm să selectați limba preferată.", + "ThisWizardWillGuideYou": "Acest asistent vă va ghida prin procesul de configurare. Introduceți numele de server și selectați limba preferată pentru a începe.", "Thursday": "Joi", "Tuesday": "Marți", "UserProfilesIntro": "Jellyfin include suport pentru profile de utilizator cu setări de afișare granulare, starea redării și control parental.", @@ -244,7 +244,7 @@ "ButtonOpen": "Deschide", "ButtonParentalControl": "Control parental", "ButtonPause": "Pauză", - "ConfirmEndPlayerSession": "Dorești să oprești serverul Jellyfin pe {0}?", + "ConfirmEndPlayerSession": "Doriti sa inchideti Jellyfin pe {0}?", "Connect": "Conectare", "ContinueWatching": "Continuă vizionarea", "DatePlayed": "Data redării", @@ -255,7 +255,7 @@ "ButtonRename": "Redenumește", "ButtonResetEasyPassword": "Resetează codul Easy PIN", "ButtonResume": "Continuă", - "ButtonScanAllLibraries": "Scanează Toate Librariile", + "ButtonScanAllLibraries": "Scanează Toate Librăriile", "ButtonSelectView": "Selectați perspectivă", "ButtonSend": "Trimite", "ButtonShutdown": "Oprește", @@ -897,7 +897,7 @@ "MessageDeleteTaskTrigger": "Sigur doriți să ștergeți acest declanșator de activitate?", "MessageCreateAccountAt": "Crează un cont la {0}", "MessageContactAdminToResetPassword": "Vă rugăm să contactați administratorul de sistem pentru a vă reseta parola.", - "MessageConfirmShutdown": "Sigur doriți să opriți serverul?", + "MessageConfirmShutdown": "Sigur dorești sa inchizi serverul?", "MessageConfirmRevokeApiKey": "Sigur doriți să revocați această cheie API? Conexiunea aplicației la acest server va fi terminată brusc.", "MessageConfirmRestart": "Sigur doriți să restartați Jellyfin?", "MessageConfirmRemoveMediaLocation": "Sigur doriți să eliminați această locație?", @@ -1363,7 +1363,7 @@ "Subtitle": "Subtitrare", "SpecialFeatures": "Caracteristici Speciale", "SelectServer": "Selectează server", - "Restart": "Redemarare", + "Restart": "Restartează", "ResetPassword": "Resetează Parola", "Profile": "Profil", "PosterCard": "Afiș", @@ -1381,7 +1381,7 @@ "Authorize": "Autorizează", "LabelMaxMuxingQueueSizeHelp": "Numărul maxim de pachete care pot fi tamponate în așteptarea inițializării tuturor fluxurilor. Încercați să o măriți dacă întâmpinați încă o eroare „Prea multe pachete tamponate pentru fluxul de ieșire” în jurnalele FFmpeg. Valoarea recomandată este 2048.", "LabelMaxMuxingQueueSize": "Dimensiunea maximă a cozii de mux", - "LabelTonemappingParamHelp": "Reglați algoritmul de mapare a tonurilor. Valorile recomandate și implicite sunt NaN. În general, lăsați-l necompletat.", + "LabelTonemappingParamHelp": "Ajustați algoritmul de mapare a tonurilor. In general, lasati-l gol.", "LabelTonemappingParam": "Parametrii mapării tonurilor", "LabelTonemappingPeakHelp": "În schimb, înlocuiți valoarea metadatelor încorporate pentru semnalul de intrare cu această valoare de vârf. Valoarea implicită este 100 (1000 nit).", "LabelTonemappingPeak": "Vârful mapării tonurilor", @@ -1672,7 +1672,7 @@ "Experimental": "Experimental", "LabelStereoDownmixAlgorithm": "Algoritmul de Mixare Descendentă în Stereo", "LabelDummyChapterDuration": "Interval", - "LabelDummyChapterDurationHelp": "Intervalul dintre capitolele fictive. Setați la 0 pentru a dezactiva generarea de capitole fictive. Modificarea acestui parametru nu va avea niciun efect asupra capitolelor fictive existente.", + "LabelDummyChapterDurationHelp": "Intervalul dintre capitolele fictive în secunde. Setați la 0 pentru a dezactiva generarea de capitole fictive. Modificarea acestui parametru nu va avea niciun efect asupra capitolelor fictive existente.", "LabelDummyChapterCount": "Limită", "LabelDummyChapterCountHelp": "Numărul maxim de imagini de capitol care vor fi extrase pentru fiecare fișier media individual.", "LabelChapterImageResolution": "Rezoluție", @@ -1681,7 +1681,7 @@ "LabelParallelImageEncodingLimitHelp": "Numărul maxim de encodări ale imaginilor care sunt permise să ruleze simultan. Lăsând această opțiune goală, se va alege automat o limită bazată pe specificațiile tehnice ale sistemului.", "HeaderDummyChapter": "Imaginile Capitolelor", "HeaderRecordingMetadataSaving": "Înregistrarea Metadatelor", - "EnableSplashScreen": "Activează imaginea ecranului de pornire", + "EnableSplashScreen": "Activează ecranul de pornire", "StereoDownmixAlgorithmHelp": "Algoritm utilizat pentru downmix multi-canale audio la stereo.", "Short": "Scurt", "MediaInfoDoViTitle": "Titlu DV", @@ -2024,5 +2024,46 @@ "ImageUploadCancelled": "Încărcarea imaginii anulată", "ImageUploadFailed": "Încărcarea imaginii a eșuat", "LabelGroupShowsIntoCollections": "Grupează serialele în colecții", - "LabelGroupShowsIntoCollectionsHelp": "Serialele dintr-o colecție vor fi afișate ca un singur element grupat în lista de seriale." + "LabelGroupShowsIntoCollectionsHelp": "Serialele dintr-o colecție vor fi afișate ca un singur element grupat în lista de seriale.", + "LimitSegmentLengthHelp": "Activarea acestei opțiuni poate ajuta la prevenirea blocării playerului HLS în timpul căutării pe anumite dispozitive, cum ar fi televizoarele webOS.", + "LimitSegmentLength": "Utilizați segment HLS redus", + "HeaderServerUnavailable": "Server indisponibil", + "HeaderUpdateRequired": "Actualizare necesară", + "ViewSettings": "Vedeți setările", + "MessageForgotPasswordPinReset": "Introduceți PIN-ul aici pentru a finaliza resetarea parolei", + "DownloadManager": "Descărcări", + "MessageBackupDisclaimer": "În funcție de mărimea bibliotecii tale, procesul de copie de rezervă poate să dureze un timp.", + "MessageBackupInProgress": "Copie de rezervă în progres", + "ConfirmDeleteRepository": "Ștergi magazia?", + "DeleteRepositoryConfirmation": "Ești sigur că vrei să ștergi magazia?", + "HeaderBackupsHelp": "Crează și restaurează poze ale serverului care pot include baza de date, metadata, subtitrări și trickplay.", + "LabelBackupsUnavailable": "Nu sunt restaurări disponibile", + "LabelDatabase": "Bază de date", + "LabelProgramData": "Program Data", + "PluginsLoadError": "A apărut o eroare în timp ce încărca plugins.", + "LabelRestore": "Restaurează", + "StorageType.Fixed": "Fixat", + "StorageType.Removable": "Îndepărtabil", + "MessageRestoreDisclaimer": "AVERTISMENT: Ești pe cale să restaurezi dintr-o copie de rezervă anterioară. Serverul tău va fi neutilizabil pe durata acestui proces și orice dată nou creată după copia de rezervă se va pierde.", + "MessageRestoreInProgress": "Restaurare în progres", + "MessageRestoreSuccess": "Restaurarea sa completat cu succes", + "MessageWaitingForServer": "Așteaptă după server...", + "RepositoriesPageLoadError": "A eșuat încărcarea magaziilor", + "StorageType.CDRom": "CD-ROM", + "StorageType.Network": "Rețea", + "StorageType.NoRootDirectory": "Fără Director Sursă", + "StorageType.Ram": "RAM", + "StorageType.Unknown": "Necunoscut", + "Success": "Succes", + "HeaderBackups": "Copii rezervă", + "TranscodingLoadError": "A eșuat să încarce setările de transcodare", + "ButtonLearnMore": "Învață mai mult", + "Create": "Crează", + "BackupsPageLoadError": "A eșuat să încarce pagina de copii de rezervă", + "ButtonCreateBackup": "Crează copie de rezervă", + "LabelImageCache": "Cache imagine", + "LiveTVPageLoadError": "Nu s-a putut incarca pagina de înregistrari", + "MessageServerMismatch": "Serverul la care va conectati nu este acelasi server la care v-ati conectat anterior la aceasta adresa. Daca acest lucru este de asteptat, va rugam sa selectati \"Conectati oricum\". In caz contrar, conexiunea sau serverul ar putea fi compromise.", + "ConnectAnyway": "Conecteaza Oricum", + "HeaderServerMismatch": "Serverul nu corespunde" } diff --git a/src/strings/ru.json b/src/strings/ru.json index c638654d0..f9814e626 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -522,7 +522,7 @@ "LabelEvent": "Событие", "LabelEveryXMinutes": "Каждые", "LabelExtractChaptersDuringLibraryScan": "Извлекать изображения сцен в процессе сканирования медиатеки", - "LabelExtractChaptersDuringLibraryScanHelp": "Генерируются изображения сцен при импорте видео в процессе сканирования медиатеки. В противном случае, они будут извлечены в процессе назначенной задачи «Изображения сцен», позволяя регулярному сканированию медиатеки завершаться быстрее.", + "LabelExtractChaptersDuringLibraryScanHelp": "Генерировать изображения разделов при импорте видео в процессе сканирования медиатеки. Иначе они будут извлекаться в процессе запланированной задачи «Изображения сцен», позволяя регулярному сканированию медиатеки завершаться быстрее.", "LabelFailed": "Неудачно", "LabelFileOrUrl": "Файл или URL", "LabelFinish": "Завершение", @@ -678,8 +678,8 @@ "LabelServerHost": "Узел", "LabelServerHostHelp": "192.168.1.100:8096 или https://myserver.com", "LabelSimultaneousConnectionLimit": "Предел одновременных потоков", - "LabelSkipBackLength": "Время отмотки", - "LabelSkipForwardLength": "Время промотки", + "LabelSkipBackLength": "Время перемотки назад", + "LabelSkipForwardLength": "Время перемотки вперед", "LabelSkipIfAudioTrackPresent": "Пропустить, если аудиодорожка по умолчанию соответствует загружаемому языку", "LabelSkipIfAudioTrackPresentHelp": "Снять данный флажок, чтобы обеспечить наличие субтитров для всех видео, независимо от языка аудио.", "LabelSkipIfGraphicalSubsPresent": "Пропустить, если видео уже содержит внедрённые субтитры", @@ -914,7 +914,7 @@ "OptionEstimateContentLength": "Рассчитывать длительность содержания при перекодировании", "OptionEveryday": "Ежедневно", "OptionExternallyDownloaded": "Внешние загружаемые", - "OptionExtractChapterImage": "Включить извлечение изображений сцен", + "OptionExtractChapterImage": "Включить извлечение изображений разделов", "OptionHasThemeSong": "Тематическая мелодия", "OptionHasThemeVideo": "Тематическое видео", "OptionHideUser": "Скрыть этого пользователя с экрана входа", @@ -1118,7 +1118,7 @@ "ThemeSongs": "Тематические мелодии", "ThemeVideos": "Тематические видео", "TheseSettingsAffectSubtitlesOnThisDevice": "Эти параметры влияют на субтитры на данном устройстве", - "ThisWizardWillGuideYou": "Этот помощник проведёт вас через все фазы установки и настройки. Сначала выберите предпочитаемый язык.", + "ThisWizardWillGuideYou": "Этот помощник проведёт вас через все фазы установки и настройки. Сначала укажите имя сервера и выберите предпочитаемый язык.", "Thumb": "Эскиз", "Thursday": "четверг", "TitleHardwareAcceleration": "Аппаратное ускорение", @@ -1179,7 +1179,7 @@ "XmlTvSportsCategoriesHelp": "Передачи в этих категориях будут отображаться как спортивные. Для разделения используйте «|».", "Yes": "Да", "Yesterday": "Вчера", - "ChangingMetadataImageSettingsNewContent": "Изменения в настройках загрузки метаданных или иллюстраций применяются только к добавляемому в дальнейшем контенту. Чтобы применить изменения к имеющемуся контенту, необходимо обновить их метаданные вручную.", + "ChangingMetadataImageSettingsNewContent": "Изменения в настройках загрузки метаданных или иллюстраций будут применяться только к новому контенту, добавленному в медиатеку. Чтобы применить изменения к уже существующему контенту, необходимо обновить их метаданные вручную.", "LabelDynamicExternalId": "{0} ID", "LeaveBlankToNotSetAPassword": "Оставьте пустым, чтобы не назначать пароль.", "MessageImageFileTypeAllowed": "Поддерживаются только файлы JPEG и PNG.", @@ -1419,7 +1419,7 @@ "OptionMaxActiveSessions": "Задать максимальное количество одновременных пользовательских сеансов.", "OptionAllowContentDownload": "Разрешить загрузку медиафайлов", "LabelMaxMuxingQueueSizeHelp": "Максимальное число пакетов, которое возможно буферизовать при ожидании инициализации всех потоков. Попробуйте увеличить значение, если всё ещё встречается ошибка «Too many packets buffered for output stream» (Слишком много пакетов буферизовано для выходного потока) в журналах FFmpeg. Рекомендуемое значение - 2048.", - "LabelTonemappingParamHelp": "Подстройка алгоритма тонмаппинга. Значение рекомендуемое и по умолчанию - NaN. Обычно оставляйте это поле пустым.", + "LabelTonemappingParamHelp": "Настроить алгоритм наложения тонов. Обычно это значение пустое.", "LabelTonemappingDesatHelp": "Применить понижение насыщенности для светлых участков, яркость которых превышает этот уровень. Рекомендуемое значение 0 (отключить).", "LabelTonemappingPeakHelp": "Переопределить пиковую яркость из метаданных этим значением. По умолчанию равно 100 (1000nit).", "LabelTonemappingThresholdHelp": "Параметры алгоритма тонмаппинга подстраиваются для каждой сцены. А порог используется, чтобы определить, изменилась ли сцена или нет. Если дистанция между средней яркостью текущего кадра и текущим скользящим средним превышает пороговое значение, мы пересчитаем среднюю и пиковую яркость сцены. Значения рекомендуемое и по умолчанию - 0.8 и 0.2.", @@ -1701,7 +1701,7 @@ "LabelParallelImageEncodingLimit": "Ограничение на параллельное кодирование изображений", "LabelParallelImageEncodingLimitHelp": "Максимальное количество кодировок изображений, которые разрешено выполнять параллельно. Оставив это значение пустым, вы выберете ограничение, основанное на количестве ядер вашей системы.", "HeaderPerformance": "Производительность", - "LabelDummyChapterDurationHelp": "Интервал между изображениями разделов. Установите значение 0, чтобы отключить генерацию изображений разделов. Изменение этого параметра не повлияет на существующие изображения разделов.", + "LabelDummyChapterDurationHelp": "Интервал между виртуальным разделами в секундах. Установите значение 0 для отключения генерации виртуальных разделов. Изменение этого параметра не повлияет на существующие виртуальные разделы.", "LabelChapterImageResolutionHelp": "Разрешение созданных изображений разделов. Изменение этого параметра не повлияет на существующие изображения разделов.", "ResolutionMatchSource": "Соответствовать источнику", "MenuOpen": "Открыть Меню", @@ -1742,7 +1742,7 @@ "LogLevel.Critical": "Критично", "LogLevel.None": "Ничего", "HeaderEpisodesStatus": "Статус эпизодов", - "LabelEnableLUFSScanHelp": "Клиенты могут нормализировать воспроизведения звука, чтобы обеспечить одинаковую громкость в разных треках. Сканированния библеотек займет больше времени и ресурсов.", + "LabelEnableLUFSScanHelp": "Клиенты могут нормализовывать звук для обеспечения одинаковой громкости в разных треках. Сканирования библиотеки будут занимать больше времени и ресурсов.", "LabelLevel": "Уровень", "LogLevel.Debug": "Отладка", "MessageRepositoryInstallDisclaimer": "ПРЕДУПРЕЖДЕНИЕ: Установка стороннего репозитория плагинов несет определенные риски. Он может содержать нестабильный или вредоносный код и может изменяться в любое время. Устанавливайте репозитории только от авторов, которым вы доверяете.", @@ -1833,7 +1833,7 @@ "PriorityBelowNormal": "Ниже нормы", "LabelImageIntervalHelp": "Интервал времени (мс) между каждым новым изображением trickplay.", "LabelTileHeightHelp": "Максимальное количество изображений на плитке в направлении Y.", - "EnableLibrary": "Активировать библиотеку", + "EnableLibrary": "Включить библиотеку", "EnableLibraryHelp": "Отключение библиотеки скроет ее от просмотра всеми пользователями.", "Trickplay": "Trickplay", "LabelScanBehavior": "Поведение при сканировании", @@ -1950,14 +1950,14 @@ "MessageSplitVersionsError": "Произошла ошибка во время разделения версий", "LibraryInvalidItemIdError": "Библиотека находится в неверном состоянии и не может быть отредактирована. Возможно, путь в базе данных не соответствует пути на файловой системе.", "MessageCancelSeriesTimerError": "Произошла ошибка во время отмены таймера сериала", - "UseCustomTagDelimiters": "Использовать пользовательский сепаратор тэгов", + "UseCustomTagDelimiters": "Использовать пользовательский разделитель тегов", "LabelQsvDevice": "QSV Устройство", "LabelQsvDeviceHelp": "Укажите устройство для Intel QSV на системе с несколькими GPU. На Linux это узел рендеринга, например, /dev/dri/renderD128. На Windows это индекс устройства, начинающийся с 0. Оставьте пустым, если не уверены в том, что делаете.", "LabelLyricDownloaders": "Загрузчики слов песен", "LabelAudioTagSettings": "Настройки аудио тэгов", "LabelCustomTagDelimiters": "Пользовательский разделитель тегов", "LabelDelimiterWhitelist": "Белый список разделителей", - "LabelDelimiterWhitelistHelp": "Элементы, которые будут при разделении тэгов. Один элемент на строку.", + "LabelDelimiterWhitelistHelp": "Элементы, которые будут исключены из разделения тегов. Один элемент на строку.", "PreferNonstandardArtistsTag": "Преподчитать тэг ARTISTS при наличии", "UseCustomTagDelimitersHelp": "Разделять тэги исполнителя/жанра используя пользовательские символы.", "LabelSaveTrickplayLocallyHelp": "Сохранение изображений trickplay в папки медиа поместит их рядом с вашими медиа файлами для удобства миграции и доступа.", @@ -2024,5 +2024,46 @@ "LabelGroupShowsIntoCollections": "Группировать сериалы в коллекции", "LabelGroupShowsIntoCollectionsHelp": "Сериалы в коллекции будут отображаться как один элемент при отображении списка сериалов.", "ReadInputAtNativeFramerate": "Вычитывать данные в исходной частоте кадров", - "ReadInputAtNativeFramerateHelp": "Включение этой опции может исправить некоторые проблемы, например, остановку прямых трансляций." + "ReadInputAtNativeFramerateHelp": "Включение этой опции может исправить некоторые проблемы, например, остановку прямых трансляций.", + "LimitSegmentLength": "Использовать короткие HLS сегменты", + "LimitSegmentLengthHelp": "Включение этой опции может помочь предотвратить зависание HLS-плеера во время перемотки на некоторых устройствах, например, на телевизорах с webOS.", + "HeaderServerUnavailable": "Сервер недоступен", + "HeaderUpdateRequired": "Требуется обновление", + "ViewSettings": "Показать параметры", + "DownloadManager": "Загрузки", + "MessageForgotPasswordPinReset": "Введите PIN-код для завершения сброса пароля", + "StorageType.Unknown": "Не известно", + "HeaderBackups": "Резервные файлы", + "MessageWaitingForServer": "Ожидание сервера...", + "StorageType.Network": "Сетевой", + "LabelProgramData": "Данные программы", + "LabelImageCache": "Кеш изображений", + "MessageRestoreDisclaimer": "ВНИМАНИЕ: вы собираетесь восстановить данные из предыдущего резервного файла. Ваш сервер будет не доступен во время этого процесса. Все данные, созданные после последнего резервирования, будут утеряны.", + "MessageBackupInProgress": "Резервирование в процессе", + "MessageBackupDisclaimer": "В зависимости от размера вашей библиотеки, резервирование может занять некоторое время.", + "LabelDatabase": "База данных", + "HeaderBackupsHelp": "Создание и восстановление состояния вашего сервера, включая базу данных, метаданные, субтитры и trickplay.", + "MessageRestoreSuccess": "Восстановление завершено успешно", + "MessageRestoreInProgress": "Восстановление в процессе", + "Create": "Создать", + "ButtonCreateBackup": "Создать резервный файл", + "LabelBackupsUnavailable": "Нет доступных резервных файлов", + "LabelRestore": "Восстановить", + "StorageType.Removable": "Съёмный носитель", + "StorageType.Ram": "Оперативная память", + "StorageType.NoRootDirectory": "Без корневой папки", + "StorageType.Fixed": "Фиксированный", + "StorageType.CDRom": "CD-ROM", + "Success": "Успешно", + "BackupsPageLoadError": "Не удалось загрузить страницу резервирования", + "PluginsLoadError": "При загрузке плагинов произошла ошибка.", + "ConfirmDeleteRepository": "Удалить репозиторий?", + "DeleteRepositoryConfirmation": "Вы уверены, что хотите удалить это репозиторий?", + "RepositoriesPageLoadError": "Не удалось загрузить репозитории", + "TranscodingLoadError": "Не удалось загрузить настройки транскодирования", + "ButtonLearnMore": "Узнать больше", + "LiveTVPageLoadError": "Не удалось загрузить страницу с записями", + "HeaderServerMismatch": "Несоответствие серверов", + "ConnectAnyway": "Подключиться в любом случае", + "MessageServerMismatch": "Сервер, к которому вы подключаетесь, не является тем же самым сервером, к которому вы ранее подключались по этому адресу. Если это ожидаемо, выберите \"Подключиться в любом случае\". В противном случае ваше соединение или сервер могут быть скомпрометированы." } diff --git a/src/strings/sk.json b/src/strings/sk.json index 8f9359d60..6f813c26b 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -47,7 +47,7 @@ "ButtonParentalControl": "Rodičovská kontrola", "ButtonPause": "Pozastaviť", "ButtonPreviousTrack": "Predchádzajúca stopa", - "ButtonQuickStartGuide": "Príručka rýchleho štartu", + "ButtonQuickStartGuide": "Sprievodca nastavením", "ButtonRefreshGuideData": "Obnoviť údaje programového sprievodcu", "ButtonRemove": "Odstrániť", "ButtonRename": "Premenovať", @@ -72,7 +72,7 @@ "Composer": "Skladateľ", "ConfirmDeleteImage": "Zmazať obrázok?", "ConfirmDeletion": "Potvrdiť zmazanie", - "ConfirmEndPlayerSession": "Chcete vypnúť Jellyfin na {0}?", + "ConfirmEndPlayerSession": "Chceli by ste vypnúť Jellyfin na {0}?", "Connect": "Pripojiť", "ContinueWatching": "Pokračovať v pozeraní", "CriticRating": "Hodnotenie kritikov", @@ -457,7 +457,7 @@ "MessageConfirmRecordingCancellation": "Zrušiť nahrávanie?", "MessageConfirmRemoveMediaLocation": "Ste si istý, že chcete odstrániť toto umiestnenie?", "MessageConfirmRestart": "Ste si istý, že chcete reštartovať Jellyfin?", - "MessageConfirmShutdown": "Ste si istý, že chcete vypnúť server?", + "MessageConfirmShutdown": "Ste si istí, že chcete vypnúť server?", "MessageEnablingOptionLongerScans": "Povolenie tejto možnosti môže mať za následok podstatne dlhšie skenovania knižníc.", "MessageFileReadError": "Pri načítaní súboru nastala chyba. Prosí, skúste to znova.", "MessageInvalidForgotPasswordPin": "Bol zadaný neplatný alebo expirovaný PIN. Prosím, skúste to znova.", @@ -673,7 +673,7 @@ "TabScheduledTasks": "Naplánované úlohy", "TabUpcoming": "Čoskoro", "TellUsAboutYourself": "Povedzte nám niečo o sebe", - "ThisWizardWillGuideYou": "Tento sprievodca Vám pomôže dokončiť proces inštalácie. Na úvod vyberte Vami preferovaný jazyk.", + "ThisWizardWillGuideYou": "Tento sprievodca Vám pomôže prejsť procesom nastavenia. Na začiatku zadajte názov servera a vyberte preferovaný jazyk.", "Thursday": "Štvrtok", "TitleHardwareAcceleration": "Hardvérová akcelerácia", "TrackCount": "{0} stôp", @@ -1420,7 +1420,7 @@ "LabelTonemappingRange": "Rozsah mapovania tónov", "LabelTonemappingPeakHelp": "Prepísať vloženú hodnotu metadát pre vstupný signál touto špičkovou hodnotou. Predvolená hodnota je 100 (1000nit).", "LabelTonemappingPeak": "Vrchol mapovania tónov", - "LabelTonemappingParamHelp": "Pre ladenie algoritmu mapovania tónov. Odporúčané a predvolené hodnoty sú NaN. Všeobecne je pole ponechané prázdne.", + "LabelTonemappingParamHelp": "Pre ladenie algoritmu mapovania tónov. Všeobecne je pole ponechané prázdne.", "LabelTonemappingParam": "Parameter mapovania tónov", "LabelTonemappingDesatHelp": "Aplikovať desaturáciu pre svetlé miesta ktoré prekračujú úroveň jasu. Odporúčaná hodnota je 0 (zakázané).", "LabelTonemappingDesat": "Desaturácia pri mapovaní tónov", @@ -1444,14 +1444,14 @@ "YoutubeBadRequest": "Zlá požiadavka.", "LabelSelectStereo": "Stereo", "LabelSelectMono": "Mono", - "AspectRatioCover": "Obal", + "AspectRatioCover": "Priblížiť", "VideoAudio": "Video Zvuk", "Video": "Video", "AllowTonemappingHelp": "Mapovanie tónov umožňuje zmeniť dynamický rozsah videa z HDR na SDR bez straty dôležitých informácií pôvodného obrazu, ako sú detaily a farby. Táto funkcia v súčasnosti funguje len pre videá, ktoré obsahujú 10-bitové HDR10, HLG alebo Dolby Vision a vyžaduje GPGPU runtime.", "LabelTonemappingThresholdHelp": "Parametre algoritmu mapovania tónov sú prispôsobené jednotlivým scénam. A tento prah sa používa na zistenie, či sa scéna zmenila alebo nie. Pokiaľ rozdiel medzi súčasnou priemernou svetlosťou snímku a priebežným priemerom tento prah prekročí, bude priemerná a vrchná svetlosť scény prepočítaná. Doporučené a predvolené hodnoty sú 0.8 a 0.2.", "LabelUDPPortRangeHelp": "Obmedzí UDP pripojenie Jellyfinu na tento rozsah. (Predvolená hodnota je 1024 - 65535).
Poznámka: Niektoré funkcie vyžadujú určité porty, ktoré sa môžu nachádzať mimo tohto rozsahu.", "Remuxing": "Remuxovanie", - "AspectRatioFill": "Vyplniť", + "AspectRatioFill": "Roztiahnuť", "EnableFallbackFontHelp": "Povoliť vlastné alternatívne fonty. Toto môže vyriešiť problémy s nesprávnym vykreslením titulkov.", "EnableFallbackFont": "Povoliť záložné fonty", "LabelFallbackFontPathHelp": "Tieto písma používajú niektorí klienti na vykresľovanie titulkov. Viac informácií nájdete v dokumentácii.", @@ -1653,7 +1653,7 @@ "HomeVideosPhotos": "Domáce videá a fotky", "Bold": "Tučné", "LabelTextWeight": "Hrúbka textu", - "EnableSplashScreen": "Povoliť úvodnú obrazovku", + "EnableSplashScreen": "Povoliť obrázok úvodnej obrazovky", "MediaInfoDvBlSignalCompatibilityId": "ID kompatibility signálu DV bl", "MediaInfoBlPresentFlag": "Prednastavený príznak DV bl", "MediaInfoElPresentFlag": "Prednastavený príznak DV el", @@ -1698,7 +1698,7 @@ "ResolutionMatchSource": "Rovnaké ako zdroj", "SaveRecordingNFOHelp": "Uloží metadáta z EPG položiek sprievodcu spolu s médiami.", "SaveRecordingImages": "Uložiť obrázky EPG nahrávky", - "LabelDummyChapterDurationHelp": "Interval medzi fiktívnymi kapitolami. Nastavením na 0 vypnete generovanie fiktívnych kapitol. Zmena tejto hodnoty nebude mať žiadny vplyv na existujúce fiktívne kapitoly.", + "LabelDummyChapterDurationHelp": "Interval medzi fiktívnymi kapitolami v sekundách. Nastavením na 0 vypnete generovanie fiktívnych kapitol. Zmena tejto hodnoty nebude mať žiadny vplyv na existujúce fiktívne kapitoly.", "SaveRecordingNFO": "Uložiť metadáta nahrávky zo sprievodcu EPG do NFO", "SaveRecordingImagesHelp": "Uloží obrázky z EPG položiek sprievodcu spolu s médiami.", "HeaderRecordingMetadataSaving": "Metadáta nahrávok", @@ -2014,5 +2014,56 @@ "PageNotFound": "Toto nie je stránka, ktorú hľadáš.", "SettingsPageLoadError": "Nepodarilo sa načítať stránku s nastaveniami", "StreamCountExceedsLimit": "Počet streamov prekračuje limit", - "RetryWithGlobalSearch": "Skúsiť globálne vyhľadávanie" + "RetryWithGlobalSearch": "Skúsiť globálne vyhľadávanie", + "UploadCustomImage": "Nahrať vlastný obrázok", + "CustomSplashScreenSize": "Vlastné obrázky by mali mať pomer strán 16x9 a minimálne rozlíšenie 1920x1080.", + "ReadInputAtNativeFramerateHelp": "Povolenie tejto možnosti môže vyriešiť niektoré problémy, napr. predčasné zastavenie živých streamov.", + "DeleteCustomImage": "Odstrániť vlastný obrázok", + "LimitSegmentLengthHelp": "Povolenie tejto možnosti môže pomôcť zabrániť tomu, aby sa prehrávač HLS počas posúvania vo videu na niektorých zariadeniach, ako sú napríklad televízory so systémom webOS, zasekával.", + "ReadInputAtNativeFramerate": "Natívna snímková frekvencia pri načítaní vstupu", + "ImageDeleteFailed": "Odstránenie obrázka sa nepodarilo", + "ImageUploadCancelled": "Nahrávanie obrázku bolo zrušené", + "ImageUploadFailed": "Nahrávanie obrázku zlyhalo", + "LimitSegmentLength": "Použiť kratšie segmenty HLS", + "LabelGroupShowsIntoCollections": "Zoskupiť seriály do kolekcií", + "LabelGroupShowsIntoCollectionsHelp": "Seriály v kolekcii budú zobrazené ako jedna zoskupená položka v zozname seriálov.", + "HeaderServerUnavailable": "Server nie je dostupný", + "HeaderUpdateRequired": "Vyžaduje sa aktualizácia", + "DownloadManager": "Stiahnuté", + "ViewSettings": "Zobraziť nastavenia", + "MessageForgotPasswordPinReset": "Zadajte PIN kód na dokončenie obnovy hesla", + "HeaderBackupsHelp": "Vytvoriť a obnoviť zálohu vášho servera, ktorá môže obsahovať databázu, metadáta, titulky a trickplay.", + "LabelBackupsUnavailable": "Nie sú k dispozícii žiadne zálohy", + "LabelImageCache": "Vyrovnávacia pamäť obrázkov", + "StorageType.CDRom": "CD-ROM", + "LabelRestore": "Obnoviť", + "MessageBackupDisclaimer": "V závislosti od veľkosti knižnice môže proces zálohovania chvíľu trvať.", + "MessageRestoreDisclaimer": "UPOZORNENIE: Chystáte sa obnoviť z predchádzajúcej zálohy. Váš server bude počas trvania tohto procesu nepoužiteľný a všetky nové údaje vytvorené od zálohovania budú stratené.", + "HeaderBackups": "Zálohy", + "BackupsPageLoadError": "Nepodarilo sa načítať stránku so zálohami", + "ButtonCreateBackup": "Vytvoriť zálohu", + "Create": "Vytvoriť", + "LabelDatabase": "Databáza", + "LabelProgramData": "Programové dáta", + "MessageBackupInProgress": "Prebieha zálohovanie", + "MessageRestoreInProgress": "Prebieha obnovenie", + "MessageRestoreSuccess": "Obnovenie bolo úspešne dokončené", + "MessageWaitingForServer": "Čaká sa na server...", + "StorageType.Fixed": "Fixné", + "StorageType.Network": "Sieť", + "StorageType.NoRootDirectory": "Žiadny koreňový adresár", + "StorageType.Ram": "RAM", + "StorageType.Removable": "Odnímateľný", + "StorageType.Unknown": "Neznáme", + "Success": "Úspech", + "ButtonLearnMore": "Dozvedieť sa viac", + "DeleteRepositoryConfirmation": "Ste si istí, že chcete odstrániť tento repozitár?", + "ConfirmDeleteRepository": "Vymazať repozitár?", + "PluginsLoadError": "Pri načítavaní zásuvných modulov došlo k chybe.", + "RepositoriesPageLoadError": "Nepodarilo sa načítať repozitáre", + "TranscodingLoadError": "Nepodarilo sa načítať nastavenia prekódovania", + "LiveTVPageLoadError": "Nepodarilo sa načítať stránku s nahrávkami", + "ConnectAnyway": "Napriek tomu pripojiť", + "HeaderServerMismatch": "Nesúlad so serverom", + "MessageServerMismatch": "Server, ku ktorému sa pripájate, nie je ten istý server, ku ktorému ste sa predtým pripojili na tejto adrese. Ak je to očakávané, vyberte možnosť „Napriek tomu pripojiť“. V opačnom prípade môže byť vaše pripojenie alebo server kompromitované." } diff --git a/src/strings/sq.json b/src/strings/sq.json index 0a33f7a97..79de1cc9b 100644 --- a/src/strings/sq.json +++ b/src/strings/sq.json @@ -584,5 +584,7 @@ "HeaderSyncPlaySelectGroup": "Bashkohuni një grupi", "DirectStreamHelp2": "Energjia e konsumuar nga transmetimi i drejtpërdrejtë zakonisht varet nga profili i audios. Vetëm transmetimi i videove është pa humbje.", "EnableDetailsBannerHelp": "Shfaqni një imazh baneri në krye të faqes së artikullit.", - "AirPlay": "AirPlay" + "AirPlay": "AirPlay", + "AllowContentWithTagsHelp": "Shfaq vetëm median që ka të paktën një nga etiketat e specifikuara.", + "AllowSubtitleManagement": "Lejoje këtë përdorues të redaktojë titrat" } diff --git a/src/strings/sv.json b/src/strings/sv.json index 09af23f71..68665b054 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -68,7 +68,7 @@ "ButtonParentalControl": "Föräldralås", "ButtonPause": "Paus", "ButtonPreviousTrack": "Föregående spår", - "ButtonQuickStartGuide": "Snabbstartguide", + "ButtonQuickStartGuide": "Installationsguide", "ButtonRefreshGuideData": "Uppdatera programguiden", "ButtonRemove": "Ta bort", "ButtonRename": "Ändra namn", @@ -1032,7 +1032,7 @@ "ThemeSongs": "Signaturmelodier", "ThemeVideos": "Vinjettvideor", "TheseSettingsAffectSubtitlesOnThisDevice": "Dessa inställningar påverkar undertexter på den här enheten", - "ThisWizardWillGuideYou": "Den här guiden hjälper dig att göra de första inställningarna. För att börja var vänlig välj önskat språk.", + "ThisWizardWillGuideYou": "Den här guiden hjälper dig att göra de första inställningarna. För att börja var vänlig ange ett servernamn och välj önskat språk.", "Thumb": "Miniatyr", "Thursday": "Torsdag", "TitleHardwareAcceleration": "Hårdvaruacceleration", @@ -1097,7 +1097,7 @@ "ErrorAddingXmlTvFile": "Det uppstod ett problem vid läsningen av XMLTV-filen. Kontrollera att filen är tillgänglig och försök igen.", "ErrorAddingListingsToSchedulesDirect": "Det uppstod ett problem när din lista skulle läggas till på ditt Schedules Direct konto. Schedules Direct tillåter bara ett begränsat antal listor per konto. Du kanske behöver logga in på Schedules Direct hemsidan och ta bort andras listningar från ditt konto innan du fortsätter.", "EnableStreamLoopingHelp": "Aktivera enbart detta om direktsändningen enbart innehåller några sekunders data och behöver bli kontinuerligt uppdaterad. Att aktivera denna funktion i onödan kan skapa problem.", - "EnableStreamLooping": "Loopa direktsändningar", + "EnableStreamLooping": "Loopa direktsändningar automatiskt", "Descending": "Fallande", "DefaultMetadataLangaugeDescription": "Detta är dina standardinställningar och de kan ändras individuellt för varje bibliotek.", "ColorTransfer": "Färgöverföring", @@ -1267,7 +1267,7 @@ "AlbumArtist": "Albumartist", "LabelLibraryPageSize": "Bibliotekets sidstorlek", "LabelDeinterlaceMethod": "Deinterlacing-metod", - "WeeklyAt": "{0}s vid {1}", + "WeeklyAt": "{0}ar vid {1}", "LastSeen": "Senast aktivitet {0}", "Yadif": "Ännu en Deinterlacing-filter (YADIF)", "Filter": "Filter", @@ -1320,7 +1320,7 @@ "ButtonCast": "Sänd till enhet", "EnableBlurHashHelp": "Bilder som fortfarande laddas kommer visas med en unik platshållare.", "EnableBlurHash": "Aktivera suddiga platshållare för bilder", - "Writers": "Skribenter", + "Writers": "Manusförfattare", "ViewAlbumArtist": "Visa albumets artist", "TabRepositories": "Förvaringsplatser", "SyncPlayAccessHelp": "SyncPlay-funktionen aktiveras för att synkronisera uppspelning med andra enheter. Välj behörighetsnivån som denna användare har för denna funktion.", @@ -1467,7 +1467,7 @@ "LabelTonemappingRange": "Tonmappningsomfång", "LabelTonemappingPeakHelp": "Åsidosätt det inbäddade metadatavärdet för ingångssignalen med detta toppvärde istället. Standardvärdet är 100 (1000nit).", "LabelTonemappingPeak": "Tonmappningstoppvärde", - "LabelTonemappingParamHelp": "Ställ in algoritm för tonmappning. De rekommenderade och förvalda värdena är NaN. Vanligtvis kan man lämna det tomt.", + "LabelTonemappingParamHelp": "Ställ in algoritm för tonmappning. Vanligtvis kan man lämna det tomt.", "LabelTonemappingParam": "Tonmappningsparameter", "RemuxHelp1": "Median är i en inkompatibel filbehållare (MKV, AVI, WMV, etc) men både videoströmmen och ljudströmmen är kompatibla med enheten. Media kommer att förpackas förlustfritt i farten innan den skickas till enheten.", "AspectRatioCover": "Förstora", @@ -1695,7 +1695,7 @@ "SaveRecordingImagesHelp": "Spara bilder från EPG-listningsleverantören tillsammans med media.", "HeaderDummyChapter": "Kapitelbilder", "LabelDummyChapterDuration": "Intervall", - "LabelDummyChapterDurationHelp": "Intervall mellan dummy-kapitel. Ställ in på 0 för att inaktivera generering av dummy-kapitel. Ändringar av detta har ingen effekt på befintliga dummy-kapitel.", + "LabelDummyChapterDurationHelp": "Intervall mellan dummy-kapitel (i sekunder). Ställ in på 0 för att inaktivera generering av dummy-kapitel. Ändringar av detta har ingen effekt på befintliga dummy-kapitel.", "LabelDummyChapterCount": "Gräns", "LabelDummyChapterCountHelp": "Största antal kapitelbilder som kommer hämtas in för varje enskild mediafil.", "LabelChapterImageResolution": "Upplösning", @@ -1802,7 +1802,7 @@ "EnableLibrary": "Aktivera biblioteket", "PriorityBelowNormal": "Under normal", "PriorityIdle": "Inaktiv", - "Lyric": "Låttext", + "Lyric": "Sångtext", "ChannelResolutionSDPAL": "SD(PAL)", "ChannelResolutionHD": "HD", "ChannelResolutionFullHD": "Full HD", @@ -1820,7 +1820,7 @@ "PlaybackError.MEDIA_NOT_SUPPORTED": "Uppspelning misslyckades då mediet inte stöds av denna klient.", "PlaybackError.NETWORK_ERROR": "Uppspelningen misslyckades på grund av nätverksfel.", "LimitSupportedVideoResolution": "Begränsa maximal videoupplösning", - "Lyrics": "Låttexter", + "Lyrics": "Sångtexter", "PlaybackError.ASS_RENDER_ERROR": "Ett fel uppstod i textrenderaren för ASS/SSA-undertexter.", "PlaybackError.FATAL_HLS_ERROR": "Ett allvarligt fel uppstod i HLS-strömmen.", "PlaybackError.MEDIA_DECODE_ERROR": "Uppspelning misslyckades på grund av ett fel vid media avkodning.", @@ -1829,11 +1829,11 @@ "PlaybackError.SERVER_ERROR": "Uppspelningen misslyckades på grund av ett serverfel.", "PlaybackError.NotAllowed": "Uppspelningen av detta media är inte tillåtet.", "PlaybackError.RateLimitExceeded": "Detta medium kan inte spelas upp just nu på grund av hastighetsbegränsningar.", - "ViewLyrics": "Visa låttexter", + "ViewLyrics": "Visa sångtexter", "LabelAllowContentWithTags": "Tillåt objekt med taggarna", "LimitSupportedVideoResolutionHelp": "Använd 'Maximal tillåten video omkodningsupplösning' som maximal begränsad maximal videoupplösning.", - "HeaderDeleteLyrics": "Ta bort låttexterna", - "HeaderNoLyrics": "Inga låttexter hittades", + "HeaderDeleteLyrics": "Radera sångtexter", + "HeaderNoLyrics": "Inga sångtexter hittades", "Creator": "Skapare", "EnableTrueHd": "Aktivera TrueHD", "NonBlockingScan": "Non Blocking - köar genereringen och återvänder sedan", @@ -1841,7 +1841,7 @@ "LabelSelectPreferredTranscodeVideoAudioCodec": "Föredragen ljudcodec för transkodning vid videouppspelning", "PlaylistPublic": "Tillåt allmän åtkomst", "PlaylistPublicDescription": "Tillåt att denna spellista kan ses av vilken inloggad användare som helst.", - "SaveLyricsIntoMediaFolders": "Spara låttexter i mediemappar", + "SaveLyricsIntoMediaFolders": "Spara sångtexter i mediemappar", "SelectPreferredTranscodeVideoAudioCodecHelp": "Välj den föredragna ljudcodecen att transkoda till för videomaterial. Om den föredragna codecen inte stöds kommer servern att använda den näst bästa tillgängliga codecen.", "LabelEncodingFormatOptions": "Alternativ för kodningsformat", "LabelWidthResolutions": "Breddupplösningar", @@ -1849,7 +1849,7 @@ "LabelExtractTrickplayDuringLibraryScan": "Extrahera trickplay-bilder under biblioteksskanningen", "PlaylistError.AddFailed": "Fel vid tillägg till spellista", "PlaylistError.CreateFailed": "Fel vid skapande av spellista", - "SaveLyricsIntoMediaFoldersHelp": "Att lagra låttexter bredvid ljudfiler gör det möjligt att hantera dem mer lättillgängligt.", + "SaveLyricsIntoMediaFoldersHelp": "Att lagra sångtexter bredvid ljudfiler gör det möjligt att hantera dem mer lättillgängligt.", "LabelProcessPriority": "Processprioritet", "LabelTileWidth": "sektion bredd", "LibraryScanFanoutConcurrency": "Gränsvärde för parallella bibliotekssökuppgifter", @@ -1889,7 +1889,7 @@ "LabelQscaleHelp": "Kvalitetsskalan för bilder som produceras av FFmpeg, där 2 är högsta kvalitet och 31 är lägsta kvalitet.", "LabelImageIntervalHelp": "Intervall av tid (ms) mellan varje ny trickplay-bild.", "LabelQscale": "qscale", - "HeaderLyricDownloads": "Låttextnedladdningar", + "HeaderLyricDownloads": "Sångtextnedladdningar", "AlternateDVD": "Alternativ DVD", "Regional": "Regional", "Alternate": "Alternativ", @@ -1928,7 +1928,7 @@ "PreviewLyrics": "Förhandsgranska sångtext", "EnableHi10p": "Slå på High 10-profilen för H.264", "EnableHi10pHelp": "Slå på detta för att undvika att omkoda H.264 10-bits videos. Slå av detta val om videon visar tomma bildrutor.", - "SearchForLyrics": "Sök efter låttext", + "SearchForLyrics": "Sök efter sångtexter", "HeaderAudioAdvanced": "Advancerat Ljud", "LabelDisableVbrAudioEncoding": "Inaktivera VBR-ljudkodning", "AlwaysRemuxFlacAudioFilesHelp": "Om du har filer som din webbläsare vägrar att spela upp eller där den beräknar tidsstämplar felaktigt, aktivera detta som en lösning.", @@ -2017,5 +2017,45 @@ "LabelGroupShowsIntoCollections": "Gruppera serier i samlingar", "LabelGroupShowsIntoCollectionsHelp": "Serier i en samling visas som ett grupperat föremål när listor av serier visas.", "PageNotFound": "Detta är inte sidan du letar efter.", - "LogLoadFailure": "Kunde inte ladda loggfilen. Den kan fortfarande vara aktivt skriven till." + "LogLoadFailure": "Kunde inte ladda loggfilen. Den kan fortfarande vara aktivt skriven till.", + "LimitSegmentLength": "Använd kortare HLS-segment", + "LimitSegmentLengthHelp": "Aktiveringen av detta alternativ kan bidra till att förhindra att HLS-spelaren hänger sig vid spolning på vissa enheter, så som TV-apparater med webOS.", + "ReadInputAtNativeFramerateHelp": "Aktivering av detta alternativ kan lösa vissa problem, t.ex. att direktsändningar stoppas i förtid.", + "ReadInputAtNativeFramerate": "Läs inmatning i ursprungling bildhastighet", + "ViewSettings": "Visa inställningar", + "HeaderServerUnavailable": "Server Otillgänglig", + "HeaderUpdateRequired": "Uppdatering Krävs", + "DownloadManager": "Nedladdningar", + "MessageForgotPasswordPinReset": "Ange PIN-koden här för att slutföra lösenordsåterställningen", + "Create": "Skapa", + "LabelProgramData": "Programdata", + "MessageRestoreInProgress": "Återställning pågående", + "StorageType.CDRom": "CD-ROM", + "StorageType.NoRootDirectory": "Ingen rotkatalog", + "LabelBackupsUnavailable": "Inga backuper tillgängliga", + "LabelDatabase": "Databas", + "BackupsPageLoadError": "Misslyckades att ladda backup sidan", + "ButtonCreateBackup": "Skapa backup", + "LabelRestore": "Återställ", + "MessageBackupDisclaimer": "Beroende på storleken på ditt bibliotek kan backupprocessen ta ett tag.", + "MessageBackupInProgress": "Backup pågående", + "MessageWaitingForServer": "Väntar på server...", + "StorageType.Network": "Nätverk", + "StorageType.Ram": "RAM", + "StorageType.Unknown": "Okänd", + "HeaderBackups": "Backuper", + "Success": "Lyckat", + "PluginsLoadError": "Ett fel uppstod vid inläsning av tillägg.", + "ConfirmDeleteRepository": "Ta bort arkiv?", + "DeleteRepositoryConfirmation": "Är du säker på att du vill ta bort detta arkiv?", + "HeaderBackupsHelp": "Skapa och återställ snapshots av din server, som kan innehålla databasen, metadata, undertexter och trickplay.", + "MessageRestoreDisclaimer": "VARNING: Du håller på att återställa från en tidigare säkerhetskopia. Din server kommer att vara otillgänglig under processen och all ny data som skapats efter säkerhetskopian kommer att förloras.", + "MessageRestoreSuccess": "Återställning slutförd", + "RepositoriesPageLoadError": "Kunde inte ladda arkiv", + "StorageType.Removable": "Borttagbar", + "TranscodingLoadError": "Kunde inte läsa in transkodningsinställningarna", + "ButtonLearnMore": "Läs mer", + "LabelImageCache": "Bildcache", + "StorageType.Fixed": "Åtgärdat", + "LiveTVPageLoadError": "Misslyckades med att ladda inspelningssidan" } diff --git a/src/strings/ta.json b/src/strings/ta.json index 86b8efe8a..fa1152cac 100644 --- a/src/strings/ta.json +++ b/src/strings/ta.json @@ -63,7 +63,7 @@ "ButtonAddScheduledTaskTrigger": "தூண்டுதலைச் சேர்க்கவும்", "ButtonAddMediaLibrary": "ஊடக நூலகத்தைச் சேர்க்கவும்", "ButtonAddImage": "படத்தைச் சேர்க்கவும்", - "BurnSubtitlesHelp": "வீடியோக்களை டிரான்ஸ்கோடிங் செய்யும் போது சர்வர் வசனங்களில் எரிய வேண்டுமா என்பதைத் தீர்மானிக்கவும். இதைத் தவிர்ப்பது செயல்திறனை பெரிதும் மேம்படுத்தும். பட அடிப்படையிலான வடிவங்கள் (VobSub, PGS, SUB, IDX, முதலியன) மற்றும் சில ASS அல்லது SSA வசனங்களை எழுத தானியங்கு என்பதைத் தேர்ந்தெடுக்கவும்.", + "BurnSubtitlesHelp": "சர்வர் சப்டைட்டில்களில் எரிக்க வேண்டுமா என்பதைத் தீர்மானிக்கவும். இதைத் தவிர்ப்பது செயல்திறனை பெரிதும் மேம்படுத்தும். பட அடிப்படையிலான வடிவங்களை (VobSub, PGS, SUB, IDX, முதலியன) மற்றும் சில ASS அல்லது SSA சப்டைட்டில்களை எரிக்க ஆட்டோவைத் தேர்ந்தெடுக்கவும்.", "MessageBrowsePluginCatalog": "கிடைக்கக்கூடிய செருகுநிரல்களைக் காண எங்கள் சொருகி பட்டியலை உலாவுக.", "Browse": "உலவ", "BoxRear": "பெட்டி (பின்புறம்)", @@ -123,7 +123,7 @@ "ButtonRename": "மறுபெயரிடு", "ButtonRemove": "அகற்று", "ButtonRefreshGuideData": "வழிகாட்டி தரவைப் புதுப்பிக்கவும்", - "ButtonQuickStartGuide": "விரைவு தொடக்க வழிகாட்டி", + "ButtonQuickStartGuide": "அமைவு வழிகாட்டி", "ButtonPreviousTrack": "முந்தைய பாடல்", "ButtonPause": "இடைநிறுத்தம்", "ButtonParentalControl": "பெற்றோர் கட்டுப்பாடு", @@ -225,7 +225,7 @@ "ConfirmDeleteItems": "இந்த உருப்படிகளை நீக்குவது கோப்பு முறைமை மற்றும் உங்கள் ஊடக நூலகம் இரண்டிலிருந்தும் அவற்றை நீக்கும். நீங்கள் தொடர விரும்புகிறீர்களா?", "ConfirmDeleteItem": "இந்த உருப்படியை நீக்குவது கோப்பு முறைமை மற்றும் உங்கள் ஊடக நூலகம் இரண்டிலிருந்தும் நீக்கப்படும். நீங்கள் தொடர விரும்புகிறீர்களா?", "ConfirmDeleteImage": "படத்தை நீக்கவா?", - "ConfigureDateAdded": "டாஷ்போர்டு > நூலகங்கள் > NFO அமைப்புகளில் 'சேர்க்கப்பட்ட தேதி'க்கான மெட்டாடேட்டா எவ்வாறு தீர்மானிக்கப்படுகிறது என்பதை அமைக்கவும்", + "ConfigureDateAdded": "'சேர்க்கப்பட்ட தேதி'க்கான மெட்டாடேட்டா எவ்வாறு தீர்மானிக்கப்படுகிறது என்பதை டாஷ்போர்டு > நூலகங்கள் > காட்சி என்பதில் அமைக்கவும்", "Composer": "இசையமைப்பாளர்", "CommunityRating": "சமூக மதிப்பீடு", "ColorTransfer": "வண்ண பரிமாற்றம்", @@ -633,7 +633,7 @@ "LabelLogs": "பதிவுகள்", "LabelLoginDisclaimerHelp": "உள்நுழைவு பக்கத்தின் கீழே காண்பிக்கப்படும் செய்தி.", "LabelLoginDisclaimer": "உள்நுழைவு மறுப்பு", - "LabelLockItemToPreventChanges": "எதிர்கால மாற்றங்களைத் தடுக்க இந்த உருப்படியைப் பூட்டவும்", + "LabelLockItemToPreventChanges": "எதிர்கால மெட்டாடேட்டா மாற்றங்களைத் தடுக்க இந்த உருப்படியைப் பூட்டுங்கள்", "LabelLocalHttpServerPortNumberHelp": "HTTP சேவையகத்திற்கான TCP போர்ட் எண்.", "LabelLocalHttpServerPortNumber": "உள்ளூர் HTTP போர்ட் எண்", "LabelLineup": "வரிசை", @@ -929,7 +929,7 @@ "MessageDeleteTaskTrigger": "இந்த பணி தூண்டுதலை நீக்க விரும்புகிறீர்களா?", "MessageCreateAccountAt": "{0} இல் ஒரு கணக்கை உருவாக்கவும்", "MessageContactAdminToResetPassword": "உங்கள் கடவுச்சொல்லை மீட்டமைக்க உங்கள் கணினி நிர்வாகியைத் தொடர்பு கொள்ளவும்.", - "MessageConfirmShutdown": "சேவையகத்தை நிறுத்த விரும்புகிறீர்களா?", + "MessageConfirmShutdown": "நீங்கள் சேவையகத்தை நிச்சயமாக மூட விரும்புகிறீர்களா?", "MessageConfirmRevokeApiKey": "இந்த API விசையை நிச்சயமாகத் திரும்பப் பெற விரும்புகிறீர்களா? இந்த சேவையகத்திற்கான பயன்பாட்டின் இணைப்பு திடீரென துண்டிக்கப்படும்.", "MessageConfirmRestart": "ஜெல்லிஃபின் மறுதொடக்கம் செய்ய விரும்புகிறீர்களா?", "MessageConfirmRemoveMediaLocation": "இந்த இருப்பிடத்தை அகற்ற விரும்புகிறீர்களா?", @@ -1155,7 +1155,7 @@ "SettingsSaved": "அமைப்புகள் சேமிக்கப்பட்டன.", "Settings": "அமைப்புகள்", "ServerUpdateNeeded": "இந்த சேவையகத்தை புதுப்பிக்க வேண்டும். சமீபத்திய பதிப்பைப் பதிவிறக்க, தயவுசெய்து {0} ஐ பார்வையிடவும்", - "ServerRestartNeededAfterPluginInstall": "செருகுநிரலை நிறுவிய பின் ஜெல்லிஃபின் மறுதொடக்கம் செய்யப்பட வேண்டும்.", + "ServerRestartNeededAfterPluginInstall": "செருகுநிரலை நிறுவிய பின் ஜெல்லிஃபினை மறுதொடக்கம் செய்ய வேண்டும்.", "ServerNameIsShuttingDown": "{0} இல் உள்ள சேவையகம் மூடப்படும்.", "ServerNameIsRestarting": "{0} இல் உள்ள சேவையகம் மறுதொடக்கம் செய்யப்படுகிறது.", "SeriesYearToPresent": "{0} - தற்போது", @@ -1301,7 +1301,7 @@ "TitleHardwareAcceleration": "வன்பொருள் முடுக்கம்", "Thursday": "வியாழக்கிழமை", "Thumb": "சிறுபடம்", - "ThisWizardWillGuideYou": "இந்த வழிகாட்டி அமைவு செயல்முறை மூலம் உங்களுக்கு வழிகாட்ட உதவும். தொடங்க, நீங்கள் விரும்பும் மொழியைத் தேர்ந்தெடுக்கவும்.", + "ThisWizardWillGuideYou": "இந்த வழிகாட்டி அமைவு செயல்முறையின் மூலம் உங்களுக்கு வழிகாட்ட உதவும். தொடங்குவதற்கு, தயவுசெய்து ஒரு சேவையக பெயரை உள்ளிட்டு உங்களுக்கு விருப்பமான மொழியைத் தேர்ந்தெடுக்கவும்.", "TheseSettingsAffectSubtitlesOnThisDevice": "இந்த அமைப்புகள் இந்த சாதனத்தில் வசன வரிகள் பாதிக்கின்றன", "ThemeVideos": "தீம் வீடியோக்கள்", "ThemeSongs": "தீம் பாடல்கள்", @@ -1362,7 +1362,7 @@ "OnWakeFromSleep": "தூக்கத்திலிருந்து எழுந்தவுடன்", "WeeklyAt": "{1} இல் {0}", "DailyAt": "தினசரி {0}", - "LastSeen": "கடைசியாக பார்த்தது {0}", + "LastSeen": "கடைசி செயல்பாடு {0}", "PersonRole": "{0} என", "ListPaging": "{0} - {2} இன் {1}", "WriteAccessRequired": "ஜெல்லிஃபினுக்கு இந்த கோப்புறையில் எழுத அணுகல் தேவை. எழுதும் அணுகலை உறுதிசெய்து மீண்டும் முயற்சிக்கவும்.", @@ -1390,13 +1390,13 @@ "UseDoubleRateDeinterlacing": "செயலிழக்கும்போது பிரேம் வீதத்தை இரட்டிப்பாக்குங்கள்", "LabelMaxMuxingQueueSizeHelp": "அனைத்து ஸ்ட்ரீம்களும் தொடங்கும் வரை காத்திருக்கும் போது, இடையகப்படுத்தக்கூடிய பாக்கெட்டுகளின் அதிகபட்ச எண்ணிக்கை. FFmpeg பதிவுகளில் \"அவுட்புட் ஸ்ட்ரீமிற்காக பல பாக்கெட்டுகள் இடையகப்படுத்தப்பட்டுள்ளன\" என்ற பிழையை நீங்கள் இன்னும் சந்தித்தால் அதை அதிகரிக்க முயற்சிக்கவும். பரிந்துரைக்கப்பட்ட மதிப்பு 2048 ஆகும்.", "LabelMaxMuxingQueueSize": "அதிகபட்ச மக்ஸிங் வரிசை அளவு", - "LabelTonemappingParamHelp": "டோன் மேப்பிங் வழிமுறையை டியூன் செய்யுங்கள். பரிந்துரைக்கப்பட்ட மற்றும் இயல்புநிலை மதிப்புகள் NaN ஆகும். பொதுவாக அதை காலியாக விடவும்.", + "LabelTonemappingParamHelp": "டோன் மேப்பிங் அல்காரிதத்தை டியூன் செய்யவும். பொதுவாக அதை காலியாக விடவும்.", "LabelTonemappingParam": "டோன் மேப்பிங் அளவுரு", - "LabelTonemappingPeakHelp": "இந்த மதிப்புடன் சமிக்ஞை / பெயரளவு / குறிப்பு உச்சத்தை மேலெழுதவும். காட்சி மெட்டாடேட்டாவில் உட்பொதிக்கப்பட்ட உச்ச தகவல் நம்பகத்தன்மையற்றதாக இருக்கும்போது அல்லது குறைந்த வரம்பிலிருந்து அதிக வரம்பிற்கு டோன் மேப்பிங் செய்யும்போது பயனுள்ளதாக இருக்கும். பரிந்துரைக்கப்பட்ட மற்றும் இயல்புநிலை மதிப்புகள் 100 மற்றும் 0 ஆகும்.", + "LabelTonemappingPeakHelp": "உள்ளீட்டு சமிக்ஞைக்கான உட்பொதிக்கப்பட்ட மெட்டாடேட்டா மதிப்பை இந்த உச்ச மதிப்புடன் மேலெழுதவும். இயல்புநிலை மதிப்பு 100 (1000nit) ஆகும்.", "LabelTonemappingPeak": "டோன் மேப்பிங் உச்சம்", "LabelTonemappingThresholdHelp": "டோன் மேப்பிங் அல்காரிதம் அளவுருக்கள் ஒவ்வொரு காட்சிக்கும் நன்றாக வடிவமைக்கப்பட்டுள்ளன. காட்சி மாறியதா இல்லையா என்பதைக் கண்டறிய ஒரு வாசல் பயன்படுத்தப்படுகிறது. தற்போதைய ஃபிரேம் சராசரி பிரகாசத்திற்கும் தற்போதைய இயங்கும் சராசரிக்கும் இடையே உள்ள தூரம் ஒரு த்ரெஷோல்ட் மதிப்பை மீறினால், காட்சி சராசரி மற்றும் உச்ச பிரகாசத்தை மீண்டும் கணக்கிடுவோம். பரிந்துரைக்கப்பட்ட மற்றும் இயல்புநிலை மதிப்புகள் 0.8 மற்றும் 0.2 ஆகும்.", "LabelTonemappingThreshold": "டோன் மேப்பிங் வரம்பு", - "LabelTonemappingDesatHelp": "இந்த பிரகாசத்தின் அளவைத் தாண்டிய சிறப்பம்சங்களுக்கு தேய்மானத்தைப் பயன்படுத்துங்கள். அதிக அளவுரு, அதிக வண்ண தகவல்கள் பாதுகாக்கப்படும். இந்த அமைப்பு சூப்பர்-சிறப்பம்சங்களுக்கான இயற்கைக்கு மாறான வண்ணங்களைத் தடுக்க உதவுகிறது, அதற்கு பதிலாக (சுமூகமாக) வெள்ளை நிறமாக மாறுவதன் மூலம். இது வரம்பற்ற வண்ணங்களைப் பற்றிய தகவல்களைக் குறைக்கும் செலவில், படங்கள் மிகவும் இயல்பானதாக உணரவைக்கும். பரிந்துரைக்கப்பட்ட மற்றும் இயல்புநிலை மதிப்புகள் 0 மற்றும் 0.5 ஆகும்.", + "LabelTonemappingDesatHelp": "இந்த பிரகாச அளவை மீறும் ஹைலைட்டுகளுக்கு நிறைவுறாத்தன்மையைப் பயன்படுத்தவும். பரிந்துரைக்கப்பட்ட மதிப்பு 0 (முடக்கு).", "LabelTonemappingDesat": "டோன் மேப்பிங் சேமிக்கப்பட்டது", "TonemappingRangeHelp": "வெளியீட்டு வண்ண வரம்பைத் தேர்ந்தெடுக்கவும். ஆட்டோ என்பது உள்ளீட்டு வரம்பைப் போன்றது.", "LabelTonemappingRange": "டோன் மேப்பிங் சரகம்", @@ -1470,14 +1470,14 @@ "RemuxHelp2": "முற்றிலும் இழப்பற்ற ஊடகத் தரத்துடன் ரீமக்ஸ் மிகக் குறைந்த செயலாக்க சக்தியைப் பயன்படுத்துகிறது.", "RemuxHelp1": "மீடியா பொருந்தாத கோப்பு கொள்கலனில் (MKV, AVI, WMV போன்றவை) உள்ளது, ஆனால் வீடியோ ஸ்ட்ரீம் மற்றும் ஆடியோ ஸ்ட்ரீம் இரண்டும் சாதனத்துடன் இணக்கமாக உள்ளன. சாதனத்திற்கு அனுப்பப்படுவதற்கு முன்பு மீடியா பறக்காமல் இழப்பின்றி மீண்டும் தொகுக்கப்படும்.", "Remuxing": "ரீமக்ஸ்", - "AspectRatioFill": "நிரப்பு", - "AspectRatioCover": "உறை", + "AspectRatioFill": "நீட்டிக்கவும்", + "AspectRatioCover": "பெரிதாக்கு", "PluginFromRepo": "{1} களஞ்சியத்திலிருந்து {0}", "LabelUDPPortRangeHelp": "யுடிபி இணைப்புகளை உருவாக்கும்போது இந்த போர்ட் வரம்பைப் பயன்படுத்த ஜெல்லிஃபின் கட்டுப்படுத்தவும். (இயல்புநிலை 1024 - 65535).
குறிப்பு: சில செயல்பாடுகளுக்கு இந்த வரம்பிற்கு வெளியே இருக்கும் நிலையான துறைமுகங்கள் தேவைப்படுகின்றன.", "LabelUDPPortRange": "UDP தொடர்பு வரம்பு", "LabelSSDPTracingFilterHelp": "உள்நுழைந்த SSDP போக்குவரத்தை வடிகட்ட விருப்ப ஐபி முகவரி.", "LabelSSDPTracingFilter": "SSDP வடிகட்டி", - "LabelPublishedServerUriHelp": "ஜெல்லிஃபின் பயன்படுத்தும் URI ஐ இடைமுகம் அல்லது கிளையன்ட் ஐபி முகவரியின் அடிப்படையில் மேலெழுதவும்.", + "LabelPublishedServerUriHelp": "இடைமுகம் அல்லது கிளையன்ட் ஐபி முகவரியின் அடிப்படையில் ஜெல்லிஃபின் பயன்படுத்தும் URI ஐ மேலெழுதவும். எடுத்துக்காட்டாக: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, அல்லது all=https://jellyfin.example.com", "LabelPublishedServerUri": "வெளியிடப்பட்ட சேவையக URI கள்", "LabelIsForced": "கட்டாயப்படுத்தப்பட்டது", "LabelHDHomerunPortRangeHelp": "இந்த மதிப்பிற்கு HDHomeRun UDP போர்ட் வரம்பைக் கட்டுப்படுத்துகிறது. (இயல்புநிலை 1024 - 65535).", @@ -1676,9 +1676,9 @@ "MediaInfoVideoRangeType": "வீடியோ வரம்பு வகை", "LabelVideoRangeType": "வீடியோ வரம்பு வகை", "VideoRangeTypeNotSupported": "வீடியோவின் வரம்பு வகை ஆதரிக்கப்படவில்லை", - "LabelVppTonemappingContrastHelp": "VPP tone மேப்பிங்கில் கான்ட்ராஸ்ட் ஆதாயத்தைப் பயன்படுத்தவும். பரிந்துரைக்கப்பட்ட மற்றும் இயல்புநிலை மதிப்புகள் இரண்டும் 1 ஆகும்.", - "LabelVppTonemappingBrightnessHelp": "VPP டோன் மேப்பிங்கில் பிரைட்னஸ் ஆதாயத்தை பயன்படுத்தவும். பரிந்துரைக்கப்பட்ட மற்றும் இயல்புநிலை மதிப்புகள் 16 மற்றும் 0 ஆகும்.", - "EnableSplashScreen": "ஸ்பிளாஸ் திரையை இயக்கவும்", + "LabelVppTonemappingContrastHelp": "VPP டோன் மேப்பிங்கில் கான்ட்ராஸ்ட் ஆதாயத்தைப் பயன்படுத்தவும். பரிந்துரைக்கப்பட்ட மதிப்பு 1 ஆகும்.", + "LabelVppTonemappingBrightnessHelp": "VPP டோன் மேப்பிங்கில் பிரகாசக் குறைப்பைப் பயன்படுத்தவும். பரிந்துரைக்கப்பட்ட மதிப்பு 16 ஆகும்.", + "EnableSplashScreen": "ஸ்பிளாஸ் திரை படத்தை இயக்கு", "ScreenResolution": "திரை அளவு", "RememberSubtitleSelectionsHelp": "சப்டைட்டில் டிராக்கை கடைசி வீடியோவுக்கு மிக நெருக்கமான பொருத்தமாக அமைக்க முயற்சிக்கவும்.", "RememberSubtitleSelections": "முந்தைய உருப்படியின் அடிப்படையில் வசன வரிகளை அமைக்கவும்", @@ -1691,7 +1691,7 @@ "IgnoreDts": "DTS புறக்கணிக்கவும்", "LabelThrottleDelaySecondsHelp": "டிரான்ஸ்கோடர் த்ரோட்டில் செய்த பிறகு உள்ள நேரத்தை இது குறிக்கிறது. நேரத்தின் அளவு அதிகமாக இருக்கும் பட்சத்தில் செயல்பாடு ஆரோக்கியமாக இருக்கும். த்ரோட்டில் செயல்பாட்டில் இருந்தால் மட்டுமே இது வேலை செய்யும்.", "LabelSegmentKeepSecondsHelp": "கிளையன்ட் பதிவிறக்கம் செய்த பிறகு, எந்தப் பகுதிகளை வைத்திருக்க வேண்டும் என்பதை நொடிகளில் நேரம். பிரிவு நீக்கம் இயக்கப்பட்டிருந்தால் மட்டுமே வேலை செய்யும்.", - "LabelDummyChapterDurationHelp": "போலி அத்தியாயங்களுக்கு இடையிலான இடைவெளி. போலி அத்தியாய உருவாக்கத்தை முடக்க 0 என அமைக்கவும். இதை மாற்றுவது ஏற்கனவே உள்ள போலி அத்தியாயங்களில் எந்த விளைவையும் ஏற்படுத்தாது.", + "LabelDummyChapterDurationHelp": "போலி அத்தியாயங்களுக்கு இடையிலான இடைவெளி வினாடிகளில். போலி அத்தியாய உருவாக்கத்தை முடக்க 0 என அமைக்கவும். இதை மாற்றுவது ஏற்கனவே உள்ள போலி அத்தியாயங்களில் எந்த விளைவையும் ஏற்படுத்தாது.", "MessageRepositoryInstallDisclaimer": "எச்சரிக்கை: மூன்றாம் தரப்பு செருகுநிரல் களஞ்சியத்தை நிறுவுவது அபாயங்களைக் கொண்டுள்ளது. இது நிலையற்ற அல்லது தீங்கிழைக்கும் குறியீட்டைக் கொண்டிருக்கலாம் மற்றும் எந்த நேரத்திலும் மாறலாம். நீங்கள் நம்பும் நபர்களிடம் மட்டுமே களஞ்சியங்களை நிறுவவும்.", "Featurette": "அம்சம்", "LabelTonemappingMode": "டோன் மேப்பிங் பயன்முறை", @@ -1764,7 +1764,7 @@ "LogLevel.Critical": "முக்கியம்", "NotificationsMovedMessage": "அறிவிப்புகள் செயல்பாடு Webhook செருகுநிரலுக்கு நகர்த்தப்பட்டது.", "LabelEnableLUFSScanHelp": "டிராக்குகள் முழுவதும் சமமான ஒலியைப் பெற செயலிகள் ஆடியோ பிளேபேக்கை இயல்பாக்கலாம். இது லைப்ரரி ஸ்கேன்களில் தாமதத்தை ஏற்படுத்தும் மற்றும் அதிக கணினி வளங்களை உபயோக படுத்தும் என்பதை நினைவில் கொள்ளவும்.", - "LabelParallelImageEncodingLimitHelp": "இணையாக இயக்க அனுமதிக்கப்படும் பட குறியாக்கங்களின் அதிகபட்ச எண்ணிக்கை. இதை 0 ஆக அமைப்பது உங்கள் கணினியின் முக்கிய எண்ணிக்கையின் அடிப்படையில் வரம்பை தேர்ந்தெடுக்கும்.", + "LabelParallelImageEncodingLimitHelp": "இணையாக இயங்க அனுமதிக்கப்பட்ட அதிகபட்ச பட குறியாக்கங்கள். இதை காலியாக விடுவது உங்கள் கணினியின் மைய எண்ணிக்கையின் அடிப்படையில் ஒரு வரம்பைத் தேர்ந்தெடுக்கும்.", "MessageRenameMediaFolder": "மீடியா லைப்ரரிக்கு மறுபெயரிடுவது அனைத்து மெட்டாடேட்டாவையும் இழக்க நேரிடும், எச்சரிக்கையுடன் தொடரவும்.", "SubtitleRed": "சிவப்பு", "SubtitleWhite": "வெள்ளை", @@ -1785,7 +1785,7 @@ "AllowSegmentDeletionHelp": "கிளையன்ட் பதிவிறக்கிய பிறகு பழைய பகுதிகளை நீக்கவும். இது முழு டிரான்ஸ்கோடட் கோப்பையும் வட்டில் சேமிப்பதைத் தடுக்கிறது. பிளேபேக் சிக்கல்களை நீங்கள் சந்தித்தால் இதை முடக்கவும்.", "LabelThrottleDelaySeconds": "செறிவூட்டு", "LabelSegmentKeepSeconds": "பகுதிகளை வைத்திருக்க வேண்டிய நேரம்", - "SelectAudioNormalizationHelp": "Track Gain - ஒவ்வொரு ஒலி அமைப்புகளுக்கும் சத்தத்தின் அளவை நிறுவுதல். Album Gain - ஒரு ஆல்பத்தில் உள்ள அனைத்து ஒலி அமைப்புகளுக்கும் ஒரே மாதிரியான சத்தத்தின் நிறுவுதல்.", + "SelectAudioNormalizationHelp": "டிராக் கெயின் - ஒவ்வொரு டிராக்கின் ஒலியளவையும் சரிசெய்கிறது, இதனால் அவை ஒரே சத்தத்துடன் பிளேபேக் ஆகும். ஆல்பம் கெயின் - ஆல்பத்தின் டைனமிக் வரம்பைப் பராமரிக்கும் வகையில், ஒரு ஆல்பத்தில் உள்ள அனைத்து டிராக்குகளின் ஒலியளவையும் மட்டும் சரிசெய்கிறது. \"ஆஃப்\" மற்றும் பிற விருப்பங்களுக்கு இடையில் மாறுவதற்கு தற்போதைய பிளேபேக்கை மறுதொடக்கம் செய்ய வேண்டும்.", "LabelAlbumGain": "ஆல்பத்தின் ஒலி அளவு வேறுபாடுகள்", "LabelSelectAudioNormalization": "ஒலி இயல்பாக்கம்", "AllowCollectionManagement": "சேகரிப்புகளை நிர்வகிக்க இந்தப் பயனரை அனுமதி", @@ -1871,7 +1871,7 @@ "LabelProcessPriority": "செயல்முறை முன்னுரிமை", "LabelQscale": "Qscale", "EnableTrueHdHelp": "உங்கள் சாதனம் TrueHD ஐ ஆதரித்தால் அல்லது இணக்கமான ஆடியோ ரிசீவருடன் இணைக்கப்பட்டிருந்தால் மட்டுமே இயக்கவும், இல்லையெனில் அது பிளேபேக் தோல்வியை ஏற்படுத்தலாம்.", - "LibraryScanFanoutConcurrencyHelp": "லைப்ரரி ஸ்கேன்களின் போது இணையான பணிகளின் அதிகபட்ச எண்ணிக்கை. இதை 0 ஆக அமைப்பது உங்கள் கணினியின் முக்கிய எண்ணிக்கையின் அடிப்படையில் வரம்பை தேர்ந்தெடுக்கும். எச்சரிக்கை: இந்த எண்ணை மிக அதிகமாக அமைப்பதால் பிணைய கோப்பு முறைமைகளில் சிக்கல்கள் ஏற்படலாம்; நீங்கள் சிக்கல்களை எதிர்கொண்டால், இந்த எண்ணைக் குறைக்கவும்.", + "LibraryScanFanoutConcurrencyHelp": "நூலக ஸ்கேன்களின் போது அதிகபட்ச இணையான பணிகளின் எண்ணிக்கை. இதை காலியாக விடுவது உங்கள் கணினியின் மைய எண்ணிக்கையின் அடிப்படையில் ஒரு வரம்பைத் தேர்ந்தெடுக்கும். எச்சரிக்கை: இந்த எண்ணை மிக அதிகமாக அமைப்பது பிணைய கோப்பு முறைமைகளில் சிக்கல்களை ஏற்படுத்தக்கூடும்; நீங்கள் சிக்கல்களை எதிர்கொண்டால் இந்த எண்ணைக் குறைக்கவும்.", "PlaylistError.CreateFailed": "பிளேலிஸ்ட்டை உருவாக்குவதில் பிழை", "PlaylistError.AddFailed": "பிளேலிஸ்ட்டில் சேர்ப்பதில் பிழை", "SaveLyricsIntoMediaFolders": "மீடியா கோப்புறைகளில் பாடல் வரிகளைச் சேமிக்கவும்", @@ -1897,12 +1897,182 @@ "HeaderVideoAdvanced": "வீடியோ மேம்பட்டது", "Lyrics": "பாடல் வரிகள்", "ConfirmDeleteLyrics": "இந்தப் பாடல் வரிகளை நீக்குவது கோப்பு முறைமை மற்றும் உங்கள் மீடியா லைப்ரரி இரண்டிலிருந்தும் நீக்கப்படும். நீங்கள் நிச்சயமாக தொடர விரும்புகிறீர்களா?", - "LabelTrickplayAccelEncodingHelp": "தற்போது QSV மற்றும் VAAPI இல் மட்டுமே கிடைக்கிறது, இந்த விருப்பம் மற்ற வன்பொருள் முடுக்க முறைகளில் எந்த விளைவையும் ஏற்படுத்தாது.", + "LabelTrickplayAccelEncodingHelp": "தற்போது QSV, VA-API, VideoToolbox மற்றும் RKMPP ஆகியவற்றில் மட்டுமே கிடைக்கிறது, இந்த விருப்பம் மற்ற வன்பொருள் முடுக்கம் முறைகளில் எந்த விளைவையும் ஏற்படுத்தாது.", "LabelTrickplayAccelEncoding": "வன்பொருள் துரிதப்படுத்தப்பட்ட MJPEG குறியாக்கத்தை இயக்கவும்", "PlaylistPublic": "பொது அணுகலை அனுமதிக்கவும்", "PlaylistPublicDescription": "உள்நுழைந்துள்ள எவரும் இந்த பிளேலிஸ்ட்டைப் பார்க்க அனுமதிக்கவும்.", "ErrorDeletingLyrics": "சேவையகத்திலிருந்து பாடல் வரிகளை நீக்குவதில் பிழை. ஜெல்லிஃபின் மீடியா கோப்புறையில் எழுதுவதற்கான அணுகலைப் பெற்றுள்ளதா என்பதைச் சரிபார்த்து, மீண்டும் முயற்சிக்கவும்.", "HeaderNoLyrics": "பாடல் வரிகள் எதுவும் கிடைக்கவில்லை", "HeaderLyricDownloads": "பாடல் வரிகள் பதிவிறக்கம்", - "AllowFmp4TranscodingContainerHelp": "HEVC மற்றும் HDR பதிவுகளை செயல்படுத்துவதற்க்கு இந்த டியூனரிற்கு fMP4 ட்ரான்ஸ்கோடிங் கண்டெய்னரை அனுமதிக்கவும். எல்லா விதமான டியூனர்களும் இந்த கண்டெய்னருடன் ஒத்துவராது. தரவுகளை செயல்படுத்துவதில் ஏதேனும் தடங்கல் ஏற்பட்டால் இதை ஆஃப் செய்யவும்." + "AllowFmp4TranscodingContainerHelp": "HEVC மற்றும் HDR பதிவுகளை செயல்படுத்துவதற்க்கு இந்த டியூனரிற்கு fMP4 ட்ரான்ஸ்கோடிங் கண்டெய்னரை அனுமதிக்கவும். எல்லா விதமான டியூனர்களும் இந்த கண்டெய்னருடன் ஒத்துவராது. தரவுகளை செயல்படுத்துவதில் ஏதேனும் தடங்கல் ஏற்பட்டால் இதை ஆஃப் செய்யவும்.", + "Retry": "மீண்டும் முயற்சிக்கவும்", + "AllowStreamSharingHelp": "ட்யூனரிலிருந்து mpegts ஸ்ட்ரீமை நகலெடுத்து, இந்த நகல் ஸ்ட்ரீமை அதன் வாடிக்கையாளர்களுடன் பகிர்ந்து கொள்ள ஜெல்லிஃபினை அனுமதிக்கவும். ட்யூனருக்கு மொத்த ஸ்ட்ரீம் எண்ணிக்கை வரம்பு இருக்கும்போது இது பயனுள்ளதாக இருக்கும், ஆனால் பிளேபேக் சிக்கல்களையும் ஏற்படுத்தக்கூடும்.", + "Alternate": "மாற்று", + "MessageRestoreSuccess": "மீட்டமைத்தல் வெற்றிகரமாக முடிந்தது", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "டிரான்ஸ்கோடிங் தூண்டப்படும்போது அனைத்து வசனங்களையும் எரிக்கவும். இது டிரான்ஸ்கோடிங் வேகத்தைக் குறைப்பதன் மூலம் டிரான்ஸ்கோடிங்கிற்குப் பிறகு வசன ஒத்திசைவை உறுதி செய்கிறது.", + "AllowTonemappingSoftwareHelp": "டோன்-மேப்பிங், அசல் காட்சியைப் பிரதிநிதித்துவப்படுத்துவதற்கு மிக முக்கியமான தகவலான பட விவரங்கள் மற்றும் வண்ணங்களைப் பராமரிக்கும் அதே வேளையில், ஒரு வீடியோவின் டைனமிக் வரம்பை HDR இலிருந்து SDR ஆக மாற்றும். தற்போது 10பிட் HDR10, HLG மற்றும் DoVi வீடியோக்களுடன் மட்டுமே இயங்குகிறது.", + "AlwaysRemuxMp3AudioFilesHelp": "உங்கள் உலாவி நேர முத்திரைகளை தவறாகக் கணக்கிடும் கோப்புகள் உங்களிடம் இருந்தால், இதை ஒரு தீர்வாக இயக்கவும்.", + "DeleteRepositoryConfirmation": "இந்த களஞ்சியத்தை நீக்க விரும்புகிறீர்களா?", + "DisableVbrAudioEncodingHelp": "இந்த கிளையண்டிற்கு VBR உடன் ஆடியோவை என்கோட் செய்வதிலிருந்து சர்வரைத் தடுக்கவும்.", + "FallbackMaxStreamingBitrateHelp": "ffprobe மூல ஸ்ட்ரீம் பிட்ரேட்டை தீர்மானிக்க முடியாதபோது, அதிகபட்ச ஸ்ட்ரீமிங் பிட்ரேட் ஒரு குறைப்பாகப் பயன்படுத்தப்படுகிறது. இது வாடிக்கையாளர்கள் அதிகப்படியான டிரான்ஸ்கோடிங் பிட்ரேட்டைக் கோருவதைத் தடுக்க உதவுகிறது, இது பிளேயரை செயலிழக்கச் செய்து என்கோடரை ஓவர்லோட் செய்யக்கூடும்.", + "LabelCustomTagDelimitersHelp": "தனித்தனி குறிச்சொற்களுக்கான வரம்புக் குறிகளாகக் கருதப்பட வேண்டிய எழுத்துக்கள்.", + "LabelDelimiterWhitelist": "வரம்பு நீக்கி அனுமதிப்பட்டியல்", + "LabelDelimiterWhitelistHelp": "குறிச்சொல் பிரிப்பிலிருந்து விலக்கப்பட வேண்டிய உருப்படிகள். ஒரு வரிக்கு ஒரு உருப்படி.", + "LabelDevice": "சாதனம்", + "LabelLyricDownloaders": "பாடல் வரி பதிவிறக்கிகள்", + "LabelQsvDeviceHelp": "பல-GPU அமைப்பில் Intel QSVக்கான சாதனத்தைக் குறிப்பிடவும். Linux-ல், இது ரெண்டர் நோட், எ.கா., /dev/dri/renderD128. Windows-ல், இது 0 இலிருந்து தொடங்கும் சாதனக் குறியீடு. நீங்கள் என்ன செய்கிறீர்கள் என்று தெரியாவிட்டால் காலியாக விடவும்.", + "LabelRepository": "களஞ்சியம்", + "LabelRestore": "மீட்டமை", + "LabelSaveTrickplayLocallyHelp": "டிரிக்பிளே படங்களை மீடியா கோப்புறைகளில் சேமிப்பது, எளிதாக இடம்பெயர்வு மற்றும் அணுகலுக்காக அவற்றை உங்கள் மீடியாவிற்கு அடுத்ததாக வைக்கும்.", + "LabelScreensaverTimeHelp": "ஸ்கிரீன்சேவரைத் தொடங்க தேவையான செயலற்ற நேரத்தின் அளவு வினாடிகளில்.", + "LabelSubtitleStyling": "வசன நடை", + "LabelSelectPreferredTranscodeVideoCodec": "விருப்பமான டிரான்ஸ்கோட் வீடியோ கோடெக்", + "LibraryInvalidItemIdError": "நூலகம் தவறான நிலையில் உள்ளது மற்றும் திருத்த முடியாது. நீங்கள் ஒரு பிழையை எதிர்கொள்ள நேரிடலாம்: தரவுத்தளத்தில் உள்ள பாதை கோப்பு முறைமையில் சரியான பாதை அல்ல.", + "MediaSegmentProvidersHelp": "உங்களுக்கு விருப்பமான ஊடகப் பிரிவு வழங்குநர்களை முன்னுரிமையின் வரிசையில் இயக்கி தரவரிசைப்படுத்துங்கள்.", + "MessageCancelTimerError": "டைமரை ரத்துசெய்யும்போது பிழை ஏற்பட்டது", + "MessageRestoreDisclaimer": "எச்சரிக்கை: நீங்கள் முந்தைய காப்புப்பிரதியிலிருந்து மீட்டெடுக்கப் போகிறீர்கள். செயல்முறை முடியும் வரை உங்கள் சேவையகம் பயன்படுத்த முடியாததாகிவிடும், மேலும் காப்புப்பிரதிக்குப் பிறகு உருவாக்கப்படும் எந்த புதிய தரவும் இழக்கப்படும்.", + "MoveToBottom": "கீழே நகர்த்து", + "NativeSubtitleStylingHelp": "சில சாதனங்களில் வசன நடை வேலை செய்யாது. இருப்பினும், இது எந்த செயல்திறன் செலவுகளையும் கொண்டிருக்கவில்லை.", + "PasswordMissingSaveError": "புதிய கடவுச்சொல் காலியாக இருக்கக்கூடாது.", + "PluginDisableError": "செருகுநிரலை முடக்கும்போது பிழை ஏற்பட்டது.", + "PluginEnableError": "செருகுநிரலை இயக்கும்போது பிழை ஏற்பட்டது.", + "PluginLoadConfigError": "செருகுநிரல் உள்ளமைவு பக்கங்களைப் பெறும்போது பிழை ஏற்பட்டது.", + "ReadInputAtNativeFramerateHelp": "இந்த விருப்பத்தை இயக்குவது சில சிக்கல்களைத் தீர்க்கக்கூடும், எ.கா. நேரடி ஒளிபரப்புகள் முன்கூட்டியே நிறுத்தப்படுவது.", + "RenderPgsSubtitleHelp": "கிளையன்ட், பர்ன்டு இன் சப்டைட்டில்களைப் பயன்படுத்துவதற்குப் பதிலாக PGS சப்டைட்டில்களை ரெண்டர் செய்ய வேண்டுமா என்பதைத் தீர்மானிக்கவும். இது கிளையன்ட்-சைட் ரெண்டரிங் செயல்திறனுக்கு ஈடாக சர்வர்-சைட் டிரான்ஸ்கோடிங்கைத் தவிர்க்கலாம்.", + "RetryWithGlobalSearch": "உலகளாவிய தேடலுடன் மீண்டும் முயற்சிக்கவும்", + "Reset": "மீட்டமைக்கவும்", + "RepositoriesPageLoadError": "களஞ்சியங்களை ஏற்றுவதில் தோல்வி", + "SelectPreferredTranscodeVideoAudioCodecHelp": "வீடியோ உள்ளடக்கத்திற்கு டிரான்ஸ்கோட் செய்ய விருப்பமான ஆடியோ கோடெக்கைத் தேர்ந்தெடுக்கவும். விருப்பமான கோடெக் ஆதரிக்கப்படவில்லை என்றால், சேவையகம் அடுத்து கிடைக்கக்கூடிய சிறந்த கோடெக்கைப் பயன்படுத்தும்.", + "StorageType.CDRom": "சிடி-ரோம்", + "StorageType.Fixed": "சரி செய்யப்பட்டது", + "StorageType.Network": "வலைப்பின்னல்", + "StorageType.NoRootDirectory": "ரூட் கோப்பகம் இல்லை", + "StorageType.Ram": "ரேம்", + "StorageType.Removable": "நீக்கக்கூடியது", + "StorageType.Unknown": "தெரியவில்லை", + "Success": "வெற்றி", + "LabelTrickplayKeyFrameOnlyExtractionHelp": "குறைவான துல்லியமான நேரத்துடன் குறிப்பிடத்தக்க வேகமான செயலாக்கத்திற்கு மட்டுமே கீ பிரேம்களைப் பிரித்தெடுக்கவும். உள்ளமைக்கப்பட்ட வன்பொருள் டிகோடர் இந்த பயன்முறையை ஆதரிக்கவில்லை என்றால், அதற்கு பதிலாக மென்பொருள் டிகோடரைப் பயன்படுத்தும்.", + "LogLoadFailure": "பதிவு கோப்பை ஏற்ற முடியவில்லை. அது இன்னும் செயலில் எழுதப்பட்டிருக்கலாம்.", + "LabelAlwaysRemuxMp3AudioFiles": "எப்போதும் MP3 ஆடியோ கோப்புகளை ரீமக்ஸ் செய்யவும்", + "PreferNonstandardArtistsTag": "கிடைத்தால், கலைஞர்கள் குறிச்சொல்லை விரும்புங்கள்", + "SettingsPageLoadError": "அமைப்புகள் பக்கத்தை ஏற்ற முடியவில்லை", + "LabelTrickplayKeyFrameOnlyExtraction": "முக்கிய சட்டகங்களிலிருந்து மட்டுமே படங்களை உருவாக்கவும்", + "ReadInputAtNativeFramerate": "உள்ளீட்டை நேட்டிவ் பிரேம் வீதத்தில் படிக்கவும்", + "AlwaysBurnInSubtitleWhenTranscoding": "டிரான்ஸ்கோடிங் செய்யும்போது எப்போதும் வசன வரிகளில் எழுது", + "CustomSplashScreenSize": "தனிப்பயன் படங்கள் குறைந்தபட்சம் 1920x1080 அளவில் 16x9 தோற்ற விகிதத்தில் இருக்க வேண்டும்.", + "DeleteCustomImage": "தனிப்பயன் படத்தை நீக்கு", + "MessageCancelSeriesTimerError": "தொடர் டைமரை ரத்து செய்யும் போது பிழை ஏற்பட்டது", + "DateModified": "திருத்தப்பட்ட தேதி", + "ImageUploadCancelled": "பட பதிவேற்றம் ரத்துசெய்யப்பட்டது", + "ImageUploadFailed": "படத்தைப் பதிவேற்ற முடியவில்லை", + "EnableHi10p": "H.264 உயர் 10 சுயவிவரத்தை இயக்கு", + "EnableHi10pHelp": "H.264 10-பிட் வீடியோக்களை டிரான்ஸ்கோட் செய்வதைத் தவிர்க்க இயக்கவும். வீடியோ வெற்று பிரேம்களைக் காட்டினால் இந்த விருப்பத்தை முடக்கவும்.", + "HeaderAudioAdvanced": "மேம்பட்ட ஆடியோ", + "HeaderPreviewLyrics": "முன்னோட்டப் பாடல் வரிகள்", + "LabelAllowStreamSharing": "ஸ்ட்ரீம் பகிர்வை அனுமதி", + "LabelDropLyricsHere": "பாடல் வரிகளை இங்கே விடுங்கள், அல்லது உலவ கிளிக் செய்யவும்.", + "LabelFallbackMaxStreamingBitrate": "ஃபால்பேக் அதிகபட்ச ஸ்ட்ரீம் பிட்ரேட் (Mbps)", + "LabelAllowFmp4TranscodingContainer": "fMP4 டிரான்ஸ்கோடிங் கண்டெய்னரை அனுமதிக்கவும்", + "LabelAlwaysRemuxFlacAudioFiles": "எப்போதும் FLAC ஆடியோ கோப்புகளை மறுதொடக்கம் செய்யவும்", + "LabelSelectPreferredTranscodeVideoAudioCodec": "வீடியோ பிளேபேக்கில் விருப்பமான டிரான்ஸ்கோட் ஆடியோ கோடெக்", + "MessageSplitVersionsError": "பதிப்புகளைப் பிரிக்கும்போது பிழை ஏற்பட்டது", + "MediaSegmentType.Outro": "அவுட்ரோ", + "MoviesAndShows": "திரைப்படங்கள் மற்றும் நிகழ்ச்சிகள்", + "PluginsLoadError": "செருகுநிரல்களை ஏற்றும்போது பிழை ஏற்பட்டது.", + "PluginUninstallError": "செருகுநிரலை நிறுவல் நீக்கும்போது பிழை ஏற்பட்டது.", + "HeaderBackups": "காப்புப்பிரதிகள்", + "MessageWaitingForServer": "சேவையகத்திற்காக காத்திருக்கிறது...", + "ConfirmDeleteRepository": "களஞ்சியத்தை நீக்கவா?", + "Create": "உருவாக்கு", + "HeaderNextEpisode": "அடுத்த அத்தியாயம்", + "HeaderNextVideo": "அடுத்த காணொளி", + "PreviewLyrics": "முன்னோட்டப் பாடல் வரிகள்", + "SelectPreferredTranscodeVideoCodecHelp": "டிரான்ஸ்கோட் செய்ய விருப்பமான வீடியோ கோடெக்கைத் தேர்ந்தெடுக்கவும். விருப்பமான கோடெக் ஆதரிக்கப்படவில்லை என்றால், சேவையகம் அடுத்து கிடைக்கக்கூடிய சிறந்த கோடெக்கைப் பயன்படுத்தும்.", + "StreamCountExceedsLimit": "ஸ்ட்ரீம்களின் எண்ணிக்கை வரம்பை மீறுகிறது", + "TranscodingLoadError": "டிரான்ஸ்கோடிங் அமைப்புகளை ஏற்ற முடியவில்லை", + "AutoSubtitleStylingHelp": "இந்த பயன்முறை உங்கள் சாதன வகையைப் பொறுத்து சொந்த மற்றும் தனிப்பயன் வசன ஸ்டைலிங் வழிமுறைகளுக்கு இடையில் தானாகவே மாறும்.", + "Custom": "தனிப்பயன்", + "CustomSubtitleStylingHelp": "வசன வரிகள் ஸ்டைலிங் பெரும்பாலான சாதனங்களில் வேலை செய்யும், ஆனால் கூடுதல் செயல்திறன் செலவுகளுடன் வருகிறது.", + "HeaderPageNotFound": "பக்கம் கிடைக்கவில்லை", + "UseCustomTagDelimiters": "தனிப்பயன் டேக் பிரிப்பானைப் பயன்படுத்தவும்", + "LabelNoChangelog": "இந்த வெளியீட்டிற்கு எந்த மாற்றப் பதிவும் வழங்கப்படவில்லை.", + "RenderPgsSubtitle": "பரிசோதனை PGS வசன ரெண்டரிங்", + "LabelEnablePlugin": "செருகுநிரலை இயக்கு", + "LabelIsSynced": "ஒத்திசைக்கப்பட்டது", + "LabelMediaSegmentsType": "{0} பிரிவுகள்", + "LabelAudioTagSettings": "ஆடியோ டேக் அமைப்புகள்", + "ReplaceTrickplayImages": "ஏற்கனவே உள்ள ட்ரிக்பிளே படங்களை மாற்றவும்", + "SearchForLyrics": "பாடல் வரிகளைத் தேடு", + "LabelScreensaverTime": "திரை சேமிப்பான் நேரம்", + "UseCustomTagDelimitersHelp": "கலைஞர்/வகை குறிச்சொற்களை தனிப்பயன் எழுத்துக்களுடன் பிரிக்கவும்.", + "LimitSegmentLength": "குறுகிய HLS பிரிவுகளைப் பயன்படுத்தவும்", + "LimitSegmentLengthHelp": "இந்த விருப்பத்தை இயக்குவது, webOS TVகள் போன்ற சில சாதனங்களில் தேடும் போது HLS பிளேயர் தொங்குவதைத் தடுக்க உதவும்.", + "LabelGroupShowsIntoCollections": "தொகுப்புகளில் குழு நிகழ்ச்சிகள்", + "LabelGroupShowsIntoCollectionsHelp": "காட்சிப் பட்டியல்களைக் காண்பிக்கும் போது, தொகுப்பில் உள்ள நிகழ்ச்சிகள் ஒரு தொகுக்கப்பட்ட உருப்படியாகக் காண்பிக்கப்படும்.", + "MediaSegmentAction.AskToSkip": "தவிர்க்கக் கேளுங்கள்", + "MediaSegmentSkipPrompt": "{0} ஐத் தவிர்", + "CopyLogSuccess": "பதிவு உள்ளடக்கங்கள் வெற்றிகரமாக நகலெடுக்கப்பட்டன.", + "DownloadManager": "பதிவிறக்கங்கள்", + "HeaderMediaSegmentActions": "ஊடகப் பிரிவு நடவடிக்கைகள்", + "HeaderNewPlaylist": "புதிய பிளேலிஸ்ட்", + "NoLyricsSearchResultsFound": "பாடல் வரிகள் எதுவும் கிடைக்கவில்லை.", + "AndOtherArtists": "{0} மற்றும் {1} பிற கலைஞர்கள்.", + "LiveTVPageLoadError": "பதிவுகள் பக்கத்தை ஏற்ற முடியவில்லை", + "LyricDownloadersHelp": "உங்களுக்கு விருப்பமான பாடல் வரி பதிவிறக்கிகளை முன்னுரிமையின் வரிசையில் இயக்கி தரவரிசைப்படுத்துங்கள்.", + "MediaInfoRotation": "சுழற்சி", + "HeaderUploadLyrics": "பாடல் வரிகளைப் பதிவேற்றவும்", + "MessageRestoreInProgress": "மீட்டமைவு செயலில் உள்ளது", + "MetadataNfoLoadError": "மெட்டாடேட்டா NFO அமைப்புகளை ஏற்ற முடியவில்லை", + "MoveToTop": "மேலே நகர்த்து", + "Native": "பூர்வீகம்", + "PlaylistError.UpdateFailed": "பட்டியலைப் புதுப்பிப்பதில் பிழை", + "PluginLoadRepoError": "களஞ்சியத்திலிருந்து செருகுநிரல் விவரங்களைப் பெறும்போது பிழை ஏற்பட்டது.", + "PreferNonstandardArtistsTagHelp": "கிடைக்கும்போது, ARTIST குறிச்சொல்லுக்குப் பதிலாக, தரமற்ற ARTISTS குறிச்சொல்லைப் பயன்படுத்தவும்.", + "Regional": "பிராந்திய", + "UploadCustomImage": "தனிப்பயன் படத்தை பதிவேற்று", + "ViewSettings": "அமைப்புகளைக் காண்க", + "VideoCodecTagNotSupported": "வீடியோ கோடெக் டேக் ஆதரிக்கப்படவில்லை", + "AlwaysRemuxFlacAudioFilesHelp": "உங்கள் உலாவி இயக்க நிராகரிக்கும் கோப்புகள் இருந்தால் அல்லது தவறாக நேர முத்திரைகளைக் கணக்கிடும் இடத்தில் இருந்தால், இதை ஒரு தீர்வாக இயக்கவும்.", + "HeaderEditPlaylist": "பிளேலிஸ்ட்டைத் திருத்து", + "DisplayLoadError": "காட்சி உள்ளமைவு தரவை ஏற்றும்போது பிழை ஏற்பட்டது.", + "LabelDisableVbrAudioEncoding": "VBR ஆடியோ குறியாக்கத்தை முடக்கு", + "PageNotFound": "நீங்கள் தேடும் பக்கம் இதுவல்ல.", + "MediaSegmentAction.Skip": "தவிர்", + "MediaSegmentType.Commercial": "வணிகம்", + "MessageBackupDisclaimer": "உங்கள் நூலகத்தின் அளவைப் பொறுத்து, காப்புப்பிரதி செயல்முறை சிறிது நேரம் ஆகலாம்.", + "MessageBackupInProgress": "காப்புப்பிரதி எடுக்கப்படுகிறது", + "MetadataImagesLoadError": "மெட்டாடேட்டா அமைப்புகளை ஏற்ற முடியவில்லை", + "AlternateDVD": "மாற்று DVD", + "DeleteServerConfirmation": "இந்த சேவையகத்தை நீக்க விரும்புகிறீர்களா?", + "LabelMediaSegmentProviders": "ஊடகப் பிரிவு வழங்குநர்கள்", + "MediaSegmentAction.None": "யாரும் இல்லை", + "MediaSegmentType.Recap": "சிறுகதை", + "Anime": "அனிமே", + "LabelQsvDevice": "QSV சாதனம்", + "LabelSaveTrickplayLocally": "மீடியாவுக்கு அடுத்து ட்ரிக்பிளே படங்களைச் சேமிக்கவும்", + "MediaSegmentType.Intro": "அறிமுகம்", + "MediaSegmentType.Preview": "முன்னோட்டம்", + "MessageForgotPasswordPinReset": "கடவுச்சொல் மீட்டமைப்பை முடிக்க, இங்கே பின்னை உள்ளிடவும்", + "HeaderServerUnavailable": "சேவையகம் கிடைக்கவில்லை", + "HeaderUpdateRequired": "புதுப்பிப்பு தேவை", + "LabelDuration": "கால அளவு", + "ButtonLearnMore": "மேலும் அறிக", + "HeaderBackupsHelp": "தரவுத்தளம், மெட்டாடேட்டா, வசன வரிகள் மற்றும் ட்ரிக்பிளே ஆகியவற்றை உள்ளடக்கிய உங்கள் சேவையகத்தின் ஸ்னாப்ஷாட்களை உருவாக்கி மீட்டெடுக்கவும்.", + "ImageDeleteFailed": "படத்தை நீக்க முடியவில்லை", + "LabelProgramData": "நிரல் தரவு", + "LibraryNameInvalid": "நூலகப் பெயர் காலியாக இருக்கக்கூடாது.", + "ButtonCreateBackup": "காப்புப்பிரதியை உருவாக்கு", + "BackupsPageLoadError": "காப்புப் பிரதி பக்கத்தை ஏற்ற முடியவில்லை", + "HeaderAddLyrics": "பாடல் வரிகளைச் சேர்க்கவும்", + "LabelCustomTagDelimiters": "தனிப்பயன் டேக் பிரிப்பான்", + "LabelDatabase": "தரவுத்தளம்", + "LabelBackupsUnavailable": "காப்புப்பிரதிகள் எதுவும் கிடைக்கவில்லை", + "EditLyrics": "பாடல் வரிகளைத் திருத்து", + "LabelImageCache": "பட தற்காலிக சேமிப்பு", + "LabelInstalled": "நிறுவப்பட்டது", + "LabelNotInstalled": "நிறுவப்படவில்லை", + "LastActive": "கடைசியாகச் செயல்பட்டது", + "ConnectAnyway": "எப்படியும் இணை", + "HeaderServerMismatch": "சேவையகம் பொருந்தவில்லை", + "MessageServerMismatch": "நீங்கள் இணைக்கும் சேவையகம், இந்த முகவரியில் நீங்கள் முன்பு இணைத்த அதே சேவையகம் அல்ல. இது எதிர்பார்க்கப்பட்டால், தயவுசெய்து \"எப்படியும் இணை\" என்பதைத் தேர்ந்தெடுக்கவும். இல்லையெனில், உங்கள் இணைப்பு அல்லது சேவையகம் பாதிக்கப்படலாம்." } diff --git a/src/strings/te.json b/src/strings/te.json index 8957d7fbb..ee89bc7dd 100644 --- a/src/strings/te.json +++ b/src/strings/te.json @@ -28,7 +28,7 @@ "LabelSelectAudioChannels": "ఛానెల్‌లు", "LabelAllowedAudioChannels": "గరిష్టంగా అనుమతించబడిన ఆడియో ఛానెల్‌లు", "AllowHevcEncoding": "HEVC ఆకృతిలో ఎన్‌కోడింగ్‌ను అనుమతించండి", - "PreferFmp4HlsContainerHelp": "HLS కోసం డిఫాల్ట్ కంటైనర్‌గా fMP4 ను ఉపయోగించడానికి ఇష్టపడండి, మద్దతు ఉన్న పరికరాల్లో HEVC కంటెంట్‌ను ప్రత్యక్షంగా ప్రసారం చేయడం సాధ్యపడుతుంది.", + "PreferFmp4HlsContainerHelp": "హెచ్‌ఎల్‌ఎస్ కోసం ఎఫ్‌ఎంపి4 ను డిఫాల్ట్ కంటైనర్‌గా ఉపయోగించడానికి ఇష్టపడండి, దీని వలన మద్దతు ఉన్న పరికరాల్లో హెచ్‌ఈవీసీ మరియు ఎవి1 కంటెంట్‌ను డైరెక్ట్ స్ట్రీమ్ చేయడం సాధ్యపడుతుంది.", "PreferFmp4HlsContainer": "FMP4-HLS మీడియా కంటైనర్‌కు ప్రాధాన్యత ఇవ్వండి", "LabelSyncPlayInfo": "సమకాలీకరణ సమాచారం", "LabelOriginalMediaInfo": "అసలు మీడియా సమాచారం", @@ -41,17 +41,17 @@ "RemuxHelp2": "పూర్తిగా నష్టపోని మీడియా నాణ్యతతో రీమక్స్ చాలా తక్కువ ప్రాసెసింగ్ శక్తిని ఉపయోగిస్తుంది.", "RemuxHelp1": "మీడియా అననుకూల ఫైల్ కంటైనర్‌లో ఉంది (MKV, AVI, WMV, మొదలైనవి) కానీ వీడియో స్ట్రీమ్ మరియు ఆడియో స్ట్రీమ్ రెండూ పరికరానికి అనుకూలంగా ఉంటాయి. పరికరానికి పంపే ముందు మీడియా ఎగిరిపోకుండా నష్టపోకుండా ప్యాక్ చేయబడుతుంది.", "Remuxing": "రీమక్సింగ్", - "AspectRatioFill": "పూరించండి", - "AspectRatioCover": "కవర్", + "AspectRatioFill": "సాగదీయండి", + "AspectRatioCover": "జూమ్", "EnableFallbackFontHelp": "అనుకూల ప్రత్యామ్నాయ ఫాంట్‌లను ప్రారంభించండి. ఇది తప్పు ఉపశీర్షిక రెండరింగ్ సమస్యను నివారించవచ్చు.", "EnableFallbackFont": "ఫాల్‌బ్యాక్ ఫాంట్‌లను ప్రారంభించండి", - "LabelFallbackFontPathHelp": "ASS / SSA ఉపశీర్షికలను అందించడానికి ఫాల్‌బ్యాక్ ఫాంట్‌లను కలిగి ఉన్న మార్గాన్ని పేర్కొనండి. గరిష్టంగా అనుమతించబడిన మొత్తం ఫాంట్ పరిమాణం 20 MB. తేలికపాటి మరియు వెబ్-స్నేహపూర్వక ఫాంట్ ఫార్మాట్‌లైన వోఫ్ 2 సిఫార్సు చేయబడింది.", + "LabelFallbackFontPathHelp": "ఈ ఫాంట్‌లను కొంతమంది క్లయింట్‌లు సబ్‌టైటిల్‌లను రెండర్ చేయడానికి ఉపయోగిస్తారు. మరిన్ని వివరాల కోసం దయచేసి డాక్యుమెంటేషన్‌ను చూడండి.", "LabelFallbackFontPath": "ఫాల్‌బ్యాక్ ఫాంట్ ఫోల్డర్ మార్గం", "HeaderSelectFallbackFontPathHelp": "ASS / SSA ఉపశీర్షికలను రెండరింగ్ చేయడానికి ఉపయోగించడానికి ఫాల్‌బ్యాక్ ఫాంట్ ఫోల్డర్ యొక్క మార్గాన్ని బ్రౌజ్ చేయండి లేదా నమోదు చేయండి.", "HeaderSelectFallbackFontPath": "ఫాల్‌బ్యాక్ ఫాంట్ ఫోల్డర్ మార్గం ఎంచుకోండి", "Yesterday": "నిన్న", "Yes": "అవును", - "Yadif": "YADIF", + "Yadif": "మరో డీఇంటర్‌లేసింగ్ ఫిల్టర్ (YADIF)", "XmlTvSportsCategoriesHelp": "ఈ వర్గాలతో కూడిన కార్యక్రమాలు క్రీడా కార్యక్రమాలుగా ప్రదర్శించబడతాయి. '|' తో బహుళాలను వేరు చేయండి.", "XmlTvPathHelp": "XMLTV ఫైల్‌కు మార్గం. జెల్లీఫిన్ ఈ ఫైల్‌ను చదివి ఎప్పటికప్పుడు నవీకరణల కోసం తనిఖీ చేస్తుంది. ఫైల్‌ను సృష్టించడం మరియు నవీకరించడం మీ బాధ్యత.", "XmlTvNewsCategoriesHelp": "ఈ వర్గాలతో కూడిన కార్యక్రమాలు వార్తా కార్యక్రమాలుగా ప్రదర్శించబడతాయి. '|' తో బహుళాలను వేరు చేయండి.", @@ -121,7 +121,7 @@ "Thursday": "గురువారం", "ThumbCard": "బొటనవేలు కార్డు", "Thumb": "బొటనవేలు", - "ThisWizardWillGuideYou": "ఈ విజర్డ్ సెటప్ ప్రాసెస్ ద్వారా మీకు మార్గనిర్దేశం చేస్తుంది. ప్రారంభించడానికి, దయచేసి మీకు ఇష్టమైన భాషను ఎంచుకోండి.", + "ThisWizardWillGuideYou": "ఈ విజార్డ్ సెటప్ ప్రక్రియ ద్వారా మీకు మార్గనిర్దేశం చేస్తుంది. ప్రారంభించడానికి, దయచేసి సర్వర్ పేరును నమోదు చేసి, మీకు నచ్చిన భాషను ఎంచుకోండి.", "TheseSettingsAffectSubtitlesOnThisDevice": "ఈ సెట్టింగ్‌లు ఈ పరికరంలోని ఉపశీర్షికలను ప్రభావితం చేస్తాయి", "ThemeVideos": "థీమ్ వీడియోలు", "ThemeSongs": "థీమ్ పాటలు", @@ -163,7 +163,7 @@ "Subtitles": "ఉపశీర్షికలు", "SubtitleOffset": "ఉపశీర్షిక ఆఫ్‌సెట్", "SubtitleDownloadersHelp": "ప్రాధాన్యత క్రమంలో మీకు ఇష్టమైన ఉపశీర్షిక డౌన్‌లోడ్‌లను ప్రారంభించండి మరియు ర్యాంక్ చేయండి.", - "SubtitleAppearanceSettingsDisclaimer": "ఈ సెట్టింగులు గ్రాఫికల్ ఉపశీర్షికలకు (పిజిఎస్, డివిడి, మొదలైనవి) లేదా వారి స్వంత శైలులను పొందుపరిచే ASS / SSA ఉపశీర్షికలకు వర్తించవు.", + "SubtitleAppearanceSettingsDisclaimer": "పైన పేర్కొన్న గ్రాఫికల్ ఉపశీర్షికలుకు లేదా వాటి స్వంత శైలులను ఎస్యాస్/యాస్యాస్ఎ ఉపశీర్షికలుకు కింది సెట్టింగ్‌లు వర్తించవు.", "ShowTitle": "శీర్షిక చూపించు", "Shows": "ప్రదర్శనలు", "ShowMore": "ఇంకా చూపించు", @@ -175,7 +175,7 @@ "SettingsSaved": "సెట్టింగులు సేవ్ చేయబడ్డాయి.", "Settings": "సెట్టింగులు", "ServerUpdateNeeded": "ఈ సర్వర్ నవీకరించబడాలి. తాజా అప్డేట్ డౌన్‌లోడ్ చేయడానికి, దయచేసి {0}ని సందర్శించండి", - "ServerRestartNeededAfterPluginInstall": "ప్లగ్‌ఇన్‌ను ఇన్‌స్టాల్ చేసిన తర్వాత జెల్లీఫిన్ పున ar ప్రారంభించాలి.", + "ServerRestartNeededAfterPluginInstall": "ప్లగిన్‌ను ఇన్‌స్టాల్ చేసిన తర్వాత జెల్లీఫిన్‌ను రీస్టార్ట్ చేయాల్సి ఉంటుంది.", "ServerNameIsShuttingDown": "{0} వద్ద సర్వర్ షట్ డౌన్ అవుతోంది.", "ServerNameIsRestarting": "{0} వద్ద సర్వర్ పునఃప్రారంభించబడుతోంది.", "SeriesYearToPresent": "{0} - ప్రస్తుతం", @@ -401,12 +401,12 @@ "MessageReenableUser": "తిరిగి ప్రారంభించటానికి క్రింద చూడండి", "MessagePluginInstallError": "ప్లగ్‌ఇన్‌ను ఇన్‌స్టాల్ చేస్తున్నప్పుడు లోపం సంభవించింది.", "MessagePluginInstalled": "ప్లగ్ఇన్ విజయవంతంగా వ్యవస్థాపించబడింది. మార్పులు అమలులోకి రావడానికి సర్వర్ పున ar ప్రారంభించబడాలి.", - "MessagePluginInstallDisclaimer": "అదనపు ఫీచర్లు మరియు ప్రయోజనాలతో మీ అనుభవాన్ని మెరుగుపరచడానికి కమ్యూనిటీ సభ్యులు నిర్మించిన ప్లగిన్లు గొప్ప మార్గం. ఇన్‌స్టాల్ చేయడానికి ముందు, దయచేసి మీ సర్వర్‌లో ఎక్కువ లైబ్రరీ స్కాన్లు, అదనపు నేపథ్య ప్రాసెసింగ్ మరియు సిస్టమ్ స్థిరత్వం తగ్గడం వంటి వాటి గురించి తెలుసుకోండి.", + "MessagePluginInstallDisclaimer": "హెచ్చరిక: మూడవ పక్ష ప్లగిన్‌ను ఇన్‌స్టాల్ చేయడం వల్ల ప్రమాదాలు ఉంటాయి. ఇది అస్థిరమైన లేదా హానికరమైన కోడ్‌ను కలిగి ఉండవచ్చు మరియు ఎప్పుడైనా మారవచ్చు. మీరు విశ్వసించే రచయితల నుండి మాత్రమే ప్లగిన్‌లను ఇన్‌స్టాల్ చేయండి మరియు బాహ్య సేవా ప్రశ్నలు, సుదీర్ఘ లైబ్రరీ స్కాన్‌లు లేదా అదనపు నేపథ్య ప్రాసెసింగ్‌తో సహా దాని సంభావ్య ప్రభావాల గురించి దయచేసి తెలుసుకోండి.", "MessagePluginConfigurationRequiresLocalAccess": "ఈ ప్లగ్‌ఇన్‌ను కాన్ఫిగర్ చేయడానికి దయచేసి మీ స్థానిక సర్వర్‌కు నేరుగా సైన్ ఇన్ చేయండి.", "MessagePleaseWait": "దయచేసి వేచి ఉండండి. దీనికి ఒక నిమిషం పట్టవచ్చు.", "MessagePleaseEnsureInternetMetadata": "దయచేసి ఇంటర్నెట్ మెటాడేటా డౌన్‌లోడ్ ప్రారంభించబడిందని నిర్ధారించుకోండి.", "MessagePlayAccessRestricted": "ఈ కంటెంట్ యొక్క ప్లేబ్యాక్ ప్రస్తుతం పరిమితం చేయబడింది. దయచేసి మరింత సమాచారం కోసం మీ సర్వర్ నిర్వాహకుడిని సంప్రదించండి.", - "MessagePasswordResetForUsers": "కింది వినియోగదారులు వారి పాస్వర్డ్లను రీసెట్ చేసారు. రీసెట్ చేయడానికి ఉపయోగించిన పిన్ కోడ్‌లతో వారు ఇప్పుడు సైన్ ఇన్ చేయవచ్చు.", + "MessagePasswordResetForUsers": "కింది వినియోగదారుల పాస్‌వర్డ్‌లు రీసెట్ చేయబడ్డాయి. రీసెట్ చేయడానికి ఉపయోగించిన పిన్ కోడ్‌లతో వారు ఇప్పుడు సైన్ ఇన్ చేయవచ్చు.", "MessageNoTrailersFound": "ఇంటర్నెట్ ట్రెయిలర్ల లైబ్రరీని జోడించడం ద్వారా మీ చలన చిత్ర అనుభవాన్ని మెరుగుపరచడానికి ట్రైలర్స్ ఛానెల్‌ను ఇన్‌స్టాల్ చేయండి.", "MessageNothingHere": "ఇక్కడ ఏమి లేదు.", "MessageNoServersAvailable": "ఆటోమేటిక్ సర్వర్ డిస్కవరీని ఉపయోగించి సర్వర్లు కనుగొనబడలేదు.", @@ -497,7 +497,7 @@ "LeaveBlankToNotSetAPassword": "పాస్‌వర్డ్‌ను సెట్ చేయడానికి మీరు ఈ ఫీల్డ్‌ను ఖాళీగా ఉంచవచ్చు.", "LearnHowYouCanContribute": "మీరు ఎలా సహకరించగలరో తెలుసుకోండి.", "LatestFromLibrary": "తాజా {0}", - "LastSeen": "చివరిగా చూసినది {0}", + "LastSeen": "చివరి కార్యాచరణ {0}", "Large": "పెద్దది", "LanNetworksHelp": "బ్యాండ్‌విడ్త్ పరిమితులను అమలు చేసేటప్పుడు స్థానిక నెట్‌వర్క్‌లో పరిగణించబడే నెట్‌వర్క్‌ల కోసం కామాతో వేరు చేయబడిన IP చిరునామాలు లేదా నెట్‌వర్క్‌ల కోసం IP / నెట్‌మాస్క్ ఎంట్రీలు. సెట్ చేస్తే, అన్ని ఇతర IP చిరునామాలు బాహ్య నెట్‌వర్క్‌లో ఉన్నట్లు పరిగణించబడతాయి మరియు బాహ్య బ్యాండ్‌విడ్త్ పరిమితులకు లోబడి ఉంటాయి. ఖాళీగా ఉంచినట్లయితే, సర్వర్ యొక్క సబ్నెట్ మాత్రమే స్థానిక నెట్‌వర్క్‌లో పరిగణించబడుతుంది.", "LabelZipCode": "పిన్ కోడ్", @@ -505,7 +505,7 @@ "LabelYear": "సంవత్సరం", "LabelXDlnaDocHelp": "X_DLNADOC మూలకం యొక్క కంటెంట్‌ను urn: schemas-dlna-org: device-1-0 నేమ్‌స్పేస్‌లో నిర్ణయిస్తుంది.", "LabelXDlnaDoc": "X-DLNA పత్రం", - "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "ఈ పరికరం ప్రారంభించిన ఏదైనా Chromecast ప్లేబ్యాక్‌కు కూడా ఈ సెట్టింగ్‌లు వర్తిస్తాయి.", + "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "ఈ పరికరం ద్వారా ప్రారంభించబడిన ఏదైనా గూగుల్ కాస్ట్ ప్లేబ్యాక్‌కు కూడా ఈ సెట్టింగ్‌లు వర్తిస్తాయి.", "Subtitle": "ఉపశీర్షిక", "Studios": "స్టూడియోస్", "StopRecording": "రికార్డింగ్ ఆపు", @@ -569,11 +569,11 @@ "LabelTonemappingThresholdHelp": "టోన్ మ్యాపింగ్ అల్గోరిథం పారామితులు ప్రతి సన్నివేశానికి చక్కగా ట్యూన్ చేయబడతాయి. మరియు సన్నివేశం మారిందా లేదా అని గుర్తించడానికి ఒక ప్రవేశాన్ని ఉపయోగిస్తారు. ప్రస్తుత ఫ్రేమ్ సగటు ప్రకాశం మరియు ప్రస్తుత నడుస్తున్న సగటు మధ్య దూరం ప్రవేశ విలువను మించి ఉంటే, మేము దృశ్య సగటు మరియు గరిష్ట ప్రకాశాన్ని తిరిగి లెక్కిస్తాము. సిఫార్సు చేయబడిన మరియు డిఫాల్ట్ విలువలు 0.8 మరియు 0.2.", "LabelTonemappingThreshold": "టోన్ మ్యాపింగ్ ప్రవేశ", "LabelTonemappingRange": "టోన్ మ్యాపింగ్ పరిధి", - "LabelTonemappingPeakHelp": "ఈ విలువతో సిగ్నల్ / నామమాత్ర / సూచన శిఖరాన్ని భర్తీ చేయండి. ప్రదర్శన మెటాడేటాలో పొందుపరిచిన గరిష్ట సమాచారం నమ్మదగినది కానప్పుడు లేదా తక్కువ పరిధి నుండి అధిక శ్రేణికి టోన్ మ్యాపింగ్ చేసినప్పుడు ఉపయోగపడుతుంది. సిఫార్సు చేయబడిన మరియు డిఫాల్ట్ విలువలు 100 మరియు 0.", + "LabelTonemappingPeakHelp": "బదులుగా ఈ పీక్ విలువతో ఇన్‌పుట్ సిగ్నల్ కోసం ఎంబెడెడ్ మెటాడేటా విలువను ఓవర్‌రైడ్ చేయండి. డిఫాల్ట్ విలువ 100 (1000nit).", "LabelTonemappingPeak": "టోన్ మ్యాపింగ్ శిఖరం", "LabelTonemappingParamHelp": "టోన్ మ్యాపింగ్ అల్గోరిథం ట్యూన్ చేయండి. సిఫార్సు చేయబడిన మరియు డిఫాల్ట్ విలువలు NaN. సాధారణంగా దీన్ని ఖాళీగా ఉంచండి.", "LabelTonemappingParam": "టోన్ మ్యాపింగ్ పారామ్", - "LabelTonemappingDesatHelp": "ఈ స్థాయి ప్రకాశం మించిన ముఖ్యాంశాల కోసం డీసట్రేషన్‌ను వర్తించండి. అధిక పరామితి, మరింత రంగు సమాచారం భద్రపరచబడుతుంది. ఈ సెట్టింగ్ సూపర్-హైలైట్‌ల కోసం అసహజంగా ఎగిరిన రంగులను నిరోధించడానికి సహాయపడుతుంది (బదులుగా సజావుగా) తెల్లగా మారుతుంది. ఇది వెలుపల రంగుల గురించి సమాచారాన్ని తగ్గించే ఖర్చుతో చిత్రాలను మరింత సహజంగా భావిస్తుంది. సిఫార్సు చేయబడిన మరియు డిఫాల్ట్ విలువలు 0 మరియు 0.5.", + "LabelTonemappingDesatHelp": "ఈ ప్రకాశం స్థాయిని మించిన హైలైట్‌ల కోసం డీసాచురేషన్‌ను వర్తింపజేయండి. సిఫార్సు చేయబడిన విలువ 0 (నిలిపివేయండి).", "LabelTonemappingDesat": "టోన్ మ్యాపింగ్ డెసాట్", "LabelTonemappingAlgorithm": "ఉపయోగించడానికి టోన్ మ్యాపింగ్ అల్గోరిథం ఎంచుకోండి", "LabelTitle": "శీర్షిక", @@ -733,7 +733,7 @@ "LabelCriticRating": "విమర్శనాత్మక రేటింగ్", "LabelCreateHttpPortMapHelp": "HTTPS ట్రాఫిక్‌తో పాటు HTTP ట్రాఫిక్ కోసం నియమాన్ని రూపొందించడానికి ఆటోమేటిక్ పోర్ట్ మ్యాపింగ్‌ను అనుమతించండి.", "LabelCreateHttpPortMap": "HTTP ట్రాఫిక్ మరియు HTTPS కోసం ఆటోమేటిక్ పోర్ట్ మ్యాపింగ్‌ను ప్రారంభించండి.", - "LabelCountry": "దేశం", + "LabelCountry": "దేశం/ప్రాంతం", "LabelCorruptedFrames": "పాడైన ఫ్రేమ్‌లు", "LabelContentType": "కంటెంట్ రకం", "LabelCommunityRating": "సంఘం రేటింగ్", @@ -844,7 +844,7 @@ "LabelAudioBitDepth": "ఆడియో బిట్ లోతు", "LabelArtistsHelp": "బహుళ కళాకారులను సెమికోలన్‌తో వేరు చేయండి.", "LabelArtists": "కళాకారులు", - "LabelAppNameExample": "ఉదాహరణ: సిక్‌బియర్డ్, సోనార్", + "LabelAppNameExample": "API కీలను గుర్తించడానికి మానవులు చదవగలిగే పేరు. ఈ సెట్టింగ్ కార్యాచరణను ప్రభావితం చేయదు.", "LabelAppName": "అనువర్తనం పేరు", "LabelAllowHWTranscoding": "హార్డ్వేర్ ట్రాన్స్కోడింగ్ను అనుమతించండి", "LabelAllowedRemoteAddressesMode": "రిమోట్ IP చిరునామా ఫిల్టర్ మోడ్", @@ -1010,7 +1010,7 @@ "HeaderAccessSchedule": "యాక్సెస్ షెడ్యూల్", "HardwareAccelerationWarning": "హార్డ్వేర్ త్వరణాన్ని ప్రారంభించడం కొన్ని పరిసరాలలో అస్థిరతకు కారణం కావచ్చు. మీ ఆపరేటింగ్ సిస్టమ్ మరియు వీడియో డ్రైవర్లు పూర్తిగా తాజాగా ఉన్నాయని నిర్ధారించుకోండి. దీన్ని ప్రారంభించిన తర్వాత మీకు వీడియో ప్లే చేయడంలో ఇబ్బంది ఉంటే, మీరు సెట్టింగ్‌ను తిరిగి ఏమీలేదు.", "HDPrograms": "HD ప్రోగ్రామ్‌లు", - "H264CrfHelp": "స్థిరమైన రేటు కారకం (CRF) అనేది x264 మరియు x265 ఎన్‌కోడర్ కోసం డిఫాల్ట్ నాణ్యత సెట్టింగ్. మీరు 0 మరియు 51 మధ్య విలువలను సెట్ చేయవచ్చు, ఇక్కడ తక్కువ విలువలు మంచి నాణ్యతను కలిగిస్తాయి (అధిక ఫైల్ పరిమాణాల ఖర్చుతో). సేన్ విలువలు 18 మరియు 28 మధ్య ఉన్నాయి. X264 యొక్క డిఫాల్ట్ 23, మరియు x265 కొరకు 28, కాబట్టి మీరు దీన్ని ప్రారంభ బిందువుగా ఉపయోగించవచ్చు.", + "H264CrfHelp": "స్థిరమైన రేటు కారకం (సిఆర్ఎఫ్) అనేది x264 మరియు x265 ఎన్‌కోడర్ కోసం డిఫాల్ట్ నాణ్యత సెట్టింగ్. మీరు 0 మరియు 51 మధ్య విలువలను సెట్ చేయవచ్చు, ఇక్కడ తక్కువ విలువలు మంచి నాణ్యతను కలిగిస్తాయి (అధిక ఫైల్ పరిమాణాల ఖర్చుతో). సేన్ విలువలు 18 మరియు 28 మధ్య ఉన్నాయి. X264 యొక్క డిఫాల్ట్ 23, మరియు x265 కొరకు 28, కాబట్టి మీరు దీన్ని ప్రారంభ బిందువుగా ఉపయోగించవచ్చు.", "GuideProviderSelectListings": "జాబితాలను ఎంచుకోండి", "GuideProviderLogin": "ప్రవేశించండి", "Guide": "గైడ్", @@ -1076,7 +1076,7 @@ "LabelRecord": "రికార్డ్", "LabelReasonForTranscoding": "ట్రాన్స్‌కోడింగ్‌కు కారణం", "LabelQuickConnectCode": "త్వరిత కనెక్ట్ కోడ్", - "LabelPublishedServerUriHelp": "ఇంటర్ఫేస్ లేదా క్లయింట్ IP చిరునామా ఆధారంగా జెల్లీఫిన్ ఉపయోగించే URI ని భర్తీ చేయండి.", + "LabelPublishedServerUriHelp": "ఇంటర్‌ఫేస్ లేదా క్లయింట్ ఐపీ చిరునామా ఆధారంగా జెల్లీఫిన్ ఉపయోగించే యుఆర్ఐని ఓవర్‌రైడ్ చేయండి. ఉదాహరణకు: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, లేదా all=https://jellyfin.example.com", "LabelPublishedServerUri": "ప్రచురించిన సర్వర్ URI లు", "LabelPublicHttpsPortHelp": "స్థానిక పోర్ట్ నంబర్‌ను స్థానిక హెచ్‌టిటిపిఎస్ పోర్ట్‌కు మ్యాప్ చేయాలి.", "LabelPublicHttpsPort": "పబ్లిక్ HTTPS పోర్ట్ సంఖ్య", @@ -1177,7 +1177,7 @@ "LabelLogs": "లాగ్‌లు", "LabelLoginDisclaimerHelp": "లాగిన్ పేజీ దిగువన ప్రదర్శించబడే సందేశం.", "LabelLoginDisclaimer": "లాగిన్ నిరాకరణ", - "LabelLockItemToPreventChanges": "భవిష్యత్తులో మార్పులను నివారించడానికి ఈ అంశాన్ని లాక్ చేయండి", + "LabelLockItemToPreventChanges": "భవిష్యత్తులో మెటాడేటా మార్పులను నిరోధించడానికి ఈ అంశాన్ని లాక్ చేయండి", "LabelLocalHttpServerPortNumberHelp": "HTTP సర్వర్ కోసం TCP పోర్ట్ సంఖ్య.", "LabelLocalHttpServerPortNumber": "స్థానిక HTTP పోర్ట్ సంఖ్య", "LabelLineup": "లైనప్", @@ -1572,5 +1572,440 @@ "DownloadAll": "అన్నీ డౌన్‌లోడ్ చేసుకోండి", "EnableCardLayout": "దృశ్య కార్డ్‌బాక్స్‌ను ప్రదర్శించు", "EnableHi10pHelp": "H.264 10-బిట్ వీడియోలను ట్రాన్స్‌కోడ్ చేయకుండా ఉండటానికి ప్రారంభించండి. వీడియో ఖాళీ ఫ్రేమ్‌లను ప్రదర్శిస్తే ఈ ఎంపికను నిలిపివేయండి.", - "EnableRewatchingNextUpHelp": "'తదుపరిది' విభాగాలలో ఇప్పటికే చూసిన ఎపిసోడ్‌లను చూపించడాన్ని ప్రారంభించండి." + "EnableRewatchingNextUpHelp": "'తదుపరిది' విభాగాలలో ఇప్పటికే చూసిన ఎపిసోడ్‌లను చూపించడాన్ని ప్రారంభించండి.", + "CustomSplashScreenSize": "కస్టమ్ చిత్రాలు కనీసం 1920x1080 సైజులో 16x9 ఆస్పెక్ట్ రేషియోలో ఉండాలి.", + "CustomSubtitleStylingHelp": "ఉపశీర్షిక స్టైలింగ్ చాలా పరికరాల్లో పని చేస్తుంది, కానీ అదనపు పనితీరు ఓవర్‌హెడ్‌తో వస్తుంది.", + "DateModified": "సవరించిన తేదీ", + "DeleteLyrics": "సాహిత్యాన్ని తొలగించు", + "DirectPlayHelp": "సోర్స్ ఫైల్ ఈ క్లయింట్‌తో పూర్తిగా అనుకూలంగా ఉంది మరియు సెషన్ ఎటువంటి మార్పులు లేకుండా ఫైల్‌ను స్వీకరిస్తోంది.", + "EnableTrueHdHelp": "మీ పరికరం ట్రూహెచ్‌డి కి మద్దతు ఇస్తే లేదా అనుకూలమైన ఆడియో రిసీవర్‌కు కనెక్ట్ చేయబడి ఉంటే మాత్రమే ప్రారంభించండి, లేకుంటే అది ప్లేబ్యాక్ వైఫల్యానికి కారణం కావచ్చు.", + "ErrorPlayerNotFound": "అభ్యర్థించిన మీడియా కోసం ప్లేయర్ కనుగొనబడలేదు.", + "FallbackMaxStreamingBitrateHelp": "ffprobe సోర్స్ స్ట్రీమ్ బిట్రేట్‌ను నిర్ణయించలేనప్పుడు గరిష్ట స్ట్రీమింగ్ బిట్రేట్‌ను ఫాల్‌బ్యాక్‌గా ఉపయోగిస్తారు. ఇది క్లయింట్‌లు అధిక ట్రాన్స్‌కోడింగ్ బిట్రేట్‌ను అభ్యర్థించకుండా నిరోధించడంలో సహాయపడుతుంది, దీని వలన ప్లేయర్ విఫలమవడానికి మరియు ఎన్‌కోడర్ ఓవర్‌లోడ్ కావడానికి కారణం కావచ్చు.", + "HeaderNextVideo": "తదుపరి వీడియో", + "Framerate": "ఫ్రేమ్‌రేట్", + "HeaderLyricDownloads": "సాహిత్యం డౌన్‌లోడ్", + "HeaderMediaSegmentActions": "మీడియా విభాగం చర్యలు", + "HeaderNoLyrics": "సాహిత్యం కనుగొనబడలేదు", + "HeaderAudioAdvanced": "ఆడియో అధునాతనం", + "HeaderGuestCast": "అతిథి నటులు", + "HeaderNextEpisode": "తదుపరి ఎపిసోడ్", + "DisablePlugin": "నిలిపివేయండి", + "HeaderDeleteSeries": "సిరీస్‌ను తొలగించు", + "HeaderDeleteLyrics": "సాహిత్యాన్ని తొలగించు", + "HeaderEpisodesStatus": "ఎపిసోడ్‌ల స్థితి", + "DeleteCustomImage": "కస్టమ్ చిత్రంను తొలగించండి", + "Digital": "డిజిటల్", + "GoHome": "హోమ్ కి వెళ్ళు", + "GoogleCastUnsupported": "గూగుల్ కాస్ట్ మద్దతు లేదు", + "GridView": "గ్రిడ్ వీక్షణ", + "HeaderConfirmRepositoryInstallation": "ప్లగిన్ రిపోజిటరీ ఇన్‌స్టాలేషన్‌ను నిర్ధారించండి", + "HeaderAddLyrics": "సాహిత్యాన్ని జోడించండి", + "HeaderPageNotFound": "పేజీ కనుగొనబడలేదు", + "DisableVbrAudioEncodingHelp": "ఈ క్లయింట్ కోసం విబిఆర్ తో ఆడియోను ఎన్కోడ్ చేయకుండా సర్వర్‌ను నిరోధించండి.", + "HeaderPerformance": "ప్రదర్శన", + "HeaderEditPlaylist": "ప్లేజాబితాను సవరించు", + "DisplayLoadError": "డిస్ప్లే కాన్ఫిగరేషన్ డేటాను లోడ్ చేస్తున్నప్పుడు లోపం సంభవించింది.", + "DlnaMovedMessage": "డిఎల్ఎన్ఎ కార్యాచరణ ప్లగిన్‌కి తరలించబడింది.", + "HeaderAllRecordings": "అన్ని రికార్డింగ్‌లు", + "HeaderDummyChapter": "అధ్యాయ చిత్రాలు", + "DeleteEntireSeries": "{0} ఎపిసోడ్‌లను తొలగించండి", + "DeleteSeries": "సిరీస్‌ను తొలగించు", + "DeleteEpisode": "ఎపిసోడ్‌ను తొలగించు", + "DeleteName": "తొలగించు {0}", + "EnablePlugin": "ప్రారంభించు", + "ErrorDeletingLyrics": "సర్వర్ నుండి లిరిక్స్ తొలగించడంలో లోపం ఏర్పడింది. దయచేసి జెల్లీఫిన్ మీడియా ఫోల్డర్‌కు రైట్ యాక్సెస్ కలిగి ఉందో లేదో తనిఖీ చేసి, మళ్లీ ప్రయత్నించండి.", + "DeleteServerConfirmation": "మీరు ఈ సర్వర్‌ను తొలగించాలనుకుంటున్నారా?", + "HeaderNewPlaylist": "కొత్త ప్లేజాబితా", + "Experimental": "ప్రయోగాత్మకమైనది", + "HeaderContinueReading": "చదవడం కొనసాగించు", + "LabelSelectPreferredTranscodeVideoAudioCodec": "వీడియో ప్లేబ్యాక్‌లో ప్రాధాన్య ట్రాన్స్‌కోడ్ ఆడియో కోడెక్", + "LabelDeveloper": "డెవలపర్", + "MediaSegmentType.Commercial": "వాణిజ్య", + "MetadataNfoLoadError": "మెటాడేటా ఎన్ఎఫ్ఓ సెట్టింగ్‌లను లోడ్ చేయడంలో విఫలమైంది", + "HeaderPreviewLyrics": "సాహిత్యాన్ని పరిదృశ్యం చేయండి", + "HeaderRecordingMetadataSaving": "మెటాడేటా రికార్డింగ్", + "HeaderSyncPlaySettings": "సమకాలీకరణ సెట్టింగ్‌లు", + "HeaderSyncPlayTimeSyncSettings": "సమయ సమకాలీకరణ", + "HeaderSyncPlayPlaybackSettings": "ప్లేబ్యాక్", + "HeaderUploadLyrics": "సాహిత్యాన్ని అప్‌లోడ్ చేయండి", + "IgnoreDtsHelp": "ఈ ఎంపికను నిలిపివేయడం వలన కొన్ని సమస్యలు పరిష్కరించబడవచ్చు, ఉదా. ప్రత్యేక ఆడియో మరియు వీడియో స్ట్రీమ్‌లు ఉన్న ఛానెల్‌లలో ఆడియో లేకపోవడం.", + "ImageDeleteFailed": "చిత్రం తొలగింపు విఫలమైంది", + "LabelAlbumGain": "ఆల్బమ్ లాభం", + "ImageUploadFailed": "చిత్రం అప్‌లోడ్ విఫలమైంది", + "LabelAllowContentWithTags": "ట్యాగ్‌లతో ఉన్న అంశాలను అనుమతించు", + "LabelAllowStreamSharing": "స్ట్రీమ్ షేరింగ్‌ను అనుమతించండి", + "LabelAutomaticallyAddToCollection": "సేకరణకు స్వయంచాలకంగా జోడించు", + "LabelSelectAudioNormalization": "ఆడియో సాధారణీకరణ", + "LabelIsSynced": "సమకాలీకరించబడింది", + "LabelParallelImageEncodingLimitHelp": "సమాంతరంగా అమలు చేయడానికి అనుమతించబడిన గరిష్ట సంఖ్యలో చిత్రం ఎన్‌కోడింగ్‌లు. దీన్ని ఖాళీగా ఉంచడం వలన మీ వ్యవస్థ కోర్ గణన ఆధారంగా పరిమితిని ఎంచుకుంటారు.", + "LabelBackdropScreensaverIntervalHelp": "బ్యాక్‌డ్రాప్ స్క్రీన్‌సేవర్‌ను ఉపయోగిస్తున్నప్పుడు వివిధ బ్యాక్‌డ్రాప్‌ల మధ్య సమయం సెకన్లలో.", + "LabelDevice": "పరికరం", + "LabelCustomTagDelimitersHelp": "ట్యాగ్‌లను వేరు చేయడానికి అక్షరాలను డీలిమిటర్‌లుగా పరిగణించాలి.", + "LabelHardwareEncoding": "హార్డ్‌వేర్ ఎన్‌కోడింగ్", + "LabelDate": "తేదీ", + "LabelDelimiterWhitelistHelp": "ట్యాగ్ విభజన నుండి మినహాయించాల్సిన అంశాలు. ప్రతి పంక్తికి ఒక అంశం.", + "LabelDisableVbrAudioEncoding": "విబిఆర్ ఆడియో ఎన్‌కోడింగ్‌ను నిలిపివేయండి", + "LabelDropLyricsHere": "సాహిత్యాన్ని ఇక్కడ వదలండి లేదా బ్రౌజ్ చేయడానికి క్లిక్ చేయండి.", + "LabelChapterImageResolutionHelp": "సంగ్రహించబడిన అధ్యాయ చిత్రాల స్పష్టత. దీన్ని మార్చడం వలన ఇప్పటికే ఉన్న నకిలీ అధ్యాయాలపై ఎటువంటి ప్రభావం ఉండదు.", + "LabelEnableAudioVbrHelp": "వేరియబుల్ బిట్రేట్ సగటు బిట్రేట్ నిష్పత్తికి మెరుగైన నాణ్యతను అందిస్తుంది, కానీ కొన్ని అరుదైన సందర్భాల్లో బఫరింగ్ మరియు అనుకూలత సమస్యలను కలిగించవచ్చు.", + "LabelNoChangelog": "ఈ విడుదలకు ఎలాంటి చేంజ్‌లాగ్ అందించబడలేదు.", + "LabelEnableLUFSScan": "లూఫ్స్ స్కాన్‌ను ప్రారంభించండి", + "LabelMaxDaysForNextUpHelp": "ఒక షో చూడకుండా 'తదుపరిది' జాబితాలో గరిష్టంగా ఎన్ని రోజులు ఉండాలో సెట్ చేయండి.", + "LabelEnableLUFSScanHelp": "ట్రాక్‌లలో సమాన శబ్దాన్ని పొందడానికి క్లయింట్‌లు ఆడియో ప్లేబ్యాక్‌ను సాధారణీకరించవచ్చు. ఇది లైబ్రరీ స్కాన్‌లను ఎక్కువసేపు చేస్తుంది మరియు ఎక్కువ వనరులను తీసుకుంటుంది.", + "LabelFallbackMaxStreamingBitrate": "ఫాల్‌బ్యాక్ గరిష్ట స్ట్రీమ్ బిట్రేట్ (Mbps)", + "LabelMaxVideoResolution": "అనుమతించబడిన గరిష్ట వీడియో ట్రాన్స్‌కోడింగ్ స్పష్టత", + "LabelMediaDetails": "మీడియా వివరాలు", + "LabelMediaSegmentProviders": "మీడియా భాగం ప్రొవైడర్లు", + "LabelLocalCustomCss": "ఈ క్లయింట్‌కు మాత్రమే వర్తించే స్టైలింగ్ కోసం అనుకూల సిఎస్ఎస్ కోడ్. మీరు సర్వర్ అనుకూల సిఎస్ఎస్ కోడ్‌ను నిలిపివేయాలనుకోవచ్చు.", + "LabelQsvDevice": "క్యూఎస్‌వి పరికరం", + "LabelSortName": "పేరును క్రమబద్ధీకరించు", + "LabelQsvDeviceHelp": "బహుళ-జిపియు వ్యవస్థలో ఇంటెల్ క్యూఎస్‌వి కోసం పరికరాన్ని పేర్కొనండి. లైనక్స్లో, ఇది రెండర్ నోడ్, ఉదా., /dev/dri/renderD128. విండోస్లో, ఇది 0 నుండి ప్రారంభమయ్యే పరికర సూచిక. మీరు ఏమి చేస్తున్నారో మీకు తెలియకపోతే ఖాళీగా వదిలేయండి.", + "Larger": "పెద్దది", + "LabelSaveTrickplayLocally": "మీడియా పక్కన ట్రిక్‌ప్లే చిత్రాలను సేవ్ చేయండి", + "LabelSaveTrickplayLocallyHelp": "ట్రిక్‌ప్లే చిత్రాలను మీడియా ఫోల్డర్‌లలో సేవ్ చేయడం వలన వాటిని సులభంగా తరలించడం మరియు యాక్సెస్ చేయడం కోసం మీ మీడియా పక్కన ఉంచుతారు.", + "LabelScreensaverTime": "స్క్రీన్‌సేవర్ సమయం", + "Bold": "బోల్డ్", + "LabelScreensaverTimeHelp": "స్క్రీన్‌సేవర్‌ను ప్రారంభించడానికి సెకన్లలో పట్టే నిష్క్రియాత్మక సమయం.", + "LabelSyncPlaySettingsDescription": "సింక్‌ప్లే ప్రాధాన్యతలను మార్చండి", + "LabelSyncPlaySettingsSyncCorrectionHelp": "మీడియాను వేగవంతం చేయడం ద్వారా లేదా అంచనా వేసిన స్థానానికి చేరుకోవడం ద్వారా ప్లేబ్యాక్ యొక్క యాక్టివ్ సింక్‌ను ప్రారంభించండి. భారీగా నత్తిగా మాట్లాడటం జరిగితే దీన్ని నిలిపివేయండి.", + "LabelSyncPlaySettingsMinDelaySpeedToSync": "స్పీడ్‌టుసింక్ కనీస ఆలస్యం", + "LabelSyncPlaySettingsMinDelaySpeedToSyncHelp": "కనీస ప్లేబ్యాక్ ఆలస్యం (msలో) ఆ తర్వాత స్పీడ్‌టుసింక్ ప్లేబ్యాక్ స్థానాన్ని సరిచేయడానికి ప్రయత్నిస్తుంది.", + "LabelSyncPlaySettingsMaxDelaySpeedToSyncHelp": "గరిష్ట ప్లేబ్యాక్ ఆలస్యం (msలో), ఆ తర్వాత స్పీడ్‌టుసింక్ బదులుగా స్కిప్‌టోసింక్ ఉపయోగించబడుతుంది.", + "LabelSyncPlaySettingsSpeedToSyncDuration": "స్పీడ్‌టుసింక్ వ్యవధి", + "LimitSegmentLength": "చిన్నహెచ్‌ఎల్‌ఎస్ విభాగాలను ఉపయోగించండి", + "LabelSyncPlaySettingsSpeedToSyncDurationHelp": "ప్లేబ్యాక్ స్థానాన్ని సరిచేయడానికి స్పీడ్‌టుసింక్ ఉపయోగించే మిల్లీసెకన్ల మొత్తం.", + "LabelSyncPlaySettingsMinDelaySkipToSyncHelp": "కనీస ప్లేబ్యాక్ ఆలస్యం (msలో) ఆ తర్వాత స్కిప్‌టోసింక్ ప్లేబ్యాక్ స్థానాన్ని సరిచేయడానికి ప్రయత్నిస్తుంది.", + "LabelSyncPlaySettingsSpeedToSyncHelp": "ప్లేబ్యాక్‌ను వేగవంతం చేయడంలో ఉండే సింక్ కరెక్షన్ పద్ధతి. సింక్ కరెక్షన్‌ను తప్పనిసరిగా ప్రారంభించాలి.", + "LogLevel.Warning": "హెచ్చరిక", + "MediaSegmentType.Recap": "రీక్యాప్", + "LabelSelectPreferredTranscodeVideoCodec": "ప్రాధాన్య ట్రాన్స్‌కోడ్ వీడియో కోడెక్", + "LastActive": "చివరిగా యాక్టివ్‌గా ఉన్న సమయం", + "LibraryScanFanoutConcurrency": "సమాంతర లైబ్రరీ స్కాన్ పనుల పరిమితి", + "LibraryScanFanoutConcurrencyHelp": "లైబ్రరీ స్కాన్‌ల సమయంలో సమాంతర పనుల గరిష్ట సంఖ్య. దీన్ని ఖాళీగా ఉంచడం వల్ల మీ సిస్టమ్ కోర్ కౌంట్ ఆధారంగా పరిమితిని ఎంచుకుంటారు. హెచ్చరిక: ఈ సంఖ్యను చాలా ఎక్కువగా సెట్ చేయడం వల్ల నెట్‌వర్క్ ఫైల్ సిస్టమ్‌లతో సమస్యలు తలెత్తవచ్చు; మీరు సమస్యలను ఎదుర్కొంటే ఈ సంఖ్యను తగ్గించండి.", + "LibraryInvalidItemIdError": "లైబ్రరీ చెల్లని స్థితిలో ఉంది మరియు సవరించబడదు. మీరు బహుశా ఒక బగ్‌ను ఎదుర్కొంటున్నారు: డేటాబేస్‌లోని మార్గం ఫైల్‌సిస్టమ్‌లో సరైన మార్గం కాదు.", + "MediaSegmentAction.AskToSkip": "దాటవేయమని అడగండి", + "LimitSegmentLengthHelp": "ఈ ఎంపికను ప్రారంభించడం వలన వెబ్‌ఓఎస్ టీవీలు వంటి కొన్ని పరికరాల్లో సీకింగ్ సమయంలో హెచ్‌ఎల్‌ఎస్ ప్లేయర్ హ్యాంగ్ అవ్వకుండా నిరోధించవచ్చు.", + "LimitSupportedVideoResolutionHelp": "గరిష్ట మద్దతు ఉన్న వీడియో రిజల్యూషన్‌గా 'గరిష్టంగా అనుమతించబడిన వీడియో ట్రాన్స్‌కోడింగ్ రిజల్యూషన్'ని ఉపయోగించండి.", + "MediaInfoTitle": "శీర్షిక", + "LogLevel.Trace": "ట్రేస్", + "LogLevel.Information": "సమాచారం", + "MediaInfoRotation": "భ్రమణం", + "Mixer": "మిక్సర్", + "LogLevel.None": "ఏదీ లేదు", + "MediaSegmentProvidersHelp": "మీకు ఇష్టమైన మీడియా భాగం ప్రొవైడర్లను ప్రాధాన్యత క్రమంలో ప్రారంభించండి మరియు ర్యాంక్ చేయండి.", + "MenuClose": "మెనూ మూసివేయి", + "Lyrics": "సాహిత్యం", + "MessageNoFavoritesAvailable": "ప్రస్తుతం ఇష్టమైనవి ఏవీ అందుబాటులో లేవు.", + "MenuOpen": "మెనూ తెరవండి", + "MessageCancelTimerError": "టైమర్‌ను రద్దు చేస్తున్నప్పుడు లోపం సంభవించింది", + "MessageRenameMediaFolder": "మీడియా లైబ్రరీ పేరు మార్చడం వలన మొత్తం మెటాడేటా పోతుంది, జాగ్రత్తగా కొనసాగండి.", + "MessageRepositoryInstallDisclaimer": "హెచ్చరిక: మూడవ పక్ష ప్లగిన్ రిపోజిటరీని ఇన్‌స్టాల్ చేయడం వలన ప్రమాదాలు ఉంటాయి. ఇది అస్థిరమైన లేదా హానికరమైన కోడ్‌ను కలిగి ఉండవచ్చు మరియు ఎప్పుడైనా మారవచ్చు. మీరు విశ్వసించే రచయితల నుండి మాత్రమే రిపోజిటరీలను ఇన్‌స్టాల్ చేయండి.", + "MessageSent": "సందేశం పంపబడింది.", + "MoveToTop": "పైకి తరలించు", + "MessageUnauthorizedUser": "ఈ సమయంలో సర్వర్‌ను యాక్సెస్ చేయడానికి మీకు అధికారం లేదు. దయచేసి మరిన్ని వివరాల కోసం మీ సర్వర్ నిర్వాహకుడిని సంప్రదించండి.", + "NativeSubtitleStylingHelp": "కొన్ని పరికరాల్లో ఉపశీర్షిక స్టైలింగ్ పనిచేయదు. అయితే, దీనికి ఎటువంటి పనితీరు ఓవర్ హెడ్ ఉండదు.", + "OptionDateShowAdded": "తేదీ ప్రదర్శన జోడించబడింది", + "PageNotFound": "ఇది మీరు వెతుకుతున్న పేజీ కాదు.", + "PasswordRequiredForAdmin": "నిర్వాహక ఖాతాలకు పాస్‌వర్డ్ అవసరం.", + "PasswordMissingSaveError": "కొత్త పాస్‌వర్డ్ ఖాళీగా ఉండకూడదు.", + "HeaderVideoAdvanced": "వీడియో అధునాతనం", + "LabelStereoDownmixAlgorithm": "స్టీరియో డౌన్‌మిక్స్ అల్గోరిథం", + "MessageNoItemsAvailable": "ప్రస్తుతం ఏ వస్తువులు అందుబాటులో లేవు.", + "MessageCancelSeriesTimerError": "సిరీస్ టైమర్‌ను రద్దు చేస్తున్నప్పుడు లోపం సంభవించింది", + "HomeVideosPhotos": "హోమ్ వీడియోలు మరియు ఫోటోలు", + "IgnoreDts": "డిటిఎస్ (డీకోడింగ్ టైమ్‌స్టాంప్)ను విస్మరించండి", + "LabelInstalled": "ఇన్‌స్టాల్ చేయబడింది", + "LabelRepository": "రిపోజిటరీ", + "LabelSyncPlaySettingsExtraTimeOffset": "అదనపు సమయం ఆఫ్‌సెట్", + "LabelWebVersion": "వెబ్ వెర్షన్", + "Localization": "స్థానికీకరణ", + "MoveToBottom": "దిగువకు తరలించు", + "LabelOriginalName": "అసలు పేరు", + "ImageUploadCancelled": "చిత్రం అప్‌లోడ్ రద్దు చేయబడింది", + "LabelParallelImageEncodingLimit": "సమాంతర చిత్రం ఎన్‌కోడింగ్ పరిమితి", + "LabelSlowResponseTime": "ప్రతిస్పందన నెమ్మదిగా పరిగణించబడే సమయం msలో", + "LogLevel.Critical": "క్లిష్టమైనది", + "MediaSegmentType.Preview": "ప్రివ్యూ", + "LogLevel.Error": "లోపం", + "MediaSegmentType.Intro": "పరిచయం", + "NextChapter": "తదుపరి అధ్యాయం", + "LabelAllowFmp4TranscodingContainer": "ఎఫ్‌ఎమ్‌పి 4 ట్రాన్స్‌కోడింగ్ కంటైనర్‌ను అనుమతించండి", + "LabelAlwaysRemuxFlacAudioFiles": "FLAC ఆడియో ఫైల్‌లను ఎల్లప్పుడూ రీమక్స్ చేయండి", + "LabelBackdropScreensaverInterval": "బ్యాక్‌డ్రాప్ స్క్రీన్‌సేవర్ విరామం", + "LabelSyncPlaySettingsMaxDelaySpeedToSync": "స్పీడ్‌టుసింక్ గరిష్ట ఆలస్యం", + "LabelSyncPlaySettingsSkipToSync": "స్కిప్‌టోసింక్ ని ప్రారంభించండి", + "Illustrator": "చిత్రకారుడు", + "LogLevel.Debug": "డీబగ్", + "Letterer": "అక్షరం", + "Penciller": "పెన్సిలర్", + "OtherArtist": "ఇతర కళాకారుడు", + "LabelSyncPlaySettingsSkipToSyncHelp": "అంచనా వేసిన స్థానానికి చేరుకోవడంలో ఉండే సమకాలీకరణ దిద్దుబాటు పద్ధతి. సమకాలీకరణ దిద్దుబాటును తప్పనిసరిగా ప్రారంభించాలి.", + "LabelSystem": "వ్యవస్థ", + "LabelServerVersion": "సర్వర్ వెర్షన్", + "ListView": "జాబితా వీక్షణ", + "Inker": "ఇంకర్", + "NoLyricsSearchResultsFound": "సాహిత్యం కనుగొనబడలేదు.", + "LabelAudioTagSettings": "ఆడియో ట్యాగ్ సెట్టింగ్‌లు", + "LabelCustomTagDelimiters": "కస్టమ్ ట్యాగ్ డీలిమిటర్", + "LabelDelimiterWhitelist": "డీలిమిటర్ వైట్‌లిస్ట్", + "LabelMaxDaysForNextUp": "'తదుపరిది'లో గరిష్ట రోజులు", + "LabelAlwaysRemuxMp3AudioFiles": "MP3 ఆడియో ఫైళ్ళను ఎల్లప్పుడూ రీమక్స్ చేయండి", + "LabelLyricDownloaders": "లిరిక్ డౌన్‌లోడర్లు", + "LyricDownloadersHelp": "మీకు ఇష్టమైన లిరిక్ డౌన్‌లోడ్‌లను ప్రాధాన్యత క్రమంలో ప్రారంభించండి మరియు ర్యాంక్ చేయండి.", + "MediaSegmentType.Outro": "ఔట్రో", + "LabelGroupShowsIntoCollections": "సమూహ ప్రదర్శనలను సేకరణలలోకి మార్చడం", + "LabelGroupShowsIntoCollectionsHelp": "ప్రదర్శన జాబితాలను ప్రదర్శించేటప్పుడు సేకరణలోని ప్రదర్శనలు ఒక సమూహ అంశంగా ప్రదర్శించబడతాయి.", + "LabelSyncPlaySettingsMinDelaySkipToSync": "స్కిప్‌టోసింక్ కనీస ఆలస్యం", + "LabelSyncPlaySettingsSyncCorrection": "సమకాలీకరణ దిద్దుబాటు", + "LabelMediaSegmentsType": "{0} విభాగాలు", + "LabelSlowResponseEnabled": "సర్వర్ సమాధానం ఇవ్వడంలో నెమ్మదిగా ఉంటే హెచ్చరిక సందేశాన్ని లాగ్ చేయండి", + "MediaSegmentSkipPrompt": "{0} దాటవేయి", + "LabelNotInstalled": "ఇన్‌స్టాల్ చేయబడలేదు", + "ItemDetails": "వస్తువు వివరాలు", + "LabelLevel": "స్థాయి", + "LabelSyncPlaySettingsSpeedToSync": "స్పీడ్‌టుసింక్ ని ప్రారంభించండి", + "MediaSegmentAction.Skip": "దాటవేయి", + "MediaSegmentAction.None": "ఏదీ లేదు", + "MixedMoviesShows": "మిశ్రమ సినిమాలు మరియు కార్యక్రమాలు", + "LabelBuildVersion": "నిర్మించు వెర్షన్", + "LabelDuration": "వ్యవధి", + "LabelSubtitleStyling": "ఉపశీర్షిక శైలి", + "LabelSyncPlayNoGroups": "సమూహాలు అందుబాటులో లేవు", + "LogoScreensaver": "లోగో స్క్రీన్‌సేవర్", + "Lyricist": "గీత రచయిత", + "LimitSupportedVideoResolution": "గరిష్ట మద్దతు ఉన్న వీడియో స్పష్టతను పరిమితం చేయండి", + "LabelEnableAudioVbr": "విబిఆర్ ఆడియో ఎన్‌కోడింగ్‌ను ప్రారంభించండి", + "LabelEnablePlugin": "ప్లగిన్‌ను ప్రారంభించు", + "MessageSplitVersionsError": "వెర్షన్‌లను విభజించేటప్పుడు ఎర్రర్ సంభవించింది", + "Native": "స్థానికం", + "OriginalAirDate": "అసలు ప్రసార తేదీ", + "Lyric": "లిరిక్", + "MetadataImagesLoadError": "మెటాడేటా సెట్టింగ్‌లను లోడ్ చేయడంలో విఫలమైంది", + "LabelSyncPlaySettingsExtraTimeOffsetHelp": "సమయ సమకాలీకరణ కోసం ఎంచుకున్న పరికరంతో సమయ ఆఫ్‌సెట్‌ను (msలో) మాన్యువల్‌గా సర్దుబాటు చేయండి. జాగ్రత్తగా సర్దుబాటు చేయండి.", + "LabelTextWeight": "టెక్స్ట్ బరువు", + "OptionDateEpisodeAdded": "తేదీ ఎపిసోడ్ జోడించబడింది", + "LabelDummyChapterDuration": "విరామం", + "LabelChapterImageResolution": "స్పష్టత", + "LabelDummyChapterDurationHelp": "డమ్మీ అధ్యాయాల మధ్య విరామం. డమ్మీ అధ్యాయాల జనరేషన్‌ను నిలిపివేయడానికి 0కి సెట్ చేయండి. దీన్ని మార్చడం వల్ల ఇప్పటికే ఉన్న డమ్మీ అధ్యాయాలపై ఎటువంటి ప్రభావం ఉండదు.", + "MoviesAndShows": "సినిమాలు మరియు షోలు", + "LibraryNameInvalid": "లైబ్రరీ పేరు ఖాళీగా ఉండకూడదు.", + "VideoResolutionNotSupported": "వీడియో స్పష్టతకు మద్దతు లేదు", + "PreferSystemNativeHwDecoder": "ఓఎస్ నేటివ్ డిఎక్స్‌విఎ లేదా విఎ-ఏపీఐ హార్డ్‌వేర్ డీకోడర్‌లను ఇష్టపడండి", + "EnableVppTonemapping": "వీపీపీ టోన్ మ్యాపింగ్‌ను ప్రారంభించండి", + "EnableVideoToolboxTonemapping": "వీడియోటూల్‌బాక్స్ టోన్ మ్యాపింగ్‌ను ప్రారంభించండి", + "EnableEnhancedNvdecDecoder": "మెరుగుపరచబడిన ఎన్విడిఇసి డీకోడర్‌ను ప్రారంభించండి", + "AudioBitrateNotSupported": "ఆడియో బిట్రేట్‌కు మద్దతు లేదు", + "AllowVppTonemappingHelp": "పూర్తి ఇంటెల్ డ్రైవర్ ఆధారిత టోన్-మ్యాపింగ్. ప్రస్తుతం హెచ్‌డిఆర్10 వీడియోలతో కొన్ని హార్డ్‌వేర్‌లపై మాత్రమే పనిచేస్తుంది. మరొక ఓపెన్‌సిఎల్ అమలుతో పోలిస్తే దీనికి అధిక ప్రాధాన్యత ఉంది.", + "AllowVideoToolboxTonemappingHelp": "వీడియోటూల్‌బాక్స్ ద్వారా అందించబడిన హార్డ్‌వేర్-యాక్సిలరేటెడ్ టోన్-మ్యాపింగ్. ఇది హెచ్‌డిఆర్10, హెచ్‌డిఆర్10+ మరియు హెచ్‌ఎల్‌జితో సహా చాలా హెచ్‌డిఆర్ ఫార్మాట్‌లతో పనిచేస్తుంది, కానీ డాల్బీ విజన్ ప్రొఫైల్ 5తో పనిచేయదు. మరొక మెటల్ అమలుతో పోలిస్తే దీనికి అధిక ప్రాధాన్యత ఉంది.", + "EnableGamepadHelp": "కనెక్ట్ చేయబడిన ఏవైనా కంట్రోలర్‌ల నుండి ఇన్‌పుట్ వినండి. (అవసరం: 'టీవీ' డిస్‌ప్లే మోడ్)", + "VideoLevelNotSupported": "వీడియో కోడెక్ స్థాయికి మద్దతు లేదు", + "VideoProfileNotSupported": "వీడియో కోడెక్ ప్రొఫైల్‌కు మద్దతు లేదు", + "EnableIntelLowPowerHevcHwEncoder": "ఇంటెల్ తక్కువ-శక్తి హెవిసి హార్డ్‌వేర్ ఎన్‌కోడర్‌ను ప్రారంభించండి", + "IntelLowPowerEncHelp": "తక్కువ-పవర్ ఎన్‌కోడింగ్ అనవసరమైన సీపీయూ-జిపియు సమకాలీకరణను ఉంచగలదు. లైనక్స్లో i915 హెచ్‌యుసి ఫర్మ్‌వేర్ కాన్ఫిగర్ చేయబడకపోతే వాటిని నిలిపివేయాలి.", + "EnableEnhancedNvdecDecoderHelp": "మెరుగైన ఎన్విడిఇసి అమలు, మీరు డీకోడింగ్ లోపాలను ఎదుర్కొంటే క్యూవిడ్ని ఉపయోగించడానికి ఈ ఎంపికను నిలిపివేయండి.", + "LabelHardwareEncodingOptions": "హార్డ్‌వేర్ ఎన్‌కోడింగ్ ఎంపికలు", + "MediaInfoDvProfile": "డివి ప్రొఫైల్", + "MediaInfoBlPresentFlag": "డివి బిఎల్ ప్రీసెట్ ఫ్లాగ్", + "EncodingFormatHelp": "జెల్లీఫిన్ ట్రాన్స్‌కోడ్ చేయాల్సిన వీడియో ఎన్‌కోడింగ్‌ను ఎంచుకోండి. ఎంచుకున్న ఫార్మాట్‌కు హార్డ్‌వేర్ త్వరణం అందుబాటులో లేనప్పుడు జెల్లీఫిన్ సాఫ్ట్‌వేర్ ఎన్‌కోడింగ్‌ను ఉపయోగిస్తుంది. H264 ఎన్‌కోడింగ్ ఎల్లప్పుడూ ప్రారంభించబడుతుంది.", + "UnknownVideoStreamInfo": "వీడియో స్ట్రీమ్ సమాచారం తెలియదు", + "Trickplay": "ట్రిక్‌ప్లే", + "Short": "చిన్నది", + "HearingImpairedShort": "హై/ఎస్డీహెచ్", + "LabelIsHearingImpaired": "వినికిడి లోపం ఉన్నవారికి (ఎస్డీహెచ్)", + "BlockingScan": "బ్లాకింగ్ - క్యూల జనరేషన్, పూర్తయ్యే వరకు స్కాన్‌ను బ్లాక్ చేస్తుంది", + "BehindTheScenes": "తెర వెనుక", + "LabelTrickplayAccel": "హార్డ్‌వేర్ డీకోడింగ్‌ను ప్రారంభించండి", + "TonemappingModeHelp": "టోన్ మ్యాపింగ్ మోడ్‌ను ఎంచుకోండి. మీరు హైలైట్‌లను పూర్తిగా కోల్పోతున్నట్లు అనిపిస్తే, ఆర్‌జిబి మోడ్‌కి మారడానికి ప్రయత్నించండి.", + "PlaybackError.SERVER_ERROR": "సర్వర్ లోపం కారణంగా ప్లేబ్యాక్ విఫలమైంది.", + "ForeignPartsOnly": "బలవంతంగా/విదేశీ భాగాలు మాత్రమే", + "LabelTrickplayAccelEncoding": "హార్డ్‌వేర్ యాక్సిలరేటెడ్ ఎంజెపిఇజి ఎన్‌కోడింగ్‌ను ప్రారంభించండి", + "LabelTrickplayAccelEncodingHelp": "ప్రస్తుతం క్యూఎస్‌వి, విఎ-ఏపీఐ, వీడియోటూల్‌బాక్స్ మరియు ఆర్‌కెఎంపిపి లలో మాత్రమే అందుబాటులో ఉంది, ఈ ఎంపిక ఇతర హార్డ్‌వేర్ త్వరణ పద్ధతులపై ఎటువంటి ప్రభావాన్ని చూపదు.", + "LabelTrickplayKeyFrameOnlyExtraction": "కీ ఫ్రేమ్‌ల నుండి మాత్రమే చిత్రాలను రూపొందించండి", + "LabelTrickplayKeyFrameOnlyExtractionHelp": "తక్కువ ఖచ్చితమైన సమయంతో గణనీయంగా వేగవంతమైన ప్రాసెసింగ్ కోసం మాత్రమే కీ ఫ్రేమ్‌లను సంగ్రహించండి. కాన్ఫిగర్ చేయబడిన హార్డ్‌వేర్ డీకోడర్ ఈ మోడ్‌కు మద్దతు ఇవ్వకపోతే, బదులుగా సాఫ్ట్‌వేర్ డీకోడర్‌ను ఉపయోగిస్తుంది.", + "LabelScanBehaviorHelp": "డిఫాల్ట్ ప్రవర్తన నాన్ బ్లాకింగ్, ఇది ట్రిక్‌ప్లే జనరేషన్ పూర్తయ్యే ముందు లైబ్రరీకి మీడియాను జోడిస్తుంది. బ్లాక్ చేయడం వలన లైబ్రరీకి మీడియా జోడించబడే ముందు ట్రిక్‌ప్లే ఫైల్‌లు జనరేట్ అయ్యేలా చేస్తుంది, కానీ స్కాన్‌లు చాలా ఎక్కువసేపు ఉంటాయి.", + "PriorityBelowNormal": "సాధారణం కంటే తక్కువ", + "PlaybackError.ASS_RENDER_ERROR": "యాస్/ఎస్ఎస్ఏ ఉపశీర్షిక రెండరర్‌లో ఒక ఎర్రర్ ఎదురైంది.", + "PlaybackError.MEDIA_DECODE_ERROR": "మీడియాను డీకోడ్ చేయడంలో లోపం కారణంగా ప్లేబ్యాక్ విఫలమైంది.", + "PlaybackError.MEDIA_NOT_SUPPORTED": "ఈ క్లయింట్ మీడియాకు మద్దతు ఇవ్వనందున ప్లేబ్యాక్ విఫలమైంది.", + "PlaybackError.NETWORK_ERROR": "నెట్‌వర్క్ లోపం కారణంగా ప్లేబ్యాక్ విఫలమైంది.", + "PlaybackError.FATAL_HLS_ERROR": "హెచ్‌ఎల్‌ఎస్ స్ట్రీమ్‌లో ఒక ప్రాణాంతకమైన లోపం ఎదురైంది.", + "LabelVppTonemappingContrast": "వీపీపీ టోన్ మ్యాపింగ్ కాంట్రాస్ట్ గెయిన్", + "InterlacedVideoNotSupported": "ఇంటర్లేస్డ్ వీడియోకు మద్దతు లేదు", + "VideoRangeTypeNotSupported": "వీడియో పరిధి రకానికి మద్దతు లేదు", + "Controls": "నియంత్రణలు", + "AudioChannelsNotSupported": "ఆడియో ఛానెల్‌ల సంఖ్యకు మద్దతు లేదు", + "AudioBitDepthNotSupported": "ఆడియో బిట్ డెప్త్ కు మద్దతు లేదు", + "LabelEncodingFormatOptions": "ఎన్‌కోడింగ్ ఫార్మాట్ ఎంపికలు", + "AudioIsExternal": "ఆడియో స్ట్రీమ్ బాహ్యమైనది", + "VideoBitrateNotSupported": "వీడియో బిట్రేట్‌కు మద్దతు లేదు", + "DeletedScene": "తొలగించబడిన దృశ్యం", + "Trailer": "ట్రైలర్", + "Sample": "నమూనా", + "MediaInfoDoViTitle": "డివి టైటిల్", + "MediaInfoDvVersionMinor": "డివి వెర్షన్ మైనర్", + "MediaInfoDvLevel": "డివి స్థాయి", + "MediaInfoRpuPresentFlag": "డివి ఆర్‌పియు ప్రీసెట్ ఫ్లాగ్", + "LabelTonemappingMode": "టోన్ మ్యాపింగ్ మోడ్", + "Unknown": "తెలియదు", + "AllowAv1Encoding": "AV1 ఫార్మాట్‌లో ఎన్‌కోడింగ్‌ను అనుమతించండి", + "EnableIntelLowPowerH264HwEncoder": "ఇంటెల్ తక్కువ-శక్తి H.264 హార్డ్‌వేర్ ఎన్‌కోడర్‌ను ప్రారంభించండి", + "MediaInfoVideoRangeType": "వీడియో పరిధి రకం", + "MediaInfoDvVersionMajor": "డివి వెర్షన్ మేజర్", + "PriorityHigh": "అధిక", + "PriorityAboveNormal": "సాధారణం కంటే ఎక్కువ", + "PriorityNormal": "సాధారణం", + "LabelVppTonemappingBrightnessHelp": "వీపీపీ టోన్ మ్యాపింగ్‌లో బ్రైట్‌నెస్ గెయిన్‌ను వర్తింపజేయండి. సిఫార్సు చేయబడిన విలువ 16.", + "VideoCodecNotSupported": "వీడియో కోడెక్‌కు మద్దతు లేదు", + "SubtitleCodecNotSupported": "ఉపశీర్షిక కోడెక్‌కు మద్దతు లేదు", + "SecondaryAudioNotSupported": "ద్వితీయ ఆడియో ట్రాక్‌లకు మద్దతు లేదు", + "Scene": "దృశ్యం", + "Interview": "ఇంటర్వ్యూ", + "Unreleased": "ఇంకా విడుదల కాలేదు", + "VideoBitDepthNotSupported": "వీడియో యొక్క బిట్ డెప్త్‌కు మద్దతు లేదు", + "Featurette": "ఫీచర్", + "LabelVppTonemappingContrastHelp": "వీపీపీ టోన్ మ్యాపింగ్‌లో కాంట్రాస్ట్ గెయిన్‌ను వర్తింపజేయండి. సిఫార్సు చేయబడిన విలువ 1.", + "AiTranslated": "AI అనువదించబడింది", + "LabelVppTonemappingBrightness": "వీపీపీ టోన్ మ్యాపింగ్ బ్రైట్‌నెస్ గెయిన్", + "Select": "ఎంచుకోండి", + "VideoCodecTagNotSupported": "వీడియో కోడెక్ ట్యాగ్‌కు మద్దతు లేదు", + "AudioProfileNotSupported": "ఆడియో కోడెక్ ప్రొఫైల్‌కు మద్దతు లేదు", + "DirectPlayError": "డైరెక్ట్ ప్లేబ్యాక్‌ను ప్రారంభించడంలో లోపం ఉంది", + "SelectAll": "అన్నీ ఎంచుకోండి", + "PlaybackError.PLAYER_ERROR": "ప్రాణాంతకమైన ప్లేయర్ లోపం కారణంగా ప్లేబ్యాక్ విఫలమైంది.", + "PlaybackError.NO_MEDIA_ERROR": "ప్లే చేయడానికి చెల్లుబాటు అయ్యే మీడియా సోర్స్ దొరకలేదు.", + "MachineTranslated": "యంత్ర అనువాదం", + "AudioCodecNotSupported": "ఆడియో కోడెక్‌కు మద్దతు లేదు", + "LabelScanBehavior": "స్కాన్ ప్రవర్తన", + "ContainerNotSupported": "కంటైనర్‌కు మద్దతు లేదు", + "AnamorphicVideoNotSupported": "అనమార్ఫిక్ వీడియోకు మద్దతు లేదు", + "ThemeSong": "థీమ్ పాట", + "MediaInfoDvBlSignalCompatibilityId": "డివి బిఎల్ సిగ్నల్ అనుకూలత ఐడి", + "NonBlockingScan": "నాన్ బ్లాకింగ్ - క్యూ జనరేషన్, ఆపై తిరిగి వస్తుంది", + "AudioSampleRateNotSupported": "ఆడియో నమూనా రేటుకు మద్దతు లేదు", + "ContainerBitrateExceedsLimit": "వీడియో బిట్రేట్ పరిమితిని మించిపోయింది", + "PriorityIdle": "ఖాళీగా ఉంది", + "Clip": "క్లిప్", + "PlaybackError.NotAllowed": "ఈ మీడియా ప్లేబ్యాక్ అనుమతించబడదు.", + "UnknownAudioStreamInfo": "ఆడియో స్ట్రీమ్ సమాచారం తెలియదు", + "ThemeVideo": "థీమ్ వీడియో", + "LabelVideoRangeType": "వీడియో పరిధి రకం", + "MediaInfoElPresentFlag": "డివి ఎల్ ప్రీసెట్ ఫ్లాగ్", + "EnableSplashScreen": "స్ప్లాష్ స్క్రీన్ చిత్రాన్ని ప్రారంభించండి", + "RefFramesNotSupported": "రిఫరెన్స్ ఫ్రేమ్‌లకు మద్దతు లేదు", + "LabelEnableGamepad": "గేమ్‌ప్యాడ్‌ను ప్రారంభించండి", + "VideoFramerateNotSupported": "వీడియో ఫ్రేమ్‌రేట్‌కు మద్దతు లేదు", + "PlaybackError.RateLimitExceeded": "రేట్ పరిమితుల కారణంగా ఈ సమయంలో ఈ మీడియాను ప్లే చేయడం సాధ్యం కాదు.", + "PlaylistError.CreateFailed": "ప్లేజాబితాను సృష్టించడంలో లోపం ఏర్పడింది", + "PlaylistError.UpdateFailed": "ప్లేజాబితాను నవీకరించడంలో లోపం ఏర్పడింది", + "PluginEnableError": "ప్లగిన్‌ను ప్రారంభించేటప్పుడు లోపం సంభవించింది.", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "ఎక్స్‌ట్రాలు తరచుగా పేరెంట్ లాగానే ఎంబెడెడ్ పేరును కలిగి ఉంటాయి, ఏమైనప్పటికీ వాటి కోసం ఎంబెడెడ్ శీర్షికలను ఉపయోగించడానికి దీన్ని తనిఖీ చేయండి.", + "PreferNonstandardArtistsTagHelp": "అందుబాటులో ఉన్నప్పుడు ARTIST ట్యాగ్‌కు బదులుగా ప్రామాణికం కాని ARTISTS ట్యాగ్‌ను ఉపయోగించండి.", + "AllowEmbeddedSubtitlesHelp": "మీడియా కంటైనర్లలో ప్యాక్ చేయబడిన ఉపశీర్షికలను నిలిపివేయండి. పూర్తి లైబ్రరీ రిఫ్రెష్ అవసరం.", + "AllowEmbeddedSubtitles": "వివిధ రకాల ఎంబెడెడ్ ఉపశీర్షికలను నిలిపివేయండి", + "AllowEmbeddedSubtitlesAllowAllOption": "అన్నీ అనుమతించు", + "RememberSubtitleSelections": "మునుపటి అంశం ఆధారంగా ఉపశీర్షిక ట్రాక్‌ను సెట్ చేయండి", + "PreviewLyrics": "సాహిత్యాన్ని పరిదృశ్యం చేయండి", + "RetryWithGlobalSearch": "గ్లోబల్ శోధనతో మళ్ళీ ప్రయత్నించండి", + "PreviousChapter": "మునుపటి అధ్యాయం", + "ReleaseGroup": "విడుదల సమూహం", + "RememberAudioSelections": "మునుపటి అంశం ఆధారంగా ఆడియో ట్రాక్‌ను సెట్ చేయండి", + "Reset": "తిరిగి నిర్దారించు", + "RememberAudioSelectionsHelp": "ఆడియో ట్రాక్‌ను చివరి వీడియోకు దగ్గరగా ఉండేలా సెట్ చేయడానికి ప్రయత్నించండి.", + "RememberSubtitleSelectionsHelp": "చివరి వీడియోకు దగ్గరగా ఉన్న సబ్‌టైటిల్ ట్రాక్‌ను సెట్ చేయడానికి ప్రయత్నించండి.", + "RenderPgsSubtitleHelp": "క్లయింట్ బర్న్డ్ ఇన్ సబ్‌టైటిల్స్‌ని ఉపయోగించడానికి బదులుగా PGS సబ్‌టైటిల్స్‌ని రెండర్ చేయాలా వద్దా అని నిర్ణయించండి. ఇది క్లయింట్-సైడ్ రెండరింగ్ పనితీరుకు బదులుగా సర్వర్-సైడ్ ట్రాన్స్‌కోడింగ్‌ను నివారించవచ్చు.", + "SaveLyricsIntoMediaFoldersHelp": "ఆడియో ఫైళ్ల పక్కన సాహిత్యాన్ని నిల్వ చేయడం వల్ల వాటిని మరింత సులభంగా నిర్వహించవచ్చు.", + "SavePassword": "పాస్‌వర్డ్‌ను సేవ్ చేయండి", + "SaveRecordingNFO": "ఎన్ఎఫ్ఓలో రికార్డింగ్ ఇపిజి మెటాడేటాను సేవ్ చేయండి", + "SaveRecordingNFOHelp": "సైడ్ మీడియాతో పాటు ఇపిజి లిస్టింగ్ ప్రొవైడర్ నుండి మెటాడేటాను సేవ్ చేయండి.", + "SaveRecordingImages": "రికార్డింగ్ ఇపిజి చిత్రాలను సేవ్ చేయండి", + "SaveRecordingImagesHelp": "సైడ్ మీడియాతో పాటు ఇపిజి లిస్టింగ్ ప్రొవైడర్ నుండి చిత్రాలను సేవ్ చేయండి.", + "StoryArc": "స్టోరీ ఆర్క్", + "SelectPreferredTranscodeVideoCodecHelp": "ట్రాన్స్‌కోడ్ చేయడానికి ప్రాధాన్య వీడియో కోడెక్‌ను ఎంచుకోండి. ప్రాధాన్య కోడెక్‌కు మద్దతు లేకపోతే, సర్వర్ తదుపరి అందుబాటులో ఉన్న ఉత్తమ కోడెక్‌ను ఉపయోగిస్తుంది.", + "SelectPreferredTranscodeVideoAudioCodecHelp": "వీడియో కంటెంట్ కోసం ట్రాన్స్‌కోడ్ చేయడానికి ప్రాధాన్య ఆడియో కోడెక్‌ను ఎంచుకోండి. ప్రాధాన్య కోడెక్‌కు మద్దతు లేకపోతే, సర్వర్ తదుపరి అందుబాటులో ఉన్న ఉత్తమ కోడెక్‌ను ఉపయోగిస్తుంది.", + "ShowParentImages": "సిరీస్ చిత్రాలను చూపించు", + "StreamCountExceedsLimit": "స్ట్రీమ్‌ల సంఖ్య పరిమితిని మించిపోయింది", + "SubtitleLightGray": "లేత బూడిద రంగు", + "SubtitleGreen": "ఆకుపచ్చ", + "Track": "ట్రాక్", + "TypeOptionPluralMusicArtist": "సంగీత కళాకారులు", + "TypeOptionPluralAudio": "ఆడియోలు", + "UnknownError": "తెలియని లోపం సంభవించింది.", + "LabelImageInterval": "చిత్ర విరామం", + "UseEpisodeImagesInNextUp": "'తదుపరిది' మరియు 'చూడటం కొనసాగించు' విభాగాలలో ఎపిసోడ్ చిత్రాలను ఉపయోగించండి", + "LabelProcessPriority": "ప్రక్రియ ప్రాధాన్యత", + "LabelWidthResolutionsHelp": "ట్రిక్‌ప్లే చిత్రాలు రూపొందించబడే వెడల్పుల (px) కామాతో వేరు చేయబడిన జాబితా. అన్ని చిత్రాలు మూలానికి అనులోమానుపాతంలో రూపొందించబడాలి, కాబట్టి 16:9 వీడియోలో 320 వెడల్పు 320x180 చుట్టూ ముగుస్తుంది.", + "PluginUninstallError": "ప్లగిన్‌ను అన్‌ఇన్‌స్టాల్ చేస్తున్నప్పుడు లోపం సంభవించింది.", + "LabelProcessPriorityHelp": "దీన్ని తక్కువగా లేదా ఎక్కువగా సెట్ చేయడం వలన సీపీయూ ఇతర ప్రక్రియలకు సంబంధించి ffmpeg ట్రిక్‌ప్లే జనరేషన్ ప్రాసెస్‌కు ఎలా ప్రాధాన్యత ఇస్తుందో నిర్ణయిస్తుంది. ట్రిక్‌ప్లే చిత్రాలను ఉత్పత్తి చేస్తున్నప్పుడు మీరు మందగమనాన్ని గమనించినప్పటికీ వాటి జనరేషన్‌ను పూర్తిగా ఆపకూడదనుకుంటే, థ్రెడ్ కౌంట్‌తో పాటు దీన్ని తగ్గించడానికి ప్రయత్నించండి.", + "LabelJpegQuality": "జెపిఇజి నాణ్యత", + "LabelTileWidthHelp": "X దిశలో ప్రతి టైల్‌కు గరిష్ట సంఖ్యలో చిత్రాలు.", + "LabelTrickplayThreadsHelp": "ffmpeg యొక్క '-థ్రెడ్‌లు' ఆర్గ్యుమెంట్‌కు పాస్ చేయాల్సిన థ్రెడ్‌ల సంఖ్య.", + "LabelExtractTrickplayDuringLibraryScanHelp": "లైబ్రరీ స్కాన్ సమయంలో వీడియోలు దిగుమతి అయినప్పుడు ట్రిక్‌ప్లే చిత్రాలను రూపొందించండి. లేకపోతే, ట్రిక్‌ప్లే చిత్రాల షెడ్యూల్ చేయబడిన పని సమయంలో అవి సంగ్రహించబడతాయి. జనరేషన్‌ను నాన్-బ్లాకింగ్‌కు సెట్ చేస్తే లైబ్రరీ స్కాన్ పూర్తి కావడానికి పట్టే సమయాన్ని ఇది ప్రభావితం చేయదు.", + "SettingsPageLoadError": "సెట్టింగ్‌ల పేజీని లోడ్ చేయడంలో విఫలమైంది", + "ReadInputAtNativeFramerate": "నేటివ్ ఫ్రేమ్ రేట్‌లో ఇన్‌పుట్‌ను చదవండి", + "ReadInputAtNativeFramerateHelp": "ఈ ఎంపికను ప్రారంభించడం వలన కొన్ని సమస్యలు పరిష్కరించబడవచ్చు, ఉదా. ప్రత్యక్ష ప్రసారాలు ముందుగానే ఆగిపోవడం.", + "PlaybackErrorPlaceHolder": "ఇది జెల్లీఫిన్ ప్లే చేయలేని భౌతిక మీడియా కోసం ఒక ప్లేస్‌హోల్డర్. ప్లే చేయడానికి డిస్క్‌ను చొప్పించండి.", + "PreferNonstandardArtistsTag": "అందుబాటులో ఉంటే ARTISTS ట్యాగ్‌కు ప్రాధాన్యత ఇవ్వండి", + "TypeOptionPluralEpisode": "ఎపిసోడ్‌లు", + "TextSent": "టెక్స్ట్ పంపబడింది.", + "LabelExtractTrickplayDuringLibraryScan": "లైబ్రరీ స్కాన్ సమయంలో ట్రిక్‌ప్లే చిత్రాలను సంగ్రహించండి", + "Studio": "స్టూడియో", + "SubtitleBlack": "నలుపు", + "SaveLyricsIntoMediaFolders": "సాహిత్యాన్ని మీడియా ఫోల్డర్లలో సేవ్ చేయండి", + "ScreenResolution": "స్క్రీన్ స్పష్టత", + "SubtitleRed": "ఎరుపు", + "SubtitleGray": "బూడిద రంగు", + "TypeOptionPluralVideo": "వీడియోలు", + "TypeOptionPluralSeries": "టీవీ కార్యక్రమాలు", + "LabelTileHeight": "టైల్ ఎత్తు", + "SubtitleCyan": "నీలి నీలం", + "SubtitleBlue": "నీలం", + "LabelJpegQualityHelp": "ట్రిక్‌ప్లే చిత్రాల కోసం జెపిఇజి కంప్రెషన్ నాణ్యత.", + "Print": "ప్రింట్", + "PlaylistPublicDescription": "ఈ ప్లేజాబితాను లాగిన్ అయిన ఏ యూజర్ అయినా వీక్షించడానికి అనుమతించండి.", + "PlaylistError.AddFailed": "ప్లేజాబితాకు జోడించడంలో లోపం", + "UploadCustomImage": "కస్టమ్ ఇమేజ్‌ను అప్‌లోడ్ చేయండి", + "SubtitleMagenta": "మెజెంటా", + "UseEpisodeImagesInNextUpHelp": "'తదుపరిది' మరియు 'చూడటం కొనసాగించు' విభాగాలు షో యొక్క ప్రాథమిక థంబ్‌నెయిల్‌కు బదులుగా ఎపిసోడ్ చిత్రాలను థంబ్‌నెయిల్‌లుగా ఉపయోగిస్తాయి.", + "PleaseConfirmRepositoryInstallation": "పైన పేర్కొన్నది చదివారని మరియు ప్లగిన్ రిపోజిటరీ ఇన్‌స్టాలేషన్‌తో కొనసాగాలనుకుంటున్నారని నిర్ధారించడానికి దయచేసి సరే క్లిక్ చేయండి.", + "PluginDisableError": "ప్లగిన్‌ను నిలిపివేస్తున్నప్పుడు లోపం సంభవించింది.", + "StereoDownmixAlgorithmHelp": "మల్టీ-ఛానల్ ఆడియోను స్టీరియోకు డౌన్‌మిక్స్ చేయడానికి ఉపయోగించే అల్గోరిథం.", + "TypeOptionPluralBoxSet": "బాక్స్ సెట్లు", + "Translator": "అనువదించు", + "PlaylistPublic": "పబ్లిక్ యాక్సెస్‌ను అనుమతించండి", + "PluginLoadConfigError": "ప్లగిన్ ఆకృతీకరణ పేజీలను పొందుతున్నప్పుడు లోపం సంభవించింది.", + "Regional": "ప్రాంతీయ", + "PreferEmbeddedExtrasTitlesOverFileNames": "అదనపు లక్షణాల కోసం ఫైల్ పేర్ల కంటే ఎంబెడెడ్ శీర్షికలను ఇష్టపడండి", + "SubtitleWhite": "తెలుపు", + "SubtitleYellow": "పసుపు", + "ResolutionMatchSource": "మూలాన్ని సరిపోల్చండి", + "UserMenu": "వినియోగదారు మెనూ", + "SecondarySubtitles": "ద్వితీయ ఉపశీర్షికలు", + "UseCustomTagDelimiters": "కస్టమ్ ట్యాగ్ డీలిమిటర్‌ని ఉపయోగించండి", + "UseCustomTagDelimitersHelp": "కస్టమ్ అక్షరాలతో కళాకారుడు/శైలి ట్యాగ్‌లను విభజించండి.", + "LabelWidthResolutions": "వెడల్పు రిజల్యూషన్‌లు", + "LabelQscale": "క్యూస్కేల్", + "ExtractTrickplayImagesHelp": "ట్రిక్‌ప్లే చిత్రాలు చాప్టర్ చిత్రాల మాదిరిగానే ఉంటాయి, కానీ అవి కంటెంట్ మొత్తం పొడవునా విస్తరించి ఉంటాయి మరియు వీడియోలను స్క్రబ్ చేస్తున్నప్పుడు ప్రివ్యూను చూపించడానికి ఉపయోగించబడతాయి.", + "SearchForLyrics": "సాహిత్యం కోసం శోధించండి", + "LabelTileWidth": "టైల్ వెడల్పు", + "SearchResultsEmpty": "క్షమించండి! \"{0}\" కోసం ఫలితాలు కనుగొనబడలేదు", + "LogLoadFailure": "లాగ్ ఫైల్‌ను లోడ్ చేయడంలో విఫలమైంది. ఇది ఇప్పటికీ చురుకుగా వ్రాయబడి ఉండవచ్చు.", + "LabelTileHeightHelp": "Y దిశలో ప్రతి టైల్‌కు గరిష్ట సంఖ్యలో చిత్రాలు.", + "LabelQscaleHelp": "ffmpeg ద్వారా చిత్రాల అవుట్‌పుట్ యొక్క నాణ్యత స్కేల్, 2 అత్యధిక నాణ్యత మరియు 31 అత్యల్ప నాణ్యత.", + "LabelTrickplayThreads": "FFmpeg థ్రెడ్‌లు", + "RenderPgsSubtitle": "ప్రయోగాత్మక పీజీఎస్ ఉపశీర్షిక రెండరింగ్", + "LabelImageIntervalHelp": "ప్రతి కొత్త ట్రిక్‌ప్లే చిత్రం మధ్య సమయ విరామం (ms).", + "Typewriter": "టైప్‌రైటర్", + "OptionExtractTrickplayImage": "ట్రిక్‌ప్లే ఇమేజ్ సంగ్రహణను ప్రారంభించండి", + "AllowEmbeddedSubtitlesAllowImageOption": "చిత్రాన్ని అనుమతించు", + "AllowEmbeddedSubtitlesAllowTextOption": "టెక్స్ట్‌ను అనుమతించు", + "ViewLyrics": "సాహిత్యాన్ని వీక్షించండి", + "Retry": "మళ్ళీ ప్రయత్నించండి", + "Remixer": "రీమిక్సర్", + "Production": "ఉత్పత్తి", + "ReplaceTrickplayImages": "ఇప్పటికే ఉన్న ట్రిక్‌ప్లే చిత్రాలను భర్తీ చేయండి", + "TypeOptionPluralMusicAlbum": "సంగీత ఆల్బమ్‌లు", + "LabelTrackGain": "ట్రాక్ లాభం", + "AllowEmbeddedSubtitlesAllowNoneOption": "ఎవరినీ అనుమతించవద్దు", + "PluginLoadRepoError": "రిపోజిటరీ నుండి ప్లగిన్ వివరాలను పొందుతున్నప్పుడు లోపం సంభవించింది.", + "StorageType.Unknown": "తెలియదు" } diff --git a/src/strings/th.json b/src/strings/th.json index 9a3993740..09dc3de41 100644 --- a/src/strings/th.json +++ b/src/strings/th.json @@ -133,7 +133,7 @@ "ButtonCast": "แคสต์ไปยังอุปกรณ์", "ButtonBack": "กลับ", "ButtonAddMediaLibrary": "เพิ่มมีเดียไลบรารี", - "BurnSubtitlesHelp": "เลือกว่าเซิร์ฟเวอร์ควรฝังคำบรรยายลงไปในวิดีโอในขณะที่แปลงรหัสวิดีโอหรือไม่ หลีกเหลี่ยงสิ่งนี้จะทำให้ประสิทธิภาพดีขึ้นอย่างมาก เลือก อัตโนมัติ เพื่อที่จะฝังคำบรรยายตามฟอร์แมต (VobSub, PGS, SUB, IDX, และอื่นๆ) และคำบรรยาย ASS หรือ SSA บางรายการ", + "BurnSubtitlesHelp": "กำหนดว่าเซิร์ฟเวอร์ควรเผาคำบรรยายลงในวิดีโอหรือไม่ การหลีกเลี่ยงการเผาคำบรรยายจะช่วยเพิ่มประสิทธิภาพได้อย่างมาก หากเลือก “อัตโนมัติ” ระบบจะเผาคำบรรยายที่เป็นภาพ (เช่น VobSub, PGS, SUB, IDX เป็นต้น) และคำบรรยายบางประเภทในรูปแบบ ASS หรือ SSA โดยอัตโนมัติ", "Auto": "อัตโนมัติ", "BirthPlaceValue": "สถานที่เกิด: {0}", "BirthLocation": "สถานที่เกิด", @@ -144,8 +144,85 @@ "Aired": "ออกอากาศ", "AlwaysPlaySubtitles": "แสดงตลอด", "AllowCollectionManagement": "อนุญาตให้ผู้ใช้นี้จัดการคอลเลกชัน", - "AllowedRemoteAddressesHelp": "คอมม่าเป็นการแบ่งเลขที่อยู่ IP หรือ การเข้า IP/netmask สำหรับโครงข่ายนั้นที่จะต้องถูกอนุญาตให้เชื่อมต่อระยะไกล ถ้าเว้นว่างไว้การเชื่อมต่อระยะไกลจะถูกอนุญาตโดยอัตโนมัติ", + "AllowedRemoteAddressesHelp": "คอมม่าเป็นการแบ่งเลขที่อยู่ IP หรือ การเข้า IP/netmask สำหรับโครงข่ายนั้นที่จะต้องถูกอนุญาตให้เชื่อมต่อระยะไกล ถ้าเว้นว่างไว้การเชื่อมต่อระยะไกลจะถูกอนุญาตโดยอัตโนมัติ", "AllowFfmpegThrottling": "กำลังเข้ารหัส", "AllowContentWithTagsHelp": "แสดงสื่อที่สอดคล้องกับ Tag เฉพาะทางอย่างน้อย 1 Tag", - "AllowSubtitleManagement": "อนุญาติให้ผู้ใช้ท่านนี้แก้ไขคำบรรยายใต้วิดีโอได้" + "AllowSubtitleManagement": "อนุญาติให้ผู้ใช้ท่านนี้แก้ไขคำบรรยายใต้วิดีโอได้", + "AllowFfmpegThrottlingHelp": "เมื่อกระบวนการแปลงรหัส (transcode) หรือเปลี่ยนคอนเทนเนอร์ (remux) มีความคืบหน้าเร็วกว่าตำแหน่งที่กำลังเล่นอยู่ในปัจจุบันมากพอแล้ว ระบบจะหยุดชั่วคราวโดยอัตโนมัติ เพื่อลดการใช้ทรัพยากรของระบบ ฟีเจอร์นี้มีประโยชน์มากที่สุดเมื่อรับชมวิดีโอโดยไม่ได้เลื่อนตำแหน่งบ่อยๆ แต่หากพบปัญหาในการเล่น ให้ปิดฟีเจอร์นี้ออก", + "AllowFmp4TranscodingContainerHelp": "อนุญาตให้ใช้คอนเทนเนอร์แบบ fMP4 ในการแปลงรหัสสำหรับจูนเนอร์นี้ เพื่อให้สามารถเล่นเนื้อหาที่เข้ารหัสแบบ HEVC และ HDR ได้ แต่ไม่ใช่จูนเนอร์ทุกตัวที่จะรองรับคอนเทนเนอร์ประเภทนี้ หากพบปัญหาในการเล่นเนื้อหา ให้ปิดฟีเจอร์นี้ออก", + "AirPlay": "แอร์เพลย์", + "AllowHWTranscodingHelp": "อนุญาตให้จูนเนอร์แปลงสตรีมแบบเรียลไทม์ ซึ่งอาจช่วยลดภาระการแปลงสัญญาณที่ต้องทำโดยเซิร์ฟเวอร์ลงได้", + "Audio": "เสียง", + "AskAdminToCreateLibrary": "โปรดติดต่อผู้ดูแลระบบเพื่อสร้างไลบรารี", + "AllowOnTheFlySubtitleExtractionHelp": "สามารถดึงคำบรรยายที่ฝังอยู่ในวิดีโอออกมาและส่งให้ผู้ใช้ในรูปแบบข้อความธรรมดา เพื่อช่วยหลีกเลี่ยงการแปลงสัญญาณวิดีโอ อย่างไรก็ตาม บนอุปกรณ์บางระบบกระบวนการนี้อาจใช้เวลานานและทำให้การเล่นวิดีโอสะดุดขณะดึงคำบรรยาย หากปิดการทำงานนี้ คำบรรยายที่ฝังจะถูกเผารวมเข้ากับวิดีโอในระหว่างการแปลงสัญญาณ เมื่ออุปกรณ์ผู้ใช้ไม่รองรับคำบรรยายโดยตรง", + "AllowTonemappingHelp": "การทำ Tone-mapping สามารถแปลงช่วงไดนามิกของวิดีโอจาก HDR เป็น SDR โดยยังคงรักษารายละเอียดของภาพและสีไว้ ซึ่งเป็นข้อมูลสำคัญในการแสดงภาพให้ใกล้เคียงกับฉากต้นฉบับ ปัจจุบันรองรับเฉพาะวิดีโอแบบ HDR10, HLG และ DoVi ที่เป็นแบบ 10 บิตเท่านั้น และจำเป็นต้องมีระบบรันไทม์ GPGPU ที่รองรับในการใช้งานฟีเจอร์นี้", + "AlwaysPlaySubtitlesHelp": "คำบรรยายที่ตรงกับภาษาที่ตั้งค่าไว้จะถูกโหลดโดยไม่คำนึงถึงภาษาของเสียงพูดที่อยู่ในวิดีโอ", + "AlwaysRemuxMp3AudioFilesHelp": "หากคุณมีไฟล์ที่เบราว์เซอร์คำนวณเวลาไม่ถูกต้อง ให้เปิดใช้งานตัวเลือกนี้เพื่อใช้เป็นวิธีแก้ไขชั่วคราว", + "AuthProviderHelp": "เลือกผู้ให้บริการยืนยันตัวตนที่จะใช้ในการตรวจสอบรหัสผ่านของผู้ใช้นี้", + "Browse": "เรียกดู", + "AsManyAsPossible": "ให้ได้มากที่สุด", + "ButtonActivate": "เปิดใช้งาน", + "AllowOnTheFlySubtitleExtraction": "อนุญาตให้แตกไฟล์คำบรรยายแบบเรียลไทม์", + "Ascending": "เรียงจากน้อยไปมาก", + "BackdropScreensaver": "ภาพพื้นหลังสกรีนเซฟเวอร์", + "Bold": "ตัวหนา", + "LabelTitle": "ชื่อเรื่อง", + "LabelTonemappingAlgorithm": "เลือกอัลกอริทึม Tone Mapping ที่ต้องการใช้งาน", + "Author": "ผู้เขียน", + "BlockContentWithTagsHelp": "ซ่อนสื่อที่มีแท็กอย่างน้อยหนึ่งรายการตามที่ระบุไว้", + "LabelTag": "แท็ก", + "LabelThrottleDelaySecondsHelp": "เวลาในหน่วยวินาทีหลังจากที่ตัวแปลงสัญญาณจะถูกจำกัดความเร็ว ค่านี้ต้องมากพอเพื่อให้ฝั่งผู้ใช้สามารถรักษาบัฟเฟอร์ให้เพียงพอ สามารถใช้งานได้เฉพาะเมื่อมีการเปิดใช้งานการจำกัดความเร็วเท่านั้น", + "LabelTextColor": "สีตัวอักษร", + "LabelTextBackgroundColor": "สีของพื้นหลังตัวอักษร", + "LabelSegmentKeepSeconds": "เวลาที่จะเก็บข้อมูลแต่ละเซ็กเมนต์ไว้", + "LabelSegmentKeepSecondsHelp": "ระยะเวลาในหน่วยวินาที ที่จะเก็บเซ็กเมนต์ไว้หลังจากที่ถูกดาวน์โหลดโดยผู้ใช้ ใช้งานได้เฉพาะเมื่อมีการเปิดใช้งานการลบเซ็กเมนต์เท่านั้น", + "AlwaysRemuxFlacAudioFilesHelp": "หากคุณมีไฟล์ที่เบราว์เซอร์ไม่สามารถเล่นได้หรือคำนวณเวลาไม่ถูกต้อง ให้เปิดใช้งานตัวเลือกนี้เพื่อใช้เป็นวิธีแก้ไขชั่วคราว", + "AllowTonemappingSoftwareHelp": "การทำ Tone-mapping สามารถแปลงช่วงไดนามิกของวิดีโอจาก HDR เป็น SDR โดยยังคงรักษารายละเอียดของภาพและสีไว้ ซึ่งเป็นข้อมูลสำคัญในการแสดงผลให้ใกล้เคียงกับฉากจริงมากที่สุด ปัจจุบันรองรับเฉพาะวิดีโอแบบ 10 บิตในรูปแบบ HDR10, HLG และ DoVi เท่านั้น", + "LabelSystem": "ระบบ", + "AutoSubtitleStylingHelp": "โหมดนี้จะสลับการแสดงผลคำบรรยายระหว่างรูปแบบดั้งเดิมของอุปกรณ์และรูปแบบที่กำหนดเองโดยอัตโนมัติ ตามประเภทของอุปกรณ์ที่ใช้งาน", + "LabelTextWeight": "ความหนาตัวอักษร", + "LabelTheme": "ธีม", + "LabelTime": "เวลา", + "LabelTimeLimitHours": "จำกัดเวลา (ชั่วโมง)", + "LabelTextSize": "ขนาดตัวอักษร", + "Anime": "อนิเมะ", + "Success": "สำเร็จ", + "SubtitleBlack": "สีดำ", + "SubtitleYellow": "สีเหลือง", + "Suggestions": "คำแนะนำ", + "Sunday": "วันอาทิตย์", + "SubtitleBlue": "สีน้ำเงิน", + "SubtitleCyan": "สีน้ำเงินเขียว", + "LabelVideoInfo": "ข้อมูลวิดีโอ", + "SubtitleGreen": "สีเขียว", + "ListPaging": "{0}-{1} จาก{2}", + "ValueMinutes": "{0} นาที", + "Friday": "วันศุกร์", + "Tuesday": "วันอังคาร", + "TV": "ทีวี", + "ValueMovieCount": "{0} เรื่อง", + "LabelAllowedAudioChannels": "ช่องเสียงสูงสุดที่อนุญาต", + "ValueAlbumCount": "{0} อัลบั้ม", + "SubtitleGray": "สีเทา", + "ValueSongCount": "{0} เพลง", + "Monday": "วันจันทร์", + "Saturday": "วันเสาร์", + "ValueSeconds": "{0} วินาที", + "ValueSeriesCount": "{0} ซีรี่ย์", + "SubtitleWhite": "สีขาว", + "Thursday": "วันพฤหัสบดี", + "LabelAudioInfo": "ข้อมูลเสียง", + "ValueDiscNumber": "แผ่นที่ {0}", + "HeaderAddUser": "เพิ่มผู้ใช้งาน", + "List": "รายการ", + "Subtitles": "คำบรรยาย", + "Vertical": "แนวตั้ง", + "Yesterday": "เมื่อวาน", + "AiTranslated": "แปลภาษาโดย AI", + "ValueEpisodeCount": "{0} ตอน", + "Wednesday": "วันพุธ", + "AllowHevcEncoding": "อนุญาตการเข้ารหัสในรูปแบบ HEVC", + "Subtitle": "คำบรรยาย", + "SubtitleRed": "สีแดง", + "SubtitleLightGray": "สีเทาอ่อน" } diff --git a/src/strings/tr.json b/src/strings/tr.json index 4fd003672..efc81a24b 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -60,7 +60,7 @@ "HeaderSetupLibrary": "Medya kütüphanelerinizi ayarlayın", "HeaderStatus": "Durum", "HeaderSystemDlnaProfiles": "Sistem Profilleri", - "HeaderTaskTriggers": "Görev tetikleyicileri", + "HeaderTaskTriggers": "Görev Tetikleyicileri", "HeaderTranscodingProfile": "Kod Dönüştürme Profili", "HeaderUsers": "Kullanıcılar", "LabelArtists": "Sanatçılar", @@ -152,7 +152,7 @@ "TabServer": "Sunucu", "TabUpcoming": "Yakında", "TellUsAboutYourself": "Kendinizden bahsedin", - "ThisWizardWillGuideYou": "Bu sihirbaz kurulum işlemi boyunca size yardımcı olacaktır. Başlamak için, tercih ettiğiniz dili seçiniz.", + "ThisWizardWillGuideYou": "Bu sihirbaz kurulum sürecinde size rehberlik edecektir. Başlamak için lütfen bir sunucu adı girin ve tercih ettiğiniz dili seçin.", "Thursday": "Perşembe", "Tuesday": "Salı", "UninstallPluginConfirmation": "{0} eklentisini kaldırmak istediğinizden emin misiniz?", @@ -160,7 +160,7 @@ "Wednesday": "Çarşamba", "WelcomeToProject": "Jellyfin'e Hoş Geldiniz!", "Absolute": "Mutlak", - "AccessRestrictedTryAgainLater": "Şu anda erişim engellendi. Lütfen daha sonra tekrar deneyin.", + "AccessRestrictedTryAgainLater": "Erişim şu anda kısıtlı. Lütfen daha sonra tekrar deneyin.", "Actor": "Aktör", "Albums": "Albümler", "Artists": "Sanatçılar", @@ -1226,7 +1226,7 @@ "LabelMaxMuxingQueueSize": "Maksimum çoklama kuyruğu boyutu", "Cursive": "Cursive", "Conductor": "Orkestra şefi", - "Casual": "Rahat", + "Casual": "Casual", "VideoProfileNotSupported": "Video codec bileşeni profili desteklenmiyor", "AudioProfileNotSupported": "Ses codec bileşeni profili desteklenmiyor", "SystemDlnaProfilesHelp": "Sistem profilleri salt okunurdur. Bir sistem profilinde yapılan değişiklik yeni bir profil olarak kaydedilecektir.", @@ -1289,7 +1289,7 @@ "LabelTonemappingRange": "Ton eşleme aralığı", "LabelTonemappingPeakHelp": "Gömülü meta veri değerini, bunun yerine bu zirve değeriyle giriş sinyali için geçersiz kılın. Varsayılan değer 100'dür (1000nit).", "LabelTonemappingPeak": "Ton eşleme zirvesi", - "LabelTonemappingParamHelp": "Ton eşleme algoritmasını ayarlayın. Önerilen ve varsayılan değerler NaN'dir. Genelde boş bırakın.", + "LabelTonemappingParamHelp": "Ton eşleme algoritmasını ayarlayın. Genelde boş bırakın.", "LabelTonemappingParam": "Ton eşleme parametresi", "LabelTonemappingDesatHelp": "Bu parlaklık seviyesini aşan vurgular için desatürasyon uygulayın. Önerilen değer 0'dır (devre dışı bırak).", "LabelTonemappingDesat": "Ton eşleme desat", @@ -1333,7 +1333,7 @@ "Programs": "Programlar", "Production": "Yapım şirketi", "Producer": "Yapımcı", - "Print": "Yazdır", + "Print": "Print", "PreviousTrack": "Öncekine atla", "PreviousChapter": "Önceki kısım", "Previous": "Önceki", @@ -1690,7 +1690,7 @@ "EnableAudioNormalization": "Ses Normalizasyonu", "HeaderRecordingMetadataSaving": "Meta Verilerin Kaydedilmesi", "Short": "Kısa", - "LabelDummyChapterDurationHelp": "Sahte bölümler arasındaki aralık. Sahte bölüm oluşturmayı devre dışı bırakmak için 0 olarak ayarlayın. Bunu değiştirmenin mevcut sahte bölümler üzerinde hiçbir etkisi olmayacaktır.", + "LabelDummyChapterDurationHelp": "Sahte bölümler arasındaki saniye cinsinden aralık. Sahte bölüm oluşturmayı devre dışı bırakmak için 0 olarak ayarlayın. Bunu değiştirmenin mevcut sahte bölümler üzerinde hiçbir etkisi olmayacaktır.", "LabelChapterImageResolution": "Çözünürlük", "ResolutionMatchSource": "Eşleşme Kaynağı", "SaveRecordingImages": "EPG görüntülerini kaydet", @@ -2014,5 +2014,48 @@ "Retry": "Yeniden deneyin", "NativeSubtitleStylingHelp": "Altyazı biçimlendirmesi bazı cihazlarda çalışmayacaktır. Ancak, herhangi bir performans yükü getirmez.", "MetadataImagesLoadError": "Meta veri ayarları yüklenemedi", - "Native": "Yerel" + "Native": "Yerel", + "LimitSegmentLengthHelp": "Bu seçeneğin etkinleştirilmesi, webOS TV'ler gibi belirli cihazlarda arama sırasında HLS oynatıcının takılmasını önlemeye yardımcı olabilir.", + "ReadInputAtNativeFramerate": "Girişi yerel kare hızında okuma", + "ReadInputAtNativeFramerateHelp": "Bu seçeneğin etkinleştirilmesi, canlı yayınların zamanından önce durması gibi bazı sorunları çözebilir.", + "LimitSegmentLength": "Daha kısa HLS segmentleri kullanın", + "HeaderServerUnavailable": "Sunucu Kullanılamıyor", + "HeaderUpdateRequired": "Güncelleme Gerekli", + "ViewSettings": "Ayarları görüntüle", + "DownloadManager": "İndirilenler", + "MessageForgotPasswordPinReset": "Şifre sıfırlamayı bitirmek için PIN kodunu buraya girin", + "ConfirmDeleteRepository": "Depo silinsin mi?", + "StorageType.CDRom": "CD-ROM", + "DeleteRepositoryConfirmation": "Bu depoyu silmek istediğinizden emin misiniz?", + "MessageRestoreDisclaimer": "UYARI: Önceki bir yedekten geri yükleme yapmak üzeresiniz. Sunucunuz işlem süresince kullanılamaz hale gelecek ve yedeklemeden bu yana oluşturulan tüm yeni veriler kaybolacaktır.", + "LabelProgramData": "Program Verisi", + "LabelRestore": "Geri Yükle", + "MessageBackupDisclaimer": "Kütüphanenizin boyutuna bağlı olarak, yedekleme işlemi biraz zaman alabilir.", + "MessageBackupInProgress": "Yedekleme devam ediyor", + "PluginsLoadError": "Eklentiler yüklenirken bir hata oluştu.", + "StorageType.Network": "Ağ", + "StorageType.NoRootDirectory": "Kök Dizin Yok", + "StorageType.Ram": "RAM", + "Success": "Başarılı", + "HeaderBackups": "Yedekler", + "HeaderBackupsHelp": "Sunucunuzun veritabanını, meta verilerini, altyazıları ve trickplay'i içerebilen anlık görüntülerini oluşturun ve geri yükleyin.", + "LabelBackupsUnavailable": "Yedekleme mevcut değil", + "LabelDatabase": "Veritabanı", + "RepositoriesPageLoadError": "Depolar yüklenemedi", + "StorageType.Fixed": "Sabit", + "StorageType.Removable": "Çıkarılabilir", + "StorageType.Unknown": "Bilinmiyor", + "TranscodingLoadError": "Kod dönüştürme ayarları yüklenemedi", + "ButtonLearnMore": "Daha fazla bilgi edinin", + "MessageRestoreInProgress": "Geri yükleme devam ediyor", + "BackupsPageLoadError": "Yedeklemeler sayfası yüklenemedi", + "ButtonCreateBackup": "Yedek Oluştur", + "Create": "Oluştur", + "LabelImageCache": "Görüntü Önbelleği", + "MessageRestoreSuccess": "Geri yükleme başarıyla tamamlandı", + "MessageWaitingForServer": "Sunucu bekleniyor...", + "MessageServerMismatch": "Bağlandığınız sunucu, daha önce bu adresten bağlandığınız sunucuyla aynı değil. Bu bekleniyorsa, lütfen \"Her Durumda Bağlan\" seçeneğini seçin. Aksi takdirde, bağlantınız veya sunucunuz risk altında olabilir.", + "HeaderServerMismatch": "Sunucu Uyuşmazlığı", + "LiveTVPageLoadError": "Kayıtlar sayfası yüklenemedi", + "ConnectAnyway": "Her Durumda Bağlan" } diff --git a/src/strings/uk.json b/src/strings/uk.json index 88b307b99..8f5737497 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -170,7 +170,7 @@ "ButtonResetEasyPassword": "Скинути простий PIN -код", "ButtonRemove": "Видалити", "ButtonRefreshGuideData": "Оновити дані телегіда", - "ButtonQuickStartGuide": "Посібник по швидкому запуску", + "ButtonQuickStartGuide": "Посібник з налаштування", "ButtonPreviousTrack": "Попередня доріжка", "ButtonPause": "Пауза", "ButtonParentalControl": "Батьківський контроль", @@ -646,7 +646,7 @@ "Watched": "Переглянуто", "UseDoubleRateDeinterlacingHelp": "Це налаштування використовує частоту поля під час усунення черезрядкової розгортки (деінтерлейсінгу), яку часто називають «деінтерлейсінгом Боба», яка подвоює частоту кадрів відео, щоб забезпечити повний рух, подібний до того, який ви бачите під час перегляду черезрядкової розгортки на телевізорі.", "TonemappingAlgorithmHelp": "Тональне відображення можна налаштувати точно. Якщо ви не знайомі з цими параметрами, просто залиште значення за замовчуванням. Рекомендоване значення - BT.2390.", - "ThisWizardWillGuideYou": "Цей майстер допоможе вам пройти весь процес налаштування. Для початку оберіть бажану мову.", + "ThisWizardWillGuideYou": "Цей майстер допоможе вам пройти весь процес налаштування. Щоб розпочати, будь ласка, введіть ім'я сервера та виберіть бажану мову.", "TabServer": "Сервер", "SmartSubtitlesHelp": "Субтитри, що відповідають налаштуванням мови, завантажуються, якщо аудіозапис іноземною мовою.", "Small": "Малий", @@ -960,7 +960,7 @@ "LabelTonemappingRange": "Діапазон тонального відображення", "LabelTonemappingPeakHelp": "Замініть вбудоване значення метаданих для вхідного сигналу на це пікове значення. Значення за замовчуванням - 100 (1000 ніт).", "LabelTonemappingPeak": "Пік тонального відображення", - "LabelTonemappingParamHelp": "Налаштуйте алгоритм тонального відображення. Рекомендоване значення та значення за замовчуванням - NaN. Зазвичай залиште його порожнім.", + "LabelTonemappingParamHelp": "Налаштуйте алгоритм тонального відображення. Зазвичай залиште його порожнім.", "LabelTonemappingParam": "Параметр тонального відображення", "LabelTonemappingDesat": "Зменшення насиченості тонального відображення", "LabelTonemappingAlgorithm": "Оберіть алгоритм тонального відображення, який потрібно використовувати", @@ -1696,7 +1696,7 @@ "SaveRecordingImagesHelp": "Зберігайте зображення з постачальника списків EPG разом із носієм.", "HeaderDummyChapter": "Зображення сцен", "LabelDummyChapterDuration": "Інтервал", - "LabelDummyChapterDurationHelp": "Інтервал між зображеннями сцен. Встановіть значення 0, щоб вимкнути генерацію зображень сцен. Зміна цього параметра не вплине на існуючі зображення сцен.", + "LabelDummyChapterDurationHelp": "Інтервал між зображеннями сцен у секундах. Встановіть значення 0, щоб вимкнути генерацію зображень сцен. Зміна цього параметра не вплине на існуючі зображення сцен.", "LabelDummyChapterCount": "Ліміт", "LabelDummyChapterCountHelp": "Максимальна кількість зображень розділів, які буде видобуто для кожного медіафайлу.", "LabelChapterImageResolution": "Роздільна здатність", @@ -2019,5 +2019,48 @@ "UploadCustomImage": "Завантажити користувацьке зображення", "CustomSplashScreenSize": "Користувацькі зображення повинні мати співвідношення сторін 16x9 при мінімальному розмірі 1920x1080.", "LabelGroupShowsIntoCollections": "Групувати серіали в колекції", - "LabelGroupShowsIntoCollectionsHelp": "Під час відображення списків серіалів у колекції вони відображатимуться як один згрупований елемент." + "LabelGroupShowsIntoCollectionsHelp": "Під час відображення списків серіалів у колекції вони відображатимуться як один згрупований елемент.", + "ReadInputAtNativeFramerate": "Зчитувати вхідні дані з оригінальною частотою кадрів", + "ReadInputAtNativeFramerateHelp": "Увімкнення цієї опції може вирішити деякі проблеми, наприклад, передчасну зупинку прямої трансляції.", + "HeaderUpdateRequired": "Потрібне оновлення", + "LimitSegmentLength": "Використовувати коротші сегменти HLS", + "LimitSegmentLengthHelp": "Увімкнення цієї опції може допомогти запобігти зависанню HLS-програвача під час пошуку на певних пристроях, наприклад, на телевізорах з webOS.", + "HeaderServerUnavailable": "Сервер недоступний", + "DownloadManager": "Завантаження", + "ViewSettings": "Налаштування перегляду", + "MessageForgotPasswordPinReset": "Введіть PIN-код, щоб завершити відновлення пароля", + "ButtonCreateBackup": "Створити резервну копію", + "HeaderBackupsHelp": "Створюйте та відновлюйте зрізи вашого сервера, які можуть включати базу даних, метадані, субтитри та trickplay.", + "LabelBackupsUnavailable": "Резервні копії відсутні", + "BackupsPageLoadError": "Не вдалося завантажити сторінку резервних копій", + "Create": "Створити", + "StorageType.CDRom": "CD-ROM", + "MessageRestoreInProgress": "Виконується відновлення", + "MessageWaitingForServer": "Очікування сервера...", + "LabelImageCache": "Кеш зображень", + "LabelProgramData": "Дані програми", + "MessageBackupDisclaimer": "Залежно від розміру вашої медіатеки, процес резервного копіювання може зайняти деякий час.", + "MessageRestoreDisclaimer": "ПОПЕРЕДЖЕННЯ: Ви збираєтеся відновитися з попередньої резервної копії. Ваш сервер буде виведено з ладу на час цього процесу, а всі нові дані, створені з моменту створення резервної копії, буде втрачено.", + "MessageRestoreSuccess": "Відновлення успішно завершено", + "StorageType.NoRootDirectory": "Немає кореневого каталогу", + "LabelDatabase": "База даних", + "LabelRestore": "Відновити", + "MessageBackupInProgress": "Виконується резервне копіювання", + "StorageType.Network": "Мережеве", + "StorageType.Fixed": "Фіксоване", + "StorageType.Ram": "ОЗУ", + "StorageType.Removable": "Знімне", + "StorageType.Unknown": "Невідоме", + "Success": "Успіх", + "HeaderBackups": "Резервні копії", + "ConfirmDeleteRepository": "Видалити репозиторій?", + "DeleteRepositoryConfirmation": "Ви впевнені, що хочете видалити цей репозиторій?", + "PluginsLoadError": "Виникла помилка під час завантаження плагінів.", + "RepositoriesPageLoadError": "Не вдалося завантажити репозиторії", + "TranscodingLoadError": "Не вдалося завантажити налаштування перекодування", + "ButtonLearnMore": "Дізнатися більше", + "MessageServerMismatch": "Сервер, до якого ви підключаєтеся, не є тим самим сервером, до якого ви раніше підключалися за цією адресою. Якщо це очікувано, виберіть «Все одно підключитися». В іншому випадку ваше з'єднання або сервер може бути скомпрометовано.", + "HeaderServerMismatch": "Невідповідність сервера", + "LiveTVPageLoadError": "Не вдалося завантажити сторінку з записами", + "ConnectAnyway": "Все одно підключитися" } diff --git a/src/strings/vi.json b/src/strings/vi.json index 25dc72204..0de9056af 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -74,7 +74,7 @@ "TabServer": "Máy chủ", "TabUpcoming": "Sắp Công Chiếu", "TellUsAboutYourself": "Cho chúng tôi biết thông tin về bạn", - "ThisWizardWillGuideYou": "Trình hướng dẫn này sẽ giúp hướng dẫn bạn trong quá trình thiết lập. Để bắt đầu, vui lòng lựa chọn ngôn ngữ bạn ưa thích.", + "ThisWizardWillGuideYou": "Trình hướng dẫn này sẽ giúp hướng dẫn bạn trong quá trình thiết lập. Để bắt đầu, vui lòng nhập tên máy chủ và chọn ngôn ngữ ưa thích của bạn.", "UninstallPluginConfirmation": "Bạn có chắc muốn gỡ bỏ {0}?", "HeaderUninstallPlugin": "Gỡ bỏ Plugin", "AccessRestrictedTryAgainLater": "Truy cập hiện đang bị hạn chế. Hãy thử lại sau.", @@ -85,7 +85,7 @@ "ButtonResetEasyPassword": "Đặt lại mã PIN Tiện Lợi", "ButtonRename": "Đổi tên", "ButtonRefreshGuideData": "Làm mới dữ liệu hướng dẫn", - "ButtonQuickStartGuide": "Hướng dẫn nhanh", + "ButtonQuickStartGuide": "Hướng Dẫn Thiết Lập", "ButtonPreviousTrack": "Bản ghi trước", "ButtonPause": "Tạm dừng", "ButtonParentalControl": "Kiểm soát của cha mẹ", @@ -269,7 +269,7 @@ "HeaderCastAndCrew": "Diễn Viên & Ê-kíp", "HeaderCancelSeries": "Huỷ Loạt Phim", "HeaderCancelRecording": "Hủy Ghi Lại", - "HeaderBranding": "Tạo Thương Hiệu", + "HeaderBranding": "Thương hiệu", "HeaderBlockItemsWithNoRating": "Khoá những mục không có thông tin đánh giá hoặc thông tin không đáng tin cậy", "HeaderAudioSettings": "Cài Đặt Âm Thanh", "HeaderAudioBooks": "Sách Nói", @@ -347,7 +347,7 @@ "EnableExternalVideoPlayers": "Trình phát video bên ngoài", "EnableDisplayMirroring": "Cho phép trình chiếu trên thiết bị khác", "HeaderProfileInformation": "Thông Tin Hồ Sơ", - "HeaderPreferredMetadataLanguage": "Ngôn Ngữ Dữ Liệu Mô Tả Ưu Tiên", + "HeaderPreferredMetadataLanguage": "Ngôn Ngữ Dữ Liệu Mô Tả Ưa Thích", "HeaderPluginInstallation": "Cài Đặt Plugin", "HeaderPleaseSignIn": "Hãy đăng nhập", "HeaderPlaybackError": "Lỗi Phát Lại", @@ -437,7 +437,7 @@ "HeaderSecondsValue": "{0} Giây", "HeaderSeasons": "Phần", "HeaderScenes": "Phân Cảnh", - "HeaderRunningTasks": "Những Tác Vụ Hoạt Động", + "HeaderRunningTasks": "Tác Vụ Đang Chạy", "HeaderRevisionHistory": "Lịch Sử Chỉnh Sửa", "HeaderResponseProfileHelp": "Cấu hình phản hồi là phương thức tuỳ chỉnh thông tin gửi về thiết bị phát khi phát một số loại phương tiện.", "HeaderResponseProfile": "Hồ Sơ Phản Hồi", @@ -949,7 +949,7 @@ "MapChannels": "Kênh bản đồ", "ManageRecording": "Quản lý ghi lại", "ManageLibrary": "Quản lý thư viện", - "Logo": "Logo", + "Logo": "Biểu trưng", "LiveTV": "Truyền hình trực tiếp", "LiveBroadcasts": "Chương trình phát sóng trực tiếp", "Live": "Trực tiếp", @@ -1194,7 +1194,7 @@ "SearchForSubtitles": "Tìm kiếm phụ đề", "SearchForMissingMetadata": "Tìm kiếm dữ liệu mô tả bị thiếu", "SearchForCollectionInternetMetadata": "Tìm kiếm ảnh bìa minh họa và dữ liệu mô tả qua Internet", - "Search": "Tìm Kiếm", + "Search": "Tìm kiếm", "Screenshots": "Ảnh chụp màn hình", "Screenshot": "Ảnh chụp màn hình", "Schedule": "Lên lịch", @@ -1207,7 +1207,7 @@ "Rewind": "Tua Chậm Lại", "ResumeAt": "Tiếp tục từ {0}", "Restart": "Khởi Động Lại", - "ResetPassword": "Đặt lại mật khẩu", + "ResetPassword": "Đặt Lại Mật Khẩu", "ReplaceExistingImages": "Thay thế hình ảnh hiện có", "ReplaceAllMetadata": "Thay thế tất cả dữ liệu mô tả", "RepeatOne": "Lặp lại một lần", @@ -1325,7 +1325,7 @@ "LabelOpenclDeviceHelp": "Đây là thiết bị OpenCL dùng để chỉnh tông màu. Phía bên trái của dấu chấm là số nền tảng và phía bên phải là số thiết bị trên nền tảng. Mặc định là 0.0. Cần có tệp ứng dụng FFmpeg chứa phương pháp tăng tốc phần cứng OpenCL.", "LabelMaxMuxingQueueSizeHelp": "Số gói tối đa có thể được lưu vào bộ đệm trong khi chờ tất cả các luồng khởi tạo. Hãy thử tăng lên nếu bạn vẫn gặp lỗi \"Quá nhiều gói được lưu vào bộ đệm cho luồng đầu ra\" trong nhật ký FFmpeg. Giá trị đề xuất là 2048.", "ClearQueue": "Xóa hàng đợi", - "LabelTonemappingParamHelp": "Điều chỉnh thuật toán ánh xạ tông màu. Các giá trị được đề xuất và mặc định là NaN. Nói chung là để trống.", + "LabelTonemappingParamHelp": "Điều chỉnh thuật toán ánh xạ tông màu. Thường thì để trống.", "LabelTonemappingParam": "Tham số ánh xạ tông màu", "LabelTonemappingPeakHelp": "Thay vào đó, hãy ghi đè giá trị siêu dữ liệu được nhúng cho tín hiệu đầu vào bằng giá trị cao nhất này. Giá trị mặc định là 100 (1000nit).", "LabelTonemappingPeak": "Đỉnh ánh xạ tông màu", @@ -1417,7 +1417,7 @@ "OptionEquals": "Bằng", "OptionCaptionInfoExSamsung": "Thông tin chú thích ví dụ (Samsung)", "MessageSyncPlayGroupWait": "{0} đang lưu vào bộ đệm…", - "MediaInfoAnamorphic": "Phim điện ảnh màn ảnh rộng", + "MediaInfoAnamorphic": "Biến dạng", "LabelXDlnaCap": "ID khả năng của thiết bị", "OptionMaxActiveSessionsHelp": "Giá trị 0 sẽ vô hiệu hóa tính năng.", "OptionMaxActiveSessions": "Đặt số lượng phiên người dùng đồng thời tối đa.", @@ -1681,7 +1681,7 @@ "DownloadAll": "Tải Xuống Tất Cả", "LabelStereoDownmixAlgorithm": "Thuật Toán Trộn Âm Thanh Nổi", "StereoDownmixAlgorithmHelp": "Thuật toán được sử dụng để trộn âm thanh đa kênh thành âm thanh nổi.", - "LabelDummyChapterDurationHelp": "Khoảng thời gian giữa các phân đoạn giả. Đặt thành 0 để tắt tạo phân đoạn giả. Việc thay đổi điều này sẽ không ảnh hưởng đến các phân đoạn giả hiện có.", + "LabelDummyChapterDurationHelp": "Khoảng thời gian giữa các phân đoạn giả tính bằng giây. Đặt thành 0 để tắt sinh ra phân đoạn giả. Thay đổi điều này sẽ không ảnh hưởng đến các phân đoạn giả hiện có.", "LabelChapterImageResolutionHelp": "Độ phân giải của hình ảnh đoạn trích xuất. Việc thay đổi điều này sẽ không ảnh hưởng đến các đoạn giả hiện có.", "SaveRecordingNFO": "Lưu bản ghi dữ liệu mô tả EPG trong NFO", "SaveRecordingImagesHelp": "Lưu hình ảnh từ nhà cung cấp danh sách EPG bên cạnh phương tiện.", @@ -1709,7 +1709,7 @@ "LabelParallelImageEncodingLimitHelp": "Số lượng mã hóa hình ảnh tối đa được phép chạy song song. Để trống sẽ chọn giới hạn dựa trên số lõi hệ thống của bạn.", "SecondarySubtitles": "Phụ đề phụ", "HeaderPerformance": "Hiệu suất", - "LabelParallelImageEncodingLimit": "Giới hạn mã hóa hình ảnh song song", + "LabelParallelImageEncodingLimit": "Giới Hạn Mã Hóa Hình Ảnh Cùng Lúc", "MediaInfoDvBlSignalCompatibilityId": "Id tương thích tính hiệu DV bl", "LabelEnableAudioVbr": "Bật mã hóa âm thanh VBR", "LabelEnableAudioVbrHelp": "Tốc độ bit thay đổi mang lại chất lượng tốt hơn so với tỷ lệ bit trung bình, nhưng trong một số trường hợp hiếm gặp, có thể gây ra sự cố về khả năng tương thích và bộ đệm.", @@ -1796,8 +1796,8 @@ "Lyric": "Lời bài hát", "HeaderLyricDownloads": "Tải Xuống Lời Bài Hát", "LabelSelectPreferredTranscodeVideoAudioCodec": "Bộ giải mã âm thanh chuyển mã ưa thích khi phát lại video", - "LibraryScanFanoutConcurrency": "Giới hạn tác vụ quét thư viện song song", - "LibraryScanFanoutConcurrencyHelp": "Số lượng tác vụ song song tối đa lúc quét thư viện. Để trống sẽ chọn một giới hạn dựa trên số lõi trên hệ thống của bạn. CẢNH BÁO: Đặt số này quá cao có thể gây ra vấn đề với hệ thống tệp mạng; nếu gặp sự cố, hãy giảm số này xuống thấp.", + "LibraryScanFanoutConcurrency": "Giới hạn tác vụ quét thư viện cùng lúc", + "LibraryScanFanoutConcurrencyHelp": "Số lượng tác vụ cùng lúc tối đa lúc quét thư viện. Để trống sẽ chọn một giới hạn dựa trên số lõi trên hệ thống của bạn. CẢNH BÁO: Đặt số này quá cao có thể gây ra vấn đề với hệ thống tệp mạng; nếu gặp sự cố, hãy giảm số này xuống thấp.", "Lyrics": "Lời bài hát", "PlaybackError.ASS_RENDER_ERROR": "Đã xảy ra lỗi trong trình kết xuất phụ đề ASS/SSA.", "PlaybackError.FATAL_HLS_ERROR": "Đã xảy ra lỗi nghiêm trọng trong luồng HLS.", @@ -2023,5 +2023,41 @@ "ReadInputAtNativeFramerate": "Đọc đầu vào ở tốc độ khung hình gốc", "ReadInputAtNativeFramerateHelp": "Kích hoạt tùy chọn này có thể giải quyết một số vấn đề, ví dụ: Các luồng trực tiếp dừng sớm.", "LimitSegmentLengthHelp": "Kích hoạt tùy chọn này có thể giúp ngăn trình phát HLS treo trong khi tìm kiếm trên một số thiết bị nhất định, chẳng hạn như TV Webos.", - "LimitSegmentLength": "Sử dụng các phân đoạn HLS ngắn hơn" + "LimitSegmentLength": "Sử dụng các phân đoạn HLS ngắn hơn", + "HeaderServerUnavailable": "Máy Chủ Không Khả Dụng", + "HeaderUpdateRequired": "Bắt Buộc Cập Nhập", + "ViewSettings": "Xem cài đặt", + "MessageForgotPasswordPinReset": "Nhập PIN vào đây để hoàn thành đặt lại Mật Khẩu", + "DownloadManager": "Tải xuống", + "HeaderBackupsHelp": "Tạo và phục hồi ảnh chụp nhanh của máy chủ của bạn có thể bao gồm cơ sở dữ liệu, dữ liệu mô tả, phụ đề và ảnh tua nhanh.", + "LabelImageCache": "Bộ Nhớ Đệm Hình Ảnh", + "MessageRestoreDisclaimer": "CẢNH BÁO: Bạn sắp khôi phục từ bản sao lưu trước đó. Máy chủ của bạn sẽ không sử dụng được trong suốt thời gian diễn ra quá trình và bất kỳ dữ liệu mới nào được tạo từ khi sao lưu sẽ bị mất.", + "LabelProgramData": "Dữ Liệu Chương Trình", + "MessageBackupDisclaimer": "Tùy thuộc vào kích thước của thư viện của bạn, quá trình sao lưu có thể mất một lúc.", + "MessageBackupInProgress": "Đang sao lưu", + "BackupsPageLoadError": "Tải trang sao lưu thất bại", + "ButtonCreateBackup": "Tạo Sao Lưu", + "Create": "Tạo", + "LabelBackupsUnavailable": "Không có sẵn bản sao lưu", + "LabelDatabase": "Cơ sở dữ liệu", + "LabelRestore": "Khôi phục", + "MessageRestoreInProgress": "Đang khôi phục", + "StorageType.NoRootDirectory": "Không Có Thư Mục Gốc", + "StorageType.Network": "Mạng", + "MessageRestoreSuccess": "Đã hoàn tất khôi phục thành công", + "MessageWaitingForServer": "Đang chờ máy chủ ...", + "StorageType.Removable": "Có thể tháo rời", + "StorageType.Unknown": "Không rõ", + "StorageType.Fixed": "Cố định", + "Success": "Thành công", + "HeaderBackups": "Sao lưu", + "PluginsLoadError": "Một lỗi đã xảy ra trong khi tải plugin.", + "DeleteRepositoryConfirmation": "Bạn có chắc là bạn muốn xóa kho lưu trữ này?", + "ConfirmDeleteRepository": "Xóa kho lưu trữ?", + "RepositoriesPageLoadError": "Không tải được kho lưu trữ", + "ButtonLearnMore": "Tìm Hiểu Thêm", + "TranscodingLoadError": "Không tải được cài đặt chuyển mã", + "StorageType.CDRom": "CD-ROM", + "StorageType.Ram": "RAM", + "LiveTVPageLoadError": "Không tải được trang ghi" } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index ece36dc6c..596d1fd8b 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -71,7 +71,7 @@ "ButtonParentalControl": "家长控制", "ButtonPause": "暂停", "ButtonPreviousTrack": "上一音轨", - "ButtonQuickStartGuide": "快速入门指南", + "ButtonQuickStartGuide": "设置指南", "ButtonRefreshGuideData": "刷新指南数据", "ButtonRemove": "移除", "ButtonRename": "重命名", @@ -750,7 +750,7 @@ "MessageConfirmRemoveMediaLocation": "你确定要移除此位置?", "MessageConfirmRestart": "你确定要重启 Jellyfin?", "MessageConfirmRevokeApiKey": "你确定你希望撤销这个 API 秘钥吗?这个应用程序与本服务器的连接将会被立刻中断。", - "MessageConfirmShutdown": "你确定要关闭服务端?", + "MessageConfirmShutdown": "您确定要关闭服务器吗?", "MessageContactAdminToResetPassword": "请联系你的管理员以重置你的密码。", "MessageCreateAccountAt": "在 {0} 创建帐户", "MessageDeleteTaskTrigger": "你确定删除这个任务触发条件?", @@ -806,7 +806,7 @@ "NewEpisodesOnly": "只新集", "News": "新闻", "Next": "下一个", - "NextUp": "接下来", + "NextUp": "继续观看", "No": "否", "NoNewDevicesFound": "找不到新设备。要添加新调谐器, 请关闭此对话框并手动输入设备信息。", "MessageNoNextUpItems": "没有发现。开始看你的节目!", @@ -1057,7 +1057,7 @@ "ThemeSongs": "主题曲", "ThemeVideos": "主题视频", "TheseSettingsAffectSubtitlesOnThisDevice": "这些设置仅影响该设备的字幕显示", - "ThisWizardWillGuideYou": "该向导将指导你完成安装过程。首先,请选择你的语言。", + "ThisWizardWillGuideYou": "此向导将引导您完成设置过程。首先,请输入服务器名称并选择您的首选语言。", "Thumb": "缩略图", "Thursday": "星期四", "TitleHardwareAcceleration": "硬件加速", @@ -1127,7 +1127,7 @@ "ColorTransfer": "色彩传递", "ConfirmDeleteItem": "删除此项目会将其从文件系统和媒体库中删除。您确定要继续吗(删除播放列表与合集不会删除文件)?", "ConfirmDeleteItems": "删除这些项目会将它们从文件系统和媒体库中删除。您确定要继续吗(删除播放列表与合集不会删除文件)?", - "ConfirmEndPlayerSession": "您要在 {0} 上关闭 Jellyfin 吗?", + "ConfirmEndPlayerSession": "您想关闭 {0} 上的 Jellyfin 吗?", "ValueSeconds": "{0} 秒", "Features": "功能", "Genre": "类型", @@ -1365,7 +1365,7 @@ "LabelTonemappingPeak": "色调映射峰值", "LabelTonemappingPeakHelp": "用该值覆盖覆盖文件中嵌入的最大亮度元数据值。默认值为100(1000尼特)。", "LabelTonemappingParam": "色调映射参数", - "LabelTonemappingParamHelp": "调整色调映射算法。建议值和默认值均为 NaN。通常将其留空。", + "LabelTonemappingParamHelp": "调整色调映射算法。通常将其留空。", "ButtonPlayer": "播放器", "ClearQueue": "清空队列", "StopPlayback": "停止播放", @@ -1603,9 +1603,9 @@ "Cursive": "草书", "ContainerBitrateExceedsLimit": "视频比特率超过限制", "PreferSystemNativeHwDecoder": "首选系统原生的 DXVA 或 VA-API 硬件解码器", - "EnableIntelLowPowerH264HwEncoder": "启用低电压模式的 Intel H.264 硬件编码器", - "EnableIntelLowPowerHevcHwEncoder": "启用低电压模式的 Intel HEVC 硬件编码器", - "IntelLowPowerEncHelp": "低电压模式编码能节省不必要的 CPU-GPU 同步。Linux 中使用前必须配置好 i915 HuC 固件。", + "EnableIntelLowPowerH264HwEncoder": "启用低功耗模式的 Intel H.264 硬件编码器", + "EnableIntelLowPowerHevcHwEncoder": "启用低功耗模式的 Intel HEVC 硬件编码器", + "IntelLowPowerEncHelp": "低功耗模式编码能避免不必要的 CPU-GPU 同步。在 Linux 中使用前必须配置好 i915 HuC 固件。", "LabelHardwareEncodingOptions": "硬件编码选项", "DirectPlayError": "启动直接播放时出错", "UnknownAudioStreamInfo": "音频流信息未知", @@ -1685,13 +1685,13 @@ "EnableCardLayout": "显示可视卡盒", "MessageNoItemsAvailable": "没有可用的项。", "Unreleased": "暂未发布", - "DownloadAll": "全部下载", + "DownloadAll": "下载全部", "Experimental": "实验功能", "LabelStereoDownmixAlgorithm": "立体声降混算法", "StereoDownmixAlgorithmHelp": "用于将多声道下降混合为立体声的算法。", "HeaderRecordingMetadataSaving": "记录元数据", "LabelDummyChapterDuration": "间隔", - "LabelDummyChapterDurationHelp": "虚拟章节之间的时间间隔。将其设置为0以禁用虚拟章节生成。更改此设置不会影响现有的虚拟章节。", + "LabelDummyChapterDurationHelp": "虚拟章节之间的间隔(以秒为单位)。设置为 0 表示禁用虚拟章节生成。更改此值不会对现有虚拟章节产生影响。", "PreferEmbeddedExtrasTitlesOverFileNames": "对额外内容优先使用内置的标题而不是文件名", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "额外内容通常与父项有相同的内置标题,勾选此项来对它们使用内置标题。", "SaveRecordingNFO": "在 NFO 中保存录制的 EPG 元数据", @@ -1909,7 +1909,7 @@ "PluginDisableError": "禁用插件时发生错误。", "PluginEnableError": "启用插件时发生错误。", "PluginLoadConfigError": "获取插件配置页面时发生错误。", - "PluginLoadRepoError": "从仓库获取插件详情时发生错误。", + "PluginLoadRepoError": "从存储库获取插件详情时发生错误。", "PluginUninstallError": "卸载插件时发生错误。", "HeaderNextItemPlayingInValue": "下一个 {0} 在 {1} 播放", "AndOtherArtists": "{0} 和 {1} 位其他艺术家。", @@ -2026,5 +2026,44 @@ "ReadInputAtNativeFramerate": "以原始帧率读取输入", "ReadInputAtNativeFramerateHelp": "启用此选项可能会解决一些问题,例如直播流过早停止。", "LimitSegmentLength": "使用更短的 HLS 片段", - "LimitSegmentLengthHelp": "启用此选项可能有助于防止 HLS 播放器在某些设备(如 webOS 电视)上进行快进 / 快退操作时出现卡顿。" + "LimitSegmentLengthHelp": "启用此选项可能有助于防止 HLS 播放器在某些设备(如 webOS 电视)上进行快进 / 快退操作时出现卡顿。", + "HeaderServerUnavailable": "服务器不可用", + "HeaderUpdateRequired": "需要更新", + "ViewSettings": "查看设置", + "MessageForgotPasswordPinReset": "在此处输入 PIN 码以完成密码重置", + "DownloadManager": "下载", + "StorageType.CDRom": "CD-ROM", + "HeaderBackupsHelp": "创建和恢复服务器的快照,其中可以包括数据库、元数据、字幕和进度条预览图。", + "LabelImageCache": "图像缓存", + "LabelProgramData": "程序数据", + "StorageType.Removable": "移动存储", + "MessageBackupDisclaimer": "取决于您的媒体库的大小,备份过程可能需要一段时间。", + "MessageRestoreDisclaimer": "警告:您即将从之前的备份进行恢复。在此过程中,您的服务器将无法使用,并且自备份以来创建的所有新数据都将丢失。", + "LabelBackupsUnavailable": "没有可用的备份", + "LabelDatabase": "数据库", + "ButtonCreateBackup": "创建备份", + "BackupsPageLoadError": "无法加载备份页面", + "Create": "创建", + "LabelRestore": "恢复", + "MessageBackupInProgress": "正在进行备份", + "MessageRestoreInProgress": "正在进行恢复", + "MessageRestoreSuccess": "恢复成功完成", + "MessageWaitingForServer": "正在等待服务器响应...", + "StorageType.Fixed": "固定存储", + "StorageType.Network": "网络", + "StorageType.NoRootDirectory": "无根目录", + "StorageType.Ram": "内存盘", + "StorageType.Unknown": "未知存储", + "Success": "成功", + "HeaderBackups": "备份", + "DeleteRepositoryConfirmation": "你确定要删除此存储库吗?", + "ConfirmDeleteRepository": "删除存储库?", + "RepositoriesPageLoadError": "加载存储库失败", + "TranscodingLoadError": "加载转码设置失败", + "PluginsLoadError": "加载插件时发生错误。", + "ButtonLearnMore": "了解更多", + "LiveTVPageLoadError": "无法加载录制页面", + "ConnectAnyway": "仍要连接", + "HeaderServerMismatch": "服务器不匹配", + "MessageServerMismatch": "您正在连接的服务器与之前在此地址连接的服务器不同。如果这是预期情况,请选择“仍要连接”。否则,您的连接或该服务器可能已被篡改。" } diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index c96aa8c28..d0c46c50e 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -218,7 +218,7 @@ "TabServer": "伺服器", "TabUpcoming": "即將發佈", "TellUsAboutYourself": "介紹一下自己", - "ThisWizardWillGuideYou": "此教學協助您完成安裝過程。首先,請選擇您的語言。", + "ThisWizardWillGuideYou": "此教學協助您完成安裝過程。首先,請輸入伺服器名稱及選擇您的語言。", "Thursday": "星期四", "Tuesday": "星期二", "UserProfilesIntro": "Jellyfin 支援用戶對帳戶的顯示、播放狀態和家長監護功能設定進行修改。", @@ -1299,5 +1299,6 @@ "HeaderPageNotFound": "找不到頁面", "PageNotFound": "這不是你要找的頁面。", "PasswordMatchError": "密碼和確認密碼必須一致。", - "PasswordRequiredForAdmin": "管理員帳戶必須設定密碼。" + "PasswordRequiredForAdmin": "管理員帳戶必須設定密碼。", + "Thumb": "縮圖" } diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index 494580962..b3c0d589c 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -10,7 +10,7 @@ "ButtonForgotPassword": "忘記密碼", "ButtonGotIt": "我知道了", "ButtonOk": "確定", - "ButtonQuickStartGuide": "快速入門指南", + "ButtonQuickStartGuide": "設定指南", "ButtonRefreshGuideData": "更新電視節目表", "ButtonRemove": "移除", "ButtonSelectDirectory": "選擇資料夾", @@ -296,7 +296,7 @@ "ConfigureDateAdded": "在「控制台 > 媒體庫 > 顯示」中設定「添加日期」的判斷方式", "ConfirmDeleteImage": "是否確定刪除圖片?", "ConfirmDeleteItems": "刪除這些項目會將檔案從檔案系統和媒體庫中刪除。你真的要繼續嗎?", - "ConfirmEndPlayerSession": "您要在 {0} 秒後將 Jellyfin 關閉嗎?", + "ConfirmEndPlayerSession": "您要關閉 {0} 上的Jellyfin嗎?", "Connect": "連線", "ContinueWatching": "繼續觀看", "CriticRating": "影評評分", @@ -2003,5 +2003,22 @@ "Native": "原生", "NativeSubtitleStylingHelp": "字幕樣式在部分裝置上不被支援。在這些裝置上不會造成額外的負載。", "LibraryNameInvalid": "媒體庫名稱不可為空,或以空白開始/結尾。", - "Retry": "重試" + "Retry": "重試", + "HeaderServerUnavailable": "伺服器無法使用", + "CustomSplashScreenSize": "自訂圖片的比例應為 16:9 並且圖片尺寸至少要有 1920×1080 。", + "ImageDeleteFailed": "影像辨識失敗", + "DeleteCustomImage": "刪除自訂圖片", + "HeaderPageNotFound": "找不到網頁", + "CopyLogSuccess": "日誌內容已複製完成。", + "DisplayLoadError": "載入顯示設定時發生錯誤。", + "HeaderUpdateRequired": "需要更新", + "ImageUploadCancelled": "圖片上傳已取消", + "ImageUploadFailed": "圖片上傳失敗", + "DownloadManager": "下載", + "BackupsPageLoadError": "無法載入備份頁面", + "ConfirmDeleteRepository": "刪除儲存庫?", + "Create": "建立", + "DeleteRepositoryConfirmation": "您確定要刪除此儲存庫嗎?", + "ButtonLearnMore": "瞭解更多", + "ButtonCreateBackup": "建立備份" } diff --git a/src/styles/librarybrowser.scss b/src/styles/librarybrowser.scss index 9afed6ed9..a604f2762 100644 --- a/src/styles/librarybrowser.scss +++ b/src/styles/librarybrowser.scss @@ -581,10 +581,10 @@ height: 30vh; } } -} -.layout-tv .itemBackdrop { - display: none; + .layout-tv & { + display: none; + } } .detailPageContent { @@ -845,10 +845,14 @@ .detailPageSecondaryContainer { padding-top: 1.25em; -} -.layout-mobile .detailPageSecondaryContainer { - padding-top: 1em; + .layout-desktop & { + flex-grow: 1; + } + + .layout-mobile & { + padding-top: 1em; + } } .detailImageContainer .card { @@ -1168,6 +1172,12 @@ div.itemDetailGalleryLink.defaultCardBackground { .detailPageWrapperContainer { border-spacing: 0; border-collapse: collapse; + + .layout-desktop & { + display: flex; + flex-direction: column; + min-height: 60vh; + } } .mediaInfoContent .btnCopy .material-icons { diff --git a/src/styles/lyrics.scss b/src/styles/lyrics.scss index 8642dd05b..4e9a7128e 100644 --- a/src/styles/lyrics.scss +++ b/src/styles/lyrics.scss @@ -1,10 +1,12 @@ .lyricPage { padding-top: 4.2em !important; + padding-left: 0.5em !important; + padding-right: 0.5em !important; display: flex; justify-content: center; } -.dynamicLyricsContainer { +.lyricsContainer { display: flex; flex-direction: column; } @@ -13,9 +15,12 @@ display: inline-block; width: fit-content; margin: 0.1em; - font-size: 30px; + font-size: 1.875rem; color: inherit; min-height: 2em; + + transition-property: opacity; + transition-duration: 150ms; } .futureLyric { diff --git a/src/styles/videoosd.scss b/src/styles/videoosd.scss index c5b5a547b..a42566781 100644 --- a/src/styles/videoosd.scss +++ b/src/styles/videoosd.scss @@ -85,7 +85,7 @@ bottom: 0; left: 0; right: 0; - background: rgba(0, 0, 0, 0.7); + background: none; padding: 0.25em 0.5em; user-select: none; } @@ -94,10 +94,12 @@ padding: 0.25em 0; margin: 0; opacity: 1; + color: #fff; + text-shadow: 0 0 25px #000, 0 0 6px #000; } .chapterThumbText-dim { - opacity: 0.6; + opacity: 0.9; } .videoOsdBottom-hidden { diff --git a/src/themes/UserThemeProvider.tsx b/src/themes/UserThemeProvider.tsx index bdffd2748..e3ea9eb17 100644 --- a/src/themes/UserThemeProvider.tsx +++ b/src/themes/UserThemeProvider.tsx @@ -1,11 +1,11 @@ -import { ThemeProvider } from '@mui/material/styles'; +import { type SupportedColorScheme, ThemeProvider, useColorScheme } from '@mui/material/styles'; import React, { type FC, type PropsWithChildren, useState, useEffect } from 'react'; import { useLocation } from 'react-router-dom'; import { DASHBOARD_APP_PATHS } from 'apps/dashboard/routes/routes'; import { useUserTheme } from 'hooks/useUserTheme'; -import { DEFAULT_THEME, getTheme } from './themes'; +import appTheme, { COLOR_SCHEMES } from './themes'; const isDashboardThemePage = (pathname: string) => [ // NOTE: The metadata manager doesn't seem to use the dashboard theme @@ -13,10 +13,9 @@ const isDashboardThemePage = (pathname: string) => [ DASHBOARD_APP_PATHS.PluginConfig ].some(path => pathname.startsWith(`/${path}`)); -const UserThemeProvider: FC> = ({ children }) => { +const ColorSchemeSwitcher: FC = () => { const [ isDashboard, setIsDashboard ] = useState(false); - const [ muiTheme, setMuiTheme ] = useState(DEFAULT_THEME); - + const { setColorScheme, setMode } = useColorScheme(); const location = useLocation(); const { theme, dashboardTheme } = useUserTheme(); @@ -26,15 +25,20 @@ const UserThemeProvider: FC> = ({ children }) => { }, [ location.pathname ]); useEffect(() => { - if (isDashboard) { - setMuiTheme(getTheme(dashboardTheme)); - } else { - setMuiTheme(getTheme(theme)); - } - }, [ dashboardTheme, isDashboard, theme ]); + const currentSchemeName = (isDashboard ? dashboardTheme : theme) as SupportedColorScheme; + const currentScheme = COLOR_SCHEMES[currentSchemeName]; + setColorScheme(currentSchemeName); + setMode(currentScheme.palette?.mode || 'dark'); + }, [ dashboardTheme, isDashboard, setColorScheme, setMode, theme ]); + + return null; +}; + +const UserThemeProvider: FC> = ({ children }) => { return ( - + + {children} ); diff --git a/src/themes/appletv/index.ts b/src/themes/appletv/index.ts deleted file mode 100644 index 9acba52cf..000000000 --- a/src/themes/appletv/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -import createTheme, { type ThemeOptions } from '@mui/material/styles/createTheme'; -import merge from 'lodash-es/merge'; - -import { DEFAULT_THEME_OPTIONS } from 'themes/defaults'; - -const themeOptions: ThemeOptions = { - palette: { - mode: 'light', - background: { - default: '#d5e9f2', - paper: '#fff' - } - }, - components: { - MuiAppBar: { - styleOverrides: { - colorPrimary: { - backgroundColor: '#bcbcbc' - } - } - } - } -}; - -const theme = createTheme(merge({}, DEFAULT_THEME_OPTIONS, themeOptions)); - -export default theme; diff --git a/src/themes/blueradiance/index.ts b/src/themes/blueradiance/index.ts deleted file mode 100644 index 2b2634309..000000000 --- a/src/themes/blueradiance/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import createTheme, { type ThemeOptions } from '@mui/material/styles/createTheme'; -import merge from 'lodash-es/merge'; - -import { DEFAULT_THEME_OPTIONS } from 'themes/defaults'; - -const options: ThemeOptions = { - palette: { - background: { - paper: '#011432' - } - } -}; - -const theme = createTheme(merge({}, DEFAULT_THEME_OPTIONS, options)); - -export default theme; diff --git a/src/themes/dark/index.ts b/src/themes/dark/index.ts deleted file mode 100644 index 71fcaa425..000000000 --- a/src/themes/dark/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import createTheme from '@mui/material/styles/createTheme'; - -import { DEFAULT_THEME_OPTIONS } from 'themes/defaults'; - -const theme = createTheme(DEFAULT_THEME_OPTIONS); - -export default theme; diff --git a/src/themes/dark/theme.scss b/src/themes/dark/theme.scss index f055a4cfc..b64687592 100644 --- a/src/themes/dark/theme.scss +++ b/src/themes/dark/theme.scss @@ -91,8 +91,8 @@ html { } .button-delete { - background: rgb(247, 0, 0); - color: rgba(255, 255, 255, 0.87); + background: #cb272a; + color: #fff; } .checkboxLabel { diff --git a/src/themes/defaults.ts b/src/themes/defaults.ts index 7f92f0c4b..5150ec003 100644 --- a/src/themes/defaults.ts +++ b/src/themes/defaults.ts @@ -1,8 +1,9 @@ -import type { ThemeOptions } from '@mui/material/styles/createTheme'; +import type { ColorSystemOptions, ThemeOptions } from '@mui/material/styles'; const LIST_ICON_WIDTH = 36; -export const DEFAULT_THEME_OPTIONS: ThemeOptions = { +/** The default "Dark" color scheme. */ +export const DEFAULT_COLOR_SCHEME: ColorSystemOptions = { palette: { mode: 'dark', primary: { @@ -24,7 +25,11 @@ export const DEFAULT_THEME_OPTIONS: ThemeOptions = { error: { main: '#cb272a' // Red color } - }, + } +}; + +/** The default customizations to the default MUI theme. */ +export const DEFAULT_THEME_OPTIONS: ThemeOptions = { typography: { fontFamily: '"Noto Sans", sans-serif', button: { diff --git a/src/themes/light/index.ts b/src/themes/light/index.ts deleted file mode 100644 index f6a84e9bd..000000000 --- a/src/themes/light/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import createTheme, { type ThemeOptions } from '@mui/material/styles/createTheme'; -import merge from 'lodash-es/merge'; - -import { DEFAULT_THEME_OPTIONS } from 'themes/defaults'; - -const options: ThemeOptions = { - palette: { - mode: 'light', - background: { - default: '#f2f2f2', - // NOTE: The original theme uses #303030 for the drawer and app bar but we would need the drawer to use - // dark mode for a color that dark to work properly which would require a separate ThemeProvider just for - // the drawer... which is not worth the trouble in my opinion - paper: '#e8e8e8' - } - }, - components: { - MuiAppBar: { - styleOverrides: { - colorPrimary: { - backgroundColor: '#e8e8e8' - } - } - } - } -}; - -const theme = createTheme(merge({}, DEFAULT_THEME_OPTIONS, options)); - -export default theme; diff --git a/src/themes/purplehaze/index.ts b/src/themes/purplehaze/index.ts deleted file mode 100644 index 407178422..000000000 --- a/src/themes/purplehaze/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import createTheme, { type ThemeOptions } from '@mui/material/styles/createTheme'; -import merge from 'lodash-es/merge'; - -import { DEFAULT_THEME_OPTIONS } from 'themes/defaults'; - -const options: ThemeOptions = { - palette: { - background: { - paper: '#000420' - }, - primary: { - main: '#48c3c8' - }, - secondary: { - main: '#ff77f1' - } - } -}; - -const theme = createTheme(merge({}, DEFAULT_THEME_OPTIONS, options)); - -export default theme; diff --git a/src/themes/themes.ts b/src/themes/themes.ts index b5ad17f98..edf16a9ac 100644 --- a/src/themes/themes.ts +++ b/src/themes/themes.ts @@ -1,13 +1,17 @@ -import { type Theme } from '@mui/material/styles'; +import { type ColorSystemOptions, createTheme, extendTheme } from '@mui/material/styles'; +import merge from 'lodash-es/merge'; -import appletv from './appletv'; -import blueradiance from './blueradiance'; -import dark from './dark'; -import light from './light'; -import purplehaze from './purplehaze'; -import wmc from './wmc'; +import { DEFAULT_COLOR_SCHEME, DEFAULT_THEME_OPTIONS } from './defaults'; +/** Extend MUI types to include our customizations. */ declare module '@mui/material/styles' { + interface ColorSchemeOverrides { + appletv: true; + blueradiance: true; + purplehaze: true; + wmc: true; + } + interface Palette { starIcon: Palette['primary']; } @@ -17,32 +21,116 @@ declare module '@mui/material/styles' { } } -const ALL_THEMES = { +/** The default built-in MUI theme. */ +const defaultMuiTheme = extendTheme({ + // @ts-expect-error The default theme does not include our custom color schemes + colorSchemes: { dark: true, light: true } +}); + +/** + * Default color schemes ('dark' or 'light') will automatically be merged with MUI's corresponding default color + * scheme. For custom schemes, we need to merge these manually. + */ +const buildCustomColorScheme = (options: ColorSystemOptions) => merge( + {}, + options.palette?.mode === 'light' ? defaultMuiTheme.colorSchemes.light : defaultMuiTheme.colorSchemes.dark, + DEFAULT_COLOR_SCHEME, + options +); + +/** The Apple TV inspired color scheme. */ +const appletv = buildCustomColorScheme({ + palette: { + mode: 'light', + background: { + default: '#d5e9f2', + paper: '#fff' + }, + AppBar: { + defaultBg: '#bcbcbc' + } + } +}); + +/** The "Blue Radiance" color scheme. */ +const blueradiance = buildCustomColorScheme({ + palette: { + background: { + paper: '#011432' + }, + AppBar: { + defaultBg: '#011432' + } + } +}); + +/** The "Light" color scheme. */ +const light = merge({}, DEFAULT_COLOR_SCHEME, { + palette: { + mode: 'light', + background: { + default: '#f2f2f2', + // NOTE: The original theme uses #303030 for the drawer and app bar but we would need the drawer to use + // dark mode for a color that dark to work properly which would require a separate ThemeProvider just for + // the drawer... which is not worth the trouble in my opinion + paper: '#e8e8e8' + }, + AppBar: { + defaultBg: '#e8e8e8' + } + } +}); + +/** The "Purple Haze" color scheme. */ +const purplehaze = buildCustomColorScheme({ + palette: { + background: { + paper: '#000420' + }, + primary: { + main: '#48c3c8' + }, + secondary: { + main: '#ff77f1' + }, + AppBar: { + defaultBg: '#000420' + } + } +}); + +/** The Windows Media Center inspired color scheme. */ +const wmc = buildCustomColorScheme({ + palette: { + background: { + paper: '#0c2450' + }, + AppBar: { + defaultBg: '#0c2450' + } + } +}); + +/** All color scheme variants in the app. */ +export const COLOR_SCHEMES = { appletv, blueradiance, - dark, + dark: DEFAULT_COLOR_SCHEME, light, purplehaze, wmc }; -/** The default theme if a user has not selected a preferred theme. */ -export const DEFAULT_THEME = dark; +/** The default theme containing all color scheme variants. */ +const DEFAULT_THEME = createTheme({ + cssVariables: { + cssVarPrefix: 'jf', + colorSchemeSelector: 'data', + disableCssColorScheme: true + }, + defaultColorScheme: 'dark', + ...DEFAULT_THEME_OPTIONS, + colorSchemes: COLOR_SCHEMES +}); -/** - * Gets a MUI Theme by its string id. Returns the default theme if no matching theme is found. - */ -export function getTheme(id?: string): Theme { - if (!id) { - console.info('[getTheme] no theme id; returning default theme'); - return DEFAULT_THEME; - } - - console.info('[getTheme] getting theme "%s"', id); - if (Object.keys(ALL_THEMES).includes(id)) { - return ALL_THEMES[id as keyof typeof ALL_THEMES]; - } - - console.warn('[getTheme] theme "%s" not found; returning default theme', id); - return DEFAULT_THEME; -} +export default DEFAULT_THEME; diff --git a/src/themes/wmc/index.ts b/src/themes/wmc/index.ts deleted file mode 100644 index 105ac10d6..000000000 --- a/src/themes/wmc/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import createTheme, { type ThemeOptions } from '@mui/material/styles/createTheme'; -import merge from 'lodash-es/merge'; - -import { DEFAULT_THEME_OPTIONS } from 'themes/defaults'; - -const options: ThemeOptions = { - palette: { - background: { - paper: '#0c2450' - } - } -}; - -const theme = createTheme(merge({}, DEFAULT_THEME_OPTIONS, options)); - -export default theme; diff --git a/src/utils/dashboard.js b/src/utils/dashboard.js index 9b468730d..b7deb9f8d 100644 --- a/src/utils/dashboard.js +++ b/src/utils/dashboard.js @@ -1,4 +1,8 @@ -import ServerConnections from '../components/ServerConnections'; +import { appHost } from 'components/apphost'; +import viewContainer from 'components/viewContainer'; +import { AppFeature } from 'constants/appFeature'; +import { ServerConnections } from 'lib/jellyfin-apiclient'; + import toast from '../components/toast/toast'; import loading from '../components/loading/loading'; import { appRouter } from '../components/router/appRouter'; @@ -13,7 +17,6 @@ import dialogHelper from '../components/dialogHelper/dialogHelper'; import itemIdentifier from '../components/itemidentifier/itemidentifier'; import { getLocationSearch } from './url.ts'; import { queryClient } from './query/queryClient'; -import viewContainer from 'components/viewContainer'; export function getCurrentUser() { return window.ApiClient.getCurrentUser(false); @@ -104,9 +107,8 @@ export function logout() { queryClient.clear(); // Reset cached views viewContainer.reset(); - webSettings.getMultiServer().then(multi => { - multi ? navigate('selectserver') : navigate('login'); - }); + appHost.supports(AppFeature.MultiServer) ? + navigate('selectserver') : navigate('login'); }); } @@ -178,13 +180,13 @@ export function alert(options) { } } -export function capabilities(appHost) { +export function capabilities(host) { return Object.assign({ PlayableMediaTypes: ['Audio', 'Video'], SupportedCommands: ['MoveUp', 'MoveDown', 'MoveLeft', 'MoveRight', 'PageUp', 'PageDown', 'PreviousLetter', 'NextLetter', 'ToggleOsd', 'ToggleContextMenu', 'Select', 'Back', 'SendKey', 'SendString', 'GoHome', 'GoToSettings', 'VolumeUp', 'VolumeDown', 'Mute', 'Unmute', 'ToggleMute', 'SetVolume', 'SetAudioStreamIndex', 'SetSubtitleStreamIndex', 'DisplayContent', 'GoToSearch', 'DisplayMessage', 'SetRepeatMode', 'SetShuffleQueue', 'ChannelUp', 'ChannelDown', 'PlayMediaSource', 'PlayTrailers'], SupportsPersistentIdentifier: window.appMode === 'cordova' || window.appMode === 'android', SupportsMediaControl: true - }, appHost.getPushTokenInfo()); + }, host.getPushTokenInfo()); } export function selectServer() { diff --git a/src/components/fetchhelper.js b/src/utils/fetch.js similarity index 100% rename from src/components/fetchhelper.js rename to src/utils/fetch.js diff --git a/src/utils/file.test.ts b/src/utils/file.test.ts new file mode 100644 index 000000000..1f23d4b96 --- /dev/null +++ b/src/utils/file.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest'; +import { getReadableSize } from './file'; + +describe('getReadableSize()', () => { + it('should return the correct units', () => { + expect(getReadableSize(5)).toBe('5.0 Bytes'); + expect(getReadableSize(1024)).toBe('1.0 KiB'); + expect(getReadableSize(1024 * 1024)).toBe('1.0 MiB'); + expect(getReadableSize(1024 * 1024 * 1024)).toBe('1.0 GiB'); + expect(getReadableSize(1024 * 1024 * 1024 * 1024)).toBe('1.0 TiB'); + expect(getReadableSize(1024 * 1024 * 1024 * 1024 * 1024)).toBe('1.0 PiB'); + expect(getReadableSize(1024 * 1024 * 1024 * 1024 * 1024 * 1024)).toBe('1.0 EiB'); + expect(getReadableSize(1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024)).toBe('1.0 ZiB'); + expect(getReadableSize(1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024)).toBe('1.0 YiB'); + }); + + it('should return the correct precision', () => { + expect(getReadableSize(12345, 0)).toBe('12 KiB'); + expect(getReadableSize(12345, 2)).toBe('12.06 KiB'); + expect(getReadableSize(12345, 3)).toBe('12.056 KiB'); + }); +}); diff --git a/src/utils/file.ts b/src/utils/file.ts index 0019a5068..b82df8738 100644 --- a/src/utils/file.ts +++ b/src/utils/file.ts @@ -28,3 +28,11 @@ export function readFileAsText(file: File): Promise { reader.readAsText(file); }); } + +/** Gets a human readable string representing a file size in bytes */ +export function getReadableSize(value: number, precision = 1) { + let d = Math.log(value) / Math.log(1024) | 0; + + return (value / Math.pow(1024, d)).toFixed(precision) + + ' ' + (d ? 'KMGTPEZY'[--d] + 'iB' : 'Bytes'); +} diff --git a/src/utils/number.ts b/src/utils/number.ts index af7e5f730..b68879523 100644 --- a/src/utils/number.ts +++ b/src/utils/number.ts @@ -13,13 +13,27 @@ export function randomInt(min: number, max: number): number { return Math.floor(Math.random() * (max - min + 1)) + min; } +/** + * Gets the value of a number formatted as a string. + * @param {number} value The value as a number. + * @param {string} locale The locale to use for formatting (i.e. en-us). + * @returns {string} The value formatted as a string. + */ +export function toDecimalString(value: number, locale: string): string { + if (toLocaleStringSupportsOptions()) { + return value.toLocaleString(locale); + } + + return value.toString(); +} + /** * Gets the value of a number formatted as a perentage. * @param {number} value The value as a number. * @param {string} locale The locale to use for formatting (i.e. en-us). * @returns {string} The value formatted as a percentage. */ -export function toPercent(value: number | null | undefined, locale: string): string { +export function toPercentString(value: number | null | undefined, locale: string): string { if (value == null) { return ''; } diff --git a/src/utils/reactUtils.tsx b/src/utils/reactUtils.tsx new file mode 100644 index 000000000..80abdd512 --- /dev/null +++ b/src/utils/reactUtils.tsx @@ -0,0 +1,43 @@ +import { ThemeProvider } from '@mui/material/styles'; +import { QueryClientProvider } from '@tanstack/react-query'; +import * as React from 'react'; +import { createRoot } from 'react-dom/client'; + +import { ApiProvider } from 'hooks/useApi'; +import { UserSettingsProvider } from 'hooks/useUserSettings'; +import { WebConfigProvider } from 'hooks/useWebConfig'; +import appTheme from 'themes/themes'; +import { queryClient } from 'utils/query/queryClient'; + +export const renderComponent =

( + Component: React.FC

, + props: P, + element: HTMLElement +) => { + const root = createRoot(element); + root.render( + + + + ); + + // NOTE: We need to wrap the unmount in a setTimeout to workaround this issue with nested roots: + // https://github.com/facebook/react/issues/25675 + return () => setTimeout(() => root.unmount()); +}; + +const RootContext: React.FC = ({ children }) => { + return ( + + + + + + {children} + + + + + + ); +}; diff --git a/src/utils/string.ts b/src/utils/string.ts index b3a858e6f..1f7c5aec5 100644 --- a/src/utils/string.ts +++ b/src/utils/string.ts @@ -1,3 +1,11 @@ +/** + * Checks if two string are equal ignoring case. + * @param str1 The first string. + * @param str2 The second string. + * @returns True if the strings are equal ignoring case. + */ +export const equalsIgnoreCase = (str1 = '', str2 = '') => str1.toLowerCase() === str2.toLowerCase(); + /** * Checks if a string is empty or contains only whitespace. * @param {string} value The string to test. diff --git a/webpack.common.js b/webpack.common.js index 4fa50976f..e571fe3e3 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -125,6 +125,9 @@ const config = { ), chunkFilename: '[name].[contenthash].chunk.js', assetModuleFilename: pathData => { + if (pathData.filename === 'manifest.json') { + return '[base]'; + } if (pathData.filename.startsWith('assets/') || pathData.filename.startsWith('themes/')) { return '[path][base][query]'; } @@ -226,6 +229,7 @@ const config = { path.resolve(__dirname, 'node_modules/markdown-it'), path.resolve(__dirname, 'node_modules/material-react-table'), path.resolve(__dirname, 'node_modules/mdurl'), + path.resolve(__dirname, 'node_modules/proxy-polyfill'), path.resolve(__dirname, 'node_modules/punycode'), path.resolve(__dirname, 'node_modules/react-blurhash'), path.resolve(__dirname, 'node_modules/react-lazy-load-image-component'), @@ -315,7 +319,7 @@ const config = { { loader: MiniCssExtractPlugin.loader, options: { - publicPath: '/' + publicPath: '../../' } }, 'css-loader',