Compare commits
81 Commits
v2.2.1
...
preview-li
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75afa742ea | ||
|
|
525a538f34 | ||
|
|
0d2273ff6e | ||
|
|
e035cd84ae | ||
|
|
438ccfe9c3 | ||
|
|
c181cee328 | ||
|
|
98a5b05816 | ||
|
|
b29959b063 | ||
|
|
9a2c12e51c | ||
|
|
620135aeac | ||
|
|
2dbd1096d2 | ||
|
|
24d3f523fc | ||
|
|
2b7974fa06 | ||
|
|
907ba6fdea | ||
|
|
efaad21554 | ||
|
|
6ab463285d | ||
|
|
418f0c2eb8 | ||
|
|
002557d2d0 | ||
|
|
62c1a70b37 | ||
|
|
1b325e7c32 | ||
|
|
f247642b76 | ||
|
|
396cd968ef | ||
|
|
ca739315b2 | ||
|
|
9143a6c027 | ||
|
|
d7fc03650f | ||
|
|
80fc5c1a78 | ||
|
|
95737d36e6 | ||
|
|
0fd6ca85a4 | ||
|
|
7cee9b475d | ||
|
|
ff9af866f8 | ||
|
|
5ffe6419ee | ||
|
|
8afcf5a8d8 | ||
|
|
17d93a8cb9 | ||
|
|
549082c53e | ||
|
|
fbef7e2c72 | ||
|
|
93d2e26ae9 | ||
|
|
f09a432635 | ||
|
|
a8f84d4f74 | ||
|
|
88e96fa163 | ||
|
|
2d814c1416 | ||
|
|
2f4b848b2c | ||
|
|
0ee3e69a61 | ||
|
|
7fcc0eb66d | ||
|
|
5d9f613dd8 | ||
|
|
ae1ee777fa | ||
|
|
b9dc9bceb5 | ||
|
|
1ffcea2065 | ||
|
|
ce1b39f73b | ||
|
|
71143ca76b | ||
|
|
bebad2d814 | ||
|
|
1c6f5362d7 | ||
|
|
4f6192476b | ||
|
|
e97b3dfa9e | ||
|
|
221397db71 | ||
|
|
9ecbd98230 | ||
|
|
3cc34b0db6 | ||
|
|
5a323324f8 | ||
|
|
99e2e17b8a | ||
|
|
0f14cd9247 | ||
|
|
50db3ea27b | ||
|
|
131a5a2b0b | ||
|
|
7d08f58c76 | ||
|
|
425f0c854e | ||
|
|
b8dbfaaed0 | ||
|
|
24c6208a3c | ||
|
|
d71ee58302 | ||
|
|
1755877e66 | ||
|
|
f84d752bca | ||
|
|
0b331ca579 | ||
|
|
656cd91c9c | ||
|
|
81d7473c05 | ||
|
|
f718cec23f | ||
|
|
ac908026db | ||
|
|
d67ec571c5 | ||
|
|
f3ebf6028b | ||
|
|
465d42dd60 | ||
|
|
2f0e493257 | ||
|
|
ebe7d11a53 | ||
|
|
7e94ad7210 | ||
|
|
814a7357c0 | ||
|
|
f8a8ebdf76 |
@@ -7,7 +7,7 @@
|
|||||||
"badgeTemplate": "<a href=\"#contributors-\"><img alt=\"All Contributors\" src=\"https://img.shields.io/badge/all_contributors-<%= contributors.length %>-orange.svg\"/></a>",
|
"badgeTemplate": "<a href=\"#contributors-\"><img alt=\"All Contributors\" src=\"https://img.shields.io/badge/all_contributors-<%= contributors.length %>-orange.svg\"/></a>",
|
||||||
"contributorsPerLine": 7,
|
"contributorsPerLine": 7,
|
||||||
"projectName": "jellyseerr",
|
"projectName": "jellyseerr",
|
||||||
"projectOwner": "Fallenbagel",
|
"projectOwner": "fallenbagel",
|
||||||
"repoType": "github",
|
"repoType": "github",
|
||||||
"repoHost": "https://github.com",
|
"repoHost": "https://github.com",
|
||||||
"skipCi": true,
|
"skipCi": true,
|
||||||
@@ -556,6 +556,60 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "GkhnGRBZ",
|
||||||
|
"name": "GkhnGRBZ",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/127258824?v=4",
|
||||||
|
"profile": "https://github.com/GkhnGRBZ",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "benhaney",
|
||||||
|
"name": "Ben Haney",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/31331498?v=4",
|
||||||
|
"profile": "http://benhaney.com",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Wunderharke",
|
||||||
|
"name": "Wunderharke",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/5105672?v=4",
|
||||||
|
"profile": "https://github.com/Wunderharke",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "methbkts",
|
||||||
|
"name": "Metin Bektas",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/30674934?v=4",
|
||||||
|
"profile": "https://github.com/methbkts",
|
||||||
|
"contributions": [
|
||||||
|
"infra"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "andrewkolda",
|
||||||
|
"name": "andrewkolda",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/158614532?v=4",
|
||||||
|
"profile": "https://github.com/andrewkolda",
|
||||||
|
"contributions": [
|
||||||
|
"design"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "ishanjain28",
|
||||||
|
"name": "Ishan Jain",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/7921368?v=4",
|
||||||
|
"profile": "https://ishanjain.me",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/bug.yml
vendored
2
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -63,6 +63,8 @@ body:
|
|||||||
- PostgreSQL
|
- PostgreSQL
|
||||||
label: Database
|
label: Database
|
||||||
description: Which database backend are you using?
|
description: Which database backend are you using?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
id: device
|
id: device
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
87
.github/workflows/ci.yml
vendored
87
.github/workflows/ci.yml
vendored
@@ -12,8 +12,8 @@ jobs:
|
|||||||
test:
|
test:
|
||||||
name: Lint & Test Build
|
name: Lint & Test Build
|
||||||
if: github.event_name == 'pull_request'
|
if: github.event_name == 'pull_request'
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
container: node:20-alpine
|
container: node:22-alpine
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -43,15 +43,23 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm build
|
run: pnpm build
|
||||||
|
|
||||||
build_and_push:
|
build:
|
||||||
name: Build & Publish Docker Images
|
name: Build & Publish Docker Images
|
||||||
if: github.ref == 'refs/heads/develop' && !contains(github.event.head_commit.message, '[skip ci]')
|
if: github.ref == 'refs/heads/develop' && !contains(github.event.head_commit.message, '[skip ci]')
|
||||||
runs-on: ubuntu-22.04
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- runner: ubuntu-24.04
|
||||||
|
platform: linux/amd64
|
||||||
|
- runner: ubuntu-24.04-arm
|
||||||
|
platform: linux/arm64
|
||||||
|
runs-on: ${{ matrix.runner }}
|
||||||
|
outputs:
|
||||||
|
digest-amd64: ${{ steps.set_outputs.outputs.digest-amd64 }}
|
||||||
|
digest-arm64: ${{ steps.set_outputs.outputs.digest-arm64 }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
@@ -70,24 +78,77 @@ jobs:
|
|||||||
echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV}
|
echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV}
|
||||||
env:
|
env:
|
||||||
OWNER: ${{ github.repository_owner }}
|
OWNER: ${{ github.repository_owner }}
|
||||||
- name: Build and push
|
- name: Docker metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v4
|
||||||
|
with:
|
||||||
|
images: |
|
||||||
|
fallenbagel/jellyseerr
|
||||||
|
ghcr.io/${{ env.OWNER_LC }}/jellyseerr
|
||||||
|
tags: |
|
||||||
|
type=ref,event=branch
|
||||||
|
type=sha,prefix=,suffix=,format=short
|
||||||
|
- name: Build and push by digest
|
||||||
|
id: build
|
||||||
uses: docker/build-push-action@v5
|
uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: ./Dockerfile
|
file: ./Dockerfile
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: ${{ matrix.platform }}
|
||||||
push: true
|
push: true
|
||||||
build-args: |
|
build-args: |
|
||||||
COMMIT_TAG=${{ github.sha }}
|
COMMIT_TAG=${{ github.sha }}
|
||||||
tags: |
|
outputs: |
|
||||||
fallenbagel/jellyseerr:develop
|
type=image,push-by-digest=true,name=fallenbagel/jellyseerr,push=true
|
||||||
ghcr.io/${{ env.OWNER_LC }}/jellyseerr:develop
|
type=image,push-by-digest=true,name=ghcr.io/${{ env.OWNER_LC }}/jellyseerr,push=true
|
||||||
|
cache-from: type=gha,scope=${{ matrix.platform }}
|
||||||
|
cache-to: type=gha,mode=max,scope=${{ matrix.platform }}
|
||||||
|
provenance: false
|
||||||
|
- name: Set outputs
|
||||||
|
id: set_outputs
|
||||||
|
run: |
|
||||||
|
platform="${{ matrix.platform == 'linux/amd64' && 'amd64' || 'arm64' }}"
|
||||||
|
echo "digest-${platform}=${{ steps.build.outputs.digest }}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
merge_and_push:
|
||||||
|
name: Create and Push Multi-arch Manifest
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: Log in to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_TOKEN }}
|
||||||
|
- name: Log in to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Set lower case owner name
|
||||||
|
run: |
|
||||||
|
echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV}
|
||||||
|
env:
|
||||||
|
OWNER: ${{ github.repository_owner }}
|
||||||
|
- name: Create and push manifest
|
||||||
|
run: |
|
||||||
|
docker manifest create fallenbagel/jellyseerr:develop \
|
||||||
|
--amend fallenbagel/jellyseerr@${{ needs.build.outputs.digest-amd64 }} \
|
||||||
|
--amend fallenbagel/jellyseerr@${{ needs.build.outputs.digest-arm64 }}
|
||||||
|
docker manifest push fallenbagel/jellyseerr:develop
|
||||||
|
|
||||||
|
# GHCR manifest
|
||||||
|
docker manifest create ghcr.io/${{ env.OWNER_LC }}/jellyseerr:develop \
|
||||||
|
--amend ghcr.io/${{ env.OWNER_LC }}/jellyseerr@${{ needs.build.outputs.digest-amd64 }} \
|
||||||
|
--amend ghcr.io/${{ env.OWNER_LC }}/jellyseerr@${{ needs.build.outputs.digest-arm64 }}
|
||||||
|
docker manifest push ghcr.io/${{ env.OWNER_LC }}/jellyseerr:develop
|
||||||
|
|
||||||
discord:
|
discord:
|
||||||
name: Send Discord Notification
|
name: Send Discord Notification
|
||||||
needs: build_and_push
|
needs: merge_and_push
|
||||||
if: always() && github.event_name != 'pull_request' && !contains(github.event.head_commit.message, '[skip ci]')
|
if: always() && github.event_name != 'pull_request' && !contains(github.event.head_commit.message, '[skip ci]')
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- name: Get Build Job Status
|
- name: Get Build Job Status
|
||||||
uses: technote-space/workflow-conclusion-action@v3
|
uses: technote-space/workflow-conclusion-action@v3
|
||||||
|
|||||||
2
.github/workflows/cypress.yml
vendored
2
.github/workflows/cypress.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 22
|
||||||
- name: Pnpm Setup
|
- name: Pnpm Setup
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
|
|||||||
135
.github/workflows/helm.yml
vendored
Normal file
135
.github/workflows/helm.yml
vendored
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
name: Release Charts
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- develop
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
package-helm-chart:
|
||||||
|
name: Package helm chart
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: read
|
||||||
|
outputs:
|
||||||
|
has_artifacts: ${{ steps.check-artifacts.outputs.has_artifacts }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install helm
|
||||||
|
uses: azure/setup-helm@v4
|
||||||
|
|
||||||
|
- name: Install Oras
|
||||||
|
uses: oras-project/setup-oras@v1
|
||||||
|
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Package helm charts
|
||||||
|
run: |
|
||||||
|
mkdir -p ./.cr-release-packages
|
||||||
|
for chart_path in ./charts/*; do
|
||||||
|
if [ -d "$chart_path" ] && [ -f "$chart_path/Chart.yaml" ]; then
|
||||||
|
chart_name=$(grep '^name:' "$chart_path/Chart.yaml" | awk '{print $2}')
|
||||||
|
# get current version
|
||||||
|
current_version=$(grep '^version:' "$chart_path/Chart.yaml" | awk '{print $2}')
|
||||||
|
# try to get current release version
|
||||||
|
set +e
|
||||||
|
oras discover ghcr.io/${GITHUB_REPOSITORY@L}/${chart_name}:${current_version}
|
||||||
|
oras_exit_code=$?
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ $oras_exit_code -ne 0 ]; then
|
||||||
|
helm dependency build "$chart_path"
|
||||||
|
helm package "$chart_path" --destination ./.cr-release-packages
|
||||||
|
else
|
||||||
|
echo "No version change for $chart_name. Skipping."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Skipping $chart_name: Not a valid Helm chart"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Check if artifacts exist
|
||||||
|
id: check-artifacts
|
||||||
|
run: |
|
||||||
|
if ls .cr-release-packages/* >/dev/null 2>&1; then
|
||||||
|
echo "has_artifacts=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "has_artifacts=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
if: steps.check-artifacts.outputs.has_artifacts == 'true'
|
||||||
|
with:
|
||||||
|
name: artifacts
|
||||||
|
include-hidden-files: true
|
||||||
|
path: .cr-release-packages/
|
||||||
|
|
||||||
|
publish:
|
||||||
|
name: Publish to ghcr.io
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
packages: write # needed for pushing to github registry
|
||||||
|
id-token: write # needed for signing the images with GitHub OIDC Token
|
||||||
|
needs: [package-helm-chart]
|
||||||
|
if: needs.package-helm-chart.outputs.has_artifacts == 'true'
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install helm
|
||||||
|
uses: azure/setup-helm@v4
|
||||||
|
|
||||||
|
- name: Install Oras
|
||||||
|
uses: oras-project/setup-oras@v1
|
||||||
|
|
||||||
|
- name: Install Cosign
|
||||||
|
uses: sigstore/cosign-installer@v3
|
||||||
|
|
||||||
|
- name: Downloads artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: artifacts
|
||||||
|
path: .cr-release-packages/
|
||||||
|
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Push charts to GHCR
|
||||||
|
env:
|
||||||
|
COSIGN_YES: true
|
||||||
|
run: |
|
||||||
|
for chart_path in `find .cr-release-packages -name '*.tgz' -print`; do
|
||||||
|
# push chart to OCI
|
||||||
|
chart_release_file=$(basename "$chart_path")
|
||||||
|
chart_name=${chart_release_file%-*}
|
||||||
|
helm push ${chart_path} oci://ghcr.io/${GITHUB_REPOSITORY@L} |& tee helm-push-output.log
|
||||||
|
chart_digest=$(awk -F "[, ]+" '/Digest/{print $NF}' < helm-push-output.log)
|
||||||
|
# sign chart
|
||||||
|
cosign sign "ghcr.io/${GITHUB_REPOSITORY@L}/${chart_name}@${chart_digest}"
|
||||||
|
# push artifacthub-repo.yml to OCI
|
||||||
|
oras push \
|
||||||
|
ghcr.io/${GITHUB_REPOSITORY@L}/${chart_name}:artifacthub.io \
|
||||||
|
--config /dev/null:application/vnd.cncf.artifacthub.config.v1+yaml \
|
||||||
|
charts/$chart_name/artifacthub-repo.yml:application/vnd.cncf.artifacthub.repository-metadata.layer.v1.yaml \
|
||||||
|
|& tee oras-push-output.log
|
||||||
|
artifacthub_digest=$(grep "Digest:" oras-push-output.log | awk '{print $2}')
|
||||||
|
# sign artifacthub-repo.yml
|
||||||
|
cosign sign "ghcr.io/${GITHUB_REPOSITORY@L}/${chart_name}:artifacthub.io@${artifacthub_digest}"
|
||||||
|
done
|
||||||
8
.github/workflows/release.yml
vendored
8
.github/workflows/release.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 22
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v3
|
uses: docker/setup-qemu-action@v3
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
@@ -26,6 +26,12 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
password: ${{ secrets.DOCKER_TOKEN }}
|
password: ${{ secrets.DOCKER_TOKEN }}
|
||||||
|
- name: Log in to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GH_TOKEN }}
|
||||||
- name: Pnpm Setup
|
- name: Pnpm Setup
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ All help is welcome and greatly appreciated! If you would like to contribute to
|
|||||||
|
|
||||||
- HTML/Typescript/Javascript editor
|
- HTML/Typescript/Javascript editor
|
||||||
- [VSCode](https://code.visualstudio.com/) is recommended. Upon opening the project, a few extensions will be automatically recommended for install.
|
- [VSCode](https://code.visualstudio.com/) is recommended. Upon opening the project, a few extensions will be automatically recommended for install.
|
||||||
- [NodeJS](https://nodejs.org/en/download/) (Node 20.x)
|
- [NodeJS](https://nodejs.org/en/download/) (Node 22.x)
|
||||||
- [Pnpm](https://pnpm.io/cli/install)
|
- [Pnpm](https://pnpm.io/cli/install)
|
||||||
- [Git](https://git-scm.com/downloads)
|
- [Git](https://git-scm.com/downloads)
|
||||||
|
|
||||||
|
|||||||
10
Dockerfile
10
Dockerfile
@@ -1,4 +1,4 @@
|
|||||||
FROM node:20-alpine AS BUILD_IMAGE
|
FROM node:22-alpine AS BUILD_IMAGE
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@ RUN \
|
|||||||
;; \
|
;; \
|
||||||
esac
|
esac
|
||||||
|
|
||||||
RUN npm install --global pnpm
|
RUN npm install --global pnpm@9
|
||||||
|
|
||||||
COPY package.json pnpm-lock.yaml postinstall-win.js ./
|
COPY package.json pnpm-lock.yaml postinstall-win.js ./
|
||||||
RUN CYPRESS_INSTALL_BINARY=0 pnpm install --frozen-lockfile
|
RUN CYPRESS_INSTALL_BINARY=0 pnpm install --frozen-lockfile
|
||||||
@@ -29,14 +29,14 @@ RUN pnpm build
|
|||||||
# remove development dependencies
|
# remove development dependencies
|
||||||
RUN pnpm prune --prod --ignore-scripts
|
RUN pnpm prune --prod --ignore-scripts
|
||||||
|
|
||||||
RUN rm -rf src server .next/cache
|
RUN rm -rf src server .next/cache charts gen-docs docs
|
||||||
|
|
||||||
RUN touch config/DOCKER
|
RUN touch config/DOCKER
|
||||||
|
|
||||||
RUN echo "{\"commitTag\": \"${COMMIT_TAG}\"}" > committag.json
|
RUN echo "{\"commitTag\": \"${COMMIT_TAG}\"}" > committag.json
|
||||||
|
|
||||||
|
|
||||||
FROM node:20-alpine
|
FROM node:22-alpine
|
||||||
|
|
||||||
# Metadata for Github Package Registry
|
# Metadata for Github Package Registry
|
||||||
LABEL org.opencontainers.image.source="https://github.com/Fallenbagel/jellyseerr"
|
LABEL org.opencontainers.image.source="https://github.com/Fallenbagel/jellyseerr"
|
||||||
@@ -45,7 +45,7 @@ WORKDIR /app
|
|||||||
|
|
||||||
RUN apk add --no-cache tzdata tini && rm -rf /tmp/*
|
RUN apk add --no-cache tzdata tini && rm -rf /tmp/*
|
||||||
|
|
||||||
RUN npm install -g pnpm
|
RUN npm install -g pnpm@9
|
||||||
|
|
||||||
# copy from build image
|
# copy from build image
|
||||||
COPY --from=BUILD_IMAGE /app ./
|
COPY --from=BUILD_IMAGE /app ./
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
FROM node:20-alpine
|
FROM node:22-alpine
|
||||||
|
|
||||||
COPY . /app
|
COPY . /app
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
Run npm install --global pnpm
|
RUN npm install --global pnpm@9
|
||||||
|
|
||||||
RUN pnpm install
|
RUN pnpm install
|
||||||
|
|
||||||
|
|||||||
115
README.md
115
README.md
@@ -11,17 +11,17 @@
|
|||||||
<a href="http://translate.jellyseerr.dev/engage/jellyseerr/"><img src="http://translate.jellyseerr.dev/widget/jellyseerr/jellyseerr-frontend/svg-badge.svg" alt="Translation status" /></a>
|
<a href="http://translate.jellyseerr.dev/engage/jellyseerr/"><img src="http://translate.jellyseerr.dev/widget/jellyseerr/jellyseerr-frontend/svg-badge.svg" alt="Translation status" /></a>
|
||||||
<a href="https://github.com/fallenbagel/jellyseerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/fallenbagel/jellyseerr"></a>
|
<a href="https://github.com/fallenbagel/jellyseerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/fallenbagel/jellyseerr"></a>
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||||
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-60-orange.svg"/></a>
|
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-66-orange.svg"/></a>
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||||
|
|
||||||
**Jellyseerr** is a free and open source software application for managing requests for your media library.
|
**Jellyseerr** is a free and open source software application for managing requests for your media library. It integrates with the media server of your choice: [Jellyfin](https://jellyfin.org), [Plex](https://plex.tv), and [Emby](https://emby.media/). In addition, it integrates with your existing services, such as **[Sonarr](https://sonarr.tv/)**, **[Radarr](https://radarr.video/)**.
|
||||||
It is a fork of [Overseerr](https://github.com/sct/overseerr) built to bring support for [Jellyfin](https://github.com/jellyfin/jellyfin) & [Emby](https://github.com/MediaBrowser/Emby) media servers!
|
|
||||||
|
|
||||||
## Current Features
|
## Current Features
|
||||||
|
|
||||||
- Full Jellyfin/Emby/Plex integration including authentication with user import & management
|
- Full Jellyfin/Emby/Plex integration including authentication with user import & management.
|
||||||
- Supports Movies, Shows and Mixed Libraries
|
- Support for **PostgreSQL** and **SQLite** databases.
|
||||||
- Ability to change email addresses for smtp purposes
|
- Supports Movies, Shows and Mixed Libraries.
|
||||||
|
- Ability to change email addresses for SMTP purposes.
|
||||||
- Easy integration with your existing services. Currently, Jellyseerr supports Sonarr and Radarr. More to come!
|
- Easy integration with your existing services. Currently, Jellyseerr supports Sonarr and Radarr. More to come!
|
||||||
- Jellyfin/Emby/Plex library scan, to keep track of the titles which are already available.
|
- Jellyfin/Emby/Plex library scan, to keep track of the titles which are already available.
|
||||||
- Customizable request system, which allows users to request individual seasons or movies in a friendly, easy-to-use interface.
|
- Customizable request system, which allows users to request individual seasons or movies in a friendly, easy-to-use interface.
|
||||||
@@ -29,8 +29,7 @@ It is a fork of [Overseerr](https://github.com/sct/overseerr) built to bring sup
|
|||||||
- Granular permission system.
|
- Granular permission system.
|
||||||
- Support for various notification agents.
|
- Support for various notification agents.
|
||||||
- Mobile-friendly design, for when you need to approve requests on the go!
|
- Mobile-friendly design, for when you need to approve requests on the go!
|
||||||
|
- Support for watchlisting & blacklisting media.
|
||||||
(Upcoming Features include: Multiple Server Instances, and much more!)
|
|
||||||
|
|
||||||
With more features on the way! Check out our [issue tracker](https://github.com/fallenbagel/jellyseerr/issues) to see the features which have already been requested.
|
With more features on the way! Check out our [issue tracker](https://github.com/fallenbagel/jellyseerr/issues) to see the features which have already been requested.
|
||||||
|
|
||||||
@@ -87,82 +86,90 @@ Thanks goes to these wonderful people from Overseerr ([emoji key](https://allcon
|
|||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fallenbagel"><img src="https://avatars.githubusercontent.com/u/98979876?v=4?s=100" width="100px;" alt="Fallenbagel"/><br /><sub><b>Fallenbagel</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Fallenbagel" title="Code">💻</a> <a href="#maintenance-Fallenbagel" title="Maintenance">🚧</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fallenbagel"><img src="https://avatars.githubusercontent.com/u/98979876?v=4?s=100" width="100px;" alt="Fallenbagel"/><br /><sub><b>Fallenbagel</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Fallenbagel" title="Code">💻</a> <a href="#maintenance-Fallenbagel" title="Maintenance">🚧</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/seanzhang98"><img src="https://avatars.githubusercontent.com/u/34902361?v=4?s=100" width="100px;" alt="Sean"/><br /><sub><b>Sean</b></sub></a><br /><a href="#translation-seanzhang98" title="Translation">🌍</a> <a href="https://github.com/Fallenbagel/jellyseerr/commits?author=seanzhang98" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/seanzhang98"><img src="https://avatars.githubusercontent.com/u/34902361?v=4?s=100" width="100px;" alt="Sean"/><br /><sub><b>Sean</b></sub></a><br /><a href="#translation-seanzhang98" title="Translation">🌍</a> <a href="https://github.com/fallenbagel/jellyseerr/commits?author=seanzhang98" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/notfakie"><img src="https://avatars.githubusercontent.com/u/103784113?v=4?s=100" width="100px;" alt="notfakie"/><br /><sub><b>notfakie</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=notfakie" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/notfakie"><img src="https://avatars.githubusercontent.com/u/103784113?v=4?s=100" width="100px;" alt="notfakie"/><br /><sub><b>notfakie</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=notfakie" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jumail"><img src="https://avatars.githubusercontent.com/u/7672055?v=4?s=100" width="100px;" alt="Mohamed Jumail"/><br /><sub><b>Mohamed Jumail</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/pulls?q=is%3Apr+reviewed-by%3AJumail" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jumail"><img src="https://avatars.githubusercontent.com/u/7672055?v=4?s=100" width="100px;" alt="Mohamed Jumail"/><br /><sub><b>Mohamed Jumail</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/pulls?q=is%3Apr+reviewed-by%3AJumail" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.heywhale.com"><img src="https://avatars.githubusercontent.com/u/4048787?v=4?s=100" width="100px;" alt="Shilong Jiang"/><br /><sub><b>Shilong Jiang</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=jsl9208" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://www.heywhale.com"><img src="https://avatars.githubusercontent.com/u/4048787?v=4?s=100" width="100px;" alt="Shilong Jiang"/><br /><sub><b>Shilong Jiang</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=jsl9208" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://jinas.me"><img src="https://avatars.githubusercontent.com/u/28459081?v=4?s=100" width="100px;" alt="Boring Dragon"/><br /><sub><b>Boring Dragon</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=boring-dragon" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://jinas.me"><img src="https://avatars.githubusercontent.com/u/28459081?v=4?s=100" width="100px;" alt="Boring Dragon"/><br /><sub><b>Boring Dragon</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=boring-dragon" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sambartik"><img src="https://avatars.githubusercontent.com/u/63553146?v=4?s=100" width="100px;" alt="Samuel Bartík"/><br /><sub><b>Samuel Bartík</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=sambartik" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sambartik"><img src="https://avatars.githubusercontent.com/u/63553146?v=4?s=100" width="100px;" alt="Samuel Bartík"/><br /><sub><b>Samuel Bartík</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=sambartik" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CyferShepard"><img src="https://avatars.githubusercontent.com/u/24864904?v=4?s=100" width="100px;" alt="Thegan Govender"/><br /><sub><b>Thegan Govender</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=CyferShepard" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CyferShepard"><img src="https://avatars.githubusercontent.com/u/24864904?v=4?s=100" width="100px;" alt="Thegan Govender"/><br /><sub><b>Thegan Govender</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=CyferShepard" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jab416171"><img src="https://avatars.githubusercontent.com/u/345752?v=4?s=100" width="100px;" alt="jab416171"/><br /><sub><b>jab416171</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=jab416171" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jab416171"><img src="https://avatars.githubusercontent.com/u/345752?v=4?s=100" width="100px;" alt="jab416171"/><br /><sub><b>jab416171</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=jab416171" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://nvds.be"><img src="https://avatars.githubusercontent.com/u/5257222?v=4?s=100" width="100px;" alt="Nicolai Van der Storm"/><br /><sub><b>Nicolai Van der Storm</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=NicolaiVdS" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://nvds.be"><img src="https://avatars.githubusercontent.com/u/5257222?v=4?s=100" width="100px;" alt="Nicolai Van der Storm"/><br /><sub><b>Nicolai Van der Storm</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=NicolaiVdS" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Smexhy"><img src="https://avatars.githubusercontent.com/u/4880625?v=4?s=100" width="100px;" alt="Smexhy"/><br /><sub><b>Smexhy</b></sub></a><br /><a href="#translation-Smexhy" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Smexhy"><img src="https://avatars.githubusercontent.com/u/4880625?v=4?s=100" width="100px;" alt="Smexhy"/><br /><sub><b>Smexhy</b></sub></a><br /><a href="#translation-Smexhy" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://dd06-dev.fr"><img src="https://avatars.githubusercontent.com/u/58089504?v=4?s=100" width="100px;" alt="dd060606"/><br /><sub><b>dd060606</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=dd060606" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://dd06-dev.fr"><img src="https://avatars.githubusercontent.com/u/58089504?v=4?s=100" width="100px;" alt="dd060606"/><br /><sub><b>dd060606</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=dd060606" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://qwer.tz"><img src="https://avatars.githubusercontent.com/u/71837281?v=4?s=100" width="100px;" alt="Daniel"/><br /><sub><b>Daniel</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=darmiel" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://qwer.tz"><img src="https://avatars.githubusercontent.com/u/71837281?v=4?s=100" width="100px;" alt="Daniel"/><br /><sub><b>Daniel</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=darmiel" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/undone37"><img src="https://avatars.githubusercontent.com/u/10513808?v=4?s=100" width="100px;" alt="undone37"/><br /><sub><b>undone37</b></sub></a><br /><a href="#translation-undone37" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/undone37"><img src="https://avatars.githubusercontent.com/u/10513808?v=4?s=100" width="100px;" alt="undone37"/><br /><sub><b>undone37</b></sub></a><br /><a href="#translation-undone37" title="Translation">🌍</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CheChu10"><img src="https://avatars.githubusercontent.com/u/32913133?v=4?s=100" width="100px;" alt="Chechu García"/><br /><sub><b>Chechu García</b></sub></a><br /><a href="#translation-CheChu10" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CheChu10"><img src="https://avatars.githubusercontent.com/u/32913133?v=4?s=100" width="100px;" alt="Chechu García"/><br /><sub><b>Chechu García</b></sub></a><br /><a href="#translation-CheChu10" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DimitriDR"><img src="https://avatars.githubusercontent.com/u/56969769?v=4?s=100" width="100px;" alt="Dimitri"/><br /><sub><b>Dimitri</b></sub></a><br /><a href="#translation-DimitriDR" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DimitriDR"><img src="https://avatars.githubusercontent.com/u/56969769?v=4?s=100" width="100px;" alt="Dimitri"/><br /><sub><b>Dimitri</b></sub></a><br /><a href="#translation-DimitriDR" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/andrey4korop"><img src="https://avatars.githubusercontent.com/u/24610708?v=4?s=100" width="100px;" alt="andrey4korop"/><br /><sub><b>andrey4korop</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=andrey4korop" title="Code">💻</a> <a href="#translation-andrey4korop" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/andrey4korop"><img src="https://avatars.githubusercontent.com/u/24610708?v=4?s=100" width="100px;" alt="andrey4korop"/><br /><sub><b>andrey4korop</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=andrey4korop" title="Code">💻</a> <a href="#translation-andrey4korop" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://geoffrey-coulaud.fr"><img src="https://avatars.githubusercontent.com/u/20744730?v=4?s=100" width="100px;" alt="Geoffrey Coulaud"/><br /><sub><b>Geoffrey Coulaud</b></sub></a><br /><a href="#translation-GeoffreyCoulaud" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://geoffrey-coulaud.fr"><img src="https://avatars.githubusercontent.com/u/20744730?v=4?s=100" width="100px;" alt="Geoffrey Coulaud"/><br /><sub><b>Geoffrey Coulaud</b></sub></a><br /><a href="#translation-GeoffreyCoulaud" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Pikachu920"><img src="https://avatars.githubusercontent.com/u/28607612?v=4?s=100" width="100px;" alt="Pikachu920"/><br /><sub><b>Pikachu920</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Pikachu920" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Pikachu920"><img src="https://avatars.githubusercontent.com/u/28607612?v=4?s=100" width="100px;" alt="Pikachu920"/><br /><sub><b>Pikachu920</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Pikachu920" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yalagin"><img src="https://avatars.githubusercontent.com/u/12879142?v=4?s=100" width="100px;" alt="Maxim Yalagin"/><br /><sub><b>Maxim Yalagin</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=yalagin" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yalagin"><img src="https://avatars.githubusercontent.com/u/12879142?v=4?s=100" width="100px;" alt="Maxim Yalagin"/><br /><sub><b>Maxim Yalagin</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=yalagin" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jeaboswell"><img src="https://avatars.githubusercontent.com/u/11653068?v=4?s=100" width="100px;" alt="Jesse Boswell"/><br /><sub><b>Jesse Boswell</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=jeaboswell" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jeaboswell"><img src="https://avatars.githubusercontent.com/u/11653068?v=4?s=100" width="100px;" alt="Jesse Boswell"/><br /><sub><b>Jesse Boswell</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=jeaboswell" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/d-fendrich"><img src="https://avatars.githubusercontent.com/u/27904138?v=4?s=100" width="100px;" alt="d-fendrich"/><br /><sub><b>d-fendrich</b></sub></a><br /><a href="#translation-d-fendrich" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/d-fendrich"><img src="https://avatars.githubusercontent.com/u/27904138?v=4?s=100" width="100px;" alt="d-fendrich"/><br /><sub><b>d-fendrich</b></sub></a><br /><a href="#translation-d-fendrich" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/davidfdezalcoba"><img src="https://avatars.githubusercontent.com/u/15996018?v=4?s=100" width="100px;" alt="David Fernández Alcoba"/><br /><sub><b>David Fernández Alcoba</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=davidfdezalcoba" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/davidfdezalcoba"><img src="https://avatars.githubusercontent.com/u/15996018?v=4?s=100" width="100px;" alt="David Fernández Alcoba"/><br /><sub><b>David Fernández Alcoba</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=davidfdezalcoba" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Gauvino"><img src="https://avatars.githubusercontent.com/u/68083474?v=4?s=100" width="100px;" alt="Gauvino"/><br /><sub><b>Gauvino</b></sub></a><br /><a href="#translation-Gauvino" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Gauvino"><img src="https://avatars.githubusercontent.com/u/68083474?v=4?s=100" width="100px;" alt="Gauvino"/><br /><sub><b>Gauvino</b></sub></a><br /><a href="#translation-Gauvino" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/EthanArmbrust"><img src="https://avatars.githubusercontent.com/u/22754714?v=4?s=100" width="100px;" alt="EthanArmbrust"/><br /><sub><b>EthanArmbrust</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=EthanArmbrust" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/EthanArmbrust"><img src="https://avatars.githubusercontent.com/u/22754714?v=4?s=100" width="100px;" alt="EthanArmbrust"/><br /><sub><b>EthanArmbrust</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=EthanArmbrust" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://www.piribisoft.com"><img src="https://avatars.githubusercontent.com/u/854646?v=4?s=100" width="100px;" alt="Eduardo"/><br /><sub><b>Eduardo</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=SirMartin" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="http://www.piribisoft.com"><img src="https://avatars.githubusercontent.com/u/854646?v=4?s=100" width="100px;" alt="Eduardo"/><br /><sub><b>Eduardo</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=SirMartin" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RickLuiken"><img src="https://avatars.githubusercontent.com/u/34110371?v=4?s=100" width="100px;" alt="RickLuiken"/><br /><sub><b>RickLuiken</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=RickLuiken" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RickLuiken"><img src="https://avatars.githubusercontent.com/u/34110371?v=4?s=100" width="100px;" alt="RickLuiken"/><br /><sub><b>RickLuiken</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=RickLuiken" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Br33ce"><img src="https://avatars.githubusercontent.com/u/124933490?v=4?s=100" width="100px;" alt="Br33ce"/><br /><sub><b>Br33ce</b></sub></a><br /><a href="#translation-Br33ce" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Br33ce"><img src="https://avatars.githubusercontent.com/u/124933490?v=4?s=100" width="100px;" alt="Br33ce"/><br /><sub><b>Br33ce</b></sub></a><br /><a href="#translation-Br33ce" title="Translation">🌍</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://athfan.com"><img src="https://avatars.githubusercontent.com/u/13810742?v=4?s=100" width="100px;" alt="Athfan Khaleel"/><br /><sub><b>Athfan Khaleel</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=athphane" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://athfan.com"><img src="https://avatars.githubusercontent.com/u/13810742?v=4?s=100" width="100px;" alt="Athfan Khaleel"/><br /><sub><b>Athfan Khaleel</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=athphane" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mdll23"><img src="https://avatars.githubusercontent.com/u/142844478?v=4?s=100" width="100px;" alt="Michael Dallinger"/><br /><sub><b>Michael Dallinger</b></sub></a><br /><a href="#translation-mdll23" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mdll23"><img src="https://avatars.githubusercontent.com/u/142844478?v=4?s=100" width="100px;" alt="Michael Dallinger"/><br /><sub><b>Michael Dallinger</b></sub></a><br /><a href="#translation-mdll23" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xeruf"><img src="https://avatars.githubusercontent.com/u/13354331?v=4?s=100" width="100px;" alt="Janek"/><br /><sub><b>Janek</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=xeruf" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xeruf"><img src="https://avatars.githubusercontent.com/u/13354331?v=4?s=100" width="100px;" alt="Janek"/><br /><sub><b>Janek</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=xeruf" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://aleksasiriski.dev"><img src="https://avatars.githubusercontent.com/u/31509435?v=4?s=100" width="100px;" alt="Aleksa Siriški"/><br /><sub><b>Aleksa Siriški</b></sub></a><br /><a href="#infra-aleksasiriski" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://aleksasiriski.dev"><img src="https://avatars.githubusercontent.com/u/31509435?v=4?s=100" width="100px;" alt="Aleksa Siriški"/><br /><sub><b>Aleksa Siriški</b></sub></a><br /><a href="#infra-aleksasiriski" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://danishhumair.com"><img src="https://avatars.githubusercontent.com/u/121830048?v=4?s=100" width="100px;" alt="Danish Humair"/><br /><sub><b>Danish Humair</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Danish-H" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="http://danishhumair.com"><img src="https://avatars.githubusercontent.com/u/121830048?v=4?s=100" width="100px;" alt="Danish Humair"/><br /><sub><b>Danish Humair</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Danish-H" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://arm0.red"><img src="https://avatars.githubusercontent.com/u/16858514?v=4?s=100" width="100px;" alt="Stephen Harris"/><br /><sub><b>Stephen Harris</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=trackmastersteve" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://arm0.red"><img src="https://avatars.githubusercontent.com/u/16858514?v=4?s=100" width="100px;" alt="Stephen Harris"/><br /><sub><b>Stephen Harris</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=trackmastersteve" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.boniface.me"><img src="https://avatars.githubusercontent.com/u/4031396?v=4?s=100" width="100px;" alt="Joshua M. Boniface"/><br /><sub><b>Joshua M. Boniface</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=joshuaboniface" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://www.boniface.me"><img src="https://avatars.githubusercontent.com/u/4031396?v=4?s=100" width="100px;" alt="Joshua M. Boniface"/><br /><sub><b>Joshua M. Boniface</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=joshuaboniface" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://gauthierth.fr/"><img src="https://avatars.githubusercontent.com/u/37781713?v=4?s=100" width="100px;" alt="Gauthier"/><br /><sub><b>Gauthier</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=gauthier-th" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://gauthierth.fr/"><img src="https://avatars.githubusercontent.com/u/37781713?v=4?s=100" width="100px;" alt="Gauthier"/><br /><sub><b>Gauthier</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=gauthier-th" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Kara-Zor-El"><img src="https://avatars.githubusercontent.com/u/69772087?v=4?s=100" width="100px;" alt="Kara"/><br /><sub><b>Kara</b></sub></a><br /><a href="#infra-Kara-Zor-El" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Kara-Zor-El"><img src="https://avatars.githubusercontent.com/u/69772087?v=4?s=100" width="100px;" alt="Kara"/><br /><sub><b>Kara</b></sub></a><br /><a href="#infra-Kara-Zor-El" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://joaquinolivero.com"><img src="https://avatars.githubusercontent.com/u/66050823?v=4?s=100" width="100px;" alt="Joaquin Olivero"/><br /><sub><b>Joaquin Olivero</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=JoaquinOlivero" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://joaquinolivero.com"><img src="https://avatars.githubusercontent.com/u/66050823?v=4?s=100" width="100px;" alt="Joaquin Olivero"/><br /><sub><b>Joaquin Olivero</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=JoaquinOlivero" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bretterteig"><img src="https://avatars.githubusercontent.com/u/47298401?v=4?s=100" width="100px;" alt="Julian Behr"/><br /><sub><b>Julian Behr</b></sub></a><br /><a href="#translation-Bretterteig" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bretterteig"><img src="https://avatars.githubusercontent.com/u/47298401?v=4?s=100" width="100px;" alt="Julian Behr"/><br /><sub><b>Julian Behr</b></sub></a><br /><a href="#translation-Bretterteig" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ThowZzy"><img src="https://avatars.githubusercontent.com/u/61882536?v=4?s=100" width="100px;" alt="ThowZzy"/><br /><sub><b>ThowZzy</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=ThowZzy" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ThowZzy"><img src="https://avatars.githubusercontent.com/u/61882536?v=4?s=100" width="100px;" alt="ThowZzy"/><br /><sub><b>ThowZzy</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=ThowZzy" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://josephrisk.com"><img src="https://avatars.githubusercontent.com/u/18372584?v=4?s=100" width="100px;" alt="Joseph Risk"/><br /><sub><b>Joseph Risk</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=j0srisk" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="http://josephrisk.com"><img src="https://avatars.githubusercontent.com/u/18372584?v=4?s=100" width="100px;" alt="Joseph Risk"/><br /><sub><b>Joseph Risk</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=j0srisk" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loetwiek"><img src="https://avatars.githubusercontent.com/u/79059734?v=4?s=100" width="100px;" alt="Loetwiek"/><br /><sub><b>Loetwiek</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Loetwiek" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loetwiek"><img src="https://avatars.githubusercontent.com/u/79059734?v=4?s=100" width="100px;" alt="Loetwiek"/><br /><sub><b>Loetwiek</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Loetwiek" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fuochi"><img src="https://avatars.githubusercontent.com/u/4720478?v=4?s=100" width="100px;" alt="Fuochi"/><br /><sub><b>Fuochi</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Fuochi" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fuochi"><img src="https://avatars.githubusercontent.com/u/4720478?v=4?s=100" width="100px;" alt="Fuochi"/><br /><sub><b>Fuochi</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Fuochi" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://mobihen.com"><img src="https://avatars.githubusercontent.com/u/35529491?v=4?s=100" width="100px;" alt="Nir Israel Hen"/><br /><sub><b>Nir Israel Hen</b></sub></a><br /><a href="#translation-mobihen" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://mobihen.com"><img src="https://avatars.githubusercontent.com/u/35529491?v=4?s=100" width="100px;" alt="Nir Israel Hen"/><br /><sub><b>Nir Israel Hen</b></sub></a><br /><a href="#translation-mobihen" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XDark187"><img src="https://avatars.githubusercontent.com/u/39034192?v=4?s=100" width="100px;" alt="Baraa"/><br /><sub><b>Baraa</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=XDark187" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XDark187"><img src="https://avatars.githubusercontent.com/u/39034192?v=4?s=100" width="100px;" alt="Baraa"/><br /><sub><b>Baraa</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=XDark187" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/franciscofsales"><img src="https://avatars.githubusercontent.com/u/7977645?v=4?s=100" width="100px;" alt="Francisco Sales"/><br /><sub><b>Francisco Sales</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=franciscofsales" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/franciscofsales"><img src="https://avatars.githubusercontent.com/u/7977645?v=4?s=100" width="100px;" alt="Francisco Sales"/><br /><sub><b>Francisco Sales</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=franciscofsales" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/myselfolli"><img src="https://avatars.githubusercontent.com/u/37535998?v=4?s=100" width="100px;" alt="Oliver Laing"/><br /><sub><b>Oliver Laing</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=myselfolli" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/myselfolli"><img src="https://avatars.githubusercontent.com/u/37535998?v=4?s=100" width="100px;" alt="Oliver Laing"/><br /><sub><b>Oliver Laing</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=myselfolli" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/M0NsTeRRR"><img src="https://avatars.githubusercontent.com/u/37785089?v=4?s=100" width="100px;" alt="Ludovic Ortega"/><br /><sub><b>Ludovic Ortega</b></sub></a><br /><a href="#security-M0NsTeRRR" title="Security">🛡️</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/M0NsTeRRR"><img src="https://avatars.githubusercontent.com/u/37785089?v=4?s=100" width="100px;" alt="Ludovic Ortega"/><br /><sub><b>Ludovic Ortega</b></sub></a><br /><a href="#security-M0NsTeRRR" title="Security">🛡️</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://josephrisk.com"><img src="https://avatars.githubusercontent.com/u/18372584?v=4?s=100" width="100px;" alt="Joseph Risk"/><br /><sub><b>Joseph Risk</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=j0srisk" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="http://josephrisk.com"><img src="https://avatars.githubusercontent.com/u/18372584?v=4?s=100" width="100px;" alt="Joseph Risk"/><br /><sub><b>Joseph Risk</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=j0srisk" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loetwiek"><img src="https://avatars.githubusercontent.com/u/79059734?v=4?s=100" width="100px;" alt="Loetwiek"/><br /><sub><b>Loetwiek</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Loetwiek" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loetwiek"><img src="https://avatars.githubusercontent.com/u/79059734?v=4?s=100" width="100px;" alt="Loetwiek"/><br /><sub><b>Loetwiek</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Loetwiek" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fuochi"><img src="https://avatars.githubusercontent.com/u/4720478?v=4?s=100" width="100px;" alt="Fuochi"/><br /><sub><b>Fuochi</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Fuochi" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fuochi"><img src="https://avatars.githubusercontent.com/u/4720478?v=4?s=100" width="100px;" alt="Fuochi"/><br /><sub><b>Fuochi</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Fuochi" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/demrich"><img src="https://avatars.githubusercontent.com/u/30092389?v=4?s=100" width="100px;" alt="David Emrich"/><br /><sub><b>David Emrich</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=demrich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/demrich"><img src="https://avatars.githubusercontent.com/u/30092389?v=4?s=100" width="100px;" alt="David Emrich"/><br /><sub><b>David Emrich</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=demrich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://maxtrier.dk"><img src="https://avatars.githubusercontent.com/u/5898152?v=4?s=100" width="100px;" alt="Max T. Kristiansen"/><br /><sub><b>Max T. Kristiansen</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=maxnatamo" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://maxtrier.dk"><img src="https://avatars.githubusercontent.com/u/5898152?v=4?s=100" width="100px;" alt="Max T. Kristiansen"/><br /><sub><b>Max T. Kristiansen</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=maxnatamo" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://damsdev.me"><img src="https://avatars.githubusercontent.com/u/60252259?v=4?s=100" width="100px;" alt="Damien Fajole"/><br /><sub><b>Damien Fajole</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=DamsDev1" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://damsdev.me"><img src="https://avatars.githubusercontent.com/u/60252259?v=4?s=100" width="100px;" alt="Damien Fajole"/><br /><sub><b>Damien Fajole</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=DamsDev1" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AhmedNSidd"><img src="https://avatars.githubusercontent.com/u/36286128?v=4?s=100" width="100px;" alt="Ahmed Siddiqui"/><br /><sub><b>Ahmed Siddiqui</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=AhmedNSidd" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AhmedNSidd"><img src="https://avatars.githubusercontent.com/u/36286128?v=4?s=100" width="100px;" alt="Ahmed Siddiqui"/><br /><sub><b>Ahmed Siddiqui</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=AhmedNSidd" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Zariel"><img src="https://avatars.githubusercontent.com/u/2213?v=4?s=100" width="100px;" alt="Chris Bannister"/><br /><sub><b>Chris Bannister</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Zariel" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Zariel"><img src="https://avatars.githubusercontent.com/u/2213?v=4?s=100" width="100px;" alt="Chris Bannister"/><br /><sub><b>Chris Bannister</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Zariel" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/C4J3"><img src="https://avatars.githubusercontent.com/u/13005453?v=4?s=100" width="100px;" alt="Joe"/><br /><sub><b>Joe</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=C4J3" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/C4J3"><img src="https://avatars.githubusercontent.com/u/13005453?v=4?s=100" width="100px;" alt="Joe"/><br /><sub><b>Joe</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=C4J3" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://me.garnx.fr"><img src="https://avatars.githubusercontent.com/u/37373941?v=4?s=100" width="100px;" alt="Guillaume ARNOUX"/><br /><sub><b>Guillaume ARNOUX</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=guillaumearnx" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://me.garnx.fr"><img src="https://avatars.githubusercontent.com/u/37373941?v=4?s=100" width="100px;" alt="Guillaume ARNOUX"/><br /><sub><b>Guillaume ARNOUX</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=guillaumearnx" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dr-carrot"><img src="https://avatars.githubusercontent.com/u/17272571?v=4?s=100" width="100px;" alt="dr-carrot"/><br /><sub><b>dr-carrot</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=dr-carrot" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dr-carrot"><img src="https://avatars.githubusercontent.com/u/17272571?v=4?s=100" width="100px;" alt="dr-carrot"/><br /><sub><b>dr-carrot</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=dr-carrot" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gageorsburn"><img src="https://avatars.githubusercontent.com/u/4692734?v=4?s=100" width="100px;" alt="Gage Orsburn"/><br /><sub><b>Gage Orsburn</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=gageorsburn" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gageorsburn"><img src="https://avatars.githubusercontent.com/u/4692734?v=4?s=100" width="100px;" alt="Gage Orsburn"/><br /><sub><b>Gage Orsburn</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=gageorsburn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GkhnGRBZ"><img src="https://avatars.githubusercontent.com/u/127258824?v=4?s=100" width="100px;" alt="GkhnGRBZ"/><br /><sub><b>GkhnGRBZ</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=GkhnGRBZ" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://benhaney.com"><img src="https://avatars.githubusercontent.com/u/31331498?v=4?s=100" width="100px;" alt="Ben Haney"/><br /><sub><b>Ben Haney</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=benhaney" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Wunderharke"><img src="https://avatars.githubusercontent.com/u/5105672?v=4?s=100" width="100px;" alt="Wunderharke"/><br /><sub><b>Wunderharke</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Wunderharke" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/methbkts"><img src="https://avatars.githubusercontent.com/u/30674934?v=4?s=100" width="100px;" alt="Metin Bektas"/><br /><sub><b>Metin Bektas</b></sub></a><br /><a href="#infra-methbkts" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/andrewkolda"><img src="https://avatars.githubusercontent.com/u/158614532?v=4?s=100" width="100px;" alt="andrewkolda"/><br /><sub><b>andrewkolda</b></sub></a><br /><a href="#design-andrewkolda" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://ishanjain.me"><img src="https://avatars.githubusercontent.com/u/7921368?v=4?s=100" width="100px;" alt="Ishan Jain"/><br /><sub><b>Ishan Jain</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=ishanjain28" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -21,3 +21,5 @@
|
|||||||
.idea/
|
.idea/
|
||||||
*.tmproj
|
*.tmproj
|
||||||
.vscode/
|
.vscode/
|
||||||
|
# go template
|
||||||
|
*.gotmpl
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
kubeVersion: ">=1.23.0-0"
|
kubeVersion: ">=1.23.0-0"
|
||||||
name: Jellyseerr
|
name: jellyseerr-chart
|
||||||
description: Jellyseerr helm chart for Kubernetes
|
description: Jellyseerr helm chart for Kubernetes
|
||||||
type: application
|
type: application
|
||||||
version: 1.1.0
|
version: 2.1.1
|
||||||
appVersion: "2.1.0"
|
appVersion: "2.3.0"
|
||||||
maintainers:
|
maintainers:
|
||||||
- name: Jellyseerr
|
- name: Jellyseerr
|
||||||
url: https://github.com/Fallenbagel/jellyseerr
|
url: https://github.com/Fallenbagel/jellyseerr
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Jellyseerr
|
# jellyseerr-chart
|
||||||
|
|
||||||
  
|
  
|
||||||
|
|
||||||
Jellyseerr helm chart for Kubernetes
|
Jellyseerr helm chart for Kubernetes
|
||||||
|
|
||||||
@@ -25,10 +25,6 @@ Kubernetes: `>=1.23.0-0`
|
|||||||
| Key | Type | Default | Description |
|
| Key | Type | Default | Description |
|
||||||
|-----|------|---------|-------------|
|
|-----|------|---------|-------------|
|
||||||
| affinity | object | `{}` | |
|
| affinity | object | `{}` | |
|
||||||
| autoscaling.enabled | bool | `false` | |
|
|
||||||
| autoscaling.maxReplicas | int | `100` | |
|
|
||||||
| autoscaling.minReplicas | int | `1` | |
|
|
||||||
| autoscaling.targetCPUUtilizationPercentage | int | `80` | |
|
|
||||||
| config | object | `{"persistence":{"accessModes":["ReadWriteOnce"],"annotations":{},"name":"","size":"5Gi","volumeName":""}}` | Creating PVC to store configuration |
|
| config | object | `{"persistence":{"accessModes":["ReadWriteOnce"],"annotations":{},"name":"","size":"5Gi","volumeName":""}}` | Creating PVC to store configuration |
|
||||||
| config.persistence.accessModes | list | `["ReadWriteOnce"]` | Access modes of persistent disk |
|
| config.persistence.accessModes | list | `["ReadWriteOnce"]` | Access modes of persistent disk |
|
||||||
| config.persistence.annotations | object | `{}` | Annotations for PVCs |
|
| config.persistence.annotations | object | `{}` | Annotations for PVCs |
|
||||||
@@ -39,7 +35,7 @@ Kubernetes: `>=1.23.0-0`
|
|||||||
| extraEnvFrom | list | `[]` | Environment variables from secrets or configmaps to add to the jellyseerr pods |
|
| extraEnvFrom | list | `[]` | Environment variables from secrets or configmaps to add to the jellyseerr pods |
|
||||||
| fullnameOverride | string | `""` | |
|
| fullnameOverride | string | `""` | |
|
||||||
| image.pullPolicy | string | `"IfNotPresent"` | |
|
| image.pullPolicy | string | `"IfNotPresent"` | |
|
||||||
| image.registry | string | `"docker.io"` | |
|
| image.registry | string | `"ghcr.io"` | |
|
||||||
| image.repository | string | `"fallenbagel/jellyseerr"` | |
|
| image.repository | string | `"fallenbagel/jellyseerr"` | |
|
||||||
| image.sha | string | `""` | |
|
| image.sha | string | `""` | |
|
||||||
| image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. |
|
| image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. |
|
||||||
@@ -67,3 +63,5 @@ Kubernetes: `>=1.23.0-0`
|
|||||||
| serviceAccount.name | string | `""` | If not set and create is true, a name is generated using the fullname template |
|
| serviceAccount.name | string | `""` | If not set and create is true, a name is generated using the fullname template |
|
||||||
| strategy | object | `{"type":"Recreate"}` | Deployment strategy |
|
| strategy | object | `{"type":"Recreate"}` | Deployment strategy |
|
||||||
| tolerations | list | `[]` | |
|
| tolerations | list | `[]` | |
|
||||||
|
| volumeMounts | list | `[]` | Additional volumeMounts on the output Deployment definition. |
|
||||||
|
| volumes | list | `[]` | Additional volumes on the output Deployment definition. |
|
||||||
1
charts/jellyseerr-chart/artifacthub-repo.yml
Normal file
1
charts/jellyseerr-chart/artifacthub-repo.yml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
repositoryID: c6b3f2dc-444c-4e37-b397-6a5ff563ee8b
|
||||||
@@ -5,9 +5,7 @@ metadata:
|
|||||||
labels:
|
labels:
|
||||||
{{- include "jellyseerr.labels" . | nindent 4 }}
|
{{- include "jellyseerr.labels" . | nindent 4 }}
|
||||||
spec:
|
spec:
|
||||||
{{- if not .Values.autoscaling.enabled }}
|
|
||||||
replicas: {{ .Values.replicaCount }}
|
replicas: {{ .Values.replicaCount }}
|
||||||
{{- end }}
|
|
||||||
strategy:
|
strategy:
|
||||||
type: {{ .Values.strategy.type }}
|
type: {{ .Values.strategy.type }}
|
||||||
selector:
|
selector:
|
||||||
@@ -67,10 +65,16 @@ spec:
|
|||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: config
|
- name: config
|
||||||
mountPath: /app/config
|
mountPath: /app/config
|
||||||
|
{{- with .Values.volumeMounts }}
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
volumes:
|
volumes:
|
||||||
- name: config
|
- name: config
|
||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: {{ include "jellyseerr.configPersistenceName" . }}
|
claimName: {{ include "jellyseerr.configPersistenceName" . }}
|
||||||
|
{{- with .Values.volumes }}
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
{{- with .Values.nodeSelector }}
|
{{- with .Values.nodeSelector }}
|
||||||
nodeSelector:
|
nodeSelector:
|
||||||
{{- toYaml . | nindent 8 }}
|
{{- toYaml . | nindent 8 }}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: docker.io
|
registry: ghcr.io
|
||||||
repository: fallenbagel/jellyseerr
|
repository: fallenbagel/jellyseerr
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
# -- Overrides the image tag whose default is the chart appVersion.
|
# -- Overrides the image tag whose default is the chart appVersion.
|
||||||
@@ -94,12 +94,18 @@ resources: {}
|
|||||||
# cpu: 100m
|
# cpu: 100m
|
||||||
# memory: 128Mi
|
# memory: 128Mi
|
||||||
|
|
||||||
autoscaling:
|
# -- Additional volumes on the output Deployment definition.
|
||||||
enabled: false
|
volumes: []
|
||||||
minReplicas: 1
|
# - name: foo
|
||||||
maxReplicas: 100
|
# secret:
|
||||||
targetCPUUtilizationPercentage: 80
|
# secretName: mysecret
|
||||||
# targetMemoryUtilizationPercentage: 80
|
# optional: false
|
||||||
|
|
||||||
|
# -- Additional volumeMounts on the output Deployment definition.
|
||||||
|
volumeMounts: []
|
||||||
|
# - name: foo
|
||||||
|
# mountPath: "/etc/foo"
|
||||||
|
# readOnly: true
|
||||||
|
|
||||||
nodeSelector: {}
|
nodeSelector: {}
|
||||||
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
{{- if .Values.autoscaling.enabled }}
|
|
||||||
apiVersion: autoscaling/v2
|
|
||||||
kind: HorizontalPodAutoscaler
|
|
||||||
metadata:
|
|
||||||
name: {{ include "jellyseerr.fullname" . }}
|
|
||||||
labels:
|
|
||||||
{{- include "jellyseerr.labels" . | nindent 4 }}
|
|
||||||
spec:
|
|
||||||
scaleTargetRef:
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
name: {{ include "jellyseerr.fullname" . }}
|
|
||||||
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
|
||||||
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
|
||||||
metrics:
|
|
||||||
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
|
||||||
- type: Resource
|
|
||||||
resource:
|
|
||||||
name: cpu
|
|
||||||
target:
|
|
||||||
type: Utilization
|
|
||||||
averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
|
||||||
{{- end }}
|
|
||||||
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
|
||||||
- type: Resource
|
|
||||||
resource:
|
|
||||||
name: memory
|
|
||||||
target:
|
|
||||||
type: Utilization
|
|
||||||
averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
@@ -23,6 +23,8 @@
|
|||||||
"mediaServerType": 1,
|
"mediaServerType": 1,
|
||||||
"partialRequestsEnabled": true,
|
"partialRequestsEnabled": true,
|
||||||
"enableSpecialEpisodes": false,
|
"enableSpecialEpisodes": false,
|
||||||
|
"forceIpv4First": false,
|
||||||
|
"dnsServers": "",
|
||||||
"locale": "en"
|
"locale": "en"
|
||||||
},
|
},
|
||||||
"plex": {
|
"plex": {
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ describe('General Settings', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('modifies setting that requires restart', () => {
|
it('modifies setting that requires restart', () => {
|
||||||
cy.visit('/settings');
|
cy.visit('/settings/network');
|
||||||
|
|
||||||
cy.get('#trustProxy').click();
|
cy.get('#trustProxy').click();
|
||||||
cy.get('[data-testid=settings-main-form]').submit();
|
cy.get('[data-testid=settings-network-form]').submit();
|
||||||
cy.get('[data-testid=modal-title]').should(
|
cy.get('[data-testid=modal-title]').should(
|
||||||
'contain',
|
'contain',
|
||||||
'Server Restart Required'
|
'Server Restart Required'
|
||||||
@@ -26,7 +26,7 @@ describe('General Settings', () => {
|
|||||||
cy.get('[data-testid=modal-title]').should('not.exist');
|
cy.get('[data-testid=modal-title]').should('not.exist');
|
||||||
|
|
||||||
cy.get('[type=checkbox]#trustProxy').click();
|
cy.get('[type=checkbox]#trustProxy').click();
|
||||||
cy.get('[data-testid=settings-main-form]').submit();
|
cy.get('[data-testid=settings-network-form]').submit();
|
||||||
cy.get('[data-testid=modal-title]').should('not.exist');
|
cy.get('[data-testid=modal-title]').should('not.exist');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,31 +7,34 @@ sidebar_position: 1
|
|||||||
|
|
||||||
Welcome to the Jellyseerr Documentation.
|
Welcome to the Jellyseerr Documentation.
|
||||||
|
|
||||||
|
**Jellyseerr** is a free and open source software application for managing requests for your media library. It integrates with the media server of your choice: [Jellyfin](https://jellyfin.org), [Plex](https://plex.tv), and [Emby](https://emby.media/). In addition, it integrates with your existing services, such as **[Sonarr](https://sonarr.tv/)**, **[Radarr](https://radarr.video/)**.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- **Full Jellyfin/Emby/Plex integration**. Login and manage user access with Jellyfin/Emby/Plex.
|
- **Full Jellyfin/Emby/Plex integration**. Login and manage user access with Jellyfin/Emby/Plex.
|
||||||
- **Syncs to your Jellyfin/Emby/Plex library** to show what titles you already have.
|
- **Syncs to your Jellyfin/Emby/Plex library** to show what titles you already have.
|
||||||
|
- Supports Movies, Shows and Mixed Libraries.
|
||||||
- **Integrates with Sonarr and Radarr**. With more services to come in the future.
|
- **Integrates with Sonarr and Radarr**. With more services to come in the future.
|
||||||
|
- Optionally set **Override rules** for requests to match with your defined conditions.
|
||||||
- **Easy to use request system** allowing users to request individual seasons or movies in a friendly, clean UI.
|
- **Easy to use request system** allowing users to request individual seasons or movies in a friendly, clean UI.
|
||||||
- **Simple request management UI**. Don't dig through the app to approve recent requests.
|
- **Simple request management UI**. Don't dig through the app to approve recent requests.
|
||||||
- **Mobile-friendly design**, for when you need to approve requests on the go.
|
- **Mobile-friendly design**, for when you need to approve requests on the go.
|
||||||
- Granular permission system.
|
- Granular permission system.
|
||||||
- Localization into other languages.
|
- Localization into other languages.
|
||||||
- Support for PostgreSQL and SQLite databases.
|
- Support for **PostgreSQL** and **SQLite** databases.
|
||||||
|
- Support for various notification agents.
|
||||||
|
- Easily **Watchlist** or **Blacklist** media.
|
||||||
- More features to come!
|
- More features to come!
|
||||||
|
|
||||||
## Motivation
|
## Motivation
|
||||||
|
|
||||||
The primary motivation for starting this project was to add support for Jellyfin and Emby to Overseerr. As Overseerr is an incredibly performant and easy-to-use application, we wanted to bring that same experience to Jellyfin and Emby users. Thus, **Jellyseerr** was born.
|
The primary motivation for starting Jellyseerr was to bring Jellyfin and Emby support to Overseerr. However, over time, **Jellyseerr** has evolved into its own distinct application with unique features. Designed as a one-stop shop for media requests, it offers a simple, easy-to-use experience for managing requests on Jellyfin, Emby, and Plex servers.
|
||||||
|
|
||||||
This application is designed to be a **one-stop-shop** for all your media requests. It is designed to be a **simple, easy-to-use** application that allows users to request media to be added to your Jellyfin/Emby/Plex server.
|
|
||||||
|
|
||||||
## We need your help!
|
## We need your help!
|
||||||
|
|
||||||
[Jellyseerr](https://github.com/Fallenbagel/jellyseerr) is a fork of Overseerr, with a heavy focus on Jellyfin and Emby integration.
|
[Jellyseerr](https://github.com/Fallenbagel/jellyseerr) is an ambitious project where developers/contributors poured a lot of work into, and that builds on top of [Overseerr](https://github.com/sct/overseerr). And we have a lot more to do as well.
|
||||||
[Overseerr](https://github.com/sct/overseerr) is an ambitious project where the original developers/contributors have already poured a lot of work into, and we wanted to build on top of that.
|
|
||||||
|
|
||||||
We also have poured a lot of work into this project, and we have a lot more to do as well. We need your valuable feedback and help to find and fix bugs. Also, with Jellyseerr being an open-source project, anyone is welcome to contribute. We also encourage you to contribute to Overseerr as well.
|
We value your feedback and support in identifying and fixing bugs to make Jellyseerr even better. As an open-source project, we welcome contributions from everyone. While Jellyseerr has diverged from Overseerr and evolved into its own unique application, we still encourage contributions to Overseerr, as it played a crucial role in inspiring what Jellyseerr has become today.
|
||||||
|
|
||||||
Contribution includes building new features, patching bugs, translating the application, or even just writing documentation.
|
Contribution includes building new features, patching bugs, translating the application, or even just writing documentation.
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ Jellyseerr supports SQLite and PostgreSQL. The database connection can be config
|
|||||||
|
|
||||||
## SQLite Options
|
## SQLite Options
|
||||||
|
|
||||||
|
If you want to use SQLite, you can simply set the `DB_TYPE` environment variable to `sqlite`. This is the default configuration so even if you don't set any other options, SQLite will be used.
|
||||||
|
|
||||||
```dotenv
|
```dotenv
|
||||||
DB_TYPE="sqlite" # Which DB engine to use, either "sqlite" or "postgres". The default is "sqlite".
|
DB_TYPE="sqlite" # Which DB engine to use, either "sqlite" or "postgres". The default is "sqlite".
|
||||||
CONFIG_DIRECTORY="config" # (optional) The path to the config directory where the db file is stored. The default is "config".
|
CONFIG_DIRECTORY="config" # (optional) The path to the config directory where the db file is stored. The default is "config".
|
||||||
@@ -17,17 +19,35 @@ DB_LOG_QUERIES="false" # (optional) Whether to log the DB queries for debugging.
|
|||||||
|
|
||||||
## PostgreSQL Options
|
## PostgreSQL Options
|
||||||
|
|
||||||
|
### TCP Connection
|
||||||
|
|
||||||
|
If your PostgreSQL server is configured to accept TCP connections, you can specify the host and port using the `DB_HOST` and `DB_PORT` environment variables. This is useful for remote connections where the server uses a network host and port.
|
||||||
|
|
||||||
```dotenv
|
```dotenv
|
||||||
DB_TYPE="postgres" # Which DB engine to use, either "sqlite" or "postgres". The default is "sqlite". To use postgres, this needs to be set to "postgres"
|
DB_TYPE="postgres" # Which DB engine to use, either "sqlite" or "postgres". The default is "sqlite".
|
||||||
DB_HOST="localhost" # (optional) The host (url) of the database. The default is "localhost".
|
DB_HOST="localhost" # (optional) The host (URL) of the database. The default is "localhost".
|
||||||
DB_PORT="5432" # (optional) The port to connect to. The default is "5432".
|
DB_PORT="5432" # (optional) The port to connect to. The default is "5432".
|
||||||
DB_USER= # (required) Username used to connect to the database
|
DB_USER= # (required) Username used to connect to the database.
|
||||||
DB_PASS= # (required) Password of the user used to connect to the database
|
DB_PASS= # (required) Password of the user used to connect to the database.
|
||||||
|
DB_NAME="jellyseerr" # (optional) The name of the database to connect to. The default is "jellyseerr".
|
||||||
|
DB_LOG_QUERIES="false" # (optional) Whether to log the DB queries for debugging. The default is "false".
|
||||||
|
```
|
||||||
|
|
||||||
|
### Unix Socket Connection
|
||||||
|
|
||||||
|
If your PostgreSQL server is configured to accept Unix socket connections, you can specify the path to the socket directory using the `DB_SOCKET_PATH` environment variable. This is useful for local connections where the server uses a Unix socket.
|
||||||
|
|
||||||
|
```dotenv
|
||||||
|
DB_TYPE="postgres" # Which DB engine to use, either "sqlite" or "postgres". The default is "sqlite".
|
||||||
|
DB_SOCKET_PATH="/var/run/postgresql" # (required) The path to the PostgreSQL Unix socket directory.
|
||||||
|
DB_USER= # (required) Username used to connect to the database.
|
||||||
|
DB_PASS= # (optional) Password of the user used to connect to the database, depending on the server's authentication configuration.
|
||||||
DB_NAME="jellyseerr" # (optional) The name of the database to connect to. The default is "jellyseerr".
|
DB_NAME="jellyseerr" # (optional) The name of the database to connect to. The default is "jellyseerr".
|
||||||
DB_LOG_QUERIES="false" # (optional) Whether to log the DB queries for debugging. The default is "false".
|
DB_LOG_QUERIES="false" # (optional) Whether to log the DB queries for debugging. The default is "false".
|
||||||
```
|
```
|
||||||
|
|
||||||
### SSL configuration
|
### SSL configuration
|
||||||
|
|
||||||
The following options can be used to further configure ssl. Certificates can be provided as a string or a file path, with the string version taking precedence.
|
The following options can be used to further configure ssl. Certificates can be provided as a string or a file path, with the string version taking precedence.
|
||||||
|
|
||||||
```dotenv
|
```dotenv
|
||||||
@@ -40,6 +60,7 @@ DB_SSL_KEY_FILE= # (optinal) Path to the private key for the connection in PEM f
|
|||||||
DB_SSL_CERT= # (optional) Certificate chain in pem format for the private key, provided as a string. The default is "".
|
DB_SSL_CERT= # (optional) Certificate chain in pem format for the private key, provided as a string. The default is "".
|
||||||
DB_SSL_CERT_FILE= # (optional) Path to certificate chain in pem format for the private key. The default is "".
|
DB_SSL_CERT_FILE= # (optional) Path to certificate chain in pem format for the private key. The default is "".
|
||||||
```
|
```
|
||||||
|
---
|
||||||
|
|
||||||
### Migrating from SQLite to PostgreSQL
|
### Migrating from SQLite to PostgreSQL
|
||||||
|
|
||||||
@@ -48,7 +69,7 @@ DB_SSL_CERT_FILE= # (optional) Path to certificate chain in pem format for the p
|
|||||||
3. Stop Jellyseerr
|
3. Stop Jellyseerr
|
||||||
4. Run the following command to export the data from the SQLite database and import it into the PostgreSQL database:
|
4. Run the following command to export the data from the SQLite database and import it into the PostgreSQL database:
|
||||||
:::info
|
:::info
|
||||||
Edit the postgres connection string to match your setup
|
Edit the postgres connection string to match your setup.
|
||||||
|
|
||||||
If you don't have or don't want to use docker, you can build the working pgloader version [in this PR](https://github.com/dimitri/pgloader/pull/1531) from source and use the same options as below.
|
If you don't have or don't want to use docker, you can build the working pgloader version [in this PR](https://github.com/dimitri/pgloader/pull/1531) from source and use the same options as below.
|
||||||
:::
|
:::
|
||||||
@@ -56,6 +77,6 @@ If you don't have or don't want to use docker, you can build the working pgloade
|
|||||||
The most recent release of pgloader has an issue quoting the table columns. Use the version in the docker container to avoid this issue.
|
The most recent release of pgloader has an issue quoting the table columns. Use the version in the docker container to avoid this issue.
|
||||||
:::
|
:::
|
||||||
```bash
|
```bash
|
||||||
docker run --rm -v config/db.sqlite3:/db.sqlite3:ro -v pgloader/pgloader.load:/pgloader.load ghcr.io/ralgar/pgloader:pr-1531 pgloader --with "quote identifiers" --with "data only" /db.sqlite3 postgresql://{{DB_USER}}:{{DB_PASS}}@{{DB_HOST}}:{{DB_PORT}}/{{DB_NAME}}
|
docker run --rm -v config/db.sqlite3:/db.sqlite3:ro ghcr.io/ralgar/pgloader:pr-1531 pgloader --with "quote identifiers" --with "data only" /db.sqlite3 postgresql://{{DB_USER}}:{{DB_PASS}}@{{DB_HOST}}:{{DB_PORT}}/{{DB_NAME}}
|
||||||
```
|
```
|
||||||
5. Start Jellyseerr
|
5. Start Jellyseerr
|
||||||
|
|||||||
@@ -6,13 +6,15 @@ sidebar_position: 2
|
|||||||
# Build from Source (Advanced)
|
# Build from Source (Advanced)
|
||||||
:::warning
|
:::warning
|
||||||
This method is not recommended for most users. It is intended for advanced users who are familiar with managing their own server infrastructure.
|
This method is not recommended for most users. It is intended for advanced users who are familiar with managing their own server infrastructure.
|
||||||
|
|
||||||
|
Refer to [Configuring Databases](/extending-jellyseerr/database-config#postgresql-options) for details on how to configure your database.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
import Tabs from '@theme/Tabs';
|
import Tabs from '@theme/Tabs';
|
||||||
import TabItem from '@theme/TabItem';
|
import TabItem from '@theme/TabItem';
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
- [Node.js 20.x](https://nodejs.org/en/download/)
|
- [Node.js 22.x](https://nodejs.org/en/download/)
|
||||||
- [Pnpm 9.x](https://pnpm.io/installation)
|
- [Pnpm 9.x](https://pnpm.io/installation)
|
||||||
- [Git](https://git-scm.com/downloads)
|
- [Git](https://git-scm.com/downloads)
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ sidebar_position: 1
|
|||||||
:::info
|
:::info
|
||||||
This is the recommended method for most users.
|
This is the recommended method for most users.
|
||||||
Details on how to install Docker can be found on the [official Docker website](https://docs.docker.com/get-docker/).
|
Details on how to install Docker can be found on the [official Docker website](https://docs.docker.com/get-docker/).
|
||||||
|
|
||||||
|
Refer to [Configuring Databases](/extending-jellyseerr/database-config#postgresql-options) for details on how to configure your database.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Unix (Linux, macOS)
|
## Unix (Linux, macOS)
|
||||||
@@ -145,6 +147,16 @@ Then, create and start the Jellyseerr container:
|
|||||||
<TabItem value="docker-cli" label="Docker CLI">
|
<TabItem value="docker-cli" label="Docker CLI">
|
||||||
```bash
|
```bash
|
||||||
docker run -d --name jellyseerr -e LOG_LEVEL=debug -e TZ=Asia/Tashkent -p 5055:5055 -v "jellyseerr-data:/app/config" --restart unless-stopped fallenbagel/jellyseerr:latest
|
docker run -d --name jellyseerr -e LOG_LEVEL=debug -e TZ=Asia/Tashkent -p 5055:5055 -v "jellyseerr-data:/app/config" --restart unless-stopped fallenbagel/jellyseerr:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Updating:
|
||||||
|
Pull the latest image:
|
||||||
|
```bash
|
||||||
|
docker compose pull jellyseerr
|
||||||
|
```
|
||||||
|
Then, restart all services defined in the Compose file:
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
```
|
```
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
@@ -167,6 +179,16 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
jellyseerr-data:
|
jellyseerr-data:
|
||||||
external: true
|
external: true
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Updating:
|
||||||
|
Pull the latest image:
|
||||||
|
```bash
|
||||||
|
docker compose pull jellyseerr
|
||||||
|
```
|
||||||
|
Then, restart all services defined in the Compose file:
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
```
|
```
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
@@ -185,3 +207,6 @@ Docker on Windows works differently than it does on Linux; it runs Docker inside
|
|||||||
**If you must run Docker on Windows, you should put the `/app/config` directory mount inside the VM and not on the Windows host.** (This also applies to other containers with SQLite databases.)
|
**If you must run Docker on Windows, you should put the `/app/config` directory mount inside the VM and not on the Windows host.** (This also applies to other containers with SQLite databases.)
|
||||||
|
|
||||||
Named volumes, like in the example commands above, are automatically mounted inside the VM. Therefore the warning on the setup about the `/app/config` folder being incorrectly mounted page should be ignored.
|
Named volumes, like in the example commands above, are automatically mounted inside the VM. Therefore the warning on the setup about the `/app/config` folder being incorrectly mounted page should be ignored.
|
||||||
|
:::
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
21
docs/getting-started/kubernetes.mdx
Normal file
21
docs/getting-started/kubernetes.mdx
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
title: Kubernetes
|
||||||
|
description: Install Jellyseerr in Kubernetes
|
||||||
|
sidebar_position: 5
|
||||||
|
---
|
||||||
|
# Kubernetes
|
||||||
|
:::info
|
||||||
|
This method is not recommended for most users. It is intended for advanced users who are using Kubernetes.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
```console
|
||||||
|
helm install jellyseerr oci://ghcr.io/fallenbagel/jellyseerr/jellyseerr-chart
|
||||||
|
```
|
||||||
|
Helm values can be found in the Jellyseerr repository under [charts/jellyseerr-chart/README.md](https://github.com/Fallenbagel/jellyseerr/tree/develop/charts/jellyseerr-chart).
|
||||||
|
|
||||||
|
Verify the signature with [cosign](https://docs.sigstore.dev/cosign/system_config/installation/) (replace [tag], with the TAG you want to verify) :
|
||||||
|
```console
|
||||||
|
cosign verify ghcr.io/fallenbagel/jellyseerr/jellyseerr-chart:[tag] --certificate-identity=https://github.com/Fallenbagel/jellyseerr/.github/workflows/helm.yml@refs/heads/main --certificate-oidc-issuer=https://token.ac
|
||||||
|
tions.githubusercontent.com
|
||||||
|
```
|
||||||
@@ -6,6 +6,8 @@ sidebar_position: 3
|
|||||||
|
|
||||||
import { JellyseerrVersion, NixpkgVersion } from '@site/src/components/JellyseerrVersion';
|
import { JellyseerrVersion, NixpkgVersion } from '@site/src/components/JellyseerrVersion';
|
||||||
import Admonition from '@theme/Admonition';
|
import Admonition from '@theme/Admonition';
|
||||||
|
import Tabs from '@theme/Tabs';
|
||||||
|
import TabItem from '@theme/TabItem';
|
||||||
|
|
||||||
# Nix Package Manager (Advanced)
|
# Nix Package Manager (Advanced)
|
||||||
:::info
|
:::info
|
||||||
@@ -13,22 +15,55 @@ This method is not recommended for most users. It is intended for advanced users
|
|||||||
:::
|
:::
|
||||||
|
|
||||||
export const VersionMismatchWarning = () => {
|
export const VersionMismatchWarning = () => {
|
||||||
const jellyseerrVersion = JellyseerrVersion();
|
let jellyseerrVersion = null;
|
||||||
const nixpkgVersion = NixpkgVersion();
|
let nixpkgVersions = null;
|
||||||
|
try {
|
||||||
|
jellyseerrVersion = JellyseerrVersion();
|
||||||
|
nixpkgVersions = NixpkgVersion();
|
||||||
|
} catch (err) {
|
||||||
|
return (
|
||||||
|
<Admonition type="error">
|
||||||
|
Failed to load version information. Error: {err.message || JSON.stringify(err)}
|
||||||
|
</Admonition>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const isUpToDate = jellyseerrVersion === nixpkgVersion;
|
if (!nixpkgVersions || nixpkgVersions.error) {
|
||||||
|
return (
|
||||||
|
<Admonition type="error">
|
||||||
|
Failed to fetch Nixpkg versions: {nixpkgVersions?.error || 'Unknown error'}
|
||||||
|
</Admonition>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const isUnstableUpToDate = jellyseerrVersion === nixpkgVersions.unstable;
|
||||||
|
const isStableUpToDate = jellyseerrVersion === nixpkgVersions.stable;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{!isUpToDate ? (
|
{!isStableUpToDate ? (
|
||||||
<Admonition type="warning">
|
<Admonition type="warning">
|
||||||
The <a href="https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/servers/jellyseerr/default.nix#L14">upstream Jellyseerr Nix Package (v{nixpkgVersion})</a> is not <b>up-to-date</b>. If you want to use <b>Jellyseerr v{jellyseerrVersion}</b>, you will need to <a href="#overriding-the-package-derivation">override the package derivation</a>.
|
The{' '}
|
||||||
</Admonition>
|
<a href="https://github.com/NixOS/nixpkgs/blob/nixos-24.11/pkgs/servers/jellyseerr/default.nix#L14">
|
||||||
) : (
|
upstream Jellyseerr Nix Package (v{nixpkgVersions.stable})
|
||||||
<Admonition type="success">
|
</a>{' '}
|
||||||
The <a href="https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/servers/jellyseerr/default.nix#L14">upstream Jellyseerr Nix Package (v{nixpkgVersion})</a> is <b>up-to-date</b> with <b>Jellyseerr v{jellyseerrVersion}</b>.
|
is not <b>up-to-date</b>. If you want to use <b>Jellyseerr v{jellyseerrVersion}</b>,{' '}
|
||||||
</Admonition>
|
{isUnstableUpToDate ? (
|
||||||
)}
|
<>
|
||||||
|
consider using the{' '}
|
||||||
|
<a href="https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/je/jellyseerr/package.nix">
|
||||||
|
unstable package
|
||||||
|
</a>{' '}
|
||||||
|
instead.
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
you will need to{' '}
|
||||||
|
<a href="#overriding-the-package-derivation">override the package derivation</a>.
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Admonition>
|
||||||
|
) : null}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -48,6 +83,8 @@ To get up and running with jellyseerr using Nix, you can add the following to yo
|
|||||||
|
|
||||||
If you want more advanced configuration options, you can use the following:
|
If you want more advanced configuration options, you can use the following:
|
||||||
|
|
||||||
|
<Tabs groupId="nixpkg-methods" queryString>
|
||||||
|
<TabItem value="default" label="Default Configurations">
|
||||||
```nix
|
```nix
|
||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
@@ -56,53 +93,20 @@ If you want more advanced configuration options, you can use the following:
|
|||||||
enable = true;
|
enable = true;
|
||||||
port = 5055;
|
port = 5055;
|
||||||
openFirewall = true;
|
openFirewall = true;
|
||||||
|
package = pkgs.jellyseerr; # Use the unstable package if stable is not up-to-date
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
</TabItem>
|
||||||
After adding the configuration to your `configuration.nix`, you can run the following command to install jellyseerr:
|
<TabItem value="custom" label="Database Configurations">
|
||||||
|
In order to use postgres, you will need to add override the default module of jellyseerr with the following as the current default module is not compatible with postgres:
|
||||||
```bash
|
```nix
|
||||||
nixos-rebuild switch
|
|
||||||
```
|
|
||||||
After rebuild is complete jellyseerr should be running, verify that it is with the following command.
|
|
||||||
```bash
|
|
||||||
systemctl status jellyseerr
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info
|
|
||||||
You can now access Jellyseerr by visiting `http://localhost:5055` in your web browser.
|
|
||||||
:::
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import CodeBlock from '@theme/CodeBlock';
|
|
||||||
|
|
||||||
## Overriding the package derivation
|
|
||||||
export const VersionMatch = () => {
|
|
||||||
const jellyseerrVersion = JellyseerrVersion();
|
|
||||||
const nixpkgVersion = NixpkgVersion();
|
|
||||||
|
|
||||||
const code = `{ config, pkgs, ... }:
|
|
||||||
{
|
{
|
||||||
nixpkgs.config.packageOverrides = pkgs: {
|
config,
|
||||||
jellyseerr = pkgs.jellyseerr.overrideAttrs (oldAttrs: rec {
|
pkgs,
|
||||||
version = "${jellyseerrVersion}";
|
lib,
|
||||||
|
...
|
||||||
src = pkgs.fetchFromGitHub {
|
}:
|
||||||
rev = "v\${version}";
|
|
||||||
sha256 = pkgs.lib.fakeSha256;
|
|
||||||
};
|
|
||||||
|
|
||||||
offlineCache = pkgs.fetchYarnDeps {
|
|
||||||
sha256 = pkgs.lib.fakeSha256;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}`;
|
|
||||||
|
|
||||||
const module = `{ config, pkgs, lib, ... }:
|
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.services.jellyseerr;
|
cfg = config.services.jellyseerr;
|
||||||
@@ -113,28 +117,65 @@ in
|
|||||||
disabledModules = [ "services/misc/jellyseerr.nix" ];
|
disabledModules = [ "services/misc/jellyseerr.nix" ];
|
||||||
|
|
||||||
options.services.jellyseerr = {
|
options.services.jellyseerr = {
|
||||||
enable = mkEnableOption (mdDoc ''Jellyseerr, a requests manager for Jellyfin'');
|
enable = mkEnableOption ''Jellyseerr, a requests manager for Jellyfin'';
|
||||||
|
|
||||||
openFirewall = mkOption {
|
openFirewall = mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
default = false;
|
default = false;
|
||||||
description = mdDoc ''Open port in the firewall for the Jellyseerr web interface.'';
|
description = ''Open port in the firewall for the Jellyseerr web interface.'';
|
||||||
};
|
};
|
||||||
|
|
||||||
port = mkOption {
|
port = mkOption {
|
||||||
type = types.port;
|
type = types.port;
|
||||||
default = 5055;
|
default = 5055;
|
||||||
description = mdDoc ''The port which the Jellyseerr web UI should listen to.'';
|
description = ''The port which the Jellyseerr web UI should listen to.'';
|
||||||
};
|
};
|
||||||
|
|
||||||
package = mkOption {
|
package = mkOption {
|
||||||
type = types.package;
|
type = types.package;
|
||||||
default = pkgs.jellyseerr;
|
default = pkgs.jellyseerr;
|
||||||
defaultText = literalExpression "pkgs.jellyseerr";
|
defaultText = literalExpression "pkgs.jellyseerr";
|
||||||
description = lib.mdDoc ''
|
description = ''
|
||||||
Jellyseerr package to use.
|
Jellyseerr package to use.
|
||||||
'';
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
databaseConfig = mkOption {
|
||||||
|
type = types.attrsOf types.str;
|
||||||
|
default = {
|
||||||
|
type = "sqlite";
|
||||||
|
configDirectory = "config";
|
||||||
|
logQueries = "false";
|
||||||
};
|
};
|
||||||
|
description = ''
|
||||||
|
Database configuration. For "sqlite", only "type", "configDirectory", and "logQueries" are relevant.
|
||||||
|
For "postgres", include host, port, user, pass, name, and optionally socket.
|
||||||
|
Example:
|
||||||
|
{
|
||||||
|
type = "postgres";
|
||||||
|
socket = "/run/postgresql";
|
||||||
|
user = "jellyseerr";
|
||||||
|
name = "jellyseerr";
|
||||||
|
logQueries = "false";
|
||||||
|
}
|
||||||
|
or
|
||||||
|
{
|
||||||
|
type = "postgres";
|
||||||
|
host = "localhost";
|
||||||
|
port = "5432";
|
||||||
|
user = "dbuser";
|
||||||
|
pass = "password";
|
||||||
|
name = "jellyseerr";
|
||||||
|
logQueries = "false";
|
||||||
|
}
|
||||||
|
or
|
||||||
|
{
|
||||||
|
type = "sqlite";
|
||||||
|
configDirectory = "config";
|
||||||
|
logQueries = "false";
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
@@ -142,14 +183,29 @@ in
|
|||||||
description = "Jellyseerr, a requests manager for Jellyfin";
|
description = "Jellyseerr, a requests manager for Jellyfin";
|
||||||
after = [ "network.target" ];
|
after = [ "network.target" ];
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
environment.PORT = toString cfg.port;
|
environment =
|
||||||
|
let
|
||||||
|
dbConfig = cfg.databaseConfig;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
PORT = toString cfg.port;
|
||||||
|
DB_TYPE = toString dbConfig.type;
|
||||||
|
CONFIG_DIRECTORY = toString dbConfig.configDirectory or "";
|
||||||
|
DB_LOG_QUERIES = toString dbConfig.logQueries;
|
||||||
|
DB_HOST = if dbConfig.type == "postgres" && !(hasAttr "socket" dbConfig) then toString dbConfig.host or "" else "";
|
||||||
|
DB_PORT = if dbConfig.type == "postgres" && !(hasAttr "socket" dbConfig) then toString dbConfig.port or "" else "";
|
||||||
|
DB_SOCKET_PATH = if dbConfig.type == "postgres" && hasAttr "socket" dbConfig then toString dbConfig.socket or "" else "";
|
||||||
|
DB_USER = if dbConfig.type == "postgres" then toString dbConfig.user or "" else "";
|
||||||
|
DB_PASS = if dbConfig.type == "postgres" then toString dbConfig.pass or "" else "";
|
||||||
|
DB_NAME = if dbConfig.type == "postgres" then toString dbConfig.name or "" else "";
|
||||||
|
};
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "exec";
|
Type = "exec";
|
||||||
StateDirectory = "jellyseerr";
|
StateDirectory = "jellyseerr";
|
||||||
WorkingDirectory = "\${cfg.package}/libexec/jellyseerr/deps/jellyseerr";
|
WorkingDirectory = "${cfg.package}/libexec/jellyseerr";
|
||||||
DynamicUser = true;
|
DynamicUser = true;
|
||||||
ExecStart = "\${cfg.package}/bin/jellyseerr";
|
ExecStart = "${cfg.package}/bin/jellyseerr";
|
||||||
BindPaths = [ "/var/lib/jellyseerr/:\${cfg.package}/libexec/jellyseerr/deps/jellyseerr/config/" ];
|
BindPaths = [ "/var/lib/jellyseerr/:${cfg.package}/libexec/jellyseerr/config/" ];
|
||||||
Restart = "on-failure";
|
Restart = "on-failure";
|
||||||
ProtectHome = true;
|
ProtectHome = true;
|
||||||
ProtectSystem = "strict";
|
ProtectSystem = "strict";
|
||||||
@@ -169,57 +225,47 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
networking.firewall = mkIf cfg.openFirewall {
|
networking.firewall = mkIf cfg.openFirewall { allowedTCPPorts = [ cfg.port ]; };
|
||||||
allowedTCPPorts = [ cfg.port ];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}`;
|
}
|
||||||
|
```
|
||||||
const configuration = `{ config, pkgs, ... }:
|
Then, import the module into your `configuration.nix`:
|
||||||
|
```nix
|
||||||
|
{ config, pkgs, ... }:
|
||||||
{
|
{
|
||||||
imports = [ ./jellyseerr-module.nix ]
|
imports = [ ./modules/jellyseerr.nix ];
|
||||||
|
|
||||||
services.jellyseerr = {
|
services.jellyseerr = {
|
||||||
enable = true;
|
enable = true;
|
||||||
port = 5055;
|
port = 5055;
|
||||||
openFirewall = true;
|
openFirewall = true;
|
||||||
package = (pkgs.callPackage (import ../../../pkgs/jellyseerr) { });
|
package = pkgs.unstable.jellyseerr; # use the unstable package if stable is not up-to-date
|
||||||
|
databaseConfig = {
|
||||||
|
type = "postgres";
|
||||||
|
host = "localhost"; # or socket: "/run/postgresql"
|
||||||
|
port = "5432"; # if using socket, this is not needed
|
||||||
|
user = "jellyseerr";
|
||||||
|
pass = "jellyseerr";
|
||||||
|
name = "jellyseerr";
|
||||||
|
logQueries = "false";
|
||||||
};
|
};
|
||||||
}`;
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
</TabItem>
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
const isUpToDate = jellyseerrVersion === nixpkgVersion;
|
After adding the configuration to your `configuration.nix`, you can run the following command to install jellyseerr:
|
||||||
|
|
||||||
return (
|
```bash
|
||||||
<>
|
nixos-rebuild switch
|
||||||
{isUpToDate ? (
|
```
|
||||||
<>
|
After rebuild is complete jellyseerr should be running, verify that it is with the following command.
|
||||||
<p>The latest version of Jellyseerr <strong>({jellyseerrVersion})</strong> and the Jellyseerr nixpkg package version <strong>({nixpkgVersion})</strong> is <strong>up-to-date</strong>.</p>
|
```bash
|
||||||
<p>There is no need to override the package derivation.</p>
|
systemctl status jellyseerr
|
||||||
</>
|
```
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<p>The latest version of Jellyseerr <strong>({jellyseerrVersion})</strong> and the Jellyseerr nixpkg version <strong>(v{nixpkgVersion})</strong> is <strong>out-of-date</strong>.
|
|
||||||
If you want to use <b>Jellyseerr v{jellyseerrVersion}</b>, you will need to override the package derivation.</p>
|
|
||||||
<p>In order to override the package derivation:</p>
|
|
||||||
<ol>
|
|
||||||
<li style={{ marginBottom: '1rem' }}>Grab the <a href="https://raw.githubusercontent.com/NixOS/nixpkgs/nixos-unstable/pkgs/servers/jellyseerr/default.nix">latest nixpkg derivation for Jellyseerr</a></li>
|
|
||||||
<li style={{ marginBottom: '1rem' }}>Grab the latest <a href="https://raw.githubusercontent.com/Fallenbagel/jellyseerr/main/package.json">package.json</a> for Jellyseerr</li>
|
|
||||||
<li style={{ marginBottom: '1rem' }}>Add it to the same directory as the nixpkg derivation</li>
|
|
||||||
<li style={{ marginBottom: '1rem' }}>Update the `src` and `offlineCache` attributes in the nixpkg derivation:</li>
|
|
||||||
<CodeBlock className="language-nix" style={{ marginBottom: '1rem' }}>{code}</CodeBlock>
|
|
||||||
<Admonition type="tip" style={{ marginBottom: '1rem' }}>You can replace the <b>sha256</b> with the actual hash that <b>nixos-rebuild</b> outputs when you run the command.</Admonition>
|
|
||||||
<li style={{ marginBottom: '1rem' }}>Grab this module and import it in your `configuration.nix`</li>
|
|
||||||
<CodeBlock className="language-nix" style={{ marginBottom: '1rem' }}>{module}</CodeBlock>
|
|
||||||
<Admonition type="tip" style={{ marginBottom: '1rem' }}>We are using a custom module because the upstream module does not have a package option.</Admonition>
|
|
||||||
<li style={{ marginBottom: '1rem' }}>Call the new package in your `configuration.nix`</li>
|
|
||||||
<CodeBlock className="language-nix" style={{ marginBottom: '1rem' }}>{configuration}</CodeBlock>
|
|
||||||
</ol>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
|
|
||||||
};
|
:::info
|
||||||
|
You can now access Jellyseerr by visiting `http://localhost:5055` in your web browser.
|
||||||
<VersionMatch />
|
:::
|
||||||
|
|
||||||
|
|||||||
93
docs/using-jellyseerr/backups.md
Normal file
93
docs/using-jellyseerr/backups.md
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
---
|
||||||
|
title: Backups
|
||||||
|
description: Understand which data you should back up.
|
||||||
|
sidebar_position: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
# Which data does Jellyseerr save and where?
|
||||||
|
|
||||||
|
## Settings
|
||||||
|
|
||||||
|
All configurations from the **Settings** panel in the Jellyseerr web UI are saved, including integrations with Radarr, Sonarr, Jellyfin, Plex, and notification settings.
|
||||||
|
These settings are stored in the `settings.json` file located in the Jellyseerr data folder.
|
||||||
|
|
||||||
|
## User Data
|
||||||
|
|
||||||
|
Apart from the settings, all other data—including user accounts, media requests, blacklist etc. are stored in the database (either SQLite or PostgreSQL).
|
||||||
|
|
||||||
|
# Backup
|
||||||
|
|
||||||
|
### SQLite
|
||||||
|
|
||||||
|
If your backup system uses filesystem snapshots (such as Kubernetes with Volsync), you can directly back up the Jellyseerr data folder.
|
||||||
|
Otherwise, you need to stop the Jellyseerr application and back up the `config` folder.
|
||||||
|
|
||||||
|
For advanced users, it's possible to back up the database without stopping the application by using the [SQLite CLI](https://www.sqlite.org/download.html). Run the following command to create a backup:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sqlite3 db/db.sqlite3 ".backup '/tmp/jellyseerr_db.sqlite3.bak'"
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, copy the `/tmp/jellyseerr_dump.sqlite3.bak` file to your desired backup location.
|
||||||
|
|
||||||
|
### PostgreSQL
|
||||||
|
|
||||||
|
You can back up the `config` folder and dump the PostgreSQL database without stopping the Jellyseerr application.
|
||||||
|
|
||||||
|
Install [postgresql-client](https://www.postgresql.org/download/) and run the following command to create a backup (just replace the placeholders):
|
||||||
|
|
||||||
|
:::info
|
||||||
|
Depending on how your PostgreSQL instance is configured, you may need to add these options to the command below.
|
||||||
|
|
||||||
|
-h, --host=HOSTNAME database server host or socket directory
|
||||||
|
|
||||||
|
-p, --port=PORT database server port number
|
||||||
|
:::
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pg_dump -U <database_user> -d <database_name> -f /tmp/jellyseerr_db.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
# Restore
|
||||||
|
|
||||||
|
### SQLite
|
||||||
|
|
||||||
|
After restoring your `db/db.sqlite3` file and, optionally, the `settings.json` file, the `config` folder structure should look like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── cache <-- Optional
|
||||||
|
├── db
|
||||||
|
│ └── db.sqlite3
|
||||||
|
├── logs <-- Optional
|
||||||
|
└── settings.json <-- Optional (required if you want to avoid reconfiguring Jellyseerr)
|
||||||
|
```
|
||||||
|
|
||||||
|
Once the files are restored, start the Jellyseerr application.
|
||||||
|
|
||||||
|
### PostgreSQL
|
||||||
|
|
||||||
|
Install the [PostgreSQL client](https://www.postgresql.org/download/) and restore the PostgreSQL database using the following command (replace the placeholders accordingly):
|
||||||
|
|
||||||
|
:::info
|
||||||
|
Depending on how your PostgreSQL instance is configured, you may need to add these options to the command below.
|
||||||
|
|
||||||
|
-h, --host=HOSTNAME database server host or socket directory
|
||||||
|
|
||||||
|
-p, --port=PORT database server port number
|
||||||
|
:::
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pg_restore -U <database_user> -d <database_name> /tmp/jellyseerr_db.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
Optionally, restore the `settings.json` file. The `config` folder structure should look like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── cache <-- Optional
|
||||||
|
├── logs <-- Optional
|
||||||
|
└── settings.json <-- Optional (required if you want to avoid reconfiguring Jellyseerr)
|
||||||
|
```
|
||||||
|
|
||||||
|
Once the database and files are restored, start the Jellyseerr application.
|
||||||
@@ -11,7 +11,7 @@ const config: Config = {
|
|||||||
baseUrl: '/',
|
baseUrl: '/',
|
||||||
trailingSlash: false,
|
trailingSlash: false,
|
||||||
|
|
||||||
organizationName: 'Fallenbagel',
|
organizationName: 'fallenbagel',
|
||||||
projectName: 'Jellyseerr',
|
projectName: 'Jellyseerr',
|
||||||
deploymentBranch: 'gh-pages',
|
deploymentBranch: 'gh-pages',
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ const config: Config = {
|
|||||||
routeBasePath: '/',
|
routeBasePath: '/',
|
||||||
path: '../docs',
|
path: '../docs',
|
||||||
editUrl:
|
editUrl:
|
||||||
'https://github.com/Fallenbagel/jellyseerr/edit/develop/docs/',
|
'https://github.com/fallenbagel/jellyseerr/edit/develop/docs/',
|
||||||
},
|
},
|
||||||
blog: false,
|
blog: false,
|
||||||
pages: false,
|
pages: false,
|
||||||
@@ -70,7 +70,7 @@ const config: Config = {
|
|||||||
},
|
},
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
href: 'https://github.com/Fallenbagel/jellyseerr',
|
href: 'https://github.com/fallenbagel/jellyseerr',
|
||||||
label: 'GitHub',
|
label: 'GitHub',
|
||||||
position: 'right',
|
position: 'right',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -47,6 +47,6 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0"
|
"node": ">=22.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,25 +26,37 @@ export const JellyseerrVersion = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const NixpkgVersion = () => {
|
export const NixpkgVersion = () => {
|
||||||
const [version, setVersion] = useState(null);
|
const [versions, setVersions] = useState(null);
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
const [error, setError] = useState(null);
|
const [error, setError] = useState(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchVersion = async () => {
|
const fetchVersion = async () => {
|
||||||
try {
|
try {
|
||||||
const url =
|
const unstableUrl =
|
||||||
'https://raw.githubusercontent.com/NixOS/nixpkgs/nixos-unstable/pkgs/servers/jellyseerr/default.nix';
|
'https://raw.githubusercontent.com/NixOS/nixpkgs/refs/heads/nixos-unstable/pkgs/by-name/je/jellyseerr/package.nix';
|
||||||
const response = await fetch(url);
|
const stableUrl =
|
||||||
const data = await response.text();
|
'https://raw.githubusercontent.com/NixOS/nixpkgs/refs/heads/nixos-24.11/pkgs/servers/jellyseerr/default.nix';
|
||||||
|
|
||||||
|
const [unstableResponse, stableResponse] = await Promise.all([
|
||||||
|
fetch(unstableUrl),
|
||||||
|
fetch(stableUrl),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const unstableData = await unstableResponse.text();
|
||||||
|
const stableData = await stableResponse.text();
|
||||||
|
|
||||||
const versionRegex = /version\s*=\s*"([^"]+)"/;
|
const versionRegex = /version\s*=\s*"([^"]+)"/;
|
||||||
const match = data.match(versionRegex);
|
|
||||||
if (match && match[1]) {
|
const unstableMatch = unstableData.match(versionRegex);
|
||||||
setVersion(match[1]);
|
const stableMatch = stableData.match(versionRegex);
|
||||||
} else {
|
|
||||||
setError('0.0.0');
|
const unstableVersion =
|
||||||
}
|
unstableMatch && unstableMatch[1] ? unstableMatch[1] : '0.0.0';
|
||||||
|
const stableVersion =
|
||||||
|
stableMatch && stableMatch[1] ? stableMatch[1] : '0.0.0';
|
||||||
|
|
||||||
|
setVersions({ unstable: unstableVersion, stable: stableVersion });
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err.message);
|
setError(err.message);
|
||||||
@@ -63,5 +75,5 @@ export const NixpkgVersion = () => {
|
|||||||
return { error };
|
return { error };
|
||||||
}
|
}
|
||||||
|
|
||||||
return version;
|
return versions;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ module.exports = {
|
|||||||
{ hostname: 'gravatar.com' },
|
{ hostname: 'gravatar.com' },
|
||||||
{ hostname: 'image.tmdb.org' },
|
{ hostname: 'image.tmdb.org' },
|
||||||
{ hostname: 'artworks.thetvdb.com' },
|
{ hostname: 'artworks.thetvdb.com' },
|
||||||
|
{ hostname: 'plex.tv' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
webpack(config) {
|
webpack(config) {
|
||||||
|
|||||||
@@ -164,12 +164,6 @@ components:
|
|||||||
applicationUrl:
|
applicationUrl:
|
||||||
type: string
|
type: string
|
||||||
example: https://os.example.com
|
example: https://os.example.com
|
||||||
trustProxy:
|
|
||||||
type: boolean
|
|
||||||
example: true
|
|
||||||
csrfProtection:
|
|
||||||
type: boolean
|
|
||||||
example: false
|
|
||||||
hideAvailable:
|
hideAvailable:
|
||||||
type: boolean
|
type: boolean
|
||||||
example: false
|
example: false
|
||||||
@@ -191,6 +185,21 @@ components:
|
|||||||
enableSpecialEpisodes:
|
enableSpecialEpisodes:
|
||||||
type: boolean
|
type: boolean
|
||||||
example: false
|
example: false
|
||||||
|
NetworkSettings:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
csrfProtection:
|
||||||
|
type: boolean
|
||||||
|
example: false
|
||||||
|
forceIpv4First:
|
||||||
|
type: boolean
|
||||||
|
example: false
|
||||||
|
dnsServers:
|
||||||
|
type: string
|
||||||
|
example: '1.1.1.1'
|
||||||
|
trustProxy:
|
||||||
|
type: boolean
|
||||||
|
example: true
|
||||||
PlexLibrary:
|
PlexLibrary:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -2039,6 +2048,37 @@ paths:
|
|||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/MainSettings'
|
$ref: '#/components/schemas/MainSettings'
|
||||||
|
/settings/network:
|
||||||
|
get:
|
||||||
|
summary: Get network settings
|
||||||
|
description: Retrieves all network settings in a JSON object.
|
||||||
|
tags:
|
||||||
|
- settings
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: OK
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/MainSettings'
|
||||||
|
post:
|
||||||
|
summary: Update network settings
|
||||||
|
description: Updates network settings with the provided values.
|
||||||
|
tags:
|
||||||
|
- settings
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/NetworkSettings'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'Values were sucessfully updated'
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/NetworkSettings'
|
||||||
/settings/main/regenerate:
|
/settings/main/regenerate:
|
||||||
post:
|
post:
|
||||||
summary: Get main settings with newly-generated API key
|
summary: Get main settings with newly-generated API key
|
||||||
@@ -7018,6 +7058,12 @@ paths:
|
|||||||
description: Updates an Override Rule from the request body.
|
description: Updates an Override Rule from the request body.
|
||||||
tags:
|
tags:
|
||||||
- overriderule
|
- overriderule
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: ruleId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: number
|
||||||
responses:
|
responses:
|
||||||
'200':
|
'200':
|
||||||
description: 'Values were successfully updated'
|
description: 'Values were successfully updated'
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
"@supercharge/request-ip": "1.2.0",
|
"@supercharge/request-ip": "1.2.0",
|
||||||
"@svgr/webpack": "6.5.1",
|
"@svgr/webpack": "6.5.1",
|
||||||
"@tanem/react-nprogress": "5.0.30",
|
"@tanem/react-nprogress": "5.0.30",
|
||||||
|
"@types/wink-jaro-distance": "^2.0.2",
|
||||||
"ace-builds": "1.15.2",
|
"ace-builds": "1.15.2",
|
||||||
"bcrypt": "5.1.0",
|
"bcrypt": "5.1.0",
|
||||||
"bowser": "2.11.0",
|
"bowser": "2.11.0",
|
||||||
@@ -97,6 +98,7 @@
|
|||||||
"typeorm": "0.3.11",
|
"typeorm": "0.3.11",
|
||||||
"undici": "^6.20.1",
|
"undici": "^6.20.1",
|
||||||
"web-push": "3.5.0",
|
"web-push": "3.5.0",
|
||||||
|
"wink-jaro-distance": "^2.0.0",
|
||||||
"winston": "3.8.2",
|
"winston": "3.8.2",
|
||||||
"winston-daily-rotate-file": "4.7.1",
|
"winston-daily-rotate-file": "4.7.1",
|
||||||
"xml2js": "0.4.23",
|
"xml2js": "0.4.23",
|
||||||
@@ -123,7 +125,7 @@
|
|||||||
"@types/express-session": "1.17.6",
|
"@types/express-session": "1.17.6",
|
||||||
"@types/lodash": "4.14.191",
|
"@types/lodash": "4.14.191",
|
||||||
"@types/mime": "3",
|
"@types/mime": "3",
|
||||||
"@types/node": "20.14.8",
|
"@types/node": "22.10.5",
|
||||||
"@types/node-schedule": "2.1.0",
|
"@types/node-schedule": "2.1.0",
|
||||||
"@types/nodemailer": "6.4.7",
|
"@types/nodemailer": "6.4.7",
|
||||||
"@types/react": "^18.3.3",
|
"@types/react": "^18.3.3",
|
||||||
@@ -169,7 +171,7 @@
|
|||||||
"typescript": "4.9.5"
|
"typescript": "4.9.5"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^20.0.0",
|
"node": "^22.0.0",
|
||||||
"pnpm": "^9.0.0"
|
"pnpm": "^9.0.0"
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
@@ -235,7 +237,8 @@
|
|||||||
"COMMIT_TAG": "$GIT_SHA"
|
"COMMIT_TAG": "$GIT_SHA"
|
||||||
},
|
},
|
||||||
"imageNames": [
|
"imageNames": [
|
||||||
"fallenbagel/jellyseerr"
|
"fallenbagel/jellyseerr",
|
||||||
|
"ghcr.io/fallenbagel/jellyseerr"
|
||||||
],
|
],
|
||||||
"platforms": [
|
"platforms": [
|
||||||
"linux/amd64",
|
"linux/amd64",
|
||||||
|
|||||||
1833
pnpm-lock.yaml
generated
1833
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
2
public/robots.txt
Normal file
2
public/robots.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
User-agent: *
|
||||||
|
Disallow: /
|
||||||
@@ -69,10 +69,13 @@ class ExternalAPI {
|
|||||||
ttl?: number,
|
ttl?: number,
|
||||||
config?: RequestInit
|
config?: RequestInit
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
|
const headers = { ...this.defaultHeaders, ...config?.headers };
|
||||||
const cacheKey = this.serializeCacheKey(endpoint, {
|
const cacheKey = this.serializeCacheKey(endpoint, {
|
||||||
...this.params,
|
...this.params,
|
||||||
...params,
|
...params,
|
||||||
|
headers,
|
||||||
});
|
});
|
||||||
|
|
||||||
const cachedItem = this.cache?.get<T>(cacheKey);
|
const cachedItem = this.cache?.get<T>(cacheKey);
|
||||||
if (cachedItem) {
|
if (cachedItem) {
|
||||||
return cachedItem;
|
return cachedItem;
|
||||||
@@ -81,10 +84,7 @@ class ExternalAPI {
|
|||||||
const url = this.formatUrl(endpoint, params);
|
const url = this.formatUrl(endpoint, params);
|
||||||
const response = await this.fetch(url, {
|
const response = await this.fetch(url, {
|
||||||
...config,
|
...config,
|
||||||
headers: {
|
headers,
|
||||||
...this.defaultHeaders,
|
|
||||||
...config?.headers,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
const text = await response.text();
|
const text = await response.text();
|
||||||
@@ -111,10 +111,13 @@ class ExternalAPI {
|
|||||||
ttl?: number,
|
ttl?: number,
|
||||||
config?: RequestInit
|
config?: RequestInit
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
|
const headers = { ...this.defaultHeaders, ...config?.headers };
|
||||||
const cacheKey = this.serializeCacheKey(endpoint, {
|
const cacheKey = this.serializeCacheKey(endpoint, {
|
||||||
config: { ...this.params, ...params },
|
config: { ...this.params, ...params },
|
||||||
|
headers,
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
|
|
||||||
const cachedItem = this.cache?.get<T>(cacheKey);
|
const cachedItem = this.cache?.get<T>(cacheKey);
|
||||||
if (cachedItem) {
|
if (cachedItem) {
|
||||||
return cachedItem;
|
return cachedItem;
|
||||||
@@ -124,10 +127,7 @@ class ExternalAPI {
|
|||||||
const response = await this.fetch(url, {
|
const response = await this.fetch(url, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
...config,
|
...config,
|
||||||
headers: {
|
headers,
|
||||||
...this.defaultHeaders,
|
|
||||||
...config?.headers,
|
|
||||||
},
|
|
||||||
body: data ? JSON.stringify(data) : undefined,
|
body: data ? JSON.stringify(data) : undefined,
|
||||||
});
|
});
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
@@ -155,10 +155,13 @@ class ExternalAPI {
|
|||||||
ttl?: number,
|
ttl?: number,
|
||||||
config?: RequestInit
|
config?: RequestInit
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
|
const headers = { ...this.defaultHeaders, ...config?.headers };
|
||||||
const cacheKey = this.serializeCacheKey(endpoint, {
|
const cacheKey = this.serializeCacheKey(endpoint, {
|
||||||
config: { ...this.params, ...params },
|
config: { ...this.params, ...params },
|
||||||
data,
|
data,
|
||||||
|
headers,
|
||||||
});
|
});
|
||||||
|
|
||||||
const cachedItem = this.cache?.get<T>(cacheKey);
|
const cachedItem = this.cache?.get<T>(cacheKey);
|
||||||
if (cachedItem) {
|
if (cachedItem) {
|
||||||
return cachedItem;
|
return cachedItem;
|
||||||
@@ -168,10 +171,7 @@ class ExternalAPI {
|
|||||||
const response = await this.fetch(url, {
|
const response = await this.fetch(url, {
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
...config,
|
...config,
|
||||||
headers: {
|
headers,
|
||||||
...this.defaultHeaders,
|
|
||||||
...config?.headers,
|
|
||||||
},
|
|
||||||
body: JSON.stringify(data),
|
body: JSON.stringify(data),
|
||||||
});
|
});
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
@@ -227,9 +227,11 @@ class ExternalAPI {
|
|||||||
config?: RequestInit,
|
config?: RequestInit,
|
||||||
overwriteBaseUrl?: string
|
overwriteBaseUrl?: string
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
|
const headers = { ...this.defaultHeaders, ...config?.headers };
|
||||||
const cacheKey = this.serializeCacheKey(endpoint, {
|
const cacheKey = this.serializeCacheKey(endpoint, {
|
||||||
...this.params,
|
...this.params,
|
||||||
...params,
|
...params,
|
||||||
|
headers,
|
||||||
});
|
});
|
||||||
const cachedItem = this.cache?.get<T>(cacheKey);
|
const cachedItem = this.cache?.get<T>(cacheKey);
|
||||||
|
|
||||||
@@ -244,10 +246,7 @@ class ExternalAPI {
|
|||||||
const url = this.formatUrl(endpoint, params, overwriteBaseUrl);
|
const url = this.formatUrl(endpoint, params, overwriteBaseUrl);
|
||||||
this.fetch(url, {
|
this.fetch(url, {
|
||||||
...config,
|
...config,
|
||||||
headers: {
|
headers,
|
||||||
...this.defaultHeaders,
|
|
||||||
...config?.headers,
|
|
||||||
},
|
|
||||||
}).then(async (response) => {
|
}).then(async (response) => {
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
const text = await response.text();
|
const text = await response.text();
|
||||||
@@ -270,10 +269,7 @@ class ExternalAPI {
|
|||||||
const url = this.formatUrl(endpoint, params, overwriteBaseUrl);
|
const url = this.formatUrl(endpoint, params, overwriteBaseUrl);
|
||||||
const response = await this.fetch(url, {
|
const response = await this.fetch(url, {
|
||||||
...config,
|
...config,
|
||||||
headers: {
|
headers,
|
||||||
...this.defaultHeaders,
|
|
||||||
...config?.headers,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
const text = await response.text();
|
const text = await response.text();
|
||||||
@@ -293,6 +289,14 @@ class ExternalAPI {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected removeCache(endpoint: string, options?: Record<string, string>) {
|
||||||
|
const cacheKey = this.serializeCacheKey(endpoint, {
|
||||||
|
...this.params,
|
||||||
|
...options,
|
||||||
|
});
|
||||||
|
this.cache?.del(cacheKey);
|
||||||
|
}
|
||||||
|
|
||||||
private formatUrl(
|
private formatUrl(
|
||||||
endpoint: string,
|
endpoint: string,
|
||||||
params?: Record<string, string>,
|
params?: Record<string, string>,
|
||||||
@@ -317,13 +321,13 @@ class ExternalAPI {
|
|||||||
|
|
||||||
private serializeCacheKey(
|
private serializeCacheKey(
|
||||||
endpoint: string,
|
endpoint: string,
|
||||||
params?: Record<string, unknown>
|
options?: Record<string, unknown>
|
||||||
) {
|
) {
|
||||||
if (!params) {
|
if (!options) {
|
||||||
return `${this.baseUrl}${endpoint}`;
|
return `${this.baseUrl}${endpoint}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return `${this.baseUrl}${endpoint}${JSON.stringify(params)}`;
|
return `${this.baseUrl}${endpoint}${JSON.stringify(options)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async getDataFromResponse(response: Response) {
|
private async getDataFromResponse(response: Response) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import ExternalAPI from '@server/api/externalapi';
|
import ExternalAPI from '@server/api/externalapi';
|
||||||
import cacheManager from '@server/lib/cache';
|
import cacheManager from '@server/lib/cache';
|
||||||
import { getSettings } from '@server/lib/settings';
|
import { getSettings } from '@server/lib/settings';
|
||||||
|
import jaro from 'wink-jaro-distance';
|
||||||
|
|
||||||
interface RTAlgoliaSearchResponse {
|
interface RTAlgoliaSearchResponse {
|
||||||
results: {
|
results: {
|
||||||
@@ -15,7 +16,7 @@ interface RTAlgoliaHit {
|
|||||||
tmsId: string;
|
tmsId: string;
|
||||||
type: string;
|
type: string;
|
||||||
title: string;
|
title: string;
|
||||||
titles: string[];
|
titles?: string[];
|
||||||
description: string;
|
description: string;
|
||||||
releaseYear: number;
|
releaseYear: number;
|
||||||
rating: string;
|
rating: string;
|
||||||
@@ -24,9 +25,9 @@ interface RTAlgoliaHit {
|
|||||||
isEmsSearchable: boolean;
|
isEmsSearchable: boolean;
|
||||||
rtId: number;
|
rtId: number;
|
||||||
vanity: string;
|
vanity: string;
|
||||||
aka: string[];
|
aka?: string[];
|
||||||
posterImageUrl: string;
|
posterImageUrl: string;
|
||||||
rottenTomatoes: {
|
rottenTomatoes?: {
|
||||||
audienceScore: number;
|
audienceScore: number;
|
||||||
criticsIconUrl: string;
|
criticsIconUrl: string;
|
||||||
wantToSeeCount: number;
|
wantToSeeCount: number;
|
||||||
@@ -47,6 +48,47 @@ export interface RTRating {
|
|||||||
url: string;
|
url: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tunables
|
||||||
|
const INEXACT_TITLE_FACTOR = 0.25;
|
||||||
|
const ALTERNATE_TITLE_FACTOR = 0.8;
|
||||||
|
const PER_YEAR_PENALTY = 0.4;
|
||||||
|
const MINIMUM_SCORE = 0.175;
|
||||||
|
|
||||||
|
// Normalization for title comparisons.
|
||||||
|
// Lowercase and strip non-alphanumeric (unicode-aware).
|
||||||
|
const norm = (s: string): string =>
|
||||||
|
s.toLowerCase().replace(/[^\p{L}\p{N} ]/gu, '');
|
||||||
|
|
||||||
|
// Title similarity. 1 if exact, quarter-jaro otherwise.
|
||||||
|
const similarity = (a: string, b: string): number =>
|
||||||
|
a === b ? 1 : jaro(a, b).similarity * INEXACT_TITLE_FACTOR;
|
||||||
|
|
||||||
|
// Gets the best similarity score between the searched title and all alternate
|
||||||
|
// titles of the search result. Non-main titles are penalized.
|
||||||
|
const t_score = ({ title, titles, aka }: RTAlgoliaHit, s: string): number => {
|
||||||
|
const f = (t: string, i: number) =>
|
||||||
|
similarity(norm(t), norm(s)) * (i ? ALTERNATE_TITLE_FACTOR : 1);
|
||||||
|
return Math.max(...[title].concat(aka || [], titles || []).map(f));
|
||||||
|
};
|
||||||
|
|
||||||
|
// Year difference to score: 0 -> 1.0, 1 -> 0.6, 2 -> 0.2, 3+ -> 0.0
|
||||||
|
const y_score = (r: RTAlgoliaHit, y?: number): number =>
|
||||||
|
y ? Math.max(0, 1 - Math.abs(r.releaseYear - y) * PER_YEAR_PENALTY) : 1;
|
||||||
|
|
||||||
|
// Cut score in half if result has no ratings.
|
||||||
|
const extra_score = (r: RTAlgoliaHit): number => (r.rottenTomatoes ? 1 : 0.5);
|
||||||
|
|
||||||
|
// Score search result as product of all subscores
|
||||||
|
const score = (r: RTAlgoliaHit, name: string, year?: number): number =>
|
||||||
|
t_score(r, name) * y_score(r, year) * extra_score(r);
|
||||||
|
|
||||||
|
// Score each search result and return the highest scoring result, if any
|
||||||
|
const best = (rs: RTAlgoliaHit[], name: string, year?: number): RTAlgoliaHit =>
|
||||||
|
rs
|
||||||
|
.map((r) => ({ score: score(r, name, year), result: r }))
|
||||||
|
.filter(({ score }) => score > MINIMUM_SCORE)
|
||||||
|
.sort(({ score: a }, { score: b }) => b - a)[0]?.result;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a best-effort API. The Rotten Tomatoes API is technically
|
* This is a best-effort API. The Rotten Tomatoes API is technically
|
||||||
* private and getting access costs money/requires approval.
|
* private and getting access costs money/requires approval.
|
||||||
@@ -90,47 +132,21 @@ class RottenTomatoes extends ExternalAPI {
|
|||||||
year: number
|
year: number
|
||||||
): Promise<RTRating | null> {
|
): Promise<RTRating | null> {
|
||||||
try {
|
try {
|
||||||
|
const filters = encodeURIComponent('isEmsSearchable=1 AND type:"movie"');
|
||||||
const data = await this.post<RTAlgoliaSearchResponse>('/queries', {
|
const data = await this.post<RTAlgoliaSearchResponse>('/queries', {
|
||||||
requests: [
|
requests: [
|
||||||
{
|
{
|
||||||
indexName: 'content_rt',
|
indexName: 'content_rt',
|
||||||
query: name,
|
query: name.replace(/\bthe\b ?/gi, ''),
|
||||||
params: 'filters=isEmsSearchable%20%3D%201&hitsPerPage=20',
|
params: `filters=${filters}&hitsPerPage=20`,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
const contentResults = data.results.find((r) => r.index === 'content_rt');
|
const contentResults = data.results.find((r) => r.index === 'content_rt');
|
||||||
|
const movie = best(contentResults?.hits || [], name, year);
|
||||||
|
|
||||||
if (!contentResults) {
|
if (!movie?.rottenTomatoes) return null;
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// First, attempt to match exact name and year
|
|
||||||
let movie = contentResults.hits.find(
|
|
||||||
(movie) => movie.releaseYear === year && movie.title === name
|
|
||||||
);
|
|
||||||
|
|
||||||
// If we don't find a movie, try to match partial name and year
|
|
||||||
if (!movie) {
|
|
||||||
movie = contentResults.hits.find(
|
|
||||||
(movie) => movie.releaseYear === year && movie.title.includes(name)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we still dont find a movie, try to match just on year
|
|
||||||
if (!movie) {
|
|
||||||
movie = contentResults.hits.find((movie) => movie.releaseYear === year);
|
|
||||||
}
|
|
||||||
|
|
||||||
// One last try, try exact name match only
|
|
||||||
if (!movie) {
|
|
||||||
movie = contentResults.hits.find((movie) => movie.title === name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!movie?.rottenTomatoes) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title: movie.title,
|
title: movie.title,
|
||||||
@@ -158,33 +174,21 @@ class RottenTomatoes extends ExternalAPI {
|
|||||||
year?: number
|
year?: number
|
||||||
): Promise<RTRating | null> {
|
): Promise<RTRating | null> {
|
||||||
try {
|
try {
|
||||||
|
const filters = encodeURIComponent('isEmsSearchable=1 AND type:"tv"');
|
||||||
const data = await this.post<RTAlgoliaSearchResponse>('/queries', {
|
const data = await this.post<RTAlgoliaSearchResponse>('/queries', {
|
||||||
requests: [
|
requests: [
|
||||||
{
|
{
|
||||||
indexName: 'content_rt',
|
indexName: 'content_rt',
|
||||||
query: name,
|
query: name,
|
||||||
params: 'filters=isEmsSearchable%20%3D%201&hitsPerPage=20',
|
params: `filters=${filters}&hitsPerPage=20`,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
const contentResults = data.results.find((r) => r.index === 'content_rt');
|
const contentResults = data.results.find((r) => r.index === 'content_rt');
|
||||||
|
const tvshow = best(contentResults?.hits || [], name, year);
|
||||||
|
|
||||||
if (!contentResults) {
|
if (!tvshow?.rottenTomatoes) return null;
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
let tvshow: RTAlgoliaHit | undefined = contentResults.hits[0];
|
|
||||||
|
|
||||||
if (year) {
|
|
||||||
tvshow = contentResults.hits.find(
|
|
||||||
(series) => series.releaseYear === year
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!tvshow || !tvshow.rottenTomatoes) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title: tvshow.title,
|
title: tvshow.title,
|
||||||
|
|||||||
@@ -230,6 +230,23 @@ class RadarrAPI extends ServarrBase<{ movieId: number }> {
|
|||||||
throw new Error(`[Radarr] Failed to remove movie: ${e.message}`);
|
throw new Error(`[Radarr] Failed to remove movie: ${e.message}`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public clearCache = ({
|
||||||
|
tmdbId,
|
||||||
|
externalId,
|
||||||
|
}: {
|
||||||
|
tmdbId?: number | null;
|
||||||
|
externalId?: number | null;
|
||||||
|
}) => {
|
||||||
|
if (tmdbId) {
|
||||||
|
this.removeCache('/movie/lookup', {
|
||||||
|
term: `tmdb:${tmdbId}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (externalId) {
|
||||||
|
this.removeCache(`/movie/${externalId}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export default RadarrAPI;
|
export default RadarrAPI;
|
||||||
|
|||||||
@@ -353,6 +353,30 @@ class SonarrAPI extends ServarrBase<{
|
|||||||
throw new Error(`[Radarr] Failed to remove serie: ${e.message}`);
|
throw new Error(`[Radarr] Failed to remove serie: ${e.message}`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public clearCache = ({
|
||||||
|
tvdbId,
|
||||||
|
externalId,
|
||||||
|
title,
|
||||||
|
}: {
|
||||||
|
tvdbId?: number | null;
|
||||||
|
externalId?: number | null;
|
||||||
|
title?: string | null;
|
||||||
|
}) => {
|
||||||
|
if (tvdbId) {
|
||||||
|
this.removeCache('/series/lookup', {
|
||||||
|
term: `tvdb:${tvdbId}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (externalId) {
|
||||||
|
this.removeCache(`/series/${externalId}`);
|
||||||
|
}
|
||||||
|
if (title) {
|
||||||
|
this.removeCache('/series/lookup', {
|
||||||
|
term: title,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export default SonarrAPI;
|
export default SonarrAPI;
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ class TheMovieDb extends ExternalAPI {
|
|||||||
super(
|
super(
|
||||||
'https://api.themoviedb.org/3',
|
'https://api.themoviedb.org/3',
|
||||||
{
|
{
|
||||||
api_key: 'db55323b8d3e4154498498a75642b381',
|
api_key: '431a8708161bcd1f1fbe7536137e61ed',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
nodeCache: cacheManager.getCache('tmdb').data,
|
nodeCache: cacheManager.getCache('tmdb').data,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ export enum ApiErrorCode {
|
|||||||
InvalidAuthToken = 'INVALID_AUTH_TOKEN',
|
InvalidAuthToken = 'INVALID_AUTH_TOKEN',
|
||||||
InvalidEmail = 'INVALID_EMAIL',
|
InvalidEmail = 'INVALID_EMAIL',
|
||||||
NotAdmin = 'NOT_ADMIN',
|
NotAdmin = 'NOT_ADMIN',
|
||||||
|
NoAdminUser = 'NO_ADMIN_USER',
|
||||||
SyncErrorGroupedFolders = 'SYNC_ERROR_GROUPED_FOLDERS',
|
SyncErrorGroupedFolders = 'SYNC_ERROR_GROUPED_FOLDERS',
|
||||||
SyncErrorNoLibraries = 'SYNC_ERROR_NO_LIBRARIES',
|
SyncErrorNoLibraries = 'SYNC_ERROR_NO_LIBRARIES',
|
||||||
Unknown = 'UNKNOWN',
|
Unknown = 'UNKNOWN',
|
||||||
|
|||||||
@@ -68,8 +68,10 @@ const prodConfig: DataSourceOptions = {
|
|||||||
|
|
||||||
const postgresDevConfig: DataSourceOptions = {
|
const postgresDevConfig: DataSourceOptions = {
|
||||||
type: 'postgres',
|
type: 'postgres',
|
||||||
host: process.env.DB_HOST,
|
host: process.env.DB_SOCKET_PATH || process.env.DB_HOST,
|
||||||
port: parseInt(process.env.DB_PORT ?? '5432'),
|
port: process.env.DB_SOCKET_PATH
|
||||||
|
? undefined
|
||||||
|
: parseInt(process.env.DB_PORT ?? '5432'),
|
||||||
username: process.env.DB_USER,
|
username: process.env.DB_USER,
|
||||||
password: process.env.DB_PASS,
|
password: process.env.DB_PASS,
|
||||||
database: process.env.DB_NAME ?? 'jellyseerr',
|
database: process.env.DB_NAME ?? 'jellyseerr',
|
||||||
@@ -84,8 +86,10 @@ const postgresDevConfig: DataSourceOptions = {
|
|||||||
|
|
||||||
const postgresProdConfig: DataSourceOptions = {
|
const postgresProdConfig: DataSourceOptions = {
|
||||||
type: 'postgres',
|
type: 'postgres',
|
||||||
host: process.env.DB_HOST,
|
host: process.env.DB_SOCKET_PATH || process.env.DB_HOST,
|
||||||
port: parseInt(process.env.DB_PORT ?? '5432'),
|
port: process.env.DB_SOCKET_PATH
|
||||||
|
? undefined
|
||||||
|
: parseInt(process.env.DB_PORT ?? '5432'),
|
||||||
username: process.env.DB_USER,
|
username: process.env.DB_USER,
|
||||||
password: process.env.DB_PASS,
|
password: process.env.DB_PASS,
|
||||||
database: process.env.DB_NAME ?? 'jellyseerr',
|
database: process.env.DB_NAME ?? 'jellyseerr',
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import type {
|
|||||||
import SonarrAPI from '@server/api/servarr/sonarr';
|
import SonarrAPI from '@server/api/servarr/sonarr';
|
||||||
import TheMovieDb from '@server/api/themoviedb';
|
import TheMovieDb from '@server/api/themoviedb';
|
||||||
import { ANIME_KEYWORD_ID } from '@server/api/themoviedb/constants';
|
import { ANIME_KEYWORD_ID } from '@server/api/themoviedb/constants';
|
||||||
|
import type { TmdbKeyword } from '@server/api/themoviedb/interfaces';
|
||||||
import {
|
import {
|
||||||
MediaRequestStatus,
|
MediaRequestStatus,
|
||||||
MediaStatus,
|
MediaStatus,
|
||||||
@@ -207,28 +208,50 @@ export class MediaRequest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply overrides if the user is not an admin or has the "auto approve" permission
|
// Apply overrides if the user is not an admin or has the "advanced request" permission
|
||||||
const useOverrides = !user.hasPermission(
|
const useOverrides = !user.hasPermission([Permission.MANAGE_REQUESTS], {
|
||||||
[
|
type: 'or',
|
||||||
requestBody.is4k ? Permission.AUTO_APPROVE_4K : Permission.AUTO_APPROVE,
|
});
|
||||||
Permission.MANAGE_REQUESTS,
|
|
||||||
],
|
|
||||||
{ type: 'or' }
|
|
||||||
);
|
|
||||||
|
|
||||||
let rootFolder = requestBody.rootFolder;
|
let rootFolder = requestBody.rootFolder;
|
||||||
let profileId = requestBody.profileId;
|
let profileId = requestBody.profileId;
|
||||||
let tags = requestBody.tags;
|
let tags = requestBody.tags;
|
||||||
|
|
||||||
if (useOverrides) {
|
if (useOverrides) {
|
||||||
|
const defaultRadarrId = requestBody.is4k
|
||||||
|
? settings.radarr.findIndex((r) => r.is4k && r.isDefault)
|
||||||
|
: settings.radarr.findIndex((r) => !r.is4k && r.isDefault);
|
||||||
|
const defaultSonarrId = requestBody.is4k
|
||||||
|
? settings.sonarr.findIndex((s) => s.is4k && s.isDefault)
|
||||||
|
: settings.sonarr.findIndex((s) => !s.is4k && s.isDefault);
|
||||||
|
|
||||||
const overrideRuleRepository = getRepository(OverrideRule);
|
const overrideRuleRepository = getRepository(OverrideRule);
|
||||||
const overrideRules = await overrideRuleRepository.find({
|
const overrideRules = await overrideRuleRepository.find({
|
||||||
where:
|
where:
|
||||||
requestBody.mediaType === MediaType.MOVIE
|
requestBody.mediaType === MediaType.MOVIE
|
||||||
? { radarrServiceId: requestBody.serverId }
|
? { radarrServiceId: defaultRadarrId }
|
||||||
: { sonarrServiceId: requestBody.serverId },
|
: { sonarrServiceId: defaultSonarrId },
|
||||||
});
|
});
|
||||||
|
|
||||||
const appliedOverrideRules = overrideRules.filter((rule) => {
|
const appliedOverrideRules = overrideRules.filter((rule) => {
|
||||||
|
const hasAnimeKeyword =
|
||||||
|
'results' in tmdbMedia.keywords &&
|
||||||
|
tmdbMedia.keywords.results.some(
|
||||||
|
(keyword: TmdbKeyword) => keyword.id === ANIME_KEYWORD_ID
|
||||||
|
);
|
||||||
|
|
||||||
|
// Skip override rules if the media is an anime TV show as anime TV
|
||||||
|
// is handled by default and override rules do not explicitly include
|
||||||
|
// the anime keyword
|
||||||
|
if (
|
||||||
|
requestBody.mediaType === MediaType.TV &&
|
||||||
|
hasAnimeKeyword &&
|
||||||
|
(!rule.keywords ||
|
||||||
|
!rule.keywords.split(',').map(Number).includes(ANIME_KEYWORD_ID))
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
rule.users &&
|
rule.users &&
|
||||||
!rule.users
|
!rule.users
|
||||||
@@ -257,31 +280,59 @@ export class MediaRequest {
|
|||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
rule.keywords &&
|
||||||
|
!rule.keywords.split(',').some((keywordId) => {
|
||||||
|
let keywordList: TmdbKeyword[] = [];
|
||||||
|
|
||||||
|
if ('keywords' in tmdbMedia.keywords) {
|
||||||
|
keywordList = tmdbMedia.keywords.keywords;
|
||||||
|
} else if ('results' in tmdbMedia.keywords) {
|
||||||
|
keywordList = tmdbMedia.keywords.results;
|
||||||
|
}
|
||||||
|
|
||||||
|
return keywordList
|
||||||
|
.map((keyword: TmdbKeyword) => keyword.id)
|
||||||
|
.includes(Number(keywordId));
|
||||||
|
})
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
const overrideRootFolder = appliedOverrideRules.find(
|
// hacky way to prioritize rules
|
||||||
(rule) => rule.rootFolder
|
// TODO: make this better
|
||||||
)?.rootFolder;
|
const prioritizedRule = appliedOverrideRules.sort((a, b) => {
|
||||||
if (overrideRootFolder) {
|
const keys: (keyof OverrideRule)[] = ['genre', 'language', 'keywords'];
|
||||||
rootFolder = overrideRootFolder;
|
|
||||||
}
|
|
||||||
|
|
||||||
const overrideProfileId = appliedOverrideRules.find(
|
const aSpecificity = keys.filter((key) => a[key] !== null).length;
|
||||||
(rule) => rule.profileId
|
const bSpecificity = keys.filter((key) => b[key] !== null).length;
|
||||||
)?.profileId;
|
|
||||||
if (overrideProfileId) {
|
|
||||||
profileId = overrideProfileId;
|
|
||||||
}
|
|
||||||
|
|
||||||
const overrideTags = appliedOverrideRules.find((rule) => rule.tags)?.tags;
|
// Take the rule with the most specific condition first
|
||||||
if (overrideTags) {
|
return bSpecificity - aSpecificity;
|
||||||
tags = [
|
})[0];
|
||||||
...new Set([
|
|
||||||
...(tags || []),
|
if (prioritizedRule) {
|
||||||
...overrideTags.split(',').map((tag) => Number(tag)),
|
if (prioritizedRule.rootFolder) {
|
||||||
]),
|
rootFolder = prioritizedRule.rootFolder;
|
||||||
];
|
}
|
||||||
|
if (prioritizedRule.profileId) {
|
||||||
|
profileId = prioritizedRule.profileId;
|
||||||
|
}
|
||||||
|
if (prioritizedRule.tags) {
|
||||||
|
tags = [
|
||||||
|
...new Set([
|
||||||
|
...(tags || []),
|
||||||
|
...prioritizedRule.tags.split(',').map((tag) => Number(tag)),
|
||||||
|
]),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug('Override rule applied.', {
|
||||||
|
label: 'Media Request',
|
||||||
|
overrides: prioritizedRule,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,14 +386,14 @@ export class MediaRequest {
|
|||||||
const tmdbMediaShow = tmdbMedia as Awaited<
|
const tmdbMediaShow = tmdbMedia as Awaited<
|
||||||
ReturnType<typeof tmdb.getTvShow>
|
ReturnType<typeof tmdb.getTvShow>
|
||||||
>;
|
>;
|
||||||
const requestedSeasons =
|
let requestedSeasons =
|
||||||
requestBody.seasons === 'all'
|
requestBody.seasons === 'all'
|
||||||
? settings.main.enableSpecialEpisodes
|
? tmdbMediaShow.seasons.map((season) => season.season_number)
|
||||||
? tmdbMediaShow.seasons.map((season) => season.season_number)
|
|
||||||
: tmdbMediaShow.seasons
|
|
||||||
.map((season) => season.season_number)
|
|
||||||
.filter((sn) => sn > 0)
|
|
||||||
: (requestBody.seasons as number[]);
|
: (requestBody.seasons as number[]);
|
||||||
|
if (!settings.main.enableSpecialEpisodes) {
|
||||||
|
requestedSeasons = requestedSeasons.filter((sn) => sn > 0);
|
||||||
|
}
|
||||||
|
|
||||||
let existingSeasons: number[] = [];
|
let existingSeasons: number[] = [];
|
||||||
|
|
||||||
// We need to check existing requests on this title to make sure we don't double up on seasons that were
|
// We need to check existing requests on this title to make sure we don't double up on seasons that were
|
||||||
@@ -428,10 +479,10 @@ export class MediaRequest {
|
|||||||
: undefined,
|
: undefined,
|
||||||
is4k: requestBody.is4k,
|
is4k: requestBody.is4k,
|
||||||
serverId: requestBody.serverId,
|
serverId: requestBody.serverId,
|
||||||
profileId: requestBody.profileId,
|
profileId: profileId,
|
||||||
rootFolder: requestBody.rootFolder,
|
rootFolder: rootFolder,
|
||||||
languageProfileId: requestBody.languageProfileId,
|
languageProfileId: requestBody.languageProfileId,
|
||||||
tags: requestBody.tags,
|
tags: tags,
|
||||||
seasons: finalSeasons.map(
|
seasons: finalSeasons.map(
|
||||||
(sn) =>
|
(sn) =>
|
||||||
new SeasonRequest({
|
new SeasonRequest({
|
||||||
@@ -668,18 +719,26 @@ export class MediaRequest {
|
|||||||
// Do not update the status if the item is already partially available or available
|
// Do not update the status if the item is already partially available or available
|
||||||
media[this.is4k ? 'status4k' : 'status'] !== MediaStatus.AVAILABLE &&
|
media[this.is4k ? 'status4k' : 'status'] !== MediaStatus.AVAILABLE &&
|
||||||
media[this.is4k ? 'status4k' : 'status'] !==
|
media[this.is4k ? 'status4k' : 'status'] !==
|
||||||
MediaStatus.PARTIALLY_AVAILABLE
|
MediaStatus.PARTIALLY_AVAILABLE &&
|
||||||
|
media[this.is4k ? 'status4k' : 'status'] !== MediaStatus.PROCESSING
|
||||||
) {
|
) {
|
||||||
media[this.is4k ? 'status4k' : 'status'] = MediaStatus.PROCESSING;
|
const statusField = this.is4k ? 'status4k' : 'status';
|
||||||
mediaRepository.save(media);
|
|
||||||
|
await mediaRepository.update(
|
||||||
|
{ id: this.media.id },
|
||||||
|
{ [statusField]: MediaStatus.PROCESSING }
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
media.mediaType === MediaType.MOVIE &&
|
media.mediaType === MediaType.MOVIE &&
|
||||||
this.status === MediaRequestStatus.DECLINED
|
this.status === MediaRequestStatus.DECLINED
|
||||||
) {
|
) {
|
||||||
media[this.is4k ? 'status4k' : 'status'] = MediaStatus.UNKNOWN;
|
const statusField = this.is4k ? 'status4k' : 'status';
|
||||||
mediaRepository.save(media);
|
await mediaRepository.update(
|
||||||
|
{ id: this.media.id },
|
||||||
|
{ [statusField]: MediaStatus.UNKNOWN }
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -696,8 +755,11 @@ export class MediaRequest {
|
|||||||
).length === 0 &&
|
).length === 0 &&
|
||||||
media[this.is4k ? 'status4k' : 'status'] === MediaStatus.PENDING
|
media[this.is4k ? 'status4k' : 'status'] === MediaStatus.PENDING
|
||||||
) {
|
) {
|
||||||
media[this.is4k ? 'status4k' : 'status'] = MediaStatus.UNKNOWN;
|
const statusField = this.is4k ? 'status4k' : 'status';
|
||||||
mediaRepository.save(media);
|
mediaRepository.update(
|
||||||
|
{ id: this.media.id },
|
||||||
|
{ [statusField]: MediaStatus.UNKNOWN }
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Approve child seasons if parent is approved
|
// Approve child seasons if parent is approved
|
||||||
@@ -899,8 +961,10 @@ export class MediaRequest {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const requestRepository = getRepository(MediaRequest);
|
const requestRepository = getRepository(MediaRequest);
|
||||||
this.status = MediaRequestStatus.APPROVED;
|
|
||||||
await requestRepository.save(this);
|
await requestRepository.update(this.id, {
|
||||||
|
status: MediaRequestStatus.APPROVED,
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -930,18 +994,22 @@ export class MediaRequest {
|
|||||||
throw new Error('Media data not found');
|
throw new Error('Media data not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
media[this.is4k ? 'externalServiceId4k' : 'externalServiceId'] =
|
const updateFields = {
|
||||||
radarrMovie.id;
|
[this.is4k ? 'externalServiceId4k' : 'externalServiceId']:
|
||||||
media[this.is4k ? 'externalServiceSlug4k' : 'externalServiceSlug'] =
|
radarrMovie.id,
|
||||||
radarrMovie.titleSlug;
|
[this.is4k ? 'externalServiceSlug4k' : 'externalServiceSlug']:
|
||||||
media[this.is4k ? 'serviceId4k' : 'serviceId'] = radarrSettings?.id;
|
radarrMovie.titleSlug,
|
||||||
await mediaRepository.save(media);
|
[this.is4k ? 'serviceId4k' : 'serviceId']: radarrMovie?.id,
|
||||||
|
};
|
||||||
|
|
||||||
|
await mediaRepository.update({ id: this.media.id }, updateFields);
|
||||||
})
|
})
|
||||||
.catch(async () => {
|
.catch(async () => {
|
||||||
const requestRepository = getRepository(MediaRequest);
|
const requestRepository = getRepository(MediaRequest);
|
||||||
|
|
||||||
this.status = MediaRequestStatus.FAILED;
|
await requestRepository.update(this.id, {
|
||||||
await requestRepository.save(this);
|
status: MediaRequestStatus.FAILED,
|
||||||
|
});
|
||||||
|
|
||||||
logger.warn(
|
logger.warn(
|
||||||
'Something went wrong sending movie request to Radarr, marking status as FAILED',
|
'Something went wrong sending movie request to Radarr, marking status as FAILED',
|
||||||
@@ -954,6 +1022,14 @@ export class MediaRequest {
|
|||||||
);
|
);
|
||||||
|
|
||||||
this.sendNotification(media, Notification.MEDIA_FAILED);
|
this.sendNotification(media, Notification.MEDIA_FAILED);
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
radarr.clearCache({
|
||||||
|
tmdbId: movie.id,
|
||||||
|
externalId: this.is4k
|
||||||
|
? media.externalServiceId4k
|
||||||
|
: media.externalServiceId,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
logger.info('Sent request to Radarr', {
|
logger.info('Sent request to Radarr', {
|
||||||
label: 'Media Request',
|
label: 'Media Request',
|
||||||
@@ -1049,8 +1125,9 @@ export class MediaRequest {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const requestRepository = getRepository(MediaRequest);
|
const requestRepository = getRepository(MediaRequest);
|
||||||
this.status = MediaRequestStatus.APPROVED;
|
await requestRepository.update(this.id, {
|
||||||
await requestRepository.save(this);
|
status: MediaRequestStatus.APPROVED,
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1211,19 +1288,23 @@ export class MediaRequest {
|
|||||||
throw new Error('Media data not found');
|
throw new Error('Media data not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
media[this.is4k ? 'externalServiceId4k' : 'externalServiceId'] =
|
const updateFields = {
|
||||||
sonarrSeries.id;
|
[this.is4k ? 'externalServiceId4k' : 'externalServiceId']:
|
||||||
media[this.is4k ? 'externalServiceSlug4k' : 'externalServiceSlug'] =
|
sonarrSeries.id,
|
||||||
sonarrSeries.titleSlug;
|
[this.is4k ? 'externalServiceSlug4k' : 'externalServiceSlug']:
|
||||||
media[this.is4k ? 'serviceId4k' : 'serviceId'] = sonarrSettings?.id;
|
sonarrSeries.titleSlug,
|
||||||
|
[this.is4k ? 'serviceId4k' : 'serviceId']: sonarrSettings?.id,
|
||||||
|
};
|
||||||
|
|
||||||
await mediaRepository.save(media);
|
await mediaRepository.update({ id: this.media.id }, updateFields);
|
||||||
})
|
})
|
||||||
.catch(async () => {
|
.catch(async () => {
|
||||||
const requestRepository = getRepository(MediaRequest);
|
const requestRepository = getRepository(MediaRequest);
|
||||||
|
|
||||||
this.status = MediaRequestStatus.FAILED;
|
await requestRepository.update(
|
||||||
await requestRepository.save(this);
|
{ id: this.id },
|
||||||
|
{ status: MediaRequestStatus.FAILED }
|
||||||
|
);
|
||||||
|
|
||||||
logger.warn(
|
logger.warn(
|
||||||
'Something went wrong sending series request to Sonarr, marking status as FAILED',
|
'Something went wrong sending series request to Sonarr, marking status as FAILED',
|
||||||
@@ -1236,6 +1317,15 @@ export class MediaRequest {
|
|||||||
);
|
);
|
||||||
|
|
||||||
this.sendNotification(media, Notification.MEDIA_FAILED);
|
this.sendNotification(media, Notification.MEDIA_FAILED);
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
sonarr.clearCache({
|
||||||
|
tvdbId,
|
||||||
|
externalId: this.is4k
|
||||||
|
? media.externalServiceId4k
|
||||||
|
: media.externalServiceId,
|
||||||
|
title: series.name,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
logger.info('Sent request to Sonarr', {
|
logger.info('Sent request to Sonarr', {
|
||||||
label: 'Media Request',
|
label: 'Media Request',
|
||||||
|
|||||||
@@ -83,13 +83,13 @@ export class User {
|
|||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
public jellyfinUserId?: string;
|
public jellyfinUserId?: string;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true, select: false })
|
||||||
public jellyfinDeviceId?: string;
|
public jellyfinDeviceId?: string;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true, select: false })
|
||||||
public jellyfinAuthToken?: string;
|
public jellyfinAuthToken?: string;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true, select: false })
|
||||||
public plexToken?: string;
|
public plexToken?: string;
|
||||||
|
|
||||||
@Column({ type: 'integer', default: 0 })
|
@Column({ type: 'integer', default: 0 })
|
||||||
|
|||||||
@@ -41,11 +41,6 @@ import path from 'path';
|
|||||||
import swaggerUi from 'swagger-ui-express';
|
import swaggerUi from 'swagger-ui-express';
|
||||||
import YAML from 'yamljs';
|
import YAML from 'yamljs';
|
||||||
|
|
||||||
if (process.env.forceIpv4First === 'true') {
|
|
||||||
dns.setDefaultResultOrder('ipv4first');
|
|
||||||
net.setDefaultAutoSelectFamily(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
const API_SPEC_PATH = path.join(__dirname, '../overseerr-api.yml');
|
const API_SPEC_PATH = path.join(__dirname, '../overseerr-api.yml');
|
||||||
|
|
||||||
logger.info(`Starting Overseerr version ${getAppVersion()}`);
|
logger.info(`Starting Overseerr version ${getAppVersion()}`);
|
||||||
@@ -77,11 +72,26 @@ app
|
|||||||
|
|
||||||
// Load Settings
|
// Load Settings
|
||||||
const settings = await getSettings().load();
|
const settings = await getSettings().load();
|
||||||
restartFlag.initializeSettings(settings.main);
|
restartFlag.initializeSettings(settings);
|
||||||
|
|
||||||
|
// Check if we force IPv4 first
|
||||||
|
if (
|
||||||
|
process.env.forceIpv4First === 'true' ||
|
||||||
|
settings.network.forceIpv4First
|
||||||
|
) {
|
||||||
|
dns.setDefaultResultOrder('ipv4first');
|
||||||
|
net.setDefaultAutoSelectFamily(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.network.dnsServers.trim() !== '') {
|
||||||
|
dns.setServers(
|
||||||
|
settings.network.dnsServers.split(',').map((server) => server.trim())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Register HTTP proxy
|
// Register HTTP proxy
|
||||||
if (settings.main.proxy.enabled) {
|
if (settings.network.proxy.enabled) {
|
||||||
await createCustomProxyAgent(settings.main.proxy);
|
await createCustomProxyAgent(settings.network.proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Migrate library types
|
// Migrate library types
|
||||||
@@ -136,7 +146,7 @@ app
|
|||||||
await DiscoverSlider.bootstrapSliders();
|
await DiscoverSlider.bootstrapSliders();
|
||||||
|
|
||||||
const server = express();
|
const server = express();
|
||||||
if (settings.main.trustProxy) {
|
if (settings.network.trustProxy) {
|
||||||
server.enable('trust proxy');
|
server.enable('trust proxy');
|
||||||
}
|
}
|
||||||
server.use(cookieParser());
|
server.use(cookieParser());
|
||||||
@@ -157,7 +167,7 @@ app
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (settings.main.csrfProtection) {
|
if (settings.network.csrfProtection) {
|
||||||
server.use(
|
server.use(
|
||||||
csurf({
|
csurf({
|
||||||
cookie: {
|
cookie: {
|
||||||
@@ -187,7 +197,7 @@ app
|
|||||||
cookie: {
|
cookie: {
|
||||||
maxAge: 1000 * 60 * 60 * 24 * 30,
|
maxAge: 1000 * 60 * 60 * 24 * 30,
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
sameSite: settings.main.csrfProtection ? 'strict' : 'lax',
|
sameSite: settings.network.csrfProtection ? 'strict' : 'lax',
|
||||||
secure: 'auto',
|
secure: 'auto',
|
||||||
},
|
},
|
||||||
store: new TypeormStore({
|
store: new TypeormStore({
|
||||||
|
|||||||
@@ -70,6 +70,35 @@ export const startJobs = (): void => {
|
|||||||
running: () => plexFullScanner.status().running,
|
running: () => plexFullScanner.status().running,
|
||||||
cancelFn: () => plexFullScanner.cancel(),
|
cancelFn: () => plexFullScanner.cancel(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
scheduledJobs.push({
|
||||||
|
id: 'plex-refresh-token',
|
||||||
|
name: 'Plex Refresh Token',
|
||||||
|
type: 'process',
|
||||||
|
interval: 'fixed',
|
||||||
|
cronSchedule: jobs['plex-refresh-token'].schedule,
|
||||||
|
job: schedule.scheduleJob(jobs['plex-refresh-token'].schedule, () => {
|
||||||
|
logger.info('Starting scheduled job: Plex Refresh Token', {
|
||||||
|
label: 'Jobs',
|
||||||
|
});
|
||||||
|
refreshToken.run();
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Watchlist Sync
|
||||||
|
scheduledJobs.push({
|
||||||
|
id: 'plex-watchlist-sync',
|
||||||
|
name: 'Plex Watchlist Sync',
|
||||||
|
type: 'process',
|
||||||
|
interval: 'seconds',
|
||||||
|
cronSchedule: jobs['plex-watchlist-sync'].schedule,
|
||||||
|
job: schedule.scheduleJob(jobs['plex-watchlist-sync'].schedule, () => {
|
||||||
|
logger.info('Starting scheduled job: Plex Watchlist Sync', {
|
||||||
|
label: 'Jobs',
|
||||||
|
});
|
||||||
|
watchlistSync.syncWatchlist();
|
||||||
|
}),
|
||||||
|
});
|
||||||
} else if (
|
} else if (
|
||||||
mediaServerType === MediaServerType.JELLYFIN ||
|
mediaServerType === MediaServerType.JELLYFIN ||
|
||||||
mediaServerType === MediaServerType.EMBY
|
mediaServerType === MediaServerType.EMBY
|
||||||
@@ -112,21 +141,6 @@ export const startJobs = (): void => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Watchlist Sync
|
|
||||||
scheduledJobs.push({
|
|
||||||
id: 'plex-watchlist-sync',
|
|
||||||
name: 'Plex Watchlist Sync',
|
|
||||||
type: 'process',
|
|
||||||
interval: 'seconds',
|
|
||||||
cronSchedule: jobs['plex-watchlist-sync'].schedule,
|
|
||||||
job: schedule.scheduleJob(jobs['plex-watchlist-sync'].schedule, () => {
|
|
||||||
logger.info('Starting scheduled job: Plex Watchlist Sync', {
|
|
||||||
label: 'Jobs',
|
|
||||||
});
|
|
||||||
watchlistSync.syncWatchlist();
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Run full radarr scan every 24 hours
|
// Run full radarr scan every 24 hours
|
||||||
scheduledJobs.push({
|
scheduledJobs.push({
|
||||||
id: 'radarr-scan',
|
id: 'radarr-scan',
|
||||||
@@ -223,19 +237,5 @@ export const startJobs = (): void => {
|
|||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
scheduledJobs.push({
|
|
||||||
id: 'plex-refresh-token',
|
|
||||||
name: 'Plex Refresh Token',
|
|
||||||
type: 'process',
|
|
||||||
interval: 'fixed',
|
|
||||||
cronSchedule: jobs['plex-refresh-token'].schedule,
|
|
||||||
job: schedule.scheduleJob(jobs['plex-refresh-token'].schedule, () => {
|
|
||||||
logger.info('Starting scheduled job: Plex Refresh Token', {
|
|
||||||
label: 'Jobs',
|
|
||||||
});
|
|
||||||
refreshToken.run();
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
logger.info('Scheduled jobs loaded', { label: 'Jobs' });
|
logger.info('Scheduled jobs loaded', { label: 'Jobs' });
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ class SonarrScanner
|
|||||||
const filteredSeasons = sonarrSeries.seasons.filter(
|
const filteredSeasons = sonarrSeries.seasons.filter(
|
||||||
(sn) =>
|
(sn) =>
|
||||||
tvShow.seasons.find((s) => s.season_number === sn.seasonNumber) &&
|
tvShow.seasons.find((s) => s.season_number === sn.seasonNumber) &&
|
||||||
(!settings.main.partialRequestsEnabled ? sn.seasonNumber !== 0 : true)
|
(!settings.main.enableSpecialEpisodes ? sn.seasonNumber !== 0 : true)
|
||||||
);
|
);
|
||||||
|
|
||||||
for (const season of filteredSeasons) {
|
for (const season of filteredSeasons) {
|
||||||
|
|||||||
@@ -115,7 +115,6 @@ export interface MainSettings {
|
|||||||
apiKey: string;
|
apiKey: string;
|
||||||
applicationTitle: string;
|
applicationTitle: string;
|
||||||
applicationUrl: string;
|
applicationUrl: string;
|
||||||
csrfProtection: boolean;
|
|
||||||
cacheImages: boolean;
|
cacheImages: boolean;
|
||||||
defaultPermissions: number;
|
defaultPermissions: number;
|
||||||
defaultQuotas: {
|
defaultQuotas: {
|
||||||
@@ -128,11 +127,17 @@ export interface MainSettings {
|
|||||||
discoverRegion: string;
|
discoverRegion: string;
|
||||||
streamingRegion: string;
|
streamingRegion: string;
|
||||||
originalLanguage: string;
|
originalLanguage: string;
|
||||||
trustProxy: boolean;
|
|
||||||
mediaServerType: number;
|
mediaServerType: number;
|
||||||
partialRequestsEnabled: boolean;
|
partialRequestsEnabled: boolean;
|
||||||
enableSpecialEpisodes: boolean;
|
enableSpecialEpisodes: boolean;
|
||||||
locale: string;
|
locale: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface NetworkSettings {
|
||||||
|
csrfProtection: boolean;
|
||||||
|
forceIpv4First: boolean;
|
||||||
|
dnsServers: string;
|
||||||
|
trustProxy: boolean;
|
||||||
proxy: ProxySettings;
|
proxy: ProxySettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,6 +316,7 @@ export interface AllSettings {
|
|||||||
public: PublicSettings;
|
public: PublicSettings;
|
||||||
notifications: NotificationSettings;
|
notifications: NotificationSettings;
|
||||||
jobs: Record<JobId, JobSettings>;
|
jobs: Record<JobId, JobSettings>;
|
||||||
|
network: NetworkSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SETTINGS_PATH = process.env.CONFIG_DIRECTORY
|
const SETTINGS_PATH = process.env.CONFIG_DIRECTORY
|
||||||
@@ -329,7 +335,6 @@ class Settings {
|
|||||||
apiKey: '',
|
apiKey: '',
|
||||||
applicationTitle: 'Jellyseerr',
|
applicationTitle: 'Jellyseerr',
|
||||||
applicationUrl: '',
|
applicationUrl: '',
|
||||||
csrfProtection: false,
|
|
||||||
cacheImages: false,
|
cacheImages: false,
|
||||||
defaultPermissions: Permission.REQUEST,
|
defaultPermissions: Permission.REQUEST,
|
||||||
defaultQuotas: {
|
defaultQuotas: {
|
||||||
@@ -342,21 +347,10 @@ class Settings {
|
|||||||
discoverRegion: '',
|
discoverRegion: '',
|
||||||
streamingRegion: '',
|
streamingRegion: '',
|
||||||
originalLanguage: '',
|
originalLanguage: '',
|
||||||
trustProxy: false,
|
|
||||||
mediaServerType: MediaServerType.NOT_CONFIGURED,
|
mediaServerType: MediaServerType.NOT_CONFIGURED,
|
||||||
partialRequestsEnabled: true,
|
partialRequestsEnabled: true,
|
||||||
enableSpecialEpisodes: false,
|
enableSpecialEpisodes: false,
|
||||||
locale: 'en',
|
locale: 'en',
|
||||||
proxy: {
|
|
||||||
enabled: false,
|
|
||||||
hostname: '',
|
|
||||||
port: 8080,
|
|
||||||
useSsl: false,
|
|
||||||
user: '',
|
|
||||||
password: '',
|
|
||||||
bypassFilter: '',
|
|
||||||
bypassLocalAddresses: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
plex: {
|
plex: {
|
||||||
name: '',
|
name: '',
|
||||||
@@ -509,6 +503,22 @@ class Settings {
|
|||||||
schedule: '0 0 5 * * *',
|
schedule: '0 0 5 * * *',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
network: {
|
||||||
|
csrfProtection: false,
|
||||||
|
trustProxy: false,
|
||||||
|
forceIpv4First: false,
|
||||||
|
dnsServers: '',
|
||||||
|
proxy: {
|
||||||
|
enabled: false,
|
||||||
|
hostname: '',
|
||||||
|
port: 8080,
|
||||||
|
useSsl: false,
|
||||||
|
user: '',
|
||||||
|
password: '',
|
||||||
|
bypassFilter: '',
|
||||||
|
bypassLocalAddresses: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
if (initialSettings) {
|
if (initialSettings) {
|
||||||
this.data = merge(this.data, initialSettings);
|
this.data = merge(this.data, initialSettings);
|
||||||
@@ -618,6 +628,14 @@ class Settings {
|
|||||||
this.data.jobs = data;
|
this.data.jobs = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get network(): NetworkSettings {
|
||||||
|
return this.data.network;
|
||||||
|
}
|
||||||
|
|
||||||
|
set network(data: NetworkSettings) {
|
||||||
|
this.data.network = data;
|
||||||
|
}
|
||||||
|
|
||||||
get clientId(): string {
|
get clientId(): string {
|
||||||
return this.data.clientId;
|
return this.data.clientId;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
import type { AllSettings } from '@server/lib/settings';
|
import type { AllSettings } from '@server/lib/settings';
|
||||||
|
|
||||||
const migrateRegionSetting = (settings: any): AllSettings => {
|
const migrateRegionSetting = (settings: any): AllSettings => {
|
||||||
|
if (
|
||||||
|
settings.main.discoverRegion !== undefined &&
|
||||||
|
settings.main.streamingRegion !== undefined
|
||||||
|
) {
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
|
||||||
const oldRegion = settings.main.region;
|
const oldRegion = settings.main.region;
|
||||||
if (oldRegion) {
|
if (oldRegion) {
|
||||||
settings.main.discoverRegion = oldRegion;
|
settings.main.discoverRegion = oldRegion;
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import type { AllSettings } from '@server/lib/settings';
|
||||||
|
|
||||||
|
const migrateNetworkSettings = (settings: any): AllSettings => {
|
||||||
|
if (settings.network) {
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
const newSettings = { ...settings };
|
||||||
|
newSettings.network = {
|
||||||
|
...settings.network,
|
||||||
|
csrfProtection: settings.main.csrfProtection ?? false,
|
||||||
|
trustProxy: settings.main.trustProxy ?? false,
|
||||||
|
forceIpv4First: settings.main.forceIpv4First ?? false,
|
||||||
|
dnsServers: settings.main.dnsServers ?? '',
|
||||||
|
proxy: settings.main.proxy ?? {
|
||||||
|
enabled: false,
|
||||||
|
hostname: '',
|
||||||
|
port: 8080,
|
||||||
|
useSsl: false,
|
||||||
|
user: '',
|
||||||
|
password: '',
|
||||||
|
bypassFilter: '',
|
||||||
|
bypassLocalAddresses: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
delete settings.main.csrfProtection;
|
||||||
|
delete settings.main.trustProxy;
|
||||||
|
delete settings.main.forceIpv4First;
|
||||||
|
delete settings.main.dnsServers;
|
||||||
|
delete settings.main.proxy;
|
||||||
|
return newSettings;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default migrateNetworkSettings;
|
||||||
@@ -263,6 +263,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
|
|||||||
// Try to find deviceId that corresponds to jellyfin user, else generate a new one
|
// Try to find deviceId that corresponds to jellyfin user, else generate a new one
|
||||||
let user = await userRepository.findOne({
|
let user = await userRepository.findOne({
|
||||||
where: { jellyfinUsername: body.username },
|
where: { jellyfinUsername: body.username },
|
||||||
|
select: { id: true, jellyfinDeviceId: true },
|
||||||
});
|
});
|
||||||
|
|
||||||
let deviceId = '';
|
let deviceId = '';
|
||||||
@@ -313,7 +314,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
|
|||||||
body.serverType !== MediaServerType.JELLYFIN &&
|
body.serverType !== MediaServerType.JELLYFIN &&
|
||||||
body.serverType !== MediaServerType.EMBY
|
body.serverType !== MediaServerType.EMBY
|
||||||
) {
|
) {
|
||||||
throw new Error('select_server_type');
|
throw new ApiError(500, ApiErrorCode.NoAdminUser);
|
||||||
}
|
}
|
||||||
settings.main.mediaServerType = body.serverType;
|
settings.main.mediaServerType = body.serverType;
|
||||||
|
|
||||||
@@ -533,6 +534,22 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
|
|||||||
message: e.errorCode,
|
message: e.errorCode,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
case ApiErrorCode.NoAdminUser:
|
||||||
|
logger.warn(
|
||||||
|
'Failed login attempt from user without admin permissions and no admin user exists',
|
||||||
|
{
|
||||||
|
label: 'Auth',
|
||||||
|
account: {
|
||||||
|
ip: req.ip,
|
||||||
|
email: body.username,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return next({
|
||||||
|
status: e.statusCode,
|
||||||
|
message: e.errorCode,
|
||||||
|
});
|
||||||
|
|
||||||
default:
|
default:
|
||||||
logger.error(e.message, { label: 'Auth' });
|
logger.error(e.message, { label: 'Auth' });
|
||||||
return next({
|
return next({
|
||||||
|
|||||||
@@ -78,6 +78,21 @@ settingsRoutes.post('/main', async (req, res) => {
|
|||||||
return res.status(200).json(settings.main);
|
return res.status(200).json(settings.main);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
settingsRoutes.get('/network', (req, res) => {
|
||||||
|
const settings = getSettings();
|
||||||
|
|
||||||
|
res.status(200).json(settings.network);
|
||||||
|
});
|
||||||
|
|
||||||
|
settingsRoutes.post('/network', async (req, res) => {
|
||||||
|
const settings = getSettings();
|
||||||
|
|
||||||
|
settings.network = merge(settings.network, req.body);
|
||||||
|
await settings.save();
|
||||||
|
|
||||||
|
return res.status(200).json(settings.network);
|
||||||
|
});
|
||||||
|
|
||||||
settingsRoutes.post('/main/regenerate', async (req, res, next) => {
|
settingsRoutes.post('/main/regenerate', async (req, res, next) => {
|
||||||
const settings = getSettings();
|
const settings = getSettings();
|
||||||
|
|
||||||
|
|||||||
@@ -70,11 +70,11 @@ router.get('/', async (req, res, next) => {
|
|||||||
query = query
|
query = query
|
||||||
.addSelect((subQuery) => {
|
.addSelect((subQuery) => {
|
||||||
return subQuery
|
return subQuery
|
||||||
.select('COUNT(request.id)', 'requestCount')
|
.select('COUNT(request.id)', 'request_count')
|
||||||
.from(MediaRequest, 'request')
|
.from(MediaRequest, 'request')
|
||||||
.where('request.requestedBy.id = user.id');
|
.where('request.requestedBy.id = user.id');
|
||||||
}, 'requestCount')
|
}, 'request_count')
|
||||||
.orderBy('requestCount', 'DESC');
|
.orderBy('request_count', 'DESC');
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
query = query.orderBy('user.id', 'ASC');
|
query = query.orderBy('user.id', 'ASC');
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { Agent, ProxyAgent, setGlobalDispatcher } from 'undici';
|
|||||||
export default async function createCustomProxyAgent(
|
export default async function createCustomProxyAgent(
|
||||||
proxySettings: ProxySettings
|
proxySettings: ProxySettings
|
||||||
) {
|
) {
|
||||||
const defaultAgent = new Agent();
|
const defaultAgent = new Agent({ keepAliveTimeout: 5000 });
|
||||||
|
|
||||||
const skipUrl = (url: string) => {
|
const skipUrl = (url: string) => {
|
||||||
const hostname = new URL(url).hostname;
|
const hostname = new URL(url).hostname;
|
||||||
@@ -63,6 +63,7 @@ export default async function createCustomProxyAgent(
|
|||||||
interceptors: {
|
interceptors: {
|
||||||
Client: [noProxyInterceptor],
|
Client: [noProxyInterceptor],
|
||||||
},
|
},
|
||||||
|
keepAliveTimeout: 5000,
|
||||||
});
|
});
|
||||||
|
|
||||||
setGlobalDispatcher(proxyAgent);
|
setGlobalDispatcher(proxyAgent);
|
||||||
|
|||||||
@@ -1,20 +1,25 @@
|
|||||||
import type { MainSettings } from '@server/lib/settings';
|
import type { AllSettings, NetworkSettings } from '@server/lib/settings';
|
||||||
import { getSettings } from '@server/lib/settings';
|
import { getSettings } from '@server/lib/settings';
|
||||||
|
|
||||||
class RestartFlag {
|
class RestartFlag {
|
||||||
private settings: MainSettings;
|
private networkSettings: NetworkSettings;
|
||||||
|
|
||||||
public initializeSettings(settings: MainSettings): void {
|
public initializeSettings(settings: AllSettings): void {
|
||||||
this.settings = { ...settings };
|
this.networkSettings = {
|
||||||
|
...settings.network,
|
||||||
|
proxy: { ...settings.network.proxy },
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public isSet(): boolean {
|
public isSet(): boolean {
|
||||||
const settings = getSettings().main;
|
const networkSettings = getSettings().network;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
this.settings.csrfProtection !== settings.csrfProtection ||
|
this.networkSettings.csrfProtection !== networkSettings.csrfProtection ||
|
||||||
this.settings.trustProxy !== settings.trustProxy ||
|
this.networkSettings.trustProxy !== networkSettings.trustProxy ||
|
||||||
this.settings.proxy.enabled !== settings.proxy.enabled
|
this.networkSettings.proxy.enabled !== networkSettings.proxy.enabled ||
|
||||||
|
this.networkSettings.forceIpv4First !== networkSettings.forceIpv4First ||
|
||||||
|
this.networkSettings.dnsServers !== networkSettings.dnsServers
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 9.8 KiB |
@@ -34,6 +34,7 @@ const messages = defineMessages('components.Login', {
|
|||||||
validationUrlBaseTrailingSlash: 'URL base must not end in a trailing slash',
|
validationUrlBaseTrailingSlash: 'URL base must not end in a trailing slash',
|
||||||
loginerror: 'Something went wrong while trying to sign in.',
|
loginerror: 'Something went wrong while trying to sign in.',
|
||||||
adminerror: 'You must use an admin account to sign in.',
|
adminerror: 'You must use an admin account to sign in.',
|
||||||
|
noadminerror: 'No admin user found on the server.',
|
||||||
credentialerror: 'The username or password is incorrect.',
|
credentialerror: 'The username or password is incorrect.',
|
||||||
invalidurlerror: 'Unable to connect to {mediaServerName} server.',
|
invalidurlerror: 'Unable to connect to {mediaServerName} server.',
|
||||||
signingin: 'Signing in…',
|
signingin: 'Signing in…',
|
||||||
@@ -157,6 +158,9 @@ const JellyfinLogin: React.FC<JellyfinLoginProps> = ({
|
|||||||
case ApiErrorCode.NotAdmin:
|
case ApiErrorCode.NotAdmin:
|
||||||
errorMessage = messages.adminerror;
|
errorMessage = messages.adminerror;
|
||||||
break;
|
break;
|
||||||
|
case ApiErrorCode.NoAdminUser:
|
||||||
|
errorMessage = messages.noadminerror;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
errorMessage = messages.loginerror;
|
errorMessage = messages.loginerror;
|
||||||
break;
|
break;
|
||||||
@@ -388,14 +392,35 @@ const JellyfinLogin: React.FC<JellyfinLoginProps> = ({
|
|||||||
email: values.username,
|
email: values.username,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
if (!res.ok) throw new Error();
|
if (!res.ok) throw new Error(res.statusText, { cause: res });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
let errorData;
|
||||||
|
try {
|
||||||
|
errorData = await e.cause?.text();
|
||||||
|
errorData = JSON.parse(errorData);
|
||||||
|
} catch {
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
let errorMessage = null;
|
||||||
|
switch (errorData?.message) {
|
||||||
|
case ApiErrorCode.InvalidUrl:
|
||||||
|
errorMessage = messages.invalidurlerror;
|
||||||
|
break;
|
||||||
|
case ApiErrorCode.InvalidCredentials:
|
||||||
|
errorMessage = messages.credentialerror;
|
||||||
|
break;
|
||||||
|
case ApiErrorCode.NotAdmin:
|
||||||
|
errorMessage = messages.adminerror;
|
||||||
|
break;
|
||||||
|
case ApiErrorCode.NoAdminUser:
|
||||||
|
errorMessage = messages.noadminerror;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
errorMessage = messages.loginerror;
|
||||||
|
break;
|
||||||
|
}
|
||||||
toasts.addToast(
|
toasts.addToast(
|
||||||
intl.formatMessage(
|
intl.formatMessage(errorMessage, mediaServerFormatValues),
|
||||||
e.message == 'Request failed with status code 401'
|
|
||||||
? messages.credentialerror
|
|
||||||
: messages.loginerror
|
|
||||||
),
|
|
||||||
{
|
{
|
||||||
autoDismiss: true,
|
autoDismiss: true,
|
||||||
appearance: 'error',
|
appearance: 'error',
|
||||||
|
|||||||
@@ -38,14 +38,14 @@ import {
|
|||||||
ExclamationTriangleIcon,
|
ExclamationTriangleIcon,
|
||||||
EyeSlashIcon,
|
EyeSlashIcon,
|
||||||
FilmIcon,
|
FilmIcon,
|
||||||
|
MinusCircleIcon,
|
||||||
PlayIcon,
|
PlayIcon,
|
||||||
|
StarIcon,
|
||||||
TicketIcon,
|
TicketIcon,
|
||||||
} from '@heroicons/react/24/outline';
|
} from '@heroicons/react/24/outline';
|
||||||
import {
|
import {
|
||||||
ChevronDoubleDownIcon,
|
ChevronDoubleDownIcon,
|
||||||
ChevronDoubleUpIcon,
|
ChevronDoubleUpIcon,
|
||||||
MinusCircleIcon,
|
|
||||||
StarIcon,
|
|
||||||
} from '@heroicons/react/24/solid';
|
} from '@heroicons/react/24/solid';
|
||||||
import { type RatingResponse } from '@server/api/ratings';
|
import { type RatingResponse } from '@server/api/ratings';
|
||||||
import { IssueStatus } from '@server/constants/issue';
|
import { IssueStatus } from '@server/constants/issue';
|
||||||
@@ -102,7 +102,7 @@ const messages = defineMessages('components.MovieDetails', {
|
|||||||
watchlistSuccess: '<strong>{title}</strong> added to watchlist successfully!',
|
watchlistSuccess: '<strong>{title}</strong> added to watchlist successfully!',
|
||||||
watchlistDeleted:
|
watchlistDeleted:
|
||||||
'<strong>{title}</strong> Removed from watchlist successfully!',
|
'<strong>{title}</strong> Removed from watchlist successfully!',
|
||||||
watchlistError: 'Something went wrong try again.',
|
watchlistError: 'Something went wrong. Please try again.',
|
||||||
removefromwatchlist: 'Remove From Watchlist',
|
removefromwatchlist: 'Remove From Watchlist',
|
||||||
addtowatchlist: 'Add To Watchlist',
|
addtowatchlist: 'Add To Watchlist',
|
||||||
});
|
});
|
||||||
@@ -190,7 +190,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
mediaLinks.push({
|
mediaLinks.push({
|
||||||
text: getAvalaibleMediaServerName(),
|
text: getAvailableMediaServerName(),
|
||||||
url: plexUrl,
|
url: plexUrl,
|
||||||
svg: <PlayIcon />,
|
svg: <PlayIcon />,
|
||||||
});
|
});
|
||||||
@@ -204,7 +204,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
mediaLinks.push({
|
mediaLinks.push({
|
||||||
text: getAvalaible4kMediaServerName(),
|
text: getAvailable4kMediaServerName(),
|
||||||
url: plexUrl4k,
|
url: plexUrl4k,
|
||||||
svg: <PlayIcon />,
|
svg: <PlayIcon />,
|
||||||
});
|
});
|
||||||
@@ -292,7 +292,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|||||||
(provider) => provider.iso_3166_1 === streamingRegion
|
(provider) => provider.iso_3166_1 === streamingRegion
|
||||||
)?.flatrate ?? [];
|
)?.flatrate ?? [];
|
||||||
|
|
||||||
function getAvalaibleMediaServerName() {
|
function getAvailableMediaServerName() {
|
||||||
if (settings.currentSettings.mediaServerType === MediaServerType.EMBY) {
|
if (settings.currentSettings.mediaServerType === MediaServerType.EMBY) {
|
||||||
return intl.formatMessage(messages.play, { mediaServerName: 'Emby' });
|
return intl.formatMessage(messages.play, { mediaServerName: 'Emby' });
|
||||||
}
|
}
|
||||||
@@ -304,7 +304,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|||||||
return intl.formatMessage(messages.play, { mediaServerName: 'Jellyfin' });
|
return intl.formatMessage(messages.play, { mediaServerName: 'Jellyfin' });
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAvalaible4kMediaServerName() {
|
function getAvailable4kMediaServerName() {
|
||||||
if (settings.currentSettings.mediaServerType === MediaServerType.EMBY) {
|
if (settings.currentSettings.mediaServerType === MediaServerType.EMBY) {
|
||||||
return intl.formatMessage(messages.play, { mediaServerName: 'Emby' });
|
return intl.formatMessage(messages.play, { mediaServerName: 'Emby' });
|
||||||
}
|
}
|
||||||
@@ -1063,14 +1063,26 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{!!streamingProviders.length && (
|
{!!streamingProviders.length && (
|
||||||
<div className="media-fact">
|
<div className="media-fact flex-col gap-1">
|
||||||
<span>{intl.formatMessage(messages.streamingproviders)}</span>
|
<span>{intl.formatMessage(messages.streamingproviders)}</span>
|
||||||
<span className="media-fact-value">
|
<span className="media-fact-value flex flex-row flex-wrap gap-5">
|
||||||
{streamingProviders.map((p) => {
|
{streamingProviders.map((p) => {
|
||||||
return (
|
return (
|
||||||
<span className="block" key={`provider-${p.id}`}>
|
<Tooltip content={p.name}>
|
||||||
{p.name}
|
<span
|
||||||
</span>
|
className="opacity-50 transition duration-300 hover:opacity-100"
|
||||||
|
key={`provider-${p.id}`}
|
||||||
|
>
|
||||||
|
<CachedImage
|
||||||
|
type="tmdb"
|
||||||
|
src={'https://image.tmdb.org/t/p/w45/' + p.logoPath}
|
||||||
|
alt={p.name}
|
||||||
|
width={32}
|
||||||
|
height={32}
|
||||||
|
className="rounded-md"
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
</Tooltip>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -220,8 +220,8 @@ const RequestList = () => {
|
|||||||
</select>
|
</select>
|
||||||
<Tooltip content={intl.formatMessage(messages.sortDirection)}>
|
<Tooltip content={intl.formatMessage(messages.sortDirection)}>
|
||||||
<Button
|
<Button
|
||||||
buttonType="ghost"
|
buttonType="default"
|
||||||
className="z-40 mr-2 rounded-l-none"
|
className="z-40 mr-2 rounded-l-none border !border-gray-500 !bg-gray-800 !px-3 !text-gray-500 hover:!bg-gray-400 hover:!text-white"
|
||||||
buttonSize="md"
|
buttonSize="md"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
setCurrentSortDirection(
|
setCurrentSortDirection(
|
||||||
@@ -230,9 +230,9 @@ const RequestList = () => {
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
{currentSortDirection === 'asc' ? (
|
{currentSortDirection === 'asc' ? (
|
||||||
<ArrowUpIcon className="h-3" />
|
<ArrowUpIcon className="h-6 w-6" />
|
||||||
) : (
|
) : (
|
||||||
<ArrowDownIcon className="h-3" />
|
<ArrowDownIcon className="h-6 w-6" />
|
||||||
)}
|
)}
|
||||||
</Button>
|
</Button>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|||||||
@@ -256,8 +256,8 @@ const TvRequestModal = ({
|
|||||||
let allSeasons = (data?.seasons ?? []).filter(
|
let allSeasons = (data?.seasons ?? []).filter(
|
||||||
(season) => season.episodeCount !== 0
|
(season) => season.episodeCount !== 0
|
||||||
);
|
);
|
||||||
if (!settings.currentSettings.partialRequestsEnabled) {
|
if (!settings.currentSettings.enableSpecialEpisodes) {
|
||||||
allSeasons = allSeasons.filter((season) => season.seasonNumber !== 0);
|
allSeasons = allSeasons.filter((season) => season.seasonNumber > 0);
|
||||||
}
|
}
|
||||||
return allSeasons.map((season) => season.seasonNumber);
|
return allSeasons.map((season) => season.seasonNumber);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -773,38 +773,42 @@ const RadarrModal = ({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h3 className="mb-4 text-xl font-bold leading-8 text-gray-100">
|
{radarr && (
|
||||||
{intl.formatMessage(messages.overrideRules)}
|
<>
|
||||||
</h3>
|
<h3 className="mb-4 text-xl font-bold leading-8 text-gray-100">
|
||||||
<ul className="grid grid-cols-2 gap-6">
|
{intl.formatMessage(messages.overrideRules)}
|
||||||
{rules && (
|
</h3>
|
||||||
<OverrideRuleTile
|
<ul className="grid gap-x-4 gap-y-8 sm:grid-cols-3 sm:gap-x-6 sm:gap-y-6 lg:grid-cols-2">
|
||||||
rules={rules}
|
{rules && (
|
||||||
setOverrideRuleModal={setOverrideRuleModal}
|
<OverrideRuleTile
|
||||||
testResponse={testResponse}
|
rules={rules}
|
||||||
radarr={radarr}
|
setOverrideRuleModal={setOverrideRuleModal}
|
||||||
revalidate={revalidate}
|
testResponse={testResponse}
|
||||||
/>
|
radarr={radarr}
|
||||||
)}
|
revalidate={revalidate}
|
||||||
<li className="min-h-[8rem] rounded-lg border-2 border-dashed border-gray-400 shadow sm:min-h-[11rem]">
|
/>
|
||||||
<div className="flex h-full w-full items-center justify-center">
|
)}
|
||||||
<Button
|
<li className="min-h-[8rem] rounded-lg border-2 border-dashed border-gray-400 shadow sm:min-h-[11rem]">
|
||||||
buttonType="ghost"
|
<div className="flex h-full w-full items-center justify-center">
|
||||||
onClick={() =>
|
<Button
|
||||||
setOverrideRuleModal({
|
buttonType="ghost"
|
||||||
open: true,
|
onClick={() =>
|
||||||
rule: null,
|
setOverrideRuleModal({
|
||||||
testResponse,
|
open: true,
|
||||||
})
|
rule: null,
|
||||||
}
|
testResponse,
|
||||||
disabled={!isValidated}
|
})
|
||||||
>
|
}
|
||||||
<PlusIcon />
|
disabled={!isValidated}
|
||||||
<span>{intl.formatMessage(messages.addrule)}</span>
|
>
|
||||||
</Button>
|
<PlusIcon />
|
||||||
</div>
|
<span>{intl.formatMessage(messages.addrule)}</span>
|
||||||
</li>
|
</Button>
|
||||||
</ul>
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ const messages = defineMessages('components.Settings', {
|
|||||||
menuPlexSettings: 'Plex',
|
menuPlexSettings: 'Plex',
|
||||||
menuJellyfinSettings: '{mediaServerName}',
|
menuJellyfinSettings: '{mediaServerName}',
|
||||||
menuServices: 'Services',
|
menuServices: 'Services',
|
||||||
|
menuNetwork: 'Network',
|
||||||
menuNotifications: 'Notifications',
|
menuNotifications: 'Notifications',
|
||||||
menuLogs: 'Logs',
|
menuLogs: 'Logs',
|
||||||
menuJobs: 'Jobs & Cache',
|
menuJobs: 'Jobs & Cache',
|
||||||
@@ -53,6 +54,11 @@ const SettingsLayout = ({ children }: SettingsLayoutProps) => {
|
|||||||
route: '/settings/services',
|
route: '/settings/services',
|
||||||
regex: /^\/settings\/services/,
|
regex: /^\/settings\/services/,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
text: intl.formatMessage(messages.menuNetwork),
|
||||||
|
route: '/settings/network',
|
||||||
|
regex: /^\/settings\/network/,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
text: intl.formatMessage(messages.menuNotifications),
|
text: intl.formatMessage(messages.menuNotifications),
|
||||||
route: '/settings/notifications/email',
|
route: '/settings/notifications/email',
|
||||||
|
|||||||
@@ -245,7 +245,9 @@ const SettingsLogs = () => {
|
|||||||
<p className="description">
|
<p className="description">
|
||||||
{intl.formatMessage(messages.logsDescription, {
|
{intl.formatMessage(messages.logsDescription, {
|
||||||
code: (msg: React.ReactNode) => (
|
code: (msg: React.ReactNode) => (
|
||||||
<code className="bg-opacity-50">{msg}</code>
|
<code className="whitespace-normal break-words bg-opacity-50">
|
||||||
|
{msg}
|
||||||
|
</code>
|
||||||
),
|
),
|
||||||
appDataPath: appData ? appData.appDataPath : '/app/config',
|
appDataPath: appData ? appData.appDataPath : '/app/config',
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import Button from '@app/components/Common/Button';
|
|||||||
import LoadingSpinner from '@app/components/Common/LoadingSpinner';
|
import LoadingSpinner from '@app/components/Common/LoadingSpinner';
|
||||||
import PageTitle from '@app/components/Common/PageTitle';
|
import PageTitle from '@app/components/Common/PageTitle';
|
||||||
import SensitiveInput from '@app/components/Common/SensitiveInput';
|
import SensitiveInput from '@app/components/Common/SensitiveInput';
|
||||||
import Tooltip from '@app/components/Common/Tooltip';
|
|
||||||
import LanguageSelector from '@app/components/LanguageSelector';
|
import LanguageSelector from '@app/components/LanguageSelector';
|
||||||
import RegionSelector from '@app/components/RegionSelector';
|
import RegionSelector from '@app/components/RegionSelector';
|
||||||
import CopyButton from '@app/components/Settings/CopyButton';
|
import CopyButton from '@app/components/Settings/CopyButton';
|
||||||
@@ -42,33 +41,15 @@ const messages = defineMessages('components.Settings.SettingsMain', {
|
|||||||
toastSettingsSuccess: 'Settings saved successfully!',
|
toastSettingsSuccess: 'Settings saved successfully!',
|
||||||
toastSettingsFailure: 'Something went wrong while saving settings.',
|
toastSettingsFailure: 'Something went wrong while saving settings.',
|
||||||
hideAvailable: 'Hide Available Media',
|
hideAvailable: 'Hide Available Media',
|
||||||
csrfProtection: 'Enable CSRF Protection',
|
|
||||||
csrfProtectionTip: 'Set external API access to read-only (requires HTTPS)',
|
|
||||||
csrfProtectionHoverTip:
|
|
||||||
'Do NOT enable this setting unless you understand what you are doing!',
|
|
||||||
cacheImages: 'Enable Image Caching',
|
cacheImages: 'Enable Image Caching',
|
||||||
cacheImagesTip:
|
cacheImagesTip:
|
||||||
'Cache externally sourced images (requires a significant amount of disk space)',
|
'Cache externally sourced images (requires a significant amount of disk space)',
|
||||||
trustProxy: 'Enable Proxy Support',
|
|
||||||
trustProxyTip:
|
|
||||||
'Allow Jellyseerr to correctly register client IP addresses behind a proxy',
|
|
||||||
validationApplicationTitle: 'You must provide an application title',
|
validationApplicationTitle: 'You must provide an application title',
|
||||||
validationApplicationUrl: 'You must provide a valid URL',
|
validationApplicationUrl: 'You must provide a valid URL',
|
||||||
validationApplicationUrlTrailingSlash: 'URL must not end in a trailing slash',
|
validationApplicationUrlTrailingSlash: 'URL must not end in a trailing slash',
|
||||||
partialRequestsEnabled: 'Allow Partial Series Requests',
|
partialRequestsEnabled: 'Allow Partial Series Requests',
|
||||||
enableSpecialEpisodes: 'Allow Special Episodes Requests',
|
enableSpecialEpisodes: 'Allow Special Episodes Requests',
|
||||||
locale: 'Display Language',
|
locale: 'Display Language',
|
||||||
proxyEnabled: 'HTTP(S) Proxy',
|
|
||||||
proxyHostname: 'Proxy Hostname',
|
|
||||||
proxyPort: 'Proxy Port',
|
|
||||||
proxySsl: 'Use SSL For Proxy',
|
|
||||||
proxyUser: 'Proxy Username',
|
|
||||||
proxyPassword: 'Proxy Password',
|
|
||||||
proxyBypassFilter: 'Proxy Ignored Addresses',
|
|
||||||
proxyBypassFilterTip:
|
|
||||||
"Use ',' as a separator, and '*.' as a wildcard for subdomains",
|
|
||||||
proxyBypassLocalAddresses: 'Bypass Proxy for Local Addresses',
|
|
||||||
validationProxyPort: 'You must provide a valid port',
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const SettingsMain = () => {
|
const SettingsMain = () => {
|
||||||
@@ -99,12 +80,6 @@ const SettingsMain = () => {
|
|||||||
intl.formatMessage(messages.validationApplicationUrlTrailingSlash),
|
intl.formatMessage(messages.validationApplicationUrlTrailingSlash),
|
||||||
(value) => !value || !value.endsWith('/')
|
(value) => !value || !value.endsWith('/')
|
||||||
),
|
),
|
||||||
proxyPort: Yup.number().when('proxyEnabled', {
|
|
||||||
is: (proxyEnabled: boolean) => proxyEnabled,
|
|
||||||
then: Yup.number().required(
|
|
||||||
intl.formatMessage(messages.validationProxyPort)
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const regenerate = async () => {
|
const regenerate = async () => {
|
||||||
@@ -152,24 +127,14 @@ const SettingsMain = () => {
|
|||||||
initialValues={{
|
initialValues={{
|
||||||
applicationTitle: data?.applicationTitle,
|
applicationTitle: data?.applicationTitle,
|
||||||
applicationUrl: data?.applicationUrl,
|
applicationUrl: data?.applicationUrl,
|
||||||
csrfProtection: data?.csrfProtection,
|
|
||||||
hideAvailable: data?.hideAvailable,
|
hideAvailable: data?.hideAvailable,
|
||||||
locale: data?.locale ?? 'en',
|
locale: data?.locale ?? 'en',
|
||||||
discoverRegion: data?.discoverRegion,
|
discoverRegion: data?.discoverRegion,
|
||||||
originalLanguage: data?.originalLanguage,
|
originalLanguage: data?.originalLanguage,
|
||||||
streamingRegion: data?.streamingRegion,
|
streamingRegion: data?.streamingRegion || 'US',
|
||||||
partialRequestsEnabled: data?.partialRequestsEnabled,
|
partialRequestsEnabled: data?.partialRequestsEnabled,
|
||||||
enableSpecialEpisodes: data?.enableSpecialEpisodes,
|
enableSpecialEpisodes: data?.enableSpecialEpisodes,
|
||||||
trustProxy: data?.trustProxy,
|
|
||||||
cacheImages: data?.cacheImages,
|
cacheImages: data?.cacheImages,
|
||||||
proxyEnabled: data?.proxy?.enabled,
|
|
||||||
proxyHostname: data?.proxy?.hostname,
|
|
||||||
proxyPort: data?.proxy?.port,
|
|
||||||
proxySsl: data?.proxy?.useSsl,
|
|
||||||
proxyUser: data?.proxy?.user,
|
|
||||||
proxyPassword: data?.proxy?.password,
|
|
||||||
proxyBypassFilter: data?.proxy?.bypassFilter,
|
|
||||||
proxyBypassLocalAddresses: data?.proxy?.bypassLocalAddresses,
|
|
||||||
}}
|
}}
|
||||||
enableReinitialize
|
enableReinitialize
|
||||||
validationSchema={MainSettingsSchema}
|
validationSchema={MainSettingsSchema}
|
||||||
@@ -183,7 +148,6 @@ const SettingsMain = () => {
|
|||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
applicationTitle: values.applicationTitle,
|
applicationTitle: values.applicationTitle,
|
||||||
applicationUrl: values.applicationUrl,
|
applicationUrl: values.applicationUrl,
|
||||||
csrfProtection: values.csrfProtection,
|
|
||||||
hideAvailable: values.hideAvailable,
|
hideAvailable: values.hideAvailable,
|
||||||
locale: values.locale,
|
locale: values.locale,
|
||||||
discoverRegion: values.discoverRegion,
|
discoverRegion: values.discoverRegion,
|
||||||
@@ -191,18 +155,7 @@ const SettingsMain = () => {
|
|||||||
originalLanguage: values.originalLanguage,
|
originalLanguage: values.originalLanguage,
|
||||||
partialRequestsEnabled: values.partialRequestsEnabled,
|
partialRequestsEnabled: values.partialRequestsEnabled,
|
||||||
enableSpecialEpisodes: values.enableSpecialEpisodes,
|
enableSpecialEpisodes: values.enableSpecialEpisodes,
|
||||||
trustProxy: values.trustProxy,
|
|
||||||
cacheImages: values.cacheImages,
|
cacheImages: values.cacheImages,
|
||||||
proxy: {
|
|
||||||
enabled: values.proxyEnabled,
|
|
||||||
hostname: values.proxyHostname,
|
|
||||||
port: values.proxyPort,
|
|
||||||
useSsl: values.proxySsl,
|
|
||||||
user: values.proxyUser,
|
|
||||||
password: values.proxyPassword,
|
|
||||||
bypassFilter: values.proxyBypassFilter,
|
|
||||||
bypassLocalAddresses: values.proxyBypassLocalAddresses,
|
|
||||||
},
|
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
if (!res.ok) throw new Error();
|
if (!res.ok) throw new Error();
|
||||||
@@ -311,58 +264,6 @@ const SettingsMain = () => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-row">
|
|
||||||
<label htmlFor="trustProxy" className="checkbox-label">
|
|
||||||
<span className="mr-2">
|
|
||||||
{intl.formatMessage(messages.trustProxy)}
|
|
||||||
</span>
|
|
||||||
<SettingsBadge badgeType="restartRequired" />
|
|
||||||
<span className="label-tip">
|
|
||||||
{intl.formatMessage(messages.trustProxyTip)}
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<Field
|
|
||||||
type="checkbox"
|
|
||||||
id="trustProxy"
|
|
||||||
name="trustProxy"
|
|
||||||
onChange={() => {
|
|
||||||
setFieldValue('trustProxy', !values.trustProxy);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="form-row">
|
|
||||||
<label htmlFor="csrfProtection" className="checkbox-label">
|
|
||||||
<span className="mr-2">
|
|
||||||
{intl.formatMessage(messages.csrfProtection)}
|
|
||||||
</span>
|
|
||||||
<SettingsBadge badgeType="advanced" className="mr-2" />
|
|
||||||
<SettingsBadge badgeType="restartRequired" />
|
|
||||||
<span className="label-tip">
|
|
||||||
{intl.formatMessage(messages.csrfProtectionTip)}
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<Tooltip
|
|
||||||
content={intl.formatMessage(
|
|
||||||
messages.csrfProtectionHoverTip
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<Field
|
|
||||||
type="checkbox"
|
|
||||||
id="csrfProtection"
|
|
||||||
name="csrfProtection"
|
|
||||||
onChange={() => {
|
|
||||||
setFieldValue(
|
|
||||||
'csrfProtection',
|
|
||||||
!values.csrfProtection
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="form-row">
|
<div className="form-row">
|
||||||
<label htmlFor="cacheImages" className="checkbox-label">
|
<label htmlFor="cacheImages" className="checkbox-label">
|
||||||
<span className="mr-2">
|
<span className="mr-2">
|
||||||
@@ -433,7 +334,7 @@ const SettingsMain = () => {
|
|||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
<div className="form-input-area">
|
<div className="form-input-area">
|
||||||
<div className="form-input-field">
|
<div className="form-input-field relative z-30">
|
||||||
<LanguageSelector
|
<LanguageSelector
|
||||||
setFieldValue={setFieldValue}
|
setFieldValue={setFieldValue}
|
||||||
value={values.originalLanguage}
|
value={values.originalLanguage}
|
||||||
@@ -449,9 +350,9 @@ const SettingsMain = () => {
|
|||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
<div className="form-input-area">
|
<div className="form-input-area">
|
||||||
<div className="form-input-field">
|
<div className="form-input-field relative z-20">
|
||||||
<RegionSelector
|
<RegionSelector
|
||||||
value={values.streamingRegion || 'US'}
|
value={values.streamingRegion}
|
||||||
name="streamingRegion"
|
name="streamingRegion"
|
||||||
onChange={setFieldValue}
|
onChange={setFieldValue}
|
||||||
regionType="streaming"
|
regionType="streaming"
|
||||||
@@ -524,182 +425,6 @@ const SettingsMain = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-row">
|
|
||||||
<label htmlFor="proxyEnabled" className="checkbox-label">
|
|
||||||
<span className="mr-2">
|
|
||||||
{intl.formatMessage(messages.proxyEnabled)}
|
|
||||||
</span>
|
|
||||||
<SettingsBadge badgeType="advanced" className="mr-2" />
|
|
||||||
<SettingsBadge badgeType="restartRequired" />
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<Field
|
|
||||||
type="checkbox"
|
|
||||||
id="proxyEnabled"
|
|
||||||
name="proxyEnabled"
|
|
||||||
onChange={() => {
|
|
||||||
setFieldValue('proxyEnabled', !values.proxyEnabled);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{values.proxyEnabled && (
|
|
||||||
<>
|
|
||||||
<div className="mr-2 ml-4">
|
|
||||||
<div className="form-row">
|
|
||||||
<label
|
|
||||||
htmlFor="proxyHostname"
|
|
||||||
className="checkbox-label"
|
|
||||||
>
|
|
||||||
{intl.formatMessage(messages.proxyHostname)}
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<div className="form-input-field">
|
|
||||||
<Field
|
|
||||||
id="proxyHostname"
|
|
||||||
name="proxyHostname"
|
|
||||||
type="text"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{errors.proxyHostname &&
|
|
||||||
touched.proxyHostname &&
|
|
||||||
typeof errors.proxyHostname === 'string' && (
|
|
||||||
<div className="error">
|
|
||||||
{errors.proxyHostname}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="form-row">
|
|
||||||
<label htmlFor="proxyPort" className="checkbox-label">
|
|
||||||
{intl.formatMessage(messages.proxyPort)}
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<div className="form-input-field">
|
|
||||||
<Field
|
|
||||||
id="proxyPort"
|
|
||||||
name="proxyPort"
|
|
||||||
type="text"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{errors.proxyPort &&
|
|
||||||
touched.proxyPort &&
|
|
||||||
typeof errors.proxyPort === 'string' && (
|
|
||||||
<div className="error">{errors.proxyPort}</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="form-row">
|
|
||||||
<label htmlFor="proxySsl" className="checkbox-label">
|
|
||||||
{intl.formatMessage(messages.proxySsl)}
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<Field
|
|
||||||
type="checkbox"
|
|
||||||
id="proxySsl"
|
|
||||||
name="proxySsl"
|
|
||||||
onChange={() => {
|
|
||||||
setFieldValue('proxySsl', !values.proxySsl);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="form-row">
|
|
||||||
<label htmlFor="proxyUser" className="checkbox-label">
|
|
||||||
{intl.formatMessage(messages.proxyUser)}
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<div className="form-input-field">
|
|
||||||
<Field
|
|
||||||
id="proxyUser"
|
|
||||||
name="proxyUser"
|
|
||||||
type="text"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{errors.proxyUser &&
|
|
||||||
touched.proxyUser &&
|
|
||||||
typeof errors.proxyUser === 'string' && (
|
|
||||||
<div className="error">{errors.proxyUser}</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="form-row">
|
|
||||||
<label
|
|
||||||
htmlFor="proxyPassword"
|
|
||||||
className="checkbox-label"
|
|
||||||
>
|
|
||||||
{intl.formatMessage(messages.proxyPassword)}
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<div className="form-input-field">
|
|
||||||
<Field
|
|
||||||
id="proxyPassword"
|
|
||||||
name="proxyPassword"
|
|
||||||
type="password"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{errors.proxyPassword &&
|
|
||||||
touched.proxyPassword &&
|
|
||||||
typeof errors.proxyPassword === 'string' && (
|
|
||||||
<div className="error">
|
|
||||||
{errors.proxyPassword}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="form-row">
|
|
||||||
<label
|
|
||||||
htmlFor="proxyBypassFilter"
|
|
||||||
className="checkbox-label"
|
|
||||||
>
|
|
||||||
{intl.formatMessage(messages.proxyBypassFilter)}
|
|
||||||
<span className="label-tip">
|
|
||||||
{intl.formatMessage(messages.proxyBypassFilterTip)}
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<div className="form-input-field">
|
|
||||||
<Field
|
|
||||||
id="proxyBypassFilter"
|
|
||||||
name="proxyBypassFilter"
|
|
||||||
type="text"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{errors.proxyBypassFilter &&
|
|
||||||
touched.proxyBypassFilter &&
|
|
||||||
typeof errors.proxyBypassFilter === 'string' && (
|
|
||||||
<div className="error">
|
|
||||||
{errors.proxyBypassFilter}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="form-row">
|
|
||||||
<label
|
|
||||||
htmlFor="proxyBypassLocalAddresses"
|
|
||||||
className="checkbox-label"
|
|
||||||
>
|
|
||||||
{intl.formatMessage(
|
|
||||||
messages.proxyBypassLocalAddresses
|
|
||||||
)}
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<Field
|
|
||||||
type="checkbox"
|
|
||||||
id="proxyBypassLocalAddresses"
|
|
||||||
name="proxyBypassLocalAddresses"
|
|
||||||
onChange={() => {
|
|
||||||
setFieldValue(
|
|
||||||
'proxyBypassLocalAddresses',
|
|
||||||
!values.proxyBypassLocalAddresses
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
<div className="actions">
|
<div className="actions">
|
||||||
<div className="flex justify-end">
|
<div className="flex justify-end">
|
||||||
<span className="ml-3 inline-flex rounded-md shadow-sm">
|
<span className="ml-3 inline-flex rounded-md shadow-sm">
|
||||||
|
|||||||
461
src/components/Settings/SettingsNetwork/index.tsx
Normal file
461
src/components/Settings/SettingsNetwork/index.tsx
Normal file
@@ -0,0 +1,461 @@
|
|||||||
|
import Button from '@app/components/Common/Button';
|
||||||
|
import LoadingSpinner from '@app/components/Common/LoadingSpinner';
|
||||||
|
import PageTitle from '@app/components/Common/PageTitle';
|
||||||
|
import Tooltip from '@app/components/Common/Tooltip';
|
||||||
|
import SettingsBadge from '@app/components/Settings/SettingsBadge';
|
||||||
|
import globalMessages from '@app/i18n/globalMessages';
|
||||||
|
import defineMessages from '@app/utils/defineMessages';
|
||||||
|
import { ArrowDownOnSquareIcon } from '@heroicons/react/24/outline';
|
||||||
|
import type { NetworkSettings } from '@server/lib/settings';
|
||||||
|
import { Field, Form, Formik } from 'formik';
|
||||||
|
import { useIntl } from 'react-intl';
|
||||||
|
import { useToasts } from 'react-toast-notifications';
|
||||||
|
import useSWR, { mutate } from 'swr';
|
||||||
|
import * as Yup from 'yup';
|
||||||
|
|
||||||
|
const messages = defineMessages('components.Settings.SettingsNetwork', {
|
||||||
|
toastSettingsSuccess: 'Settings saved successfully!',
|
||||||
|
toastSettingsFailure: 'Something went wrong while saving settings.',
|
||||||
|
network: 'Network',
|
||||||
|
networksettings: 'Network Settings',
|
||||||
|
networksettingsDescription:
|
||||||
|
'Configure network settings for your Jellyseerr instance.',
|
||||||
|
csrfProtection: 'Enable CSRF Protection',
|
||||||
|
csrfProtectionTip: 'Set external API access to read-only (requires HTTPS)',
|
||||||
|
csrfProtectionHoverTip:
|
||||||
|
'Do NOT enable this setting unless you understand what you are doing!',
|
||||||
|
trustProxy: 'Enable Proxy Support',
|
||||||
|
trustProxyTip:
|
||||||
|
'Allow Jellyseerr to correctly register client IP addresses behind a proxy',
|
||||||
|
forceIpv4First: 'IPv4 Resolution First',
|
||||||
|
forceIpv4FirstTip:
|
||||||
|
'Force Jellyseerr to resolve IPv4 addresses first instead of IPv6',
|
||||||
|
dnsServers: 'Custom DNS Servers',
|
||||||
|
dnsServersTip:
|
||||||
|
'Comma-separated list of custom DNS servers, e.g. "1.1.1.1,[2606:4700:4700::1111]"',
|
||||||
|
proxyEnabled: 'HTTP(S) Proxy',
|
||||||
|
proxyHostname: 'Proxy Hostname',
|
||||||
|
proxyPort: 'Proxy Port',
|
||||||
|
proxySsl: 'Use SSL For Proxy',
|
||||||
|
proxyUser: 'Proxy Username',
|
||||||
|
proxyPassword: 'Proxy Password',
|
||||||
|
proxyBypassFilter: 'Proxy Ignored Addresses',
|
||||||
|
proxyBypassFilterTip:
|
||||||
|
"Use ',' as a separator, and '*.' as a wildcard for subdomains",
|
||||||
|
proxyBypassLocalAddresses: 'Bypass Proxy for Local Addresses',
|
||||||
|
validationProxyPort: 'You must provide a valid port',
|
||||||
|
});
|
||||||
|
|
||||||
|
const SettingsMain = () => {
|
||||||
|
const { addToast } = useToasts();
|
||||||
|
const intl = useIntl();
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
error,
|
||||||
|
mutate: revalidate,
|
||||||
|
} = useSWR<NetworkSettings>('/api/v1/settings/network');
|
||||||
|
|
||||||
|
const NetworkSettingsSchema = Yup.object().shape({
|
||||||
|
proxyPort: Yup.number().when('proxyEnabled', {
|
||||||
|
is: (proxyEnabled: boolean) => proxyEnabled,
|
||||||
|
then: Yup.number().required(
|
||||||
|
intl.formatMessage(messages.validationProxyPort)
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!data && !error) {
|
||||||
|
return <LoadingSpinner />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<PageTitle
|
||||||
|
title={[
|
||||||
|
intl.formatMessage(messages.network),
|
||||||
|
intl.formatMessage(globalMessages.settings),
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
<div className="mb-6">
|
||||||
|
<h3 className="heading">
|
||||||
|
{intl.formatMessage(messages.networksettings)}
|
||||||
|
</h3>
|
||||||
|
<p className="description">
|
||||||
|
{intl.formatMessage(messages.networksettingsDescription)}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="section">
|
||||||
|
<Formik
|
||||||
|
initialValues={{
|
||||||
|
csrfProtection: data?.csrfProtection,
|
||||||
|
forceIpv4First: data?.forceIpv4First,
|
||||||
|
dnsServers: data?.dnsServers,
|
||||||
|
trustProxy: data?.trustProxy,
|
||||||
|
proxyEnabled: data?.proxy?.enabled,
|
||||||
|
proxyHostname: data?.proxy?.hostname,
|
||||||
|
proxyPort: data?.proxy?.port,
|
||||||
|
proxySsl: data?.proxy?.useSsl,
|
||||||
|
proxyUser: data?.proxy?.user,
|
||||||
|
proxyPassword: data?.proxy?.password,
|
||||||
|
proxyBypassFilter: data?.proxy?.bypassFilter,
|
||||||
|
proxyBypassLocalAddresses: data?.proxy?.bypassLocalAddresses,
|
||||||
|
}}
|
||||||
|
enableReinitialize
|
||||||
|
validationSchema={NetworkSettingsSchema}
|
||||||
|
onSubmit={async (values) => {
|
||||||
|
try {
|
||||||
|
const res = await fetch('/api/v1/settings/network', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
csrfProtection: values.csrfProtection,
|
||||||
|
forceIpv4First: values.forceIpv4First,
|
||||||
|
dnsServers: values.dnsServers,
|
||||||
|
trustProxy: values.trustProxy,
|
||||||
|
proxy: {
|
||||||
|
enabled: values.proxyEnabled,
|
||||||
|
hostname: values.proxyHostname,
|
||||||
|
port: values.proxyPort,
|
||||||
|
useSsl: values.proxySsl,
|
||||||
|
user: values.proxyUser,
|
||||||
|
password: values.proxyPassword,
|
||||||
|
bypassFilter: values.proxyBypassFilter,
|
||||||
|
bypassLocalAddresses: values.proxyBypassLocalAddresses,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
if (!res.ok) throw new Error();
|
||||||
|
mutate('/api/v1/settings/public');
|
||||||
|
mutate('/api/v1/status');
|
||||||
|
|
||||||
|
addToast(intl.formatMessage(messages.toastSettingsSuccess), {
|
||||||
|
autoDismiss: true,
|
||||||
|
appearance: 'success',
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
addToast(intl.formatMessage(messages.toastSettingsFailure), {
|
||||||
|
autoDismiss: true,
|
||||||
|
appearance: 'error',
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
revalidate();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({
|
||||||
|
errors,
|
||||||
|
touched,
|
||||||
|
isSubmitting,
|
||||||
|
isValid,
|
||||||
|
values,
|
||||||
|
setFieldValue,
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<Form className="section" data-testid="settings-network-form">
|
||||||
|
<div className="form-row">
|
||||||
|
<label htmlFor="trustProxy" className="checkbox-label">
|
||||||
|
<span className="mr-2">
|
||||||
|
{intl.formatMessage(messages.trustProxy)}
|
||||||
|
</span>
|
||||||
|
<SettingsBadge badgeType="restartRequired" />
|
||||||
|
<span className="label-tip">
|
||||||
|
{intl.formatMessage(messages.trustProxyTip)}
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<Field
|
||||||
|
type="checkbox"
|
||||||
|
id="trustProxy"
|
||||||
|
name="trustProxy"
|
||||||
|
onChange={() => {
|
||||||
|
setFieldValue('trustProxy', !values.trustProxy);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label htmlFor="csrfProtection" className="checkbox-label">
|
||||||
|
<span className="mr-2">
|
||||||
|
{intl.formatMessage(messages.csrfProtection)}
|
||||||
|
</span>
|
||||||
|
<SettingsBadge badgeType="advanced" className="mr-2" />
|
||||||
|
<SettingsBadge badgeType="restartRequired" />
|
||||||
|
<span className="label-tip">
|
||||||
|
{intl.formatMessage(messages.csrfProtectionTip)}
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<Tooltip
|
||||||
|
content={intl.formatMessage(
|
||||||
|
messages.csrfProtectionHoverTip
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<Field
|
||||||
|
type="checkbox"
|
||||||
|
id="csrfProtection"
|
||||||
|
name="csrfProtection"
|
||||||
|
onChange={() => {
|
||||||
|
setFieldValue(
|
||||||
|
'csrfProtection',
|
||||||
|
!values.csrfProtection
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label htmlFor="forceIpv4First" className="checkbox-label">
|
||||||
|
<span className="mr-2">
|
||||||
|
{intl.formatMessage(messages.forceIpv4First)}
|
||||||
|
</span>
|
||||||
|
<SettingsBadge badgeType="advanced" className="mr-2" />
|
||||||
|
<SettingsBadge badgeType="restartRequired" />
|
||||||
|
<span className="label-tip">
|
||||||
|
{intl.formatMessage(messages.forceIpv4FirstTip)}
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<Field
|
||||||
|
type="checkbox"
|
||||||
|
id="forceIpv4First"
|
||||||
|
name="forceIpv4First"
|
||||||
|
onChange={() => {
|
||||||
|
setFieldValue('forceIpv4First', !values.forceIpv4First);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label htmlFor="dnsServers" className="checkbox-label">
|
||||||
|
<span className="mr-2">
|
||||||
|
{intl.formatMessage(messages.dnsServers)}
|
||||||
|
</span>
|
||||||
|
<SettingsBadge badgeType="advanced" className="mr-2" />
|
||||||
|
<SettingsBadge badgeType="restartRequired" />
|
||||||
|
<span className="label-tip">
|
||||||
|
{intl.formatMessage(messages.dnsServersTip)}
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<div className="form-input-field">
|
||||||
|
<Field
|
||||||
|
id="dnsServers"
|
||||||
|
name="dnsServers"
|
||||||
|
type="text"
|
||||||
|
inputMode="url"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{errors.dnsServers &&
|
||||||
|
touched.dnsServers &&
|
||||||
|
typeof errors.dnsServers === 'string' && (
|
||||||
|
<div className="error">{errors.dnsServers}</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label htmlFor="proxyEnabled" className="checkbox-label">
|
||||||
|
<span className="mr-2">
|
||||||
|
{intl.formatMessage(messages.proxyEnabled)}
|
||||||
|
</span>
|
||||||
|
<SettingsBadge badgeType="advanced" className="mr-2" />
|
||||||
|
<SettingsBadge badgeType="restartRequired" />
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<Field
|
||||||
|
type="checkbox"
|
||||||
|
id="proxyEnabled"
|
||||||
|
name="proxyEnabled"
|
||||||
|
onChange={() => {
|
||||||
|
setFieldValue('proxyEnabled', !values.proxyEnabled);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{values.proxyEnabled && (
|
||||||
|
<>
|
||||||
|
<div className="mr-2 ml-4">
|
||||||
|
<div className="form-row">
|
||||||
|
<label
|
||||||
|
htmlFor="proxyHostname"
|
||||||
|
className="checkbox-label"
|
||||||
|
>
|
||||||
|
{intl.formatMessage(messages.proxyHostname)}
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<div className="form-input-field">
|
||||||
|
<Field
|
||||||
|
id="proxyHostname"
|
||||||
|
name="proxyHostname"
|
||||||
|
type="text"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{errors.proxyHostname &&
|
||||||
|
touched.proxyHostname &&
|
||||||
|
typeof errors.proxyHostname === 'string' && (
|
||||||
|
<div className="error">
|
||||||
|
{errors.proxyHostname}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label htmlFor="proxyPort" className="checkbox-label">
|
||||||
|
{intl.formatMessage(messages.proxyPort)}
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<div className="form-input-field">
|
||||||
|
<Field
|
||||||
|
id="proxyPort"
|
||||||
|
name="proxyPort"
|
||||||
|
type="text"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{errors.proxyPort &&
|
||||||
|
touched.proxyPort &&
|
||||||
|
typeof errors.proxyPort === 'string' && (
|
||||||
|
<div className="error">{errors.proxyPort}</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label htmlFor="proxySsl" className="checkbox-label">
|
||||||
|
{intl.formatMessage(messages.proxySsl)}
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<Field
|
||||||
|
type="checkbox"
|
||||||
|
id="proxySsl"
|
||||||
|
name="proxySsl"
|
||||||
|
onChange={() => {
|
||||||
|
setFieldValue('proxySsl', !values.proxySsl);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label htmlFor="proxyUser" className="checkbox-label">
|
||||||
|
{intl.formatMessage(messages.proxyUser)}
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<div className="form-input-field">
|
||||||
|
<Field
|
||||||
|
id="proxyUser"
|
||||||
|
name="proxyUser"
|
||||||
|
type="text"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{errors.proxyUser &&
|
||||||
|
touched.proxyUser &&
|
||||||
|
typeof errors.proxyUser === 'string' && (
|
||||||
|
<div className="error">{errors.proxyUser}</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label
|
||||||
|
htmlFor="proxyPassword"
|
||||||
|
className="checkbox-label"
|
||||||
|
>
|
||||||
|
{intl.formatMessage(messages.proxyPassword)}
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<div className="form-input-field">
|
||||||
|
<Field
|
||||||
|
id="proxyPassword"
|
||||||
|
name="proxyPassword"
|
||||||
|
type="password"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{errors.proxyPassword &&
|
||||||
|
touched.proxyPassword &&
|
||||||
|
typeof errors.proxyPassword === 'string' && (
|
||||||
|
<div className="error">
|
||||||
|
{errors.proxyPassword}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label
|
||||||
|
htmlFor="proxyBypassFilter"
|
||||||
|
className="checkbox-label"
|
||||||
|
>
|
||||||
|
{intl.formatMessage(messages.proxyBypassFilter)}
|
||||||
|
<span className="label-tip">
|
||||||
|
{intl.formatMessage(messages.proxyBypassFilterTip)}
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<div className="form-input-field">
|
||||||
|
<Field
|
||||||
|
id="proxyBypassFilter"
|
||||||
|
name="proxyBypassFilter"
|
||||||
|
type="text"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{errors.proxyBypassFilter &&
|
||||||
|
touched.proxyBypassFilter &&
|
||||||
|
typeof errors.proxyBypassFilter === 'string' && (
|
||||||
|
<div className="error">
|
||||||
|
{errors.proxyBypassFilter}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label
|
||||||
|
htmlFor="proxyBypassLocalAddresses"
|
||||||
|
className="checkbox-label"
|
||||||
|
>
|
||||||
|
{intl.formatMessage(
|
||||||
|
messages.proxyBypassLocalAddresses
|
||||||
|
)}
|
||||||
|
</label>
|
||||||
|
<div className="form-input-area">
|
||||||
|
<Field
|
||||||
|
type="checkbox"
|
||||||
|
id="proxyBypassLocalAddresses"
|
||||||
|
name="proxyBypassLocalAddresses"
|
||||||
|
onChange={() => {
|
||||||
|
setFieldValue(
|
||||||
|
'proxyBypassLocalAddresses',
|
||||||
|
!values.proxyBypassLocalAddresses
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
<div className="actions">
|
||||||
|
<div className="flex justify-end">
|
||||||
|
<span className="ml-3 inline-flex rounded-md shadow-sm">
|
||||||
|
<Button
|
||||||
|
buttonType="primary"
|
||||||
|
type="submit"
|
||||||
|
disabled={isSubmitting || !isValid}
|
||||||
|
>
|
||||||
|
<ArrowDownOnSquareIcon />
|
||||||
|
<span>
|
||||||
|
{isSubmitting
|
||||||
|
? intl.formatMessage(globalMessages.saving)
|
||||||
|
: intl.formatMessage(globalMessages.save)}
|
||||||
|
</span>
|
||||||
|
</Button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Form>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</Formik>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SettingsMain;
|
||||||
@@ -350,6 +350,10 @@ const SettingsPlex = ({ onComplete }: SettingsPlexProps) => {
|
|||||||
);
|
);
|
||||||
if (!res.ok) throw new Error();
|
if (!res.ok) throw new Error();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (onComplete) {
|
||||||
|
onComplete();
|
||||||
|
}
|
||||||
setIsSyncing(false);
|
setIsSyncing(false);
|
||||||
revalidate();
|
revalidate();
|
||||||
};
|
};
|
||||||
@@ -435,10 +439,6 @@ const SettingsPlex = ({ onComplete }: SettingsPlexProps) => {
|
|||||||
autoDismiss: true,
|
autoDismiss: true,
|
||||||
appearance: 'success',
|
appearance: 'success',
|
||||||
});
|
});
|
||||||
|
|
||||||
if (onComplete) {
|
|
||||||
onComplete();
|
|
||||||
}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (toastId) {
|
if (toastId) {
|
||||||
removeToast(toastId);
|
removeToast(toastId);
|
||||||
|
|||||||
@@ -1070,38 +1070,42 @@ const SonarrModal = ({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h3 className="mb-4 text-xl font-bold leading-8 text-gray-100">
|
{sonarr && (
|
||||||
{intl.formatMessage(messages.overrideRules)}
|
<>
|
||||||
</h3>
|
<h3 className="mb-4 text-xl font-bold leading-8 text-gray-100">
|
||||||
<ul className="grid grid-cols-2 gap-6">
|
{intl.formatMessage(messages.overrideRules)}
|
||||||
{rules && (
|
</h3>
|
||||||
<OverrideRuleTile
|
<ul className="grid gap-x-4 gap-y-8 sm:grid-cols-3 sm:gap-x-6 sm:gap-y-6 lg:grid-cols-2">
|
||||||
rules={rules}
|
{rules && (
|
||||||
setOverrideRuleModal={setOverrideRuleModal}
|
<OverrideRuleTile
|
||||||
testResponse={testResponse}
|
rules={rules}
|
||||||
sonarr={sonarr}
|
setOverrideRuleModal={setOverrideRuleModal}
|
||||||
revalidate={revalidate}
|
testResponse={testResponse}
|
||||||
/>
|
sonarr={sonarr}
|
||||||
)}
|
revalidate={revalidate}
|
||||||
<li className="min-h-[8rem] rounded-lg border-2 border-dashed border-gray-400 shadow sm:min-h-[11rem]">
|
/>
|
||||||
<div className="flex h-full w-full items-center justify-center">
|
)}
|
||||||
<Button
|
<li className="min-h-[8rem] rounded-lg border-2 border-dashed border-gray-400 shadow sm:min-h-[11rem]">
|
||||||
buttonType="ghost"
|
<div className="flex h-full w-full items-center justify-center">
|
||||||
onClick={() =>
|
<Button
|
||||||
setOverrideRuleModal({
|
buttonType="ghost"
|
||||||
open: true,
|
onClick={() =>
|
||||||
rule: null,
|
setOverrideRuleModal({
|
||||||
testResponse,
|
open: true,
|
||||||
})
|
rule: null,
|
||||||
}
|
testResponse,
|
||||||
disabled={!isValidated}
|
})
|
||||||
>
|
}
|
||||||
<PlusIcon />
|
disabled={!isValidated}
|
||||||
<span>{intl.formatMessage(messages.addrule)}</span>
|
>
|
||||||
</Button>
|
<PlusIcon />
|
||||||
</div>
|
<span>{intl.formatMessage(messages.addrule)}</span>
|
||||||
</li>
|
</Button>
|
||||||
</ul>
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -14,10 +14,12 @@ import useLocale from '@app/hooks/useLocale';
|
|||||||
import useSettings from '@app/hooks/useSettings';
|
import useSettings from '@app/hooks/useSettings';
|
||||||
import defineMessages from '@app/utils/defineMessages';
|
import defineMessages from '@app/utils/defineMessages';
|
||||||
import { MediaServerType } from '@server/constants/server';
|
import { MediaServerType } from '@server/constants/server';
|
||||||
|
import type { Library } from '@server/lib/settings';
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
import { useEffect, useState } from 'react';
|
import { useCallback, useEffect, useState } from 'react';
|
||||||
import { useIntl } from 'react-intl';
|
import { useIntl } from 'react-intl';
|
||||||
|
import { useToasts } from 'react-toast-notifications';
|
||||||
import useSWR, { mutate } from 'swr';
|
import useSWR, { mutate } from 'swr';
|
||||||
import SetupLogin from './SetupLogin';
|
import SetupLogin from './SetupLogin';
|
||||||
|
|
||||||
@@ -35,6 +37,8 @@ const messages = defineMessages('components.Setup', {
|
|||||||
signin: 'Sign In',
|
signin: 'Sign In',
|
||||||
configuremediaserver: 'Configure Media Server',
|
configuremediaserver: 'Configure Media Server',
|
||||||
configureservices: 'Configure Services',
|
configureservices: 'Configure Services',
|
||||||
|
librarieserror:
|
||||||
|
'Validation failed. Please toggle the libraries again to continue.',
|
||||||
});
|
});
|
||||||
|
|
||||||
const Setup = () => {
|
const Setup = () => {
|
||||||
@@ -49,6 +53,7 @@ const Setup = () => {
|
|||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { locale } = useLocale();
|
const { locale } = useLocale();
|
||||||
const settings = useSettings();
|
const settings = useSettings();
|
||||||
|
const toasts = useToasts();
|
||||||
|
|
||||||
const finishSetup = async () => {
|
const finishSetup = async () => {
|
||||||
setIsUpdating(true);
|
setIsUpdating(true);
|
||||||
@@ -77,6 +82,37 @@ const Setup = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const validateLibraries = useCallback(async () => {
|
||||||
|
try {
|
||||||
|
const endpointMap: Record<MediaServerType, string> = {
|
||||||
|
[MediaServerType.JELLYFIN]: '/api/v1/settings/jellyfin',
|
||||||
|
[MediaServerType.EMBY]: '/api/v1/settings/jellyfin',
|
||||||
|
[MediaServerType.PLEX]: '/api/v1/settings/plex',
|
||||||
|
[MediaServerType.NOT_CONFIGURED]: '',
|
||||||
|
};
|
||||||
|
|
||||||
|
const endpoint = endpointMap[mediaServerType];
|
||||||
|
if (!endpoint) return;
|
||||||
|
|
||||||
|
const res = await fetch(endpoint);
|
||||||
|
if (!res.ok) throw new Error('Fetch failed');
|
||||||
|
const data = await res.json();
|
||||||
|
|
||||||
|
const hasEnabledLibraries = data?.libraries?.some(
|
||||||
|
(library: Library) => library.enabled
|
||||||
|
);
|
||||||
|
|
||||||
|
setMediaServerSettingsComplete(hasEnabledLibraries);
|
||||||
|
} catch (e) {
|
||||||
|
toasts.addToast(intl.formatMessage(messages.librarieserror), {
|
||||||
|
autoDismiss: true,
|
||||||
|
appearance: 'error',
|
||||||
|
});
|
||||||
|
|
||||||
|
setMediaServerSettingsComplete(false);
|
||||||
|
}
|
||||||
|
}, [intl, mediaServerType, toasts]);
|
||||||
|
|
||||||
const { data: backdrops } = useSWR<string[]>('/api/v1/backdrops', {
|
const { data: backdrops } = useSWR<string[]>('/api/v1/backdrops', {
|
||||||
refreshInterval: 0,
|
refreshInterval: 0,
|
||||||
refreshWhenHidden: false,
|
refreshWhenHidden: false,
|
||||||
@@ -87,19 +123,38 @@ const Setup = () => {
|
|||||||
if (settings.currentSettings.initialized) {
|
if (settings.currentSettings.initialized) {
|
||||||
router.push('/');
|
router.push('/');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
settings.currentSettings.mediaServerType !==
|
settings.currentSettings.mediaServerType !==
|
||||||
MediaServerType.NOT_CONFIGURED
|
MediaServerType.NOT_CONFIGURED
|
||||||
) {
|
) {
|
||||||
setCurrentStep(3);
|
|
||||||
setMediaServerType(settings.currentSettings.mediaServerType);
|
setMediaServerType(settings.currentSettings.mediaServerType);
|
||||||
|
if (currentStep < 3) {
|
||||||
|
setCurrentStep(3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, [
|
}, [
|
||||||
settings.currentSettings.mediaServerType,
|
settings.currentSettings.mediaServerType,
|
||||||
settings.currentSettings.initialized,
|
settings.currentSettings.initialized,
|
||||||
router,
|
router,
|
||||||
|
toasts,
|
||||||
|
intl,
|
||||||
|
currentStep,
|
||||||
|
mediaServerType,
|
||||||
|
validateLibraries,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (currentStep === 3) {
|
||||||
|
validateLibraries();
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [currentStep]);
|
||||||
|
|
||||||
|
const handleComplete = () => {
|
||||||
|
validateLibraries();
|
||||||
|
};
|
||||||
|
|
||||||
if (settings.currentSettings.initialized) return <></>;
|
if (settings.currentSettings.initialized) return <></>;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -225,14 +280,9 @@ const Setup = () => {
|
|||||||
{currentStep === 3 && (
|
{currentStep === 3 && (
|
||||||
<div className="p-2">
|
<div className="p-2">
|
||||||
{mediaServerType === MediaServerType.PLEX ? (
|
{mediaServerType === MediaServerType.PLEX ? (
|
||||||
<SettingsPlex
|
<SettingsPlex onComplete={handleComplete} />
|
||||||
onComplete={() => setMediaServerSettingsComplete(true)}
|
|
||||||
/>
|
|
||||||
) : (
|
) : (
|
||||||
<SettingsJellyfin
|
<SettingsJellyfin isSetupSettings onComplete={handleComplete} />
|
||||||
isSetupSettings
|
|
||||||
onComplete={() => setMediaServerSettingsComplete(true)}
|
|
||||||
/>
|
|
||||||
)}
|
)}
|
||||||
<div className="actions">
|
<div className="actions">
|
||||||
<div className="flex justify-end">
|
<div className="flex justify-end">
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ const messages = defineMessages('components.TitleCard', {
|
|||||||
watchlistDeleted:
|
watchlistDeleted:
|
||||||
'<strong>{title}</strong> Removed from watchlist successfully!',
|
'<strong>{title}</strong> Removed from watchlist successfully!',
|
||||||
watchlistCancel: 'watchlist for <strong>{title}</strong> canceled.',
|
watchlistCancel: 'watchlist for <strong>{title}</strong> canceled.',
|
||||||
watchlistError: 'Something went wrong try again.',
|
watchlistError: 'Something went wrong. Please try again.',
|
||||||
});
|
});
|
||||||
|
|
||||||
const TitleCard = ({
|
const TitleCard = ({
|
||||||
|
|||||||
@@ -41,13 +41,11 @@ import {
|
|||||||
ExclamationTriangleIcon,
|
ExclamationTriangleIcon,
|
||||||
EyeSlashIcon,
|
EyeSlashIcon,
|
||||||
FilmIcon,
|
FilmIcon,
|
||||||
PlayIcon,
|
|
||||||
} from '@heroicons/react/24/outline';
|
|
||||||
import {
|
|
||||||
ChevronDownIcon,
|
|
||||||
MinusCircleIcon,
|
MinusCircleIcon,
|
||||||
|
PlayIcon,
|
||||||
StarIcon,
|
StarIcon,
|
||||||
} from '@heroicons/react/24/solid';
|
} from '@heroicons/react/24/outline';
|
||||||
|
import { ChevronDownIcon } from '@heroicons/react/24/solid';
|
||||||
import type { RTRating } from '@server/api/rating/rottentomatoes';
|
import type { RTRating } from '@server/api/rating/rottentomatoes';
|
||||||
import { ANIME_KEYWORD_ID } from '@server/api/themoviedb/constants';
|
import { ANIME_KEYWORD_ID } from '@server/api/themoviedb/constants';
|
||||||
import { IssueStatus } from '@server/constants/issue';
|
import { IssueStatus } from '@server/constants/issue';
|
||||||
@@ -103,7 +101,7 @@ const messages = defineMessages('components.TvDetails', {
|
|||||||
watchlistSuccess: '<strong>{title}</strong> added to watchlist successfully!',
|
watchlistSuccess: '<strong>{title}</strong> added to watchlist successfully!',
|
||||||
watchlistDeleted:
|
watchlistDeleted:
|
||||||
'<strong>{title}</strong> Removed from watchlist successfully!',
|
'<strong>{title}</strong> Removed from watchlist successfully!',
|
||||||
watchlistError: 'Something went wrong try again.',
|
watchlistError: 'Something went wrong. Please try again.',
|
||||||
removefromwatchlist: 'Remove From Watchlist',
|
removefromwatchlist: 'Remove From Watchlist',
|
||||||
addtowatchlist: 'Add To Watchlist',
|
addtowatchlist: 'Add To Watchlist',
|
||||||
});
|
});
|
||||||
@@ -189,7 +187,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
|||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
mediaLinks.push({
|
mediaLinks.push({
|
||||||
text: getAvalaibleMediaServerName(),
|
text: getAvailableMediaServerName(),
|
||||||
url: plexUrl,
|
url: plexUrl,
|
||||||
svg: <PlayIcon />,
|
svg: <PlayIcon />,
|
||||||
});
|
});
|
||||||
@@ -203,7 +201,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
|||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
mediaLinks.push({
|
mediaLinks.push({
|
||||||
text: getAvalaible4kMediaServerName(),
|
text: getAvailable4kMediaServerName(),
|
||||||
url: plexUrl4k,
|
url: plexUrl4k,
|
||||||
svg: <PlayIcon />,
|
svg: <PlayIcon />,
|
||||||
});
|
});
|
||||||
@@ -303,7 +301,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
|||||||
const showHasSpecials = data.seasons.some(
|
const showHasSpecials = data.seasons.some(
|
||||||
(season) =>
|
(season) =>
|
||||||
season.seasonNumber === 0 &&
|
season.seasonNumber === 0 &&
|
||||||
settings.currentSettings.partialRequestsEnabled
|
settings.currentSettings.enableSpecialEpisodes
|
||||||
);
|
);
|
||||||
|
|
||||||
const isComplete =
|
const isComplete =
|
||||||
@@ -324,7 +322,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
|||||||
(provider) => provider.iso_3166_1 === streamingRegion
|
(provider) => provider.iso_3166_1 === streamingRegion
|
||||||
)?.flatrate ?? [];
|
)?.flatrate ?? [];
|
||||||
|
|
||||||
function getAvalaibleMediaServerName() {
|
function getAvailableMediaServerName() {
|
||||||
if (settings.currentSettings.mediaServerType === MediaServerType.EMBY) {
|
if (settings.currentSettings.mediaServerType === MediaServerType.EMBY) {
|
||||||
return intl.formatMessage(messages.play, { mediaServerName: 'Emby' });
|
return intl.formatMessage(messages.play, { mediaServerName: 'Emby' });
|
||||||
}
|
}
|
||||||
@@ -336,7 +334,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
|||||||
return intl.formatMessage(messages.play, { mediaServerName: 'Jellyfin' });
|
return intl.formatMessage(messages.play, { mediaServerName: 'Jellyfin' });
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAvalaible4kMediaServerName() {
|
function getAvailable4kMediaServerName() {
|
||||||
if (settings.currentSettings.mediaServerType === MediaServerType.EMBY) {
|
if (settings.currentSettings.mediaServerType === MediaServerType.EMBY) {
|
||||||
return intl.formatMessage(messages.play, { mediaServerName: 'Emby' });
|
return intl.formatMessage(messages.play, { mediaServerName: 'Emby' });
|
||||||
}
|
}
|
||||||
@@ -1243,14 +1241,26 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{!!streamingProviders.length && (
|
{!!streamingProviders.length && (
|
||||||
<div className="media-fact">
|
<div className="media-fact flex-col gap-1">
|
||||||
<span>{intl.formatMessage(messages.streamingproviders)}</span>
|
<span>{intl.formatMessage(messages.streamingproviders)}</span>
|
||||||
<span className="media-fact-value">
|
<span className="media-fact-value flex flex-row flex-wrap gap-5">
|
||||||
{streamingProviders.map((p) => {
|
{streamingProviders.map((p) => {
|
||||||
return (
|
return (
|
||||||
<span className="block" key={`provider-${p.id}`}>
|
<Tooltip content={p.name}>
|
||||||
{p.name}
|
<span
|
||||||
</span>
|
className="opacity-50 transition duration-300 hover:opacity-100"
|
||||||
|
key={`provider-${p.id}`}
|
||||||
|
>
|
||||||
|
<CachedImage
|
||||||
|
type="tmdb"
|
||||||
|
src={'https://image.tmdb.org/t/p/w45/' + p.logoPath}
|
||||||
|
alt={p.name}
|
||||||
|
width={32}
|
||||||
|
height={32}
|
||||||
|
className="rounded-md"
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
</Tooltip>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import Modal from '@app/components/Common/Modal';
|
import Modal from '@app/components/Common/Modal';
|
||||||
import PermissionEdit from '@app/components/PermissionEdit';
|
import PermissionEdit from '@app/components/PermissionEdit';
|
||||||
import type { User } from '@app/hooks/useUser';
|
import type { User } from '@app/hooks/useUser';
|
||||||
import { useUser } from '@app/hooks/useUser';
|
import { Permission, useUser } from '@app/hooks/useUser';
|
||||||
import globalMessages from '@app/i18n/globalMessages';
|
import globalMessages from '@app/i18n/globalMessages';
|
||||||
import defineMessages from '@app/utils/defineMessages';
|
import defineMessages from '@app/utils/defineMessages';
|
||||||
|
import { hasPermission } from '@server/lib/permissions';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { useIntl } from 'react-intl';
|
import { useIntl } from 'react-intl';
|
||||||
import { useToasts } from 'react-toast-notifications';
|
import { useToasts } from 'react-toast-notifications';
|
||||||
@@ -79,7 +80,10 @@ const BulkEditModal = ({
|
|||||||
const { permissions: allPermissionsEqual } = selectedUsers.reduce(
|
const { permissions: allPermissionsEqual } = selectedUsers.reduce(
|
||||||
({ permissions: aPerms }, { permissions: bPerms }) => {
|
({ permissions: aPerms }, { permissions: bPerms }) => {
|
||||||
return {
|
return {
|
||||||
permissions: aPerms === bPerms ? aPerms : NaN,
|
permissions:
|
||||||
|
aPerms === bPerms || hasPermission(Permission.ADMIN, aPerms)
|
||||||
|
? aPerms
|
||||||
|
: NaN,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
{ permissions: selectedUsers[0].permissions }
|
{ permissions: selectedUsers[0].permissions }
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ const globalMessages = defineMessages('i18n', {
|
|||||||
blacklist: 'Blacklist',
|
blacklist: 'Blacklist',
|
||||||
blacklisted: 'Blacklisted',
|
blacklisted: 'Blacklisted',
|
||||||
blacklistSuccess: '<strong>{title}</strong> was successfully blacklisted.',
|
blacklistSuccess: '<strong>{title}</strong> was successfully blacklisted.',
|
||||||
blacklistError: 'Something went wrong try again.',
|
blacklistError: 'Something went wrong. Please try again.',
|
||||||
blacklistDuplicateError:
|
blacklistDuplicateError:
|
||||||
'<strong>{title}</strong> has already been blacklisted.',
|
'<strong>{title}</strong> has already been blacklisted.',
|
||||||
removeFromBlacklistSuccess:
|
removeFromBlacklistSuccess:
|
||||||
|
|||||||
@@ -175,8 +175,6 @@
|
|||||||
"components.MovieDetails.originallanguage": "اللغة الأصلية",
|
"components.MovieDetails.originallanguage": "اللغة الأصلية",
|
||||||
"components.MovieDetails.originaltitle": "الإسم الأصلي",
|
"components.MovieDetails.originaltitle": "الإسم الأصلي",
|
||||||
"components.MovieDetails.overviewunavailable": "النظرة العامة غير متوفرة.",
|
"components.MovieDetails.overviewunavailable": "النظرة العامة غير متوفرة.",
|
||||||
"components.MovieDetails.play4konplex": "تشغيل بجودة فور كي في بليكس",
|
|
||||||
"components.MovieDetails.playonplex": "تشغيل في بليكس",
|
|
||||||
"components.MovieDetails.productioncountries": "إنتاج {countryCount, plural, one {الدولة} other {الدول}}",
|
"components.MovieDetails.productioncountries": "إنتاج {countryCount, plural, one {الدولة} other {الدول}}",
|
||||||
"components.MovieDetails.recommendations": "توصيات",
|
"components.MovieDetails.recommendations": "توصيات",
|
||||||
"components.MovieDetails.releasedate": "{releaseCount, plural, one {تاريخ الاصدار other {تواريخ الاصدار}}",
|
"components.MovieDetails.releasedate": "{releaseCount, plural, one {تاريخ الاصدار other {تواريخ الاصدار}}",
|
||||||
@@ -329,7 +327,6 @@
|
|||||||
"components.RequestModal.cancel": "إلغاء الطلب",
|
"components.RequestModal.cancel": "إلغاء الطلب",
|
||||||
"components.RequestModal.edit": "تعديل الطلب",
|
"components.RequestModal.edit": "تعديل الطلب",
|
||||||
"components.RequestModal.errorediting": "حدث خطأ ما أثناء محاولة تعديل الطلب.",
|
"components.RequestModal.errorediting": "حدث خطأ ما أثناء محاولة تعديل الطلب.",
|
||||||
"components.RequestModal.extras": "إضافات",
|
|
||||||
"components.RequestModal.numberofepisodes": "# حلقات",
|
"components.RequestModal.numberofepisodes": "# حلقات",
|
||||||
"components.RequestModal.pending4krequest": "طلب فور كي مُعلّق",
|
"components.RequestModal.pending4krequest": "طلب فور كي مُعلّق",
|
||||||
"components.RequestModal.pendingapproval": "طلبك معلق بانتظار الموافقة.",
|
"components.RequestModal.pendingapproval": "طلبك معلق بانتظار الموافقة.",
|
||||||
@@ -679,7 +676,6 @@
|
|||||||
"components.Settings.tautulliSettingsDescription": "بشكل إختياري أضبط إعدادات سيرفرك الخاص بـ Tautulli.أوفرسيرر سيقوم بجلب بيانات سجل المشاهدة لمحتوى بليكس من Tautulli.",
|
"components.Settings.tautulliSettingsDescription": "بشكل إختياري أضبط إعدادات سيرفرك الخاص بـ Tautulli.أوفرسيرر سيقوم بجلب بيانات سجل المشاهدة لمحتوى بليكس من Tautulli.",
|
||||||
"components.Settings.webhook": "ويب هوك Webhook",
|
"components.Settings.webhook": "ويب هوك Webhook",
|
||||||
"components.Settings.webpush": "ويب بوش Web Push",
|
"components.Settings.webpush": "ويب بوش Web Push",
|
||||||
"components.Setup.configureplex": "إعداد بليكس",
|
|
||||||
"components.Settings.SonarrModal.server4k": "سيرفر جودة الفور كي",
|
"components.Settings.SonarrModal.server4k": "سيرفر جودة الفور كي",
|
||||||
"components.Settings.SonarrModal.servername": "إسم السيرفر",
|
"components.Settings.SonarrModal.servername": "إسم السيرفر",
|
||||||
"components.Settings.SonarrModal.ssl": "إستخدم SSL",
|
"components.Settings.SonarrModal.ssl": "إستخدم SSL",
|
||||||
@@ -775,12 +771,10 @@
|
|||||||
"components.Setup.finishing": "جاري الإنهاء…",
|
"components.Setup.finishing": "جاري الإنهاء…",
|
||||||
"components.UserList.userdeleted": "تم حذف المستخدم بنجاح!",
|
"components.UserList.userdeleted": "تم حذف المستخدم بنجاح!",
|
||||||
"components.UserList.users": "المستخدمين",
|
"components.UserList.users": "المستخدمين",
|
||||||
"components.TvDetails.play4konplex": "تشغيل بجودة فور كي في بليكس",
|
|
||||||
"components.TvDetails.seasons": "{seasonCount, plural, one {# موسم} other {# مواسم}}",
|
"components.TvDetails.seasons": "{seasonCount, plural, one {# موسم} other {# مواسم}}",
|
||||||
"components.TvDetails.showtype": "نوُع المسلسل",
|
"components.TvDetails.showtype": "نوُع المسلسل",
|
||||||
"components.UserList.accounttype": "نوع العضويّة",
|
"components.UserList.accounttype": "نوع العضويّة",
|
||||||
"components.UserList.admin": "مسؤول",
|
"components.UserList.admin": "مسؤول",
|
||||||
"components.UserList.displayName": "إسم العرض",
|
|
||||||
"components.TvDetails.cast": "الطاقم",
|
"components.TvDetails.cast": "الطاقم",
|
||||||
"components.TvDetails.streamingproviders": "يعرض حاليا على",
|
"components.TvDetails.streamingproviders": "يعرض حاليا على",
|
||||||
"components.UserList.deleteuser": "حذف المستخدم",
|
"components.UserList.deleteuser": "حذف المستخدم",
|
||||||
@@ -810,11 +804,8 @@
|
|||||||
"i18n.delete": "حذف",
|
"i18n.delete": "حذف",
|
||||||
"i18n.requesting": "جاري الطلب…",
|
"i18n.requesting": "جاري الطلب…",
|
||||||
"pages.somethingwentwrong": "حدث خطأ ما",
|
"pages.somethingwentwrong": "حدث خطأ ما",
|
||||||
"components.Setup.loginwithplex": "تسجيل دخول بواسطة بليكس",
|
|
||||||
"components.Setup.scanbackground": "الفحص سيستمر بالخلفية. تستطيع إكمال عملية الإعداد في الوقت الحالي.",
|
|
||||||
"components.Setup.setup": "الإعداد",
|
"components.Setup.setup": "الإعداد",
|
||||||
"components.Setup.signinMessage": "إبدأ من خلال تسجيل دخولك بحساب بليكس",
|
"components.Setup.signinMessage": "إبدأ من خلال تسجيل دخولك بحساب بليكس",
|
||||||
"components.Setup.tip": "تلميحات",
|
|
||||||
"components.Setup.welcome": "مرحبا بك في أوفرسيرر",
|
"components.Setup.welcome": "مرحبا بك في أوفرسيرر",
|
||||||
"components.StatusBadge.status": "{status}",
|
"components.StatusBadge.status": "{status}",
|
||||||
"components.StatusBadge.status4k": "فور كي {status}",
|
"components.StatusBadge.status4k": "فور كي {status}",
|
||||||
@@ -830,7 +821,6 @@
|
|||||||
"components.TvDetails.originaltitle": "العنوان الأصلي",
|
"components.TvDetails.originaltitle": "العنوان الأصلي",
|
||||||
"components.TvDetails.overview": "نظرة عامة",
|
"components.TvDetails.overview": "نظرة عامة",
|
||||||
"components.TvDetails.overviewunavailable": "النظرة العامة غير متاحة.",
|
"components.TvDetails.overviewunavailable": "النظرة العامة غير متاحة.",
|
||||||
"components.TvDetails.playonplex": "تشغيل في بليكس",
|
|
||||||
"components.TvDetails.productioncountries": "إنتاج {countryCount, plural, one {الدولة} other {الدول}}",
|
"components.TvDetails.productioncountries": "إنتاج {countryCount, plural, one {الدولة} other {الدول}}",
|
||||||
"components.TvDetails.recommendations": "التوصيات",
|
"components.TvDetails.recommendations": "التوصيات",
|
||||||
"components.TvDetails.similar": "مسلسلات مشابهه",
|
"components.TvDetails.similar": "مسلسلات مشابهه",
|
||||||
@@ -1155,8 +1145,6 @@
|
|||||||
"components.Settings.SettingsMain.csrfProtectionTip": "إعداد خارجي بمفتاح API بصلاحية القراءة فقط (هذا الخيار يتطلب إتصال مُشفر HTTP)",
|
"components.Settings.SettingsMain.csrfProtectionTip": "إعداد خارجي بمفتاح API بصلاحية القراءة فقط (هذا الخيار يتطلب إتصال مُشفر HTTP)",
|
||||||
"components.Settings.SettingsMain.generalsettings": "إعدادات عامة",
|
"components.Settings.SettingsMain.generalsettings": "إعدادات عامة",
|
||||||
"components.Settings.SettingsMain.locale": "لغة العرض",
|
"components.Settings.SettingsMain.locale": "لغة العرض",
|
||||||
"components.Settings.SettingsMain.region": "المنطقة/الإقليم الخاص بمحتوى إكتشف",
|
|
||||||
"components.Settings.SettingsMain.regionTip": "فلترة المحتوى بحسب توفّره بالإقليم/المنطقة",
|
|
||||||
"components.Settings.SettingsMain.toastSettingsSuccess": "تم حفظ الإعدادات!",
|
"components.Settings.SettingsMain.toastSettingsSuccess": "تم حفظ الإعدادات!",
|
||||||
"components.Settings.SettingsMain.trustProxy": "تفعيل دعم البروكسي",
|
"components.Settings.SettingsMain.trustProxy": "تفعيل دعم البروكسي",
|
||||||
"components.StatusChecker.appUpdatedDescription": "الرجاء النقر على الزر بالإسفل لإعادة تحميل الصفحة.",
|
"components.StatusChecker.appUpdatedDescription": "الرجاء النقر على الزر بالإسفل لإعادة تحميل الصفحة.",
|
||||||
@@ -1238,5 +1226,15 @@
|
|||||||
"components.Settings.SonarrModal.animeSeriesType": "نوع مسلسل الإنمي",
|
"components.Settings.SonarrModal.animeSeriesType": "نوع مسلسل الإنمي",
|
||||||
"components.Settings.SonarrModal.seriesType": "نوع المسلسل",
|
"components.Settings.SonarrModal.seriesType": "نوع المسلسل",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "صوت التنبيه",
|
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "صوت التنبيه",
|
||||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "الجهاز الإفتراضي"
|
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "الجهاز الإفتراضي",
|
||||||
|
"component.BlacklistBlock.blacklistedby": "مدرج في القائمة السوداء من قبل",
|
||||||
|
"component.BlacklistBlock.blacklistdate": "تاريخ الإدراج في القائمة السوداء",
|
||||||
|
"component.BlacklistModal.blacklisting": "القائمة السوداء",
|
||||||
|
"components.Blacklist.blacklistNotFoundError": "<strong>{title}</strong> غير مدرج في القائمة السوداء.",
|
||||||
|
"components.Blacklist.blacklistSettingsDescription": "إدارة الوسائط المدرجة في القائمة السوداء.",
|
||||||
|
"components.Blacklist.mediaType": "النوع",
|
||||||
|
"components.Blacklist.mediaName": "الاسم",
|
||||||
|
"components.Blacklist.blacklistdate": "التاريخ",
|
||||||
|
"components.Blacklist.blacklistsettings": "إعدادات القائمة السوداء",
|
||||||
|
"components.Blacklist.blacklistedby": "{date} بواسطة {user}"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -234,7 +234,6 @@
|
|||||||
"components.PermissionEdit.viewrequests": "Преглед на заявките",
|
"components.PermissionEdit.viewrequests": "Преглед на заявките",
|
||||||
"components.RequestCard.failedretry": "Нещо се обърка при повторен опит за заявка.",
|
"components.RequestCard.failedretry": "Нещо се обърка при повторен опит за заявка.",
|
||||||
"components.PermissionEdit.requestMovies": "Заявка за филми",
|
"components.PermissionEdit.requestMovies": "Заявка за филми",
|
||||||
"components.RequestModal.extras": "Екстри",
|
|
||||||
"components.RequestModal.QuotaDisplay.quotaLinkUser": "Можете да прегледате обобщение на ограниченията на заявки от потребителя на неговата <Profile Link>профилна страница</Profile Link>.",
|
"components.RequestModal.QuotaDisplay.quotaLinkUser": "Можете да прегледате обобщение на ограниченията на заявки от потребителя на неговата <Profile Link>профилна страница</Profile Link>.",
|
||||||
"components.Discover.StudioSlider.studios": "Студия",
|
"components.Discover.StudioSlider.studios": "Студия",
|
||||||
"components.ManageSlideOver.manageModalRequests": "Заявки",
|
"components.ManageSlideOver.manageModalRequests": "Заявки",
|
||||||
@@ -712,7 +711,6 @@
|
|||||||
"components.Discover.FilterSlideover.voteCount": "Брой гласове между {minValue} и {maxValue}",
|
"components.Discover.FilterSlideover.voteCount": "Брой гласове между {minValue} и {maxValue}",
|
||||||
"components.NotificationTypeSelector.issuecreated": "Проблемът е докладван",
|
"components.NotificationTypeSelector.issuecreated": "Проблемът е докладван",
|
||||||
"components.RequestModal.alreadyrequested": "Вече е заявено",
|
"components.RequestModal.alreadyrequested": "Вече е заявено",
|
||||||
"components.MovieDetails.play4konplex": "Пусни в 4K в Plex",
|
|
||||||
"components.NotificationTypeSelector.mediaavailable": "Налична заявка",
|
"components.NotificationTypeSelector.mediaavailable": "Налична заявка",
|
||||||
"components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsFailed": "Настройките за известяване към Pushbullet не успяха да бъдат запазени.",
|
"components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsFailed": "Настройките за известяване към Pushbullet не успяха да бъдат запазени.",
|
||||||
"components.PermissionEdit.autoapprove4kSeriesDescription": "Гарантирано автоматично одобрение за заявки за 4K сериали.",
|
"components.PermissionEdit.autoapprove4kSeriesDescription": "Гарантирано автоматично одобрение за заявки за 4K сериали.",
|
||||||
@@ -724,7 +722,6 @@
|
|||||||
"components.NotificationTypeSelector.mediadeclinedDescription": "Изпращайте известия, когато медийните заявки бъдат отхвърлени.",
|
"components.NotificationTypeSelector.mediadeclinedDescription": "Изпращайте известия, когато медийните заявки бъдат отхвърлени.",
|
||||||
"components.Settings.Notifications.validationSmtpPortRequired": "Трябва да предоставите валиден номер на порт",
|
"components.Settings.Notifications.validationSmtpPortRequired": "Трябва да предоставите валиден номер на порт",
|
||||||
"components.NotificationTypeSelector.mediaautorequested": "Заявката е изпратена автоматично",
|
"components.NotificationTypeSelector.mediaautorequested": "Заявката е изпратена автоматично",
|
||||||
"components.MovieDetails.playonplex": "Пусни в Plex",
|
|
||||||
"components.ManageSlideOver.manageModalClearMedia": "Изчистване на данните",
|
"components.ManageSlideOver.manageModalClearMedia": "Изчистване на данните",
|
||||||
"components.Settings.RadarrModal.apiKey": "API ключ",
|
"components.Settings.RadarrModal.apiKey": "API ключ",
|
||||||
"components.MovieDetails.streamingproviders": "В момента се излъчва по",
|
"components.MovieDetails.streamingproviders": "В момента се излъчва по",
|
||||||
@@ -742,7 +739,6 @@
|
|||||||
"components.Settings.SettingsMain.hideAvailable": "Скриване на наличните медии",
|
"components.Settings.SettingsMain.hideAvailable": "Скриване на наличните медии",
|
||||||
"components.Settings.SettingsLogs.logDetails": "Подробности за лог файл",
|
"components.Settings.SettingsLogs.logDetails": "Подробности за лог файл",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsSuccess": "Настройките са запазени успешно!",
|
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsSuccess": "Настройките са запазени успешно!",
|
||||||
"components.Settings.SettingsMain.regionTip": "Филтрирайте съдържанието по регионална наличност",
|
|
||||||
"components.UserList.sortRequests": "Брой заявки",
|
"components.UserList.sortRequests": "Брой заявки",
|
||||||
"components.Settings.SonarrModal.edit4ksonarr": "Редактирай 4К Sonarr сървър",
|
"components.Settings.SonarrModal.edit4ksonarr": "Редактирай 4К Sonarr сървър",
|
||||||
"components.Settings.SettingsJobsCache.imagecache": "Кеш изображения",
|
"components.Settings.SettingsJobsCache.imagecache": "Кеш изображения",
|
||||||
@@ -770,7 +766,6 @@
|
|||||||
"components.Settings.SettingsLogs.logsDescription": "Можете също да видите тези лог файлове директно чрез <code>stdout</code> или в <code>{appDataPath}/logs/overseerr.log</code>.",
|
"components.Settings.SettingsLogs.logsDescription": "Можете също да видите тези лог файлове директно чрез <code>stdout</code> или в <code>{appDataPath}/logs/overseerr.log</code>.",
|
||||||
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# епизод} other {# епизоди}}",
|
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# епизод} other {# епизоди}}",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "Discord User ID",
|
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "Discord User ID",
|
||||||
"components.Settings.SettingsMain.region": "Регион в Открийте",
|
|
||||||
"components.TvDetails.firstAirDate": "Първа дата за ефир",
|
"components.TvDetails.firstAirDate": "Първа дата за ефир",
|
||||||
"pages.errormessagewithcode": "{statusCode} - {error}",
|
"pages.errormessagewithcode": "{statusCode} - {error}",
|
||||||
"components.Settings.SettingsMain.trustProxy": "Активирайте поддръжката на прокси",
|
"components.Settings.SettingsMain.trustProxy": "Активирайте поддръжката на прокси",
|
||||||
@@ -828,7 +823,6 @@
|
|||||||
"components.Settings.SettingsLogs.filterInfo": "Информация",
|
"components.Settings.SettingsLogs.filterInfo": "Информация",
|
||||||
"i18n.view": "Преглед",
|
"i18n.view": "Преглед",
|
||||||
"components.Settings.scan": "Синхронизиране на библиотеки",
|
"components.Settings.scan": "Синхронизиране на библиотеки",
|
||||||
"components.TvDetails.playonplex": "Пусни в Plex",
|
|
||||||
"components.Settings.SettingsJobsCache.jobScheduleEditSaved": "Заданието редактирана успешно!",
|
"components.Settings.SettingsJobsCache.jobScheduleEditSaved": "Заданието редактирана успешно!",
|
||||||
"components.UserList.usercreatedsuccess": "Потребителят е създаден успешно!",
|
"components.UserList.usercreatedsuccess": "Потребителят е създаден успешно!",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.emailsettingssaved": "Настройките за известяване по имейл са запазени успешно!",
|
"components.UserProfile.UserSettings.UserNotificationSettings.emailsettingssaved": "Настройките за известяване по имейл са запазени успешно!",
|
||||||
@@ -863,7 +857,6 @@
|
|||||||
"components.Settings.SonarrModal.selectRootFolder": "Изберете главна папка",
|
"components.Settings.SonarrModal.selectRootFolder": "Изберете главна папка",
|
||||||
"i18n.delimitedlist": "{a}, {b}",
|
"i18n.delimitedlist": "{a}, {b}",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.webpush": "Web Push",
|
"components.UserProfile.UserSettings.UserNotificationSettings.webpush": "Web Push",
|
||||||
"components.Setup.scanbackground": "Сканирането ще работи във фонов режим. Междувременно можете да продължите процеса на настройка.",
|
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.notifications": "Известия",
|
"components.UserProfile.UserSettings.UserNotificationSettings.notifications": "Известия",
|
||||||
"components.Settings.SonarrModal.validationApplicationUrl": "Трябва да предоставите валиден URL адрес",
|
"components.Settings.SonarrModal.validationApplicationUrl": "Трябва да предоставите валиден URL адрес",
|
||||||
"components.Settings.SonarrModal.seasonfolders": "Папки по сезони",
|
"components.Settings.SonarrModal.seasonfolders": "Папки по сезони",
|
||||||
@@ -901,7 +894,6 @@
|
|||||||
"components.Settings.plexsettingsDescription": "Конфигурирайте настройките за вашия Plex сървър. Overseerr сканира вашите Plex библиотеки, за да определи наличното съдържанието.",
|
"components.Settings.plexsettingsDescription": "Конфигурирайте настройките за вашия Plex сървър. Overseerr сканира вашите Plex библиотеки, за да определи наличното съдържанието.",
|
||||||
"i18n.import": "Импорт",
|
"i18n.import": "Импорт",
|
||||||
"components.Settings.SettingsMain.applicationTitle": "Заглавие на приложението",
|
"components.Settings.SettingsMain.applicationTitle": "Заглавие на приложението",
|
||||||
"components.TvDetails.play4konplex": "Пусни в 4K в Plex",
|
|
||||||
"components.StatusBadge.playonplex": "Пусни в Plex",
|
"components.StatusBadge.playonplex": "Пусни в Plex",
|
||||||
"i18n.open": "Отвори",
|
"i18n.open": "Отвори",
|
||||||
"components.Settings.port": "Порт",
|
"components.Settings.port": "Порт",
|
||||||
@@ -945,7 +937,6 @@
|
|||||||
"components.UserList.accounttype": "Тип",
|
"components.UserList.accounttype": "Тип",
|
||||||
"components.Settings.webAppUrl": "<WebAppLink>Web App</WebAppLink> URL",
|
"components.Settings.webAppUrl": "<WebAppLink>Web App</WebAppLink> URL",
|
||||||
"components.TvDetails.manageseries": "Управление на сериали",
|
"components.TvDetails.manageseries": "Управление на сериали",
|
||||||
"components.Setup.tip": "Съвет",
|
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingsfailed": "Настройките за известяване към Discord не успяха да бъдат запазени.",
|
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingsfailed": "Настройките за известяване към Discord не успяха да бъдат запазени.",
|
||||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Вашият акаунт в момента няма зададена парола. Конфигурирайте парола по-долу, за да разрешите влизане като „локален потребител“, използвайки своя имейл адрес.",
|
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Вашият акаунт в момента няма зададена парола. Конфигурирайте парола по-долу, за да разрешите влизане като „локален потребител“, използвайки своя имейл адрес.",
|
||||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Нова честота",
|
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Нова честота",
|
||||||
@@ -955,7 +946,6 @@
|
|||||||
"i18n.resolved": "Разрешен",
|
"i18n.resolved": "Разрешен",
|
||||||
"components.TvDetails.Season.somethingwentwrong": "Нещо се обърка при извличане на данни за сезона.",
|
"components.TvDetails.Season.somethingwentwrong": "Нещо се обърка при извличане на данни за сезона.",
|
||||||
"components.StatusChecker.appUpdatedDescription": "Моля, щракнете върху бутона по-долу, за да презаредите приложението.",
|
"components.StatusChecker.appUpdatedDescription": "Моля, щракнете върху бутона по-долу, за да презаредите приложението.",
|
||||||
"components.UserList.displayName": "Показвано име",
|
|
||||||
"components.UserList.bulkedit": "Групово редактиране",
|
"components.UserList.bulkedit": "Групово редактиране",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverUserKey": "Трябва да предоставите валиден потребителски или групов ключ",
|
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverUserKey": "Трябва да предоставите валиден потребителски или групов ключ",
|
||||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Нещо се обърка при генерирането на нов API ключ.",
|
"components.Settings.SettingsMain.toastApiKeyFailure": "Нещо се обърка при генерирането на нов API ключ.",
|
||||||
@@ -980,7 +970,6 @@
|
|||||||
"components.Settings.SonarrModal.loadingprofiles": "Зареждат се профилите за качество…",
|
"components.Settings.SonarrModal.loadingprofiles": "Зареждат се профилите за качество…",
|
||||||
"i18n.testing": "Тествам…",
|
"i18n.testing": "Тествам…",
|
||||||
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsFailureVerifyCurrent": "Нещо се обърка при запазването на паролата. Вашата текуща парола правилно ли е въведена?",
|
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsFailureVerifyCurrent": "Нещо се обърка при запазването на паролата. Вашата текуща парола правилно ли е въведена?",
|
||||||
"components.Setup.loginwithplex": "Влезте с Plex",
|
|
||||||
"components.Settings.SettingsUsers.userSettingsDescription": "Конфигурирайте глобалните потребителски настройки и настройките по подразбиране.",
|
"components.Settings.SettingsUsers.userSettingsDescription": "Конфигурирайте глобалните потребителски настройки и настройките по подразбиране.",
|
||||||
"i18n.noresults": "Няма резултати.",
|
"i18n.noresults": "Няма резултати.",
|
||||||
"components.Settings.notificationAgentSettingsDescription": "Конфигурирайте и активирайте агенти за уведомяване.",
|
"components.Settings.notificationAgentSettingsDescription": "Конфигурирайте и активирайте агенти за уведомяване.",
|
||||||
@@ -1126,7 +1115,6 @@
|
|||||||
"components.UserProfile.ProfileHeader.userid": "Потребителски идентификатор: {userid}",
|
"components.UserProfile.ProfileHeader.userid": "Потребителски идентификатор: {userid}",
|
||||||
"components.Settings.SettingsJobsCache.radarr-scan": "Radarr сканиране",
|
"components.Settings.SettingsJobsCache.radarr-scan": "Radarr сканиране",
|
||||||
"components.UserList.importfromplex": "Импортиране на потребители на Plex",
|
"components.UserList.importfromplex": "Импортиране на потребители на Plex",
|
||||||
"components.Setup.configureplex": "Конфигурирайте Plex",
|
|
||||||
"components.Settings.SonarrModal.port": "Порт",
|
"components.Settings.SonarrModal.port": "Порт",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessTokenTip": "Създайте токен от вашите <PushbulletSettingsLink>Настройки на акаунта</PushbulletSettingsLink>",
|
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessTokenTip": "Създайте токен от вашите <PushbulletSettingsLink>Настройки на акаунта</PushbulletSettingsLink>",
|
||||||
"components.UserList.userdeleted": "Потребителят е изтрит успешно!",
|
"components.UserList.userdeleted": "Потребителят е изтрит успешно!",
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
"components.RequestModal.pendingrequest": "Sol·licitud pendent",
|
"components.RequestModal.pendingrequest": "Sol·licitud pendent",
|
||||||
"components.RequestModal.pending4krequest": "Sol·licitud en 4K pendent",
|
"components.RequestModal.pending4krequest": "Sol·licitud en 4K pendent",
|
||||||
"components.RequestModal.numberofepisodes": "# d'episodis",
|
"components.RequestModal.numberofepisodes": "# d'episodis",
|
||||||
"components.RequestModal.extras": "Extres",
|
|
||||||
"components.RequestModal.errorediting": "S'ha produït un error en editar la sol·licitud.",
|
"components.RequestModal.errorediting": "S'ha produït un error en editar la sol·licitud.",
|
||||||
"components.RequestModal.cancel": "Cancel·la la sol·licitud",
|
"components.RequestModal.cancel": "Cancel·la la sol·licitud",
|
||||||
"components.RequestModal.autoapproval": "Aprovació automàtica",
|
"components.RequestModal.autoapproval": "Aprovació automàtica",
|
||||||
@@ -130,8 +129,6 @@
|
|||||||
"components.MovieDetails.runtime": "Ingressos",
|
"components.MovieDetails.runtime": "Ingressos",
|
||||||
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Data} other {Dates}} de llançament",
|
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Data} other {Dates}} de llançament",
|
||||||
"components.MovieDetails.recommendations": "Recomanacions",
|
"components.MovieDetails.recommendations": "Recomanacions",
|
||||||
"components.MovieDetails.play4konplex": "Reprodueix en 4K a Plex",
|
|
||||||
"components.MovieDetails.playonplex": "Reprodueix a Plex",
|
|
||||||
"components.MovieDetails.overviewunavailable": "Descripció general no disponible.",
|
"components.MovieDetails.overviewunavailable": "Descripció general no disponible.",
|
||||||
"components.MovieDetails.overview": "Visió general",
|
"components.MovieDetails.overview": "Visió general",
|
||||||
"components.MovieDetails.originaltitle": "Títol original",
|
"components.MovieDetails.originaltitle": "Títol original",
|
||||||
@@ -405,30 +402,18 @@
|
|||||||
"components.TvDetails.anime": "Anime",
|
"components.TvDetails.anime": "Anime",
|
||||||
"components.TvDetails.TvCrew.fullseriescrew": "Equip complet de la sèrie",
|
"components.TvDetails.TvCrew.fullseriescrew": "Equip complet de la sèrie",
|
||||||
"components.TvDetails.TvCast.fullseriescast": "Repartiment complet de la sèrie",
|
"components.TvDetails.TvCast.fullseriescast": "Repartiment complet de la sèrie",
|
||||||
"components.StatusChacker.newversionavailable": "Actualització de l'aplicació",
|
|
||||||
"components.StatusChacker.newversionDescription": "Jellyseerr s'ha actualitzat! Feu clic al botó següent per tornar a carregar la pàgina.",
|
|
||||||
"components.StatusBadge.status4k": "4K {status}",
|
"components.StatusBadge.status4k": "4K {status}",
|
||||||
"components.Setup.welcome": "Benvingut a Jellyseerr",
|
"components.Setup.welcome": "Benvingut a Jellyseerr",
|
||||||
"components.Setup.tip": "Consell",
|
|
||||||
"components.Setup.signinMessage": "Comenceu iniciant sessió amb el vostre compte de Plex",
|
"components.Setup.signinMessage": "Comenceu iniciant sessió amb el vostre compte de Plex",
|
||||||
"components.Setup.setup": "Configuració",
|
"components.Setup.setup": "Configuració",
|
||||||
"components.Setup.scanbackground": "L’exploració s’executarà en segon pla. Mentrestant, podeu continuar el procés de configuració.",
|
|
||||||
"components.Setup.loginwithplex": "Inicieu sessió amb Plex",
|
|
||||||
"components.Setup.finishing": "S'està acabant…",
|
"components.Setup.finishing": "S'està acabant…",
|
||||||
"components.Setup.finish": "Finalitza la configuració",
|
"components.Setup.finish": "Finalitza la configuració",
|
||||||
"components.Setup.continue": "Continua",
|
"components.Setup.continue": "Continua",
|
||||||
"components.Setup.configureservices": "Configureu els serveis",
|
"components.Setup.configureservices": "Configureu els serveis",
|
||||||
"components.Settings.toastPlexRefresh": "S'està recuperant la llista de servidors de Plex…",
|
"components.Settings.toastPlexRefresh": "S'està recuperant la llista de servidors de Plex…",
|
||||||
"components.Setup.configureplex": "Configureu Plex",
|
|
||||||
"components.Settings.webhook": "Webhook",
|
"components.Settings.webhook": "Webhook",
|
||||||
"components.Settings.validationPortRequired": "Heu de proporcionar un número de port vàlid",
|
"components.Settings.validationPortRequired": "Heu de proporcionar un número de port vàlid",
|
||||||
"components.Settings.validationHostnameRequired": "Heu de proporcionar un nom d’amfitrió o una adreça IP vàlida",
|
"components.Settings.validationHostnameRequired": "Heu de proporcionar un nom d’amfitrió o una adreça IP vàlida",
|
||||||
"components.Settings.validationApplicationUrlTrailingSlash": "L'URL no pot acabar amb una barra inclinada final",
|
|
||||||
"components.Settings.validationApplicationUrl": "Heu de proporcionar un URL vàlid",
|
|
||||||
"components.Settings.validationApplicationTitle": "Heu de proporcionar un títol d'aplicació",
|
|
||||||
"components.Settings.trustProxyTip": "Permet a Jellyseerr registrar correctament les adreces IP del client darrere d’un servidor intermediari (s’ha de tornar a carregar Jellyseerr perquè els canvis tinguin efecte)",
|
|
||||||
"components.Settings.toastSettingsSuccess": "La configuració s'ha desat correctament!",
|
|
||||||
"components.Settings.toastSettingsFailure": "S'ha produït un error en desar la configuració.",
|
|
||||||
"components.Settings.toastPlexRefreshSuccess": "La llista de servidors Plex s'ha recuperat correctament!",
|
"components.Settings.toastPlexRefreshSuccess": "La llista de servidors Plex s'ha recuperat correctament!",
|
||||||
"components.Settings.toastPlexRefreshFailure": "No s'ha pogut recuperar la llista de servidors Plex.",
|
"components.Settings.toastPlexRefreshFailure": "No s'ha pogut recuperar la llista de servidors Plex.",
|
||||||
"components.Settings.toastPlexConnectingSuccess": "La connexió amb Plex s'ha establert correctament!",
|
"components.Settings.toastPlexConnectingSuccess": "La connexió amb Plex s'ha establert correctament!",
|
||||||
@@ -454,9 +439,6 @@
|
|||||||
"components.Settings.plexlibrariesDescription": "Les biblioteques en les que Jellyseerr explora títols. Configureu i deseu la configuració de la connexió Plex i feu clic al botó següent si no apareix cap.",
|
"components.Settings.plexlibrariesDescription": "Les biblioteques en les que Jellyseerr explora títols. Configureu i deseu la configuració de la connexió Plex i feu clic al botó següent si no apareix cap.",
|
||||||
"components.Settings.plexlibraries": "Biblioteques Plex",
|
"components.Settings.plexlibraries": "Biblioteques Plex",
|
||||||
"components.Settings.plex": "Plex",
|
"components.Settings.plex": "Plex",
|
||||||
"components.Settings.partialRequestsEnabled": "Permet sol·licituds parcials de Sèries",
|
|
||||||
"components.Settings.originallanguageTip": "Filtra el contingut per l'idioma original",
|
|
||||||
"components.Settings.originallanguage": "Idioma per a la secció \"Descobriu\"",
|
|
||||||
"components.Settings.manualscanDescription": "Normalment, només s’executarà una vegada cada 24 hores. Jellyseerr comprovarà de forma més agressiva el contingut afegit recentment del seu servidor Plex. Si és la primera vegada que configureu Plex, es recomana fer una exploració manual completa de la biblioteca!",
|
"components.Settings.manualscanDescription": "Normalment, només s’executarà una vegada cada 24 hores. Jellyseerr comprovarà de forma més agressiva el contingut afegit recentment del seu servidor Plex. Si és la primera vegada que configureu Plex, es recomana fer una exploració manual completa de la biblioteca!",
|
||||||
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Exploració d'elements de Plex afegits recentment",
|
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Exploració d'elements de Plex afegits recentment",
|
||||||
"components.Settings.notrunning": "No s'està executant",
|
"components.Settings.notrunning": "No s'està executant",
|
||||||
@@ -469,8 +451,6 @@
|
|||||||
"components.Settings.menuNotifications": "Notificacions",
|
"components.Settings.menuNotifications": "Notificacions",
|
||||||
"components.Settings.menuLogs": "Registres",
|
"components.Settings.menuLogs": "Registres",
|
||||||
"components.Settings.menuJobs": "Tasques programades i memòria cau",
|
"components.Settings.menuJobs": "Tasques programades i memòria cau",
|
||||||
"components.Settings.hideAvailable": "Amaga els suports disponibles",
|
|
||||||
"components.Settings.generalsettingsDescription": "Configureu els paràmetres globals i predeterminats per a Jellyseerr.",
|
|
||||||
"components.Settings.menuGeneralSettings": "General",
|
"components.Settings.menuGeneralSettings": "General",
|
||||||
"components.Settings.menuAbout": "Quant a",
|
"components.Settings.menuAbout": "Quant a",
|
||||||
"components.Settings.manualscan": "Exploració manual de la biblioteca",
|
"components.Settings.manualscan": "Exploració manual de la biblioteca",
|
||||||
@@ -671,8 +651,6 @@
|
|||||||
"components.TvDetails.showtype": "Tipus de sèrie",
|
"components.TvDetails.showtype": "Tipus de sèrie",
|
||||||
"components.TvDetails.seasons": "{seasonCount, plural, one {# Temporada} other {# Temporades}}",
|
"components.TvDetails.seasons": "{seasonCount, plural, one {# Temporada} other {# Temporades}}",
|
||||||
"components.TvDetails.recommendations": "Recomanacions",
|
"components.TvDetails.recommendations": "Recomanacions",
|
||||||
"components.TvDetails.playonplex": "Reprodueix a Plex",
|
|
||||||
"components.TvDetails.play4konplex": "Reprodueix a Plex en 4K",
|
|
||||||
"components.Settings.SonarrModal.testFirstTags": "Proveu la connexió per carregar etiquetes",
|
"components.Settings.SonarrModal.testFirstTags": "Proveu la connexió per carregar etiquetes",
|
||||||
"components.Settings.SonarrModal.tags": "Etiquetes",
|
"components.Settings.SonarrModal.tags": "Etiquetes",
|
||||||
"components.Settings.SonarrModal.selecttags": "Seleccioneu les etiquetes",
|
"components.Settings.SonarrModal.selecttags": "Seleccioneu les etiquetes",
|
||||||
@@ -804,7 +782,6 @@
|
|||||||
"components.Settings.Notifications.webhookUrlTip": "Creeu una <DiscordWebhookLink>integració de webhook</DiscordWebhookLink> al vostre servidor",
|
"components.Settings.Notifications.webhookUrlTip": "Creeu una <DiscordWebhookLink>integració de webhook</DiscordWebhookLink> al vostre servidor",
|
||||||
"components.Settings.Notifications.encryptionOpportunisticTls": "Utilitzeu sempre STARTTLS",
|
"components.Settings.Notifications.encryptionOpportunisticTls": "Utilitzeu sempre STARTTLS",
|
||||||
"components.Settings.Notifications.encryptionNone": "Cap",
|
"components.Settings.Notifications.encryptionNone": "Cap",
|
||||||
"components.UserList.displayName": "Nom de visualització",
|
|
||||||
"components.Settings.SettingsUsers.localLoginTip": "Permetre als usuaris iniciar la sessió mitjançant la seva adreça de correu electrònic i contrasenya, en lloc de l'autenticació de Plex",
|
"components.Settings.SettingsUsers.localLoginTip": "Permetre als usuaris iniciar la sessió mitjançant la seva adreça de correu electrònic i contrasenya, en lloc de l'autenticació de Plex",
|
||||||
"components.Settings.SettingsUsers.defaultPermissionsTip": "Permisos inicials assignats a usuaris nous",
|
"components.Settings.SettingsUsers.defaultPermissionsTip": "Permisos inicials assignats a usuaris nous",
|
||||||
"components.RequestList.RequestItem.requesteddate": "Sol·licitat",
|
"components.RequestList.RequestItem.requesteddate": "Sol·licitat",
|
||||||
@@ -1225,12 +1202,10 @@
|
|||||||
"components.Settings.SettingsMain.locale": "Idioma de visualització",
|
"components.Settings.SettingsMain.locale": "Idioma de visualització",
|
||||||
"components.Settings.SettingsMain.originallanguage": "Idioma a Descobriu",
|
"components.Settings.SettingsMain.originallanguage": "Idioma a Descobriu",
|
||||||
"components.Settings.SettingsMain.originallanguageTip": "Filtrar el contingut per idioma original",
|
"components.Settings.SettingsMain.originallanguageTip": "Filtrar el contingut per idioma original",
|
||||||
"components.Settings.SettingsMain.regionTip": "Filtrar continguts per disponibilitat regional",
|
|
||||||
"components.Settings.SettingsMain.toastApiKeyFailure": "S'ha produït un error en generar una clau API nova.",
|
"components.Settings.SettingsMain.toastApiKeyFailure": "S'ha produït un error en generar una clau API nova.",
|
||||||
"components.Settings.SettingsMain.toastApiKeySuccess": "La clau API s'ha generat correctament!",
|
"components.Settings.SettingsMain.toastApiKeySuccess": "La clau API s'ha generat correctament!",
|
||||||
"components.Settings.SettingsMain.toastSettingsFailure": "S'ha produït un error en desar la configuració.",
|
"components.Settings.SettingsMain.toastSettingsFailure": "S'ha produït un error en desar la configuració.",
|
||||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Permet sol·licituds parcials de sèries",
|
"components.Settings.SettingsMain.partialRequestsEnabled": "Permet sol·licituds parcials de sèries",
|
||||||
"components.Settings.SettingsMain.region": "Regió de Descobriu",
|
|
||||||
"components.Settings.SettingsMain.toastSettingsSuccess": "La configuració s'ha desat correctament!",
|
"components.Settings.SettingsMain.toastSettingsSuccess": "La configuració s'ha desat correctament!",
|
||||||
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "L'URL no ha d'acabar amb una barra inclinada final",
|
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "L'URL no ha d'acabar amb una barra inclinada final",
|
||||||
"components.Settings.SettingsMain.trustProxy": "Habilitar la compatibilitat amb proxy",
|
"components.Settings.SettingsMain.trustProxy": "Habilitar la compatibilitat amb proxy",
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
{
|
{
|
||||||
"components.Settings.notificationsettings": "Nastavení oznámení",
|
"components.Settings.notificationsettings": "Nastavení oznámení",
|
||||||
"components.Settings.locale": "Jazyk zobrazení",
|
|
||||||
"components.Settings.generalsettings": "Obecná nastavení",
|
|
||||||
"components.Settings.enablessl": "Použít SSL",
|
"components.Settings.enablessl": "Použít SSL",
|
||||||
"components.Settings.default4k": "Výchozí 4K",
|
"components.Settings.default4k": "Výchozí 4K",
|
||||||
"components.Settings.cancelscan": "Zrušit skenování",
|
"components.Settings.cancelscan": "Zrušit skenování",
|
||||||
"components.Settings.apikey": "API klíč",
|
|
||||||
"components.Settings.activeProfile": "Aktivní profil",
|
"components.Settings.activeProfile": "Aktivní profil",
|
||||||
"components.Settings.SonarrModal.syncEnabled": "Povolit skenování",
|
"components.Settings.SonarrModal.syncEnabled": "Povolit skenování",
|
||||||
"components.Settings.SonarrModal.ssl": "Použít SSL",
|
"components.Settings.SonarrModal.ssl": "Použít SSL",
|
||||||
@@ -126,7 +123,6 @@
|
|||||||
"components.PersonDetails.ascharacter": "jako {character}",
|
"components.PersonDetails.ascharacter": "jako {character}",
|
||||||
"components.PermissionEdit.viewrequests": "Zobrazit žádosti",
|
"components.PermissionEdit.viewrequests": "Zobrazit žádosti",
|
||||||
"components.PermissionEdit.users": "Spravovat uživatele",
|
"components.PermissionEdit.users": "Spravovat uživatele",
|
||||||
"components.PermissionEdit.settings": "Spravovat nastavení",
|
|
||||||
"components.PermissionEdit.requestTv": "Žádat seriály",
|
"components.PermissionEdit.requestTv": "Žádat seriály",
|
||||||
"components.PermissionEdit.requestMovies": "Vyžádat filmy",
|
"components.PermissionEdit.requestMovies": "Vyžádat filmy",
|
||||||
"components.PermissionEdit.request4k": "Vyžádat ve 4K",
|
"components.PermissionEdit.request4k": "Vyžádat ve 4K",
|
||||||
@@ -155,8 +151,6 @@
|
|||||||
"components.TvDetails.overview": "Přehled",
|
"components.TvDetails.overview": "Přehled",
|
||||||
"components.TvDetails.cast": "Obsazení",
|
"components.TvDetails.cast": "Obsazení",
|
||||||
"components.TvDetails.anime": "Anime",
|
"components.TvDetails.anime": "Anime",
|
||||||
"components.StatusChacker.reloadOverseerr": "Znovu načíst",
|
|
||||||
"components.Setup.tip": "Tip",
|
|
||||||
"components.Setup.setup": "Konfigurace",
|
"components.Setup.setup": "Konfigurace",
|
||||||
"components.Setup.finishing": "Dokončování…",
|
"components.Setup.finishing": "Dokončování…",
|
||||||
"components.Setup.continue": "Pokračovat",
|
"components.Setup.continue": "Pokračovat",
|
||||||
@@ -181,7 +175,6 @@
|
|||||||
"components.Settings.mediaTypeSeries": "seriál",
|
"components.Settings.mediaTypeSeries": "seriál",
|
||||||
"components.Settings.mediaTypeMovie": "film",
|
"components.Settings.mediaTypeMovie": "film",
|
||||||
"components.Settings.is4k": "4K",
|
"components.Settings.is4k": "4K",
|
||||||
"components.Settings.general": "Obecné",
|
|
||||||
"components.Settings.email": "E-mail",
|
"components.Settings.email": "E-mail",
|
||||||
"components.Settings.default": "Výchozí",
|
"components.Settings.default": "Výchozí",
|
||||||
"components.Settings.address": "Adresy",
|
"components.Settings.address": "Adresy",
|
||||||
@@ -217,7 +210,6 @@
|
|||||||
"components.Search.search": "Vyhledat",
|
"components.Search.search": "Vyhledat",
|
||||||
"components.ResetPassword.password": "Heslo",
|
"components.ResetPassword.password": "Heslo",
|
||||||
"components.RequestModal.season": "Série",
|
"components.RequestModal.season": "Série",
|
||||||
"components.RequestModal.extras": "Extra",
|
|
||||||
"components.RequestModal.QuotaDisplay.season": "série",
|
"components.RequestModal.QuotaDisplay.season": "série",
|
||||||
"components.RequestModal.QuotaDisplay.movie": "film",
|
"components.RequestModal.QuotaDisplay.movie": "film",
|
||||||
"components.RequestModal.AdvancedRequester.tags": "Značky",
|
"components.RequestModal.AdvancedRequester.tags": "Značky",
|
||||||
@@ -406,17 +398,12 @@
|
|||||||
"components.NotificationTypeSelector.usermediadeclinedDescription": "Dostat oznámení o odmítnutí vašich požadavků na média.",
|
"components.NotificationTypeSelector.usermediadeclinedDescription": "Dostat oznámení o odmítnutí vašich požadavků na média.",
|
||||||
"components.NotificationTypeSelector.usermediaavailableDescription": "Dostat oznámení, jakmile budou k dispozici žádosti o média.",
|
"components.NotificationTypeSelector.usermediaavailableDescription": "Dostat oznámení, jakmile budou k dispozici žádosti o média.",
|
||||||
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {potvrzení} few {potvrzení} other {potvrzení}} za",
|
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {potvrzení} few {potvrzení} other {potvrzení}} za",
|
||||||
"components.Setup.configureplex": "Konfigurovat Plex",
|
|
||||||
"components.Settings.serverpresetRefreshing": "Načítání serverů…",
|
"components.Settings.serverpresetRefreshing": "Načítání serverů…",
|
||||||
"components.Settings.applicationTitle": "Název aplikace",
|
|
||||||
"components.Settings.originallanguage": "Jazyk pro vyhledávání",
|
|
||||||
"components.Settings.plexsettings": "Nastavení Plexu",
|
"components.Settings.plexsettings": "Nastavení Plexu",
|
||||||
"components.Settings.scan": "Synchronizovat knihovny",
|
"components.Settings.scan": "Synchronizovat knihovny",
|
||||||
"components.Settings.plexlibraries": "Plex knihovny",
|
"components.Settings.plexlibraries": "Plex knihovny",
|
||||||
"components.Settings.applicationurl": "Adresa URL aplikace",
|
|
||||||
"components.Settings.notrunning": "Není spuštěno",
|
"components.Settings.notrunning": "Není spuštěno",
|
||||||
"components.Settings.radarrsettings": "Nastavení Radarru",
|
"components.Settings.radarrsettings": "Nastavení Radarru",
|
||||||
"components.Settings.region": "Region pro vyhledávání",
|
|
||||||
"components.Settings.startscan": "Spustit skenování",
|
"components.Settings.startscan": "Spustit skenování",
|
||||||
"components.Settings.serverpresetManualMessage": "Manuální konfigurace",
|
"components.Settings.serverpresetManualMessage": "Manuální konfigurace",
|
||||||
"components.Settings.sonarrsettings": "Nastavení Sonarru",
|
"components.Settings.sonarrsettings": "Nastavení Sonarru",
|
||||||
@@ -487,7 +474,6 @@
|
|||||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> bylo úspěšně zažádáno!",
|
"components.RequestModal.requestSuccess": "<strong>{title}</strong> bylo úspěšně zažádáno!",
|
||||||
"components.Settings.SettingsLogs.logDetails": "Podrobnosti o záznamu",
|
"components.Settings.SettingsLogs.logDetails": "Podrobnosti o záznamu",
|
||||||
"components.StatusBadge.status4k": "4K {status}",
|
"components.StatusBadge.status4k": "4K {status}",
|
||||||
"components.StatusChacker.newversionavailable": "Aktualizace aplikace",
|
|
||||||
"components.TvDetails.episodeRuntime": "Délka epizody",
|
"components.TvDetails.episodeRuntime": "Délka epizody",
|
||||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minut",
|
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minut",
|
||||||
"components.TvDetails.originallanguage": "Původní jazyk",
|
"components.TvDetails.originallanguage": "Původní jazyk",
|
||||||
@@ -602,7 +588,6 @@
|
|||||||
"components.Settings.notificationAgentSettingsDescription": "Konfigurace a povolení agentů pro oznámení.",
|
"components.Settings.notificationAgentSettingsDescription": "Konfigurace a povolení agentů pro oznámení.",
|
||||||
"components.Settings.settingUpPlexDescription": "Chcete-li nastavit službu Plex, můžete buď zadat údaje ručně, nebo vybrat server získaný z adresy <RegisterPlexTVLink>plex.tv</RegisterPlexTVLink>. Stisknutím tlačítka vpravo od rozevírací nabídky načtete seznam dostupných serverů.",
|
"components.Settings.settingUpPlexDescription": "Chcete-li nastavit službu Plex, můžete buď zadat údaje ručně, nebo vybrat server získaný z adresy <RegisterPlexTVLink>plex.tv</RegisterPlexTVLink>. Stisknutím tlačítka vpravo od rozevírací nabídky načtete seznam dostupných serverů.",
|
||||||
"components.Settings.toastPlexRefreshFailure": "Nepodařilo se načíst seznam serverů Plex.",
|
"components.Settings.toastPlexRefreshFailure": "Nepodařilo se načíst seznam serverů Plex.",
|
||||||
"components.StatusChacker.newversionDescription": "Jellyseerr byl aktualizován! Kliknutím na tlačítko níže stránku znovu načtete.",
|
|
||||||
"components.TvDetails.play4k": "Přehrát v {mediaServerName} ve 4K",
|
"components.TvDetails.play4k": "Přehrát v {mediaServerName} ve 4K",
|
||||||
"components.TvDetails.play": "Přehrát v {mediaServerName}",
|
"components.TvDetails.play": "Přehrát v {mediaServerName}",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Filtrování obsahu podle regionální dostupnosti",
|
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Filtrování obsahu podle regionální dostupnosti",
|
||||||
@@ -631,20 +616,15 @@
|
|||||||
"components.Settings.SonarrModal.testFirstRootFolders": "Test připojení pro načtení kořenových složek",
|
"components.Settings.SonarrModal.testFirstRootFolders": "Test připojení pro načtení kořenových složek",
|
||||||
"components.Settings.SonarrModal.validationApiKeyRequired": "Musíte zadat klíč API",
|
"components.Settings.SonarrModal.validationApiKeyRequired": "Musíte zadat klíč API",
|
||||||
"components.Settings.SonarrModal.validationApplicationUrl": "Musíte zadat platnou adresu URL",
|
"components.Settings.SonarrModal.validationApplicationUrl": "Musíte zadat platnou adresu URL",
|
||||||
"components.Settings.csrfProtectionTip": "Nastavení externího přístupu k rozhraní API pouze pro čtení (vyžaduje protokol HTTPS a aby se změny projevily, musí být znovu načtena aplikace Jellyseerr)",
|
|
||||||
"components.Settings.deleteserverconfirm": "Opravdu chcete tento server odstranit?",
|
"components.Settings.deleteserverconfirm": "Opravdu chcete tento server odstranit?",
|
||||||
"components.Settings.menuJobs": "Práce a mezipaměť",
|
"components.Settings.menuJobs": "Práce a mezipaměť",
|
||||||
"components.Settings.toastApiKeyFailure": "Při generování nového klíče API se něco pokazilo.",
|
|
||||||
"components.Settings.toastApiKeySuccess": "Nový klíč API byl úspěšně vygenerován!",
|
|
||||||
"components.TvDetails.similar": "Podobné série",
|
"components.TvDetails.similar": "Podobné série",
|
||||||
"components.TvDetails.streamingproviders": "V současné době streamuje na",
|
"components.TvDetails.streamingproviders": "V současné době streamuje na",
|
||||||
"components.UserList.nouserstoimport": "Neexistují žádní uživatelé systému Plex, které by bylo možné importovat.",
|
"components.UserList.nouserstoimport": "Neexistují žádní uživatelé systému Plex, které by bylo možné importovat.",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsSuccess": "Nastavení úspěšně uloženo!",
|
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsSuccess": "Nastavení úspěšně uloženo!",
|
||||||
"components.Settings.SettingsJobsCache.nextexecution": "Další spuštení",
|
"components.Settings.SettingsJobsCache.nextexecution": "Další spuštení",
|
||||||
"components.Settings.generalsettingsDescription": "Konfigurace globálních a výchozích nastavení pro Jellyseerr.",
|
|
||||||
"components.TvDetails.nextAirDate": "Další datum vysílání",
|
"components.TvDetails.nextAirDate": "Další datum vysílání",
|
||||||
"components.TvDetails.viewfullcrew": "Zobrazit celé obsazení",
|
"components.TvDetails.viewfullcrew": "Zobrazit celé obsazení",
|
||||||
"components.UserList.displayName": "Zobrazené jméno",
|
|
||||||
"components.UserList.edituser": "Úprava oprávnění uživatele",
|
"components.UserList.edituser": "Úprava oprávnění uživatele",
|
||||||
"components.NotificationTypeSelector.issuecreatedDescription": "Odesílat upozornění, když jsou nahlášeny problémy.",
|
"components.NotificationTypeSelector.issuecreatedDescription": "Odesílat upozornění, když jsou nahlášeny problémy.",
|
||||||
"components.NotificationTypeSelector.issuereopenedDescription": "Odesílat upozornění, když se problémy znovu otevřou.",
|
"components.NotificationTypeSelector.issuereopenedDescription": "Odesílat upozornění, když se problémy znovu otevřou.",
|
||||||
@@ -684,7 +664,6 @@
|
|||||||
"components.PermissionEdit.request4kTv": "Vyžádat si sérii 4K",
|
"components.PermissionEdit.request4kTv": "Vyžádat si sérii 4K",
|
||||||
"components.PermissionEdit.requestMoviesDescription": "Udělit povolení k předkládání žádostí o filmy jiné než 4K.",
|
"components.PermissionEdit.requestMoviesDescription": "Udělit povolení k předkládání žádostí o filmy jiné než 4K.",
|
||||||
"components.PermissionEdit.requestTvDescription": "Udělit povolení k předkládání žádostí pro jiné série než 4K.",
|
"components.PermissionEdit.requestTvDescription": "Udělit povolení k předkládání žádostí pro jiné série než 4K.",
|
||||||
"components.PermissionEdit.settingsDescription": "Udělení oprávnění ke změně globálního nastavení. Uživatel musí mít toto oprávnění, aby je mohl udělit ostatním.",
|
|
||||||
"components.PermissionEdit.viewissuesDescription": "Udělit oprávnění k zobrazení problémů s médii nahlášených jinými uživateli.",
|
"components.PermissionEdit.viewissuesDescription": "Udělit oprávnění k zobrazení problémů s médii nahlášených jinými uživateli.",
|
||||||
"components.PermissionEdit.viewrequestsDescription": "Udělit oprávnění k zobrazení požadavků na média zadaných jinými uživateli.",
|
"components.PermissionEdit.viewrequestsDescription": "Udělit oprávnění k zobrazení požadavků na média zadaných jinými uživateli.",
|
||||||
"components.PersonDetails.alsoknownas": "Známý také jako: {names}",
|
"components.PersonDetails.alsoknownas": "Známý také jako: {names}",
|
||||||
@@ -707,15 +686,11 @@
|
|||||||
"components.Settings.SonarrModal.toastSonarrTestFailure": "Nepodařilo se připojit k systému Sonarr.",
|
"components.Settings.SonarrModal.toastSonarrTestFailure": "Nepodařilo se připojit k systému Sonarr.",
|
||||||
"components.Settings.SonarrModal.toastSonarrTestSuccess": "Připojení Sonarr úspěšně navázáno!",
|
"components.Settings.SonarrModal.toastSonarrTestSuccess": "Připojení Sonarr úspěšně navázáno!",
|
||||||
"components.Settings.SonarrModal.validationBaseUrlLeadingSlash": "Základní adresa URL musí mít na začátku lomítko",
|
"components.Settings.SonarrModal.validationBaseUrlLeadingSlash": "Základní adresa URL musí mít na začátku lomítko",
|
||||||
"components.Settings.cacheImages": "Povolení ukládání obrázků do mezipaměti",
|
|
||||||
"components.Settings.cacheImagesTip": "Ukládat do mezipaměti a poskytovat optimalizované obrazy (vyžaduje značné množství místa na disku)",
|
|
||||||
"components.Settings.manualscanDescription": "Obvykle se provádí pouze jednou za 24 hodin. Jellyseerr bude kontrolovat nedávno přidané položky vašeho serveru Plex agresivněji. Pokud Plex konfigurujete poprvé, doporučujeme provést jednorázovou úplnou ruční kontrolu knihovny!",
|
"components.Settings.manualscanDescription": "Obvykle se provádí pouze jednou za 24 hodin. Jellyseerr bude kontrolovat nedávno přidané položky vašeho serveru Plex agresivněji. Pokud Plex konfigurujete poprvé, doporučujeme provést jednorázovou úplnou ruční kontrolu knihovny!",
|
||||||
"components.Settings.originallanguageTip": "Filtrování obsahu podle původního jazyka",
|
|
||||||
"components.Settings.urlBase": "Základní adresa URL",
|
"components.Settings.urlBase": "Základní adresa URL",
|
||||||
"components.Settings.tautulliSettingsDescription": "Volitelně nakonfigurujte nastavení serveru Tautulli. Jellyseerr načte data historie sledování pro vaše média Plex z Tautulli.",
|
"components.Settings.tautulliSettingsDescription": "Volitelně nakonfigurujte nastavení serveru Tautulli. Jellyseerr načte data historie sledování pro vaše média Plex z Tautulli.",
|
||||||
"components.Settings.toastPlexConnecting": "Pokus o připojení k systému Plex…",
|
"components.Settings.toastPlexConnecting": "Pokus o připojení k systému Plex…",
|
||||||
"components.Settings.validationApiKey": "Musíte zadat klíč API",
|
"components.Settings.validationApiKey": "Musíte zadat klíč API",
|
||||||
"components.Settings.validationApplicationUrlTrailingSlash": "Adresa URL nesmí končit koncovým lomítkem",
|
|
||||||
"components.Settings.validationHostnameRequired": "Musíte zadat platný název hostitele nebo IP adresu",
|
"components.Settings.validationHostnameRequired": "Musíte zadat platný název hostitele nebo IP adresu",
|
||||||
"components.Settings.validationPortRequired": "Musíte zadat platné číslo portu",
|
"components.Settings.validationPortRequired": "Musíte zadat platné číslo portu",
|
||||||
"components.Settings.validationUrl": "Musíte zadat platnou adresu URL",
|
"components.Settings.validationUrl": "Musíte zadat platnou adresu URL",
|
||||||
@@ -803,23 +778,15 @@
|
|||||||
"components.Settings.addradarr": "Přidání serveru Radarr",
|
"components.Settings.addradarr": "Přidání serveru Radarr",
|
||||||
"components.Settings.addsonarr": "Adding a Radarr server",
|
"components.Settings.addsonarr": "Adding a Radarr server",
|
||||||
"components.Settings.copied": "Zkopírování klíče API do schránky.",
|
"components.Settings.copied": "Zkopírování klíče API do schránky.",
|
||||||
"components.Settings.csrfProtection": "Povolení ochrany CSRF",
|
|
||||||
"components.Settings.externalUrl": "Externí adresa URL",
|
"components.Settings.externalUrl": "Externí adresa URL",
|
||||||
"components.Settings.hideAvailable": "Skrýt dostupná média",
|
|
||||||
"components.Settings.hostname": "Název hostitele nebo IP adresa",
|
"components.Settings.hostname": "Název hostitele nebo IP adresa",
|
||||||
"components.Settings.manualscan": "Manuální skenování knihovny",
|
"components.Settings.manualscan": "Manuální skenování knihovny",
|
||||||
"components.Settings.partialRequestsEnabled": "Povolení požadavků na částečné série",
|
|
||||||
"components.Settings.plexlibrariesDescription": "Knihovny Jellyseerr vyhledává tituly. Nastavte a uložte nastavení připojení k systému Plex a poté klikněte na tlačítko níže, pokud nejsou v seznamu uvedeny žádné knihovny.",
|
"components.Settings.plexlibrariesDescription": "Knihovny Jellyseerr vyhledává tituly. Nastavte a uložte nastavení připojení k systému Plex a poté klikněte na tlačítko níže, pokud nejsou v seznamu uvedeny žádné knihovny.",
|
||||||
"components.Settings.serverpresetLoad": "Stisknutím tlačítka načtete dostupné servery",
|
"components.Settings.serverpresetLoad": "Stisknutím tlačítka načtete dostupné servery",
|
||||||
"components.Settings.toastSettingsSuccess": "Nastavení úspěšně uloženo!",
|
|
||||||
"components.Settings.toastTautulliSettingsFailure": "Při ukládání nastavení Tautulli se něco pokazilo.",
|
"components.Settings.toastTautulliSettingsFailure": "Při ukládání nastavení Tautulli se něco pokazilo.",
|
||||||
"components.Settings.validationApplicationTitle": "Musíte uvést název žádosti",
|
|
||||||
"components.Settings.validationApplicationUrl": "Musíte zadat platnou adresu URL",
|
|
||||||
"components.Settings.webAppUrl": "<WebAppLink>Webová aplikace</WebAppLink> Adresa URL",
|
"components.Settings.webAppUrl": "<WebAppLink>Webová aplikace</WebAppLink> Adresa URL",
|
||||||
"components.Settings.validationUrlTrailingSlash": "Adresa URL nesmí končit koncovým lomítkem",
|
"components.Settings.validationUrlTrailingSlash": "Adresa URL nesmí končit koncovým lomítkem",
|
||||||
"components.Settings.webAppUrlTip": "Volitelné přesměrování uživatelů na webovou aplikaci na vašem serveru namísto hostované webové aplikace",
|
"components.Settings.webAppUrlTip": "Volitelné přesměrování uživatelů na webovou aplikaci na vašem serveru namísto hostované webové aplikace",
|
||||||
"components.Setup.loginwithplex": "Přihlášení pomocí služby Plex",
|
|
||||||
"components.Setup.scanbackground": "Skenování bude probíhat na pozadí. Mezitím můžete pokračovat v procesu nastavení.",
|
|
||||||
"components.Setup.welcome": "Vítejte v Jellyseerr",
|
"components.Setup.welcome": "Vítejte v Jellyseerr",
|
||||||
"components.Setup.signinMessage": "Skenování bude probíhat na pozadí. Mezitím můžete pokračovat v procesu nastavení",
|
"components.Setup.signinMessage": "Skenování bude probíhat na pozadí. Mezitím můžete pokračovat v procesu nastavení",
|
||||||
"components.TvDetails.TvCrew.fullseriescrew": "Posádka celé série",
|
"components.TvDetails.TvCrew.fullseriescrew": "Posádka celé série",
|
||||||
@@ -864,10 +831,7 @@
|
|||||||
"components.Settings.noDefault4kServer": "Server 4K {serverType} musí být označen jako výchozí, aby uživatelé mohli odesílat požadavky 4K {mediaType}.",
|
"components.Settings.noDefault4kServer": "Server 4K {serverType} musí být označen jako výchozí, aby uživatelé mohli odesílat požadavky 4K {mediaType}.",
|
||||||
"components.Settings.noDefaultNon4kServer": "Pokud máte pouze jeden server {serverType} pro obsah jiný než 4K i 4K (nebo pokud stahujete pouze obsah 4K), váš server {serverType} by <strong>neměl</strong> být označen jako server 4K.",
|
"components.Settings.noDefaultNon4kServer": "Pokud máte pouze jeden server {serverType} pro obsah jiný než 4K i 4K (nebo pokud stahujete pouze obsah 4K), váš server {serverType} by <strong>neměl</strong> být označen jako server 4K.",
|
||||||
"components.Settings.noDefaultServer": "Aby mohly být zpracovány požadavky typu {mediaType}, musí být alespoň jeden server typu {serverType} označen jako výchozí.",
|
"components.Settings.noDefaultServer": "Aby mohly být zpracovány požadavky typu {mediaType}, musí být alespoň jeden server typu {serverType} označen jako výchozí.",
|
||||||
"components.Settings.regionTip": "Filtrování obsahu podle regionální dostupnosti",
|
|
||||||
"components.Settings.plexsettingsDescription": "Knihovny Jellyseerr vyhledává tituly. Nastavte a uložte nastavení připojení k systému Plex a poté klikněte na tlačítko níže, pokud nejsou v seznamu uvedeny žádné knihovny.",
|
"components.Settings.plexsettingsDescription": "Knihovny Jellyseerr vyhledává tituly. Nastavte a uložte nastavení připojení k systému Plex a poté klikněte na tlačítko níže, pokud nejsou v seznamu uvedeny žádné knihovny.",
|
||||||
"components.Settings.toastSettingsFailure": "Při ukládání nastavení se něco pokazilo.",
|
|
||||||
"components.Settings.trustProxy": "Povolení podpory proxy serveru",
|
|
||||||
"components.Settings.toastPlexRefresh": "Získání seznamu serverů z aplikace Plex…",
|
"components.Settings.toastPlexRefresh": "Získání seznamu serverů z aplikace Plex…",
|
||||||
"components.Settings.toastPlexRefreshSuccess": "Seznam serverů Plex úspěšně načten!",
|
"components.Settings.toastPlexRefreshSuccess": "Seznam serverů Plex úspěšně načten!",
|
||||||
"components.UserList.passwordinfodescription": "Nakonfigurujte adresu URL aplikace a povolte e-mailová oznámení, která umožní automatické generování hesla.",
|
"components.UserList.passwordinfodescription": "Nakonfigurujte adresu URL aplikace a povolte e-mailová oznámení, která umožní automatické generování hesla.",
|
||||||
@@ -893,7 +857,6 @@
|
|||||||
"components.RequestCard.failedretry": "Při opakovaném pokusu o zadání požadavku se něco pokazilo.",
|
"components.RequestCard.failedretry": "Při opakovaném pokusu o zadání požadavku se něco pokazilo.",
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.profileNameTip": "Vyžaduje se pouze v případě, že nepoužíváte profil <code>default</code>",
|
"components.Settings.Notifications.NotificationsLunaSea.profileNameTip": "Vyžaduje se pouze v případě, že nepoužíváte profil <code>default</code>",
|
||||||
"components.RequestCard.mediaerror": "{mediaType} Nenalezeno",
|
"components.RequestCard.mediaerror": "{mediaType} Nenalezeno",
|
||||||
"components.Settings.trustProxyTip": "Povolit Jellyseerr správně registrovat IP adresy klientů za proxy serverem",
|
|
||||||
"components.RequestList.RequestItem.mediaerror": "{mediaType} Nenalezeno",
|
"components.RequestList.RequestItem.mediaerror": "{mediaType} Nenalezeno",
|
||||||
"components.RequestModal.QuotaDisplay.allowedRequests": "Můžete požádat o <strong>{limit}</strong> {type} každé <strong>{days}</strong> dny.",
|
"components.RequestModal.QuotaDisplay.allowedRequests": "Můžete požádat o <strong>{limit}</strong> {type} každé <strong>{days}</strong> dny.",
|
||||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Tuto sérii jsme nemohli automaticky spárovat. Níže prosím vyberte správnou shodu.",
|
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Tuto sérii jsme nemohli automaticky spárovat. Níže prosím vyberte správnou shodu.",
|
||||||
@@ -975,7 +938,6 @@
|
|||||||
"components.Settings.SonarrModal.validationLanguageProfileRequired": "Je třeba vybrat jazykový profil",
|
"components.Settings.SonarrModal.validationLanguageProfileRequired": "Je třeba vybrat jazykový profil",
|
||||||
"components.Settings.SonarrModal.validationNameRequired": "Je třeba zadat název serveru",
|
"components.Settings.SonarrModal.validationNameRequired": "Je třeba zadat název serveru",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.displayName": "Zobrazované jméno",
|
"components.UserProfile.UserSettings.UserGeneralSettings.displayName": "Zobrazované jméno",
|
||||||
"components.Settings.csrfProtectionHoverTip": "Toto nastavení NEPOVOLUJTE, pokud nerozumíte tomu, co děláte!",
|
|
||||||
"components.Settings.tautulliSettings": "Tautulli Nastavení",
|
"components.Settings.tautulliSettings": "Tautulli Nastavení",
|
||||||
"components.Settings.toastTautulliSettingsSuccess": "Nastavení Tautulli úspěšně uloženo!",
|
"components.Settings.toastTautulliSettingsSuccess": "Nastavení Tautulli úspěšně uloženo!",
|
||||||
"components.UserProfile.UserSettings.unauthorizedDescription": "Nemáte oprávnění měnit nastavení tohoto uživatele.",
|
"components.UserProfile.UserSettings.unauthorizedDescription": "Nemáte oprávnění měnit nastavení tohoto uživatele.",
|
||||||
@@ -1238,8 +1200,6 @@
|
|||||||
"components.Settings.SettingsMain.originallanguage": "Objevte jazyk",
|
"components.Settings.SettingsMain.originallanguage": "Objevte jazyk",
|
||||||
"components.Settings.SettingsMain.originallanguageTip": "Filtrování obsahu podle původního jazyka",
|
"components.Settings.SettingsMain.originallanguageTip": "Filtrování obsahu podle původního jazyka",
|
||||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Povolení požadavků na částečné série",
|
"components.Settings.SettingsMain.partialRequestsEnabled": "Povolení požadavků na částečné série",
|
||||||
"components.Settings.SettingsMain.region": "Objevte region",
|
|
||||||
"components.Settings.SettingsMain.regionTip": "Filtrování obsahu podle regionální dostupnosti",
|
|
||||||
"components.Settings.SettingsMain.trustProxyTip": "Umožnit Jellyseerru správně registrovat klientské IP adresy za proxy serverem",
|
"components.Settings.SettingsMain.trustProxyTip": "Umožnit Jellyseerru správně registrovat klientské IP adresy za proxy serverem",
|
||||||
"components.Settings.SettingsJobsCache.imagecachecount": "Obrázky v mezipaměti",
|
"components.Settings.SettingsJobsCache.imagecachecount": "Obrázky v mezipaměti",
|
||||||
"components.Settings.SettingsJobsCache.imagecache": "Vyrovnávací paměť obrázků",
|
"components.Settings.SettingsJobsCache.imagecache": "Vyrovnávací paměť obrázků",
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{
|
{
|
||||||
"components.Discover.discovermovies": "Populære Film",
|
|
||||||
"components.MediaSlider.ShowMoreCard.seemore": "Se Mere",
|
"components.MediaSlider.ShowMoreCard.seemore": "Se Mere",
|
||||||
"components.Login.validationpasswordrequired": "Angiv et kodeord",
|
"components.Login.validationpasswordrequired": "Angiv et kodeord",
|
||||||
"components.Login.validationemailrequired": "Angiv en gyldig email adresse",
|
"components.Login.validationemailrequired": "Angiv en gyldig email adresse",
|
||||||
@@ -32,7 +31,6 @@
|
|||||||
"components.Discover.recentlyAdded": "Nyligt tilføjet",
|
"components.Discover.recentlyAdded": "Nyligt tilføjet",
|
||||||
"components.Discover.populartv": "Populære Serier",
|
"components.Discover.populartv": "Populære Serier",
|
||||||
"components.Discover.popularmovies": "Populære Film",
|
"components.Discover.popularmovies": "Populære Film",
|
||||||
"components.Discover.discovertv": "Populære Serier",
|
|
||||||
"components.Discover.discover": "Udforsk",
|
"components.Discover.discover": "Udforsk",
|
||||||
"components.Discover.TvGenreSlider.tvgenres": "Seriegenrer",
|
"components.Discover.TvGenreSlider.tvgenres": "Seriegenrer",
|
||||||
"components.Discover.TvGenreList.seriesgenres": "Seriegenrer",
|
"components.Discover.TvGenreList.seriesgenres": "Seriegenrer",
|
||||||
@@ -69,10 +67,8 @@
|
|||||||
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Udgivelsesdato} other {Udgivelsesdatoer}}",
|
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Udgivelsesdato} other {Udgivelsesdatoer}}",
|
||||||
"components.MovieDetails.revenue": "Omsætning",
|
"components.MovieDetails.revenue": "Omsætning",
|
||||||
"components.MovieDetails.runtime": "{minutes} minutter",
|
"components.MovieDetails.runtime": "{minutes} minutter",
|
||||||
"components.MovieDetails.play4konplex": "Afspil i 4K i Plex",
|
|
||||||
"components.MovieDetails.similar": "Lignende Titler",
|
"components.MovieDetails.similar": "Lignende Titler",
|
||||||
"components.MovieDetails.streamingproviders": "Kan I Øjeblikket Streames På",
|
"components.MovieDetails.streamingproviders": "Kan I Øjeblikket Streames På",
|
||||||
"components.MovieDetails.playonplex": "Afspil i Plex",
|
|
||||||
"components.MovieDetails.viewfullcrew": "Vis Filmstab",
|
"components.MovieDetails.viewfullcrew": "Vis Filmstab",
|
||||||
"components.MovieDetails.watchtrailer": "Se Trailer",
|
"components.MovieDetails.watchtrailer": "Se Trailer",
|
||||||
"components.PermissionEdit.advancedrequestDescription": "Giv tilladelse til at modificere avancerede medieforespørgselsindstillinger.",
|
"components.PermissionEdit.advancedrequestDescription": "Giv tilladelse til at modificere avancerede medieforespørgselsindstillinger.",
|
||||||
@@ -222,7 +218,6 @@
|
|||||||
"components.PermissionEdit.requestTv": "Forespørg Serier",
|
"components.PermissionEdit.requestTv": "Forespørg Serier",
|
||||||
"components.PermissionEdit.autoapproveMoviesDescription": "Giv automatisk godkendelse for alle ikke-4K filmforespørgsler.",
|
"components.PermissionEdit.autoapproveMoviesDescription": "Giv automatisk godkendelse for alle ikke-4K filmforespørgsler.",
|
||||||
"components.PermissionEdit.requestTvDescription": "Bliv notificeret når problemer er genåbnet af andre brugere.",
|
"components.PermissionEdit.requestTvDescription": "Bliv notificeret når problemer er genåbnet af andre brugere.",
|
||||||
"components.PermissionEdit.settings": "Administrér Indstillinger",
|
|
||||||
"components.RegionSelector.regionServerDefault": "Standard ({region})",
|
"components.RegionSelector.regionServerDefault": "Standard ({region})",
|
||||||
"components.RequestCard.deleterequest": "Slet Forespørgsel",
|
"components.RequestCard.deleterequest": "Slet Forespørgsel",
|
||||||
"components.RequestCard.mediaerror": "Den forbundne titel for denne forespørgsel er ikke længere tilgængelig.",
|
"components.RequestCard.mediaerror": "Den forbundne titel for denne forespørgsel er ikke længere tilgængelig.",
|
||||||
@@ -251,7 +246,6 @@
|
|||||||
"components.RequestModal.QuotaDisplay.allowedRequests": "Du kan forespørge om <strong>{limit}</strong> {type} hver <strong>{days}</strong> dag.",
|
"components.RequestModal.QuotaDisplay.allowedRequests": "Du kan forespørge om <strong>{limit}</strong> {type} hver <strong>{days}</strong> dag.",
|
||||||
"components.RequestModal.QuotaDisplay.allowedRequestsUser": "Denne bruger kan forespørge om <strong>{limit}</strong> {type} hver <strong>{days}</strong> dag.",
|
"components.RequestModal.QuotaDisplay.allowedRequestsUser": "Denne bruger kan forespørge om <strong>{limit}</strong> {type} hver <strong>{days}</strong> dag.",
|
||||||
"components.IssueDetails.IssueComment.validationComment": "Du skal skrive en besked",
|
"components.IssueDetails.IssueComment.validationComment": "Du skal skrive en besked",
|
||||||
"components.PermissionEdit.settingsDescription": "Giv tilladelse til at modificere globale indstillinger. En bruger skal have denne rettighed for at kunne give den til andre.",
|
|
||||||
"components.ManageSlideOver.manageModalIssues": "Åbne Problemer",
|
"components.ManageSlideOver.manageModalIssues": "Åbne Problemer",
|
||||||
"components.MovieDetails.showless": "Vis Mindre",
|
"components.MovieDetails.showless": "Vis Mindre",
|
||||||
"components.MovieDetails.cast": "Medvirkende",
|
"components.MovieDetails.cast": "Medvirkende",
|
||||||
@@ -290,7 +284,6 @@
|
|||||||
"components.RequestModal.cancel": "Annullér Forespørgsel",
|
"components.RequestModal.cancel": "Annullér Forespørgsel",
|
||||||
"components.RequestModal.edit": "Redigér Forespørgsel",
|
"components.RequestModal.edit": "Redigér Forespørgsel",
|
||||||
"components.RequestModal.errorediting": "Noget gik galt under redigeringen af forespørgslen.",
|
"components.RequestModal.errorediting": "Noget gik galt under redigeringen af forespørgslen.",
|
||||||
"components.RequestModal.extras": "Ekstra",
|
|
||||||
"components.RequestModal.numberofepisodes": "Antal Episoder",
|
"components.RequestModal.numberofepisodes": "Antal Episoder",
|
||||||
"components.RequestModal.pending4krequest": "Afventende 4K Forespørgsler",
|
"components.RequestModal.pending4krequest": "Afventende 4K Forespørgsler",
|
||||||
"components.RequestModal.pendingapproval": "Din forespørgsel afventer godkendelse.",
|
"components.RequestModal.pendingapproval": "Din forespørgsel afventer godkendelse.",
|
||||||
@@ -604,13 +597,7 @@
|
|||||||
"components.Settings.SonarrModal.validationRootFolderRequired": "Du skal angive en rodmappe",
|
"components.Settings.SonarrModal.validationRootFolderRequired": "Du skal angive en rodmappe",
|
||||||
"components.Settings.address": "Adresse",
|
"components.Settings.address": "Adresse",
|
||||||
"components.Settings.addsonarr": "Tilføj Sonarr Server",
|
"components.Settings.addsonarr": "Tilføj Sonarr Server",
|
||||||
"components.Settings.apikey": "API-nøgle",
|
|
||||||
"components.Settings.applicationTitle": "Applikationstitel",
|
|
||||||
"components.Settings.applicationurl": "Applikations-URL",
|
|
||||||
"components.Settings.cacheImagesTip": "Optimér og gem alle billeder lokalt (anvender en betydelig mængde diskplads)",
|
|
||||||
"components.Settings.copied": "API-nøgle er kopieret til udklipsholder.",
|
"components.Settings.copied": "API-nøgle er kopieret til udklipsholder.",
|
||||||
"components.Settings.csrfProtection": "Aktivér CSRF Beskyttelse",
|
|
||||||
"components.Settings.csrfProtectionHoverTip": "Aktivér IKKE denne indstilling hvis ikke du forstår hvad du gør!",
|
|
||||||
"components.Settings.currentlibrary": "Nuværende Bibliotek: {name}",
|
"components.Settings.currentlibrary": "Nuværende Bibliotek: {name}",
|
||||||
"components.Settings.email": "Email",
|
"components.Settings.email": "Email",
|
||||||
"components.Settings.enablessl": "Benyt SSL",
|
"components.Settings.enablessl": "Benyt SSL",
|
||||||
@@ -628,17 +615,9 @@
|
|||||||
"components.Settings.noDefaultServer": "Mindst én {serverType}server skal markeres som standard for at {mediaType}forespørgsler kan afvikles.",
|
"components.Settings.noDefaultServer": "Mindst én {serverType}server skal markeres som standard for at {mediaType}forespørgsler kan afvikles.",
|
||||||
"components.Settings.notificationAgentSettingsDescription": "Konfigurér og aktivér notifikationsagenter.",
|
"components.Settings.notificationAgentSettingsDescription": "Konfigurér og aktivér notifikationsagenter.",
|
||||||
"components.Settings.notifications": "Notifikationer",
|
"components.Settings.notifications": "Notifikationer",
|
||||||
"components.Settings.originallanguage": "Udforsk Sprog",
|
|
||||||
"components.Settings.originallanguageTip": "Filtrer indhold efter originalsprog",
|
|
||||||
"components.Settings.partialRequestsEnabled": "Tillad Delvise Serieforespørgsler",
|
|
||||||
"components.Settings.plex": "Plex",
|
"components.Settings.plex": "Plex",
|
||||||
"components.Settings.SettingsJobsCache.jobScheduleEditSaved": "Jobbet er blevet redigeret!",
|
"components.Settings.SettingsJobsCache.jobScheduleEditSaved": "Jobbet er blevet redigeret!",
|
||||||
"components.Settings.csrfProtectionTip": "Sæt ekstern API-adgang til skrivebeskyttet (kræver HTTPS samt at Jellyseerr genstartes for at ændringerne vil træde i kraft)",
|
|
||||||
"components.Settings.generalsettingsDescription": "Konfigurér global- og standardindstillinger for Jellyseerr.",
|
|
||||||
"components.Settings.general": "Generelt",
|
|
||||||
"components.Settings.hideAvailable": "Skjul Tilgængelige Medier",
|
|
||||||
"components.Settings.hostname": "Domænenavn eller IP Adresse",
|
"components.Settings.hostname": "Domænenavn eller IP Adresse",
|
||||||
"components.Settings.generalsettings": "Generelle Indstillinger",
|
|
||||||
"components.Settings.menuAbout": "Om",
|
"components.Settings.menuAbout": "Om",
|
||||||
"components.Settings.SettingsLogs.label": "Label",
|
"components.Settings.SettingsLogs.label": "Label",
|
||||||
"components.Settings.SettingsLogs.level": "Alvorlighed",
|
"components.Settings.SettingsLogs.level": "Alvorlighed",
|
||||||
@@ -646,8 +625,6 @@
|
|||||||
"components.Settings.SonarrModal.baseUrl": "URL Kilde",
|
"components.Settings.SonarrModal.baseUrl": "URL Kilde",
|
||||||
"components.Settings.SonarrModal.create4ksonarr": "Tilføj Ny 4K Sonarr Server",
|
"components.Settings.SonarrModal.create4ksonarr": "Tilføj Ny 4K Sonarr Server",
|
||||||
"components.Settings.SonarrModal.loadingprofiles": "Indlæser kvalitetsprofiler…",
|
"components.Settings.SonarrModal.loadingprofiles": "Indlæser kvalitetsprofiler…",
|
||||||
"components.Settings.cacheImages": "Aktivér billede-caching",
|
|
||||||
"components.Settings.locale": "Grænsefladesprog",
|
|
||||||
"components.Settings.manualscan": "Manuel Biblioteksskanning",
|
"components.Settings.manualscan": "Manuel Biblioteksskanning",
|
||||||
"components.Settings.mediaTypeMovie": "film",
|
"components.Settings.mediaTypeMovie": "film",
|
||||||
"components.Settings.mediaTypeSeries": "serier",
|
"components.Settings.mediaTypeSeries": "serier",
|
||||||
@@ -716,15 +693,11 @@
|
|||||||
"components.Settings.sonarrsettings": "Sonarr-indstillinger",
|
"components.Settings.sonarrsettings": "Sonarr-indstillinger",
|
||||||
"components.Settings.ssl": "SSL",
|
"components.Settings.ssl": "SSL",
|
||||||
"components.Settings.startscan": "Start Skanning",
|
"components.Settings.startscan": "Start Skanning",
|
||||||
"components.Settings.toastApiKeySuccess": "Ny API-nøgle er blevet genereret!",
|
|
||||||
"components.Settings.validationApplicationUrl": "Du skal angive en gyldig URL",
|
|
||||||
"components.Settings.webAppUrlTip": "Brugere dirigeres som alternativ til web-app'en på din server i stedet for den \"hostede\" web-app",
|
"components.Settings.webAppUrlTip": "Brugere dirigeres som alternativ til web-app'en på din server i stedet for den \"hostede\" web-app",
|
||||||
"components.Settings.webAppUrl": "<WebAppLink>Web-App</WebAppLink>-URL",
|
"components.Settings.webAppUrl": "<WebAppLink>Web-App</WebAppLink>-URL",
|
||||||
"components.Settings.webhook": "Webhook",
|
"components.Settings.webhook": "Webhook",
|
||||||
"components.StatusBadge.status4k": "4K {status}",
|
"components.StatusBadge.status4k": "4K {status}",
|
||||||
"components.Setup.tip": "Tip",
|
|
||||||
"components.Setup.welcome": "Velkommen til Jellyseerr",
|
"components.Setup.welcome": "Velkommen til Jellyseerr",
|
||||||
"components.StatusChacker.reloadOverseerr": "Genindlæs",
|
|
||||||
"components.TvDetails.anime": "Anime",
|
"components.TvDetails.anime": "Anime",
|
||||||
"components.TvDetails.cast": "Roller",
|
"components.TvDetails.cast": "Roller",
|
||||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minutter",
|
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minutter",
|
||||||
@@ -754,11 +727,7 @@
|
|||||||
"components.Settings.plexlibrariesDescription": "Bibliotekerne Jellyseerr skanner for titler. Konfigurér og gem dine Plex-forbindelsesindstillinger og klik på knappen nedenfor hvis der ikke er vist nogle biblioteker.",
|
"components.Settings.plexlibrariesDescription": "Bibliotekerne Jellyseerr skanner for titler. Konfigurér og gem dine Plex-forbindelsesindstillinger og klik på knappen nedenfor hvis der ikke er vist nogle biblioteker.",
|
||||||
"components.Settings.plexsettingsDescription": "Konfigurér indstillingerne for din Plex server. Jellyseerr skanner dine Plex-biblioteker for at afgøre tilgængeligheden af indhold.",
|
"components.Settings.plexsettingsDescription": "Konfigurér indstillingerne for din Plex server. Jellyseerr skanner dine Plex-biblioteker for at afgøre tilgængeligheden af indhold.",
|
||||||
"components.Settings.radarrsettings": "Radarr-indstillinger",
|
"components.Settings.radarrsettings": "Radarr-indstillinger",
|
||||||
"components.Settings.region": "Udforsk Region",
|
|
||||||
"components.Settings.trustProxy": "Aktivér Proxy-understøttelse",
|
|
||||||
"components.Settings.trustProxyTip": "Tillad Jellyseerr at registrere klienters IP addresser korrekt bag en proxy (Jellyseerr skal genstartes for at ændringerne træder i kraft)",
|
|
||||||
"components.TvDetails.nextAirDate": "Næste Udsendelsesdato",
|
"components.TvDetails.nextAirDate": "Næste Udsendelsesdato",
|
||||||
"components.TvDetails.playonplex": "Afspil i Plex",
|
|
||||||
"components.TvDetails.recommendations": "Anbefalinger",
|
"components.TvDetails.recommendations": "Anbefalinger",
|
||||||
"components.TvDetails.seasons": "{seasonCount, plural, one {# Sæson} other {# Sæsoner}}",
|
"components.TvDetails.seasons": "{seasonCount, plural, one {# Sæson} other {# Sæsoner}}",
|
||||||
"components.TvDetails.streamingproviders": "Kan I Øjeblikket Streames På",
|
"components.TvDetails.streamingproviders": "Kan I Øjeblikket Streames På",
|
||||||
@@ -795,7 +764,6 @@
|
|||||||
"components.Settings.serverSecure": "sikker",
|
"components.Settings.serverSecure": "sikker",
|
||||||
"components.Settings.serverpresetLoad": "Klik på knappen for at indlæse tilgængelige servere",
|
"components.Settings.serverpresetLoad": "Klik på knappen for at indlæse tilgængelige servere",
|
||||||
"components.Settings.services": "Tjenester",
|
"components.Settings.services": "Tjenester",
|
||||||
"components.Settings.toastSettingsSuccess": "Indstillingerne er blevet gemt!",
|
|
||||||
"components.Settings.webpush": "Web Push",
|
"components.Settings.webpush": "Web Push",
|
||||||
"components.UserList.userlist": "Brugerliste",
|
"components.UserList.userlist": "Brugerliste",
|
||||||
"components.Settings.plexsettings": "Plex-indstillinger",
|
"components.Settings.plexsettings": "Plex-indstillinger",
|
||||||
@@ -808,40 +776,28 @@
|
|||||||
"components.TvDetails.showtype": "Serietype",
|
"components.TvDetails.showtype": "Serietype",
|
||||||
"components.UserList.sortCreated": "Tilmeldingsdato",
|
"components.UserList.sortCreated": "Tilmeldingsdato",
|
||||||
"components.UserList.deleteconfirm": "Er du sikker på at du vil slette denne bruger? Alle deres forespørgselsdata vil blive slettet permanent.",
|
"components.UserList.deleteconfirm": "Er du sikker på at du vil slette denne bruger? Alle deres forespørgselsdata vil blive slettet permanent.",
|
||||||
"components.Settings.regionTip": "Filtrer indhold efter regional tilgængelighed",
|
|
||||||
"components.Settings.serverpresetManualMessage": "Manuel konfiguration",
|
"components.Settings.serverpresetManualMessage": "Manuel konfiguration",
|
||||||
"components.Settings.serverpresetRefreshing": "Henter servere…",
|
"components.Settings.serverpresetRefreshing": "Henter servere…",
|
||||||
"components.Settings.serviceSettingsDescription": "Konfigurér dine {serverType}server(e) nedenfor. Du kan forbinde til flere forskellige {serverType}servere men kun to af dem kan markeres som standard (én ikke-4K og én 4K). Administratorer kan ændre på serveren der bruges til at behandle nye forespørgsler inden godkendelse.",
|
"components.Settings.serviceSettingsDescription": "Konfigurér dine {serverType}server(e) nedenfor. Du kan forbinde til flere forskellige {serverType}servere men kun to af dem kan markeres som standard (én ikke-4K og én 4K). Administratorer kan ændre på serveren der bruges til at behandle nye forespørgsler inden godkendelse.",
|
||||||
"components.Settings.settingUpPlexDescription": "For at sætte Plex op skal du enten indtaste oplysningerne manuelt eller vælge en server som hentes fra <RegisterPlexTVLink>plex.tv</RegisterPlexTVLink>. Klik på knappen til højre for rullemenuen for at hente en liste af tilgængelige servere.",
|
"components.Settings.settingUpPlexDescription": "For at sætte Plex op skal du enten indtaste oplysningerne manuelt eller vælge en server som hentes fra <RegisterPlexTVLink>plex.tv</RegisterPlexTVLink>. Klik på knappen til højre for rullemenuen for at hente en liste af tilgængelige servere.",
|
||||||
"components.Settings.toastApiKeyFailure": "Noget gik galt under genereringen af en nye API-nøgle.",
|
|
||||||
"components.Settings.toastPlexConnectingFailure": "Kunne ikke forbinde til Plex.",
|
"components.Settings.toastPlexConnectingFailure": "Kunne ikke forbinde til Plex.",
|
||||||
"components.Settings.toastPlexConnectingSuccess": "Plex forbindelse er etableret!",
|
"components.Settings.toastPlexConnectingSuccess": "Plex forbindelse er etableret!",
|
||||||
"components.Settings.toastPlexRefresh": "Henter serverliste fra Plex…",
|
"components.Settings.toastPlexRefresh": "Henter serverliste fra Plex…",
|
||||||
"components.Settings.toastPlexRefreshFailure": "Kunne ikke hente Plex-serverliste.",
|
"components.Settings.toastPlexRefreshFailure": "Kunne ikke hente Plex-serverliste.",
|
||||||
"components.Settings.toastPlexRefreshSuccess": "Plex-serverliste er blevet hentet!",
|
"components.Settings.toastPlexRefreshSuccess": "Plex-serverliste er blevet hentet!",
|
||||||
"components.Settings.toastSettingsFailure": "Noget gik galt. Indstillingerne kunne ikke gemmes.",
|
|
||||||
"components.Settings.validationApplicationTitle": "Du skal angive en applikationstitel",
|
|
||||||
"components.Settings.validationApplicationUrlTrailingSlash": "URL'en må ikke afsluttes med en skråstreg",
|
|
||||||
"components.Settings.validationHostnameRequired": "Du skal angive et gyldigt domænenavn eller en gyldig IP adresse",
|
"components.Settings.validationHostnameRequired": "Du skal angive et gyldigt domænenavn eller en gyldig IP adresse",
|
||||||
"components.Setup.configureplex": "Konfigurér Plex",
|
|
||||||
"components.Settings.validationPortRequired": "Du skal angive et gyldigt port-nummer",
|
"components.Settings.validationPortRequired": "Du skal angive et gyldigt port-nummer",
|
||||||
"components.Setup.configureservices": "Konfigurér Tjenester",
|
"components.Setup.configureservices": "Konfigurér Tjenester",
|
||||||
"components.Setup.continue": "Videre",
|
"components.Setup.continue": "Videre",
|
||||||
"components.Setup.finish": "Fuldfør Opsætning",
|
"components.Setup.finish": "Fuldfør Opsætning",
|
||||||
"components.Setup.finishing": "Færdiggører…",
|
"components.Setup.finishing": "Færdiggører…",
|
||||||
"components.Setup.loginwithplex": "Log in med Plex",
|
|
||||||
"components.Setup.scanbackground": "Skanningen wil køre i baggrunden. Du kan fortsætte opsætningsprocessen i mellemtiden.",
|
|
||||||
"components.Setup.setup": "Opsætning",
|
"components.Setup.setup": "Opsætning",
|
||||||
"components.StatusChacker.newversionDescription": "Jellyseerr er blevet opdateret! Klik venligst på knappen nedenfor for at genindlæse siden.",
|
|
||||||
"components.TvDetails.firstAirDate": "Første Udsendelsesdato",
|
"components.TvDetails.firstAirDate": "Første Udsendelsesdato",
|
||||||
"components.TvDetails.overview": "Oversigt",
|
"components.TvDetails.overview": "Oversigt",
|
||||||
"components.StatusChacker.newversionavailable": "Applikationsopdatering",
|
|
||||||
"components.TvDetails.TvCrew.fullseriescrew": "Komplet Rolleliste",
|
"components.TvDetails.TvCrew.fullseriescrew": "Komplet Rolleliste",
|
||||||
"components.TvDetails.overviewunavailable": "Oversigt utilgængelig.",
|
"components.TvDetails.overviewunavailable": "Oversigt utilgængelig.",
|
||||||
"components.TvDetails.play4konplex": "Afspil i 4K i Plex",
|
|
||||||
"components.UserList.localuser": "Lokal Bruger",
|
"components.UserList.localuser": "Lokal Bruger",
|
||||||
"components.UserList.deleteuser": "Slet Bruger",
|
"components.UserList.deleteuser": "Slet Bruger",
|
||||||
"components.UserList.displayName": "Kaldenavn",
|
|
||||||
"components.UserList.nouserstoimport": "Ingen nye brugere som kan importeres fra Plex.",
|
"components.UserList.nouserstoimport": "Ingen nye brugere som kan importeres fra Plex.",
|
||||||
"components.UserList.edituser": "Redigér Brugertilladelser",
|
"components.UserList.edituser": "Redigér Brugertilladelser",
|
||||||
"components.UserList.email": "Email Adresse",
|
"components.UserList.email": "Email Adresse",
|
||||||
@@ -1203,8 +1159,6 @@
|
|||||||
"components.Settings.SettingsMain.generalsettingsDescription": "Konfigurér global- og standardindstillinger for Jellyseerr.",
|
"components.Settings.SettingsMain.generalsettingsDescription": "Konfigurér global- og standardindstillinger for Jellyseerr.",
|
||||||
"components.Settings.SettingsMain.hideAvailable": "Skjul Tilgængelige Medier",
|
"components.Settings.SettingsMain.hideAvailable": "Skjul Tilgængelige Medier",
|
||||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Tillad delvise serieanmodninger",
|
"components.Settings.SettingsMain.partialRequestsEnabled": "Tillad delvise serieanmodninger",
|
||||||
"components.Settings.SettingsMain.region": "Discover region",
|
|
||||||
"components.Settings.SettingsMain.regionTip": "Filtrér indhold efter regional tilgængelighed",
|
|
||||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Noget gik galt under genereringen af en nye API-nøgle.",
|
"components.Settings.SettingsMain.toastApiKeyFailure": "Noget gik galt under genereringen af en nye API-nøgle.",
|
||||||
"components.Settings.SettingsMain.trustProxy": "Aktivér Proxy-understøttelse",
|
"components.Settings.SettingsMain.trustProxy": "Aktivér Proxy-understøttelse",
|
||||||
"components.Settings.SettingsMain.trustProxyTip": "Tillad Jellyseerr at registrere klienters IP addresser korrekt bag en proxy",
|
"components.Settings.SettingsMain.trustProxyTip": "Tillad Jellyseerr at registrere klienters IP addresser korrekt bag en proxy",
|
||||||
|
|||||||
@@ -21,11 +21,8 @@
|
|||||||
"components.Discover.TvGenreList.seriesgenres": "Seriengenres",
|
"components.Discover.TvGenreList.seriesgenres": "Seriengenres",
|
||||||
"components.Discover.TvGenreSlider.tvgenres": "Seriengenres",
|
"components.Discover.TvGenreSlider.tvgenres": "Seriengenres",
|
||||||
"components.Discover.discover": "Entdecken",
|
"components.Discover.discover": "Entdecken",
|
||||||
"components.Discover.discovermovies": "Beliebte Filme",
|
|
||||||
"components.Discover.discovertv": "Beliebte Serien",
|
|
||||||
"components.Discover.emptywatchlist": "Hier erscheinen deine zur <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> hinzugefügte Medien.",
|
"components.Discover.emptywatchlist": "Hier erscheinen deine zur <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> hinzugefügte Medien.",
|
||||||
"components.Discover.noRequests": "Keine Anfragen.",
|
"components.Discover.plexwatchlist": "Deine Watchlist",
|
||||||
"components.Discover.plexwatchlist": "Deine Plex Watchlist",
|
|
||||||
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Kürzlich hinzugefügt",
|
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Kürzlich hinzugefügt",
|
||||||
"components.Discover.popularmovies": "Beliebte Filme",
|
"components.Discover.popularmovies": "Beliebte Filme",
|
||||||
"components.Discover.populartv": "Beliebte Serien",
|
"components.Discover.populartv": "Beliebte Serien",
|
||||||
@@ -127,7 +124,7 @@
|
|||||||
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {Version} other {Versionen}} hinterher",
|
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {Version} other {Versionen}} hinterher",
|
||||||
"components.Layout.VersionStatus.outofdate": "Veraltet",
|
"components.Layout.VersionStatus.outofdate": "Veraltet",
|
||||||
"components.Layout.VersionStatus.streamdevelop": "Jellyseerr Entwicklung",
|
"components.Layout.VersionStatus.streamdevelop": "Jellyseerr Entwicklung",
|
||||||
"components.Layout.VersionStatus.streamstable": "Jellyseerr Stable",
|
"components.Layout.VersionStatus.streamstable": "Jellyseerr stabil",
|
||||||
"components.Login.email": "E-Mail-Adresse",
|
"components.Login.email": "E-Mail-Adresse",
|
||||||
"components.Login.forgotpassword": "Passwort vergessen?",
|
"components.Login.forgotpassword": "Passwort vergessen?",
|
||||||
"components.Login.loginerror": "Beim Anmelden ist etwas schief gelaufen.",
|
"components.Login.loginerror": "Beim Anmelden ist etwas schief gelaufen.",
|
||||||
@@ -176,8 +173,6 @@
|
|||||||
"components.MovieDetails.overview": "Übersicht",
|
"components.MovieDetails.overview": "Übersicht",
|
||||||
"components.MovieDetails.overviewunavailable": "Übersicht nicht verfügbar.",
|
"components.MovieDetails.overviewunavailable": "Übersicht nicht verfügbar.",
|
||||||
"components.MovieDetails.physicalrelease": "DVD/Bluray-Veröffentlichungen",
|
"components.MovieDetails.physicalrelease": "DVD/Bluray-Veröffentlichungen",
|
||||||
"components.MovieDetails.play4konplex": "In 4K auf Plex abspielen",
|
|
||||||
"components.MovieDetails.playonplex": "Auf Plex abspielen",
|
|
||||||
"components.MovieDetails.productioncountries": "Produktions {countryCount, plural, one {Land} other {Länder}}",
|
"components.MovieDetails.productioncountries": "Produktions {countryCount, plural, one {Land} other {Länder}}",
|
||||||
"components.MovieDetails.recommendations": "Empfehlungen",
|
"components.MovieDetails.recommendations": "Empfehlungen",
|
||||||
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Veröffentlichungstermin} other {Veröffentlichungstermine}}",
|
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Veröffentlichungstermin} other {Veröffentlichungstermine}}",
|
||||||
@@ -211,7 +206,7 @@
|
|||||||
"components.NotificationTypeSelector.mediaapproved": "Anfrage genehmigt",
|
"components.NotificationTypeSelector.mediaapproved": "Anfrage genehmigt",
|
||||||
"components.NotificationTypeSelector.mediaapprovedDescription": "Sende Benachrichtigungen, wenn angeforderte Medien manuell genehmigt wurden.",
|
"components.NotificationTypeSelector.mediaapprovedDescription": "Sende Benachrichtigungen, wenn angeforderte Medien manuell genehmigt wurden.",
|
||||||
"components.NotificationTypeSelector.mediaautorequested": "Automatisch übermittelte Anfrage",
|
"components.NotificationTypeSelector.mediaautorequested": "Automatisch übermittelte Anfrage",
|
||||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Erhalten eine Benachrichtigung, wenn neue Medienanfragen für Objekte auf deiner Plex Watchlist automatisch übermittelt werden.",
|
"components.NotificationTypeSelector.mediaautorequestedDescription": "Erhalten eine Benachrichtigung, wenn neue Medienanfragen für Objekte auf deiner Watchlist automatisch übermittelt werden.",
|
||||||
"components.NotificationTypeSelector.mediaavailable": "Anfrage verfügbar",
|
"components.NotificationTypeSelector.mediaavailable": "Anfrage verfügbar",
|
||||||
"components.NotificationTypeSelector.mediaavailableDescription": "Sendet Benachrichtigungen, wenn angeforderte Medien verfügbar werden.",
|
"components.NotificationTypeSelector.mediaavailableDescription": "Sendet Benachrichtigungen, wenn angeforderte Medien verfügbar werden.",
|
||||||
"components.NotificationTypeSelector.mediadeclined": "Anfrage abgelehnt",
|
"components.NotificationTypeSelector.mediadeclined": "Anfrage abgelehnt",
|
||||||
@@ -271,8 +266,6 @@
|
|||||||
"components.PermissionEdit.requestMoviesDescription": "Autorisierung zur Übermittlung von Anfragen für nicht-4K-Filme.",
|
"components.PermissionEdit.requestMoviesDescription": "Autorisierung zur Übermittlung von Anfragen für nicht-4K-Filme.",
|
||||||
"components.PermissionEdit.requestTv": "Serien anfragen",
|
"components.PermissionEdit.requestTv": "Serien anfragen",
|
||||||
"components.PermissionEdit.requestTvDescription": "Autorisierung zur Übermittlung von Anfragen für nicht-4K-Serien.",
|
"components.PermissionEdit.requestTvDescription": "Autorisierung zur Übermittlung von Anfragen für nicht-4K-Serien.",
|
||||||
"components.PermissionEdit.settings": "Einstellungen verwalten",
|
|
||||||
"components.PermissionEdit.settingsDescription": "Gewähre Berechtigung um globale Einstellungen zu ändern. Ein Benutzer muss über diese Berechtigung verfügen, um sie anderen Benutzern erteilen zu können.",
|
|
||||||
"components.PermissionEdit.users": "Benutzer verwalten",
|
"components.PermissionEdit.users": "Benutzer verwalten",
|
||||||
"components.PermissionEdit.usersDescription": "Autorisierung zur Benutzerverwaltung erteilen. Benutzer mit dieser Berechtigung können keine Benutzer mit Admin-Recht ändern oder das Admin-Recht gewähren.",
|
"components.PermissionEdit.usersDescription": "Autorisierung zur Benutzerverwaltung erteilen. Benutzer mit dieser Berechtigung können keine Benutzer mit Admin-Recht ändern oder das Admin-Recht gewähren.",
|
||||||
"components.PermissionEdit.viewissues": "Probleme ansehen",
|
"components.PermissionEdit.viewissues": "Probleme ansehen",
|
||||||
@@ -281,8 +274,8 @@
|
|||||||
"components.PermissionEdit.viewrecentDescription": "Autorisierung zur Anzeige der Liste der kürzlich hinzugefügten Medien.",
|
"components.PermissionEdit.viewrecentDescription": "Autorisierung zur Anzeige der Liste der kürzlich hinzugefügten Medien.",
|
||||||
"components.PermissionEdit.viewrequests": "Anfragen anzeigen",
|
"components.PermissionEdit.viewrequests": "Anfragen anzeigen",
|
||||||
"components.PermissionEdit.viewrequestsDescription": "Autorisierung zur Anzeige der von anderen Benutzern eingereichten Medienanfragen.",
|
"components.PermissionEdit.viewrequestsDescription": "Autorisierung zur Anzeige der von anderen Benutzern eingereichten Medienanfragen.",
|
||||||
"components.PermissionEdit.viewwatchlists": "Plex Watchlist anzeigen",
|
"components.PermissionEdit.viewwatchlists": "{mediaServerName} Watchlists anzeigen",
|
||||||
"components.PermissionEdit.viewwatchlistsDescription": "Autorisierung zur Anzeige von Plex Watchlists anderer Benutzer.",
|
"components.PermissionEdit.viewwatchlistsDescription": "Autorisierung zur Anzeige von {mediaServerName} Watchlists anderer Benutzer.",
|
||||||
"components.PersonDetails.alsoknownas": "Auch bekannt unter: {names}",
|
"components.PersonDetails.alsoknownas": "Auch bekannt unter: {names}",
|
||||||
"components.PersonDetails.appearsin": "Auftritte",
|
"components.PersonDetails.appearsin": "Auftritte",
|
||||||
"components.PersonDetails.ascharacter": "als {character}",
|
"components.PersonDetails.ascharacter": "als {character}",
|
||||||
@@ -384,7 +377,6 @@
|
|||||||
"components.RequestModal.cancel": "Anfrage abbrechen",
|
"components.RequestModal.cancel": "Anfrage abbrechen",
|
||||||
"components.RequestModal.edit": "Anfrage bearbeiten",
|
"components.RequestModal.edit": "Anfrage bearbeiten",
|
||||||
"components.RequestModal.errorediting": "Beim Bearbeiten der Anfrage ist etwas schief gelaufen.",
|
"components.RequestModal.errorediting": "Beim Bearbeiten der Anfrage ist etwas schief gelaufen.",
|
||||||
"components.RequestModal.extras": "Extras",
|
|
||||||
"components.RequestModal.numberofepisodes": "Anzahl der Folgen",
|
"components.RequestModal.numberofepisodes": "Anzahl der Folgen",
|
||||||
"components.RequestModal.pending4krequest": "Ausstehende 4K Anfrage",
|
"components.RequestModal.pending4krequest": "Ausstehende 4K Anfrage",
|
||||||
"components.RequestModal.pendingapproval": "Deine Anfrage steht noch aus.",
|
"components.RequestModal.pendingapproval": "Deine Anfrage steht noch aus.",
|
||||||
@@ -462,7 +454,7 @@
|
|||||||
"components.Settings.Notifications.NotificationsPushbullet.validationAccessTokenRequired": "Du musst ein Zugangstoken angeben",
|
"components.Settings.Notifications.NotificationsPushbullet.validationAccessTokenRequired": "Du musst ein Zugangstoken angeben",
|
||||||
"components.Settings.Notifications.NotificationsPushbullet.validationTypes": "Sie müssen mindestens einen Benachrichtigungstypen auswählen",
|
"components.Settings.Notifications.NotificationsPushbullet.validationTypes": "Sie müssen mindestens einen Benachrichtigungstypen auswählen",
|
||||||
"components.Settings.Notifications.NotificationsPushover.accessToken": "Anwendungs API-Token",
|
"components.Settings.Notifications.NotificationsPushover.accessToken": "Anwendungs API-Token",
|
||||||
"components.Settings.Notifications.NotificationsPushover.accessTokenTip": "<ApplicationRegistrationLink>Registriere eine Anwendung</ApplicationRegistrationLink> für die Benutzung mit Jellyseerr",
|
"components.Settings.Notifications.NotificationsPushover.accessTokenTip": "<ApplicationRegistrationLink>Registriere eine Anwendung</ApplicationRegistrationLink> , um diese mit Jellyseerr benutzen zu können",
|
||||||
"components.Settings.Notifications.NotificationsPushover.agentenabled": "Agent aktivieren",
|
"components.Settings.Notifications.NotificationsPushover.agentenabled": "Agent aktivieren",
|
||||||
"components.Settings.Notifications.NotificationsPushover.pushoversettingsfailed": "Pushover-Benachrichtigungseinstellungen konnten nicht gespeichert werden.",
|
"components.Settings.Notifications.NotificationsPushover.pushoversettingsfailed": "Pushover-Benachrichtigungseinstellungen konnten nicht gespeichert werden.",
|
||||||
"components.Settings.Notifications.NotificationsPushover.pushoversettingssaved": "Pushover-Benachrichtigungseinstellungen erfolgreich gespeichert!",
|
"components.Settings.Notifications.NotificationsPushover.pushoversettingssaved": "Pushover-Benachrichtigungseinstellungen erfolgreich gespeichert!",
|
||||||
@@ -485,7 +477,7 @@
|
|||||||
"components.Settings.Notifications.NotificationsSlack.webhookUrl": "Webhook URL",
|
"components.Settings.Notifications.NotificationsSlack.webhookUrl": "Webhook URL",
|
||||||
"components.Settings.Notifications.NotificationsSlack.webhookUrlTip": "Erstelle eine <WebhookLink>Eingehende Webhook</WebhookLink> integration",
|
"components.Settings.Notifications.NotificationsSlack.webhookUrlTip": "Erstelle eine <WebhookLink>Eingehende Webhook</WebhookLink> integration",
|
||||||
"components.Settings.Notifications.NotificationsWebPush.agentenabled": "Agent aktivieren",
|
"components.Settings.Notifications.NotificationsWebPush.agentenabled": "Agent aktivieren",
|
||||||
"components.Settings.Notifications.NotificationsWebPush.httpsRequirement": "Um web push Benachrichtigungen zu erhalten, muss Jellyseerr über HTTPS gehen.",
|
"components.Settings.Notifications.NotificationsWebPush.httpsRequirement": "Jellyseerr muss via HTTPS bereitgestellt werden, um Web-Push Benachrichtigungen empfangen zu können.",
|
||||||
"components.Settings.Notifications.NotificationsWebPush.toastWebPushTestFailed": "Web push Test Benachrichtigung fehlgeschlagen.",
|
"components.Settings.Notifications.NotificationsWebPush.toastWebPushTestFailed": "Web push Test Benachrichtigung fehlgeschlagen.",
|
||||||
"components.Settings.Notifications.NotificationsWebPush.toastWebPushTestSending": "Web push test Benachrichtigung wird gesendet…",
|
"components.Settings.Notifications.NotificationsWebPush.toastWebPushTestSending": "Web push test Benachrichtigung wird gesendet…",
|
||||||
"components.Settings.Notifications.NotificationsWebPush.toastWebPushTestSuccess": "Web push test Benachrichtigung gesendet!",
|
"components.Settings.Notifications.NotificationsWebPush.toastWebPushTestSuccess": "Web push test Benachrichtigung gesendet!",
|
||||||
@@ -511,7 +503,7 @@
|
|||||||
"components.Settings.Notifications.authPass": "SMTP-Passwort",
|
"components.Settings.Notifications.authPass": "SMTP-Passwort",
|
||||||
"components.Settings.Notifications.authUser": "SMTP-Benutzername",
|
"components.Settings.Notifications.authUser": "SMTP-Benutzername",
|
||||||
"components.Settings.Notifications.botAPI": "Bot-Autorisierungstoken",
|
"components.Settings.Notifications.botAPI": "Bot-Autorisierungstoken",
|
||||||
"components.Settings.Notifications.botApiTip": "<CreateBotLink>Erstelle einen Bot</CreateBotLink> für die Verwendung mit Jellyseerr",
|
"components.Settings.Notifications.botApiTip": "<CreateBotLink>Bot erstellen</CreateBotLink> für die Verwendung mit Jellyseerr",
|
||||||
"components.Settings.Notifications.botAvatarUrl": "Bot Avatar URL",
|
"components.Settings.Notifications.botAvatarUrl": "Bot Avatar URL",
|
||||||
"components.Settings.Notifications.botUsername": "Bot Benutzername",
|
"components.Settings.Notifications.botUsername": "Bot Benutzername",
|
||||||
"components.Settings.Notifications.botUsernameTip": "Benutzern erlauben, einen Chat mit dem Bot zu starten und ihre eigenen Benachrichtigungen konfigurieren",
|
"components.Settings.Notifications.botUsernameTip": "Benutzern erlauben, einen Chat mit dem Bot zu starten und ihre eigenen Benachrichtigungen konfigurieren",
|
||||||
@@ -625,7 +617,7 @@
|
|||||||
"components.Settings.SettingsAbout.outofdate": "Veraltet",
|
"components.Settings.SettingsAbout.outofdate": "Veraltet",
|
||||||
"components.Settings.SettingsAbout.overseerrinformation": "Über Jellyseerr",
|
"components.Settings.SettingsAbout.overseerrinformation": "Über Jellyseerr",
|
||||||
"components.Settings.SettingsAbout.preferredmethod": "Bevorzugt",
|
"components.Settings.SettingsAbout.preferredmethod": "Bevorzugt",
|
||||||
"components.Settings.SettingsAbout.runningDevelop": "Sie benutzen den <code>develop</code> von Jellyseerr, der nur für diejenigen empfohlen wird, die an der Entwicklung mitwirken oder bei den neuesten Tests helfen.",
|
"components.Settings.SettingsAbout.runningDevelop": "Sie benutzen den Branch<code>develop</code> von Jellyseerr, welcher nur für Entwickler, bzw. \"Bleeding-Edge\" Tests empfohlen wird.",
|
||||||
"components.Settings.SettingsAbout.supportoverseerr": "Unterstütze Jellyseerr",
|
"components.Settings.SettingsAbout.supportoverseerr": "Unterstütze Jellyseerr",
|
||||||
"components.Settings.SettingsAbout.timezone": "Zeitzone",
|
"components.Settings.SettingsAbout.timezone": "Zeitzone",
|
||||||
"components.Settings.SettingsAbout.totalmedia": "Medien insgesamt",
|
"components.Settings.SettingsAbout.totalmedia": "Medien insgesamt",
|
||||||
@@ -633,7 +625,7 @@
|
|||||||
"components.Settings.SettingsAbout.uptodate": "Auf dem neusten Stand",
|
"components.Settings.SettingsAbout.uptodate": "Auf dem neusten Stand",
|
||||||
"components.Settings.SettingsAbout.version": "Version",
|
"components.Settings.SettingsAbout.version": "Version",
|
||||||
"components.Settings.SettingsJobsCache.cache": "Cache",
|
"components.Settings.SettingsJobsCache.cache": "Cache",
|
||||||
"components.Settings.SettingsJobsCache.cacheDescription": "Jellyseerr speichert Anfragen an externe API Endpunkte zwischen, um die Leistung zu optimieren und unnötige API Aufrufe zu minimieren.",
|
"components.Settings.SettingsJobsCache.cacheDescription": "Zur Leistungsoptimierung und um unnötige Anfragen zu minimieren, speichert Jellyseerr Anfragen zwischen.",
|
||||||
"components.Settings.SettingsJobsCache.cacheflushed": "{cachename} Cache geleert.",
|
"components.Settings.SettingsJobsCache.cacheflushed": "{cachename} Cache geleert.",
|
||||||
"components.Settings.SettingsJobsCache.cachehits": "Treffer",
|
"components.Settings.SettingsJobsCache.cachehits": "Treffer",
|
||||||
"components.Settings.SettingsJobsCache.cachekeys": "Schlüssel insgesamt",
|
"components.Settings.SettingsJobsCache.cachekeys": "Schlüssel insgesamt",
|
||||||
@@ -653,7 +645,7 @@
|
|||||||
"components.Settings.SettingsJobsCache.flushcache": "Cache leeren",
|
"components.Settings.SettingsJobsCache.flushcache": "Cache leeren",
|
||||||
"components.Settings.SettingsJobsCache.image-cache-cleanup": "Bild-Cache-Bereinigung",
|
"components.Settings.SettingsJobsCache.image-cache-cleanup": "Bild-Cache-Bereinigung",
|
||||||
"components.Settings.SettingsJobsCache.imagecache": "Bild-Cache",
|
"components.Settings.SettingsJobsCache.imagecache": "Bild-Cache",
|
||||||
"components.Settings.SettingsJobsCache.imagecacheDescription": "Wenn diese Funktion in den Einstellungen aktiviert ist, wird Jellyseerr Bilder aus vorkonfigurierten externen Quellen im Proxy-Cache zwischenspeichern. Bilder im Zwischenspeicher werden in deinem Konfigurationsordner gespeichert. Du findest die Dateien unter <code>{appDataPath}/cache/images</code>.",
|
"components.Settings.SettingsJobsCache.imagecacheDescription": "Wenn diese Einstellung aktiviert ist, wird Jellyseerr Bilder aus vorkonfigurierten externen Quellen im Proxy-Cache zwischenspeichern. Bilder im Zwischenspeicher werden in deinem Konfigurationsordner gespeichert: <code>{appDataPath}/cache/images</code>.",
|
||||||
"components.Settings.SettingsJobsCache.imagecachecount": "Bilder im Cache",
|
"components.Settings.SettingsJobsCache.imagecachecount": "Bilder im Cache",
|
||||||
"components.Settings.SettingsJobsCache.imagecachesize": "Gesamtgröße des Caches",
|
"components.Settings.SettingsJobsCache.imagecachesize": "Gesamtgröße des Caches",
|
||||||
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scan der zuletzt hinzugefügten Jellyfin Medien",
|
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scan der zuletzt hinzugefügten Jellyfin Medien",
|
||||||
@@ -663,7 +655,7 @@
|
|||||||
"components.Settings.SettingsJobsCache.jobcancelled": "{jobname} abgebrochen.",
|
"components.Settings.SettingsJobsCache.jobcancelled": "{jobname} abgebrochen.",
|
||||||
"components.Settings.SettingsJobsCache.jobname": "Aufgabenname",
|
"components.Settings.SettingsJobsCache.jobname": "Aufgabenname",
|
||||||
"components.Settings.SettingsJobsCache.jobs": "Aufgaben",
|
"components.Settings.SettingsJobsCache.jobs": "Aufgaben",
|
||||||
"components.Settings.SettingsJobsCache.jobsDescription": "Jellyseerr führt bestimmte Wartungsaufgaben als regulär geplante Aufgaben durch, aber sie können auch manuell ausgeführt werden. Manuelles Ausführen einer Aufgabe ändert ihren Zeitplan nicht.",
|
"components.Settings.SettingsJobsCache.jobsDescription": "Jellyseerr führt bestimmte Wartungsaufgaben als regulär geplante Aufgaben durch. Diese können allerdings auch manuell ausgeführt werden, ohne dabei den regulären Zeitplan abzuändern.",
|
||||||
"components.Settings.SettingsJobsCache.jobsandcache": "Aufgaben und Cache",
|
"components.Settings.SettingsJobsCache.jobsandcache": "Aufgaben und Cache",
|
||||||
"components.Settings.SettingsJobsCache.jobstarted": "{jobname} gestartet.",
|
"components.Settings.SettingsJobsCache.jobstarted": "{jobname} gestartet.",
|
||||||
"components.Settings.SettingsJobsCache.jobtype": "Art",
|
"components.Settings.SettingsJobsCache.jobtype": "Art",
|
||||||
@@ -764,16 +756,8 @@
|
|||||||
"components.Settings.address": "Adresse",
|
"components.Settings.address": "Adresse",
|
||||||
"components.Settings.addsonarr": "Sonarr-Server hinzufügen",
|
"components.Settings.addsonarr": "Sonarr-Server hinzufügen",
|
||||||
"components.Settings.advancedTooltip": "Bei falscher Konfiguration dieser Einstellung, kann dies zu einer Funktionsstörung führen",
|
"components.Settings.advancedTooltip": "Bei falscher Konfiguration dieser Einstellung, kann dies zu einer Funktionsstörung führen",
|
||||||
"components.Settings.apikey": "API-Schlüssel",
|
|
||||||
"components.Settings.applicationTitle": "Anwendungstitel",
|
|
||||||
"components.Settings.applicationurl": "Anwendungs-URL",
|
|
||||||
"components.Settings.cacheImages": "Bild-Caching aktivieren",
|
|
||||||
"components.Settings.cacheImagesTip": "Alle Bilder Optimieren und lokal speichern (verbraucht viel Speicherplatz)",
|
|
||||||
"components.Settings.cancelscan": "Durchsuchung abbrechen",
|
"components.Settings.cancelscan": "Durchsuchung abbrechen",
|
||||||
"components.Settings.copied": "API-Schlüssel in die Zwischenablage kopiert.",
|
"components.Settings.copied": "API-Schlüssel in die Zwischenablage kopiert.",
|
||||||
"components.Settings.csrfProtection": "Aktiviere CSRF Schutz",
|
|
||||||
"components.Settings.csrfProtectionHoverTip": "Aktiviere diese Option NICHT, es sei denn du weißt, was du tust!",
|
|
||||||
"components.Settings.csrfProtectionTip": "Macht den externen API Zugang schreibgeschützt (setzt HTTPS voraus und Jellyseerr muss neu gestartet werden, damit die Änderungen wirksam werden)",
|
|
||||||
"components.Settings.currentlibrary": "Aktuelle Bibliothek: {name}",
|
"components.Settings.currentlibrary": "Aktuelle Bibliothek: {name}",
|
||||||
"components.Settings.default": "Standardmäßig",
|
"components.Settings.default": "Standardmäßig",
|
||||||
"components.Settings.default4k": "Standard-4K",
|
"components.Settings.default4k": "Standard-4K",
|
||||||
@@ -783,16 +767,11 @@
|
|||||||
"components.Settings.enablessl": "SSL aktivieren",
|
"components.Settings.enablessl": "SSL aktivieren",
|
||||||
"components.Settings.experimentalTooltip": "Die Aktivierung dieser Einstellung kann zu einem unerwarteten Verhalten der Anwendung führen",
|
"components.Settings.experimentalTooltip": "Die Aktivierung dieser Einstellung kann zu einem unerwarteten Verhalten der Anwendung führen",
|
||||||
"components.Settings.externalUrl": "Externe URL",
|
"components.Settings.externalUrl": "Externe URL",
|
||||||
"components.Settings.general": "Allgemein",
|
|
||||||
"components.Settings.generalsettings": "Allgemeine Einstellungen",
|
|
||||||
"components.Settings.generalsettingsDescription": "Konfiguriere Globale und Standard Jellyseerr-Einstellungen.",
|
|
||||||
"components.Settings.hideAvailable": "Verfügbare Medien ausblenden",
|
|
||||||
"components.Settings.hostname": "Hostname oder IP-Adresse",
|
"components.Settings.hostname": "Hostname oder IP-Adresse",
|
||||||
"components.Settings.is4k": "4K",
|
"components.Settings.is4k": "4K",
|
||||||
"components.Settings.librariesRemaining": "Verbleibende Bibliotheken: {count}",
|
"components.Settings.librariesRemaining": "Verbleibende Bibliotheken: {count}",
|
||||||
"components.Settings.locale": "Sprache darstellen",
|
|
||||||
"components.Settings.manualscan": "Manuelle Bibliotheksdurchsuchung",
|
"components.Settings.manualscan": "Manuelle Bibliotheksdurchsuchung",
|
||||||
"components.Settings.manualscanDescription": "Normalerweise wird dies nur einmal alle 24 Stunden ausgeführt. Jellyseerr überprüft die kürzlich hinzugefügten Plex-Server aggressiver. Falls du Plex zum ersten Mal konfigurierst, wird eine einmalige vollständige manuelle Bibliotheksdurchsuchung empfohlen!",
|
"components.Settings.manualscanDescription": "Normalerweise wird dies nur einmal alle 24 Stunden ausgeführt. Jellyseerr überprüft die kürzlich hinzugefügten Plex-Server aggressiver. Falls du Plex zum ersten Mal konfigurierst, wird empfohlen, einmalig eine manuelle, komplette Bibliotheksdurchsuchung anzustoßen!",
|
||||||
"components.Settings.mediaTypeMovie": "Film",
|
"components.Settings.mediaTypeMovie": "Film",
|
||||||
"components.Settings.mediaTypeSeries": "Serie",
|
"components.Settings.mediaTypeSeries": "Serie",
|
||||||
"components.Settings.menuAbout": "Über",
|
"components.Settings.menuAbout": "Über",
|
||||||
@@ -810,19 +789,14 @@
|
|||||||
"components.Settings.notifications": "Benachrichtigungen",
|
"components.Settings.notifications": "Benachrichtigungen",
|
||||||
"components.Settings.notificationsettings": "Benachrichtigungseinstellungen",
|
"components.Settings.notificationsettings": "Benachrichtigungseinstellungen",
|
||||||
"components.Settings.notrunning": "Nicht aktiv",
|
"components.Settings.notrunning": "Nicht aktiv",
|
||||||
"components.Settings.originallanguage": "Sprache Entdecken",
|
|
||||||
"components.Settings.originallanguageTip": "Filtere Inhalte nach Originalsprache",
|
|
||||||
"components.Settings.partialRequestsEnabled": "Teilserienanfragen erlauben",
|
|
||||||
"components.Settings.plex": "Plex",
|
"components.Settings.plex": "Plex",
|
||||||
"components.Settings.plexlibraries": "Plex-Bibliotheken",
|
"components.Settings.plexlibraries": "Plex-Bibliotheken",
|
||||||
"components.Settings.plexlibrariesDescription": "Die Bibliotheken, welche Jellyseerr nach Titeln durchsucht. Richte deine Plex-Verbindungseinstellungen ein und speichere sie, klicke auf die Schaltfläche unten, wenn keine aufgeführt sind.",
|
"components.Settings.plexlibrariesDescription": "Die Bibliotheken, welche Jellyseerr nach Titeln durchsucht. Richte deine Plex Verbindungseinstellungen ein und speichere sie. Sollten keine aufgelistet sein, klicke auf den Button weiter unten.",
|
||||||
"components.Settings.plexsettings": "Plex-Einstellungen",
|
"components.Settings.plexsettings": "Plex-Einstellungen",
|
||||||
"components.Settings.plexsettingsDescription": "Konfiguriere die Einstellungen für deinen Plex-Server. Jellyseerr durchsucht deine Plex-Bibliotheken, um festzustellen welche Inhalte verfügbar sind.",
|
"components.Settings.plexsettingsDescription": "Konfiguriere die Einstellungen deines Plex Servers. Jellyseerr durchsucht deine Plex Bibliotheken zur Feststellung der verfügbaren Inhalte.",
|
||||||
"components.Settings.port": "Port",
|
"components.Settings.port": "Port",
|
||||||
"components.Settings.radarrsettings": "Radarr-Einstellungen",
|
"components.Settings.radarrsettings": "Radarr-Einstellungen",
|
||||||
"components.Settings.region": "Region Entdecken",
|
"components.Settings.restartrequiredTooltip": "Jellyseerr muss neu gestartet werden, damit Änderungen angewendet werden können",
|
||||||
"components.Settings.regionTip": "Filtere Inhalte nach regionaler Verfügbarkeit",
|
|
||||||
"components.Settings.restartrequiredTooltip": "Jellyseerr muss neu gestartet werden, damit Änderungen an dieser Einstellung wirksam werden",
|
|
||||||
"components.Settings.scan": "Bibliotheken synchronisieren",
|
"components.Settings.scan": "Bibliotheken synchronisieren",
|
||||||
"components.Settings.scanning": "Synchronisieren…",
|
"components.Settings.scanning": "Synchronisieren…",
|
||||||
"components.Settings.serverLocal": "lokal",
|
"components.Settings.serverLocal": "lokal",
|
||||||
@@ -840,26 +814,17 @@
|
|||||||
"components.Settings.startscan": "Durchsuchung starten",
|
"components.Settings.startscan": "Durchsuchung starten",
|
||||||
"components.Settings.tautulliApiKey": "API-Schlüssel",
|
"components.Settings.tautulliApiKey": "API-Schlüssel",
|
||||||
"components.Settings.tautulliSettings": "Tautulli Einstellungen",
|
"components.Settings.tautulliSettings": "Tautulli Einstellungen",
|
||||||
"components.Settings.tautulliSettingsDescription": "Optional die Einstellungen für den Tautulli-Server konfigurieren. Jellyseerr holt die Überwachungsdaten für Ihre Plex-Medien von Tautulli.",
|
"components.Settings.tautulliSettingsDescription": "Optionale Einstellungen für den Tautulli-Server konfigurieren. Jellyseerr holt die Überwachungsdaten für Ihre Plex-Medien von Tautulli.",
|
||||||
"components.Settings.toastApiKeyFailure": "Bei der Generierung eines neuen API-Schlüssels ist etwas schief gelaufen.",
|
|
||||||
"components.Settings.toastApiKeySuccess": "Neuer API-Schlüssel erfolgreich generiert!",
|
|
||||||
"components.Settings.toastPlexConnecting": "Versuche mit Plex zu verbinden …",
|
"components.Settings.toastPlexConnecting": "Versuche mit Plex zu verbinden …",
|
||||||
"components.Settings.toastPlexConnectingFailure": "Verbindung zu Plex fehlgeschlagen.",
|
"components.Settings.toastPlexConnectingFailure": "Verbindung zu Plex fehlgeschlagen.",
|
||||||
"components.Settings.toastPlexConnectingSuccess": "Plex-Verbindung erfolgreich hergestellt!",
|
"components.Settings.toastPlexConnectingSuccess": "Plex-Verbindung erfolgreich hergestellt!",
|
||||||
"components.Settings.toastPlexRefresh": "Abrufen der Serverliste von Plex …",
|
"components.Settings.toastPlexRefresh": "Abrufen der Serverliste von Plex …",
|
||||||
"components.Settings.toastPlexRefreshFailure": "Fehler beim Abrufen der Plex-Serverliste.",
|
"components.Settings.toastPlexRefreshFailure": "Fehler beim Abrufen der Plex-Serverliste.",
|
||||||
"components.Settings.toastPlexRefreshSuccess": "Plex-Serverliste erfolgreich abgerufen!",
|
"components.Settings.toastPlexRefreshSuccess": "Plex-Serverliste erfolgreich abgerufen!",
|
||||||
"components.Settings.toastSettingsFailure": "Beim Speichern der Einstellungen ist etwas schief gelaufen.",
|
|
||||||
"components.Settings.toastSettingsSuccess": "Einstellungen erfolgreich gespeichert!",
|
|
||||||
"components.Settings.toastTautulliSettingsFailure": "Beim Speichern der Tautulli-Einstellungen ist etwas schief gegangen.",
|
"components.Settings.toastTautulliSettingsFailure": "Beim Speichern der Tautulli-Einstellungen ist etwas schief gegangen.",
|
||||||
"components.Settings.toastTautulliSettingsSuccess": "Tautulli-Einstellungen erfolgreich gespeichert!",
|
"components.Settings.toastTautulliSettingsSuccess": "Tautulli-Einstellungen erfolgreich gespeichert!",
|
||||||
"components.Settings.trustProxy": "Proxy-Unterstützung aktivieren",
|
|
||||||
"components.Settings.trustProxyTip": "Erlaubt es Jellyseerr Client IP Adressen hinter einem Proxy korrekt zu registrieren (Jellyseerr muss neu gestartet werden, damit die Änderungen wirksam werden)",
|
|
||||||
"components.Settings.urlBase": "URL-Basis",
|
"components.Settings.urlBase": "URL-Basis",
|
||||||
"components.Settings.validationApiKey": "Die Angabe eines API-Schlüssels ist erforderlich",
|
"components.Settings.validationApiKey": "Die Angabe eines API-Schlüssels ist erforderlich",
|
||||||
"components.Settings.validationApplicationTitle": "Du musst einen Anwendungstitel angeben",
|
|
||||||
"components.Settings.validationApplicationUrl": "Du musst eine gültige URL angeben",
|
|
||||||
"components.Settings.validationApplicationUrlTrailingSlash": "Die URL darf nicht mit einem abschließenden Schrägstrich enden",
|
|
||||||
"components.Settings.validationHostnameRequired": "Ein gültiger Hostnamen oder eine IP-Adresse muss angeben werden",
|
"components.Settings.validationHostnameRequired": "Ein gültiger Hostnamen oder eine IP-Adresse muss angeben werden",
|
||||||
"components.Settings.validationPortRequired": "Du musst einen gültigen Port angeben",
|
"components.Settings.validationPortRequired": "Du musst einen gültigen Port angeben",
|
||||||
"components.Settings.validationUrl": "Die Angabe einer gültigen URL ist erforderlich",
|
"components.Settings.validationUrl": "Die Angabe einer gültigen URL ist erforderlich",
|
||||||
@@ -870,26 +835,19 @@
|
|||||||
"components.Settings.webAppUrlTip": "Leite Benutzer optional zur Web-App auf deinen Server statt zur „gehosteten“ Web-App weiter",
|
"components.Settings.webAppUrlTip": "Leite Benutzer optional zur Web-App auf deinen Server statt zur „gehosteten“ Web-App weiter",
|
||||||
"components.Settings.webhook": "Webhook",
|
"components.Settings.webhook": "Webhook",
|
||||||
"components.Settings.webpush": "Web Push",
|
"components.Settings.webpush": "Web Push",
|
||||||
"components.Setup.configureplex": "Plex konfigurieren",
|
|
||||||
"components.Setup.configureservices": "Dienste konfigurieren",
|
"components.Setup.configureservices": "Dienste konfigurieren",
|
||||||
"components.Setup.continue": "Fortfahren",
|
"components.Setup.continue": "Fortfahren",
|
||||||
"components.Setup.finish": "Konfiguration beenden",
|
"components.Setup.finish": "Konfiguration beenden",
|
||||||
"components.Setup.finishing": "Fertigstellung …",
|
"components.Setup.finishing": "Fertigstellung …",
|
||||||
"components.Setup.loginwithplex": "Mit Plex anmelden",
|
|
||||||
"components.Setup.scanbackground": "Das Scannen läuft im Hintergrund. Du kannst in der Zwischenzeit das Setup fortsetzen.",
|
|
||||||
"components.Setup.setup": "Einrichtung",
|
"components.Setup.setup": "Einrichtung",
|
||||||
"components.Setup.signinMessage": "Melde dich zunächst mit deinem Plex-Konto an",
|
"components.Setup.signinMessage": "Melde dich zunächst an",
|
||||||
"components.Setup.tip": "Tipp",
|
|
||||||
"components.Setup.welcome": "Willkommen bei Jellyseerr",
|
"components.Setup.welcome": "Willkommen bei Jellyseerr",
|
||||||
"components.StatusBadge.managemedia": "{mediaType} verwalten",
|
"components.StatusBadge.managemedia": "{mediaType} verwalten",
|
||||||
"components.StatusBadge.openinarr": "In {arr} öffnen",
|
"components.StatusBadge.openinarr": "In {arr} öffnen",
|
||||||
"components.StatusBadge.playonplex": "Auf Plex abspielen",
|
"components.StatusBadge.playonplex": "Auf {mediaServerName} abspielen",
|
||||||
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}F{episodeNumber}",
|
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}F{episodeNumber}",
|
||||||
"components.StatusBadge.status": "{status}",
|
"components.StatusBadge.status": "{status}",
|
||||||
"components.StatusBadge.status4k": "4K {status}",
|
"components.StatusBadge.status4k": "4K {status}",
|
||||||
"components.StatusChacker.newversionDescription": "Jellyseerr wurde aktualisiert! Bitte klicke auf die Schaltfläche unten, um die Seite neu zu laden.",
|
|
||||||
"components.StatusChacker.newversionavailable": "Anwendungsaktualisierung",
|
|
||||||
"components.StatusChacker.reloadJellyseerr": "Jellyseerr neu laden",
|
|
||||||
"components.StatusChecker.appUpdated": "{applicationTitle} aktualisiert",
|
"components.StatusChecker.appUpdated": "{applicationTitle} aktualisiert",
|
||||||
"components.StatusChecker.appUpdatedDescription": "Klicke bitte auf die Schaltfläche unten, um die Anwendung neu zu laden.",
|
"components.StatusChecker.appUpdatedDescription": "Klicke bitte auf die Schaltfläche unten, um die Anwendung neu zu laden.",
|
||||||
"components.StatusChecker.reloadApp": "{applicationTitle} neu laden",
|
"components.StatusChecker.reloadApp": "{applicationTitle} neu laden",
|
||||||
@@ -916,8 +874,6 @@
|
|||||||
"components.TvDetails.originaltitle": "Originaltitel",
|
"components.TvDetails.originaltitle": "Originaltitel",
|
||||||
"components.TvDetails.overview": "Übersicht",
|
"components.TvDetails.overview": "Übersicht",
|
||||||
"components.TvDetails.overviewunavailable": "Übersicht nicht verfügbar.",
|
"components.TvDetails.overviewunavailable": "Übersicht nicht verfügbar.",
|
||||||
"components.TvDetails.play4konplex": "In 4K auf Plex abspielen",
|
|
||||||
"components.TvDetails.playonplex": "Auf Plex abspielen",
|
|
||||||
"components.TvDetails.productioncountries": "Produktions {countryCount, plural, one {Land} other {Länder}}",
|
"components.TvDetails.productioncountries": "Produktions {countryCount, plural, one {Land} other {Länder}}",
|
||||||
"components.TvDetails.recommendations": "Empfehlungen",
|
"components.TvDetails.recommendations": "Empfehlungen",
|
||||||
"components.TvDetails.reportissue": "Problem melden",
|
"components.TvDetails.reportissue": "Problem melden",
|
||||||
@@ -944,7 +900,6 @@
|
|||||||
"components.UserList.creating": "Erstelle…",
|
"components.UserList.creating": "Erstelle…",
|
||||||
"components.UserList.deleteconfirm": "Möchtest du diesen Benutzer wirklich löschen? Alle seine Anfragendaten werden dauerhaft entfernt.",
|
"components.UserList.deleteconfirm": "Möchtest du diesen Benutzer wirklich löschen? Alle seine Anfragendaten werden dauerhaft entfernt.",
|
||||||
"components.UserList.deleteuser": "Benutzer löschen",
|
"components.UserList.deleteuser": "Benutzer löschen",
|
||||||
"components.UserList.displayName": "Anzeigename",
|
|
||||||
"components.UserList.edituser": "Benutzerberechtigungen Bearbeiten",
|
"components.UserList.edituser": "Benutzerberechtigungen Bearbeiten",
|
||||||
"components.UserList.email": "E-Mail-Adresse",
|
"components.UserList.email": "E-Mail-Adresse",
|
||||||
"components.UserList.importedfromplex": "<strong>{userCount}</strong> {userCount, Plural, ein {Benutzer} other {Benutzer}} Plex-Benutzer erfolgreich importiert!",
|
"components.UserList.importedfromplex": "<strong>{userCount}</strong> {userCount, Plural, ein {Benutzer} other {Benutzer}} Plex-Benutzer erfolgreich importiert!",
|
||||||
@@ -970,7 +925,7 @@
|
|||||||
"i18n.experimental": "Experimentell",
|
"i18n.experimental": "Experimentell",
|
||||||
"components.UserList.userssaved": "Benutzerberechtigungen erfolgreich gespeichert!",
|
"components.UserList.userssaved": "Benutzerberechtigungen erfolgreich gespeichert!",
|
||||||
"i18n.advanced": "Erweitert",
|
"i18n.advanced": "Erweitert",
|
||||||
"components.UserList.validationEmail": "Du musst eine gültige E-Mail-Adresse angeben",
|
"components.UserList.validationEmail": "E-Mail-Adresse benötigt",
|
||||||
"components.UserList.users": "Benutzer",
|
"components.UserList.users": "Benutzer",
|
||||||
"components.UserProfile.recentrequests": "Kürzliche Anfragen",
|
"components.UserProfile.recentrequests": "Kürzliche Anfragen",
|
||||||
"components.UserProfile.UserSettings.menuPermissions": "Berechtigungen",
|
"components.UserProfile.UserSettings.menuPermissions": "Berechtigungen",
|
||||||
@@ -1129,7 +1084,7 @@
|
|||||||
"components.Settings.SettingsMain.validationApplicationUrl": "Du musst eine valide URL spezifizieren",
|
"components.Settings.SettingsMain.validationApplicationUrl": "Du musst eine valide URL spezifizieren",
|
||||||
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "Die URL darf nicht mit einem Slash \"/\" enden",
|
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "Die URL darf nicht mit einem Slash \"/\" enden",
|
||||||
"components.Discover.DiscoverMovieKeyword.keywordMovies": "{keywordTitle} Filme",
|
"components.Discover.DiscoverMovieKeyword.keywordMovies": "{keywordTitle} Filme",
|
||||||
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Deine Plex Watchlist",
|
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Deine Watchlist",
|
||||||
"components.Discover.tmdbsearch": "TMDB Suche",
|
"components.Discover.tmdbsearch": "TMDB Suche",
|
||||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Etwas ist schiefgelaufen während der Generierung eines neuen API Schlüssels.",
|
"components.Settings.SettingsMain.toastApiKeyFailure": "Etwas ist schiefgelaufen während der Generierung eines neuen API Schlüssels.",
|
||||||
"components.Settings.SettingsMain.toastSettingsSuccess": "Einstellungen erfolgreich gespeichert!",
|
"components.Settings.SettingsMain.toastSettingsSuccess": "Einstellungen erfolgreich gespeichert!",
|
||||||
@@ -1142,15 +1097,13 @@
|
|||||||
"components.Discover.tmdbstudio": "TMDB Studio",
|
"components.Discover.tmdbstudio": "TMDB Studio",
|
||||||
"components.Settings.SettingsMain.applicationurl": "Anwendung URL",
|
"components.Settings.SettingsMain.applicationurl": "Anwendung URL",
|
||||||
"components.Settings.SettingsMain.cacheImages": "Bild-Caching aktivieren",
|
"components.Settings.SettingsMain.cacheImages": "Bild-Caching aktivieren",
|
||||||
"components.Settings.SettingsMain.generalsettingsDescription": "Konfiguration der globalen und Standardeinstellungen für Jellyseerr.",
|
"components.Settings.SettingsMain.generalsettingsDescription": "Globale- und Standardeinstellungen für Jellyseerr konfigurieren.",
|
||||||
"components.Settings.SettingsMain.originallanguage": "\"Entdecken\" Sprache",
|
"components.Settings.SettingsMain.originallanguage": "\"Entdecken\" Sprache",
|
||||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Teilweise Serienanfragen zulassen",
|
"components.Settings.SettingsMain.partialRequestsEnabled": "Teilweise Serienanfragen zulassen",
|
||||||
"components.Settings.SettingsMain.region": "\"Entdecken\" Region",
|
|
||||||
"components.Settings.SettingsMain.toastSettingsFailure": "Beim Speichern der Einstellungen ist ein Fehler aufgetreten.",
|
"components.Settings.SettingsMain.toastSettingsFailure": "Beim Speichern der Einstellungen ist ein Fehler aufgetreten.",
|
||||||
"components.Settings.SettingsMain.regionTip": "Inhalte nach regionaler Verfügbarkeit filtern",
|
|
||||||
"components.Discover.tmdbnetwork": "TMDB Sender",
|
"components.Discover.tmdbnetwork": "TMDB Sender",
|
||||||
"components.Settings.SettingsMain.originallanguageTip": "Inhalt nach Originalsprache filtern",
|
"components.Settings.SettingsMain.originallanguageTip": "Inhalt nach Originalsprache filtern",
|
||||||
"components.Settings.SettingsMain.trustProxyTip": "Erlaube Jellyseerr, Client-IP-Adressen hinter einem Proxy korrekt zu registrieren",
|
"components.Settings.SettingsMain.trustProxyTip": "Erlaube Jellyseerr die Client-IP-Adressen hinter einem Proxy korrekt zu erfassen",
|
||||||
"components.Discover.CreateSlider.addSlider": "Slider hinzufügen",
|
"components.Discover.CreateSlider.addSlider": "Slider hinzufügen",
|
||||||
"components.Discover.CreateSlider.addcustomslider": "Benutzerdefinierten Slider erstellen",
|
"components.Discover.CreateSlider.addcustomslider": "Benutzerdefinierten Slider erstellen",
|
||||||
"components.Discover.CreateSlider.addfail": "Neuer Slider konnte nicht erstellt werden.",
|
"components.Discover.CreateSlider.addfail": "Neuer Slider konnte nicht erstellt werden.",
|
||||||
@@ -1247,7 +1200,6 @@
|
|||||||
"components.Layout.UserWarnings.emailInvalid": "E-Mail ist nicht valide.",
|
"components.Layout.UserWarnings.emailInvalid": "E-Mail ist nicht valide.",
|
||||||
"components.Login.credentialerror": "Der Benutzername oder das Passwort ist falsch.",
|
"components.Login.credentialerror": "Der Benutzername oder das Passwort ist falsch.",
|
||||||
"components.Login.emailtooltip": "Die Adresse muss nicht mit Ihrer {mediaServerName}-Instanz verbunden sein.",
|
"components.Login.emailtooltip": "Die Adresse muss nicht mit Ihrer {mediaServerName}-Instanz verbunden sein.",
|
||||||
"components.Login.host": "{mediaServerName} URL",
|
|
||||||
"components.Login.initialsignin": "Verbinde",
|
"components.Login.initialsignin": "Verbinde",
|
||||||
"components.Login.initialsigningin": "Verbinden…",
|
"components.Login.initialsigningin": "Verbinden…",
|
||||||
"components.Login.save": "hinzufügen",
|
"components.Login.save": "hinzufügen",
|
||||||
@@ -1279,8 +1231,8 @@
|
|||||||
"components.Settings.syncing": "Synchronisierung",
|
"components.Settings.syncing": "Synchronisierung",
|
||||||
"components.Settings.timeout": "Zeitüberschreitung",
|
"components.Settings.timeout": "Zeitüberschreitung",
|
||||||
"components.Setup.signin": "Anmelden",
|
"components.Setup.signin": "Anmelden",
|
||||||
"components.Setup.signinWithJellyfin": "Verwende dein {mediaServerName} Konto",
|
"components.Setup.signinWithJellyfin": "Gib deine Jellyfin Daten ein",
|
||||||
"components.Setup.signinWithPlex": "Verwende dein Plex-Konto",
|
"components.Setup.signinWithPlex": "Gib deine Plex Daten ein",
|
||||||
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Erfolgreich von der Beobachtungsliste entfernt!",
|
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Erfolgreich von der Beobachtungsliste entfernt!",
|
||||||
"components.TitleCard.watchlistError": "Etwas ist schief gelaufen, versuche es noch einmal.",
|
"components.TitleCard.watchlistError": "Etwas ist schief gelaufen, versuche es noch einmal.",
|
||||||
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> erfolgreich zur Beobachtungsliste hinzugefügt!",
|
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> erfolgreich zur Beobachtungsliste hinzugefügt!",
|
||||||
@@ -1303,7 +1255,7 @@
|
|||||||
"i18n.deleting": "Löschen…",
|
"i18n.deleting": "Löschen…",
|
||||||
"i18n.failed": "Fehlgeschlagen",
|
"i18n.failed": "Fehlgeschlagen",
|
||||||
"i18n.movies": "Filme",
|
"i18n.movies": "Filme",
|
||||||
"i18n.open": "Öffnen",
|
"i18n.open": "Offen",
|
||||||
"i18n.pending": "Ausstehend",
|
"i18n.pending": "Ausstehend",
|
||||||
"i18n.processing": "Verarbeitung",
|
"i18n.processing": "Verarbeitung",
|
||||||
"i18n.request": "Anfrage",
|
"i18n.request": "Anfrage",
|
||||||
@@ -1316,8 +1268,7 @@
|
|||||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Gerätestandard",
|
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Gerätestandard",
|
||||||
"components.Settings.RadarrModal.tagRequests": "Tag-Anfragen",
|
"components.Settings.RadarrModal.tagRequests": "Tag-Anfragen",
|
||||||
"components.Settings.SettingsAbout.supportjellyseerr": "Jellyseerr unterstützen",
|
"components.Settings.SettingsAbout.supportjellyseerr": "Jellyseerr unterstützen",
|
||||||
"components.Settings.internalUrl": "Interne URL",
|
"components.Settings.jellyfinSettingsDescription": "Konfiguriere optional die internen und externen Endpunkte für deinen {mediaServerName} Server. In den meisten Fällen ist die externe URL eine andere als die interne URL. Für die Anmeldung bei {mediaServerName} kann auch eine benutzerdefinierte URL zum Zurücksetzen des Passworts festgelegt werden, falls du auf eine andere Seite zum Zurücksetzen des Passworts umleiten möchtest. Du kannst auch selber einen API Key für Jellyfin anlegen, was bisher automatisch geschah.",
|
||||||
"components.Settings.jellyfinSettingsDescription": "Konfiguriere optional die internen und externen Endpunkte für deinen {mediaServerName} Server. In den meisten Fällen ist die externe URL eine andere als die interne URL. Für die Anmeldung bei {mediaServerName} kann auch eine benutzerdefinierte URL zum Zurücksetzen des Passworts festgelegt werden, falls du auf eine andere Seite zum Zurücksetzen des Passworts umleiten möchtest.",
|
|
||||||
"components.Settings.jellyfinSettingsFailure": "Beim Speichern der Einstellungen von {mediaServerName} ist ein Fehler aufgetreten.",
|
"components.Settings.jellyfinSettingsFailure": "Beim Speichern der Einstellungen von {mediaServerName} ist ein Fehler aufgetreten.",
|
||||||
"components.Settings.manualscanDescriptionJellyfin": "Normalerweise wird dieser Vorgang nur einmal alle 24 Stunden durchgeführt. Jellyseerr wird die kürzlich hinzugefügten Bibliotheken deines {mediaServerName} Servers aggressiver überprüfen. Wenn dies das erste Mal ist, dass du Jellyseerr konfigurierst, wird ein einmaliger vollständiger manueller Bibliotheks-Scan empfohlen!",
|
"components.Settings.manualscanDescriptionJellyfin": "Normalerweise wird dieser Vorgang nur einmal alle 24 Stunden durchgeführt. Jellyseerr wird die kürzlich hinzugefügten Bibliotheken deines {mediaServerName} Servers aggressiver überprüfen. Wenn dies das erste Mal ist, dass du Jellyseerr konfigurierst, wird ein einmaliger vollständiger manueller Bibliotheks-Scan empfohlen!",
|
||||||
"components.Settings.save": "Änderungen speichern",
|
"components.Settings.save": "Änderungen speichern",
|
||||||
@@ -1345,5 +1296,55 @@
|
|||||||
"components.UserProfile.UserSettings.UserNotificationSettings.webpushsettingsfailed": "Die Einstellungen für Web-Push-Benachrichtigungen konnten nicht gespeichert werden.",
|
"components.UserProfile.UserSettings.UserNotificationSettings.webpushsettingsfailed": "Die Einstellungen für Web-Push-Benachrichtigungen konnten nicht gespeichert werden.",
|
||||||
"components.UserProfile.localWatchlist": "Beobachtungsliste von {username}",
|
"components.UserProfile.localWatchlist": "Beobachtungsliste von {username}",
|
||||||
"i18n.approved": "Genehmigt",
|
"i18n.approved": "Genehmigt",
|
||||||
"pages.returnHome": "Zurück nach Hause"
|
"pages.returnHome": "Zurück nach Hause",
|
||||||
|
"components.Discover.FilterSlideover.status": "Status",
|
||||||
|
"components.UserList.username": "Benutzername",
|
||||||
|
"components.Login.adminerror": "Du musst einen Adminaccount für den Zugang benutzen.",
|
||||||
|
"components.MovieDetails.watchlistError": "Da ist was schief gelaufen - bitte versuche es noch einmal.",
|
||||||
|
"components.RequestList.RequestItem.profileName": "Profil",
|
||||||
|
"components.Selector.searchStatus": "Status auswählen...",
|
||||||
|
"components.Settings.invalidurlerror": "Es kann keine Verbindung zu {mediaServerName} hergestellt werden.",
|
||||||
|
"components.Settings.jellyfinSyncFailedGenericError": "Es trat ein unbekannter Fehler während der Bibliothekssynchronisation auf",
|
||||||
|
"components.UserList.validationUsername": "Du musst einen Benutzernamen angeben",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.validationemailrequired": "Email benötigt",
|
||||||
|
"components.Login.invalidurlerror": "Es kann keine Verbindung zu {mediaServerName} hergestellt werden.",
|
||||||
|
"components.MovieDetails.removefromwatchlist": "Von der Watchlist entfernen",
|
||||||
|
"components.TvDetails.watchlistDeleted": "<strong>{title}</strong> erfolgreich aus der Watchlist entfernt!",
|
||||||
|
"components.Login.back": "Zurück",
|
||||||
|
"components.Login.servertype": "Servertyp",
|
||||||
|
"components.Login.validationHostnameRequired": "Du musst eine gültige IP-Adresse oder einen gültigen Hostnamen angeben",
|
||||||
|
"components.Login.validationPortRequired": "Du musst einen gültigen Port angeben",
|
||||||
|
"components.Login.validationUrlBaseLeadingSlash": "Der URL muss ein Slash vorangestellt sein",
|
||||||
|
"components.Login.validationUrlBaseTrailingSlash": "Die URL-Basis darf nicht auf einem Slash enden",
|
||||||
|
"components.Login.validationUrlTrailingSlash": "Die URL darf nicht auf einem Slash enden",
|
||||||
|
"components.Login.validationservertyperequired": "Bitte wähle einen Servertypen",
|
||||||
|
"components.MovieDetails.addtowatchlist": "Zur Watchlist hinzufügen",
|
||||||
|
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> erfolgreich aus der Watchlist entfernt!",
|
||||||
|
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> erfolgreich zur Watchlist hinzugefügt!",
|
||||||
|
"components.Selector.canceled": "Abgebrochen",
|
||||||
|
"components.Selector.ended": "Beendet",
|
||||||
|
"components.Selector.inProduction": "In Produktion",
|
||||||
|
"components.Selector.pilot": "Pilotfolge",
|
||||||
|
"components.Selector.planned": "Geplant",
|
||||||
|
"components.Selector.returningSeries": "Wiederkehrende Serie",
|
||||||
|
"components.Setup.back": "Zurückgehen",
|
||||||
|
"components.Setup.configemby": "Emby konfigurieren",
|
||||||
|
"components.Setup.configjellyfin": "Jellyfin konfigurieren",
|
||||||
|
"components.Setup.configplex": "Plex konfigurieren",
|
||||||
|
"components.Setup.servertype": "Servertyp auswählen",
|
||||||
|
"components.Setup.signinWithEmby": "Emby-Daten eintragen",
|
||||||
|
"components.Setup.subtitle": "Leg los, indem du einen Medienserver auswählst",
|
||||||
|
"components.StatusBadge.seasonnumber": "S{seasonNumber}",
|
||||||
|
"components.TvDetails.addtowatchlist": "Zur Watchlist hinzufügen",
|
||||||
|
"components.TvDetails.removefromwatchlist": "Von der Watchlist entfernen",
|
||||||
|
"components.TvDetails.watchlistError": "Da lief etwas falsch, versuch es noch einmal.",
|
||||||
|
"components.TvDetails.watchlistSuccess": "<strong>{title}</strong> erfolgreich zur Watchlist hinzugefügt!",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.validationemailformat": "Gültige email benötigt",
|
||||||
|
"components.Login.hostname": "{mediaServerName} URL",
|
||||||
|
"components.Login.port": "Port",
|
||||||
|
"components.Login.urlBase": "URL-Basis",
|
||||||
|
"components.Login.enablessl": "Benutze SSL",
|
||||||
|
"components.Settings.jellyfinForgotPasswordUrl": "Passwort vergessen URL",
|
||||||
|
"components.Settings.jellyfinSyncFailedAutomaticGroupedFolders": "Eine benutzerdefinierte Authentifizierung mit automatischer Bibliotheksbündelung wird nicht unterstützt",
|
||||||
|
"components.Settings.jellyfinSyncFailedNoLibrariesFound": "Es wurden keine Bibliotheken gefunden"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
{
|
{
|
||||||
"components.PermissionEdit.users": "Διαχείριση Χρηστών",
|
"components.PermissionEdit.users": "Διαχείριση Χρηστών",
|
||||||
"components.PermissionEdit.settingsDescription": "Εκχώρηση άδειας για τροποποίηση των ρυθμίσεων Jellyseerr. Ένας χρήστης χρειάζεται να έχει αυτό το δικαίωμα για να το εκχωρήσει σε άλλους.",
|
|
||||||
"components.PermissionEdit.settings": "Διαχείριση Ρυθμίσεων",
|
|
||||||
"components.PermissionEdit.requestTvDescription": "Χορήγηση άδειας για υποβολής αιτημάτων σειρών που δεν είναι 4K.",
|
"components.PermissionEdit.requestTvDescription": "Χορήγηση άδειας για υποβολής αιτημάτων σειρών που δεν είναι 4K.",
|
||||||
"components.PermissionEdit.requestTv": "Αιτήματα για Σειρές",
|
"components.PermissionEdit.requestTv": "Αιτήματα για Σειρές",
|
||||||
"components.PermissionEdit.requestMoviesDescription": "Χορήγηση άδειας για υποβολή αιτημάτων ταινιών που δεν είναι 4K.",
|
"components.PermissionEdit.requestMoviesDescription": "Χορήγηση άδειας για υποβολή αιτημάτων ταινιών που δεν είναι 4K.",
|
||||||
@@ -52,8 +50,6 @@
|
|||||||
"components.MovieDetails.revenue": "Έσοδα",
|
"components.MovieDetails.revenue": "Έσοδα",
|
||||||
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Release Date} other {Release Dates}}",
|
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Release Date} other {Release Dates}}",
|
||||||
"components.MovieDetails.recommendations": "Προτάσεις",
|
"components.MovieDetails.recommendations": "Προτάσεις",
|
||||||
"components.MovieDetails.playonplex": "Αναπαραγωγή στο Plex",
|
|
||||||
"components.MovieDetails.play4konplex": "Αναπαραγωγή σε 4K στο Plex",
|
|
||||||
"components.MovieDetails.overviewunavailable": "Επισκόπηση μη διαθέσιμη.",
|
"components.MovieDetails.overviewunavailable": "Επισκόπηση μη διαθέσιμη.",
|
||||||
"components.MovieDetails.overview": "Επισκόπηση",
|
"components.MovieDetails.overview": "Επισκόπηση",
|
||||||
"components.MovieDetails.originaltitle": "Αρχικός Τίτλος",
|
"components.MovieDetails.originaltitle": "Αρχικός Τίτλος",
|
||||||
@@ -78,8 +74,6 @@
|
|||||||
"components.Login.email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
|
"components.Login.email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
|
||||||
"components.Layout.VersionStatus.streamstable": "Overseer Σταθερή Έκδοση",
|
"components.Layout.VersionStatus.streamstable": "Overseer Σταθερή Έκδοση",
|
||||||
"components.Discover.popularmovies": "Δημοφιλείς Ταινίες",
|
"components.Discover.popularmovies": "Δημοφιλείς Ταινίες",
|
||||||
"components.Discover.discovertv": "Δημοφιλείς Σειρές",
|
|
||||||
"components.Discover.discovermovies": "Δημοφιλείς Ταινίες",
|
|
||||||
"components.Discover.discover": "Ανακάλυψε",
|
"components.Discover.discover": "Ανακάλυψε",
|
||||||
"components.Discover.TvGenreSlider.tvgenres": "Είδη Σειρών",
|
"components.Discover.TvGenreSlider.tvgenres": "Είδη Σειρών",
|
||||||
"components.Discover.TvGenreList.seriesgenres": "Είδη Σειρών",
|
"components.Discover.TvGenreList.seriesgenres": "Είδη Σειρών",
|
||||||
@@ -619,8 +613,6 @@
|
|||||||
"components.TvDetails.showtype": "Τύπος σειράς",
|
"components.TvDetails.showtype": "Τύπος σειράς",
|
||||||
"components.TvDetails.seasons": "{seasonCount, plural, one {# Σεζόν} other {# Σεζόν}}",
|
"components.TvDetails.seasons": "{seasonCount, plural, one {# Σεζόν} other {# Σεζόν}}",
|
||||||
"components.TvDetails.recommendations": "Προτάσεις",
|
"components.TvDetails.recommendations": "Προτάσεις",
|
||||||
"components.TvDetails.playonplex": "Αναπαραγωγή στο Plex",
|
|
||||||
"components.TvDetails.play4konplex": "Αναπαραγωγή σε 4K στο Plex",
|
|
||||||
"components.TvDetails.overviewunavailable": "Επισκόπηση μη διαθέσιμη.",
|
"components.TvDetails.overviewunavailable": "Επισκόπηση μη διαθέσιμη.",
|
||||||
"components.TvDetails.overview": "Επισκόπηση",
|
"components.TvDetails.overview": "Επισκόπηση",
|
||||||
"components.TvDetails.originaltitle": "Αρχικός τίτλος",
|
"components.TvDetails.originaltitle": "Αρχικός τίτλος",
|
||||||
@@ -634,41 +626,25 @@
|
|||||||
"components.TvDetails.anime": "Anime",
|
"components.TvDetails.anime": "Anime",
|
||||||
"components.TvDetails.TvCrew.fullseriescrew": "Όλο το Πλήρωμα της Σειράς",
|
"components.TvDetails.TvCrew.fullseriescrew": "Όλο το Πλήρωμα της Σειράς",
|
||||||
"components.TvDetails.TvCast.fullseriescast": "Όλοι οι Ηθοποιοί της Σειράς",
|
"components.TvDetails.TvCast.fullseriescast": "Όλοι οι Ηθοποιοί της Σειράς",
|
||||||
"components.StatusChacker.reloadOverseerr": "Επαναφόρτωση",
|
|
||||||
"components.StatusChacker.newversionavailable": "Ενημέρωση εφαρμογής",
|
|
||||||
"components.StatusChacker.newversionDescription": "Το Jellyseerr έχει ενημερωθεί! Κάνε κλικ στο παρακάτω κουμπί για να φορτώσει ξανά η σελίδα.",
|
|
||||||
"components.StatusBadge.status4k": "4K {status}",
|
"components.StatusBadge.status4k": "4K {status}",
|
||||||
"components.Setup.welcome": "Καλώς ήρθες στο Jellyseerr",
|
"components.Setup.welcome": "Καλώς ήρθες στο Jellyseerr",
|
||||||
"components.Setup.tip": "Συμβουλή",
|
|
||||||
"components.Setup.signinMessage": "Ξεκίνα με την σύνδεση στον λογαριασμό του Plex σου",
|
"components.Setup.signinMessage": "Ξεκίνα με την σύνδεση στον λογαριασμό του Plex σου",
|
||||||
"components.Setup.setup": "Εγκατάσταση",
|
"components.Setup.setup": "Εγκατάσταση",
|
||||||
"components.Setup.scanbackground": "Η σάρωση θα εκτελείται στο παρασκήνιο. Εν τω μεταξύ, μπορείς να συνεχίσεις την διαδικασία εγκατάστασης.",
|
|
||||||
"components.Setup.loginwithplex": "Συνδέσου με το Plex",
|
|
||||||
"components.Setup.finishing": "Ολοκληρώνει…",
|
"components.Setup.finishing": "Ολοκληρώνει…",
|
||||||
"components.Setup.finish": "Ολοκλήρωση εγκατάστασης",
|
"components.Setup.finish": "Ολοκλήρωση εγκατάστασης",
|
||||||
"components.Setup.continue": "Συνέχεια",
|
"components.Setup.continue": "Συνέχεια",
|
||||||
"components.Setup.configureservices": "Διαμόρφωση υπηρεσιών",
|
"components.Setup.configureservices": "Διαμόρφωση υπηρεσιών",
|
||||||
"components.Setup.configureplex": "Διαμόρφωση του Plex",
|
|
||||||
"components.Settings.webpush": "Web Push",
|
"components.Settings.webpush": "Web Push",
|
||||||
"components.Settings.webhook": "Webhook",
|
"components.Settings.webhook": "Webhook",
|
||||||
"components.Settings.webAppUrlTip": "Προαιρετικά κατεύθυνε τους χρήστες στην εφαρμογή ιστού στον διακομιστή σας αντί για την εφαρμογή ιστού που \"φιλοξενείται\"",
|
"components.Settings.webAppUrlTip": "Προαιρετικά κατεύθυνε τους χρήστες στην εφαρμογή ιστού στον διακομιστή σας αντί για την εφαρμογή ιστού που \"φιλοξενείται\"",
|
||||||
"components.Settings.webAppUrl": "<WebAppLink>Web App</WebAppLink> διεύθυνση URL",
|
"components.Settings.webAppUrl": "<WebAppLink>Web App</WebAppLink> διεύθυνση URL",
|
||||||
"components.Settings.validationPortRequired": "Πρέπει να δώσεις έναν έγκυρο αριθμό θύρας",
|
"components.Settings.validationPortRequired": "Πρέπει να δώσεις έναν έγκυρο αριθμό θύρας",
|
||||||
"components.Settings.validationApplicationUrlTrailingSlash": "Η διεύθυνση URL δεν πρέπει να τελειώνει με κάθετο",
|
|
||||||
"components.Settings.validationApplicationUrl": "Πρέπει να βάλεις μια έγκυρη διεύθυνση URL",
|
|
||||||
"components.Settings.validationApplicationTitle": "Πρέπει να δώσεις έναν τίτλο εφαρμογής",
|
|
||||||
"components.Settings.trustProxyTip": "Επίτρεψε στο Jellyseerr να καταχωρίζει σωστά τις διευθύνσεις IP του πελάτη πίσω από έναν διακομιστή μεσολάβησης (το Jellyseerr πρέπει να φορτωθεί ξανά για να εφαρμοστούν οι αλλαγές)",
|
|
||||||
"components.Settings.trustProxy": "Ενεργοποίηση υποστήριξης διαμεσολαβητή",
|
|
||||||
"components.Settings.toastSettingsSuccess": "Οι ρυθμίσεις αποθηκεύτηκαν με επιτυχία!",
|
|
||||||
"components.Settings.toastSettingsFailure": "Κάτι πήγε στραβά κατά την αποθήκευση των ρυθμίσεων.",
|
|
||||||
"components.Settings.toastPlexRefreshSuccess": "Η λίστα διακομιστών Plex ανακτήθηκε με επιτυχία!",
|
"components.Settings.toastPlexRefreshSuccess": "Η λίστα διακομιστών Plex ανακτήθηκε με επιτυχία!",
|
||||||
"components.Settings.toastPlexRefreshFailure": "Απέτυχε η ανάκτηση της λίστας με τους διακομιστές Plex.",
|
"components.Settings.toastPlexRefreshFailure": "Απέτυχε η ανάκτηση της λίστας με τους διακομιστές Plex.",
|
||||||
"components.Settings.toastPlexRefresh": "Ανάκτηση λίστας διακομιστών από το Plex…",
|
"components.Settings.toastPlexRefresh": "Ανάκτηση λίστας διακομιστών από το Plex…",
|
||||||
"components.Settings.toastPlexConnectingSuccess": "Η σύνδεση Plex δημιουργήθηκε με επιτυχία!",
|
"components.Settings.toastPlexConnectingSuccess": "Η σύνδεση Plex δημιουργήθηκε με επιτυχία!",
|
||||||
"components.Settings.toastPlexConnectingFailure": "Απέτυχε να συνδεθεί στο Plex.",
|
"components.Settings.toastPlexConnectingFailure": "Απέτυχε να συνδεθεί στο Plex.",
|
||||||
"components.Settings.toastPlexConnecting": "Προσπάθεια σύνδεσης στο Plex…",
|
"components.Settings.toastPlexConnecting": "Προσπάθεια σύνδεσης στο Plex…",
|
||||||
"components.Settings.toastApiKeySuccess": "Δημιουργήθηκε νέο κλειδί API με επιτυχία!",
|
|
||||||
"components.Settings.toastApiKeyFailure": "Κάτι πήγε στραβά κατά τη δημιουργία νέου κλειδιού API.",
|
|
||||||
"components.Settings.startscan": "Έναρξη σάρωσης",
|
"components.Settings.startscan": "Έναρξη σάρωσης",
|
||||||
"components.Settings.ssl": "SSL",
|
"components.Settings.ssl": "SSL",
|
||||||
"components.Settings.sonarrsettings": "Ρυθμίσεις Sonarr",
|
"components.Settings.sonarrsettings": "Ρυθμίσεις Sonarr",
|
||||||
@@ -684,8 +660,6 @@
|
|||||||
"components.Settings.serverLocal": "τοπικά",
|
"components.Settings.serverLocal": "τοπικά",
|
||||||
"components.Settings.scanning": "Συγχρονίζει…",
|
"components.Settings.scanning": "Συγχρονίζει…",
|
||||||
"components.Settings.scan": "Συγχρονισμός των βιβλιοθήκων",
|
"components.Settings.scan": "Συγχρονισμός των βιβλιοθήκων",
|
||||||
"components.Settings.regionTip": "Φιλτράρει το περιεχόμενο βάσει της διαθεσιμότητας του περιεχομένου",
|
|
||||||
"components.Settings.region": "Ανακάλυψε βάσει την περιοχή",
|
|
||||||
"components.Settings.radarrsettings": "Ρυθμίσεις Radarr",
|
"components.Settings.radarrsettings": "Ρυθμίσεις Radarr",
|
||||||
"components.Settings.port": "Θύρα",
|
"components.Settings.port": "Θύρα",
|
||||||
"components.Settings.plexsettingsDescription": "Διαμόρφωσε τις ρυθμίσεις του Plex διακομιστή σου. Το Jellyseerr σαρώνει τις βιβλιοθήκες του Plex για να προσδιορίσει τη διαθεσιμότητα περιεχομένου.",
|
"components.Settings.plexsettingsDescription": "Διαμόρφωσε τις ρυθμίσεις του Plex διακομιστή σου. Το Jellyseerr σαρώνει τις βιβλιοθήκες του Plex για να προσδιορίσει τη διαθεσιμότητα περιεχομένου.",
|
||||||
@@ -693,9 +667,6 @@
|
|||||||
"components.Settings.plexlibrariesDescription": "Οι βιβλιοθήκες που το Jellyseerr θα σαρώνει για τίτλους. Ρύθμισε και αποθήκευσε τις ρυθμίσεις της σύνδεσης του Plex και, στη συνέχεια, κάνε κλικ στο παρακάτω κουμπί, εάν δεν εμφανιστύν οι βιβλιοθήκες.",
|
"components.Settings.plexlibrariesDescription": "Οι βιβλιοθήκες που το Jellyseerr θα σαρώνει για τίτλους. Ρύθμισε και αποθήκευσε τις ρυθμίσεις της σύνδεσης του Plex και, στη συνέχεια, κάνε κλικ στο παρακάτω κουμπί, εάν δεν εμφανιστύν οι βιβλιοθήκες.",
|
||||||
"components.Settings.plexlibraries": "Βιβλιοθήκες Plex",
|
"components.Settings.plexlibraries": "Βιβλιοθήκες Plex",
|
||||||
"components.Settings.plex": "Plex",
|
"components.Settings.plex": "Plex",
|
||||||
"components.Settings.partialRequestsEnabled": "Να επιτρέπονται τα εν μέρει αιτήματα για τις Σειρές",
|
|
||||||
"components.Settings.originallanguage": "Ανακάλυψη με βάση την γλώσσα",
|
|
||||||
"components.Settings.originallanguageTip": "Φίλτραρε το περιεχόμενο με βάση την αρχική γλώσσα",
|
|
||||||
"components.Settings.notrunning": "Δεν τρέχει",
|
"components.Settings.notrunning": "Δεν τρέχει",
|
||||||
"components.Settings.notificationsettings": "Ρυθμίσεις Ειδοποιήσεων",
|
"components.Settings.notificationsettings": "Ρυθμίσεις Ειδοποιήσεων",
|
||||||
"components.Settings.notifications": "Ειδοποιήσεις",
|
"components.Settings.notifications": "Ειδοποιήσεις",
|
||||||
@@ -715,29 +686,17 @@
|
|||||||
"components.Settings.mediaTypeMovie": "ταινία",
|
"components.Settings.mediaTypeMovie": "ταινία",
|
||||||
"components.Settings.manualscanDescription": "Κανονικά, αυτό εκτελείται μόνο μία φορά κάθε 24 ώρες. Το Jellyseerr θα ελέγχει πιο επιθετικά τις προσθήκες που έγιναν πρόσφατα στον διακομιστή Plex. Εάν αυτή είναι η πρώτη φορά που ρυθμίζεις το Plex, συνιστάται μια εφάπαξ πλήρης χειροκίνητη σάρωση βιβλιοθήκης!",
|
"components.Settings.manualscanDescription": "Κανονικά, αυτό εκτελείται μόνο μία φορά κάθε 24 ώρες. Το Jellyseerr θα ελέγχει πιο επιθετικά τις προσθήκες που έγιναν πρόσφατα στον διακομιστή Plex. Εάν αυτή είναι η πρώτη φορά που ρυθμίζεις το Plex, συνιστάται μια εφάπαξ πλήρης χειροκίνητη σάρωση βιβλιοθήκης!",
|
||||||
"components.Settings.manualscan": "Χειροκίνητη σάρωση βιβλιοθήκης",
|
"components.Settings.manualscan": "Χειροκίνητη σάρωση βιβλιοθήκης",
|
||||||
"components.Settings.locale": "Προβολή Γλώσσας",
|
|
||||||
"components.Settings.librariesRemaining": "Βιβλιοθήκες που απομένουν: {count}",
|
"components.Settings.librariesRemaining": "Βιβλιοθήκες που απομένουν: {count}",
|
||||||
"components.Settings.is4k": "4K",
|
"components.Settings.is4k": "4K",
|
||||||
"components.Settings.hostname": "Όνομα κεντρικού υπολογιστή ή διεύθυνση IP",
|
"components.Settings.hostname": "Όνομα κεντρικού υπολογιστή ή διεύθυνση IP",
|
||||||
"components.Settings.hideAvailable": "Απόκρυψη διαθέσιμων μέσων",
|
|
||||||
"components.Settings.generalsettings": "Γενικές Ρυθμίσεις",
|
|
||||||
"components.Settings.general": "Γενικές",
|
|
||||||
"components.Settings.enablessl": "Χρήση SSL",
|
"components.Settings.enablessl": "Χρήση SSL",
|
||||||
"components.Settings.email": "Email",
|
"components.Settings.email": "Email",
|
||||||
"components.Settings.deleteserverconfirm": "Είσαι σίγουρος ότι θες να διαγράψεις αυτόν τον διακομιστή;",
|
"components.Settings.deleteserverconfirm": "Είσαι σίγουρος ότι θες να διαγράψεις αυτόν τον διακομιστή;",
|
||||||
"components.Settings.default4k": "Προεπιλεγμένο 4K",
|
"components.Settings.default4k": "Προεπιλεγμένο 4K",
|
||||||
"components.Settings.default": "Προκαθορισμένο",
|
"components.Settings.default": "Προκαθορισμένο",
|
||||||
"components.Settings.currentlibrary": "Τρέχουσα βιβλιοθήκη: {name}",
|
"components.Settings.currentlibrary": "Τρέχουσα βιβλιοθήκη: {name}",
|
||||||
"components.Settings.csrfProtectionTip": "Ορισμός εξωτερικής πρόσβασης API σε μόνο για ανάγνωση (απαιτείται HTTPS και το Jellyseerr πρέπει να φορτωθεί ξανά για να εφαρμοστούν οι αλλαγές)",
|
|
||||||
"components.Settings.csrfProtectionHoverTip": "ΜΗΝ ενεργοποιήσεις αυτή τη ρύθμιση αν δεν καταλαβαίνεις τι κάνεις!",
|
|
||||||
"components.Settings.csrfProtection": "Ενεργοποίηση της προστασίας CSRF",
|
|
||||||
"components.Settings.copied": "Αντιγράφηκε το κλειδί API στο πρόχειρο.",
|
"components.Settings.copied": "Αντιγράφηκε το κλειδί API στο πρόχειρο.",
|
||||||
"components.Settings.cancelscan": "Ακύρωση σάρωσης",
|
"components.Settings.cancelscan": "Ακύρωση σάρωσης",
|
||||||
"components.Settings.cacheImagesTip": "Βελτιστοποίηση και αποθήκευση όλων των εικόνων τοπικά (καταναλώνει σημαντικό χώρο στο δίσκο)",
|
|
||||||
"components.Settings.cacheImages": "Ενεργοποίηση προσωρινής αποθήκευσης εικόνων",
|
|
||||||
"components.Settings.applicationurl": "Διεύθυνση URL εφαρμογής",
|
|
||||||
"components.Settings.applicationTitle": "Τίτλος εφαρμογής",
|
|
||||||
"components.Settings.apikey": "Κλειδί API",
|
|
||||||
"components.Settings.addsonarr": "Προσθήκη διακομιστή Sonarr",
|
"components.Settings.addsonarr": "Προσθήκη διακομιστή Sonarr",
|
||||||
"components.Settings.address": "Διεύθυνση",
|
"components.Settings.address": "Διεύθυνση",
|
||||||
"components.Settings.addradarr": "Προσθήκη διακομιστή Radarr",
|
"components.Settings.addradarr": "Προσθήκη διακομιστή Radarr",
|
||||||
@@ -796,7 +755,6 @@
|
|||||||
"components.Settings.SonarrModal.add": "Προσθήκη διακομιστή",
|
"components.Settings.SonarrModal.add": "Προσθήκη διακομιστή",
|
||||||
"components.Settings.SettingsUsers.users": "Χρήστες",
|
"components.Settings.SettingsUsers.users": "Χρήστες",
|
||||||
"components.Settings.SettingsUsers.userSettings": "Ρυθμίσεις χρήστη",
|
"components.Settings.SettingsUsers.userSettings": "Ρυθμίσεις χρήστη",
|
||||||
"components.Settings.generalsettingsDescription": "Διαμόρφωση των γενικών και προεπιλεγμένων ρυθμίσεων του Jellyseerr.",
|
|
||||||
"components.Settings.SettingsUsers.userSettingsDescription": "Διαμόρφωση των γενικών και προεπιλεγμένων ρυθμίσεων του χρήστη.",
|
"components.Settings.SettingsUsers.userSettingsDescription": "Διαμόρφωση των γενικών και προεπιλεγμένων ρυθμίσεων του χρήστη.",
|
||||||
"components.Settings.SettingsUsers.tvRequestLimitLabel": "Καθολικό όριο των αιτημάτων στις Σειρές",
|
"components.Settings.SettingsUsers.tvRequestLimitLabel": "Καθολικό όριο των αιτημάτων στις Σειρές",
|
||||||
"components.Settings.SettingsUsers.toastSettingsSuccess": "Οι ρυθμίσεις του χρήστη αποθηκεύτηκαν επιτυχώς!",
|
"components.Settings.SettingsUsers.toastSettingsSuccess": "Οι ρυθμίσεις του χρήστη αποθηκεύτηκαν επιτυχώς!",
|
||||||
@@ -807,7 +765,6 @@
|
|||||||
"components.Settings.Notifications.NotificationsWebhook.templatevariablehelp": "Template Variable Help",
|
"components.Settings.Notifications.NotificationsWebhook.templatevariablehelp": "Template Variable Help",
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.webhookUrlTip": "Ο χρήστης σου ή η συσκευή <LunaSeaLink>ειδοποίηση webhook URL</LunaSeaLink>",
|
"components.Settings.Notifications.NotificationsLunaSea.webhookUrlTip": "Ο χρήστης σου ή η συσκευή <LunaSeaLink>ειδοποίηση webhook URL</LunaSeaLink>",
|
||||||
"components.RequestModal.numberofepisodes": "# Αριθμός Επεισοδίων",
|
"components.RequestModal.numberofepisodes": "# Αριθμός Επεισοδίων",
|
||||||
"components.RequestModal.extras": "Έξτρας",
|
|
||||||
"components.MovieDetails.studio": "{studioCount, plural, one {Στούντιο} other {Στούντιο}}",
|
"components.MovieDetails.studio": "{studioCount, plural, one {Στούντιο} other {Στούντιο}}",
|
||||||
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {commit} other {commits}} πίσω",
|
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {commit} other {commits}} πίσω",
|
||||||
"pages.serviceunavailable": "Η υπηρεσία δεν είναι διαθέσιμη",
|
"pages.serviceunavailable": "Η υπηρεσία δεν είναι διαθέσιμη",
|
||||||
@@ -887,7 +844,6 @@
|
|||||||
"components.Settings.SettingsMain.csrfProtectionTip": "Ορισμός εξωτερικής πρόσβασης API σε read-only (απαιτεί HTTPS)",
|
"components.Settings.SettingsMain.csrfProtectionTip": "Ορισμός εξωτερικής πρόσβασης API σε read-only (απαιτεί HTTPS)",
|
||||||
"components.Settings.SettingsMain.general": "Γενικά",
|
"components.Settings.SettingsMain.general": "Γενικά",
|
||||||
"components.Settings.SettingsMain.generalsettingsDescription": "Διαμόρφωση των γενικών και προεπιλεγμένων ρυθμίσεων για το Jellyseerr.",
|
"components.Settings.SettingsMain.generalsettingsDescription": "Διαμόρφωση των γενικών και προεπιλεγμένων ρυθμίσεων για το Jellyseerr.",
|
||||||
"components.Settings.SettingsMain.regionTip": "Φιλτράρετε το περιεχόμενο βάσει διαθεσιμότητας ανά περιοχή",
|
|
||||||
"components.Settings.SettingsMain.toastSettingsFailure": "Κάτι πήγε στραβά κατά την αποθήκευση των ρυθμίσεων.",
|
"components.Settings.SettingsMain.toastSettingsFailure": "Κάτι πήγε στραβά κατά την αποθήκευση των ρυθμίσεων.",
|
||||||
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "Το URL δε μπορεί να τελειώνει με κάθετο",
|
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "Το URL δε μπορεί να τελειώνει με κάθετο",
|
||||||
"components.Settings.SettingsUsers.defaultPermissionsTip": "Αρχικά δικαιώματα που ορίζονται σε νέους χρήστες",
|
"components.Settings.SettingsUsers.defaultPermissionsTip": "Αρχικά δικαιώματα που ορίζονται σε νέους χρήστες",
|
||||||
@@ -1021,7 +977,6 @@
|
|||||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Συγχρονισμός λίστας παρακολούθησης Plex",
|
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Συγχρονισμός λίστας παρακολούθησης Plex",
|
||||||
"components.Settings.SettingsMain.generalsettings": "Γενικές ρυθμίσεις",
|
"components.Settings.SettingsMain.generalsettings": "Γενικές ρυθμίσεις",
|
||||||
"components.Settings.SettingsMain.hideAvailable": "Απόκρυψη διαθέσιμου περιεχομένου",
|
"components.Settings.SettingsMain.hideAvailable": "Απόκρυψη διαθέσιμου περιεχομένου",
|
||||||
"components.Settings.SettingsMain.region": "Περιοχή σελίδας ανακάλυψης",
|
|
||||||
"components.Settings.restartrequiredTooltip": "Το Jellyseerr πρέπει να κάνει επανεκκίνηση ώστε να εφαρμοστεί αυτή η ρύθμιση",
|
"components.Settings.restartrequiredTooltip": "Το Jellyseerr πρέπει να κάνει επανεκκίνηση ώστε να εφαρμοστεί αυτή η ρύθμιση",
|
||||||
"components.Settings.tautulliSettings": "Ρυθμίσεις Tautulli",
|
"components.Settings.tautulliSettings": "Ρυθμίσεις Tautulli",
|
||||||
"components.Settings.toastTautulliSettingsSuccess": "Οι ρυθμίσεις του Tautulli αποθηκεύτηκαν επιτυχώς!",
|
"components.Settings.toastTautulliSettingsSuccess": "Οι ρυθμίσεις του Tautulli αποθηκεύτηκαν επιτυχώς!",
|
||||||
@@ -1110,7 +1065,6 @@
|
|||||||
"components.Settings.validationUrl": "Πρέπει να δώσετε ένα έγκυρο URL",
|
"components.Settings.validationUrl": "Πρέπει να δώσετε ένα έγκυρο URL",
|
||||||
"components.StatusBadge.managemedia": "Διαχείριση {mediaType}",
|
"components.StatusBadge.managemedia": "Διαχείριση {mediaType}",
|
||||||
"components.StatusBadge.openinarr": "Άνοιγμα σε {arr}",
|
"components.StatusBadge.openinarr": "Άνοιγμα σε {arr}",
|
||||||
"components.UserList.displayName": "Εμφανιζόμενο όνομα",
|
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Αυτόματη αίτηση σειρών",
|
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Αυτόματη αίτηση σειρών",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessTokenTip": "Δημιουργήστε ένα token από τις <PushbulletSettingsLink>Ρυθμίσεις Λογαριασμού</PushbulletSettingsLink>",
|
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessTokenTip": "Δημιουργήστε ένα token από τις <PushbulletSettingsLink>Ρυθμίσεις Λογαριασμού</PushbulletSettingsLink>",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationTokenTip": "<ApplicationRegistrationLink>Καταχωρήστε μια εφαρμογή</ApplicationRegistrationLink> για χρήση με το {applicationTitle}",
|
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationTokenTip": "<ApplicationRegistrationLink>Καταχωρήστε μια εφαρμογή</ApplicationRegistrationLink> για χρήση με το {applicationTitle}",
|
||||||
|
|||||||
@@ -246,6 +246,7 @@
|
|||||||
"components.Login.initialsigningin": "Connecting…",
|
"components.Login.initialsigningin": "Connecting…",
|
||||||
"components.Login.invalidurlerror": "Unable to connect to {mediaServerName} server.",
|
"components.Login.invalidurlerror": "Unable to connect to {mediaServerName} server.",
|
||||||
"components.Login.loginerror": "Something went wrong while trying to sign in.",
|
"components.Login.loginerror": "Something went wrong while trying to sign in.",
|
||||||
|
"components.Login.noadminerror": "No admin user found on the server.",
|
||||||
"components.Login.password": "Password",
|
"components.Login.password": "Password",
|
||||||
"components.Login.port": "Port",
|
"components.Login.port": "Port",
|
||||||
"components.Login.save": "Add",
|
"components.Login.save": "Add",
|
||||||
@@ -339,7 +340,7 @@
|
|||||||
"components.MovieDetails.tmdbuserscore": "TMDB User Score",
|
"components.MovieDetails.tmdbuserscore": "TMDB User Score",
|
||||||
"components.MovieDetails.viewfullcrew": "View Full Crew",
|
"components.MovieDetails.viewfullcrew": "View Full Crew",
|
||||||
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> Removed from watchlist successfully!",
|
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> Removed from watchlist successfully!",
|
||||||
"components.MovieDetails.watchlistError": "Something went wrong try again.",
|
"components.MovieDetails.watchlistError": "Something went wrong. Please try again.",
|
||||||
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> added to watchlist successfully!",
|
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> added to watchlist successfully!",
|
||||||
"components.MovieDetails.watchtrailer": "Watch Trailer",
|
"components.MovieDetails.watchtrailer": "Watch Trailer",
|
||||||
"components.NotificationTypeSelector.adminissuecommentDescription": "Get notified when other users comment on issues.",
|
"components.NotificationTypeSelector.adminissuecommentDescription": "Get notified when other users comment on issues.",
|
||||||
@@ -914,9 +915,6 @@
|
|||||||
"components.Settings.SettingsMain.applicationurl": "Application URL",
|
"components.Settings.SettingsMain.applicationurl": "Application URL",
|
||||||
"components.Settings.SettingsMain.cacheImages": "Enable Image Caching",
|
"components.Settings.SettingsMain.cacheImages": "Enable Image Caching",
|
||||||
"components.Settings.SettingsMain.cacheImagesTip": "Cache externally sourced images (requires a significant amount of disk space)",
|
"components.Settings.SettingsMain.cacheImagesTip": "Cache externally sourced images (requires a significant amount of disk space)",
|
||||||
"components.Settings.SettingsMain.csrfProtection": "Enable CSRF Protection",
|
|
||||||
"components.Settings.SettingsMain.csrfProtectionHoverTip": "Do NOT enable this setting unless you understand what you are doing!",
|
|
||||||
"components.Settings.SettingsMain.csrfProtectionTip": "Set external API access to read-only (requires HTTPS)",
|
|
||||||
"components.Settings.SettingsMain.discoverRegion": "Discover Region",
|
"components.Settings.SettingsMain.discoverRegion": "Discover Region",
|
||||||
"components.Settings.SettingsMain.discoverRegionTip": "Filter content by regional availability",
|
"components.Settings.SettingsMain.discoverRegionTip": "Filter content by regional availability",
|
||||||
"components.Settings.SettingsMain.enableSpecialEpisodes": "Allow Special Episodes Requests",
|
"components.Settings.SettingsMain.enableSpecialEpisodes": "Allow Special Episodes Requests",
|
||||||
@@ -928,27 +926,39 @@
|
|||||||
"components.Settings.SettingsMain.originallanguage": "Discover Language",
|
"components.Settings.SettingsMain.originallanguage": "Discover Language",
|
||||||
"components.Settings.SettingsMain.originallanguageTip": "Filter content by original language",
|
"components.Settings.SettingsMain.originallanguageTip": "Filter content by original language",
|
||||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Allow Partial Series Requests",
|
"components.Settings.SettingsMain.partialRequestsEnabled": "Allow Partial Series Requests",
|
||||||
"components.Settings.SettingsMain.proxyBypassFilter": "Proxy Ignored Addresses",
|
|
||||||
"components.Settings.SettingsMain.proxyBypassFilterTip": "Use ',' as a separator, and '*.' as a wildcard for subdomains",
|
|
||||||
"components.Settings.SettingsMain.proxyBypassLocalAddresses": "Bypass Proxy for Local Addresses",
|
|
||||||
"components.Settings.SettingsMain.proxyEnabled": "HTTP(S) Proxy",
|
|
||||||
"components.Settings.SettingsMain.proxyHostname": "Proxy Hostname",
|
|
||||||
"components.Settings.SettingsMain.proxyPassword": "Proxy Password",
|
|
||||||
"components.Settings.SettingsMain.proxyPort": "Proxy Port",
|
|
||||||
"components.Settings.SettingsMain.proxySsl": "Use SSL For Proxy",
|
|
||||||
"components.Settings.SettingsMain.proxyUser": "Proxy Username",
|
|
||||||
"components.Settings.SettingsMain.streamingRegion": "Streaming Region",
|
"components.Settings.SettingsMain.streamingRegion": "Streaming Region",
|
||||||
"components.Settings.SettingsMain.streamingRegionTip": "Show streaming sites by regional availability",
|
"components.Settings.SettingsMain.streamingRegionTip": "Show streaming sites by regional availability",
|
||||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Something went wrong while generating a new API key.",
|
"components.Settings.SettingsMain.toastApiKeyFailure": "Something went wrong while generating a new API key.",
|
||||||
"components.Settings.SettingsMain.toastApiKeySuccess": "New API key generated successfully!",
|
"components.Settings.SettingsMain.toastApiKeySuccess": "New API key generated successfully!",
|
||||||
"components.Settings.SettingsMain.toastSettingsFailure": "Something went wrong while saving settings.",
|
"components.Settings.SettingsMain.toastSettingsFailure": "Something went wrong while saving settings.",
|
||||||
"components.Settings.SettingsMain.toastSettingsSuccess": "Settings saved successfully!",
|
"components.Settings.SettingsMain.toastSettingsSuccess": "Settings saved successfully!",
|
||||||
"components.Settings.SettingsMain.trustProxy": "Enable Proxy Support",
|
|
||||||
"components.Settings.SettingsMain.trustProxyTip": "Allow Jellyseerr to correctly register client IP addresses behind a proxy",
|
|
||||||
"components.Settings.SettingsMain.validationApplicationTitle": "You must provide an application title",
|
"components.Settings.SettingsMain.validationApplicationTitle": "You must provide an application title",
|
||||||
"components.Settings.SettingsMain.validationApplicationUrl": "You must provide a valid URL",
|
"components.Settings.SettingsMain.validationApplicationUrl": "You must provide a valid URL",
|
||||||
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL must not end in a trailing slash",
|
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL must not end in a trailing slash",
|
||||||
"components.Settings.SettingsMain.validationProxyPort": "You must provide a valid port",
|
"components.Settings.SettingsNetwork.csrfProtection": "Enable CSRF Protection",
|
||||||
|
"components.Settings.SettingsNetwork.csrfProtectionHoverTip": "Do NOT enable this setting unless you understand what you are doing!",
|
||||||
|
"components.Settings.SettingsNetwork.csrfProtectionTip": "Set external API access to read-only (requires HTTPS)",
|
||||||
|
"components.Settings.SettingsNetwork.dnsServers": "Custom DNS Servers",
|
||||||
|
"components.Settings.SettingsNetwork.dnsServersTip": "Comma-separated list of custom DNS servers, e.g. \"1.1.1.1,[2606:4700:4700::1111]\"",
|
||||||
|
"components.Settings.SettingsNetwork.forceIpv4First": "IPv4 Resolution First",
|
||||||
|
"components.Settings.SettingsNetwork.forceIpv4FirstTip": "Force Jellyseerr to resolve IPv4 addresses first instead of IPv6",
|
||||||
|
"components.Settings.SettingsNetwork.network": "Network",
|
||||||
|
"components.Settings.SettingsNetwork.networksettings": "Network Settings",
|
||||||
|
"components.Settings.SettingsNetwork.networksettingsDescription": "Configure network settings for your Jellyseerr instance.",
|
||||||
|
"components.Settings.SettingsNetwork.proxyBypassFilter": "Proxy Ignored Addresses",
|
||||||
|
"components.Settings.SettingsNetwork.proxyBypassFilterTip": "Use ',' as a separator, and '*.' as a wildcard for subdomains",
|
||||||
|
"components.Settings.SettingsNetwork.proxyBypassLocalAddresses": "Bypass Proxy for Local Addresses",
|
||||||
|
"components.Settings.SettingsNetwork.proxyEnabled": "HTTP(S) Proxy",
|
||||||
|
"components.Settings.SettingsNetwork.proxyHostname": "Proxy Hostname",
|
||||||
|
"components.Settings.SettingsNetwork.proxyPassword": "Proxy Password",
|
||||||
|
"components.Settings.SettingsNetwork.proxyPort": "Proxy Port",
|
||||||
|
"components.Settings.SettingsNetwork.proxySsl": "Use SSL For Proxy",
|
||||||
|
"components.Settings.SettingsNetwork.proxyUser": "Proxy Username",
|
||||||
|
"components.Settings.SettingsNetwork.toastSettingsFailure": "Something went wrong while saving settings.",
|
||||||
|
"components.Settings.SettingsNetwork.toastSettingsSuccess": "Settings saved successfully!",
|
||||||
|
"components.Settings.SettingsNetwork.trustProxy": "Enable Proxy Support",
|
||||||
|
"components.Settings.SettingsNetwork.trustProxyTip": "Allow Jellyseerr to correctly register client IP addresses behind a proxy",
|
||||||
|
"components.Settings.SettingsNetwork.validationProxyPort": "You must provide a valid port",
|
||||||
"components.Settings.SettingsUsers.defaultPermissions": "Default Permissions",
|
"components.Settings.SettingsUsers.defaultPermissions": "Default Permissions",
|
||||||
"components.Settings.SettingsUsers.defaultPermissionsTip": "Initial permissions assigned to new users",
|
"components.Settings.SettingsUsers.defaultPermissionsTip": "Initial permissions assigned to new users",
|
||||||
"components.Settings.SettingsUsers.localLogin": "Enable Local Sign-In",
|
"components.Settings.SettingsUsers.localLogin": "Enable Local Sign-In",
|
||||||
@@ -1064,6 +1074,7 @@
|
|||||||
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
||||||
"components.Settings.menuJobs": "Jobs & Cache",
|
"components.Settings.menuJobs": "Jobs & Cache",
|
||||||
"components.Settings.menuLogs": "Logs",
|
"components.Settings.menuLogs": "Logs",
|
||||||
|
"components.Settings.menuNetwork": "Network",
|
||||||
"components.Settings.menuNotifications": "Notifications",
|
"components.Settings.menuNotifications": "Notifications",
|
||||||
"components.Settings.menuPlexSettings": "Plex",
|
"components.Settings.menuPlexSettings": "Plex",
|
||||||
"components.Settings.menuServices": "Services",
|
"components.Settings.menuServices": "Services",
|
||||||
@@ -1137,6 +1148,7 @@
|
|||||||
"components.Setup.continue": "Continue",
|
"components.Setup.continue": "Continue",
|
||||||
"components.Setup.finish": "Finish Setup",
|
"components.Setup.finish": "Finish Setup",
|
||||||
"components.Setup.finishing": "Finishing…",
|
"components.Setup.finishing": "Finishing…",
|
||||||
|
"components.Setup.librarieserror": "Validation failed. Please toggle the libraries again to continue.",
|
||||||
"components.Setup.servertype": "Choose Server Type",
|
"components.Setup.servertype": "Choose Server Type",
|
||||||
"components.Setup.setup": "Setup",
|
"components.Setup.setup": "Setup",
|
||||||
"components.Setup.signin": "Sign In",
|
"components.Setup.signin": "Sign In",
|
||||||
@@ -1165,7 +1177,7 @@
|
|||||||
"components.TitleCard.tvdbid": "TheTVDB ID",
|
"components.TitleCard.tvdbid": "TheTVDB ID",
|
||||||
"components.TitleCard.watchlistCancel": "watchlist for <strong>{title}</strong> canceled.",
|
"components.TitleCard.watchlistCancel": "watchlist for <strong>{title}</strong> canceled.",
|
||||||
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Removed from watchlist successfully!",
|
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Removed from watchlist successfully!",
|
||||||
"components.TitleCard.watchlistError": "Something went wrong try again.",
|
"components.TitleCard.watchlistError": "Something went wrong. Please try again.",
|
||||||
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> added to watchlist successfully!",
|
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> added to watchlist successfully!",
|
||||||
"components.TvDetails.Season.noepisodes": "Episode list unavailable.",
|
"components.TvDetails.Season.noepisodes": "Episode list unavailable.",
|
||||||
"components.TvDetails.Season.somethingwentwrong": "Something went wrong while retrieving season data.",
|
"components.TvDetails.Season.somethingwentwrong": "Something went wrong while retrieving season data.",
|
||||||
@@ -1203,7 +1215,7 @@
|
|||||||
"components.TvDetails.tmdbuserscore": "TMDB User Score",
|
"components.TvDetails.tmdbuserscore": "TMDB User Score",
|
||||||
"components.TvDetails.viewfullcrew": "View Full Crew",
|
"components.TvDetails.viewfullcrew": "View Full Crew",
|
||||||
"components.TvDetails.watchlistDeleted": "<strong>{title}</strong> Removed from watchlist successfully!",
|
"components.TvDetails.watchlistDeleted": "<strong>{title}</strong> Removed from watchlist successfully!",
|
||||||
"components.TvDetails.watchlistError": "Something went wrong try again.",
|
"components.TvDetails.watchlistError": "Something went wrong. Please try again.",
|
||||||
"components.TvDetails.watchlistSuccess": "<strong>{title}</strong> added to watchlist successfully!",
|
"components.TvDetails.watchlistSuccess": "<strong>{title}</strong> added to watchlist successfully!",
|
||||||
"components.TvDetails.watchtrailer": "Watch Trailer",
|
"components.TvDetails.watchtrailer": "Watch Trailer",
|
||||||
"components.UserList.accounttype": "Type",
|
"components.UserList.accounttype": "Type",
|
||||||
@@ -1387,7 +1399,7 @@
|
|||||||
"i18n.back": "Back",
|
"i18n.back": "Back",
|
||||||
"i18n.blacklist": "Blacklist",
|
"i18n.blacklist": "Blacklist",
|
||||||
"i18n.blacklistDuplicateError": "<strong>{title}</strong> has already been blacklisted.",
|
"i18n.blacklistDuplicateError": "<strong>{title}</strong> has already been blacklisted.",
|
||||||
"i18n.blacklistError": "Something went wrong try again.",
|
"i18n.blacklistError": "Something went wrong. Please try again.",
|
||||||
"i18n.blacklistSuccess": "<strong>{title}</strong> was successfully blacklisted.",
|
"i18n.blacklistSuccess": "<strong>{title}</strong> was successfully blacklisted.",
|
||||||
"i18n.blacklisted": "Blacklisted",
|
"i18n.blacklisted": "Blacklisted",
|
||||||
"i18n.cancel": "Cancel",
|
"i18n.cancel": "Cancel",
|
||||||
|
|||||||
@@ -70,7 +70,6 @@
|
|||||||
"components.RequestModal.requestCancel": "Solicitud para <strong>{title}</strong> cancelada.",
|
"components.RequestModal.requestCancel": "Solicitud para <strong>{title}</strong> cancelada.",
|
||||||
"components.RequestModal.pendingrequest": "Solicitud pendiente",
|
"components.RequestModal.pendingrequest": "Solicitud pendiente",
|
||||||
"components.RequestModal.numberofepisodes": "# de Episodios",
|
"components.RequestModal.numberofepisodes": "# de Episodios",
|
||||||
"components.RequestModal.extras": "Extras",
|
|
||||||
"components.RequestModal.cancel": "Cancelar Petición",
|
"components.RequestModal.cancel": "Cancelar Petición",
|
||||||
"components.RequestList.requests": "Solicitudes",
|
"components.RequestList.requests": "Solicitudes",
|
||||||
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Temporada} other {Temporadas}}",
|
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Temporada} other {Temporadas}}",
|
||||||
@@ -144,11 +143,9 @@
|
|||||||
"components.TvDetails.TvCast.fullseriescast": "Reparto completo de la serie",
|
"components.TvDetails.TvCast.fullseriescast": "Reparto completo de la serie",
|
||||||
"components.Setup.welcome": "Bienvenido a Jellyseerr",
|
"components.Setup.welcome": "Bienvenido a Jellyseerr",
|
||||||
"components.Setup.signinMessage": "Comience iniciando sesión con su cuenta de Plex",
|
"components.Setup.signinMessage": "Comience iniciando sesión con su cuenta de Plex",
|
||||||
"components.Setup.loginwithplex": "Iniciar sesión con Plex",
|
|
||||||
"components.Setup.finishing": "Finalizando…",
|
"components.Setup.finishing": "Finalizando…",
|
||||||
"components.Setup.finish": "Finalizar configuración",
|
"components.Setup.finish": "Finalizar configuración",
|
||||||
"components.Setup.continue": "Continuar",
|
"components.Setup.continue": "Continuar",
|
||||||
"components.Setup.configureplex": "Configurar Plex",
|
|
||||||
"components.Setup.configureservices": "Configurar servicios",
|
"components.Setup.configureservices": "Configurar servicios",
|
||||||
"components.Settings.validationPortRequired": "Debes proporcionar un número de puerto válido",
|
"components.Settings.validationPortRequired": "Debes proporcionar un número de puerto válido",
|
||||||
"components.Settings.validationHostnameRequired": "Debes proporcionar un nombre de host o dirección IP válido",
|
"components.Settings.validationHostnameRequired": "Debes proporcionar un nombre de host o dirección IP válido",
|
||||||
@@ -179,7 +176,6 @@
|
|||||||
"components.Settings.currentlibrary": "Biblioteca actual: {name}",
|
"components.Settings.currentlibrary": "Biblioteca actual: {name}",
|
||||||
"components.Settings.copied": "Clave API copiada en el portapapeles.",
|
"components.Settings.copied": "Clave API copiada en el portapapeles.",
|
||||||
"components.Settings.cancelscan": "Cancelar Escaneo",
|
"components.Settings.cancelscan": "Cancelar Escaneo",
|
||||||
"components.Setup.tip": "Consejo",
|
|
||||||
"i18n.deleting": "Eliminando…",
|
"i18n.deleting": "Eliminando…",
|
||||||
"components.UserList.userdeleteerror": "Algo salió mal al eliminar al usuario.",
|
"components.UserList.userdeleteerror": "Algo salió mal al eliminar al usuario.",
|
||||||
"components.UserList.userdeleted": "¡Usuario eliminado con éxito!",
|
"components.UserList.userdeleted": "¡Usuario eliminado con éxito!",
|
||||||
@@ -382,8 +378,6 @@
|
|||||||
"components.PermissionEdit.adminDescription": "Acceso completo de administrador. Ignora otras comprobaciones de permisos.",
|
"components.PermissionEdit.adminDescription": "Acceso completo de administrador. Ignora otras comprobaciones de permisos.",
|
||||||
"components.NotificationTypeSelector.mediaAutoApprovedDescription": "Envía notificaciones cuando los usuarios solicitan nuevos contenidos que se aprueban automáticamente.",
|
"components.NotificationTypeSelector.mediaAutoApprovedDescription": "Envía notificaciones cuando los usuarios solicitan nuevos contenidos que se aprueban automáticamente.",
|
||||||
"components.NotificationTypeSelector.mediaAutoApproved": "Petición Aprobada Automáticamente",
|
"components.NotificationTypeSelector.mediaAutoApproved": "Petición Aprobada Automáticamente",
|
||||||
"components.MovieDetails.playonplex": "Ver en Plex",
|
|
||||||
"components.MovieDetails.play4konplex": "Ver en Plex en 4K",
|
|
||||||
"components.MovieDetails.markavailable": "Marcar como Disponible",
|
"components.MovieDetails.markavailable": "Marcar como Disponible",
|
||||||
"components.MovieDetails.mark4kavailable": "Marcar como Disponible en 4K",
|
"components.MovieDetails.mark4kavailable": "Marcar como Disponible en 4K",
|
||||||
"components.Login.forgotpassword": "¿Contraseña olvidada?",
|
"components.Login.forgotpassword": "¿Contraseña olvidada?",
|
||||||
@@ -486,13 +480,10 @@
|
|||||||
"components.UserList.edituser": "Editar Permisos de Usuario",
|
"components.UserList.edituser": "Editar Permisos de Usuario",
|
||||||
"components.UserList.bulkedit": "Edición Masiva",
|
"components.UserList.bulkedit": "Edición Masiva",
|
||||||
"components.UserList.accounttype": "Tipo",
|
"components.UserList.accounttype": "Tipo",
|
||||||
"components.TvDetails.playonplex": "Ver en Plex",
|
|
||||||
"components.TvDetails.play4konplex": "Ver en Plex en 4K",
|
|
||||||
"components.TvDetails.nextAirDate": "Próxima Emisión",
|
"components.TvDetails.nextAirDate": "Próxima Emisión",
|
||||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minutos",
|
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minutos",
|
||||||
"components.TvDetails.episodeRuntime": "Duración del Episodio",
|
"components.TvDetails.episodeRuntime": "Duración del Episodio",
|
||||||
"components.Setup.setup": "Configuración",
|
"components.Setup.setup": "Configuración",
|
||||||
"components.Setup.scanbackground": "El escaneo seguirá en segundo plano. Puedes continuar mientras el proceso de configuración.",
|
|
||||||
"components.Settings.webhook": "Webhook",
|
"components.Settings.webhook": "Webhook",
|
||||||
"components.Settings.toastPlexRefreshSuccess": "¡Recibida la lista de servidores de Plex con éxito!",
|
"components.Settings.toastPlexRefreshSuccess": "¡Recibida la lista de servidores de Plex con éxito!",
|
||||||
"components.Settings.toastPlexRefreshFailure": "Fallo al obtener la lista de servidores de Plex.",
|
"components.Settings.toastPlexRefreshFailure": "Fallo al obtener la lista de servidores de Plex.",
|
||||||
@@ -790,7 +781,6 @@
|
|||||||
"components.Settings.Notifications.validationTypes": "Debes seleccionar, al menos, un tipo de notificación",
|
"components.Settings.Notifications.validationTypes": "Debes seleccionar, al menos, un tipo de notificación",
|
||||||
"components.Settings.SettingsUsers.localLoginTip": "Permite a los usuarios registrarse consumo email y password, en lugar de la OAuth de Plex",
|
"components.Settings.SettingsUsers.localLoginTip": "Permite a los usuarios registrarse consumo email y password, en lugar de la OAuth de Plex",
|
||||||
"components.Settings.webAppUrl": "Url de la <WebAppLink>Web App</WebAppLink>",
|
"components.Settings.webAppUrl": "Url de la <WebAppLink>Web App</WebAppLink>",
|
||||||
"components.UserList.displayName": "Nombre en Pantalla",
|
|
||||||
"components.Settings.Notifications.encryption": "Método de Encriptación",
|
"components.Settings.Notifications.encryption": "Método de Encriptación",
|
||||||
"components.Settings.Notifications.encryptionDefault": "Usa STARTTLS si está disponible",
|
"components.Settings.Notifications.encryptionDefault": "Usa STARTTLS si está disponible",
|
||||||
"components.Settings.Notifications.encryptionNone": "Ninguna",
|
"components.Settings.Notifications.encryptionNone": "Ninguna",
|
||||||
@@ -1135,8 +1125,6 @@
|
|||||||
"components.Settings.SettingsMain.locale": "Idioma de visualización",
|
"components.Settings.SettingsMain.locale": "Idioma de visualización",
|
||||||
"components.Settings.SettingsMain.originallanguageTip": "Filtrar contenidos por idioma original",
|
"components.Settings.SettingsMain.originallanguageTip": "Filtrar contenidos por idioma original",
|
||||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Permitir Solicitudes Parciales de Series",
|
"components.Settings.SettingsMain.partialRequestsEnabled": "Permitir Solicitudes Parciales de Series",
|
||||||
"components.Settings.SettingsMain.region": "Región de Descubre",
|
|
||||||
"components.Settings.SettingsMain.regionTip": "Filtrar contenidos por disponibilidad regional",
|
|
||||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Algo ha ido mal al generar una nueva clave API.",
|
"components.Settings.SettingsMain.toastApiKeyFailure": "Algo ha ido mal al generar una nueva clave API.",
|
||||||
"components.Settings.SettingsMain.toastApiKeySuccess": "¡Nueva clave API generada con éxito!",
|
"components.Settings.SettingsMain.toastApiKeySuccess": "¡Nueva clave API generada con éxito!",
|
||||||
"components.Settings.SettingsMain.trustProxy": "Activar la compatibilidad con proxy",
|
"components.Settings.SettingsMain.trustProxy": "Activar la compatibilidad con proxy",
|
||||||
@@ -1207,7 +1195,6 @@
|
|||||||
"components.MovieDetails.imdbuserscore": "Puntuación de los usuarios de IMDB",
|
"components.MovieDetails.imdbuserscore": "Puntuación de los usuarios de IMDB",
|
||||||
"components.Layout.UserWarnings.passwordRequired": "Se requiere una contraseña.",
|
"components.Layout.UserWarnings.passwordRequired": "Se requiere una contraseña.",
|
||||||
"components.Login.credentialerror": "El usuario o contraseña es incorrecto.",
|
"components.Login.credentialerror": "El usuario o contraseña es incorrecto.",
|
||||||
"components.Login.host": "{mediaServerName} URL",
|
|
||||||
"components.Login.initialsignin": "Conectar",
|
"components.Login.initialsignin": "Conectar",
|
||||||
"components.Login.initialsigningin": "Conectando…",
|
"components.Login.initialsigningin": "Conectando…",
|
||||||
"components.Login.emailtooltip": "No es necesario asociar la dirección con su instancia de {mediaServerName}.",
|
"components.Login.emailtooltip": "No es necesario asociar la dirección con su instancia de {mediaServerName}.",
|
||||||
@@ -1290,7 +1277,6 @@
|
|||||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushbulletAccessToken": "Debes indicar un token de acceso",
|
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushbulletAccessToken": "Debes indicar un token de acceso",
|
||||||
"components.Login.signinwithjellyfin": "Utiliza tu cuenta de {mediaServerName}",
|
"components.Login.signinwithjellyfin": "Utiliza tu cuenta de {mediaServerName}",
|
||||||
"components.ManageSlideOver.removearr4k": "Eliminar de {arr} 4K",
|
"components.ManageSlideOver.removearr4k": "Eliminar de {arr} 4K",
|
||||||
"components.Settings.internalUrl": "URL Interna",
|
|
||||||
"components.TvDetails.play4k": "Reproducir 4K en {mediaServerName}",
|
"components.TvDetails.play4k": "Reproducir 4K en {mediaServerName}",
|
||||||
"components.Setup.signin": "Iniciar Sesión",
|
"components.Setup.signin": "Iniciar Sesión",
|
||||||
"components.Setup.signinWithJellyfin": "Utiliza tu cuenta de {mediaServerName}",
|
"components.Setup.signinWithJellyfin": "Utiliza tu cuenta de {mediaServerName}",
|
||||||
|
|||||||
@@ -70,7 +70,6 @@
|
|||||||
"components.RequestModal.requestCancel": "Solicitud para <strong>{title}</strong> cancelada.",
|
"components.RequestModal.requestCancel": "Solicitud para <strong>{title}</strong> cancelada.",
|
||||||
"components.RequestModal.pendingrequest": "Solicitud pendiente",
|
"components.RequestModal.pendingrequest": "Solicitud pendiente",
|
||||||
"components.RequestModal.numberofepisodes": "# de Episodios",
|
"components.RequestModal.numberofepisodes": "# de Episodios",
|
||||||
"components.RequestModal.extras": "Extras",
|
|
||||||
"components.RequestModal.cancel": "Cancelar Petición",
|
"components.RequestModal.cancel": "Cancelar Petición",
|
||||||
"components.RequestList.requests": "Solicitudes",
|
"components.RequestList.requests": "Solicitudes",
|
||||||
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Temporada} other {Temporadas}}",
|
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Temporada} other {Temporadas}}",
|
||||||
@@ -144,11 +143,9 @@
|
|||||||
"components.TvDetails.TvCast.fullseriescast": "Reparto completo de la serie",
|
"components.TvDetails.TvCast.fullseriescast": "Reparto completo de la serie",
|
||||||
"components.Setup.welcome": "Bienvenido a Jellyseerr",
|
"components.Setup.welcome": "Bienvenido a Jellyseerr",
|
||||||
"components.Setup.signinMessage": "Comience iniciando sesión con su cuenta de Plex",
|
"components.Setup.signinMessage": "Comience iniciando sesión con su cuenta de Plex",
|
||||||
"components.Setup.loginwithplex": "Iniciar sesión con Plex",
|
|
||||||
"components.Setup.finishing": "Finalizando…",
|
"components.Setup.finishing": "Finalizando…",
|
||||||
"components.Setup.finish": "Finalizar configuración",
|
"components.Setup.finish": "Finalizar configuración",
|
||||||
"components.Setup.continue": "Continuar",
|
"components.Setup.continue": "Continuar",
|
||||||
"components.Setup.configureplex": "Configurar Plex",
|
|
||||||
"components.Setup.configureservices": "Configurar servicios",
|
"components.Setup.configureservices": "Configurar servicios",
|
||||||
"components.Settings.validationPortRequired": "Debes proporcionar un número de puerto válido",
|
"components.Settings.validationPortRequired": "Debes proporcionar un número de puerto válido",
|
||||||
"components.Settings.validationHostnameRequired": "Debes proporcionar un nombre de host o dirección IP válido",
|
"components.Settings.validationHostnameRequired": "Debes proporcionar un nombre de host o dirección IP válido",
|
||||||
@@ -179,7 +176,6 @@
|
|||||||
"components.Settings.currentlibrary": "Biblioteca actual: {name}",
|
"components.Settings.currentlibrary": "Biblioteca actual: {name}",
|
||||||
"components.Settings.copied": "Clave API copiada en el portapapeles.",
|
"components.Settings.copied": "Clave API copiada en el portapapeles.",
|
||||||
"components.Settings.cancelscan": "Cancelar Escaneo",
|
"components.Settings.cancelscan": "Cancelar Escaneo",
|
||||||
"components.Setup.tip": "Consejo",
|
|
||||||
"i18n.deleting": "Eliminando…",
|
"i18n.deleting": "Eliminando…",
|
||||||
"components.UserList.userdeleteerror": "Algo salió mal al eliminar al usuario.",
|
"components.UserList.userdeleteerror": "Algo salió mal al eliminar al usuario.",
|
||||||
"components.UserList.userdeleted": "¡Usuario eliminado con éxito!",
|
"components.UserList.userdeleted": "¡Usuario eliminado con éxito!",
|
||||||
@@ -382,8 +378,6 @@
|
|||||||
"components.PermissionEdit.adminDescription": "Acceso completo de administrador. Ignora otras comprobaciones de permisos.",
|
"components.PermissionEdit.adminDescription": "Acceso completo de administrador. Ignora otras comprobaciones de permisos.",
|
||||||
"components.NotificationTypeSelector.mediaAutoApprovedDescription": "Envía notificaciones cuando los usuarios solicitan nuevos contenidos que se aprueban automáticamente.",
|
"components.NotificationTypeSelector.mediaAutoApprovedDescription": "Envía notificaciones cuando los usuarios solicitan nuevos contenidos que se aprueban automáticamente.",
|
||||||
"components.NotificationTypeSelector.mediaAutoApproved": "Petición Aprobada Automáticamente",
|
"components.NotificationTypeSelector.mediaAutoApproved": "Petición Aprobada Automáticamente",
|
||||||
"components.MovieDetails.playonplex": "Ver en Plex",
|
|
||||||
"components.MovieDetails.play4konplex": "Ver en Plex en 4K",
|
|
||||||
"components.MovieDetails.markavailable": "Marcar como Disponible",
|
"components.MovieDetails.markavailable": "Marcar como Disponible",
|
||||||
"components.MovieDetails.mark4kavailable": "Marcar como Disponible en 4K",
|
"components.MovieDetails.mark4kavailable": "Marcar como Disponible en 4K",
|
||||||
"components.Login.forgotpassword": "¿Contraseña olvidada?",
|
"components.Login.forgotpassword": "¿Contraseña olvidada?",
|
||||||
@@ -486,13 +480,10 @@
|
|||||||
"components.UserList.edituser": "Editar Permisos de Usuario",
|
"components.UserList.edituser": "Editar Permisos de Usuario",
|
||||||
"components.UserList.bulkedit": "Edición Masiva",
|
"components.UserList.bulkedit": "Edición Masiva",
|
||||||
"components.UserList.accounttype": "Tipo",
|
"components.UserList.accounttype": "Tipo",
|
||||||
"components.TvDetails.playonplex": "Ver en Plex",
|
|
||||||
"components.TvDetails.play4konplex": "Ver en Plex en 4K",
|
|
||||||
"components.TvDetails.nextAirDate": "Próxima Emisión",
|
"components.TvDetails.nextAirDate": "Próxima Emisión",
|
||||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minutos",
|
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minutos",
|
||||||
"components.TvDetails.episodeRuntime": "Duración del Episodio",
|
"components.TvDetails.episodeRuntime": "Duración del Episodio",
|
||||||
"components.Setup.setup": "Configuración",
|
"components.Setup.setup": "Configuración",
|
||||||
"components.Setup.scanbackground": "El escaneo seguirá en segundo plano. Puedes continuar mientras el proceso de configuración.",
|
|
||||||
"components.Settings.webhook": "Webhook",
|
"components.Settings.webhook": "Webhook",
|
||||||
"components.Settings.toastPlexRefreshSuccess": "¡Recibida la lista de servidores de Plex con éxito!",
|
"components.Settings.toastPlexRefreshSuccess": "¡Recibida la lista de servidores de Plex con éxito!",
|
||||||
"components.Settings.toastPlexRefreshFailure": "Fallo al obtener la lista de servidores de Plex.",
|
"components.Settings.toastPlexRefreshFailure": "Fallo al obtener la lista de servidores de Plex.",
|
||||||
@@ -790,7 +781,6 @@
|
|||||||
"components.Settings.Notifications.validationTypes": "Debes seleccionar, al menos, un tipo de notificación",
|
"components.Settings.Notifications.validationTypes": "Debes seleccionar, al menos, un tipo de notificación",
|
||||||
"components.Settings.SettingsUsers.localLoginTip": "Permite a los usuarios registrarse consumo email y password, en lugar de la OAuth de Plex",
|
"components.Settings.SettingsUsers.localLoginTip": "Permite a los usuarios registrarse consumo email y password, en lugar de la OAuth de Plex",
|
||||||
"components.Settings.webAppUrl": "Url de la <WebAppLink>Web App</WebAppLink>",
|
"components.Settings.webAppUrl": "Url de la <WebAppLink>Web App</WebAppLink>",
|
||||||
"components.UserList.displayName": "Nombre en Pantalla",
|
|
||||||
"components.Settings.Notifications.encryption": "Método de Encriptación",
|
"components.Settings.Notifications.encryption": "Método de Encriptación",
|
||||||
"components.Settings.Notifications.encryptionDefault": "Usa STARTTLS si está disponible",
|
"components.Settings.Notifications.encryptionDefault": "Usa STARTTLS si está disponible",
|
||||||
"components.Settings.Notifications.encryptionNone": "Ninguna",
|
"components.Settings.Notifications.encryptionNone": "Ninguna",
|
||||||
@@ -1135,8 +1125,6 @@
|
|||||||
"components.Settings.SettingsMain.locale": "Idioma de visualización",
|
"components.Settings.SettingsMain.locale": "Idioma de visualización",
|
||||||
"components.Settings.SettingsMain.originallanguageTip": "Filtrar contenidos por idioma original",
|
"components.Settings.SettingsMain.originallanguageTip": "Filtrar contenidos por idioma original",
|
||||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Permitir Solicitudes Parciales de Series",
|
"components.Settings.SettingsMain.partialRequestsEnabled": "Permitir Solicitudes Parciales de Series",
|
||||||
"components.Settings.SettingsMain.region": "Región de Descubre",
|
|
||||||
"components.Settings.SettingsMain.regionTip": "Filtrar contenidos por disponibilidad regional",
|
|
||||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Algo ha ido mal al generar una nueva clave API.",
|
"components.Settings.SettingsMain.toastApiKeyFailure": "Algo ha ido mal al generar una nueva clave API.",
|
||||||
"components.Settings.SettingsMain.toastApiKeySuccess": "¡Nueva clave API generada con éxito!",
|
"components.Settings.SettingsMain.toastApiKeySuccess": "¡Nueva clave API generada con éxito!",
|
||||||
"components.Settings.SettingsMain.trustProxy": "Activar la compatibilidad con proxy",
|
"components.Settings.SettingsMain.trustProxy": "Activar la compatibilidad con proxy",
|
||||||
|
|||||||
238
src/i18n/locale/eu.json
Normal file
238
src/i18n/locale/eu.json
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
{
|
||||||
|
"components.Blacklist.blacklistedby": "{date} {user} erabiltzailearengatik",
|
||||||
|
"components.Blacklist.blacklistsettings": "Zerrenda beltzaren ezarpenak",
|
||||||
|
"components.Blacklist.mediaName": "Izena",
|
||||||
|
"components.Blacklist.mediaTmdbId": "tmdb Id",
|
||||||
|
"components.Blacklist.mediaType": "Mota",
|
||||||
|
"components.CollectionDetails.numberofmovies": "{count} film",
|
||||||
|
"components.CollectionDetails.overview": "Ikuspegi orokorra",
|
||||||
|
"component.BlacklistBlock.blacklistdate": "Zerrenda beltzeko data",
|
||||||
|
"component.BlacklistBlock.blacklistedby": "Zerrenda beltzera honengatik gehituta",
|
||||||
|
"components.AirDateBadge.airedrelative": "{relativeTime} igorrita",
|
||||||
|
"components.AirDateBadge.airsrelative": "{relativeTime} igortzen",
|
||||||
|
"components.Discover.CreateSlider.addSlider": "Gehitu irristaria",
|
||||||
|
"components.Discover.CreateSlider.addfail": "Irristari berria sortzeak huts egin du.",
|
||||||
|
"components.Discover.DiscoverSliderEdit.remove": "Kendu",
|
||||||
|
"components.Discover.FilterSlideover.genres": "Generoak",
|
||||||
|
"components.Discover.FilterSlideover.keywords": "Gako-hitzak",
|
||||||
|
"components.Discover.FilterSlideover.runtime": "Iraupena",
|
||||||
|
"components.IssueDetails.comments": "Iruzkinak",
|
||||||
|
"components.IssueDetails.issuetype": "Mota",
|
||||||
|
"components.IssueDetails.leavecomment": "Iruzkindu",
|
||||||
|
"components.IssueList.IssueItem.issuestatus": "Egoera",
|
||||||
|
"components.IssueList.IssueItem.issuetype": "Mota",
|
||||||
|
"components.IssueList.IssueItem.opened": "Irekita",
|
||||||
|
"components.IssueList.IssueItem.unknownissuetype": "Ezezaguna",
|
||||||
|
"components.IssueModal.issueAudio": "Audio",
|
||||||
|
"components.IssueModal.issueOther": "Bestelakoa",
|
||||||
|
"components.IssueModal.issueVideo": "Bideoa",
|
||||||
|
"components.Layout.Sidebar.blacklist": "Zerrenda beltza",
|
||||||
|
"components.Layout.Sidebar.browsemovies": "Filmak",
|
||||||
|
"components.Layout.Sidebar.dashboard": "Aurkitu",
|
||||||
|
"components.Layout.Sidebar.issues": "Intzidentziak",
|
||||||
|
"components.Layout.Sidebar.requests": "Eskaerak",
|
||||||
|
"components.Layout.Sidebar.settings": "Ezarpenak",
|
||||||
|
"components.Layout.Sidebar.users": "Erabiltzaileak",
|
||||||
|
"components.Layout.UserDropdown.myprofile": "Profila",
|
||||||
|
"components.Layout.UserDropdown.requests": "Eskaerak",
|
||||||
|
"components.Layout.UserDropdown.settings": "Ezarpenak",
|
||||||
|
"components.Login.initialsigningin": "Konektatzen…",
|
||||||
|
"components.Login.password": "Pasahitza",
|
||||||
|
"components.Login.port": "Ataka",
|
||||||
|
"components.Login.save": "Gehitu",
|
||||||
|
"components.Login.saving": "Gehitzen…",
|
||||||
|
"components.ManageSlideOver.manageModalAdvanced": "Aurreratua",
|
||||||
|
"components.ManageSlideOver.manageModalMedia": "Multimedia",
|
||||||
|
"components.ManageSlideOver.manageModalRequests": "Eskaerak",
|
||||||
|
"components.ManageSlideOver.movie": "filma",
|
||||||
|
"components.MovieDetails.budget": "Aurrekontua",
|
||||||
|
"components.MovieDetails.cast": "Aktoreak",
|
||||||
|
"components.MovieDetails.recommendations": "Gomendioak",
|
||||||
|
"components.MovieDetails.revenue": "Bilduta",
|
||||||
|
"components.PermissionEdit.autoapprove": "Auto-onarpena",
|
||||||
|
"components.PermissionEdit.request": "Eskaera",
|
||||||
|
"components.PersonDetails.crewmember": "Taldea",
|
||||||
|
"components.QuotaSelector.unlimited": "Mugagabea",
|
||||||
|
"components.RequestList.RequestItem.profileName": "Profila",
|
||||||
|
"components.RequestList.RequestItem.requesteddate": "Eskatuta",
|
||||||
|
"components.RequestModal.AdvancedRequester.advancedoptions": "Aurreratuak",
|
||||||
|
"components.ResetPassword.password": "Pasahitza",
|
||||||
|
"components.Selector.canceled": "Utzita",
|
||||||
|
"components.Selector.ended": "Bukatuta",
|
||||||
|
"components.Selector.planned": "Planifikatuta",
|
||||||
|
"components.Settings.RadarrModal.port": "Ataka",
|
||||||
|
"components.Settings.RadarrModal.released": "Kaleratuta",
|
||||||
|
"components.Settings.RadarrModal.tags": "Etiketak",
|
||||||
|
"components.Settings.SettingsAbout.Releases.latestversion": "Azken bertsioa",
|
||||||
|
"components.Settings.SettingsAbout.Releases.releases": "Bertsioak",
|
||||||
|
"components.Settings.SettingsAbout.about": "Honi buruz",
|
||||||
|
"components.Settings.SettingsAbout.documentation": "Dokumentazioa",
|
||||||
|
"components.Settings.SettingsAbout.preferredmethod": "Nahiagokoa",
|
||||||
|
"components.Settings.SettingsAbout.version": "Bertsioa",
|
||||||
|
"components.Settings.SettingsJobsCache.cachehits": "Kontsultak",
|
||||||
|
"components.Settings.SettingsJobsCache.cachemisses": "Hutsegiteak",
|
||||||
|
"components.Settings.SettingsJobsCache.command": "Komandoa",
|
||||||
|
"components.Settings.SettingsJobsCache.jobs": "Atazak",
|
||||||
|
"components.Settings.SettingsJobsCache.jobtype": "Mota",
|
||||||
|
"components.Settings.SettingsLogs.filterDebug": "Arazketa",
|
||||||
|
"components.Settings.SettingsLogs.filterError": "Errorea",
|
||||||
|
"components.Settings.SettingsLogs.filterInfo": "Informazioa",
|
||||||
|
"components.Settings.SettingsLogs.filterWarn": "Oharra",
|
||||||
|
"components.Settings.SettingsLogs.label": "Etiketa",
|
||||||
|
"components.Settings.SettingsLogs.level": "Larritasuna",
|
||||||
|
"components.Settings.SettingsLogs.logs": "Erregistroak",
|
||||||
|
"components.Settings.SettingsLogs.message": "Mezua",
|
||||||
|
"components.Settings.SettingsLogs.pauseLogs": "Pausatu",
|
||||||
|
"components.Settings.SettingsLogs.resumeLogs": "Jarraitu",
|
||||||
|
"components.Settings.SettingsLogs.time": "Denbora-zigilua",
|
||||||
|
"components.Settings.SonarrModal.port": "Ataka",
|
||||||
|
"components.Settings.address": "Helbidea",
|
||||||
|
"components.Settings.default": "Lehenetsia",
|
||||||
|
"components.Settings.menuAbout": "Honi buruz",
|
||||||
|
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
||||||
|
"components.Settings.menuLogs": "Erregistroak",
|
||||||
|
"components.Settings.menuNotifications": "Jakinarazpenak",
|
||||||
|
"components.Settings.menuPlexSettings": "Plex",
|
||||||
|
"components.Settings.menuServices": "Zerbitzuak",
|
||||||
|
"components.Settings.menuUsers": "Erabiltzaileak",
|
||||||
|
"components.Settings.notifications": "Jakinarazpenak",
|
||||||
|
"components.Settings.plex": "Plex",
|
||||||
|
"components.Settings.saving": "Gordetzen…",
|
||||||
|
"components.Settings.scanning": "Sinkronizatzen…",
|
||||||
|
"components.Settings.serverLocal": "lokala",
|
||||||
|
"components.Settings.serverRemote": "urrunekoa",
|
||||||
|
"components.Settings.serverSecure": "segurua",
|
||||||
|
"components.Settings.serverpreset": "Zerbitzaria",
|
||||||
|
"components.Settings.services": "Zerbitzuak",
|
||||||
|
"components.Settings.ssl": "SSL",
|
||||||
|
"components.Settings.tip": "Aholkua",
|
||||||
|
"components.Settings.webhook": "Webhook",
|
||||||
|
"components.Setup.continue": "Jarraitu",
|
||||||
|
"components.Setup.finishing": "Amaitzen…",
|
||||||
|
"components.Setup.setup": "Konfigurazioa",
|
||||||
|
"components.StatusBadge.seasonnumber": "S{seasonNumber}",
|
||||||
|
"components.StatusBadge.status": "{status}",
|
||||||
|
"components.TvDetails.anime": "Animea",
|
||||||
|
"components.TvDetails.cast": "Aktoreak",
|
||||||
|
"components.TvDetails.recommendations": "Gomendioak",
|
||||||
|
"components.TvDetails.seasonstitle": "Denboraldiak",
|
||||||
|
"components.UserList.accounttype": "Mota",
|
||||||
|
"components.UserList.create": "Sortu",
|
||||||
|
"components.UserList.created": "Bat eginda",
|
||||||
|
"components.UserList.creating": "Sortzen…",
|
||||||
|
"components.UserList.owner": "Jabea",
|
||||||
|
"components.UserList.password": "Pasahitza",
|
||||||
|
"components.UserList.role": "Rola",
|
||||||
|
"components.UserList.user": "Erabiltzailea",
|
||||||
|
"components.UserList.username": "Erabiltzaile-izena",
|
||||||
|
"components.UserList.users": "Erabiltzaileak",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.email": "E-posta",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.general": "Orokorra",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.owner": "Jabea",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Gordetzen…",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.user": "Erabiltzailea",
|
||||||
|
"components.UserProfile.UserSettings.UserNotificationSettings.notifications": "Jakinarazpenak",
|
||||||
|
"components.UserProfile.UserSettings.menuChangePass": "Pasahitza",
|
||||||
|
"components.UserProfile.UserSettings.menuGeneralSettings": "Orokorra",
|
||||||
|
"components.UserProfile.UserSettings.menuNotifications": "Jakinarazpenak",
|
||||||
|
"components.UserProfile.unlimited": "Mugagabeak",
|
||||||
|
"i18n.advanced": "Aurreratua",
|
||||||
|
"i18n.all": "Denak",
|
||||||
|
"i18n.approve": "Onartu",
|
||||||
|
"i18n.available": "Eskuragarri",
|
||||||
|
"i18n.back": "Itzuli",
|
||||||
|
"i18n.blacklist": "Zerrenda beltza",
|
||||||
|
"i18n.blacklisted": "Zerrenda beltzean",
|
||||||
|
"i18n.cancel": "Utzi",
|
||||||
|
"i18n.canceling": "Uzten…",
|
||||||
|
"i18n.close": "Itxi",
|
||||||
|
"i18n.collection": "Bilduma",
|
||||||
|
"i18n.decline": "Uko egin",
|
||||||
|
"i18n.declined": "Ukatuta",
|
||||||
|
"i18n.delete": "Ezabatu",
|
||||||
|
"i18n.edit": "Editatu",
|
||||||
|
"i18n.experimental": "Esperimentala",
|
||||||
|
"i18n.failed": "Huts egin du",
|
||||||
|
"i18n.import": "Inportatu",
|
||||||
|
"i18n.importing": "Inportatzen…",
|
||||||
|
"i18n.loading": "Kargatzen…",
|
||||||
|
"i18n.movie": "Filma",
|
||||||
|
"i18n.movies": "Filmak",
|
||||||
|
"i18n.next": "Aurrera",
|
||||||
|
"i18n.open": "Ireki",
|
||||||
|
"i18n.pending": "Zain",
|
||||||
|
"i18n.previous": "Aurrekoa",
|
||||||
|
"i18n.request": "Eskatu",
|
||||||
|
"i18n.requested": "Eskatuta",
|
||||||
|
"i18n.requesting": "Eskatzen…",
|
||||||
|
"i18n.resolved": "Ebatzita",
|
||||||
|
"i18n.retry": "Saiatu berriro",
|
||||||
|
"i18n.retrying": "Berriro saiatzen…",
|
||||||
|
"i18n.saving": "Gordetzen…",
|
||||||
|
"i18n.settings": "Ezarpenak",
|
||||||
|
"i18n.specials": "Bereziak",
|
||||||
|
"i18n.test": "Frogatu",
|
||||||
|
"i18n.testing": "Frogatzen…",
|
||||||
|
"i18n.unavailable": "Ez dago",
|
||||||
|
"i18n.view": "Ikusi",
|
||||||
|
"pages.oops": "Ai!",
|
||||||
|
"components.Blacklist.blacklistdate": "data",
|
||||||
|
"components.CollectionDetails.requestcollection": "Eskatu bilduma",
|
||||||
|
"components.IssueModal.CreateIssueModal.extras": "Gehigarriak",
|
||||||
|
"components.MovieDetails.overview": "Ikuspegi orokorra",
|
||||||
|
"components.PermissionEdit.autorequest": "Auto-eskaera",
|
||||||
|
"components.PersonDetails.appearsin": "Agerraldiak",
|
||||||
|
"components.RequestModal.QuotaDisplay.movie": "filmak",
|
||||||
|
"components.Selector.pilot": "Pilotoa",
|
||||||
|
"components.Settings.RadarrModal.announced": "Iragarrita",
|
||||||
|
"components.Settings.timeout": "Denbora-muga",
|
||||||
|
"components.UserList.admin": "Administratzailea",
|
||||||
|
"components.UserList.totalrequests": "Eskaerak",
|
||||||
|
"components.UserProfile.UserSettings.UserNotificationSettings.email": "E-posta",
|
||||||
|
"components.UserProfile.UserSettings.menuPermissions": "Baimenak",
|
||||||
|
"components.Discover.DiscoverMovies.discovermovies": "Filmak",
|
||||||
|
"components.CollectionDetails.requestcollection4k": "Eskatu bilduma 4K-n",
|
||||||
|
"components.IssueDetails.issuepagetitle": "Intzidentzia",
|
||||||
|
"components.IssueList.issues": "Intzidentziak",
|
||||||
|
"components.ManageSlideOver.downloadstatus": "Deskargaren egoera",
|
||||||
|
"components.PermissionEdit.admin": "Administratzailea",
|
||||||
|
"components.RequestList.requests": "Eskaerak",
|
||||||
|
"components.RequestModal.AdvancedRequester.tags": "Etiketak",
|
||||||
|
"components.RequestModal.QuotaDisplay.season": "denboraldia",
|
||||||
|
"components.Search.search": "Bilatu",
|
||||||
|
"components.Settings.SettingsAbout.Releases.currentversion": "Unekoa",
|
||||||
|
"components.Discover.CreateSlider.addcustomslider": "Sortu irristari pertsonalizatua",
|
||||||
|
"components.Discover.CreateSlider.editSlider": "Editatu irristaria",
|
||||||
|
"components.IssueDetails.unknownissuetype": "Ezezaguna",
|
||||||
|
"components.Login.username": "Erabiltzaile-izena",
|
||||||
|
"components.Settings.Notifications.encryptionNone": "Bat ere ez",
|
||||||
|
"components.Settings.SettingsUsers.users": "Erabiltzaileak",
|
||||||
|
"components.Settings.email": "E-posta",
|
||||||
|
"components.Settings.mediaTypeMovie": "filma",
|
||||||
|
"components.Settings.port": "Ataka",
|
||||||
|
"components.UserProfile.UserSettings.UserPasswordChange.password": "Pasahitza",
|
||||||
|
"i18n.deleting": "Ezabatzen…",
|
||||||
|
"i18n.processing": "Prozesatzen",
|
||||||
|
"components.Discover.FilterSlideover.filters": "Iragazkiak",
|
||||||
|
"components.Discover.DiscoverTv.discovertv": "Telesailak",
|
||||||
|
"components.IssueModal.issueSubtitles": "Azpititulua",
|
||||||
|
"components.Login.initialsignin": "Konektatu",
|
||||||
|
"components.RequestList.RequestItem.modified": "Aldatuta",
|
||||||
|
"components.RequestList.RequestItem.requested": "Eskatuta",
|
||||||
|
"components.RequestModal.season": "Denboraldia",
|
||||||
|
"components.Settings.SettingsMain.general": "Orokorra",
|
||||||
|
"components.Settings.is4k": "4K",
|
||||||
|
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
|
||||||
|
"components.UserProfile.UserSettings.UserPermissions.permissions": "Baimenak",
|
||||||
|
"i18n.status": "Egoera",
|
||||||
|
"components.Discover.FilterSlideover.status": "Egoera",
|
||||||
|
"components.Settings.SettingsJobsCache.cache": "Cachea",
|
||||||
|
"components.Settings.SettingsJobsCache.process": "Prozesua",
|
||||||
|
"components.Settings.SonarrModal.tags": "Etiketak",
|
||||||
|
"components.Settings.menuGeneralSettings": "Orokorra",
|
||||||
|
"components.Settings.syncing": "Sinkronizatzen",
|
||||||
|
"components.TvDetails.overview": "Ikuspegi orokorra",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.admin": "Administratzailea",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.role": "Rola",
|
||||||
|
"i18n.approved": "Onartuta"
|
||||||
|
}
|
||||||
@@ -31,5 +31,219 @@
|
|||||||
"components.Discover.CreateSlider.nooptions": "Ei tuloksia.",
|
"components.Discover.CreateSlider.nooptions": "Ei tuloksia.",
|
||||||
"components.Discover.CreateSlider.searchKeywords": "Etsi avainsanoja…",
|
"components.Discover.CreateSlider.searchKeywords": "Etsi avainsanoja…",
|
||||||
"components.Discover.DiscoverMovies.discovermovies": "Elokuvat",
|
"components.Discover.DiscoverMovies.discovermovies": "Elokuvat",
|
||||||
"components.Discover.CreateSlider.providetmdbgenreid": "Anna TMDB Genre ID"
|
"components.Discover.CreateSlider.providetmdbgenreid": "Anna TMDB Genre ID",
|
||||||
|
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Julkaisupäivä laskevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverTvLanguage.languageSeries": "{language} Sarjat",
|
||||||
|
"components.Discover.PlexWatchlistSlider.emptywatchlist": "<PlexWatchlistSupportLink>Plex katselulistalle</PlexWatchlistSupportLink> lisätty media näkyy täällä.",
|
||||||
|
"components.PermissionEdit.blacklistedItems": "Estä mediaa.",
|
||||||
|
"components.PermissionEdit.manageblacklistDescription": "Salli estetyn median hallinnointi.",
|
||||||
|
"components.Discover.updatesuccess": "Päivitettiin tutustumisen mukautusasetukset.",
|
||||||
|
"components.IssueDetails.toasteditdescriptionfailed": "Jokin meni pieleen muokatessa ongelman kuvausta.",
|
||||||
|
"components.IssueModal.CreateIssueModal.toastFailedCreate": "Jokin meni pieleen lähettäessä ongelmaa.",
|
||||||
|
"component.BlacklistBlock.blacklistdate": "Estetty päivämäärä",
|
||||||
|
"components.Blacklist.blacklistNotFoundError": "<strong>{title}</strong> ei ole estetty.",
|
||||||
|
"components.Discover.FilterSlideover.ratingText": "Arvostelut välillä {minValue} ja {maxValue}",
|
||||||
|
"components.Discover.FilterSlideover.voteCount": "Pisteytys välillä {minValue} ja {maxValue}",
|
||||||
|
"components.Layout.Sidebar.blacklist": "Estolista",
|
||||||
|
"components.Discover.tmdbmoviekeyword": "TMDB Elokuvan Avainsana",
|
||||||
|
"components.IssueDetails.IssueComment.postedbyedited": "Lähetetty {relativeTime} käyttäjältä {username} (Muokattu)",
|
||||||
|
"components.IssueDetails.deleteissueconfirm": "Haluatko varmasti poistaa ongelman?",
|
||||||
|
"components.IssueDetails.problemepisode": "Liittyvä jakso",
|
||||||
|
"components.IssueList.IssueItem.problemepisode": "Liittyvä jakso",
|
||||||
|
"components.IssueList.IssueItem.unknownissuetype": "Tuntematon",
|
||||||
|
"components.Discover.CreateSlider.addsuccess": "Luotiin uusi liukusäädin ja tallennettiin ehdotusten kustomointiasetus.",
|
||||||
|
"components.Discover.DiscoverSliderEdit.deletesuccess": "Liukusäätimen poisto onnistui.",
|
||||||
|
"components.IssueDetails.IssueComment.edit": "Muokkaa kommenttia",
|
||||||
|
"components.IssueModal.CreateIssueModal.episode": "Jakso {episodeNumber}",
|
||||||
|
"components.Layout.Sidebar.requests": "Pyynnöt",
|
||||||
|
"components.Layout.UserWarnings.emailRequired": "Sähköpostiosoite on pakollinen.",
|
||||||
|
"components.Layout.UserWarnings.passwordRequired": "Salasana on pakollinen.",
|
||||||
|
"components.Discover.DiscoverTv.sortTitleAsc": "Otsikko (A-Z) nousevassa järjestyksessä",
|
||||||
|
"components.Discover.resetfailed": "Jokin meni pieleen tutustumisen mukautusasetusten tyhjentämisessä.",
|
||||||
|
"components.Discover.upcoming": "Tulevat Elokuvat",
|
||||||
|
"components.Layout.UserWarnings.emailInvalid": "Sähköpostiosoite ei kelpaa.",
|
||||||
|
"components.Login.back": "Palaa takaisin",
|
||||||
|
"components.Login.credentialerror": "Käyttäjätunnus tai salasana on väärin.",
|
||||||
|
"component.BlacklistBlock.blacklistedby": "Estänyt",
|
||||||
|
"component.BlacklistModal.blacklisting": "Estäminen",
|
||||||
|
"components.Blacklist.blacklistSettingsDescription": "Hallinnoi estettyä mediaa.",
|
||||||
|
"components.Blacklist.blacklistdate": "päivämäärä",
|
||||||
|
"components.Blacklist.blacklistedby": "{date} käyttäjä {user}",
|
||||||
|
"components.Blacklist.blacklistsettings": "Estämisen Asetukset",
|
||||||
|
"components.Blacklist.mediaName": "Nimi",
|
||||||
|
"components.Blacklist.mediaType": "Tyyppi",
|
||||||
|
"components.Blacklist.mediaTmdbId": "",
|
||||||
|
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Julkaisupäivä nousevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverMovies.sortTitleAsc": "Otsikko (A-Z) nousevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverMovies.sortTitleDesc": "Otsikko (A-Z) laskevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "TMDB Rating nousevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "TMDB Rating laskevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverNetwork.networkSeries": "{network} Sarjat",
|
||||||
|
"components.Discover.DiscoverSliderEdit.deletefail": "Liukusäätimen poisto epäonnistui.",
|
||||||
|
"components.Discover.DiscoverSliderEdit.enable": "Vaihda näkyvyys",
|
||||||
|
"components.Discover.DiscoverSliderEdit.remove": "Poista",
|
||||||
|
"components.Discover.DiscoverStudio.studioMovies": "{studio} Elokuvat",
|
||||||
|
"components.Discover.DiscoverTv.discovertv": "Sarjat",
|
||||||
|
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Ensiesitys nousevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Ensiesitys laskevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverTv.sortPopularityAsc": "Suosio nousevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverTv.sortPopularityDesc": "Suosio laskevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverTv.sortTitleDesc": "Otsikko (A-Z) laskevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "TMDB Rating nousevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverTv.sortTmdbRatingDesc": "TMDB Rating laskevassa järjestyksessä",
|
||||||
|
"components.Discover.DiscoverTvGenre.genreSeries": "{genre} Sarjat",
|
||||||
|
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Sarjat",
|
||||||
|
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Katselulistasi",
|
||||||
|
"components.Discover.DiscoverWatchlist.watchlist": "Plex Katselulista",
|
||||||
|
"components.Discover.FilterSlideover.clearfilters": "Tyhjennä aktiiviset suodattimet",
|
||||||
|
"components.Discover.FilterSlideover.filters": "Suodattimet",
|
||||||
|
"components.Discover.FilterSlideover.firstAirDate": "Ensiesitys",
|
||||||
|
"components.Discover.FilterSlideover.from": "Alkaen",
|
||||||
|
"components.Discover.FilterSlideover.genres": "Tyylilaji",
|
||||||
|
"components.Discover.FilterSlideover.keywords": "Avainsanat",
|
||||||
|
"components.Discover.FilterSlideover.originalLanguage": "Alkuperäinen kieli",
|
||||||
|
"components.Discover.FilterSlideover.releaseDate": "Julkaisupäivä",
|
||||||
|
"components.Discover.FilterSlideover.runtime": "Kesto",
|
||||||
|
"components.Discover.FilterSlideover.runtimeText": "{minValue}-{maxValue} minuutin kesto",
|
||||||
|
"components.Discover.FilterSlideover.status": "Tila",
|
||||||
|
"components.Discover.FilterSlideover.streamingservices": "Suoratoistopalvelut",
|
||||||
|
"components.Discover.FilterSlideover.studio": "Studio",
|
||||||
|
"components.Discover.FilterSlideover.tmdbuserscore": "TMDB Käyttäjien pisteytys",
|
||||||
|
"components.Discover.FilterSlideover.tmdbuservotecount": "TMDB Pisteytystä",
|
||||||
|
"components.Discover.FilterSlideover.to": "Saakka",
|
||||||
|
"components.Discover.MovieGenreList.moviegenres": "Elokuvien tyylilajit",
|
||||||
|
"components.Discover.MovieGenreSlider.moviegenres": "Elokuvien tyylilajit",
|
||||||
|
"components.Discover.NetworkSlider.networks": "Kanavat",
|
||||||
|
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Katselulistasi",
|
||||||
|
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Viimeksi lisätty",
|
||||||
|
"components.Discover.StudioSlider.studios": "Studiot",
|
||||||
|
"components.Discover.TvGenreList.seriesgenres": "Sarjojen tyylilajit",
|
||||||
|
"components.Discover.TvGenreSlider.tvgenres": "Sarjojen tyylilajit",
|
||||||
|
"components.Discover.createnewslider": "Luo uusi liukusäädin",
|
||||||
|
"components.Discover.customizediscover": "Mukauta Tutustumista",
|
||||||
|
"components.Discover.discover": "Tutustu",
|
||||||
|
"components.Discover.emptywatchlist": "<PlexWatchlistSupportLink>Plex Katselulistalle</PlexWatchlistSupportLink> lisätty media näkyy täällä.",
|
||||||
|
"components.Discover.moviegenres": "Elokuvien tyylilajit",
|
||||||
|
"components.Discover.networks": "Kanavat",
|
||||||
|
"components.Discover.plexwatchlist": "Katselulistasi",
|
||||||
|
"components.Discover.popularmovies": "Suositut Elokuvat",
|
||||||
|
"components.Discover.populartv": "Suositut Sarjat",
|
||||||
|
"components.Discover.recentlyAdded": "Viimeksi Lisätty",
|
||||||
|
"components.Discover.recentrequests": "Viimeksi Pyydetty",
|
||||||
|
"components.Discover.resetsuccess": "Tutustumisen mukautusasetukset tyhjennetty.",
|
||||||
|
"components.Discover.resettodefault": "Palauta Oletusasetukset",
|
||||||
|
"components.Discover.resetwarning": "Palauta liukusäätimet. Tämä poistaa myös mukautetut säätimet!",
|
||||||
|
"components.Discover.stopediting": "Lopeta Muokkaaminen",
|
||||||
|
"components.Discover.studios": "Studiot",
|
||||||
|
"components.Discover.tmdbmoviegenre": "TMDB Elokuvan tyylilaji",
|
||||||
|
"components.Discover.tmdbmoviestreamingservices": "TMDB Elokuvan suoratoistopalvelu",
|
||||||
|
"components.Discover.tmdbnetwork": "TMDB Kanava",
|
||||||
|
"components.Discover.tmdbsearch": "TMDB Haku",
|
||||||
|
"components.Discover.tmdbstudio": "TMDB Studio",
|
||||||
|
"components.Discover.tmdbtvgenre": "TMDB Sarjan tyylilaji",
|
||||||
|
"components.Discover.tmdbtvkeyword": "TMDB Sarjan Avainsana",
|
||||||
|
"components.Discover.tmdbtvstreamingservices": "TMDB TV Suoratoistopalvelut",
|
||||||
|
"components.Discover.trending": "Trendaava",
|
||||||
|
"components.Discover.tvgenres": "Sarjojen Tyylilajit",
|
||||||
|
"components.Discover.upcomingmovies": "Tulevat Elokuvat",
|
||||||
|
"components.Discover.upcomingtv": "Tulevat Sarjat",
|
||||||
|
"components.Discover.updatefailed": "Jokin meni pieleen tutustumisen mukautusasetusten päivityksessä.",
|
||||||
|
"components.DownloadBlock.estimatedtime": "Arvioitu {time}",
|
||||||
|
"components.DownloadBlock.formattedTitle": "{title}: Kausi {seasonNumber} Jakso {episodeNumber}",
|
||||||
|
"components.IssueDetails.IssueComment.areyousuredelete": "Haluatko varmasti poistaa kommentin?",
|
||||||
|
"components.IssueDetails.IssueComment.delete": "Poista kommentti",
|
||||||
|
"components.IssueDetails.IssueComment.postedby": "Lähetetty {relativeTime} käyttäjältä {username}",
|
||||||
|
"components.IssueDetails.IssueComment.validationComment": "Viesti on pakollinen",
|
||||||
|
"components.IssueDetails.IssueDescription.deleteissue": "Poista ongelma",
|
||||||
|
"components.IssueDetails.IssueDescription.description": "Kuvaus",
|
||||||
|
"components.IssueDetails.IssueDescription.edit": "Muokkaa Kuvausta",
|
||||||
|
"components.IssueDetails.allepisodes": "Kaikki jaksot",
|
||||||
|
"components.IssueDetails.allseasons": "Kaikki Kaudet",
|
||||||
|
"components.IssueDetails.closeissue": "Sulje Ongelma",
|
||||||
|
"components.IssueDetails.closeissueandcomment": "Sulje Kommentilla",
|
||||||
|
"components.IssueDetails.commentplaceholder": "Lisää kommentti…",
|
||||||
|
"components.IssueDetails.comments": "Kommentit",
|
||||||
|
"components.IssueDetails.deleteissue": "Poista Ongelma",
|
||||||
|
"components.IssueDetails.episode": "Jakso {episodeNumber}",
|
||||||
|
"components.IssueDetails.issuepagetitle": "Ongelma",
|
||||||
|
"components.IssueDetails.issuetype": "Tyyppi",
|
||||||
|
"components.IssueDetails.lastupdated": "Viimeksi Päivitetty",
|
||||||
|
"components.IssueDetails.leavecomment": "Kommentti",
|
||||||
|
"components.IssueDetails.nocomments": "Ei kommentteja.",
|
||||||
|
"components.IssueDetails.openedby": "#{issueId} avattiin{relativeTime} käyttäjältä {username}",
|
||||||
|
"components.IssueDetails.openin4karr": "Avaa 4K:na {arr}",
|
||||||
|
"components.IssueDetails.openinarr": "Avaa {arr}",
|
||||||
|
"components.IssueDetails.play4konplex": "Soita 4K:na laitteella {mediaServerName}",
|
||||||
|
"components.IssueDetails.playonplex": "Soita laitteella {mediaServerName}",
|
||||||
|
"components.IssueDetails.problemseason": "Liittyvä kausi",
|
||||||
|
"components.IssueDetails.reopenissue": "Avaa ongelma uudelleen",
|
||||||
|
"components.IssueDetails.reopenissueandcomment": "Avaa uudelleen kommentilla",
|
||||||
|
"components.IssueDetails.season": "Kausi {seasonNumber}",
|
||||||
|
"components.IssueDetails.toasteditdescriptionsuccess": "Ongelman kuvauksen muokkaus onnistui!",
|
||||||
|
"components.IssueDetails.toastissuedeleted": "Ongelma poistaminen onnistui!",
|
||||||
|
"components.IssueDetails.toastissuedeletefailed": "Jokin meni pieleen ongelmaa poistaessa.",
|
||||||
|
"components.IssueDetails.toaststatusupdated": "Ongelman tila päivitetty onnistuneesti!",
|
||||||
|
"components.IssueDetails.toaststatusupdatefailed": "Jokin meni pieleen päivittäessä ongelman tilaa.",
|
||||||
|
"components.IssueDetails.unknownissuetype": "Tuntematon",
|
||||||
|
"components.IssueList.IssueItem.issuestatus": "Tila",
|
||||||
|
"components.IssueList.IssueItem.issuetype": "Tyyppi",
|
||||||
|
"components.IssueList.IssueItem.opened": "Avattu",
|
||||||
|
"components.IssueList.IssueItem.openeduserdate": "{date} käyttäjältä {user}",
|
||||||
|
"components.IssueList.IssueItem.viewissue": "Näytä ongelma",
|
||||||
|
"components.IssueList.issues": "Ongelmat",
|
||||||
|
"components.IssueList.showallissues": "Näytä kaikki ongelmat",
|
||||||
|
"components.IssueList.sortAdded": "Viimeisin lisätty",
|
||||||
|
"components.IssueList.sortModified": "Viimeisin muokattu",
|
||||||
|
"components.IssueModal.CreateIssueModal.allepisodes": "Kaikki jaksot",
|
||||||
|
"components.IssueModal.CreateIssueModal.allseasons": "Kaikki kaudet",
|
||||||
|
"components.IssueModal.CreateIssueModal.extras": "Ekstrat",
|
||||||
|
"components.IssueModal.CreateIssueModal.problemepisode": "Liittyvä jakso",
|
||||||
|
"components.IssueModal.CreateIssueModal.problemseason": "Liittyvä kausi",
|
||||||
|
"components.IssueModal.CreateIssueModal.providedetail": "Selitä ongelma yksityiskohtaisesti.",
|
||||||
|
"components.IssueModal.CreateIssueModal.reportissue": "Ilmoita ongelma",
|
||||||
|
"components.IssueModal.CreateIssueModal.season": "Kausi {seasonNumber}",
|
||||||
|
"components.IssueModal.CreateIssueModal.submitissue": "Lähetä ongelma",
|
||||||
|
"components.IssueModal.CreateIssueModal.toastSuccessCreate": "Ongelma <strong>{title}</strong> lähetetty onnistuneesti!",
|
||||||
|
"components.IssueModal.CreateIssueModal.toastviewissue": "Näytä ongelma",
|
||||||
|
"components.IssueModal.CreateIssueModal.validationMessageRequired": "Kuvaus on pakollinen",
|
||||||
|
"components.IssueModal.CreateIssueModal.whatswrong": "Mikä vikana?",
|
||||||
|
"components.IssueModal.issueAudio": "Ääni",
|
||||||
|
"components.IssueModal.issueOther": "Muu",
|
||||||
|
"components.IssueModal.issueSubtitles": "Tekstitys",
|
||||||
|
"components.IssueModal.issueVideo": "Kuva",
|
||||||
|
"components.LanguageSelector.languageServerDefault": "Oletus ({language})",
|
||||||
|
"components.LanguageSelector.originalLanguageDefault": "Kaikki kielet",
|
||||||
|
"components.Layout.LanguagePicker.displaylanguage": "Näyttökieli",
|
||||||
|
"components.Layout.SearchInput.searchPlaceholder": "Etsi Elokuvia & Sarjoja",
|
||||||
|
"components.Layout.Sidebar.browsemovies": "Elokuvat",
|
||||||
|
"components.Layout.Sidebar.browsetv": "Sarjat",
|
||||||
|
"components.Layout.Sidebar.dashboard": "Tutustu",
|
||||||
|
"components.Layout.Sidebar.issues": "Ongelmat",
|
||||||
|
"components.Layout.Sidebar.settings": "Asetukset",
|
||||||
|
"components.Layout.Sidebar.users": "Käyttäjät",
|
||||||
|
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Elokuvien Pyynnöt",
|
||||||
|
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Sarjojen Pyynnöt",
|
||||||
|
"components.Layout.UserDropdown.myprofile": "Profiili",
|
||||||
|
"components.Layout.UserDropdown.requests": "Pyynnöt",
|
||||||
|
"components.Layout.UserDropdown.settings": "Asetukset",
|
||||||
|
"components.Layout.UserDropdown.signout": "Kirjaudu ulos",
|
||||||
|
"components.Layout.VersionStatus.outofdate": "Vanhentunut",
|
||||||
|
"components.Login.adminerror": "Sinun täytyy käyttää admin-tunnusta kirjautuaksesi sisään.",
|
||||||
|
"components.PermissionEdit.blacklistedItemsDescription": "Salli median estäminen.",
|
||||||
|
"components.PermissionEdit.manageblacklist": "Hallinnoi estolistaa",
|
||||||
|
"pages.somethingwentwrong": "Jokin meni pieleen",
|
||||||
|
"pages.serviceunavailable": "Palvelu ei saatavilla",
|
||||||
|
"pages.returnHome": "Palaa etusivulle",
|
||||||
|
"pages.pagenotfound": "Sivua ei löydy",
|
||||||
|
"pages.oops": "Hups",
|
||||||
|
"pages.internalservererror": "Sisäinen palvelimen virhe",
|
||||||
|
"pages.errormessagewithcode": "{statusCode} - {error}",
|
||||||
|
"i18n.retry": "Yritä uudelleen",
|
||||||
|
"i18n.resultsperpage": "Näytä {pageSize} tulosta per sivu",
|
||||||
|
"i18n.restartRequired": "Uudelleenkäynnistys vaaditaan",
|
||||||
|
"i18n.resolved": "Ratkaistu",
|
||||||
|
"i18n.requesting": "Pyydetään…",
|
||||||
|
"i18n.requested": "Pyydetty",
|
||||||
|
"i18n.request4k": "Pyydä 4K:na",
|
||||||
|
"i18n.request": "Pyydä"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@
|
|||||||
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Séries",
|
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Séries",
|
||||||
"components.Discover.DiscoverTvLanguage.languageSeries": "Séries en {language}",
|
"components.Discover.DiscoverTvLanguage.languageSeries": "Séries en {language}",
|
||||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Votre watchlist",
|
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Votre watchlist",
|
||||||
"components.Discover.DiscoverWatchlist.watchlist": "Watchlist Plex",
|
"components.Discover.DiscoverWatchlist.watchlist": "Liste de lecture Plex",
|
||||||
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Filtre actif} other {# Filtres actifs}}",
|
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Filtre actif} other {# Filtres actifs}}",
|
||||||
"components.Discover.FilterSlideover.clearfilters": "Effacer les filtres actifs",
|
"components.Discover.FilterSlideover.clearfilters": "Effacer les filtres actifs",
|
||||||
"components.Discover.FilterSlideover.filters": "Filtres",
|
"components.Discover.FilterSlideover.filters": "Filtres",
|
||||||
@@ -82,8 +82,8 @@
|
|||||||
"components.Discover.MovieGenreList.moviegenres": "Genres de films",
|
"components.Discover.MovieGenreList.moviegenres": "Genres de films",
|
||||||
"components.Discover.MovieGenreSlider.moviegenres": "Genres de films",
|
"components.Discover.MovieGenreSlider.moviegenres": "Genres de films",
|
||||||
"components.Discover.NetworkSlider.networks": "Diffuseurs",
|
"components.Discover.NetworkSlider.networks": "Diffuseurs",
|
||||||
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Les médias ajoutés à votre <PlexWatchlistSupportLink>watchlist Plex</PlexWatchlistSupportLink> apparaîtront ici.",
|
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Les médias ajoutés à votre <PlexWatchlistSupportLink>liste de lecture Plex</PlexWatchlistSupportLink> apparaîtront ici.",
|
||||||
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Votre watchlist Plex",
|
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Votre liste de lecture",
|
||||||
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Récemment ajoutés",
|
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Récemment ajoutés",
|
||||||
"components.Discover.StudioSlider.studios": "Studios",
|
"components.Discover.StudioSlider.studios": "Studios",
|
||||||
"components.Discover.TvGenreList.seriesgenres": "Genres de séries",
|
"components.Discover.TvGenreList.seriesgenres": "Genres de séries",
|
||||||
@@ -91,13 +91,10 @@
|
|||||||
"components.Discover.createnewslider": "Créer un nouveau slider",
|
"components.Discover.createnewslider": "Créer un nouveau slider",
|
||||||
"components.Discover.customizediscover": "Personnaliser Découvrir",
|
"components.Discover.customizediscover": "Personnaliser Découvrir",
|
||||||
"components.Discover.discover": "Découvrir",
|
"components.Discover.discover": "Découvrir",
|
||||||
"components.Discover.discovermovies": "Films populaires",
|
"components.Discover.emptywatchlist": "Les médias ajoutés à votre <PlexWatchlistSupportLink>liste de lecture Plex</PlexWatchlistSupportLink> apparaîtront ici.",
|
||||||
"components.Discover.discovertv": "Séries populaires",
|
|
||||||
"components.Discover.emptywatchlist": "Les médias ajoutés à votre <PlexWatchlistSupportLink>watchlist Plex</PlexWatchlistSupportLink> apparaîtront ici.",
|
|
||||||
"components.Discover.moviegenres": "Genres de films",
|
"components.Discover.moviegenres": "Genres de films",
|
||||||
"components.Discover.networks": "Diffuseurs",
|
"components.Discover.networks": "Diffuseurs",
|
||||||
"components.Discover.noRequests": "Aucune requête",
|
"components.Discover.plexwatchlist": "Votre liste de lecture",
|
||||||
"components.Discover.plexwatchlist": "Votre watchlist Plex",
|
|
||||||
"components.Discover.popularmovies": "Films populaires",
|
"components.Discover.popularmovies": "Films populaires",
|
||||||
"components.Discover.populartv": "Séries populaires",
|
"components.Discover.populartv": "Séries populaires",
|
||||||
"components.Discover.recentlyAdded": "Ajouts récents",
|
"components.Discover.recentlyAdded": "Ajouts récents",
|
||||||
@@ -144,7 +141,6 @@
|
|||||||
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Saison} other {Saisons}}",
|
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Saison} other {Saisons}}",
|
||||||
"components.RequestList.requests": "Demandes",
|
"components.RequestList.requests": "Demandes",
|
||||||
"components.RequestModal.cancel": "Annuler la demande",
|
"components.RequestModal.cancel": "Annuler la demande",
|
||||||
"components.RequestModal.extras": "Extras",
|
|
||||||
"components.RequestModal.numberofepisodes": "Nombre d'épisodes",
|
"components.RequestModal.numberofepisodes": "Nombre d'épisodes",
|
||||||
"components.RequestModal.pendingrequest": "Demande en attente",
|
"components.RequestModal.pendingrequest": "Demande en attente",
|
||||||
"components.RequestModal.requestCancel": "Demande pour <strong>{title}</strong> refusée.",
|
"components.RequestModal.requestCancel": "Demande pour <strong>{title}</strong> refusée.",
|
||||||
@@ -223,7 +219,7 @@
|
|||||||
"components.Settings.hostname": "Nom d'hôte ou adresse IP",
|
"components.Settings.hostname": "Nom d'hôte ou adresse IP",
|
||||||
"components.Settings.librariesRemaining": "Bibliothèques restantes : {count}",
|
"components.Settings.librariesRemaining": "Bibliothèques restantes : {count}",
|
||||||
"components.Settings.manualscan": "Scan manuel des bibliothèques",
|
"components.Settings.manualscan": "Scan manuel des bibliothèques",
|
||||||
"components.Settings.manualscanDescription": "Normalement, le scan sera effectué une fois toutes les 24 heures seulement. Jellyseerr vérifiera les ajouts récents de votre serveur Plex de façon proactive. Si c'est la première fois que vous configurez Plex, un scan complet de la bibliothèque est recommandé !",
|
"components.Settings.manualscanDescription": "Normalement, le scan sera effectué une fois toutes les 24 heures seulement. Jellyseerr vérifiera les ajouts récents de votre serveur Plex de façon proactive. Si c'est la première fois que vous configurez Plex, un scan complet de la bibliothèque est recommandé!",
|
||||||
"components.Settings.menuAbout": "À propos",
|
"components.Settings.menuAbout": "À propos",
|
||||||
"components.Settings.menuGeneralSettings": "Général",
|
"components.Settings.menuGeneralSettings": "Général",
|
||||||
"components.Settings.menuJobs": "Tâches et cache",
|
"components.Settings.menuJobs": "Tâches et cache",
|
||||||
@@ -234,7 +230,7 @@
|
|||||||
"components.Settings.notificationsettings": "Paramètres de notification",
|
"components.Settings.notificationsettings": "Paramètres de notification",
|
||||||
"components.Settings.notrunning": "Pas en exécution",
|
"components.Settings.notrunning": "Pas en exécution",
|
||||||
"components.Settings.plexlibraries": "Bibliothèques Plex",
|
"components.Settings.plexlibraries": "Bibliothèques Plex",
|
||||||
"components.Settings.plexlibrariesDescription": "Les bibliothèques Jellyseerr recherchent les titres. Configurez et sauvegardez vos paramètres de connexion Plex, puis cliquez sur le bouton ci-dessous si aucune bibliothèque n'est répertoriée.",
|
"components.Settings.plexlibrariesDescription": "Les bibliothèques Jellyseerr recherchent les titres. Configurez et sauvegardez vos paramètres de connexion Plex, puis cliquez sur le bouton ci-dessous si aucune bibliothèque n'est listée.",
|
||||||
"components.Settings.plexsettings": "Paramètres Plex",
|
"components.Settings.plexsettings": "Paramètres Plex",
|
||||||
"components.Settings.plexsettingsDescription": "Configurer les paramètres de votre serveur Plex. Jellyseerr scanne vos librairies Plex pour déterminer les contenus disponibles.",
|
"components.Settings.plexsettingsDescription": "Configurer les paramètres de votre serveur Plex. Jellyseerr scanne vos librairies Plex pour déterminer les contenus disponibles.",
|
||||||
"components.Settings.port": "Port",
|
"components.Settings.port": "Port",
|
||||||
@@ -242,12 +238,10 @@
|
|||||||
"components.Settings.sonarrsettings": "Paramètres Sonarr",
|
"components.Settings.sonarrsettings": "Paramètres Sonarr",
|
||||||
"components.Settings.ssl": "SSL",
|
"components.Settings.ssl": "SSL",
|
||||||
"components.Settings.startscan": "Commencer le scan",
|
"components.Settings.startscan": "Commencer le scan",
|
||||||
"components.Setup.configureplex": "Configurer Plex",
|
|
||||||
"components.Setup.configureservices": "Configurer les Services",
|
"components.Setup.configureservices": "Configurer les Services",
|
||||||
"components.Setup.continue": "Continuer",
|
"components.Setup.continue": "Continuer",
|
||||||
"components.Setup.finish": "Finir la configuration",
|
"components.Setup.finish": "Finir la configuration",
|
||||||
"components.Setup.finishing": "Finalisation…",
|
"components.Setup.finishing": "Finalisation…",
|
||||||
"components.Setup.loginwithplex": "Se connecter avec Plex",
|
|
||||||
"components.Setup.signinMessage": "Commencez en vous connectant avec votre compte Plex",
|
"components.Setup.signinMessage": "Commencez en vous connectant avec votre compte Plex",
|
||||||
"components.Setup.welcome": "Bienvenue sur Jellyseerr",
|
"components.Setup.welcome": "Bienvenue sur Jellyseerr",
|
||||||
"components.TvDetails.cast": "Casting",
|
"components.TvDetails.cast": "Casting",
|
||||||
@@ -290,11 +284,10 @@
|
|||||||
"components.Settings.SettingsAbout.version": "Version",
|
"components.Settings.SettingsAbout.version": "Version",
|
||||||
"components.Settings.SettingsAbout.totalrequests": "Total des demandes",
|
"components.Settings.SettingsAbout.totalrequests": "Total des demandes",
|
||||||
"components.Settings.SettingsAbout.totalmedia": "Total des médias",
|
"components.Settings.SettingsAbout.totalmedia": "Total des médias",
|
||||||
"components.Settings.SettingsAbout.overseerrinformation": "À propos d'Jellyseerr",
|
"components.Settings.SettingsAbout.overseerrinformation": "À propos de Jellyseerr",
|
||||||
"components.Settings.SettingsAbout.githubdiscussions": "Discussions GitHub",
|
"components.Settings.SettingsAbout.githubdiscussions": "Discussions GitHub",
|
||||||
"components.Settings.SettingsAbout.gettingsupport": "Obtenir de l'aide",
|
"components.Settings.SettingsAbout.gettingsupport": "Obtenir de l'aide",
|
||||||
"components.Settings.RadarrModal.validationNameRequired": "Vous devez fournir un nom de serveur",
|
"components.Settings.RadarrModal.validationNameRequired": "Vous devez fournir un nom de serveur",
|
||||||
"components.Setup.tip": "Astuce",
|
|
||||||
"i18n.deleting": "Suppression…",
|
"i18n.deleting": "Suppression…",
|
||||||
"components.UserList.userdeleteerror": "Une erreur s'est produite lors de la suppression de l'utilisateur.",
|
"components.UserList.userdeleteerror": "Une erreur s'est produite lors de la suppression de l'utilisateur.",
|
||||||
"components.UserList.userdeleted": "Utilisateur supprimé avec succès !",
|
"components.UserList.userdeleted": "Utilisateur supprimé avec succès !",
|
||||||
@@ -315,7 +308,7 @@
|
|||||||
"components.Settings.SonarrModal.animerootfolder": "Dossier racine pour anime",
|
"components.Settings.SonarrModal.animerootfolder": "Dossier racine pour anime",
|
||||||
"components.Settings.SonarrModal.animequalityprofile": "Profil qualité pour anime",
|
"components.Settings.SonarrModal.animequalityprofile": "Profil qualité pour anime",
|
||||||
"components.MovieDetails.studio": "{studioCount, plural, one {Studio} other {Studios}}",
|
"components.MovieDetails.studio": "{studioCount, plural, one {Studio} other {Studios}}",
|
||||||
"components.Settings.SettingsAbout.supportoverseerr": "Soutenez Jellyseerr",
|
"components.Settings.SettingsAbout.supportoverseerr": "Soutenez Overseerr",
|
||||||
"i18n.close": "Fermer",
|
"i18n.close": "Fermer",
|
||||||
"components.Settings.SettingsAbout.timezone": "Fuseau horaire",
|
"components.Settings.SettingsAbout.timezone": "Fuseau horaire",
|
||||||
"components.Settings.SettingsAbout.helppaycoffee": "Aidez-nous à payer le café",
|
"components.Settings.SettingsAbout.helppaycoffee": "Aidez-nous à payer le café",
|
||||||
@@ -479,8 +472,6 @@
|
|||||||
"components.Settings.serverpreset": "Serveur",
|
"components.Settings.serverpreset": "Serveur",
|
||||||
"components.Settings.serverRemote": "distant",
|
"components.Settings.serverRemote": "distant",
|
||||||
"components.Settings.serverLocal": "local",
|
"components.Settings.serverLocal": "local",
|
||||||
"components.TvDetails.playonplex": "Lire sur Plex",
|
|
||||||
"components.TvDetails.play4konplex": "Lire en 4K sur Plex",
|
|
||||||
"components.Settings.SonarrModal.toastSonarrTestSuccess": "Connexion à Sonarr établie avec succès !",
|
"components.Settings.SonarrModal.toastSonarrTestSuccess": "Connexion à Sonarr établie avec succès !",
|
||||||
"components.Settings.SonarrModal.toastSonarrTestFailure": "Échec de la connexion à Sonarr.",
|
"components.Settings.SonarrModal.toastSonarrTestFailure": "Échec de la connexion à Sonarr.",
|
||||||
"components.Settings.SonarrModal.syncEnabled": "Activer les scans",
|
"components.Settings.SonarrModal.syncEnabled": "Activer les scans",
|
||||||
@@ -489,8 +480,6 @@
|
|||||||
"components.Settings.RadarrModal.externalUrl": "URL externe",
|
"components.Settings.RadarrModal.externalUrl": "URL externe",
|
||||||
"components.MovieDetails.markavailable": "Marquer comme disponible",
|
"components.MovieDetails.markavailable": "Marquer comme disponible",
|
||||||
"components.MovieDetails.mark4kavailable": "Marquer comme disponible en 4K",
|
"components.MovieDetails.mark4kavailable": "Marquer comme disponible en 4K",
|
||||||
"components.MovieDetails.playonplex": "Lire sur Plex",
|
|
||||||
"components.MovieDetails.play4konplex": "Lire en 4K sur Plex",
|
|
||||||
"components.Settings.SettingsJobsCache.jobsDescription": "Jellyseerr effectue certaines tâches de maintenance comme des tâches planifiées régulièrement, mais elles peuvent également être déclenchées manuellement ci-dessous. L'exécution manuelle d'une tâche ne modifiera pas sa planification.",
|
"components.Settings.SettingsJobsCache.jobsDescription": "Jellyseerr effectue certaines tâches de maintenance comme des tâches planifiées régulièrement, mais elles peuvent également être déclenchées manuellement ci-dessous. L'exécution manuelle d'une tâche ne modifiera pas sa planification.",
|
||||||
"components.Settings.SettingsJobsCache.cachemisses": "Manqués",
|
"components.Settings.SettingsJobsCache.cachemisses": "Manqués",
|
||||||
"components.Settings.SettingsJobsCache.runnow": "Exécuter",
|
"components.Settings.SettingsJobsCache.runnow": "Exécuter",
|
||||||
@@ -522,7 +511,7 @@
|
|||||||
"components.RequestModal.AdvancedRequester.requestas": "Demander en tant que",
|
"components.RequestModal.AdvancedRequester.requestas": "Demander en tant que",
|
||||||
"components.PermissionEdit.viewrequestsDescription": "Autorise à afficher les demandes des autres utilisateurs.",
|
"components.PermissionEdit.viewrequestsDescription": "Autorise à afficher les demandes des autres utilisateurs.",
|
||||||
"components.PermissionEdit.viewrequests": "Voir les demandes",
|
"components.PermissionEdit.viewrequests": "Voir les demandes",
|
||||||
"components.UserList.validationEmail": "Vous devez fournir un e-mail valide",
|
"components.UserList.validationEmail": "Email requis",
|
||||||
"components.TvDetails.nextAirDate": "Prochaine diffusion",
|
"components.TvDetails.nextAirDate": "Prochaine diffusion",
|
||||||
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "L'URL de base ne doit pas se terminer par une barre oblique finale",
|
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "L'URL de base ne doit pas se terminer par une barre oblique finale",
|
||||||
"components.Settings.SonarrModal.validationBaseUrlLeadingSlash": "L'URL de base doit être précédée d'une barre oblique",
|
"components.Settings.SonarrModal.validationBaseUrlLeadingSlash": "L'URL de base doit être précédée d'une barre oblique",
|
||||||
@@ -635,12 +624,11 @@
|
|||||||
"components.RequestList.RequestItem.modified": "Modifiée",
|
"components.RequestList.RequestItem.modified": "Modifiée",
|
||||||
"components.RequestList.RequestItem.requested": "Demandé",
|
"components.RequestList.RequestItem.requested": "Demandé",
|
||||||
"components.RequestList.RequestItem.modifieduserdate": "{date} par {user}",
|
"components.RequestList.RequestItem.modifieduserdate": "{date} par {user}",
|
||||||
"components.Setup.scanbackground": "Le scan s'effectue en arrière-plan. Vous pouvez donc continuer le processus de configuration pendant ce temps.",
|
|
||||||
"components.Settings.scanning": "Synchronisation en cours…",
|
"components.Settings.scanning": "Synchronisation en cours…",
|
||||||
"components.Settings.scan": "Synchroniser les bibliothèques",
|
"components.Settings.scan": "Synchroniser les bibliothèques",
|
||||||
"components.Settings.SettingsJobsCache.sonarr-scan": "Scan de Sonarr",
|
"components.Settings.SettingsJobsCache.sonarr-scan": "Scan de Sonarr",
|
||||||
"components.Settings.SettingsJobsCache.radarr-scan": "Scan de Radarr",
|
"components.Settings.SettingsJobsCache.radarr-scan": "Scan de Radarr",
|
||||||
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Scan des ajouts récents aux bibliothèques Plex.",
|
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Scan des ajouts récents Plex.",
|
||||||
"components.Settings.SettingsJobsCache.plex-full-scan": "Scan complet des bibliothèques Plex.",
|
"components.Settings.SettingsJobsCache.plex-full-scan": "Scan complet des bibliothèques Plex.",
|
||||||
"components.Settings.Notifications.validationUrl": "Vous devez fournir une URL valide",
|
"components.Settings.Notifications.validationUrl": "Vous devez fournir une URL valide",
|
||||||
"components.Settings.Notifications.botAvatarUrl": "L'URL de l'avatar de votre Bot",
|
"components.Settings.Notifications.botAvatarUrl": "L'URL de l'avatar de votre Bot",
|
||||||
@@ -851,7 +839,7 @@
|
|||||||
"components.Settings.Notifications.encryptionOpportunisticTls": "Toujours utiliser STARTTLS",
|
"components.Settings.Notifications.encryptionOpportunisticTls": "Toujours utiliser STARTTLS",
|
||||||
"components.DownloadBlock.estimatedtime": "Estimation {time}",
|
"components.DownloadBlock.estimatedtime": "Estimation {time}",
|
||||||
"components.Settings.Notifications.NotificationsPushover.userTokenTip": "Votre <UsersGroupsLink>identifiant d'utilisateur ou de groupe</UsersGroupsLink> de 30 caractères",
|
"components.Settings.Notifications.NotificationsPushover.userTokenTip": "Votre <UsersGroupsLink>identifiant d'utilisateur ou de groupe</UsersGroupsLink> de 30 caractères",
|
||||||
"components.Settings.Notifications.NotificationsPushover.accessTokenTip": "<ApplicationRegistrationLink>Enregistrer une application</ApplicationRegistrationLink> pour l'utiliser avec Jellyseerr",
|
"components.Settings.Notifications.NotificationsPushover.accessTokenTip": "<ApplicationRegistrationLink>Enregistrer une application</ApplicationRegistrationLink> à utiliser avec Jellyseerr",
|
||||||
"components.RequestList.RequestItem.requesteddate": "Demandé",
|
"components.RequestList.RequestItem.requesteddate": "Demandé",
|
||||||
"components.RequestCard.failedretry": "Une erreur s'est produite lors du renvoi de la demande.",
|
"components.RequestCard.failedretry": "Une erreur s'est produite lors du renvoi de la demande.",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.webpushsettingssaved": "Paramètres de notification Web Push enregistrés avec succès !",
|
"components.UserProfile.UserSettings.UserNotificationSettings.webpushsettingssaved": "Paramètres de notification Web Push enregistrés avec succès !",
|
||||||
@@ -873,14 +861,13 @@
|
|||||||
"components.Settings.SettingsAbout.betawarning": "Ceci est un logiciel BÊTA. Les fonctionnalités peuvent être non opérationnelles ou instables. Veuillez signaler tout problème sur GitHub !",
|
"components.Settings.SettingsAbout.betawarning": "Ceci est un logiciel BÊTA. Les fonctionnalités peuvent être non opérationnelles ou instables. Veuillez signaler tout problème sur GitHub !",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.webpushsettingsfailed": "Échec de l'enregistrement des paramètres de notification Web push.",
|
"components.UserProfile.UserSettings.UserNotificationSettings.webpushsettingsfailed": "Échec de l'enregistrement des paramètres de notification Web push.",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "Langage par défaut ({language})",
|
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "Langage par défaut ({language})",
|
||||||
"components.UserList.displayName": "Nom affiché",
|
|
||||||
"components.Settings.webAppUrlTip": "Dirigez éventuellement les utilisateurs vers l'application Web sur votre serveur au lieu de l'application Web « hébergée »",
|
"components.Settings.webAppUrlTip": "Dirigez éventuellement les utilisateurs vers l'application Web sur votre serveur au lieu de l'application Web « hébergée »",
|
||||||
"components.Settings.webAppUrl": "URL <WebAppLink>Application Web</WebAppLink>",
|
"components.Settings.webAppUrl": "URL <WebAppLink>Application Web</WebAppLink>",
|
||||||
"components.Settings.noDefault4kServer": "Un serveur 4K {serverType} doit être marqué par défaut afin de permettre aux utilisateurs de soumettre des requêtes 4K {mediaType}.",
|
"components.Settings.noDefault4kServer": "Un serveur 4K {serverType} doit être marqué par défaut afin de permettre aux utilisateurs de soumettre des requêtes 4K {mediaType}.",
|
||||||
"components.Settings.is4k": "4K",
|
"components.Settings.is4k": "4K",
|
||||||
"components.Settings.SettingsUsers.newPlexLoginTip": "Autoriser les utilisateurs de Plex à se connecter sans être d'abord importés",
|
"components.Settings.SettingsUsers.newPlexLoginTip": "Autoriser les utilisateurs de {mediaServerName} à se connecter sans être d'abord importés",
|
||||||
"components.Settings.SettingsUsers.newPlexLogin": "Autoriser nouvelle connexion Plex",
|
"components.Settings.SettingsUsers.newPlexLogin": "Autoriser nouvelle connexion {mediaServerName}",
|
||||||
"components.Settings.SettingsUsers.localLoginTip": "Autoriser les utilisateurs à se connecter en utilisant leur adresse e-mail et leur mot de passe, au lieu de Plex OAuth",
|
"components.Settings.SettingsUsers.localLoginTip": "Autoriser les utilisateurs à se connecter en utilisant leur adresse e-mail et leur mot de passe, au lieu de {mediaServerName} OAuth",
|
||||||
"components.Settings.SettingsUsers.defaultPermissionsTip": "Autorisations par défaut attribuées aux nouveaux utilisateurs",
|
"components.Settings.SettingsUsers.defaultPermissionsTip": "Autorisations par défaut attribuées aux nouveaux utilisateurs",
|
||||||
"components.Settings.Notifications.webhookUrlTip": "Créez une <DiscordWebhookLink>intégration de webhook</DiscordWebhookLink> dans votre serveur",
|
"components.Settings.Notifications.webhookUrlTip": "Créez une <DiscordWebhookLink>intégration de webhook</DiscordWebhookLink> dans votre serveur",
|
||||||
"components.Settings.Notifications.validationTypes": "Vous devez sélectionner au moins un type de notification",
|
"components.Settings.Notifications.validationTypes": "Vous devez sélectionner au moins un type de notification",
|
||||||
@@ -920,7 +907,7 @@
|
|||||||
"components.IssueDetails.IssueComment.edit": "Éditer le commentaire",
|
"components.IssueDetails.IssueComment.edit": "Éditer le commentaire",
|
||||||
"components.IssueDetails.IssueComment.postedby": "Ajouté {relativeTime} par {username}",
|
"components.IssueDetails.IssueComment.postedby": "Ajouté {relativeTime} par {username}",
|
||||||
"components.IssueDetails.IssueComment.postedbyedited": "Ajouté {relativeTime} par {username} (Édité)",
|
"components.IssueDetails.IssueComment.postedbyedited": "Ajouté {relativeTime} par {username} (Édité)",
|
||||||
"components.IssueDetails.IssueComment.validationComment": "Vous devez écrire un message.",
|
"components.IssueDetails.IssueComment.validationComment": "Vous devez écrire un message",
|
||||||
"components.IssueDetails.IssueDescription.deleteissue": "Supprimer le problème",
|
"components.IssueDetails.IssueDescription.deleteissue": "Supprimer le problème",
|
||||||
"components.IssueDetails.IssueDescription.description": "Description",
|
"components.IssueDetails.IssueDescription.description": "Description",
|
||||||
"components.IssueDetails.IssueDescription.edit": "Éditer la description",
|
"components.IssueDetails.IssueDescription.edit": "Éditer la description",
|
||||||
@@ -941,8 +928,8 @@
|
|||||||
"components.IssueDetails.openedby": "#{issueId} ouvert {relativeTime} par {username}",
|
"components.IssueDetails.openedby": "#{issueId} ouvert {relativeTime} par {username}",
|
||||||
"components.IssueDetails.openin4karr": "Ouvrir dans {arr} 4K",
|
"components.IssueDetails.openin4karr": "Ouvrir dans {arr} 4K",
|
||||||
"components.IssueDetails.openinarr": "Ouvrir dans {arr}",
|
"components.IssueDetails.openinarr": "Ouvrir dans {arr}",
|
||||||
"components.IssueDetails.play4konplex": "Lire en 4K sur Plex",
|
"components.IssueDetails.play4konplex": "Lire en 4K sur {mediaServerName}",
|
||||||
"components.IssueDetails.playonplex": "Lire sur Plex",
|
"components.IssueDetails.playonplex": "Lire sur {mediaServerName}",
|
||||||
"components.IssueDetails.problemepisode": "Épisode concerné",
|
"components.IssueDetails.problemepisode": "Épisode concerné",
|
||||||
"components.IssueDetails.problemseason": "Saison concernée",
|
"components.IssueDetails.problemseason": "Saison concernée",
|
||||||
"components.IssueDetails.reopenissue": "Rouvrir le problème",
|
"components.IssueDetails.reopenissue": "Rouvrir le problème",
|
||||||
@@ -999,14 +986,14 @@
|
|||||||
"components.ManageSlideOver.manageModalClearMedia": "Effacer les données",
|
"components.ManageSlideOver.manageModalClearMedia": "Effacer les données",
|
||||||
"components.ManageSlideOver.movie": "film",
|
"components.ManageSlideOver.movie": "film",
|
||||||
"components.IssueModal.CreateIssueModal.season": "Saison {seasonNumber}",
|
"components.IssueModal.CreateIssueModal.season": "Saison {seasonNumber}",
|
||||||
"components.IssueModal.CreateIssueModal.validationMessageRequired": "Vous devez fournir une description.",
|
"components.IssueModal.CreateIssueModal.validationMessageRequired": "Vous devez fournir une description",
|
||||||
"components.IssueModal.CreateIssueModal.reportissue": "Signaler un problème",
|
"components.IssueModal.CreateIssueModal.reportissue": "Signaler un problème",
|
||||||
"components.IssueModal.CreateIssueModal.submitissue": "Soumettre le problème",
|
"components.IssueModal.CreateIssueModal.submitissue": "Soumettre le problème",
|
||||||
"components.IssueModal.issueAudio": "Audio",
|
"components.IssueModal.issueAudio": "Audio",
|
||||||
"components.IssueModal.issueOther": "Autre",
|
"components.IssueModal.issueOther": "Autre",
|
||||||
"components.ManageSlideOver.mark4kavailable": "Marquer comme disponible en 4K",
|
"components.ManageSlideOver.mark4kavailable": "Marquer comme disponible en 4K",
|
||||||
"components.ManageSlideOver.markavailable": "Marquer comme disponible",
|
"components.ManageSlideOver.markavailable": "Marquer comme disponible",
|
||||||
"components.Settings.SettingsAbout.runningDevelop": "Vous utilisez la branche <code>develop</code> d'Jellyseerr, qui n'est recommandée que pour ceux qui contribuent au développement ou qui aident aux tests et correctifs.",
|
"components.Settings.SettingsAbout.runningDevelop": "Vous utilisez la branche <code>develop</code> de Jellyseerr, qui n'est recommandée que pour ceux qui contribuent au développement ou qui aident aux tests et correctifs.",
|
||||||
"components.ManageSlideOver.openarr": "Ouvrir dans {arr}",
|
"components.ManageSlideOver.openarr": "Ouvrir dans {arr}",
|
||||||
"components.NotificationTypeSelector.adminissuecommentDescription": "Être averti(e) lorsque d'autres utilisateurs commentent sur un problème.",
|
"components.NotificationTypeSelector.adminissuecommentDescription": "Être averti(e) lorsque d'autres utilisateurs commentent sur un problème.",
|
||||||
"components.NotificationTypeSelector.issuecommentDescription": "Envoyer des notifications lorsqu'un problème reçoit de nouveaux commentaires.",
|
"components.NotificationTypeSelector.issuecommentDescription": "Envoyer des notifications lorsqu'un problème reçoit de nouveaux commentaires.",
|
||||||
@@ -1020,7 +1007,7 @@
|
|||||||
"components.Settings.SettingsJobsCache.editJobSchedule": "Modifier la tâche",
|
"components.Settings.SettingsJobsCache.editJobSchedule": "Modifier la tâche",
|
||||||
"components.NotificationTypeSelector.userissuecreatedDescription": "Être averti(e) lorsque d’autres utilisateurs signalent des problèmes.",
|
"components.NotificationTypeSelector.userissuecreatedDescription": "Être averti(e) lorsque d’autres utilisateurs signalent des problèmes.",
|
||||||
"components.PermissionEdit.manageissuesDescription": "Autorise à gérer les problèmes liés aux médias.",
|
"components.PermissionEdit.manageissuesDescription": "Autorise à gérer les problèmes liés aux médias.",
|
||||||
"components.Settings.SettingsJobsCache.jobScheduleEditFailed": "Un problème est survenu lors de l'enregistrement de la tâche",
|
"components.Settings.SettingsJobsCache.jobScheduleEditFailed": "Un problème est survenu lors de l'enregistrement de la tâche.",
|
||||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Toutes les {jobScheduleMinutes, plural, one {minute} other {{jobScheduleMinutes} minutes}}",
|
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Toutes les {jobScheduleMinutes, plural, one {minute} other {{jobScheduleMinutes} minutes}}",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessToken": "Jeton d'accès",
|
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessToken": "Jeton d'accès",
|
||||||
"components.NotificationTypeSelector.adminissuereopenedDescription": "Être averti(e) lorsqu'un problème est ré-ouvert par d'autres utilisateurs.",
|
"components.NotificationTypeSelector.adminissuereopenedDescription": "Être averti(e) lorsqu'un problème est ré-ouvert par d'autres utilisateurs.",
|
||||||
@@ -1109,8 +1096,8 @@
|
|||||||
"components.RequestList.RequestItem.tmdbid": "TMDB ID",
|
"components.RequestList.RequestItem.tmdbid": "TMDB ID",
|
||||||
"components.RequestList.RequestItem.tvdbid": "ID TheTVDB",
|
"components.RequestList.RequestItem.tvdbid": "ID TheTVDB",
|
||||||
"components.NotificationTypeSelector.mediaautorequested": "Demande soumise automatiquement",
|
"components.NotificationTypeSelector.mediaautorequested": "Demande soumise automatiquement",
|
||||||
"components.PermissionEdit.autorequestMoviesDescription": "Autorise l'envoi de demande automatique pour les médias non-4K via la liste de visionnage(s) Plex.",
|
"components.PermissionEdit.autorequestMoviesDescription": "Autorise l'envoi de demande automatique pour les vidéos non-4K via la liste de lecture Plex.",
|
||||||
"components.PermissionEdit.autorequestSeriesDescription": "Autorise l'envoi de demande automatique pour les médias non-4K via liste de visionnage(s) Plex.",
|
"components.PermissionEdit.autorequestSeriesDescription": "Autorise l'envoi de demande automatique pour les séries non-4K via la liste de lecture Plex.",
|
||||||
"components.StatusChecker.appUpdatedDescription": "Veuillez cliquer sur le bouton ci-dessous pour recharger l'application.",
|
"components.StatusChecker.appUpdatedDescription": "Veuillez cliquer sur le bouton ci-dessous pour recharger l'application.",
|
||||||
"components.StatusChecker.restartRequiredDescription": "Veuillez redémarrer le serveur pour appliquer les paramètres mis à jour.",
|
"components.StatusChecker.restartRequiredDescription": "Veuillez redémarrer le serveur pour appliquer les paramètres mis à jour.",
|
||||||
"components.TitleCard.cleardata": "Effacer les données",
|
"components.TitleCard.cleardata": "Effacer les données",
|
||||||
@@ -1119,19 +1106,19 @@
|
|||||||
"components.TitleCard.tvdbid": "ID TheTVDB",
|
"components.TitleCard.tvdbid": "ID TheTVDB",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Demander automatiquement les films",
|
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Demander automatiquement les films",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Demander automatiquement les Séries",
|
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Demander automatiquement les Séries",
|
||||||
"components.PermissionEdit.autorequestDescription": "Autorise l'envoi de demande automatique pour les médias non-4K via la liste de visionnage(s) Plex.",
|
"components.PermissionEdit.autorequestDescription": "Autorise l'envoi de demande automatique pour les médias non-4K via la liste de lecture Plex.",
|
||||||
"components.PermissionEdit.autorequestMovies": "Demander automatiquement les Films",
|
"components.PermissionEdit.autorequestMovies": "Demander automatiquement les Films",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Demande automatiquement les séries de votre <PlexWatchlistSupportLink>Watchlist Plex</PlexWatchlistSupportLink>",
|
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Demande automatiquement les séries de votre <PlexWatchlistSupportLink>Watchlist Plex</PlexWatchlistSupportLink>",
|
||||||
"components.PermissionEdit.autorequestSeries": "Demander automatiquement les Séries",
|
"components.PermissionEdit.autorequestSeries": "Demander automatiquement les Séries",
|
||||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Synchronisation de la liste de visionnage(s) Plex",
|
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Synchronisation de la liste de lecture Plex",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Demande automatiquement les films sur votre <PlexWatchlistSupportLink>Watchlist Plex</PlexWatchlistSupportLink>",
|
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Demande automatiquement les films sur votre <PlexWatchlistSupportLink>Watchlist Plex</PlexWatchlistSupportLink>",
|
||||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Recevez une notification lorsque de nouvelles demandes de médias sont automatiquement soumises pour des éléments de votre liste de visionnage(s) Plex.",
|
"components.NotificationTypeSelector.mediaautorequestedDescription": "Recevez une notification lorsque de nouvelles demandes de médias sont automatiquement soumises pour des éléments de votre liste de lecture.",
|
||||||
"components.StatusChecker.restartRequired": "Redémarrage du serveur requis",
|
"components.StatusChecker.restartRequired": "Redémarrage du serveur requis",
|
||||||
"components.StatusChecker.appUpdated": "{applicationTitle} mis à jour",
|
"components.StatusChecker.appUpdated": "{applicationTitle} mis à jour",
|
||||||
"components.Settings.SettingsLogs.viewdetails": "Voir les détails",
|
"components.Settings.SettingsLogs.viewdetails": "Voir les détails",
|
||||||
"components.Settings.advancedTooltip": "Une configuration incorrecte de ce paramètre peut entraîner un dysfonctionnement",
|
"components.Settings.advancedTooltip": "Une configuration incorrecte de ce paramètre peut entraîner un dysfonctionnement",
|
||||||
"components.Settings.experimentalTooltip": "L'activation de ce paramètre peut entraîner un comportement inattendu de l'application",
|
"components.Settings.experimentalTooltip": "L'activation de ce paramètre peut entraîner un comportement inattendu de l'application",
|
||||||
"components.PermissionEdit.viewwatchlists": "Voir la liste de visionnage(s) Plex",
|
"components.PermissionEdit.viewwatchlists": "Voir les listes de lecture {mediaServerName}",
|
||||||
"components.TvDetails.reportissue": "Signaler un problème",
|
"components.TvDetails.reportissue": "Signaler un problème",
|
||||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Demandes de films",
|
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Demandes de films",
|
||||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Demandes de séries",
|
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Demandes de séries",
|
||||||
@@ -1141,7 +1128,6 @@
|
|||||||
"components.Layout.UserWarnings.passwordRequired": "Un mot de passe est requis.",
|
"components.Layout.UserWarnings.passwordRequired": "Un mot de passe est requis.",
|
||||||
"components.Login.credentialerror": "Le nom d’utilisateur ou le mot de passe est incorrect.",
|
"components.Login.credentialerror": "Le nom d’utilisateur ou le mot de passe est incorrect.",
|
||||||
"components.Login.description": "Comme il s’agit de votre première connexion à {applicationName}, vous devez ajouter une adresse courrielle valide.",
|
"components.Login.description": "Comme il s’agit de votre première connexion à {applicationName}, vous devez ajouter une adresse courrielle valide.",
|
||||||
"components.Login.host": "{mediaServerName} URL",
|
|
||||||
"components.Login.initialsignin": "Connexion",
|
"components.Login.initialsignin": "Connexion",
|
||||||
"components.Login.initialsigningin": "Connexion en cours…",
|
"components.Login.initialsigningin": "Connexion en cours…",
|
||||||
"components.Login.save": "Ajouter",
|
"components.Login.save": "Ajouter",
|
||||||
@@ -1169,9 +1155,7 @@
|
|||||||
"components.MovieDetails.rtaudiencescore": "Score d’audience de Rotten Tomatoes",
|
"components.MovieDetails.rtaudiencescore": "Score d’audience de Rotten Tomatoes",
|
||||||
"components.MovieDetails.rtcriticsscore": "Rotten Tomatoes Tomatomètre",
|
"components.MovieDetails.rtcriticsscore": "Rotten Tomatoes Tomatomètre",
|
||||||
"components.MovieDetails.tmdbuserscore": "Note des utilisateurs TMDB",
|
"components.MovieDetails.tmdbuserscore": "Note des utilisateurs TMDB",
|
||||||
"components.PermissionEdit.settings": "Gérer les réglages",
|
"components.PermissionEdit.viewwatchlistsDescription": "Autorise à voir les listes de lecture {mediaServerName} des autres utilisateurs.",
|
||||||
"components.PermissionEdit.settingsDescription": "Autorise à modifier les réglages globaux. Un utilisateur doit avoir cette autorisation pour l'accorder à d'autres.",
|
|
||||||
"components.PermissionEdit.viewwatchlistsDescription": "Autorise à voir la liste de visionnage(s) Plex des autres utilisateurs.",
|
|
||||||
"components.RequestBlock.approve": "Approuver la demande",
|
"components.RequestBlock.approve": "Approuver la demande",
|
||||||
"components.RequestBlock.decline": "Refuser la demande",
|
"components.RequestBlock.decline": "Refuser la demande",
|
||||||
"components.RequestBlock.delete": "Supprimer la demande",
|
"components.RequestBlock.delete": "Supprimer la demande",
|
||||||
@@ -1208,14 +1192,12 @@
|
|||||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Un problème est survenu lors de la génération de la nouvelle clé d'API.",
|
"components.Settings.SettingsMain.toastApiKeyFailure": "Un problème est survenu lors de la génération de la nouvelle clé d'API.",
|
||||||
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "L'URL ne doit pas se terminer par une barre oblique",
|
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "L'URL ne doit pas se terminer par une barre oblique",
|
||||||
"components.Settings.SettingsJobsCache.imagecachesize": "Taille totale du cache",
|
"components.Settings.SettingsJobsCache.imagecachesize": "Taille totale du cache",
|
||||||
"components.Settings.SettingsJobsCache.jellyfin-full-sync": "Scan complet de la bibliothèque Jellyfin",
|
|
||||||
"components.Settings.SettingsJobsCache.jellyfin-recently-added-sync": "Scan des ajouts récents Jellyfin",
|
|
||||||
"components.Settings.SettingsMain.apikey": "Clé d'API",
|
"components.Settings.SettingsMain.apikey": "Clé d'API",
|
||||||
"components.Settings.SettingsMain.applicationTitle": "Nom de l'application",
|
"components.Settings.SettingsMain.applicationTitle": "Nom de l'application",
|
||||||
"components.Settings.SettingsMain.applicationurl": "URL de l'application",
|
"components.Settings.SettingsMain.applicationurl": "URL de l'application",
|
||||||
"components.Settings.SettingsMain.cacheImages": "Activer la mise en cache d'image",
|
"components.Settings.SettingsMain.cacheImages": "Activer la mise en cache d'image",
|
||||||
"components.Settings.SettingsMain.cacheImagesTip": "Met en cache localement et utilise des images optimisées (nécessite une quantité considérable d'espace disque)",
|
"components.Settings.SettingsMain.cacheImagesTip": "Met en cache localement et utilise des images optimisées (nécessite une quantité considérable d'espace disque)",
|
||||||
"components.Settings.SettingsMain.csrfProtectionTip": "Définir l'accès à l'API externe en lecture seule (nécessite HTTPS)",
|
"components.Settings.SettingsMain.csrfProtectionTip": "Mettre l'accès à l'API externe en lecture seule (nécessite HTTPS)",
|
||||||
"components.Settings.SettingsMain.general": "Général",
|
"components.Settings.SettingsMain.general": "Général",
|
||||||
"components.Settings.SettingsMain.generalsettings": "Paramètres généraux",
|
"components.Settings.SettingsMain.generalsettings": "Paramètres généraux",
|
||||||
"components.Settings.SettingsMain.toastSettingsSuccess": "Paramètres sauvegardés avec succès !",
|
"components.Settings.SettingsMain.toastSettingsSuccess": "Paramètres sauvegardés avec succès !",
|
||||||
@@ -1235,10 +1217,8 @@
|
|||||||
"components.Selector.searchStudios": "Recherchez un ou plusieurs studios…",
|
"components.Selector.searchStudios": "Recherchez un ou plusieurs studios…",
|
||||||
"components.Settings.SettingsMain.generalsettingsDescription": "Configurer les paramètres généraux et par défaut pour Jellyseerr.",
|
"components.Settings.SettingsMain.generalsettingsDescription": "Configurer les paramètres généraux et par défaut pour Jellyseerr.",
|
||||||
"components.Settings.SettingsMain.originallanguage": "Langue à découvrir",
|
"components.Settings.SettingsMain.originallanguage": "Langue à découvrir",
|
||||||
"components.Settings.SettingsMain.region": "Région à découvrir",
|
|
||||||
"components.Settings.SettingsMain.regionTip": "Filtrer le contenu par disponibilité régionale",
|
|
||||||
"components.Settings.SettingsMain.trustProxy": "Activer la prise en charge proxy",
|
"components.Settings.SettingsMain.trustProxy": "Activer la prise en charge proxy",
|
||||||
"components.Settings.SettingsMain.trustProxyTip": "Permettre Jellyseerr à enregistrer correctement les adresses IP des clients derrière un proxy",
|
"components.Settings.SettingsMain.trustProxyTip": "Permettre à Jellyseerr d'enregistrer correctement les adresses IP des clients derrière un proxy",
|
||||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Permettre les demandes partielles des séries",
|
"components.Settings.SettingsMain.partialRequestsEnabled": "Permettre les demandes partielles des séries",
|
||||||
"components.Selector.nooptions": "Aucun résultat.",
|
"components.Selector.nooptions": "Aucun résultat.",
|
||||||
"components.Layout.Sidebar.browsetv": "Séries",
|
"components.Layout.Sidebar.browsetv": "Séries",
|
||||||
@@ -1258,7 +1238,7 @@
|
|||||||
"components.Settings.jellyfinSettingsFailure": "Une erreur est survenue lors de l'enregistrement des paramètres pour {mediaServerName}.",
|
"components.Settings.jellyfinSettingsFailure": "Une erreur est survenue lors de l'enregistrement des paramètres pour {mediaServerName}.",
|
||||||
"components.Settings.jellyfinSettingsSuccess": "Les paramètres pour {mediaServerName} ont été enregistrés avec succès !",
|
"components.Settings.jellyfinSettingsSuccess": "Les paramètres pour {mediaServerName} ont été enregistrés avec succès !",
|
||||||
"components.Settings.jellyfinlibraries": "Bibliothèques {mediaServerName}",
|
"components.Settings.jellyfinlibraries": "Bibliothèques {mediaServerName}",
|
||||||
"components.Settings.jellyfinlibrariesDescription": "Les bibliothèques de {mediaServerName} sont en cours d'analyze. Cliquez sur le bouton ci-dessous si aucune bibliothèque n'est répertoriée.",
|
"components.Settings.jellyfinlibrariesDescription": "Les bibliothèques de {mediaServerName} sont en cours d'analyse. Cliquez sur le bouton ci-dessous si aucune bibliothèque n'est répertoriée.",
|
||||||
"components.Settings.jellyfinsettings": "Paramètres pour {mediaServerName}",
|
"components.Settings.jellyfinsettings": "Paramètres pour {mediaServerName}",
|
||||||
"components.Settings.manualscanJellyfin": "Analyse manuelle de la bibliothèque",
|
"components.Settings.manualscanJellyfin": "Analyse manuelle de la bibliothèque",
|
||||||
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
||||||
@@ -1266,7 +1246,7 @@
|
|||||||
"components.Settings.saving": "Sauvegarde en cours…",
|
"components.Settings.saving": "Sauvegarde en cours…",
|
||||||
"components.Settings.syncing": "Synchronisation en cours",
|
"components.Settings.syncing": "Synchronisation en cours",
|
||||||
"components.Setup.signin": "Se connecter",
|
"components.Setup.signin": "Se connecter",
|
||||||
"components.Setup.signinWithPlex": "Utilisez votre compte Plex",
|
"components.Setup.signinWithPlex": "Renseigner vos informations d'identification de Plex",
|
||||||
"components.StatusBadge.managemedia": "Gérer {mediaType}",
|
"components.StatusBadge.managemedia": "Gérer {mediaType}",
|
||||||
"components.StatusBadge.openinarr": "Ouvrir dans {arr}",
|
"components.StatusBadge.openinarr": "Ouvrir dans {arr}",
|
||||||
"components.StatusBadge.playonplex": "Lire sur {mediaServerName}",
|
"components.StatusBadge.playonplex": "Lire sur {mediaServerName}",
|
||||||
@@ -1300,15 +1280,14 @@
|
|||||||
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scan des ajouts récents aux bibliothèques Jellyfin",
|
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scan des ajouts récents aux bibliothèques Jellyfin",
|
||||||
"components.Settings.SonarrModal.animeSeriesType": "Type de série anime",
|
"components.Settings.SonarrModal.animeSeriesType": "Type de série anime",
|
||||||
"components.Settings.SonarrModal.seriesType": "Type de série",
|
"components.Settings.SonarrModal.seriesType": "Type de série",
|
||||||
"components.Settings.internalUrl": "URL interne",
|
|
||||||
"components.Settings.jellyfinsettingsDescription": "Configurez les paramètres de votre serveur {mediaServerName}. {mediaServerName} analyse vos bibliothèques {mediaServerName} pour voir quel contenu est disponible.",
|
"components.Settings.jellyfinsettingsDescription": "Configurez les paramètres de votre serveur {mediaServerName}. {mediaServerName} analyse vos bibliothèques {mediaServerName} pour voir quel contenu est disponible.",
|
||||||
"components.Settings.jellyfinSettingsDescription": "Configurez facultativement les URL internes et externes pour votre serveur {mediaServerName}. Dans la plupart des cas, l'URL externe est différente de l'URL interne. Vous pouvez également définir une URL de réinitialisation de mot de passe personnalisée pour la connexion à {mediaServerName}, au cas où vous souhaiteriez rediriger vers une page de réinitialisation de mot de passe différente.",
|
"components.Settings.jellyfinSettingsDescription": "Configurez facultativement les URL internes et externes pour votre serveur {mediaServerName}. Dans la plupart des cas, l'URL externe est différente de l'URL interne. Vous pouvez également définir une URL de réinitialisation de mot de passe personnalisée pour la connexion à {mediaServerName}, au cas où vous souhaiteriez rediriger vers une page de réinitialisation de mot de passe différente.",
|
||||||
"components.Settings.manualscanDescriptionJellyfin": "Normalement, cette tâche est executée qu'une fois toutes les 24 heures. Jellyseerr vérifiera plus agressivement les éléments récemment ajoutés à votre serveur {mediaServerName}. Si c'est la première fois que vous configurez Jellyseerr, une analyse complète manuelle de la bibliothèque est recommandée !",
|
"components.Settings.manualscanDescriptionJellyfin": "Normalement, cette tâche est executée qu'une fois toutes les 24 heures. Jellyseerr vérifiera plus agressivement les éléments récemment ajoutés à votre serveur {mediaServerName}. Si c'est la première fois que vous configurez Jellyseerr, une analyse complète manuelle de la bibliothèque est recommandée !",
|
||||||
"components.Settings.timeout": "Temps écoulé",
|
"components.Settings.timeout": "Temps écoulé",
|
||||||
"components.Setup.configuremediaserver": "Configurer le serveur multimédia",
|
"components.Setup.configuremediaserver": "Configurer le serveur multimédia",
|
||||||
"components.TvDetails.rtaudiencescore": "Score de l'audience sur Rotten Tomatoes",
|
"components.TvDetails.rtaudiencescore": "Score de l'audience sur Rotten Tomatoes",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "Utilisateur pour {mediaServerName}",
|
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "Utilisateur {mediaServerName}",
|
||||||
"components.Setup.signinWithJellyfin": "Utilisez votre compte {mediaServerName}",
|
"components.Setup.signinWithJellyfin": "Renseigner vos informations d'identification de Jellyfin",
|
||||||
"components.UserList.mediaServerUser": "Utilisateur de {mediaServerName}",
|
"components.UserList.mediaServerUser": "Utilisateur de {mediaServerName}",
|
||||||
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Épisode} other {# Épisodes}}",
|
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Épisode} other {# Épisodes}}",
|
||||||
"components.UserList.newJellyfinsigninenabled": "Le paramètre <strong>Activer la nouvelle connexion à {mediaServerName}</strong> est actuellement activé. Les utilisateurs de {mediaServerName} avec accès à la bibliothèque n'ont pas besoin d'être importés pour se connecter.",
|
"components.UserList.newJellyfinsigninenabled": "Le paramètre <strong>Activer la nouvelle connexion à {mediaServerName}</strong> est actuellement activé. Les utilisateurs de {mediaServerName} avec accès à la bibliothèque n'ont pas besoin d'être importés pour se connecter.",
|
||||||
@@ -1317,5 +1296,67 @@
|
|||||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Appareil par défaut",
|
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Appareil par défaut",
|
||||||
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} importé(s) avec succès !",
|
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} importé(s) avec succès !",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Son de notification",
|
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Son de notification",
|
||||||
"components.UserProfile.localWatchlist": "Watchlist de {username}"
|
"components.UserProfile.localWatchlist": "Liste de lecture de {username}",
|
||||||
|
"components.Login.invalidurlerror": "Impossible de se connecter au serveur {mediaServerName}.",
|
||||||
|
"components.MovieDetails.removefromwatchlist": "Supprimer de la liste de surveillance",
|
||||||
|
"components.Login.adminerror": "Vous devez utiliser un compte administrateur pour vous connecter.",
|
||||||
|
"components.MovieDetails.addtowatchlist": "Ajouter à la liste de surveillance",
|
||||||
|
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> Supprimé de la liste de surveillance avec succès!",
|
||||||
|
"components.Login.validationUrlBaseTrailingSlash": "L'URL de base ne doit pas se terminer par une barre oblique finale",
|
||||||
|
"components.RequestList.RequestItem.profileName": "Profil",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.validationemailformat": "Email valide requis",
|
||||||
|
"components.TvDetails.watchlistDeleted": "<strong>{title}</strong> Supprimé de la liste de surveillance avec succès!",
|
||||||
|
"components.TvDetails.addtowatchlist": "Ajouter à la liste de surveillance",
|
||||||
|
"components.Login.enablessl": "Utilise SSL",
|
||||||
|
"components.Login.hostname": "URL de {mediaServerName}",
|
||||||
|
"components.Login.port": "Port",
|
||||||
|
"components.Login.urlBase": "URL de base",
|
||||||
|
"components.Login.validationHostnameRequired": "Vous devez fournir un nom d'hôte ou une adresse IP valide",
|
||||||
|
"components.Login.validationPortRequired": "Vous devez fournir un numéro de port valide",
|
||||||
|
"components.Login.validationUrlBaseLeadingSlash": "L'URL de base doit avoir une barre oblique initiale",
|
||||||
|
"components.Login.validationUrlTrailingSlash": "L'URL ne doit pas se terminer par une barre oblique finale",
|
||||||
|
"components.MovieDetails.watchlistError": "Une erreur s'est produite, réessayez.",
|
||||||
|
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> a été ajouté à la liste de surveillance avec succès!",
|
||||||
|
"components.Settings.invalidurlerror": "Impossible de se connecter au serveur {mediaServerName}.",
|
||||||
|
"components.Settings.jellyfinForgotPasswordUrl": "URL de mot de passe oublié",
|
||||||
|
"components.Settings.jellyfinSyncFailedAutomaticGroupedFolders": "L'authentification personnalisée avec le regroupement automatique de bibliothèques n'est pas prise en charge",
|
||||||
|
"components.Settings.jellyfinSyncFailedGenericError": "Une erreur s'est produite lors de la synchronisation des bibliothèques",
|
||||||
|
"components.Settings.jellyfinSyncFailedNoLibrariesFound": "Aucune bibliothèque n'a été trouvée",
|
||||||
|
"components.TvDetails.removefromwatchlist": "Supprimer de la liste de surveillance",
|
||||||
|
"components.TvDetails.watchlistError": "Une erreur s'est produite, réessayez.",
|
||||||
|
"components.TvDetails.watchlistSuccess": "<strong>{title}</strong> a été ajouté à la liste de surveillance avec succès!",
|
||||||
|
"components.UserList.username": "Nom d'utilisateur",
|
||||||
|
"components.UserList.validationUsername": "Vous devez fournir un nom d'utilisateur",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.validationemailrequired": "Email requis",
|
||||||
|
"components.Login.validationservertyperequired": "Merci de sélectionner un type de serveur",
|
||||||
|
"components.Setup.servertype": "Choisir le type de serveur",
|
||||||
|
"components.Login.back": "Retourner en arrière",
|
||||||
|
"components.Login.servertype": "Type de serveur",
|
||||||
|
"components.Selector.canceled": "Annulé(e)",
|
||||||
|
"components.Selector.ended": "Terminé(e)",
|
||||||
|
"components.Selector.inProduction": "En production",
|
||||||
|
"components.Selector.pilot": "Pilote",
|
||||||
|
"components.Selector.planned": "Planifié(e)",
|
||||||
|
"components.Selector.returningSeries": "Séries de retour",
|
||||||
|
"components.Selector.searchStatus": "Sélectionner statut...",
|
||||||
|
"components.Setup.back": "Retourner en arrière",
|
||||||
|
"components.Setup.configemby": "Configurer Emby",
|
||||||
|
"components.Setup.configjellyfin": "Configurer Jellyfin",
|
||||||
|
"components.Setup.configplex": "Configurer Plex",
|
||||||
|
"components.Setup.signinWithEmby": "Renseigner vos informations d'identification d'Emby",
|
||||||
|
"components.Setup.subtitle": "Commencez par choisir votre serveur multimédia",
|
||||||
|
"components.StatusBadge.seasonnumber": "S{seasonNumber}",
|
||||||
|
"components.Discover.FilterSlideover.status": "Statut",
|
||||||
|
"components.Blacklist.mediaType": "Type",
|
||||||
|
"components.Blacklist.mediaTmdbId": "tmdb Id",
|
||||||
|
"components.Blacklist.blacklistdate": "date",
|
||||||
|
"components.Blacklist.blacklistedby": "{date} par {user}",
|
||||||
|
"components.Blacklist.mediaName": "Nom",
|
||||||
|
"component.BlacklistBlock.blacklistdate": "Date de mise en liste noire",
|
||||||
|
"component.BlacklistBlock.blacklistedby": "Mis en liste noire par",
|
||||||
|
"component.BlacklistModal.blacklisting": "Ajout en liste noire",
|
||||||
|
"components.Blacklist.blacklistNotFoundError": "<strong>{title}</strong> n'est pas en liste noire.",
|
||||||
|
"components.Blacklist.blacklistSettingsDescription": "Gérer le contenu en liste noire",
|
||||||
|
"components.Blacklist.blacklistsettings": "Paramètres de la liste noire",
|
||||||
|
"components.Layout.Sidebar.blacklist": "Liste noir"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -228,7 +228,6 @@
|
|||||||
"components.Layout.UserWarnings.passwordRequired": "דרושה סיסמה.",
|
"components.Layout.UserWarnings.passwordRequired": "דרושה סיסמה.",
|
||||||
"components.Login.credentialerror": "שם המשתמש או הסיסמה שגויים.",
|
"components.Login.credentialerror": "שם המשתמש או הסיסמה שגויים.",
|
||||||
"components.Login.description": "בהתחברות ראשונית ל-{applicationName}, יש להוסיף כתובת מייל.",
|
"components.Login.description": "בהתחברות ראשונית ל-{applicationName}, יש להוסיף כתובת מייל.",
|
||||||
"components.Login.host": "קישור {mediaServerName}",
|
|
||||||
"components.Login.initialsignin": "חיבור",
|
"components.Login.initialsignin": "חיבור",
|
||||||
"components.Login.initialsigningin": "מתחבר…",
|
"components.Login.initialsigningin": "מתחבר…",
|
||||||
"components.Login.save": "הוספה",
|
"components.Login.save": "הוספה",
|
||||||
|
|||||||
@@ -60,7 +60,6 @@
|
|||||||
"components.UserList.usercreatedfailedexisting": "प्रदान किया गया ईमेल पता पहले से ही किसी अन्य उपयोगकर्ता द्वारा उपयोग में है।",
|
"components.UserList.usercreatedfailedexisting": "प्रदान किया गया ईमेल पता पहले से ही किसी अन्य उपयोगकर्ता द्वारा उपयोग में है।",
|
||||||
"components.UserList.usercreatedsuccess": "उपयोगकर्ता सफलतापूर्वक बनाया गया!",
|
"components.UserList.usercreatedsuccess": "उपयोगकर्ता सफलतापूर्वक बनाया गया!",
|
||||||
"components.UserList.userfail": "उपयोगकर्ता अनुमतियां सहेजते समय कोई गड़बड़ी हुई.",
|
"components.UserList.userfail": "उपयोगकर्ता अनुमतियां सहेजते समय कोई गड़बड़ी हुई.",
|
||||||
"components.UserList.displayName": "प्रदर्शित होने वाला नाम",
|
|
||||||
"components.UserProfile.ProfileHeader.profile": "प्रोफ़ाइल देखें",
|
"components.UserProfile.ProfileHeader.profile": "प्रोफ़ाइल देखें",
|
||||||
"components.UserProfile.ProfileHeader.settings": "सेटिंग्स बदलें",
|
"components.UserProfile.ProfileHeader.settings": "सेटिंग्स बदलें",
|
||||||
"components.Discover.DiscoverTvGenre.genreSeries": "{genre} शृंखला",
|
"components.Discover.DiscoverTvGenre.genreSeries": "{genre} शृंखला",
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
"components.Discover.DiscoverNetwork.networkSeries": "{network} Serije",
|
"components.Discover.DiscoverNetwork.networkSeries": "{network} Serije",
|
||||||
"components.Discover.DiscoverStudio.studioMovies": "{studio} Filmovi",
|
"components.Discover.DiscoverStudio.studioMovies": "{studio} Filmovi",
|
||||||
"components.Discover.discover": "Otkrivanje",
|
"components.Discover.discover": "Otkrivanje",
|
||||||
"components.Discover.discovermovies": "Popularni Filmovi",
|
|
||||||
"components.Discover.discovertv": "Popularne Serije",
|
|
||||||
"components.Discover.DiscoverTvGenre.genreSeries": "{genre} Serije",
|
"components.Discover.DiscoverTvGenre.genreSeries": "{genre} Serije",
|
||||||
"components.Discover.DiscoverTvLanguage.languageSeries": "{language} Serije",
|
"components.Discover.DiscoverTvLanguage.languageSeries": "{language} Serije",
|
||||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Vaš Plex popis za gledanje",
|
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Vaš Plex popis za gledanje",
|
||||||
@@ -97,7 +95,6 @@
|
|||||||
"components.ManageSlideOver.tvshow": "serije",
|
"components.ManageSlideOver.tvshow": "serije",
|
||||||
"components.MovieDetails.productioncountries": "{countryCount, plural, one {Zemlja produkcije} few {Zemlje produkcije} other {Zemlje produkcije}}",
|
"components.MovieDetails.productioncountries": "{countryCount, plural, one {Zemlja produkcije} few {Zemlje produkcije} other {Zemlje produkcije}}",
|
||||||
"components.MovieDetails.managemovie": "Upravljaj filmom",
|
"components.MovieDetails.managemovie": "Upravljaj filmom",
|
||||||
"components.MovieDetails.playonplex": "Reproduciraj na {mediaServerName}u",
|
|
||||||
"components.MovieDetails.overviewunavailable": "Pregled nedostupan.",
|
"components.MovieDetails.overviewunavailable": "Pregled nedostupan.",
|
||||||
"components.MovieDetails.reportissue": "Prijavi problem",
|
"components.MovieDetails.reportissue": "Prijavi problem",
|
||||||
"components.MovieDetails.revenue": "Prihod",
|
"components.MovieDetails.revenue": "Prihod",
|
||||||
@@ -188,7 +185,6 @@
|
|||||||
"components.MovieDetails.originallanguage": "Izvorni jezik",
|
"components.MovieDetails.originallanguage": "Izvorni jezik",
|
||||||
"components.MovieDetails.MovieCrew.fullcrew": "Filmska postava",
|
"components.MovieDetails.MovieCrew.fullcrew": "Filmska postava",
|
||||||
"components.MovieDetails.physicalrelease": "Fizičko izdanje",
|
"components.MovieDetails.physicalrelease": "Fizičko izdanje",
|
||||||
"components.MovieDetails.play4konplex": "Reproduciraj u 4K rezoluciji na Plexu",
|
|
||||||
"components.MovieDetails.recommendations": "Preporuke",
|
"components.MovieDetails.recommendations": "Preporuke",
|
||||||
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Datum Izlaska} other {Datumi izlaska}}",
|
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Datum Izlaska} other {Datumi izlaska}}",
|
||||||
"components.MovieDetails.rtcriticsscore": "Rotten Tomatoes Tomatometer",
|
"components.MovieDetails.rtcriticsscore": "Rotten Tomatoes Tomatometer",
|
||||||
@@ -403,10 +399,8 @@
|
|||||||
"components.Settings.webpush": "Web Push",
|
"components.Settings.webpush": "Web Push",
|
||||||
"components.Setup.continue": "Nastaviti",
|
"components.Setup.continue": "Nastaviti",
|
||||||
"components.Setup.finish": "Završi postavljanje",
|
"components.Setup.finish": "Završi postavljanje",
|
||||||
"components.Setup.tip": "Savjet",
|
|
||||||
"components.Setup.welcome": "Jellyseerr dobrodošlica",
|
"components.Setup.welcome": "Jellyseerr dobrodošlica",
|
||||||
"components.Setup.finishing": "Završavanje…",
|
"components.Setup.finishing": "Završavanje…",
|
||||||
"components.Setup.loginwithplex": "Prijavi se s Plexom",
|
|
||||||
"components.Setup.setup": "Postavljanje",
|
"components.Setup.setup": "Postavljanje",
|
||||||
"components.Setup.signinMessage": "Za postavljanje se prijavi s tvojim Plex računom",
|
"components.Setup.signinMessage": "Za postavljanje se prijavi s tvojim Plex računom",
|
||||||
"components.StatusBadge.managemedia": "Upravljaj {mediaType}",
|
"components.StatusBadge.managemedia": "Upravljaj {mediaType}",
|
||||||
@@ -578,7 +572,6 @@
|
|||||||
"components.RequestModal.AdvancedRequester.tags": "Oznake",
|
"components.RequestModal.AdvancedRequester.tags": "Oznake",
|
||||||
"components.RequestModal.QuotaDisplay.movie": "film",
|
"components.RequestModal.QuotaDisplay.movie": "film",
|
||||||
"components.RequestModal.errorediting": "Dogodila se greška prilikom uređivanja zahtjeva.",
|
"components.RequestModal.errorediting": "Dogodila se greška prilikom uređivanja zahtjeva.",
|
||||||
"components.RequestModal.extras": "Dodaci",
|
|
||||||
"components.RequestModal.numberofepisodes": "Broj epizoda",
|
"components.RequestModal.numberofepisodes": "Broj epizoda",
|
||||||
"components.RequestModal.pending4krequest": "4K zahtjevi na čekanju",
|
"components.RequestModal.pending4krequest": "4K zahtjevi na čekanju",
|
||||||
"components.RequestModal.pendingapproval": "Tvoj zahtjev čeka na odobrenje.",
|
"components.RequestModal.pendingapproval": "Tvoj zahtjev čeka na odobrenje.",
|
||||||
@@ -724,7 +717,6 @@
|
|||||||
"components.TvDetails.seasonnumber": "Sezona {seasonNumber}",
|
"components.TvDetails.seasonnumber": "Sezona {seasonNumber}",
|
||||||
"components.UserList.createlocaluser": "Stvori lokalnog korisnika",
|
"components.UserList.createlocaluser": "Stvori lokalnog korisnika",
|
||||||
"components.UserList.deleteuser": "Izbriši korisnika",
|
"components.UserList.deleteuser": "Izbriši korisnika",
|
||||||
"components.UserList.displayName": "Prikazano ime",
|
|
||||||
"components.UserList.importfromplexerror": "Dogodila se greška prilikom uvoza Plex korisnika.",
|
"components.UserList.importfromplexerror": "Dogodila se greška prilikom uvoza Plex korisnika.",
|
||||||
"components.UserList.localLoginDisabled": "Postavka <strong>Aktiviraj lokalnu prijavu</strong> je trenutačno deaktivirana.",
|
"components.UserList.localLoginDisabled": "Postavka <strong>Aktiviraj lokalnu prijavu</strong> je trenutačno deaktivirana.",
|
||||||
"components.UserList.nouserstoimport": "Nema Plex korisnika za uvoz.",
|
"components.UserList.nouserstoimport": "Nema Plex korisnika za uvoz.",
|
||||||
@@ -932,7 +924,6 @@
|
|||||||
"components.Settings.validationUrlTrailingSlash": "URL ne smije završiti s kosom crtom",
|
"components.Settings.validationUrlTrailingSlash": "URL ne smije završiti s kosom crtom",
|
||||||
"components.Settings.webAppUrl": "URL <WebAppLink>web programa</WebAppLink>",
|
"components.Settings.webAppUrl": "URL <WebAppLink>web programa</WebAppLink>",
|
||||||
"components.Settings.webhook": "Webhook",
|
"components.Settings.webhook": "Webhook",
|
||||||
"components.Setup.configureplex": "Konfiguriraj Plex",
|
|
||||||
"components.Setup.configureservices": "Konfiguriraj usluge",
|
"components.Setup.configureservices": "Konfiguriraj usluge",
|
||||||
"components.StatusChecker.reloadApp": "Ponovo pokreni {applicationTitle}",
|
"components.StatusChecker.reloadApp": "Ponovo pokreni {applicationTitle}",
|
||||||
"components.StatusChecker.restartRequired": "Zahtijeva ponovno pokretanje poslužitelja",
|
"components.StatusChecker.restartRequired": "Zahtijeva ponovno pokretanje poslužitelja",
|
||||||
@@ -950,8 +941,6 @@
|
|||||||
"components.TvDetails.originaltitle": "Izvorni naslov",
|
"components.TvDetails.originaltitle": "Izvorni naslov",
|
||||||
"components.TvDetails.overview": "Pregled",
|
"components.TvDetails.overview": "Pregled",
|
||||||
"components.TvDetails.overviewunavailable": "Pregled nedostupan.",
|
"components.TvDetails.overviewunavailable": "Pregled nedostupan.",
|
||||||
"components.TvDetails.play4konplex": "Reproduciraj u 4K rezoluciji na Plexu",
|
|
||||||
"components.TvDetails.playonplex": "Reproduciraj na Plexu",
|
|
||||||
"components.TvDetails.productioncountries": "{countryCount, plural, one {zemlja produkcije} few {zemlje produkcije} other {zemalja produkcije}}",
|
"components.TvDetails.productioncountries": "{countryCount, plural, one {zemlja produkcije} few {zemlje produkcije} other {zemalja produkcije}}",
|
||||||
"components.TvDetails.recommendations": "Preporuke",
|
"components.TvDetails.recommendations": "Preporuke",
|
||||||
"components.TvDetails.reportissue": "Prijavi problem",
|
"components.TvDetails.reportissue": "Prijavi problem",
|
||||||
@@ -1081,7 +1070,6 @@
|
|||||||
"components.Settings.manualscanDescription": "Obično će se to pokrenuti samo jednom svaka 24 sata. Jellyseerr će agresivnije provjeriti tvoj Plex poslužitelj za nedavno dodanim. Ako po prvi put konfiguriraš Plex, preporučuje se jednom ručno pretražiti cijelu biblioteku!",
|
"components.Settings.manualscanDescription": "Obično će se to pokrenuti samo jednom svaka 24 sata. Jellyseerr će agresivnije provjeriti tvoj Plex poslužitelj za nedavno dodanim. Ako po prvi put konfiguriraš Plex, preporučuje se jednom ručno pretražiti cijelu biblioteku!",
|
||||||
"components.Settings.plexlibrariesDescription": "Biblioteke u kojima će Jellyseerr tražiti naslove. Postavi i spremi tvoje postavke Plex veze, a zatim pritisni gumb ispod ako je popis biblioteka prazan.",
|
"components.Settings.plexlibrariesDescription": "Biblioteke u kojima će Jellyseerr tražiti naslove. Postavi i spremi tvoje postavke Plex veze, a zatim pritisni gumb ispod ako je popis biblioteka prazan.",
|
||||||
"components.Settings.startscan": "Pokreni pretraživanje",
|
"components.Settings.startscan": "Pokreni pretraživanje",
|
||||||
"components.Setup.scanbackground": "Pretraživanje se pokreće u pozadini. U međuvremenu možeš nastaviti s postupkom postavljanja.",
|
|
||||||
"components.PermissionEdit.managerequestsDescription": "Dozvoli upravljanje zahtjevima za medije. Svi zahtjevi korisnika s ovom dozvolom će se automatski odobriti.",
|
"components.PermissionEdit.managerequestsDescription": "Dozvoli upravljanje zahtjevima za medije. Svi zahtjevi korisnika s ovom dozvolom će se automatski odobriti.",
|
||||||
"components.Settings.Notifications.NotificationsWebhook.customJson": "JSON sadržaj",
|
"components.Settings.Notifications.NotificationsWebhook.customJson": "JSON sadržaj",
|
||||||
"components.Settings.SettingsJobsCache.plex-full-scan": "Pretraživanje cijele Plex biblioteke",
|
"components.Settings.SettingsJobsCache.plex-full-scan": "Pretraživanje cijele Plex biblioteke",
|
||||||
@@ -1214,9 +1202,7 @@
|
|||||||
"components.Settings.SettingsMain.general": "Opće",
|
"components.Settings.SettingsMain.general": "Opće",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Zvuk obavijesti",
|
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Zvuk obavijesti",
|
||||||
"components.Discover.resettodefault": "Resetiraj na zadane vrijednosti",
|
"components.Discover.resettodefault": "Resetiraj na zadane vrijednosti",
|
||||||
"components.Settings.SettingsMain.regionTip": "Filtriraj sadržaj prema regionalnoj dostupnosti",
|
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Zadane postavke uređaja",
|
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Zadane postavke uređaja",
|
||||||
"components.Settings.SettingsMain.region": "Regionalno otkrivanje",
|
|
||||||
"components.Settings.SettingsMain.trustProxy": "Aktiviraj proxy podršku",
|
"components.Settings.SettingsMain.trustProxy": "Aktiviraj proxy podršku",
|
||||||
"components.Settings.SettingsMain.toastSettingsSuccess": "Postavke su uspješno spremljene!",
|
"components.Settings.SettingsMain.toastSettingsSuccess": "Postavke su uspješno spremljene!",
|
||||||
"i18n.collection": "Zbirka",
|
"i18n.collection": "Zbirka",
|
||||||
|
|||||||
@@ -86,8 +86,6 @@
|
|||||||
"components.Discover.recentlyAdded": "Nemrég hozzáadva",
|
"components.Discover.recentlyAdded": "Nemrég hozzáadva",
|
||||||
"components.Discover.populartv": "Népszerű sorozatok",
|
"components.Discover.populartv": "Népszerű sorozatok",
|
||||||
"components.Discover.popularmovies": "Népszerű filmek",
|
"components.Discover.popularmovies": "Népszerű filmek",
|
||||||
"components.Discover.discovertv": "Népszerű sorozatok",
|
|
||||||
"components.Discover.discovermovies": "Népszerű filmek",
|
|
||||||
"components.CollectionDetails.requestcollection": "Gyűjtemény kérése",
|
"components.CollectionDetails.requestcollection": "Gyűjtemény kérése",
|
||||||
"components.CollectionDetails.overview": "Áttekintés",
|
"components.CollectionDetails.overview": "Áttekintés",
|
||||||
"components.CollectionDetails.numberofmovies": "Filmek száma: {count}",
|
"components.CollectionDetails.numberofmovies": "Filmek száma: {count}",
|
||||||
@@ -100,14 +98,11 @@
|
|||||||
"components.RequestModal.requestcancelled": "Kérés a <strong>{title}</strong> törölve.",
|
"components.RequestModal.requestcancelled": "Kérés a <strong>{title}</strong> törölve.",
|
||||||
"components.RequestModal.requestadmin": "A kérésed azonnal el lesz fogadva.",
|
"components.RequestModal.requestadmin": "A kérésed azonnal el lesz fogadva.",
|
||||||
"components.RequestModal.numberofepisodes": "Epizódok száma",
|
"components.RequestModal.numberofepisodes": "Epizódok száma",
|
||||||
"components.RequestModal.extras": "Extrák",
|
|
||||||
"components.RequestModal.errorediting": "Hiba történt a kérés szerkesztése közben.",
|
"components.RequestModal.errorediting": "Hiba történt a kérés szerkesztése közben.",
|
||||||
"components.RequestModal.cancel": "Kérés visszavonása",
|
"components.RequestModal.cancel": "Kérés visszavonása",
|
||||||
"components.RequestModal.AdvancedRequester.rootfolder": "Root könyvtár",
|
"components.RequestModal.AdvancedRequester.rootfolder": "Root könyvtár",
|
||||||
"components.RequestModal.AdvancedRequester.qualityprofile": "Minőség profil",
|
"components.RequestModal.AdvancedRequester.qualityprofile": "Minőség profil",
|
||||||
"components.RequestModal.AdvancedRequester.destinationserver": "Cél szerver",
|
"components.RequestModal.AdvancedRequester.destinationserver": "Cél szerver",
|
||||||
"components.MovieDetails.playonplex": "Lejátszás Plex-en",
|
|
||||||
"components.MovieDetails.play4konplex": "4K lejátszás Plex-en",
|
|
||||||
"components.MovieDetails.markavailable": "Megjelölés elérhetőként",
|
"components.MovieDetails.markavailable": "Megjelölés elérhetőként",
|
||||||
"components.MovieDetails.mark4kavailable": "Megjelölés elérhetőként - 4K",
|
"components.MovieDetails.mark4kavailable": "Megjelölés elérhetőként - 4K",
|
||||||
"components.Layout.Sidebar.dashboard": "Felfedezés",
|
"components.Layout.Sidebar.dashboard": "Felfedezés",
|
||||||
@@ -179,8 +174,6 @@
|
|||||||
"components.TvDetails.similar": "Hasonló sorozatok",
|
"components.TvDetails.similar": "Hasonló sorozatok",
|
||||||
"components.TvDetails.showtype": "Sorozat típusa",
|
"components.TvDetails.showtype": "Sorozat típusa",
|
||||||
"components.TvDetails.recommendations": "Ajánlások",
|
"components.TvDetails.recommendations": "Ajánlások",
|
||||||
"components.TvDetails.playonplex": "Lejátszás Plex-en",
|
|
||||||
"components.TvDetails.play4konplex": "4K lejátszás Plex-en",
|
|
||||||
"components.TvDetails.overviewunavailable": "Áttekintés nem elérhető.",
|
"components.TvDetails.overviewunavailable": "Áttekintés nem elérhető.",
|
||||||
"components.TvDetails.overview": "Áttekintés",
|
"components.TvDetails.overview": "Áttekintés",
|
||||||
"components.TvDetails.originallanguage": "Eredeti nyelv",
|
"components.TvDetails.originallanguage": "Eredeti nyelv",
|
||||||
@@ -193,12 +186,10 @@
|
|||||||
"components.StatusBadge.status4k": "4K {status}",
|
"components.StatusBadge.status4k": "4K {status}",
|
||||||
"components.Setup.welcome": "Üdv az Jellyseerr-ben",
|
"components.Setup.welcome": "Üdv az Jellyseerr-ben",
|
||||||
"components.Setup.signinMessage": "Kezdésnek lépj be a Plex fiókoddal",
|
"components.Setup.signinMessage": "Kezdésnek lépj be a Plex fiókoddal",
|
||||||
"components.Setup.loginwithplex": "Bejelentkezés Plex fiókkal",
|
|
||||||
"components.Setup.finishing": "Befejezés…",
|
"components.Setup.finishing": "Befejezés…",
|
||||||
"components.Setup.finish": "Beállítás befejezése",
|
"components.Setup.finish": "Beállítás befejezése",
|
||||||
"components.Setup.continue": "Folytatás",
|
"components.Setup.continue": "Folytatás",
|
||||||
"components.Setup.configureservices": "Szolgáltatások beállítása",
|
"components.Setup.configureservices": "Szolgáltatások beállítása",
|
||||||
"components.Setup.configureplex": "Plex beállítása",
|
|
||||||
"components.RequestModal.requestfrom": "Jelenleg van egy folyamatban lévő kérés {username} felhasználótól.",
|
"components.RequestModal.requestfrom": "Jelenleg van egy folyamatban lévő kérés {username} felhasználótól.",
|
||||||
"components.RequestModal.requestseasons": "{seasonCount} évad kérése",
|
"components.RequestModal.requestseasons": "{seasonCount} évad kérése",
|
||||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> kérés elküldve!",
|
"components.RequestModal.requestSuccess": "<strong>{title}</strong> kérés elküldve!",
|
||||||
@@ -287,36 +278,24 @@
|
|||||||
"components.UserList.nouserstoimport": "Nincs importálható új felhasználó a Plexből.",
|
"components.UserList.nouserstoimport": "Nincs importálható új felhasználó a Plexből.",
|
||||||
"components.UserList.localLoginDisabled": "A <strong>Helyi bejelentkezés engedélyezése</strong> beállítás jelenleg le van tiltva.",
|
"components.UserList.localLoginDisabled": "A <strong>Helyi bejelentkezés engedélyezése</strong> beállítás jelenleg le van tiltva.",
|
||||||
"components.UserList.edituser": "Felhasználói engedélyek szerkesztése",
|
"components.UserList.edituser": "Felhasználói engedélyek szerkesztése",
|
||||||
"components.UserList.displayName": "Megjelenített név",
|
|
||||||
"components.UserList.autogeneratepasswordTip": "A szerver által generált jelszó elküldése e-mailben a felhasználónak",
|
"components.UserList.autogeneratepasswordTip": "A szerver által generált jelszó elküldése e-mailben a felhasználónak",
|
||||||
"components.UserList.accounttype": "Típus",
|
"components.UserList.accounttype": "Típus",
|
||||||
"components.TvDetails.originaltitle": "Eredeti cím",
|
"components.TvDetails.originaltitle": "Eredeti cím",
|
||||||
"components.TvDetails.nextAirDate": "Következő adás dátuma",
|
"components.TvDetails.nextAirDate": "Következő adás dátuma",
|
||||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} perc",
|
"components.TvDetails.episodeRuntimeMinutes": "{runtime} perc",
|
||||||
"components.Setup.tip": "Tipp",
|
|
||||||
"components.Setup.setup": "Beállítás",
|
"components.Setup.setup": "Beállítás",
|
||||||
"components.Setup.scanbackground": "A szkennelés a háttérben fut. Közben folytathatja a telepítési folyamatot.",
|
|
||||||
"components.Settings.webpush": "Web Push",
|
"components.Settings.webpush": "Web Push",
|
||||||
"components.Settings.webhook": "Webhook",
|
"components.Settings.webhook": "Webhook",
|
||||||
"components.Settings.webAppUrlTip": "Opcionálisan átirányíthatja a felhasználókat a szerveren lévő webes alkalmazáshoz a \"hosztolt\" webes alkalmazás helyett",
|
"components.Settings.webAppUrlTip": "Opcionálisan átirányíthatja a felhasználókat a szerveren lévő webes alkalmazáshoz a \"hosztolt\" webes alkalmazás helyett",
|
||||||
"components.Settings.webAppUrl": "<WebAppLink>Web App</WebAppLink> URL",
|
"components.Settings.webAppUrl": "<WebAppLink>Web App</WebAppLink> URL",
|
||||||
"components.Settings.validationPortRequired": "Érvényes portszámot kell megadnia",
|
"components.Settings.validationPortRequired": "Érvényes portszámot kell megadnia",
|
||||||
"components.Settings.validationHostnameRequired": "Érvényes host-nevet vagy IP-címet kell megadnia",
|
"components.Settings.validationHostnameRequired": "Érvényes host-nevet vagy IP-címet kell megadnia",
|
||||||
"components.Settings.validationApplicationUrlTrailingSlash": "Az URL-nek nem lehet vége perjellel",
|
|
||||||
"components.Settings.validationApplicationUrl": "Érvényes URL-t kell megadnia",
|
|
||||||
"components.Settings.validationApplicationTitle": "Meg kell adnia egy alkalmazás címet",
|
|
||||||
"components.Settings.trustProxyTip": "Lehetővé teszi az Jellyseerr számára, hogy helyesen regisztrálja az ügyfelek IP-címeit proxy mögött",
|
|
||||||
"components.Settings.trustProxy": "Proxy-támogatás engedélyezése",
|
|
||||||
"components.Settings.toastSettingsSuccess": "A beállítások sikeresen mentve!",
|
|
||||||
"components.Settings.toastSettingsFailure": "Valami elromlott a beállítások mentése közben.",
|
|
||||||
"components.Settings.toastPlexRefreshSuccess": "Plex szerverlista sikeresen lekérdezve!",
|
"components.Settings.toastPlexRefreshSuccess": "Plex szerverlista sikeresen lekérdezve!",
|
||||||
"components.Settings.toastPlexRefreshFailure": "Nem sikerült lekérni a Plex szerverek listáját.",
|
"components.Settings.toastPlexRefreshFailure": "Nem sikerült lekérni a Plex szerverek listáját.",
|
||||||
"components.Settings.toastPlexRefresh": "Szerverlista lekérése a Plexből…",
|
"components.Settings.toastPlexRefresh": "Szerverlista lekérése a Plexből…",
|
||||||
"components.Settings.toastPlexConnectingSuccess": "A Plex kapcsolat sikeresen létrejött!",
|
"components.Settings.toastPlexConnectingSuccess": "A Plex kapcsolat sikeresen létrejött!",
|
||||||
"components.Settings.toastPlexConnectingFailure": "Nem sikerült csatlakozni a Plexhez.",
|
"components.Settings.toastPlexConnectingFailure": "Nem sikerült csatlakozni a Plexhez.",
|
||||||
"components.Settings.toastPlexConnecting": "Csatlakozási kísérlet a Plexhez …",
|
"components.Settings.toastPlexConnecting": "Csatlakozási kísérlet a Plexhez …",
|
||||||
"components.Settings.toastApiKeySuccess": "Az új API kulcs sikeresen generálódott!",
|
|
||||||
"components.Settings.toastApiKeyFailure": "Valami hiba történt az új API-kulcs generálása során.",
|
|
||||||
"components.Settings.startscan": "Szkennelés indítása",
|
"components.Settings.startscan": "Szkennelés indítása",
|
||||||
"components.Settings.ssl": "SSL",
|
"components.Settings.ssl": "SSL",
|
||||||
"components.Settings.sonarrsettings": "Sonarr beállítások",
|
"components.Settings.sonarrsettings": "Sonarr beállítások",
|
||||||
@@ -332,8 +311,6 @@
|
|||||||
"components.Settings.serverLocal": "helyi",
|
"components.Settings.serverLocal": "helyi",
|
||||||
"components.Settings.scanning": "Szinkronizálás…",
|
"components.Settings.scanning": "Szinkronizálás…",
|
||||||
"components.Settings.scan": "Könyvtárak szinkronizálása",
|
"components.Settings.scan": "Könyvtárak szinkronizálása",
|
||||||
"components.Settings.regionTip": "A tartalom szűrése a regionális elérhetőség szerint",
|
|
||||||
"components.Settings.region": "Fedezzen fel régiót",
|
|
||||||
"components.Settings.radarrsettings": "Radarr beállítások",
|
"components.Settings.radarrsettings": "Radarr beállítások",
|
||||||
"components.Settings.port": "Port",
|
"components.Settings.port": "Port",
|
||||||
"components.Settings.plexsettingsDescription": "Konfigurálja a Plex szerver beállításait. Az Jellyseerr átvizsgálja a Plex könyvtárakat a tartalom elérhetőségének meghatározása érdekében.",
|
"components.Settings.plexsettingsDescription": "Konfigurálja a Plex szerver beállításait. Az Jellyseerr átvizsgálja a Plex könyvtárakat a tartalom elérhetőségének meghatározása érdekében.",
|
||||||
@@ -341,9 +318,6 @@
|
|||||||
"components.Settings.plexlibrariesDescription": "Az Jellyseerr könyvtár címeket keres. Állítsa be és mentse el a Plex kapcsolati beállításokat, majd kattintson az alábbi gombra, ha nincsenek könyvtárak.",
|
"components.Settings.plexlibrariesDescription": "Az Jellyseerr könyvtár címeket keres. Állítsa be és mentse el a Plex kapcsolati beállításokat, majd kattintson az alábbi gombra, ha nincsenek könyvtárak.",
|
||||||
"components.Settings.plexlibraries": "Plex könyvtárak",
|
"components.Settings.plexlibraries": "Plex könyvtárak",
|
||||||
"components.Settings.plex": "Plex",
|
"components.Settings.plex": "Plex",
|
||||||
"components.Settings.partialRequestsEnabled": "Részleges sorozatkérések engedélyezése",
|
|
||||||
"components.Settings.originallanguageTip": "Tartalom szűrése eredeti nyelv szerint",
|
|
||||||
"components.Settings.originallanguage": "Nyelv felfedezése",
|
|
||||||
"components.Settings.notrunning": "Nem fut",
|
"components.Settings.notrunning": "Nem fut",
|
||||||
"components.Settings.notificationsettings": "Értesítési beállítások",
|
"components.Settings.notificationsettings": "Értesítési beállítások",
|
||||||
"components.Settings.notifications": "Értesítések",
|
"components.Settings.notifications": "Értesítések",
|
||||||
@@ -363,29 +337,16 @@
|
|||||||
"components.Settings.mediaTypeMovie": "film",
|
"components.Settings.mediaTypeMovie": "film",
|
||||||
"components.Settings.manualscanDescription": "Normális esetben ez csak 24 óránként egyszer fut le. Az Jellyseerr agresszívebben ellenőrzi a Plex szerver \"nemrégiben hozzáadottakat\" könyvtárat. Ha ez az első alkalom a Plex konfigurálásában, egyszeri teljes kézi könyvtárellenőrzés ajánlott!",
|
"components.Settings.manualscanDescription": "Normális esetben ez csak 24 óránként egyszer fut le. Az Jellyseerr agresszívebben ellenőrzi a Plex szerver \"nemrégiben hozzáadottakat\" könyvtárat. Ha ez az első alkalom a Plex konfigurálásában, egyszeri teljes kézi könyvtárellenőrzés ajánlott!",
|
||||||
"components.Settings.manualscan": "Kézi könyvtári beolvasás",
|
"components.Settings.manualscan": "Kézi könyvtári beolvasás",
|
||||||
"components.Settings.locale": "Megjelenítési nyelv",
|
|
||||||
"components.Settings.librariesRemaining": "Fennmaradó könyvtárak: {count}",
|
"components.Settings.librariesRemaining": "Fennmaradó könyvtárak: {count}",
|
||||||
"components.Settings.is4k": "4K",
|
"components.Settings.is4k": "4K",
|
||||||
"components.Settings.hideAvailable": "Elérhető média elrejtése",
|
|
||||||
"components.Settings.generalsettingsDescription": "Az Jellyseerr globális és alapértelmezett beállításainak konfigurálása.",
|
|
||||||
"components.Settings.generalsettings": "Általános beállítások",
|
|
||||||
"components.Settings.general": "Általános",
|
|
||||||
"components.Settings.enablessl": "Használjon SSL-t",
|
"components.Settings.enablessl": "Használjon SSL-t",
|
||||||
"components.Settings.email": "E-mail-cím",
|
"components.Settings.email": "E-mail-cím",
|
||||||
"components.Settings.deleteserverconfirm": "Biztos, hogy törölni szeretné ezt a szervert?",
|
"components.Settings.deleteserverconfirm": "Biztos, hogy törölni szeretné ezt a szervert?",
|
||||||
"components.Settings.default4k": "Alapértelmezett 4K",
|
"components.Settings.default4k": "Alapértelmezett 4K",
|
||||||
"components.Settings.default": "Alapértelmezett",
|
"components.Settings.default": "Alapértelmezett",
|
||||||
"components.Settings.currentlibrary": "Jelenlegi könyvtár: {name}",
|
"components.Settings.currentlibrary": "Jelenlegi könyvtár: {name}",
|
||||||
"components.Settings.csrfProtectionTip": "Külső API-hozzáférés beállítása csak olvashatóra (HTTPS szükséges)",
|
|
||||||
"components.Settings.csrfProtectionHoverTip": "NE engedélyezze ezt a beállítást, csak ha megérti, mit csinál!",
|
|
||||||
"components.Settings.csrfProtection": "Engedélyezze a CSRF-védelmet",
|
|
||||||
"components.Settings.copied": "API-kulcs másolva a vágólapra.",
|
"components.Settings.copied": "API-kulcs másolva a vágólapra.",
|
||||||
"components.Settings.cancelscan": "Beolvasás megszakítása",
|
"components.Settings.cancelscan": "Beolvasás megszakítása",
|
||||||
"components.Settings.cacheImagesTip": "Optimalizálja és helyben tárolja az összes képet (jelentős mennyiségű lemezterületet fogyaszt)",
|
|
||||||
"components.Settings.cacheImages": "Képek gyorsítótárazásának engedélyezése",
|
|
||||||
"components.Settings.applicationurl": "Alkalmazás URL címe",
|
|
||||||
"components.Settings.applicationTitle": "Alkalmazás címe",
|
|
||||||
"components.Settings.apikey": "API kulcs",
|
|
||||||
"components.Settings.addsonarr": "Sonarr szerver hozzáadása",
|
"components.Settings.addsonarr": "Sonarr szerver hozzáadása",
|
||||||
"components.Settings.address": "Cím",
|
"components.Settings.address": "Cím",
|
||||||
"components.Settings.addradarr": "Radarr szerver hozzáadása",
|
"components.Settings.addradarr": "Radarr szerver hozzáadása",
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
"components.Discover.recentlyAdded": "Aggiunti di recente",
|
"components.Discover.recentlyAdded": "Aggiunti di recente",
|
||||||
"components.Discover.populartv": "Serie popolari",
|
"components.Discover.populartv": "Serie popolari",
|
||||||
"components.Discover.popularmovies": "Film popolari",
|
"components.Discover.popularmovies": "Film popolari",
|
||||||
"components.Discover.discovertv": "Serie popolari",
|
|
||||||
"components.Discover.discovermovies": "Film popolari",
|
|
||||||
"components.Settings.Notifications.emailsettingssaved": "Impostazioni delle notifiche via posta elettronica salvate con successo!",
|
"components.Settings.Notifications.emailsettingssaved": "Impostazioni delle notifiche via posta elettronica salvate con successo!",
|
||||||
"components.Settings.Notifications.emailsettingsfailed": "Impossibile salvare le impostazioni delle notifiche via posta elettronica.",
|
"components.Settings.Notifications.emailsettingsfailed": "Impossibile salvare le impostazioni delle notifiche via posta elettronica.",
|
||||||
"components.Settings.Notifications.emailsender": "Indirizzo del mittente",
|
"components.Settings.Notifications.emailsender": "Indirizzo del mittente",
|
||||||
@@ -25,7 +23,6 @@
|
|||||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> richiesto con successo!",
|
"components.RequestModal.requestSuccess": "<strong>{title}</strong> richiesto con successo!",
|
||||||
"components.RequestModal.requestCancel": "Richiesta per <strong>{title}</strong> eliminata.",
|
"components.RequestModal.requestCancel": "Richiesta per <strong>{title}</strong> eliminata.",
|
||||||
"components.RequestModal.numberofepisodes": "Nº di episodi",
|
"components.RequestModal.numberofepisodes": "Nº di episodi",
|
||||||
"components.RequestModal.extras": "Extra",
|
|
||||||
"components.RequestModal.cancel": "Cancella la richiesta",
|
"components.RequestModal.cancel": "Cancella la richiesta",
|
||||||
"components.RequestList.requests": "Richieste",
|
"components.RequestList.requests": "Richieste",
|
||||||
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Stagione} other {Stagioni}}",
|
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Stagione} other {Stagioni}}",
|
||||||
@@ -97,11 +94,8 @@
|
|||||||
"components.TvDetails.anime": "Anime",
|
"components.TvDetails.anime": "Anime",
|
||||||
"components.TvDetails.TvCast.fullseriescast": "Cast completo della serie",
|
"components.TvDetails.TvCast.fullseriescast": "Cast completo della serie",
|
||||||
"components.Setup.welcome": "Benvenuti in Jellyseerr",
|
"components.Setup.welcome": "Benvenuti in Jellyseerr",
|
||||||
"components.Setup.loginwithplex": "Accedi con Plex",
|
|
||||||
"components.Setup.configureplex": "Configurare Plex",
|
|
||||||
"components.Settings.validationPortRequired": "È necessario fornire un numero di porta valido",
|
"components.Settings.validationPortRequired": "È necessario fornire un numero di porta valido",
|
||||||
"components.Settings.validationHostnameRequired": "È necessario fornire un valido hostname o indirizzo IP",
|
"components.Settings.validationHostnameRequired": "È necessario fornire un valido hostname o indirizzo IP",
|
||||||
"components.Settings.toastSettingsSuccess": "Impostazioni salvate correttamente!",
|
|
||||||
"components.Settings.startscan": "Avvia la scansione",
|
"components.Settings.startscan": "Avvia la scansione",
|
||||||
"components.Settings.ssl": "SSL",
|
"components.Settings.ssl": "SSL",
|
||||||
"components.Settings.radarrsettings": "Impostazioni Radarr",
|
"components.Settings.radarrsettings": "Impostazioni Radarr",
|
||||||
@@ -117,16 +111,12 @@
|
|||||||
"components.Settings.manualscan": "Scansione manuale della libreria",
|
"components.Settings.manualscan": "Scansione manuale della libreria",
|
||||||
"components.Settings.librariesRemaining": "Biblioteche rimanenti: {count}",
|
"components.Settings.librariesRemaining": "Biblioteche rimanenti: {count}",
|
||||||
"components.Settings.hostname": "Hostname o indirizzo IP",
|
"components.Settings.hostname": "Hostname o indirizzo IP",
|
||||||
"components.Settings.generalsettingsDescription": "Configura le impostazioni globali e predefinite per Jellyseerr.",
|
|
||||||
"components.Settings.generalsettings": "Impostazioni Generali",
|
|
||||||
"components.Settings.deleteserverconfirm": "Sei sicuro/a di voler eliminare questo server?",
|
"components.Settings.deleteserverconfirm": "Sei sicuro/a di voler eliminare questo server?",
|
||||||
"components.Settings.default4k": "4K predefinito",
|
"components.Settings.default4k": "4K predefinito",
|
||||||
"components.Settings.default": "Predefinito",
|
"components.Settings.default": "Predefinito",
|
||||||
"components.Settings.currentlibrary": "Libreria corrente: {name}",
|
"components.Settings.currentlibrary": "Libreria corrente: {name}",
|
||||||
"components.Settings.copied": "Chiave API copiata negli appunti.",
|
"components.Settings.copied": "Chiave API copiata negli appunti.",
|
||||||
"components.Settings.cancelscan": "Annulla l'analisi",
|
"components.Settings.cancelscan": "Annulla l'analisi",
|
||||||
"components.Settings.applicationurl": "URL applicazione",
|
|
||||||
"components.Settings.apikey": "Chiave API",
|
|
||||||
"components.Settings.addsonarr": "Aggiungi un server Sonarr",
|
"components.Settings.addsonarr": "Aggiungi un server Sonarr",
|
||||||
"components.Settings.addradarr": "Aggiungi un server Radarr",
|
"components.Settings.addradarr": "Aggiungi un server Radarr",
|
||||||
"components.Settings.activeProfile": "Profilo attivo",
|
"components.Settings.activeProfile": "Profilo attivo",
|
||||||
@@ -157,7 +147,7 @@
|
|||||||
"components.Settings.SonarrModal.add": "Aggiungi un server",
|
"components.Settings.SonarrModal.add": "Aggiungi un server",
|
||||||
"components.Settings.SettingsAbout.totalrequests": "Totale richieste",
|
"components.Settings.SettingsAbout.totalrequests": "Totale richieste",
|
||||||
"components.Settings.SettingsAbout.totalmedia": "Media totali",
|
"components.Settings.SettingsAbout.totalmedia": "Media totali",
|
||||||
"components.Settings.SettingsAbout.overseerrinformation": "Info su Jellyseerr",
|
"components.Settings.SettingsAbout.overseerrinformation": "Informazioni su Jellyseerr",
|
||||||
"components.Settings.SettingsAbout.githubdiscussions": "Discussioni su GitHub",
|
"components.Settings.SettingsAbout.githubdiscussions": "Discussioni su GitHub",
|
||||||
"components.Settings.SettingsAbout.gettingsupport": "Ottieni aiuto",
|
"components.Settings.SettingsAbout.gettingsupport": "Ottieni aiuto",
|
||||||
"components.Settings.RadarrModal.validationRootFolderRequired": "È necessario selezionare una cartella principale",
|
"components.Settings.RadarrModal.validationRootFolderRequired": "È necessario selezionare una cartella principale",
|
||||||
@@ -197,18 +187,14 @@
|
|||||||
"components.Settings.menuJobs": "Processi & Cache",
|
"components.Settings.menuJobs": "Processi & Cache",
|
||||||
"components.Setup.signinMessage": "Comincia accedendo con il tuo account Plex",
|
"components.Setup.signinMessage": "Comincia accedendo con il tuo account Plex",
|
||||||
"components.Settings.sonarrsettings": "Impostazioni Sonarr",
|
"components.Settings.sonarrsettings": "Impostazioni Sonarr",
|
||||||
"components.Settings.plexsettingsDescription": "Configura le impostazioni del tuo server Plex. Jellyseerr scansiona Plex a intervalli regolari alla ricerca di nuovi contenuti.",
|
"components.Settings.plexsettingsDescription": "Configura le impostazioni per il tuo server Plex. Jellyseerr scansiona le tue librerie Plex per determinare la disponibilità dei contenuti.",
|
||||||
"components.Settings.plexlibrariesDescription": "Le librerie che Jellyseerr scansiona alla ricerca di titoli. Se non ci sono librerie, configura e salva le impostazioni di connessione a Plex e fai click sul pulsante qui sotto.",
|
"components.Settings.plexlibrariesDescription": "Le librerie che Jellyseerr scansiona per i titoli. Configura e salva le impostazioni di connessione Plex, quindi fai clic sul pulsante qui sotto se non sono elencate librerie.",
|
||||||
"components.Settings.plexlibraries": "Librerie Plex",
|
"components.Settings.plexlibraries": "Librerie Plex",
|
||||||
"components.Settings.manualscanDescription": "Normalmente, questo verrà eseguito ogni 24 ore. Jellyseerr controllerà in modo più aggressivo i server Plex aggiunti di recente. Se è la prima volta che configuri Plex, si consiglia una scansione manuale completa della libreria!",
|
"components.Settings.manualscanDescription": "Normalmente, questo verrà eseguito solo una volta ogni 24 ore. Jellyseerr controllerà il server Plex per i nuovi aggiunti in modo più aggressivo. Se è la prima volta che configuri Plex, si consiglia di eseguire una scansione manuale completa della libreria!",
|
||||||
"components.Settings.port": "Porta",
|
"components.Settings.port": "Porta",
|
||||||
"components.Settings.toastSettingsFailure": "Qualcosa è andato storto nel salvare le impostazioni.",
|
|
||||||
"components.Settings.toastApiKeySuccess": "Nuova chiave API generata correttamente!",
|
|
||||||
"components.Settings.toastApiKeyFailure": "Qualcosa è andato storto generando una nuova chiave API.",
|
|
||||||
"components.Setup.configureservices": "Configura i servizi",
|
"components.Setup.configureservices": "Configura i servizi",
|
||||||
"components.Setup.finish": "Termina la configurazione",
|
"components.Setup.finish": "Termina la configurazione",
|
||||||
"components.Setup.continue": "Continua",
|
"components.Setup.continue": "Continua",
|
||||||
"components.Setup.tip": "Consiglio",
|
|
||||||
"pages.returnHome": "Ritorna alla pagina iniziale",
|
"pages.returnHome": "Ritorna alla pagina iniziale",
|
||||||
"i18n.close": "Chiudi",
|
"i18n.close": "Chiudi",
|
||||||
"components.Settings.SettingsAbout.timezone": "Fuso Orario",
|
"components.Settings.SettingsAbout.timezone": "Fuso Orario",
|
||||||
@@ -311,7 +297,6 @@
|
|||||||
"i18n.experimental": "Sperimentale",
|
"i18n.experimental": "Sperimentale",
|
||||||
"i18n.edit": "Modifica",
|
"i18n.edit": "Modifica",
|
||||||
"components.StatusBadge.status4k": "4K {status}",
|
"components.StatusBadge.status4k": "4K {status}",
|
||||||
"components.Settings.hideAvailable": "Nascondi i media disponibili",
|
|
||||||
"components.Settings.Notifications.NotificationsWebhook.webhooksettingssaved": "Impostazioni di Webhook salvate con successo!",
|
"components.Settings.Notifications.NotificationsWebhook.webhooksettingssaved": "Impostazioni di Webhook salvate con successo!",
|
||||||
"components.Settings.Notifications.NotificationsWebhook.webhooksettingsfailed": "Impossibile salvare le impostazioni di Webhook.",
|
"components.Settings.Notifications.NotificationsWebhook.webhooksettingsfailed": "Impossibile salvare le impostazioni di Webhook.",
|
||||||
"components.Settings.Notifications.NotificationsWebhook.webhookUrl": "URL del webhook",
|
"components.Settings.Notifications.NotificationsWebhook.webhookUrl": "URL del webhook",
|
||||||
@@ -350,8 +335,6 @@
|
|||||||
"components.Login.signin": "Accedi",
|
"components.Login.signin": "Accedi",
|
||||||
"components.MovieDetails.markavailable": "Segna come disponibile",
|
"components.MovieDetails.markavailable": "Segna come disponibile",
|
||||||
"components.MovieDetails.mark4kavailable": "Segna come disponibile in 4K",
|
"components.MovieDetails.mark4kavailable": "Segna come disponibile in 4K",
|
||||||
"components.MovieDetails.playonplex": "Riproduci su Plex",
|
|
||||||
"components.MovieDetails.play4konplex": "Riproduci in 4K su Plex",
|
|
||||||
"components.Login.forgotpassword": "Password dimenticata?",
|
"components.Login.forgotpassword": "Password dimenticata?",
|
||||||
"components.Discover.discover": "Esplora",
|
"components.Discover.discover": "Esplora",
|
||||||
"components.AppDataWarning.dockerVolumeMissingDescription": "Il volume <code>{appDataPath}</code> non è configurato correttamente. Tutte le modifiche apportate saranno perse quando il container verrà interrotto o riavviato.",
|
"components.AppDataWarning.dockerVolumeMissingDescription": "Il volume <code>{appDataPath}</code> non è configurato correttamente. Tutte le modifiche apportate saranno perse quando il container verrà interrotto o riavviato.",
|
||||||
@@ -360,10 +343,6 @@
|
|||||||
"components.Settings.serverRemote": "remoto",
|
"components.Settings.serverRemote": "remoto",
|
||||||
"components.Settings.serverLocal": "locale",
|
"components.Settings.serverLocal": "locale",
|
||||||
"components.Settings.notificationAgentSettingsDescription": "Configura e abilita gli agenti di notifica.",
|
"components.Settings.notificationAgentSettingsDescription": "Configura e abilita gli agenti di notifica.",
|
||||||
"components.Settings.csrfProtectionTip": "Imposta l'accesso alle API esterne in sola lettura (richiede HTTPS)",
|
|
||||||
"components.Settings.csrfProtectionHoverTip": "NON abilitate questa opzione se non sapete cosa state facendo!",
|
|
||||||
"components.Settings.csrfProtection": "Abilita protezione CSRF",
|
|
||||||
"components.Settings.applicationTitle": "Titolo dell'applicazione",
|
|
||||||
"components.Settings.SonarrModal.validationLanguageProfileRequired": "È necessario selezionare un profilo lingua",
|
"components.Settings.SonarrModal.validationLanguageProfileRequired": "È necessario selezionare un profilo lingua",
|
||||||
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "L'URL di base non deve terminare con una barra obliqua",
|
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "L'URL di base non deve terminare con una barra obliqua",
|
||||||
"components.Settings.SonarrModal.validationBaseUrlLeadingSlash": "L'URL di base deve avere una barra obliqua",
|
"components.Settings.SonarrModal.validationBaseUrlLeadingSlash": "L'URL di base deve avere una barra obliqua",
|
||||||
@@ -383,7 +362,7 @@
|
|||||||
"components.Settings.SettingsJobsCache.nextexecution": "Prossima esecuzione",
|
"components.Settings.SettingsJobsCache.nextexecution": "Prossima esecuzione",
|
||||||
"components.Settings.SettingsJobsCache.jobtype": "Tipo",
|
"components.Settings.SettingsJobsCache.jobtype": "Tipo",
|
||||||
"components.Settings.SettingsJobsCache.jobstarted": "{jobname} avviato.",
|
"components.Settings.SettingsJobsCache.jobstarted": "{jobname} avviato.",
|
||||||
"components.Settings.SettingsJobsCache.jobsDescription": "Jellyseerr esegue determinate attività di manutenzione come processi pianificati regolarmente, ma possono anche essere avviate manualmente di seguito. L'esecuzione manuale di un processo non modifica la sua pianificazione.",
|
"components.Settings.SettingsJobsCache.jobsDescription": "Jellyseerr esegue alcune attività di manutenzione come lavori programmati regolarmente, ma possono anche essere attivati manualmente qui sotto. Eseguire manualmente un lavoro non altererà la sua programmazione.",
|
||||||
"components.Settings.SettingsJobsCache.jobs": "Processi",
|
"components.Settings.SettingsJobsCache.jobs": "Processi",
|
||||||
"components.Settings.SettingsJobsCache.jobname": "Nome processo",
|
"components.Settings.SettingsJobsCache.jobname": "Nome processo",
|
||||||
"components.Settings.SettingsJobsCache.jobcancelled": "{jobname} annullato.",
|
"components.Settings.SettingsJobsCache.jobcancelled": "{jobname} annullato.",
|
||||||
@@ -397,7 +376,7 @@
|
|||||||
"components.Settings.SettingsJobsCache.cachekeys": "Chiavi totali",
|
"components.Settings.SettingsJobsCache.cachekeys": "Chiavi totali",
|
||||||
"components.Settings.SettingsJobsCache.cachehits": "Chiamate",
|
"components.Settings.SettingsJobsCache.cachehits": "Chiamate",
|
||||||
"components.Settings.SettingsJobsCache.cacheflushed": "{cachename} cache svuotata.",
|
"components.Settings.SettingsJobsCache.cacheflushed": "{cachename} cache svuotata.",
|
||||||
"components.Settings.SettingsJobsCache.cacheDescription": "Jellyseerr mette in cache le richieste agli endpoint API esterni per ottimizzare le prestazioni ed evitare di fare chiamate API non necessarie.",
|
"components.Settings.SettingsJobsCache.cacheDescription": "Jellyseerr memorizza nella cache le richieste agli endpoint API esterni per ottimizzare le prestazioni e evitare chiamate API non necessarie.",
|
||||||
"components.Settings.SettingsJobsCache.cache": "Cache",
|
"components.Settings.SettingsJobsCache.cache": "Cache",
|
||||||
"components.Settings.SettingsAbout.preferredmethod": "Preferito",
|
"components.Settings.SettingsAbout.preferredmethod": "Preferito",
|
||||||
"components.Settings.RadarrModal.validationBaseUrlTrailingSlash": "L'URL di base non deve terminare con una barra obliqua",
|
"components.Settings.RadarrModal.validationBaseUrlTrailingSlash": "L'URL di base non deve terminare con una barra obliqua",
|
||||||
@@ -443,15 +422,9 @@
|
|||||||
"components.PermissionEdit.autoapproveDescription": "Concede l'approvazione automatica per tutte le richieste non in 4K.",
|
"components.PermissionEdit.autoapproveDescription": "Concede l'approvazione automatica per tutte le richieste non in 4K.",
|
||||||
"components.PermissionEdit.advancedrequestDescription": "Concede il permesso di modificare opzioni di richiesta avanzate.",
|
"components.PermissionEdit.advancedrequestDescription": "Concede il permesso di modificare opzioni di richiesta avanzate.",
|
||||||
"i18n.advanced": "Avanzato",
|
"i18n.advanced": "Avanzato",
|
||||||
"components.UserList.validationEmail": "Devi fornire un indirizzo e-mail valido",
|
"components.UserList.validationEmail": "Email richiesta",
|
||||||
"components.UserList.users": "Utenti",
|
"components.UserList.users": "Utenti",
|
||||||
"components.TvDetails.playonplex": "Riproduci su Plex",
|
|
||||||
"components.TvDetails.play4konplex": "Riproduci in 4K su Plex",
|
|
||||||
"components.Setup.setup": "Impostazione",
|
"components.Setup.setup": "Impostazione",
|
||||||
"components.Settings.validationApplicationUrlTrailingSlash": "L'URL non deve finire con una barra finale",
|
|
||||||
"components.Settings.validationApplicationUrl": "Devi fornire un URL valido",
|
|
||||||
"components.Settings.validationApplicationTitle": "È necessario fornire un titolo di applicazione",
|
|
||||||
"components.Settings.trustProxy": "Abilita il supporto proxy",
|
|
||||||
"components.Settings.toastPlexRefreshSuccess": "Elenco dei server Plex recuperato con successo!",
|
"components.Settings.toastPlexRefreshSuccess": "Elenco dei server Plex recuperato con successo!",
|
||||||
"components.Settings.toastPlexRefreshFailure": "Impossibile recuperare l'elenco dei server Plex.",
|
"components.Settings.toastPlexRefreshFailure": "Impossibile recuperare l'elenco dei server Plex.",
|
||||||
"components.Settings.toastPlexRefresh": "Recupero dell'elenco dei server da Plex…",
|
"components.Settings.toastPlexRefresh": "Recupero dell'elenco dei server da Plex…",
|
||||||
@@ -461,7 +434,6 @@
|
|||||||
"components.Settings.serverpresetRefreshing": "Recupero di server…",
|
"components.Settings.serverpresetRefreshing": "Recupero di server…",
|
||||||
"components.Settings.serverpresetManualMessage": "Configurazione manuale",
|
"components.Settings.serverpresetManualMessage": "Configurazione manuale",
|
||||||
"components.TvDetails.nextAirDate": "Prossima data di messa in onda",
|
"components.TvDetails.nextAirDate": "Prossima data di messa in onda",
|
||||||
"components.Settings.trustProxyTip": "Permette a Jellyseerr di registrare correttamente gli indirizzi IP dei client dietro un proxy",
|
|
||||||
"components.Settings.settingUpPlexDescription": "Per impostare Plex, potete inserire i dati manualmente o selezionare un server recuperato da <RegisterPlexTVLink>plex.tv</RegisterPlexTVLink>. Premi il pulsante a destra del menu a tendina per recuperare la lista di server disponibili.",
|
"components.Settings.settingUpPlexDescription": "Per impostare Plex, potete inserire i dati manualmente o selezionare un server recuperato da <RegisterPlexTVLink>plex.tv</RegisterPlexTVLink>. Premi il pulsante a destra del menu a tendina per recuperare la lista di server disponibili.",
|
||||||
"components.Settings.Notifications.sendSilentlyTip": "Invia notifiche senza suono",
|
"components.Settings.Notifications.sendSilentlyTip": "Invia notifiche senza suono",
|
||||||
"components.Settings.Notifications.sendSilently": "Invia silenziosamente",
|
"components.Settings.Notifications.sendSilently": "Invia silenziosamente",
|
||||||
@@ -518,14 +490,10 @@
|
|||||||
"components.UserProfile.UserSettings.UserGeneralSettings.region": "Regione da scoprire",
|
"components.UserProfile.UserSettings.UserGeneralSettings.region": "Regione da scoprire",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguage": "Lingua da scoprire",
|
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguage": "Lingua da scoprire",
|
||||||
"components.Settings.webhook": "Webhook",
|
"components.Settings.webhook": "Webhook",
|
||||||
"components.Settings.region": "Regione da scoprire",
|
|
||||||
"components.Settings.originallanguage": "Lingua da scoprire",
|
|
||||||
"components.Settings.email": "E-mail",
|
"components.Settings.email": "E-mail",
|
||||||
"components.RegionSelector.regionDefault": "Tutte le regioni",
|
"components.RegionSelector.regionDefault": "Tutte le regioni",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Filtra i contenuti per disponibilità regionale",
|
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Filtra i contenuti per disponibilità regionale",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguageTip": "Filtra i contenuti per lingua originale",
|
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguageTip": "Filtra i contenuti per lingua originale",
|
||||||
"components.Settings.regionTip": "Filtra i contenuti per disponibilità regionale",
|
|
||||||
"components.Settings.originallanguageTip": "Filtra i contenuti per lingua originale",
|
|
||||||
"components.Discover.upcomingtv": "Serie in uscita",
|
"components.Discover.upcomingtv": "Serie in uscita",
|
||||||
"components.RegionSelector.regionServerDefault": "Predefinito ({region})",
|
"components.RegionSelector.regionServerDefault": "Predefinito ({region})",
|
||||||
"components.UserProfile.UserSettings.UserPasswordChange.nopermissionDescription": "Non hai il permesso di modificare la password di questo utente.",
|
"components.UserProfile.UserSettings.UserPasswordChange.nopermissionDescription": "Non hai il permesso di modificare la password di questo utente.",
|
||||||
@@ -551,7 +519,6 @@
|
|||||||
"components.Settings.Notifications.botUsername": "Username del Bot",
|
"components.Settings.Notifications.botUsername": "Username del Bot",
|
||||||
"components.Discover.DiscoverTvGenre.genreSeries": "Serie di {genre}",
|
"components.Discover.DiscoverTvGenre.genreSeries": "Serie di {genre}",
|
||||||
"components.Discover.DiscoverStudio.studioMovies": "Film di {studio}",
|
"components.Discover.DiscoverStudio.studioMovies": "Film di {studio}",
|
||||||
"components.Setup.scanbackground": "La scansione verrà eseguita in background. Puoi continuare con l'installazione nel frattempo.",
|
|
||||||
"components.Settings.scanning": "Sincronizzazione…",
|
"components.Settings.scanning": "Sincronizzazione…",
|
||||||
"components.Settings.scan": "Sincronizza Librerie",
|
"components.Settings.scan": "Sincronizza Librerie",
|
||||||
"components.Settings.SettingsJobsCache.sonarr-scan": "Scansione Sonarr",
|
"components.Settings.SettingsJobsCache.sonarr-scan": "Scansione Sonarr",
|
||||||
@@ -588,7 +555,6 @@
|
|||||||
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "Non è possibile modificare le proprie autorizzazioni.",
|
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "Non è possibile modificare le proprie autorizzazioni.",
|
||||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minuti",
|
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minuti",
|
||||||
"components.TvDetails.episodeRuntime": "Durata di un episodio",
|
"components.TvDetails.episodeRuntime": "Durata di un episodio",
|
||||||
"components.Settings.partialRequestsEnabled": "Consente richieste di serie parziali",
|
|
||||||
"components.RequestModal.alreadyrequested": "Già richiesto",
|
"components.RequestModal.alreadyrequested": "Già richiesto",
|
||||||
"components.Discover.TvGenreList.seriesgenres": "Generi serie",
|
"components.Discover.TvGenreList.seriesgenres": "Generi serie",
|
||||||
"components.Discover.MovieGenreList.moviegenres": "Generi film",
|
"components.Discover.MovieGenreList.moviegenres": "Generi film",
|
||||||
@@ -606,9 +572,6 @@
|
|||||||
"components.Settings.services": "Servizi",
|
"components.Settings.services": "Servizi",
|
||||||
"components.Settings.plex": "Plex",
|
"components.Settings.plex": "Plex",
|
||||||
"components.Settings.notifications": "Notifiche",
|
"components.Settings.notifications": "Notifiche",
|
||||||
"components.Settings.general": "Generali",
|
|
||||||
"components.Settings.cacheImagesTip": "Ottimizza e archivia tutte le immagini localmente (consuma una notevole quantità di spazio su disco)",
|
|
||||||
"components.Settings.cacheImages": "Abilita la memorizzazione cache delle immagini",
|
|
||||||
"components.Settings.SettingsLogs.logs": "Registri",
|
"components.Settings.SettingsLogs.logs": "Registri",
|
||||||
"components.Settings.SettingsUsers.users": "Utenti",
|
"components.Settings.SettingsUsers.users": "Utenti",
|
||||||
"components.Settings.SettingsLogs.time": "Data e ora",
|
"components.Settings.SettingsLogs.time": "Data e ora",
|
||||||
@@ -724,7 +687,7 @@
|
|||||||
"components.RequestCard.mediaerror": "{mediaType} non trovato",
|
"components.RequestCard.mediaerror": "{mediaType} non trovato",
|
||||||
"components.RequestCard.deleterequest": "Elimina Richiesta",
|
"components.RequestCard.deleterequest": "Elimina Richiesta",
|
||||||
"components.NotificationTypeSelector.notificationTypes": "Tipi di Notifica",
|
"components.NotificationTypeSelector.notificationTypes": "Tipi di Notifica",
|
||||||
"components.Layout.VersionStatus.streamdevelop": "Jellyseerr Beta",
|
"components.Layout.VersionStatus.streamdevelop": "Sviluppo di Jellyseerr",
|
||||||
"components.Layout.VersionStatus.streamstable": "Jellyseerr Stabile",
|
"components.Layout.VersionStatus.streamstable": "Jellyseerr Stabile",
|
||||||
"i18n.retrying": "Nuovo tentativo in corso …",
|
"i18n.retrying": "Nuovo tentativo in corso …",
|
||||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Il tuo account attualmente non ha una password impostata. Configura una password qui sotto per abilitare l'accesso come \"utente locale\" usando il tuo indirizzo email.",
|
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Il tuo account attualmente non ha una password impostata. Configura una password qui sotto per abilitare l'accesso come \"utente locale\" usando il tuo indirizzo email.",
|
||||||
@@ -792,11 +755,11 @@
|
|||||||
"components.Settings.Notifications.encryptionDefault": "Usa STARTTLS se disponibile",
|
"components.Settings.Notifications.encryptionDefault": "Usa STARTTLS se disponibile",
|
||||||
"components.Settings.Notifications.encryption": "Metodo di crittografia",
|
"components.Settings.Notifications.encryption": "Metodo di crittografia",
|
||||||
"components.Settings.Notifications.chatIdTip": "Inizia una chat con il tuo bot, aggiungi <GetIdBotLink>@get_id_bot</GetIdBotLink>, ed emetti il comando <code>/my_id</code>",
|
"components.Settings.Notifications.chatIdTip": "Inizia una chat con il tuo bot, aggiungi <GetIdBotLink>@get_id_bot</GetIdBotLink>, ed emetti il comando <code>/my_id</code>",
|
||||||
"components.Settings.Notifications.botApiTip": "<CreateBotLink>Crea un bot</CreateBotLink> da usare con Jellyseerr",
|
"components.Settings.Notifications.botApiTip": "<CreateBotLink>Crea un bot</CreateBotLink> per l'uso con Jellyseerr",
|
||||||
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSuccess": "Notifica Webhook di prova inviata!",
|
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSuccess": "Notifica Webhook di prova inviata!",
|
||||||
"components.Settings.Notifications.NotificationsSlack.webhookUrlTip": "Crea un'integrazione <WebhookLink>Incoming Webhook</WebhookLink>",
|
"components.Settings.Notifications.NotificationsSlack.webhookUrlTip": "Crea un'integrazione <WebhookLink>Incoming Webhook</WebhookLink>",
|
||||||
"components.Settings.Notifications.NotificationsPushover.userTokenTip": "Il tuo identificatore <UsersGroupsLink>utente o gruppo</UsersGroupsLink> di 30 caratteri",
|
"components.Settings.Notifications.NotificationsPushover.userTokenTip": "Il tuo identificatore <UsersGroupsLink>utente o gruppo</UsersGroupsLink> di 30 caratteri",
|
||||||
"components.Settings.Notifications.NotificationsPushover.accessTokenTip": "<ApplicationRegistrationLink>Registra un'applicazione</ApplicationRegistrationLink> da usare con Jellyseerr",
|
"components.Settings.Notifications.NotificationsPushover.accessTokenTip": "<ApplicazioneRegistrazioneLink>Registra un'applicazione</ApplicazioneRegistrazioneLink> per l'uso con Jellyseerr",
|
||||||
"components.Settings.Notifications.NotificationsPushbullet.accessTokenTip": "Crea un token dalle tue <PushbulletSettingsLink>Impostazioni account</PushbulletSettingsLink>",
|
"components.Settings.Notifications.NotificationsPushbullet.accessTokenTip": "Crea un token dalle tue <PushbulletSettingsLink>Impostazioni account</PushbulletSettingsLink>",
|
||||||
"components.Settings.Notifications.toastDiscordTestFailed": "Invio della notifica di prova Discord non riuscito.",
|
"components.Settings.Notifications.toastDiscordTestFailed": "Invio della notifica di prova Discord non riuscito.",
|
||||||
"components.Settings.Notifications.webhookUrlTip": "Crea un <DiscordWebhookLink>integrazione webhook</DiscordWebhookLink> nel server",
|
"components.Settings.Notifications.webhookUrlTip": "Crea un <DiscordWebhookLink>integrazione webhook</DiscordWebhookLink> nel server",
|
||||||
@@ -813,11 +776,9 @@
|
|||||||
"components.Settings.webAppUrlTip": "Indirizza opzionalmente gli utenti alla web app sul tuo server invece che alla web app \"ospitata\"",
|
"components.Settings.webAppUrlTip": "Indirizza opzionalmente gli utenti alla web app sul tuo server invece che alla web app \"ospitata\"",
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.webhookUrlTip": "La tua <LunaSeaLink>notifica webhook URL</LunaSeaLink> basata su utente o dispositivo",
|
"components.Settings.Notifications.NotificationsLunaSea.webhookUrlTip": "La tua <LunaSeaLink>notifica webhook URL</LunaSeaLink> basata su utente o dispositivo",
|
||||||
"components.Settings.webAppUrl": "URL <WebAppLink>Web App</WebAppLink>",
|
"components.Settings.webAppUrl": "URL <WebAppLink>Web App</WebAppLink>",
|
||||||
"components.Settings.locale": "Lingua Interfaccia",
|
|
||||||
"components.Settings.SettingsUsers.newPlexLoginTip": "Permetti agli utenti di Plex di accedere senza essere prima importati",
|
"components.Settings.SettingsUsers.newPlexLoginTip": "Permetti agli utenti di Plex di accedere senza essere prima importati",
|
||||||
"components.Settings.SettingsUsers.newPlexLogin": "Abilita nuovo accesso con Plex",
|
"components.Settings.SettingsUsers.newPlexLogin": "Abilita nuovo accesso con Plex",
|
||||||
"components.Settings.Notifications.NotificationsWebPush.httpsRequirement": "Per ricevere le notifiche web push, Jellyseerr deve essere servito su HTTPS.",
|
"components.Settings.Notifications.NotificationsWebPush.httpsRequirement": "Per ricevere notifiche push web, Jellyseerr deve essere servito tramite HTTPS.",
|
||||||
"components.UserList.displayName": "Nome da mostrare",
|
|
||||||
"components.RequestList.RequestItem.requesteddate": "Richiesto",
|
"components.RequestList.RequestItem.requesteddate": "Richiesto",
|
||||||
"components.RequestCard.failedretry": "Qualcosa è andato storto nel riprovare la richiesta.",
|
"components.RequestCard.failedretry": "Qualcosa è andato storto nel riprovare la richiesta.",
|
||||||
"components.Settings.SettingsUsers.localLoginTip": "Consentire agli utenti di accedere utilizzando l'indirizzo di posta elettronica e la password, anziché Plex OAuth",
|
"components.Settings.SettingsUsers.localLoginTip": "Consentire agli utenti di accedere utilizzando l'indirizzo di posta elettronica e la password, anziché Plex OAuth",
|
||||||
@@ -968,7 +929,7 @@
|
|||||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverUserKey": "Devi fornire una chiave utente o di gruppo valida",
|
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverUserKey": "Devi fornire una chiave utente o di gruppo valida",
|
||||||
"i18n.resolved": "Risolto",
|
"i18n.resolved": "Risolto",
|
||||||
"i18n.open": "Aperto",
|
"i18n.open": "Aperto",
|
||||||
"components.Settings.SettingsAbout.runningDevelop": "Stai eseguendo la versione <code>develop</code> di Jellyseerr, che è raccomandata soltanto a chi aiuta nello sviluppo o nel testing dell'applicazione.",
|
"components.Settings.SettingsAbout.runningDevelop": "Stai eseguendo il ramo <code>develop</code> di Jellyseerr, che è consigliato solo per coloro che contribuiscono allo sviluppo o assistono con i test più avanzati.",
|
||||||
"components.NotificationTypeSelector.adminissuereopenedDescription": "Ricevi una notifica quanto le segnalazioni vengono riaperte da altri utenti.",
|
"components.NotificationTypeSelector.adminissuereopenedDescription": "Ricevi una notifica quanto le segnalazioni vengono riaperte da altri utenti.",
|
||||||
"components.NotificationTypeSelector.adminissueresolvedDescription": "Ricevi una notifica quanto le segnalazioni vengono risolte da altri utenti.",
|
"components.NotificationTypeSelector.adminissueresolvedDescription": "Ricevi una notifica quanto le segnalazioni vengono risolte da altri utenti.",
|
||||||
"components.NotificationTypeSelector.issuereopened": "Segnalazione Riaperta",
|
"components.NotificationTypeSelector.issuereopened": "Segnalazione Riaperta",
|
||||||
@@ -1022,7 +983,7 @@
|
|||||||
"components.Settings.Notifications.enableMentions": "Abilita menzioni",
|
"components.Settings.Notifications.enableMentions": "Abilita menzioni",
|
||||||
"components.UserProfile.recentlywatched": "Visto di recente",
|
"components.UserProfile.recentlywatched": "Visto di recente",
|
||||||
"components.Settings.validationUrl": "Devi fornire un URL valido",
|
"components.Settings.validationUrl": "Devi fornire un URL valido",
|
||||||
"components.Settings.tautulliSettingsDescription": "Opzionalmente, configura le impostazioni per il tuo server Tautulli. Jellyseerr recupera i dati della cronologia delle visualizzazioni per i tuoi media Plex da Tautulli.",
|
"components.Settings.tautulliSettingsDescription": "Configura facoltativamente le impostazioni per il tuo server Tautulli. Jellyseerr recupera i dati della cronologia di visione dei tuoi media Plex da Tautulli.",
|
||||||
"components.ManageSlideOver.playedby": "Riprodotto da",
|
"components.ManageSlideOver.playedby": "Riprodotto da",
|
||||||
"components.Settings.validationUrlBaseTrailingSlash": "L'URL di base non deve terminare con una barra obliqua",
|
"components.Settings.validationUrlBaseTrailingSlash": "L'URL di base non deve terminare con una barra obliqua",
|
||||||
"components.Settings.Notifications.NotificationsPushbullet.channelTag": "Tag del canale",
|
"components.Settings.Notifications.NotificationsPushbullet.channelTag": "Tag del canale",
|
||||||
@@ -1175,5 +1136,124 @@
|
|||||||
"components.Settings.SonarrModal.seriesType": "Tipo serie TV",
|
"components.Settings.SonarrModal.seriesType": "Tipo serie TV",
|
||||||
"components.RequestModal.requestmovietitle": "Richiedi film",
|
"components.RequestModal.requestmovietitle": "Richiedi film",
|
||||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Numero voti utenti TMDB",
|
"components.Discover.FilterSlideover.tmdbuservotecount": "Numero voti utenti TMDB",
|
||||||
"components.RequestModal.requestseriestitle": "Richiedi serie"
|
"components.RequestModal.requestseriestitle": "Richiedi serie",
|
||||||
|
"components.Login.adminerror": "Devi utilizzare un account amministratore per accedere.",
|
||||||
|
"components.Login.description": "Poiché è il tuo primo accesso a {applicationName}, è necessario aggiungere un'email valida.",
|
||||||
|
"components.Login.emailtooltip": "L'indirizzo non deve essere associato alla tua istanza di {mediaServerName}.",
|
||||||
|
"components.Login.enablessl": "Usa SSL",
|
||||||
|
"components.Login.hostname": "URL di {mediaServerName}",
|
||||||
|
"components.Login.initialsignin": "Connetti",
|
||||||
|
"components.Login.invalidurlerror": "Impossibile connettersi al server {mediaServerName}.",
|
||||||
|
"components.Login.port": "Porta",
|
||||||
|
"components.Login.save": "Aggiungi",
|
||||||
|
"components.Login.saving": "Aggiungendo…",
|
||||||
|
"components.Login.signinwithjellyfin": "Usa il tuo account {mediaServerName}",
|
||||||
|
"components.Login.title": "Aggiungi Email",
|
||||||
|
"components.Login.urlBase": "Base URL",
|
||||||
|
"components.Login.username": "Nome utente",
|
||||||
|
"components.Login.validationEmailRequired": "Devi fornire un'email",
|
||||||
|
"components.Login.validationHostnameRequired": "Devi fornire un hostname o un indirizzo IP valido",
|
||||||
|
"components.Login.validationPortRequired": "Devi fornire un numero di porta valido",
|
||||||
|
"components.Login.validationUrlBaseTrailingSlash": "L'URL di base non deve terminare con una barra finale",
|
||||||
|
"components.Login.validationUrlTrailingSlash": "L'URL non deve terminare con una barra finale",
|
||||||
|
"components.Login.validationemailformat": "È richiesta un'email valida",
|
||||||
|
"components.Login.validationhostformat": "È richiesta un'URL valida",
|
||||||
|
"components.Login.validationhostrequired": "È richiesta l'URL di {mediaServerName}",
|
||||||
|
"components.ManageSlideOver.removearr": "Rimuovi da {arr}",
|
||||||
|
"components.ManageSlideOver.removearr4k": "Rimuovi da 4K {arr}",
|
||||||
|
"components.MovieDetails.addtowatchlist": "Aggiungi alla lista di visione",
|
||||||
|
"components.MovieDetails.downloadstatus": "Stato del download",
|
||||||
|
"components.MovieDetails.imdbuserscore": "Punteggio utente IMDb",
|
||||||
|
"components.MovieDetails.openradarr": "Apri il film in Radarr",
|
||||||
|
"components.MovieDetails.removefromwatchlist": "Rimuovi dalla lista di visione",
|
||||||
|
"components.MovieDetails.rtaudiencescore": "Punteggio del pubblico di Rotten Tomatoes",
|
||||||
|
"components.MovieDetails.rtcriticsscore": "Tomatometro di Rotten Tomatoes",
|
||||||
|
"components.MovieDetails.tmdbuserscore": "Punteggio Utente TMDB",
|
||||||
|
"components.MovieDetails.watchlistError": "Qualcosa è andato storto, riprova.",
|
||||||
|
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> aggiunto alla lista di visione con successo!",
|
||||||
|
"components.PermissionEdit.autorequestMovies": "Richiesta automatica dei film",
|
||||||
|
"components.PermissionEdit.autorequestSeries": "Richiesta automatica di serie",
|
||||||
|
"components.PermissionEdit.autorequestSeriesDescription": "Concedi il permesso per inviare automaticamente richieste per serie non 4K tramite Plex Watchlist.",
|
||||||
|
"components.PermissionEdit.viewrecentDescription": "Concedi il permesso per visualizzare l'elenco dei media aggiunti di recente.",
|
||||||
|
"components.PermissionEdit.viewwatchlists": "Visualizza le liste di controllo di {mediaServerName}",
|
||||||
|
"components.RequestBlock.approve": "Approva la richiesta",
|
||||||
|
"components.RequestBlock.decline": "Rifiuta la richiesta",
|
||||||
|
"components.RequestBlock.delete": "Elimina la richiesta",
|
||||||
|
"components.RequestBlock.edit": "Modifica la richiesta",
|
||||||
|
"components.RequestBlock.lastmodifiedby": "Ultima modifica da",
|
||||||
|
"components.RequestBlock.requestedby": "Richiesto da",
|
||||||
|
"components.RequestCard.cancelrequest": "Annulla richiesta",
|
||||||
|
"components.RequestCard.declinerequest": "Rifiuta richiesta",
|
||||||
|
"components.RequestCard.editrequest": "Modifica richiesta",
|
||||||
|
"components.RequestCard.tmdbid": "ID TMDB",
|
||||||
|
"components.RequestCard.tvdbid": "ID TheTVDB",
|
||||||
|
"components.RequestCard.unknowntitle": "Titolo sconosciuto",
|
||||||
|
"components.RequestList.RequestItem.profileName": "Profilo",
|
||||||
|
"components.RequestList.RequestItem.tvdbid": "ID TheTVDB",
|
||||||
|
"components.RequestList.RequestItem.unknowntitle": "Titolo sconosciuto",
|
||||||
|
"components.RequestModal.requestcollection4ktitle": "Richiedi Collezione in 4K",
|
||||||
|
"components.RequestModal.requestcollectiontitle": "Richiedi Collezione",
|
||||||
|
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Predefinito dispositivo",
|
||||||
|
"components.Settings.SettingsAbout.supportjellyseerr": "Supporta Jellyseerr",
|
||||||
|
"components.Settings.SettingsJobsCache.availability-sync": "Sincronizzazione della disponibilità dei media",
|
||||||
|
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Frequenza Attuale",
|
||||||
|
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "Ogni {jobScheduleSeconds, plural, one {secondo} other {{jobScheduleSeconds} secondi}}",
|
||||||
|
"components.Settings.SettingsJobsCache.image-cache-cleanup": "Pulizia della cache delle immagini",
|
||||||
|
"components.Settings.SettingsJobsCache.imagecache": "Cache delle immagini",
|
||||||
|
"components.Settings.SettingsJobsCache.imagecachecount": "Immagini memorizzate nella cache",
|
||||||
|
"components.Settings.SettingsJobsCache.imagecachesize": "Dimensione totale della cache",
|
||||||
|
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Scansione completa della libreria Jellyfin",
|
||||||
|
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scansione degli elementi aggiunti di recente di Jellyfin",
|
||||||
|
"components.Settings.SettingsMain.cacheImages": "Abilita la cache delle immagini",
|
||||||
|
"components.Settings.SettingsMain.csrfProtectionHoverTip": "NON abilitare questa impostazione a meno che tu non sappia cosa stai facendo!",
|
||||||
|
"components.Settings.SettingsMain.csrfProtectionTip": "Imposta l'accesso all'API esterna in sola lettura (richiede HTTPS)",
|
||||||
|
"components.Settings.SettingsMain.general": "General",
|
||||||
|
"components.Login.credentialerror": "Il nome utente o la password sono errati.",
|
||||||
|
"components.Login.initialsigningin": "Connessione in corso…",
|
||||||
|
"components.MovieDetails.openradarr4k": "Apri il film in 4K Radarr",
|
||||||
|
"components.MovieDetails.play": "Riproduci su {mediaServerName}",
|
||||||
|
"components.NotificationTypeSelector.mediaautorequested": "Richiesta inviata automaticamente",
|
||||||
|
"components.Settings.Notifications.userEmailRequired": "Richiedi email utente",
|
||||||
|
"components.Discover.resetfailed": "Si è verificato un errore nel ripristino delle impostazioni di personalizzazione della scoperta.",
|
||||||
|
"components.Login.validationEmailFormat": "Email non valida",
|
||||||
|
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Questo rimuoverà in modo irreversibile questo {mediaType} da {arr}, inclusi tutti i file.",
|
||||||
|
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> rimosso dalla lista di visione con successo!",
|
||||||
|
"components.PermissionEdit.viewrecent": "Visualizza Aggiunti Recenti",
|
||||||
|
"components.RequestBlock.requestdate": "Data della richiesta",
|
||||||
|
"components.RequestCard.approverequest": "Approva richiesta",
|
||||||
|
"components.Selector.searchStudios": "Cerca studi…",
|
||||||
|
"components.Settings.RadarrModal.tagRequestsInfo": "Aggiungi automaticamente un'etichetta aggiuntiva con l'ID utente e il nome visualizzato del richiedente",
|
||||||
|
"components.Login.validationUrlBaseLeadingSlash": "L'URL di base deve avere una barra iniziale",
|
||||||
|
"components.MovieDetails.play4k": "Riproduci in 4K su {mediaServerName}",
|
||||||
|
"components.NotificationTypeSelector.mediaautorequestedDescription": "Ricevi notifiche quando nuove richieste di media vengono inviate automaticamente per gli elementi nella tua lista di visione.",
|
||||||
|
"components.PermissionEdit.autorequestDescription": "Concedi il permesso per inviare automaticamente richieste per media non-4K tramite la Plex Watchlist.",
|
||||||
|
"components.Discover.updatefailed": "Qualcosa è andato storto durante l'aggiornamento delle impostazioni di personalizzazione della scoperta.",
|
||||||
|
"components.Login.validationusernamerequired": "È richiesto un nome utente",
|
||||||
|
"components.PermissionEdit.autorequestMoviesDescription": "Concedi il permesso per inviare automaticamente richieste di film non 4K tramite Plex Watchlist.",
|
||||||
|
"components.PermissionEdit.viewwatchlistsDescription": "Concedi il permesso per visualizzare le liste di controllo di {mediaServerName} di altri utenti.",
|
||||||
|
"components.RequestList.RequestItem.tmdbid": "ID TMDB",
|
||||||
|
"components.Settings.Notifications.NotificationsPushover.sound": "Suono di notifica",
|
||||||
|
"components.Settings.SettingsMain.cacheImagesTip": "Cache le immagini provenienti da fonti esterne (richiede una quantità significativa di spazio su disco)",
|
||||||
|
"components.Settings.SettingsMain.generalsettingsDescription": "Configure global and default settings for Jellyseerr.",
|
||||||
|
"components.RequestModal.SearchByNameModal.nomatches": "Non siamo riusciti a trovare una corrispondenza per questa serie.",
|
||||||
|
"components.Settings.RadarrModal.tagRequests": "Tagga richieste",
|
||||||
|
"components.Settings.SettingsJobsCache.imagecacheDescription": "Quando abilitato nelle impostazioni, Jellyseerr farà da proxy e memorizzerà nella cache le immagini provenienti da fonti esterne preconfigurate. Le immagini memorizzate nella cache vengono salvate nella tua cartella di configurazione. Puoi trovare i file in `<code>{appDataPath}/cache/images</code>`.",
|
||||||
|
"components.Discover.CreateSlider.addsuccess": "Creato un nuovo cursore e salvato le impostazioni di personalizzazione della scoperta.",
|
||||||
|
"components.Discover.DiscoverTvKeyword.keywordSeries": "Serie {keywordTitle}",
|
||||||
|
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Filtro Attivo} other {# Filtri Attivi}}",
|
||||||
|
"components.Discover.FilterSlideover.studio": "Studio",
|
||||||
|
"components.Discover.networks": "Reti",
|
||||||
|
"components.Discover.resetsuccess": "Impostazioni di personalizzazione della scoperta ripristinate con successo.",
|
||||||
|
"components.Discover.resettodefault": "Ripristina predefiniti",
|
||||||
|
"components.Discover.resetwarning": "Ripristina tutti i cursori ai predefiniti. Questo eliminerà anche eventuali cursori personalizzati!",
|
||||||
|
"components.Discover.stopediting": "Interrompi modifica",
|
||||||
|
"components.Discover.studios": "Studi",
|
||||||
|
"components.Discover.tmdbnetwork": "Rete TMDB",
|
||||||
|
"components.Discover.tmdbstudio": "Studio TMDB",
|
||||||
|
"components.Discover.tmdbtvstreamingservices": "Servizi di Streaming TV TMDB",
|
||||||
|
"components.Discover.updatesuccess": "Impostazioni di personalizzazione della scoperta aggiornate.",
|
||||||
|
"components.Layout.UserWarnings.emailInvalid": "L'indirizzo email non è valido.",
|
||||||
|
"components.Layout.UserWarnings.emailRequired": "È necessario un indirizzo email.",
|
||||||
|
"components.Layout.UserWarnings.passwordRequired": "È richiesta una password.",
|
||||||
|
"components.Settings.SettingsMain.partialRequestsEnabled": "Consenti richieste parziali di serie"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
{
|
{
|
||||||
"components.Discover.discovermovies": "人気の映画",
|
|
||||||
"components.Discover.discovertv": "人気のテレビ番組",
|
|
||||||
"components.Discover.popularmovies": "人気の映画",
|
"components.Discover.popularmovies": "人気の映画",
|
||||||
"components.Discover.populartv": "人気のテレビ番組",
|
"components.Discover.populartv": "人気のテレビ番組",
|
||||||
"components.Discover.recentlyAdded": "最近追加された動画",
|
"components.Discover.recentlyAdded": "最近追加された動画",
|
||||||
@@ -31,7 +29,6 @@
|
|||||||
"components.RequestList.RequestItem.seasons": "シーズン",
|
"components.RequestList.RequestItem.seasons": "シーズン",
|
||||||
"components.RequestList.requests": "リクエスト",
|
"components.RequestList.requests": "リクエスト",
|
||||||
"components.RequestModal.cancel": "キャンセルリクエスト",
|
"components.RequestModal.cancel": "キャンセルリクエスト",
|
||||||
"components.RequestModal.extras": "おまけ",
|
|
||||||
"components.RequestModal.numberofepisodes": "エピソード数",
|
"components.RequestModal.numberofepisodes": "エピソード数",
|
||||||
"components.RequestModal.pendingrequest": "",
|
"components.RequestModal.pendingrequest": "",
|
||||||
"components.RequestModal.requestCancel": "<strong>{title}</strong> のリクエストは取り消されました。",
|
"components.RequestModal.requestCancel": "<strong>{title}</strong> のリクエストは取り消されました。",
|
||||||
@@ -101,16 +98,12 @@
|
|||||||
"components.Settings.addradarr": "Radarr サーバーを追加",
|
"components.Settings.addradarr": "Radarr サーバーを追加",
|
||||||
"components.Settings.address": "アドレス",
|
"components.Settings.address": "アドレス",
|
||||||
"components.Settings.addsonarr": "Sonarr サーバーを追加",
|
"components.Settings.addsonarr": "Sonarr サーバーを追加",
|
||||||
"components.Settings.apikey": "API キー",
|
|
||||||
"components.Settings.applicationurl": "アプリケーション URL",
|
|
||||||
"components.Settings.cancelscan": "スキャンをキャンセル",
|
"components.Settings.cancelscan": "スキャンをキャンセル",
|
||||||
"components.Settings.copied": "API キーをクリップボードにコピーされた。",
|
"components.Settings.copied": "API キーをクリップボードにコピーされた。",
|
||||||
"components.Settings.currentlibrary": "現在のライブラリー:{name}",
|
"components.Settings.currentlibrary": "現在のライブラリー:{name}",
|
||||||
"components.Settings.default": "デフォルト",
|
"components.Settings.default": "デフォルト",
|
||||||
"components.Settings.default4k": "デフォルト 4K",
|
"components.Settings.default4k": "デフォルト 4K",
|
||||||
"components.Settings.deleteserverconfirm": "このサーバーを削除しますか?",
|
"components.Settings.deleteserverconfirm": "このサーバーを削除しますか?",
|
||||||
"components.Settings.generalsettings": "一般設定",
|
|
||||||
"components.Settings.generalsettingsDescription": "Jellyseerr の構成に関する設定です。",
|
|
||||||
"components.Settings.hostname": "ホスト名・IP アドレス",
|
"components.Settings.hostname": "ホスト名・IP アドレス",
|
||||||
"components.Settings.librariesRemaining": "残りのライブラリー:{count}",
|
"components.Settings.librariesRemaining": "残りのライブラリー:{count}",
|
||||||
"components.Settings.manualscan": "手動ライブラリースキャン",
|
"components.Settings.manualscan": "手動ライブラリースキャン",
|
||||||
@@ -133,12 +126,10 @@
|
|||||||
"components.Settings.sonarrsettings": "Sonarr 設定",
|
"components.Settings.sonarrsettings": "Sonarr 設定",
|
||||||
"components.Settings.ssl": "SSL",
|
"components.Settings.ssl": "SSL",
|
||||||
"components.Settings.startscan": "スキャンを開始",
|
"components.Settings.startscan": "スキャンを開始",
|
||||||
"components.Setup.configureplex": "Plex の設定",
|
|
||||||
"components.Setup.configureservices": "連携サービスの設定",
|
"components.Setup.configureservices": "連携サービスの設定",
|
||||||
"components.Setup.continue": "続行",
|
"components.Setup.continue": "続行",
|
||||||
"components.Setup.finish": "セットアップを完了",
|
"components.Setup.finish": "セットアップを完了",
|
||||||
"components.Setup.finishing": "保存中…",
|
"components.Setup.finishing": "保存中…",
|
||||||
"components.Setup.loginwithplex": "Plex でログイン",
|
|
||||||
"components.Setup.signinMessage": "Plex アカウントでログインして始める",
|
"components.Setup.signinMessage": "Plex アカウントでログインして始める",
|
||||||
"components.Setup.welcome": "Jellyseerr へようこそ",
|
"components.Setup.welcome": "Jellyseerr へようこそ",
|
||||||
"components.TvDetails.cast": "出演者",
|
"components.TvDetails.cast": "出演者",
|
||||||
@@ -193,11 +184,6 @@
|
|||||||
"components.TvDetails.showtype": "番組タイプ",
|
"components.TvDetails.showtype": "番組タイプ",
|
||||||
"components.TvDetails.network": "テレビ局",
|
"components.TvDetails.network": "テレビ局",
|
||||||
"components.TvDetails.anime": "アニメ",
|
"components.TvDetails.anime": "アニメ",
|
||||||
"components.Setup.tip": "ヒント",
|
|
||||||
"components.Settings.toastSettingsSuccess": "設定の変更は保存しました。",
|
|
||||||
"components.Settings.toastSettingsFailure": "設定保存中に問題が発生しました。",
|
|
||||||
"components.Settings.toastApiKeySuccess": "新しい API キーが生成されました。",
|
|
||||||
"components.Settings.toastApiKeyFailure": "新しい API キーの生成中に問題が発生しました。",
|
|
||||||
"components.Settings.SonarrModal.testFirstRootFolders": "ルートフォルダーをロードするには先に接続をテストしてください",
|
"components.Settings.SonarrModal.testFirstRootFolders": "ルートフォルダーをロードするには先に接続をテストしてください",
|
||||||
"components.Settings.SonarrModal.testFirstQualityProfiles": "画質プロファイルをロードするには先に接続をテストしてください",
|
"components.Settings.SonarrModal.testFirstQualityProfiles": "画質プロファイルをロードするには先に接続をテストしてください",
|
||||||
"components.Settings.SonarrModal.loadingrootfolders": "ルートフォルダー読込中…",
|
"components.Settings.SonarrModal.loadingrootfolders": "ルートフォルダー読込中…",
|
||||||
@@ -286,7 +272,6 @@
|
|||||||
"components.UserProfile.UserSettings.menuGeneralSettings": "一般",
|
"components.UserProfile.UserSettings.menuGeneralSettings": "一般",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.generalsettings": "一般設定",
|
"components.UserProfile.UserSettings.UserGeneralSettings.generalsettings": "一般設定",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.general": "一般",
|
"components.UserProfile.UserSettings.UserGeneralSettings.general": "一般",
|
||||||
"components.Settings.general": "一般",
|
|
||||||
"pages.internalservererror": "内部サーバーエラー",
|
"pages.internalservererror": "内部サーバーエラー",
|
||||||
"pages.somethingwentwrong": "チケットが発生しました",
|
"pages.somethingwentwrong": "チケットが発生しました",
|
||||||
"pages.serviceunavailable": "サービスが利用できません",
|
"pages.serviceunavailable": "サービスが利用できません",
|
||||||
@@ -480,8 +465,6 @@
|
|||||||
"components.NotificationTypeSelector.mediaAutoApproved": "リクエストを自動的に承認",
|
"components.NotificationTypeSelector.mediaAutoApproved": "リクエストを自動的に承認",
|
||||||
"components.MovieDetails.showmore": "もっと表示",
|
"components.MovieDetails.showmore": "もっと表示",
|
||||||
"components.MovieDetails.showless": "少なく表示",
|
"components.MovieDetails.showless": "少なく表示",
|
||||||
"components.MovieDetails.playonplex": "Plexで再生",
|
|
||||||
"components.MovieDetails.play4konplex": "Plexで4K再生",
|
|
||||||
"components.RequestModal.pendingapproval": "リクエストは承認待ちです。",
|
"components.RequestModal.pendingapproval": "リクエストは承認待ちです。",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "デフォルト言語({language})",
|
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "デフォルト言語({language})",
|
||||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} 分",
|
"components.TvDetails.episodeRuntimeMinutes": "{runtime} 分",
|
||||||
@@ -497,7 +480,6 @@
|
|||||||
"components.Settings.SonarrModal.loadinglanguageprofiles": "言語プロフィール読込中…",
|
"components.Settings.SonarrModal.loadinglanguageprofiles": "言語プロフィール読込中…",
|
||||||
"components.Settings.SonarrModal.validationLanguageProfileRequired": "言語プロフィールを選択してください",
|
"components.Settings.SonarrModal.validationLanguageProfileRequired": "言語プロフィールを選択してください",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.applanguage": "表示言語",
|
"components.UserProfile.UserSettings.UserGeneralSettings.applanguage": "表示言語",
|
||||||
"components.Settings.locale": "表示言語",
|
|
||||||
"components.StatusBadge.status": "{status}",
|
"components.StatusBadge.status": "{status}",
|
||||||
"components.ManageSlideOver.downloadstatus": "ダウンロード",
|
"components.ManageSlideOver.downloadstatus": "ダウンロード",
|
||||||
"components.ManageSlideOver.manageModalClearMedia": "データを消去",
|
"components.ManageSlideOver.manageModalClearMedia": "データを消去",
|
||||||
@@ -669,7 +651,6 @@
|
|||||||
"components.Settings.Notifications.validationUrl": "有効な URL を入力してください",
|
"components.Settings.Notifications.validationUrl": "有効な URL を入力してください",
|
||||||
"components.Settings.SonarrModal.validationApplicationUrl": "有効な URL を入力してください",
|
"components.Settings.SonarrModal.validationApplicationUrl": "有効な URL を入力してください",
|
||||||
"components.Settings.urlBase": "URL のベース",
|
"components.Settings.urlBase": "URL のベース",
|
||||||
"components.Settings.validationApplicationUrl": "有効な URL を入力してください",
|
|
||||||
"components.Settings.validationUrl": "有効な URL を入力してください",
|
"components.Settings.validationUrl": "有効な URL を入力してください",
|
||||||
"components.Settings.Notifications.NotificationsWebhook.validationWebhookUrl": "有効な URL を入力してください"
|
"components.Settings.Notifications.NotificationsWebhook.validationWebhookUrl": "有効な URL を入力してください"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,7 +181,6 @@
|
|||||||
"components.MovieDetails.MovieCrew.fullcrew": "전체 제작진",
|
"components.MovieDetails.MovieCrew.fullcrew": "전체 제작진",
|
||||||
"components.MovieDetails.markavailable": "사용 가능한 것으로 표시",
|
"components.MovieDetails.markavailable": "사용 가능한 것으로 표시",
|
||||||
"components.MovieDetails.physicalrelease": "실물 개봉일",
|
"components.MovieDetails.physicalrelease": "실물 개봉일",
|
||||||
"components.MovieDetails.play4konplex": "Plex에서 4K로 재생",
|
|
||||||
"components.MovieDetails.showless": "간단히 보기",
|
"components.MovieDetails.showless": "간단히 보기",
|
||||||
"components.MovieDetails.tmdbuserscore": "TMDB 사용자 점수",
|
"components.MovieDetails.tmdbuserscore": "TMDB 사용자 점수",
|
||||||
"components.MovieDetails.viewfullcrew": "전체 제작진 보기",
|
"components.MovieDetails.viewfullcrew": "전체 제작진 보기",
|
||||||
@@ -453,13 +452,10 @@
|
|||||||
"components.Settings.webAppUrl": "<WebAppLink>웹 앱</WebAppLink> URL",
|
"components.Settings.webAppUrl": "<WebAppLink>웹 앱</WebAppLink> URL",
|
||||||
"components.Settings.webhook": "웹훅",
|
"components.Settings.webhook": "웹훅",
|
||||||
"components.Settings.webpush": "웹 푸시",
|
"components.Settings.webpush": "웹 푸시",
|
||||||
"components.Setup.configureplex": "Plex 구성",
|
|
||||||
"components.Setup.configureservices": "서비스 구성",
|
"components.Setup.configureservices": "서비스 구성",
|
||||||
"components.Setup.continue": "계속",
|
"components.Setup.continue": "계속",
|
||||||
"components.Setup.finish": "설정 완료",
|
"components.Setup.finish": "설정 완료",
|
||||||
"components.Setup.finishing": "마무리하는 중…",
|
"components.Setup.finishing": "마무리하는 중…",
|
||||||
"components.Setup.loginwithplex": "Plex로 로그인",
|
|
||||||
"components.Setup.scanbackground": "스캔은 백그라운드에서 실행됩니다. 그 동안 설정 과정을 계속 진행할 수 있습니다.",
|
|
||||||
"components.Setup.signinMessage": "Plex 계정으로 로그인하세요",
|
"components.Setup.signinMessage": "Plex 계정으로 로그인하세요",
|
||||||
"components.StatusBadge.playonplex": "Plex에서 재생",
|
"components.StatusBadge.playonplex": "Plex에서 재생",
|
||||||
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
|
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
|
||||||
@@ -479,7 +475,6 @@
|
|||||||
"components.TvDetails.manageseries": "시리즈 관리",
|
"components.TvDetails.manageseries": "시리즈 관리",
|
||||||
"components.TvDetails.originallanguage": "원작 언어",
|
"components.TvDetails.originallanguage": "원작 언어",
|
||||||
"components.TvDetails.originaltitle": "원작명",
|
"components.TvDetails.originaltitle": "원작명",
|
||||||
"components.TvDetails.playonplex": "Plex에서 재생",
|
|
||||||
"components.TvDetails.nextAirDate": "다음 방영일",
|
"components.TvDetails.nextAirDate": "다음 방영일",
|
||||||
"components.TvDetails.network": "{networkCount, plural, one {방송사} other {방송사}}",
|
"components.TvDetails.network": "{networkCount, plural, one {방송사} other {방송사}}",
|
||||||
"components.TvDetails.recommendations": "추천",
|
"components.TvDetails.recommendations": "추천",
|
||||||
@@ -754,7 +749,6 @@
|
|||||||
"components.RequestModal.cancel": "요청 취소",
|
"components.RequestModal.cancel": "요청 취소",
|
||||||
"components.RequestModal.numberofepisodes": "에피소드 수",
|
"components.RequestModal.numberofepisodes": "에피소드 수",
|
||||||
"components.RequestModal.edit": "요청 수정",
|
"components.RequestModal.edit": "요청 수정",
|
||||||
"components.RequestModal.extras": "기타",
|
|
||||||
"components.RequestModal.requestadmin": "이 요청은 자동으로 승인됩니다.",
|
"components.RequestModal.requestadmin": "이 요청은 자동으로 승인됩니다.",
|
||||||
"components.RequestModal.requestCancel": "<strong>{title}</strong> 에 대한 요청이 취소되었습니다.",
|
"components.RequestModal.requestCancel": "<strong>{title}</strong> 에 대한 요청이 취소되었습니다.",
|
||||||
"components.RequestModal.requestseriestitle": "시리즈 요청",
|
"components.RequestModal.requestseriestitle": "시리즈 요청",
|
||||||
@@ -860,7 +854,6 @@
|
|||||||
"components.Settings.validationUrl": "유효한 URL을 입력해야 합니다",
|
"components.Settings.validationUrl": "유효한 URL을 입력해야 합니다",
|
||||||
"components.StatusBadge.openinarr": "{arr}에서 열기",
|
"components.StatusBadge.openinarr": "{arr}에서 열기",
|
||||||
"components.TvDetails.Season.somethingwentwrong": "시즌 데이터를 검색하는 동안 문제가 발생했습니다.",
|
"components.TvDetails.Season.somethingwentwrong": "시즌 데이터를 검색하는 동안 문제가 발생했습니다.",
|
||||||
"components.UserList.displayName": "표시 이름",
|
|
||||||
"components.UserList.creating": "생성 중…",
|
"components.UserList.creating": "생성 중…",
|
||||||
"components.UserList.deleteuser": "사용자 삭제",
|
"components.UserList.deleteuser": "사용자 삭제",
|
||||||
"components.UserList.passwordinfodescription": "애플리케이션 URL을 구성하고 이메일 알림을 활성화하여 자동으로 비밀번호를 생성할 수 있도록 설정해주세요.",
|
"components.UserList.passwordinfodescription": "애플리케이션 URL을 구성하고 이메일 알림을 활성화하여 자동으로 비밀번호를 생성할 수 있도록 설정해주세요.",
|
||||||
@@ -924,7 +917,6 @@
|
|||||||
"components.MovieDetails.mark4kavailable": "4K에서 사용 가능하게 표시",
|
"components.MovieDetails.mark4kavailable": "4K에서 사용 가능하게 표시",
|
||||||
"components.MovieDetails.overview": "정보",
|
"components.MovieDetails.overview": "정보",
|
||||||
"components.MovieDetails.overviewunavailable": "정보를 볼 수 없습니다.",
|
"components.MovieDetails.overviewunavailable": "정보를 볼 수 없습니다.",
|
||||||
"components.MovieDetails.playonplex": "Plex에서 재생",
|
|
||||||
"components.MovieDetails.revenue": "수익",
|
"components.MovieDetails.revenue": "수익",
|
||||||
"components.MovieDetails.productioncountries": "제작 {countryCount, plural, one {국가} other {국가}}",
|
"components.MovieDetails.productioncountries": "제작 {countryCount, plural, one {국가} other {국가}}",
|
||||||
"components.MovieDetails.recommendations": "추천",
|
"components.MovieDetails.recommendations": "추천",
|
||||||
@@ -1110,8 +1102,6 @@
|
|||||||
"components.Settings.SettingsMain.locale": "표시 언어",
|
"components.Settings.SettingsMain.locale": "표시 언어",
|
||||||
"components.Settings.SettingsMain.generalsettings": "일반 설정",
|
"components.Settings.SettingsMain.generalsettings": "일반 설정",
|
||||||
"components.Settings.SettingsMain.originallanguage": "디스커버 언어",
|
"components.Settings.SettingsMain.originallanguage": "디스커버 언어",
|
||||||
"components.Settings.SettingsMain.regionTip": "선택한 지역에서 사용 가능한 컨텐츠로 필터링",
|
|
||||||
"components.Settings.SettingsMain.region": "디스커버 지역",
|
|
||||||
"components.Settings.SettingsMain.toastSettingsFailure": "설정을 저장하는 동안 문제가 발생했습니다.",
|
"components.Settings.SettingsMain.toastSettingsFailure": "설정을 저장하는 동안 문제가 발생했습니다.",
|
||||||
"components.Settings.SettingsMain.toastSettingsSuccess": "사용자 설정이 성공적으로 저장되었습니다!",
|
"components.Settings.SettingsMain.toastSettingsSuccess": "사용자 설정이 성공적으로 저장되었습니다!",
|
||||||
"components.Settings.SettingsMain.validationApplicationTitle": "애플리케이션 이름을 입력해야 합니다",
|
"components.Settings.SettingsMain.validationApplicationTitle": "애플리케이션 이름을 입력해야 합니다",
|
||||||
@@ -1155,11 +1145,9 @@
|
|||||||
"components.Settings.validationUrlBaseLeadingSlash": "기본 URL은 슬래시로 끝나서는 안 됩니다",
|
"components.Settings.validationUrlBaseLeadingSlash": "기본 URL은 슬래시로 끝나서는 안 됩니다",
|
||||||
"components.Settings.webAppUrlTip": "사용자에게 \"호스팅된\" 웹 앱 대신 서버의 웹 앱으로 이동하도록 선택적으로 설정할 수 있습니다",
|
"components.Settings.webAppUrlTip": "사용자에게 \"호스팅된\" 웹 앱 대신 서버의 웹 앱으로 이동하도록 선택적으로 설정할 수 있습니다",
|
||||||
"components.Setup.setup": "설정",
|
"components.Setup.setup": "설정",
|
||||||
"components.Setup.tip": "팁",
|
|
||||||
"components.Setup.welcome": "Jellyseerr에 오신 것을 환영합니다",
|
"components.Setup.welcome": "Jellyseerr에 오신 것을 환영합니다",
|
||||||
"components.StatusBadge.status4k": "4K {status}",
|
"components.StatusBadge.status4k": "4K {status}",
|
||||||
"components.StatusBadge.status": "{status}",
|
"components.StatusBadge.status": "{status}",
|
||||||
"components.TvDetails.play4konplex": "Plex에서 4K로 재생",
|
|
||||||
"components.TvDetails.firstAirDate": "첫 방영일",
|
"components.TvDetails.firstAirDate": "첫 방영일",
|
||||||
"components.StatusChecker.restartRequired": "서버 재시작 필요",
|
"components.StatusChecker.restartRequired": "서버 재시작 필요",
|
||||||
"components.StatusChecker.restartRequiredDescription": "수정된 설정을 적용하려면 서버를 다시 시작하십시오.",
|
"components.StatusChecker.restartRequiredDescription": "수정된 설정을 적용하려면 서버를 다시 시작하십시오.",
|
||||||
|
|||||||
@@ -56,8 +56,6 @@
|
|||||||
"components.MovieDetails.originaltitle": "Originalus pavadinimas",
|
"components.MovieDetails.originaltitle": "Originalus pavadinimas",
|
||||||
"components.MovieDetails.overview": "Apžvalga",
|
"components.MovieDetails.overview": "Apžvalga",
|
||||||
"components.MovieDetails.revenue": "Pajamos",
|
"components.MovieDetails.revenue": "Pajamos",
|
||||||
"components.MovieDetails.play4konplex": "Groti 4k per Plex",
|
|
||||||
"components.MovieDetails.playonplex": "Groti per Plex",
|
|
||||||
"components.MovieDetails.viewfullcrew": "Visa komanda",
|
"components.MovieDetails.viewfullcrew": "Visa komanda",
|
||||||
"components.MovieDetails.similar": "Panašūs",
|
"components.MovieDetails.similar": "Panašūs",
|
||||||
"components.MovieDetails.streamingproviders": "Šiuo metu transliuojama per",
|
"components.MovieDetails.streamingproviders": "Šiuo metu transliuojama per",
|
||||||
@@ -86,8 +84,6 @@
|
|||||||
"components.TvDetails.firstAirDate": "Pirmą kartą transliuota",
|
"components.TvDetails.firstAirDate": "Pirmą kartą transliuota",
|
||||||
"components.TvDetails.network": "{networkCount, plural, one {Tinklas} other {Tinklai}}",
|
"components.TvDetails.network": "{networkCount, plural, one {Tinklas} other {Tinklai}}",
|
||||||
"components.TvDetails.nextAirDate": "Artimiausia transliacija",
|
"components.TvDetails.nextAirDate": "Artimiausia transliacija",
|
||||||
"components.TvDetails.play4konplex": "Groti 4K raiška per Plex",
|
|
||||||
"components.TvDetails.playonplex": "Groti per Plex",
|
|
||||||
"components.TvDetails.productioncountries": "Kurta {countryCount, plural, one {šalyje} other {šalyse}}",
|
"components.TvDetails.productioncountries": "Kurta {countryCount, plural, one {šalyje} other {šalyse}}",
|
||||||
"components.TvDetails.recommendations": "Rekomendacijos",
|
"components.TvDetails.recommendations": "Rekomendacijos",
|
||||||
"components.TvDetails.seasons": "{seasonCount, plural, one {# Sezonas} other {# Sezonai}}",
|
"components.TvDetails.seasons": "{seasonCount, plural, one {# Sezonas} other {# Sezonai}}",
|
||||||
@@ -444,7 +440,6 @@
|
|||||||
"components.RequestButton.declinerequest": "Atmesti rezervacijas",
|
"components.RequestButton.declinerequest": "Atmesti rezervacijas",
|
||||||
"components.RequestButton.declinerequest4k": "Atmesti 4K rezervacijas",
|
"components.RequestButton.declinerequest4k": "Atmesti 4K rezervacijas",
|
||||||
"components.RequestModal.QuotaDisplay.allowedRequests": "Jūs galite rezervuoti iki <strong>{limit}</strong> {type} kas <strong>{days}</strong> dienas.",
|
"components.RequestModal.QuotaDisplay.allowedRequests": "Jūs galite rezervuoti iki <strong>{limit}</strong> {type} kas <strong>{days}</strong> dienas.",
|
||||||
"components.RequestModal.extras": "Ekstros",
|
|
||||||
"components.RequestModal.pendingapproval": "Rezervacija laukia patvirtinimo.",
|
"components.RequestModal.pendingapproval": "Rezervacija laukia patvirtinimo.",
|
||||||
"components.RequestModal.requestseasons": "Rezervuoti {seasonCount} {seasonCount, plural, one {sezoną} other {sezonus}}",
|
"components.RequestModal.requestseasons": "Rezervuoti {seasonCount} {seasonCount, plural, one {sezoną} other {sezonus}}",
|
||||||
"components.PermissionEdit.autoapprove4kDescription": "Suteikti automatinius patvirtinimus visoms 4K medijos rezervacijoms.",
|
"components.PermissionEdit.autoapprove4kDescription": "Suteikti automatinius patvirtinimus visoms 4K medijos rezervacijoms.",
|
||||||
@@ -632,7 +627,6 @@
|
|||||||
"components.Settings.SettingsJobsCache.command": "Komanda",
|
"components.Settings.SettingsJobsCache.command": "Komanda",
|
||||||
"components.PermissionEdit.autoapprove4kSeries": "Automatiškai patvirtinti 4K serialų rezervacijas",
|
"components.PermissionEdit.autoapprove4kSeries": "Automatiškai patvirtinti 4K serialų rezervacijas",
|
||||||
"components.Settings.plex": "Plex",
|
"components.Settings.plex": "Plex",
|
||||||
"components.Setup.tip": "Patarimas",
|
|
||||||
"components.Settings.SettingsLogs.resumeLogs": "Tęsti",
|
"components.Settings.SettingsLogs.resumeLogs": "Tęsti",
|
||||||
"components.Settings.address": "Adresas",
|
"components.Settings.address": "Adresas",
|
||||||
"components.StatusBadge.status": "{status}",
|
"components.StatusBadge.status": "{status}",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user